Пpимеp
Это будет очень простой пример, который покажет вам как зарегистрировать "aрy time" событие и использовать _SHELL_ShellExecute. VxD будет динамический, который будет загружаться простым win32-приложением. Когда пользователь нажмет кнопку "run Calculator", win32-приложение вызовет DeviceIoControl, чтобы дать VxD команду зарегистрировать "aрy time" событие и загрузить calc.exe, которое находится на Windows-директории.
;------------------------------------------------------------------------ ; VxD Source Code ;------------------------------------------------------------------------
.386p include \masm\include\vmm.inc include \masm\include\vwin32.inc include \masm\include\shell.inc
VxDName TEXTEQU
ControlName TEXTEQU
VxDMajorVersion TEXTEQU <1> VxDMinorVersion TEXTEQU <0>
VxD_STATIC_DATA_SEG VxD_STATIC_DATA_ENDS
VXD_LOCKED_CODE_SEG ;------------------------------------------------------------------------ ; Имя VxD должно быть набрано в верхнем регистре ;------------------------------------------------------------------------
DECLARE_VIRTUAL_DEVICE %VxDName,%VxDMajorVersion,%VxDMinorVersion, %ControlName,UNDEFINED_DEVICE_ID,UNDEFINED_INIT_ORDER
Begin_control_dispatch %VxDName Control_Dispatch W32_DEVICEIOCONTROL, OnDeviceIoControl End_control_dispatch %VxDName
BeginProc OnDeviceIoControl assume esi:ptr DIOCParams .if [esi].dwIoControlCode==1 VxDCall _SHELL_CallAtAppyTime,<<OFFSET32 OnAppyTime>,0,0,0> .endif xor eax,eax
ret EndProc OnDeviceIoControl VXD_LOCKED_CODE_ENDS
VXD_PAGEABLE_CODE_SEG BeginProc OnAppyTime, CCALL ArgVar RefData,DWORD ArgVar TheFlag,DWORD EnterProc mov File.shex_dwTotalSize,sizeof SHEXPACKET add File.shex_dwTotalSize,sizeof EXEName mov File.shex_dwSize,sizeof SHEXPACKET mov File.shex_ibOp,0 mov File.shex_ibFile,sizeof SHEXPACKET mov File.shex_ibParams,0 mov File.shex_ibDir,0 mov File.shex_dwReserved,0 mov File.shex_nCmdShow,1 VxDCall _SHELL_ShellExecute,
LeaveProc Return EndProc OnAppyTime VXD_PAGEABLE_CODE_ENDS
VXD_PAGEABLE_DATA_SEG File SHEXPACKET <> EXEName db "calc.exe",0 VXD_PAGEABLE_DATA_ENDS
end