Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
асвт, никитин сука.docx
Скачиваний:
11
Добавлен:
25.09.2019
Размер:
266.34 Кб
Скачать
  1. Доступ к портам под Windows nt/2000/xp.

Windows 95 и 98 допускают беспрепятственный доступ к портам. Но если мы программу, использующую команды работы с портами, попытаемся выполнить в Windows, основанную на ядре NT (NT/2000/XP/Vista), то при попытке обращения к порту мы увидим сообщение об ошибке, связанной с попыткой выполнения привилегированной команды. Сообщение об ошибке вызвано тем, что эти версии Windows блокируют прямые обращения к аппаратным ресурсам компьютера. Для обращения к портам в Windows NT/2000/XP следует использовать специальный драйвер. Таким образом, Windows отделяет уровень пользовательских программ от аппаратно-го уровня, что существенно повышает надѐжность и защищѐнность операционной системы: обычные программы обязаны обращаться к драйверу, а драйвер блокирует одновременное использование аппаратных ресурсов, если программа не сообщит ему о возможности их разделения между несколькими программами. Именно так делают стандартные функции Windows для последовательных портов. Основа защиты ввода/вывода — четырѐхуровневая система привилегий, появившаяся в процессоре 80386. Наиболее привилегированный уровень — уровень 0, наименее привилегированный — уровень 3. Операционная система Windows использует только два крайних уровня.

  • Уровень 0 для режима ядра с полным доступом

  • Уровень 3 для ограниченного режима пользователя

Защита ввода/вывода имеет два уровня проверок. В битах 12 и 13 регистра EFLAGS процессор хранит уровень привилегий, для которого разрешѐн прямой доступ к портам ввода/вывода, называемый IOPL. ОС Windows всегда устанавливает IOPL равным нулю, поэтому программы, выполняющиеся на уровне ядра, всегда имеют прямой доступ к портам ввода/вывода, а остальные проходят вторую стадию. Вторая стадия проверки защиты реализуется с помощью карты разрешения ввода/вывода (IOPM, I/O Permission Map), представляющей собой битовый массив, каждый бит которого соответствует порту ввода/вывода. Если бит установлен в 1, доступ запрещѐн, и при доступе к данному порту произойдѐт исключение. Если бит установлен в 0, то к данному порту предоставлен прямой и беспрепятственный доступ. Таблица IOPM хранится в структуре TSS в основной памяти. Смещение IOPM внутри TSS хранится в 2-байтном числе по смещению 66h в TSS. Следует отметить, что хотя адресное пространство процессоров семейства x86 включает 65536 8-битовых портов, таблица IOPM не обязательно должна содержать 8192 байта (т.е. содержать информацию о всех портах). Признаком ее конца служит слово, в котором все 16 бит установлены в 1, а все более старшие порты считаются закрытыми. Итак, мы видим, что Windows-программа, выполняющаяся с привилегиями пользователя, может работать с портами через специальный драйвер. Для этого существуют предназначенные функции API, которые предоставляют множество функций для работы с портами. Если вы попытаетесь использовать приведѐнную выше процедуру для работы с динамиком, посредством прямого обращения к портам, то вы увидите, что ваша программа не проходит вышеупомянутые проверки. Тем не менее, есть способ обойти стандартную защиту ввода/вывода Windows. Для этого создан широкоизвестный драйвер GiveIo.sys. Принцип обхода защиты заключается в следующем: изменить уровень привилегий текущей задачи на максимальный невозможно, но можно добиться стопроцентного прохода второй стадии проверки. Драйвер достигает этого, используя недокументированные функции API для заполнения всей таблицы IOPM нулями.

Вообще использовать этот драйвер не рекомендуется. Но в некоторых случаях работа с портами через стандартный драйвер, а не напрямую, может быть невыгодна или невозможна (когда есть старая программа без исходников и нам необходимо заставить еѐ работать в Windows NT/2000/XP без перекомпиляции). Вам придѐтся использовать драйвер GiveIo.sys для того, чтобы использовать в программе команды in и out.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]