Отображение MessageBox'а
VxD может использовать сервисы Virtual Shell Device, чтобы взаимодействовать с пользователями. Один такой сервис, который мы используем, называется SHELL_Message. SHELL_Message - это регистровый сервис. Вы можете ему параметры через регистры.
- ebx - хэндл виртуальной машины, которая ответственнена за сообщение.
- eax - флаги MessageBox. Вы можете посмотреть их в shell.inc. Они начинаются с MB_.
- ecx - 32-битное линейный адрес сообщения, которое должно быть отображено.
- edi - 32-битный линейный адрес заголовка message box'а.
- esi - 32-битный линейный адрес callback-функций, необходимой для того, чтобы узнать pеакцию пользователя. Если вам это не нужно, используйте NULL.
- edx - дополнительные данные, которые будут передаваться callback-функции (если вы указали ее в esi).
По возвращении флаг переноса сбрасывается, если вызов прошел успешно, в противном случае флаг переноса устанавливается .
ПРИМЕР
.386p include vmm.inc include shell.inc
DECLARE_VIRTUAL_DEVICE MESSAGE,1,0, MESSAGE_Control, UNDEFINED_DEVICE_ID, UNDEFINED_INIT_ORDER
Begin_control_dispatch MESSAGE Control_Dispatch Create_VM, OnVMCreate
Control_Dispatch VM_Terminate2, OnVMClose End_control_dispatch MESSAGE
VxD_PAGEABLE_DATA_SEG MsgTitle db "VxD MessageBox",0 VMCreated db "A VM is created",0 VMDestroyed db "A VM is destroyed",0
VxD_PAGEABLE_DATA_ENDS
VxD_PAGEABLE_CODE_SEG
BeginProc OnVMCreate mov ecx, OFFSET32 VMCreated CommonCode: VMMCall Get_sys_vm_handle
mov eax,MB_OK+MB_ICONEXCLAMATION mov edi, OFFSET32 MsgTitle xor esi,esi xor edx,edx
VxDCall SHELL_Message ret EndProc OnVMCreate
BeginProc OnVMClose mov ecx,OFFSET32 VMDestroyed jmp CommonCode
EndProc OnVMClose VxD_PAGEABLE_CODE_ENDS
end