Уроки Iczelion'а




Со стороны VxD:


Он всего лишь обрабатывает сообщение w32_deviceIoControl. Когда VxD получает это сообщение, его регистры имеют следующие значения:

  • ebx содержит хэндл VM.
  • esi - это указатель на структуру DIOCParams, которая содержит информацию, которую ему передало win32-приложение.

DIOCParams определен следующим образом: DIOCParams STRUC Internal1 DD ? VMHandle DD ? Internal2 DD ? dwIoControlCode DD ? lpvInBuffer DD ? cbInBuffer DD ? lpvOutBuffer DD ? cbOutBuffer DD ? lpcbBytesReturned DD ? lpoOverlapped DD ? hDevice DD ? tagProcess DD ? DIOCParams ENDS

  • Internal1 - это указатель на клиентскую структуру регистров win32-приложения.
  • VMHandle - комментариев не требуется.
  • Internal2 - это указатель на device descriptor block (DDB).
  • dwIoControlCode, lpvInBuffer, cbInBuffer, lpvOutBuffer, cbOutBuffer, lрcbBytesReturned, lрOverlaрed - это параметры, которые были переданы DeviceIoControl.
  • hDevice - это хэндл ring3-устройства.
  • tagProcess - это тэг процесса.

Из структуры DIOCParams вы получите всю информацию, переданную win32-приложению.

Ваш VxD должен, по крайней мере, обрабатывать DIOC_Oрen (значение, передаваемое в dwIoControlCode), которое VWIN32 пошлет VxD, когда win32-приложение вызовет CreateFile, чтобы открыть ваш VxD. Если VxD готов, он должен возвратить 0 в eax, это будет означать, что вызов CreateFile прошел успешно. Если ваш VxD не готов, он должен возвратить ненулевое значение в eax, что будет означать неуспешный вызов CreateFile. Кpоме DIOC_Open, VxD получить от VWIN32 код DIOC_Closehandle, когда win32-приложение закроет хэндл устройства.

Минимальный каркас динамического VxD, который можно загрузить с помощью CreateFile:

.386p

include vmm.inc include vwin32.inc

DECLARE_VIRTUAL_DEVICE DYNAVXD,1,0, DYNAVXD_Control,\ UNDEFINED_DEVICE_ID, UNDEFINED_INIT_ORDER

Begin_control_dispatch DYNAVXD Control_Dispatch w32_DeviceIoControl, OnDeviceIoControl End_control_dispatch DYNAVXD

VxD_PAGEABLE_CODE_SEG BeginProc OnDeviceIoControl assume esi:ptr DIOCParams

.if [esi].dwIoControlCode==DIOC_Open xor eax,eax .endif ret




Содержание  Назад  Вперед