📄 virtirq.asm
字号:
;********************
;文件:VirtIRQ.asm *
;功能:虚拟化IRQ *
;********************
.386p
include C:\98DDK\inc\win98\vmm.inc
include C:\98DDK\inc\win98\vpicd.inc
include C:\98DDK\inc\win98\shell.inc
include C:\98DDK\inc\win98\debug.inc
WM_USER = 400h
WM_MY_MSG = WM_USER + 1
CONTROL_CODE = 12345
IRQ_NUM = 12
DIOCPARAMETERS 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 ?
DIOCPARAMETERS ends
Declare_Virtual_Device \
VIRTIRQ, \
1, 0, \
VIRTIRQ_control, \
Undefined_Device_ID, Undefined_Init_Order
;消息分派
BeginProc VIRTIRQ_control,LOCKED
Control_Dispatch Sys_Dynamic_Device_Init, OnDynInitAsm, cCall
Control_Dispatch Sys_Dynamic_Device_Exit, OnDynExitAsm, cCall
Control_Dispatch W32_DeviceIOControl, OnDynCtlAsm, cCall
clc
ret
EndProc VIRTIRQ_control
;数据段
VxD_PAGEABLE_DATA_SEG
IRQHand dd ?
vid VPICD_IRQ_Descriptor<IRQ_NUM, VPICD_OPT_CAN_SHARE,OFFSET32 HWProc,0,0,0,0,500,0>
hwnd dd -1
szCaption db "Virtual IRQ",0
szInitOK db "Init OK",0
szInitFail db "Init Fail",0
VxD_PAGEABLE_DATA_ENDS
BeginProc MsgBox,LOCKED
VMMCall Get_sys_vm_handle ;显示消息框
mov eax,MB_OK+MB_ICONEXCLAMATION
mov edi,OFFSET32 szCaption
xor esi,esi
xor edx,edx
VxDCall SHELL_Message
ret
EndProc MsgBox
BeginPRoc HWProc,LOCKED ;硬件中断处理
cmp hwnd,-1
jz HWProcExit
pushad
VxDcall _SHELL_PostMessage <hwnd,SPM_UM_DoNotWaitForCrit or WM_MY_MSG,0,0,0,0>
popad
HWProcExit:
stc
ret
EndProc HWProc
BeginPRoc VTProc,LOCKED
ret
EndProc VTProc
VxD_PAGEABLE_CODE_SEG
BeginProc OnDynInitAsm
mov edi, OFFSET32 vid
VxDcall VPICD_Virtualize_IRQ ;虚拟化IRQ
jc InitFail
mov [IRQHand], eax
lea ecx,szInitOK
jmp CallMsgBox
InitFail:
lea ecx,szInitFail
CallMsgBox:
call MsgBox
mov eax,1
ret
EndProc OnDynInitAsm
BeginProc OnDynExitAsm
cmp IRQHand,0
jz Exit
mov eax, [IRQHand]
VxDcall VPICD_Force_Default_Behavior
Exit:
mov eax,1
ret
EndProc OnDynExitAsm
BeginProc OnDynCtlAsm
cmp [esi].dwIoControlCode,CONTROL_CODE
jnz CtlExit ;取主窗口句柄
mov eax,[esi].lpvInBuffer
mov hwnd,eax
CtlExit:
xor eax,eax
ret
EndProc OnDynCtlAsm
VxD_PAGEABLE_CODE_ENDS
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -