📄 cdio.cod
字号:
00674 e3530fc9 cmp r3, #0xC9, 30
00678 1a000004 bne |$L32146|
; 99 : pTOC = (CDROM_TOC *)pIOReq->pInBuf;
0067c e59d30c0 ldr r3, [sp, #0xC0]
00680 e2833018 add r3, r3, #0x18
00684 e5933000 ldr r3, [r3]
00688 e58d3038 str r3, [sp, #0x38]
; 100 : } else
0068c ea00000d b |$L32148|
00690 |$L32146|
; 101 : if (pIOReq->pOutBuf && (pIOReq->dwOutBufSize == sizeof(CDROM_TOC))) {
00690 e59d30c0 ldr r3, [sp, #0xC0]
00694 e2833020 add r3, r3, #0x20
00698 e5933000 ldr r3, [r3]
0069c e3530000 cmp r3, #0
006a0 0a000008 beq |$L32150|
006a4 e59d30c0 ldr r3, [sp, #0xC0]
006a8 e2833024 add r3, r3, #0x24
006ac e5933000 ldr r3, [r3]
006b0 e3530fc9 cmp r3, #0xC9, 30
006b4 1a000003 bne |$L32150|
; 102 : pTOC = (CDROM_TOC *)pIOReq->pOutBuf;
006b8 e59d30c0 ldr r3, [sp, #0xC0]
006bc e2833020 add r3, r3, #0x20
006c0 e5933000 ldr r3, [r3]
006c4 e58d3038 str r3, [sp, #0x38]
006c8 |$L32150|
006c8 |$L32148|
; 103 : }
; 104 : if (pTOC == NULL) {
006c8 e59d3038 ldr r3, [sp, #0x38]
006cc e3530000 cmp r3, #0
006d0 1a000002 bne |$L32152|
; 105 : dwError = ERROR_INVALID_PARAMETER;
006d4 e3a03057 mov r3, #0x57
006d8 e58d3004 str r3, [sp, #4]
; 106 : } else {
006dc ea00000d b |$L32153|
006e0 |$L32152|
; 107 : dwError = AtapiGetToc(pTOC) ? ERROR_SUCCESS : ERROR_GEN_FAILURE;
006e0 e59d1038 ldr r1, [sp, #0x38]
006e4 e59d00bc ldr r0, [sp, #0xBC]
006e8 eb000000 bl |?AtapiGetToc@CPCIDiskAndCD@@QAAHPAU_CDROM_TOC@@@Z|
006ec e58d0084 str r0, [sp, #0x84]
006f0 e59d3084 ldr r3, [sp, #0x84]
006f4 e3530000 cmp r3, #0
006f8 0a000002 beq |$L32725|
006fc e3a03000 mov r3, #0
00700 e58d3088 str r3, [sp, #0x88]
00704 ea000001 b |$L32726|
00708 |$L32725|
00708 e3a0301f mov r3, #0x1F
0070c e58d3088 str r3, [sp, #0x88]
00710 |$L32726|
00710 e59d3088 ldr r3, [sp, #0x88]
00714 e58d3004 str r3, [sp, #4]
00718 |$L32153|
; 108 : }
; 109 : }
; 110 : break;
00718 ea00004f b |$L32103|
0071c |$L32154|
; 111 : ///////////////////// DVD ///////////////////////////////////////
; 112 : case IOCTL_DVD_START_SESSION:
; 113 : case IOCTL_DVD_READ_KEY:
; 114 : if (!AtapiIsUnitReadyEx()) return ERROR_NOT_READY;
0071c e59d00bc ldr r0, [sp, #0xBC]
00720 eb000000 bl |?AtapiIsUnitReadyEx@CPCIDiskAndCD@@QAAHXZ|
00724 e58d008c str r0, [sp, #0x8C]
00728 e59d308c ldr r3, [sp, #0x8C]
0072c e3530000 cmp r3, #0
00730 1a000002 bne |$L32155|
00734 e3a03015 mov r3, #0x15
00738 e58d303c str r3, [sp, #0x3C]
0073c ea000048 b |$L32097|
00740 |$L32155|
; 115 : dwError = DVDReadKey(pIOReq);
00740 e59d10c0 ldr r1, [sp, #0xC0]
00744 e59d00bc ldr r0, [sp, #0xBC]
00748 eb000000 bl |?DVDReadKey@CPCIDiskAndCD@@QAAKPAU_IOREQ@@@Z|
0074c e58d0090 str r0, [sp, #0x90]
00750 e59d3090 ldr r3, [sp, #0x90]
00754 e58d3004 str r3, [sp, #4]
; 116 : break;
00758 ea00003f b |$L32103|
0075c |$L32156|
; 117 : case IOCTL_DVD_END_SESSION:
; 118 : case IOCTL_DVD_SEND_KEY:
; 119 : if (!AtapiIsUnitReadyEx()) return ERROR_NOT_READY;
0075c e59d00bc ldr r0, [sp, #0xBC]
00760 eb000000 bl |?AtapiIsUnitReadyEx@CPCIDiskAndCD@@QAAHXZ|
00764 e58d0094 str r0, [sp, #0x94]
00768 e59d3094 ldr r3, [sp, #0x94]
0076c e3530000 cmp r3, #0
00770 1a000002 bne |$L32157|
00774 e3a03015 mov r3, #0x15
00778 e58d303c str r3, [sp, #0x3C]
0077c ea000038 b |$L32097|
00780 |$L32157|
; 120 : dwError = DVDSendKey(pIOReq);
00780 e59d10c0 ldr r1, [sp, #0xC0]
00784 e59d00bc ldr r0, [sp, #0xBC]
00788 eb000000 bl |?DVDSendKey@CPCIDiskAndCD@@QAAKPAU_IOREQ@@@Z|
0078c e58d0098 str r0, [sp, #0x98]
00790 e59d3098 ldr r3, [sp, #0x98]
00794 e58d3004 str r3, [sp, #4]
; 121 : break;
00798 ea00002f b |$L32103|
0079c |$L32158|
; 122 : case IOCTL_DVD_GET_REGION:
; 123 : dwError = DVDGetRegion(pIOReq);
0079c e59d10c0 ldr r1, [sp, #0xC0]
007a0 e59d00bc ldr r0, [sp, #0xBC]
007a4 eb000000 bl |?DVDGetRegion@CPCIDiskAndCD@@QAAKPAU_IOREQ@@@Z|
007a8 e58d009c str r0, [sp, #0x9C]
007ac e59d309c ldr r3, [sp, #0x9C]
007b0 e58d3004 str r3, [sp, #4]
; 124 : break;
007b4 ea000028 b |$L32103|
007b8 |$L32159|
; 125 : case IOCTL_DVD_SET_REGION:
; 126 : dwError = DVDSetRegion(pIOReq);
007b8 e59d10c0 ldr r1, [sp, #0xC0]
007bc e59d00bc ldr r0, [sp, #0xBC]
007c0 eb000000 bl |?DVDSetRegion@CPCIDiskAndCD@@QAAKPAU_IOREQ@@@Z|
007c4 e58d00a0 str r0, [sp, #0xA0]
007c8 e59d30a0 ldr r3, [sp, #0xA0]
007cc e58d3004 str r3, [sp, #4]
; 127 : break;
007d0 ea000021 b |$L32103|
007d4 |$L32160|
; 128 : ///////////////////// CDAUDIO ///////////////////////////////////
; 129 : case IOCTL_CDROM_READ_Q_CHANNEL:
; 130 : if (!AtapiIsUnitReadyEx()) return ERROR_NOT_READY;
007d4 e59d00bc ldr r0, [sp, #0xBC]
007d8 eb000000 bl |?AtapiIsUnitReadyEx@CPCIDiskAndCD@@QAAHXZ|
007dc e58d00a4 str r0, [sp, #0xA4]
007e0 e59d30a4 ldr r3, [sp, #0xA4]
007e4 e3530000 cmp r3, #0
007e8 1a000002 bne |$L32161|
007ec e3a03015 mov r3, #0x15
007f0 e58d303c str r3, [sp, #0x3C]
007f4 ea00001a b |$L32097|
007f8 |$L32161|
; 131 : dwError = AtapiReadQChannel(pIOReq);
007f8 e59d10c0 ldr r1, [sp, #0xC0]
007fc e59d00bc ldr r0, [sp, #0xBC]
00800 eb000000 bl |?AtapiReadQChannel@CPCIDiskAndCD@@QAAKPAU_IOREQ@@@Z|
00804 e58d00a8 str r0, [sp, #0xA8]
00808 e59d30a8 ldr r3, [sp, #0xA8]
0080c e58d3004 str r3, [sp, #4]
; 132 : break;
00810 ea000011 b |$L32103|
00814 |$L32162|
; 133 : case IOCTL_CDROM_PLAY_AUDIO_MSF:
; 134 : case IOCTL_CDROM_SEEK_AUDIO_MSF:
; 135 : case IOCTL_CDROM_RESUME_AUDIO:
; 136 : case IOCTL_CDROM_STOP_AUDIO:
; 137 : case IOCTL_CDROM_PAUSE_AUDIO:
; 138 : case IOCTL_CDROM_SCAN_AUDIO:
; 139 : if (!AtapiIsUnitReadyEx()) return ERROR_NOT_READY;
00814 e59d00bc ldr r0, [sp, #0xBC]
00818 eb000000 bl |?AtapiIsUnitReadyEx@CPCIDiskAndCD@@QAAHXZ|
0081c e58d00ac str r0, [sp, #0xAC]
00820 e59d30ac ldr r3, [sp, #0xAC]
00824 e3530000 cmp r3, #0
00828 1a000002 bne |$L32163|
0082c e3a03015 mov r3, #0x15
00830 e58d303c str r3, [sp, #0x3C]
00834 ea00000a b |$L32097|
00838 |$L32163|
; 140 : dwError = ControlAudio(pIOReq);
00838 e59d10c0 ldr r1, [sp, #0xC0]
0083c e59d00bc ldr r0, [sp, #0xBC]
00840 eb000000 bl |?ControlAudio@CPCIDiskAndCD@@QAAKPAU_IOREQ@@@Z|
00844 e58d00b0 str r0, [sp, #0xB0]
00848 e59d30b0 ldr r3, [sp, #0xB0]
0084c e58d3004 str r3, [sp, #4]
; 141 : break;
00850 ea000001 b |$L32103|
00854 |$L32164|
; 142 : default:
; 143 : dwError = ERROR_NOT_SUPPORTED;
00854 e3a03032 mov r3, #0x32
00858 e58d3004 str r3, [sp, #4]
0085c |$L32103|
; 144 : break;
; 145 : }
; 146 : return dwError;
0085c e59d3004 ldr r3, [sp, #4]
00860 e58d303c str r3, [sp, #0x3C]
00864 |$L32097|
; 23 : ///////////////////// ATAPI /////////////////////////////////////
; 24 : case IOCTL_CDROM_READ_SG:
; 25 : // Verify that the buffer is of valid size
; 26 : {
; 27 : if (!AtapiIsUnitReadyEx()) return ERROR_NOT_READY;
00864 e59d003c ldr r0, [sp, #0x3C]
; 147 : }
00868 e28dd0b4 add sp, sp, #0xB4
0086c e89d6000 ldmia sp, {sp, lr}
00870 e12fff1e bx lr
00874 |$L32740|
00874 00000000 DCD |??_C@_1EO@MDEOOFHJ@?$AAA?$AAT?$AAA?$AAP?$AAI?$AA?3?$AAP?$AAe?$AAr?$AAf?$AAo?$AAr?$AAm?$AAI?$AAo?$AAc?$AAt?$AAl?$AA?3?$AA?5@|
00878 00000000 DCD |dpCurSettings|
0087c |$M32737|
ENDP ; |?AtapiIoctl@CPCIDiskAndCD@@QAAKPAU_IOREQ@@@Z|, CPCIDiskAndCD::AtapiIoctl
IMPORT |?StallExecution@CDisk@@QAAXK@Z| ; CDisk::StallExecution
IMPORT |GetTickCount|
00008 AREA |.pdata|, PDATA
|$T32746| DCD |$L32745|
DCD 0x40002b04
; Function compile flags: /Odt
0087c AREA |.text|, CODE, ARM
0087c |?AtapiIsUnitReadyEx@CPCIDiskAndCD@@QAAHXZ| PROC ; CPCIDiskAndCD::AtapiIsUnitReadyEx
; 151 : {
0087c |$L32745|
0087c e1a0c00d mov r12, sp
00880 e92d0001 stmdb sp!, {r0}
00884 e92d5000 stmdb sp!, {r12, lr}
00888 e24dd010 sub sp, sp, #0x10
0088c |$M32743|
; 152 : DWORD dwCount;
; 153 : for (dwCount = 0; dwCount < 5; dwCount++) {
0088c e3a03000 mov r3, #0
00890 e58d3000 str r3, [sp]
00894 ea000002 b |$L32169|
00898 |$L32170|
00898 e59d3000 ldr r3, [sp]
0089c e2833001 add r3, r3, #1
008a0 e58d3000 str r3, [sp]
008a4 |$L32169|
008a4 e59d3000 ldr r3, [sp]
008a8 e3530005 cmp r3, #5
008ac 2a000011 bcs |$L32171|
; 154 : if (AtapiIsUnitReady()) {
008b0 e3a01000 mov r1, #0
008b4 e59d0018 ldr r0, [sp, #0x18]
008b8 eb000000 bl |?AtapiIsUnitReady@CPCIDiskAndCD@@QAAHPAU_IOREQ@@@Z|
008bc e58d0008 str r0, [sp, #8]
008c0 e59d3008 ldr r3, [sp, #8]
008c4 e3530000 cmp r3, #0
008c8 0a000006 beq |$L32172|
; 155 : m_dwLastCheckTime = GetTickCount();
008cc eb000000 bl GetTickCount
008d0 e58d000c str r0, [sp, #0xC]
008d4 e59d3018 ldr r3, [sp, #0x18]
008d8 e2832e6d add r2, r3, #0x6D, 28
008dc e59d300c ldr r3, [sp, #0xC]
008e0 e5823000 str r3, [r2]
; 156 : break;
008e4 ea000003 b |$L32171|
008e8 |$L32172|
; 157 : }
; 158 : StallExecution(100);
008e8 e3a01064 mov r1, #0x64
008ec e59d0018 ldr r0, [sp, #0x18]
008f0 eb000000 bl |?StallExecution@CDisk@@QAAXK@Z|
; 159 : }
008f4 eaffffe7 b |$L32170|
008f8 |$L32171|
; 160 : if (dwCount == 5)
008f8 e59d3000 ldr r3, [sp]
008fc e3530005 cmp r3, #5
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -