.386p
include vmm.inc
include shell.incDECLARE_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 MESSAGEVxD_PAGEABLE_DATA_SEG
MsgTitle db "VxD MessageBox",0
VMCreated db "Una VM e' stata creata",0
VMDestroyed db "Una VM e' stata distrutta",0
VxD_PAGEABLE_DATA_ENDSVxD_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 OnVMCreateBeginProc OnVMClose
mov ecx,OFFSET32 VMDestroyed
jmp CommonCode
EndProc OnVMClose
VxD_PAGEABLE_CODE_ENDSend
Begin_control_dispatch MESSAGEIl VxD elabora i due messaggi del control, Create_VM e VM_Terminate2. Quando il messaggio Create_VM del controllo viene ricevuto, chiama la procedura OnVMCreate. E quando riceve il messaggio VM_Terminate2, chiama la procedura OnVMClose.
Control_Dispatch Create_VM, OnVMCreate
Control_Dispatch VM_Terminate2, OnVMClose
End_control_dispatch MESSAGE
VxD_PAGEABLE_DATA_SEGMettiamo i dati nel pageable data segment.
MsgTitle db "VxD MessageBox",0
VMCreated db "Una VM e' stata creata",0
VMDestroyed db "Una VM e' stata distrutta",0
VxD_PAGEABLE_DATA_ENDS
BeginProc OnVMCreateLa procedura OnVMCreate viene creata usando le macro BeginProc e EndProc. Essa mette i parametri per il servizio SHELL_Message nei registri. Siccome desideriamo mostrare la message box nella VM di sistema, non possiamo usare il valore in ebx (che e' l'handle della VM che stiamo creando). Invece di cio', usiamo un servizio VMM, Get_Sys_VM_Handle, per ottenere l'handle della VM di sistema. Questo servizio ritorna l'handle della VM in ebx. Mettiamo gli indirizzi del messaggio e del titolo rispettivamente in ecx e edi. Non ci interessa sapere la risposta dell'utente, quindi azzeriamo esi e edx. Quando tutti i parametri sono nei registri appropriati, chiamiamo SHELL_Message per mostrare la message box.
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 OnVMCloseLa procedura OnVMClose e' molto semplice. Dato che usa lo stesso codice di OnVMCreate, essa inizializza ecx con l'indirizzo del diverso messaggio e quindi salta nel codice interno di OnVMCreate.
mov ecx,OFFSET32 VMDestroyed
jmp CommonCode
EndProc OnVMClose
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
MESSAGE_DDB @1
link -vxd -def:message.def message.obj
Create una finestra DOS. Vedrete una message box che mostra il messaggio "Una VM e' stata creata". Quando chiudete la finestra DOS, una message box apparira' con il messaggio: "Una VM e' stata distrutta"
Traduzione italiana a cura di: fabio@privacy.nu
Torna alla pagina principale |