📄 onioctl.asm
字号:
.386p
.xlist
include vmm.inc
include blockdev.inc
include cdioctl.inc
include ior.inc
include iop.inc
include debug.inc
; include iodebug.inc ; various IOS assertions (like AssertIOP)
.list
VXD_LOCKED_DATA_SEG
extrn hFile:WORD
VXD_LOCKED_DATA_ENDS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
VXD_LOCKED_CODE_SEG
public OnCDRomIOCtl
BeginProc OnCDRomIOCtl , esp, sCall
ArgVar IOR_ptr,DWORD
TRAP
EnterProc
mov eax, IOR_ptr
push ebx
mov ebx, eax
movzx eax, [ebx]._ureq._IOR_ioctl_function
cmp eax, CD_IO_RESET_DRIVE
je ResetDrive
cmp eax, CD_IO_SEEK
je Seek
cmp eax, CD_IO_GET_DEV_STATUS
je GetDevStatus
; cmp eax, CD_IO_QUERY_IOCTL_FUNC
; je QueryIoctlFunc
cmp eax, CD_IO_DISC_INFO
je GetDiscInfo
mov [ebx]._ureq._IOR_ioctl_return, IORS_INVALID_COMMAND
xor eax,eax
jmp IO_invalid
IO_Quit:
mov [ebx].IOR_status, IORS_SUCCESS
jmp IO_finish
IO_invalid:
mov [ebx].IOR_status, IORS_INVALID_COMMAND
IO_finish:
pop ebx
LeaveProc
return
ResetDrive:
mov [ebx]._ureq._IOR_ioctl_return, NO_ERROR
jmp IO_Quit
Seek:
mov [ebx]._ureq._IOR_ioctl_return, NO_ERROR
jmp IO_Quit
GetDevStatus:
mov [ebx]._ureq._IOR_ioctl_return, NO_ERROR
mov eax, [ebx]._ureq._IOR_ioctl_buffer_ptr
mov [eax].DeviceStatus, CDDEVSTAT_AUDIO_MANIPULATE
or [eax].DeviceStatus, CDDEVSTAT_REDBOOK_TOO
; or [eax].DeviceStatus, CDDEVSTAT_PLAY_AUDIO_TOO
or [eax].DeviceStatus, CDDEVSTAT_NO_DISK_IN_DRIVE + CDDEVSTAT_CDXA
jmp IO_Quit
GetDiscInfo:
test hFile, 0
; jz @F
;@@:
mov [ebx]._ureq._IOR_ioctl_return, IORS_NO_MEDIA
jmp IO_Quit
QueryIoctlFunc:
jmp IO_Quit
EndProc OnCDRomIOCtl
VXD_LOCKED_CODE_ENDS
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -