Уроки 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


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


Содержание раздела