03.04.2014 Views

Май - Xakep Online

Май - Xakep Online

Май - Xakep Online

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

coding<br />

RegMon показывает, какие процессы к какому ключу реестра обращаются<br />

Программирование драйверов<br />

и систем безопасности<br />

и многое другое, мы рассматривать не будем,<br />

так как объем статьи (да и всего журнала) не<br />

может вместить всего, чего бы нам хотелось.<br />

Однако в конце статьи будут приведены ссылки<br />

и названия книг, которые надо прочитать, чтобы<br />

достаточно хорошо разбираться в программировании<br />

режима ядра.<br />

Но вернемся к нашему параметру. Как уже<br />

можно было заметить, это не обычная строка, а<br />

структура, в которой содержится указатель на<br />

unicode-строку, содержащую имя раздела. Этот<br />

указатель драйвер может использовать для<br />

добавления в реестр какой-либо нужной в дальнейшем<br />

информации. В этом случае необходимо<br />

сохранить путь к подразделу реестра, но не сам<br />

указатель, поскольку по выходу из процедуры<br />

DriverEntry он потеряет всякий смысл. Но обычно<br />

этого не требуется.<br />

О формате данных UNICODE_STRING следует<br />

сказать особо. В отличие от режима пользователя,<br />

режим ядра оперирует строками в формате<br />

UNICODE_STRING. Эта структура определена<br />

в файле \include\w2k\ntdef.inc следующим<br />

образом:<br />

UNICODE_STRING<br />

typedef struct _UNICODE_STRING {<br />

USHORT Length;<br />

USHORT MaximumLength;<br />

#ifdef MIDL_PASS<br />

[size_is(MaximumLength / 2),<br />

length_is((Length) / 2) ]<br />

USHORT * Buffer;<br />

#else // MIDL_PASS<br />

PWSTR Buffer;<br />

#endif // MIDL_PASS<br />

} UNICODE_STRING;<br />

typedef UNICODE_STRING<br />

*PUNICODE_STRING;<br />

typedef const UNICODE_STRING<br />

*PCUNICODE_STRING;<br />

Length — содержит текущую длину строки в<br />

байтах (не в символах!), не считая завершающего<br />

нуля. MaximumLength — максимальный размер<br />

буфера (также в байтах), в котором эта строка<br />

содержится. Buffer — указатель на саму unicodeстроку.<br />

Главное достоинство этого формата в том,<br />

что он явно определяет как текущую длину строки,<br />

так и ее максимально возможную длину. При операциях<br />

с такой строкой это позволяет обойтись<br />

без некоторых дополнительных вычислений.<br />

Классификация драйверов<br />

Теперь немного отвлечемся от практики и<br />

погрузимся в теорию. Со времен Windows 2000<br />

все драйверы устройств можно разделить на<br />

два основных типа: пользовательского режима<br />

(User Mode Drivers) и режима ядра (Kernel Mode<br />

Drivers). Драйверы User Mode, в свою очередь,<br />

делятся на драйверы виртуальных устройств<br />

(Virtual Device Drivers, VDD), использующиеся<br />

для поддержки программ MS-DOS, и драйверы<br />

принтеров (Printer Drivers). Драйверы Kernel<br />

Mode подразделяются на драйверы файловой<br />

системы (File System Drivers), которые<br />

реализуют ввод/вывод на локальные и сетевые<br />

диски, унаследованные драйверы (Legacy<br />

Drivers), написанные для предыдущих версий<br />

Windows NT, драйверы видеоадаптеров (Video<br />

Drivers), реализующие графические операции,<br />

драйверы потоковых устройств (Streaming<br />

Drivers), реализующие ввод/вывод видео и<br />

звука, WDM-драйверы (Windows Driver Model,<br />

WDM), поддерживающие технологии Plug’n’Play<br />

и управления электропитанием.<br />

Как следует из самого названия, драйвер<br />

устройства — это программа, предназначенная<br />

для управления каким-то устройством, причем<br />

устройство это не обязательно должно быть<br />

физическим. Оно может быть логическим или,<br />

как в нашем случае, виртуальным.<br />

Также драйверы можно разделить на одноуровневые<br />

и многоуровневые. Большинство драйверов,<br />

управляющих физическими устройствами,<br />

является многоуровневыми (layered drivers).<br />

Обработка запроса ввода/вывода осуществляется<br />

несколькими дровами. Каждый выполняет<br />

свою часть работы. Например, запрос на чтение<br />

файла передается драйверу файловой системы,<br />

который, выполнив некоторые операции<br />

(например, разбиение запроса на несколько<br />

частей), передает его «ниже» — драйверу диска,<br />

а тот, в свою очередь, отправляет запрос драйверу<br />

шины. Кроме того, между ними можно добавить<br />

любое количество драйверов-фильтров<br />

(например, шифрующих данные). Выполнив запрос,<br />

нижестоящий драйвер (lower-level driver)<br />

передает его результаты наверх, вышестоящему<br />

(higher-level driver).<br />

Уровни запросов прерываний<br />

Прерывание — неотъемлемая часть любой<br />

операционной системы. Оно требует<br />

обработки, поэтому выполнение текущего<br />

/ 126<br />

xàêåð 05 /101/ 07

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!