Со стороны 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
EndProc OnDeviceIoControl VxD_PAGEABLE_CODE_ENDS
end
;---------------------------------------------------------------------------- ; Module Definition File ;----------------------------------------------------------------------------
VXD DYNAVXD DYNAMIC
SEGMENTS
_LPTEXT CLASS 'LCODE' PRELOAD NONDISCARDABLE _LTEXT CLASS 'LCODE' PRELOAD NONDISCARDABLE _LDATA CLASS 'LCODE' PRELOAD NONDISCARDABLE _TEXT CLASS 'LCODE' PRELOAD NONDISCARDABLE
_DATA CLASS 'LCODE' PRELOAD NONDISCARDABLE CONST CLASS 'LCODE' PRELOAD NONDISCARDABLE _TLS CLASS 'LCODE' PRELOAD NONDISCARDABLE _BSS CLASS 'LCODE' PRELOAD NONDISCARDABLE
_LMGTABLE CLASS 'MCODE' PRELOAD NONDISCARDABLE IOPL _LMSGDATA CLASS 'MCODE' PRELOAD NONDISCARDABLE IOPL _IMSGTABLE CLASS 'MCODE' PRELOAD DISCARDABLE IOPL _IMSGDATA CLASS 'MCODE' PRELOAD DISCARDABLE IOPL
_ITEXT CLASS 'ICODE' DISCARDABLE _IDATA CLASS 'ICODE' DISCARDABLE _PTEXT CLASS 'PCODE' NONDISCARDABLE _PMSGTABLE CLASS 'MCODE' NONDISCARDABLE IOPL
_PMSGDATA CLASS 'MCODE' NONDISCARDABLE IOPL _PDATA CLASS 'PDATA' NONDISCARDABLE SHARED _STEXT CLASS 'SCODE' RESIDENT _SDATA CLASS 'SCODE' RESIDENT
_DBOSTART CLASS 'DBOCODE' PRELOAD NONDISCARDABLE CONFORMING _DBOCODE CLASS 'DBOCODE' PRELOAD NONDISCARDABLE CONFORMING _DBODATA CLASS 'DBOCODE' PRELOAD NONDISCARDABLE CONFORMING _16ICODE CLASS '16ICODE' PRELOAD DISCARDABLE
_RCODE CLASS 'RCODE'
EXPORTS
DYNAVXD_DDB @1