Программирование драйверов Windows


Отличия между версиями - часть 2


Эта проблема не представляет большого затруднения, поскольку 64-разрядный драйвер может выяснить тип вызывающего процесса при помощи системной функции IoIs32bitProcess, доступной для применения в 64-разрядных сборках драйверов. Пример приводится ниже.

if( IoIs32bitProcess(Irp) == TRUE ) { #if DBG DbgPrint("IRP request is made by 32 bit process."); #endif } else { #if DBG DbgPrint("IRP request is made NOT by 32 bit process."); #endif }

В соответствии с ответом драйвер может скорректировать некоторые свои операции.

С какой конкретно версией операционной системы драйвер имеет дело, можно легко определить по тому, какую версию модели WDM поддерживает система. Это можно узнать с помощью системного вызова IoIsWdmVersionAvailable, например:

if (IoIsWdmVersionAvailable(l, 0x30)) { // Windows Server 2003 } else if (IoIsWdmVersionAvailable(l, 0x20)) { // Windows XP } else if (IoIsWdmVersionAvailable(l, 0x10)) { // Windows 2000 } else if (IoIsWdmVersionAvailable(l, 0x05)) { // Windows Me } else { // Windows 98 }

Тем не менее, пока что широкое использование в России дорогих 64-разрядных конфигураций не предвидится, что можно с некоторой степенью уверенности констатировать на основании неширокого применения в прошлом и настоящем относительно "продвинутых" процессоров XEON.

Сосредоточим внимание на 32-разрядных версиях. Среди них произошли следующие изменения.

При переходе от Windows 2000 к Windows XP переписан загрузчик NTLDR (см. Приложение Б), в результате чего процесс загрузки ускорился в 4-5 раз.

Модуль NTOSKRNL.EXE Windows 2000 экспортировал 1129 функций (большинство из которых &#8212 системные вызовы, доступные из драйверов режима ядра), Windows XP экспортирует 1464, a Windows Server 2003 &#8212 уже 1525.

Модуль HAL.DLL экспортирует, соответственно, 95, 92 и 92 вызова. Причем, по косвенным признакам заметно, что от версии 2000 к XP его постигла значительная переработка, а от версии XP к Server 2003 &#8212 лишь процесс "шлифовки".




Начало  Назад  Вперед