Динамический VxD:
Динамические VxD могут динамически загружаться и выгружаться во время pабочих сессий Windows 95. Эта возможность недоступна под Windows 3.x. Основной целью динамических VxD является поддержка динамической переконфигурации железа, таких как устройств Plug'n'Play. Тем не менее, вы можете их загружать/выгружать из вашего win32-приложения, делая их идеальными ring-0'выми расширениями вашего приложения.
Пример в предыдущем туториале был статическим VxD. Вы можете сконвертировать этот пример в динамический VxD, добавив ключевое слово 'DYNAMIC' к VXD-выражению в .DEF-файле.
VXD FIRSTVXD DYNAMIC
Вот и все, что вы должны сделать, чтобы переконвертировать статический VxD в динамический. Динамические VxD могут быть загружены следующим образом:
- Помещением их в папку \SYSTEM\IOSUBSYS в директории Windows. VxD в этой директории загружаются Inрut Outрut Suрervisor'ом (IOS). VxD в этой папке должны поддерживать layer device driver'а, поэтому, возможно, это не самая лучшая идея загружать ваш VxD этим путем.
- Используя сервис VxD-загрузчика. VxD-загрузчик - это статический VxD, который может динамически загружать VxD. Вы можете вызывать его сервисы из других VxD или из 16-битного кода.
- Используя CreateFile API из Win32-приложения. Вы указываете динамический VxD, который вы хотите загрузить в следующем формате:
\\.\pathname
.data VxDName db "\\.\FirstVxD.VXD",0 ...... .data? hDevice dd ? ..... .code ..... invoke CreateFile, addr VxDName,0,0,0,0, FILE_FLAG_DELETE_ON_CLOSE,0 mov hDevice,eax ...... invoke CloseHandle,hDevice ......
FILE_FLAG_DELETE_ON_CLOSE - флаг, указывающий, что VxD выгружается, когда хэндл, возвращенный CreateFile, будет закрыт.
Если вы используете CreateFile, чтобы загрузить динамический VxD, VxD должен поддерживать сообщение w32_DeviceIoControl. VWIN32 посылает это контрольное сообщение вашему динамическому VxD, когда он загружается в первый раз через CreateFile. VxD должен возвратить 0 в eax'а в качестве ответа на это сообщение.
Сообщение w32_DeviceIoControl также посылается, когда приложение вызывает DeviceIoControl API, чтобы взаимодействовать с VxD. Мы изучим интерфейс DeviceIoControl в следующем туториале.
Динамический VxD получает одно сообщение во время инициализации:
Sys_Dynamic_Device_Init
И одно сообщение во время завершения:
Sys_Dynamic_Device_Exit
Динамический VxD не получает сообщения Sys_Critical_Init, Device_Init и Init_Comрlete, потому что эти сообщения посылаются во время инициализации системной VM. В ином случае, динамический VxD получает все другие контрольные сообщения, когда он находится в памяти. Он может делать все, что и статический VxD. То есть, хотя при загрузке динамического VxD используются совершенно другие механизмы и посылаются другие сообщения инициализации/завершения, он обладает теми же возможностями, что и статический VxD.