Ãœðù - Xakep Online
Ãœðù - Xakep Online
Ãœðù - Xakep Online
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