📄 cdio.cod
字号:
00398 e58d303c str r3, [sp, #0x3C]
0039c ea000130 b |$L32097|
003a0 |$L32114|
; 40 : RAW_READ_INFO *prri = (RAW_READ_INFO *)pIOReq->pInBuf;
003a0 e59d30c0 ldr r3, [sp, #0xC0]
003a4 e2833018 add r3, r3, #0x18
003a8 e5933000 ldr r3, [r3]
003ac e58d3008 str r3, [sp, #8]
; 41 : if (prri && (pIOReq->dwInBufSize == sizeof(RAW_READ_INFO)) && pIOReq->pOutBuf) {
003b0 e59d3008 ldr r3, [sp, #8]
003b4 e3530000 cmp r3, #0
003b8 0a000033 beq |$L32118|
003bc e59d30c0 ldr r3, [sp, #0xC0]
003c0 e283301c add r3, r3, #0x1C
003c4 e5933000 ldr r3, [r3]
003c8 e3530010 cmp r3, #0x10
003cc 1a00002e bne |$L32118|
003d0 e59d30c0 ldr r3, [sp, #0xC0]
003d4 e2833020 add r3, r3, #0x20
003d8 e5933000 ldr r3, [r3]
003dc e3530000 cmp r3, #0
003e0 0a000029 beq |$L32118|
; 42 : CDROM_READ cdr;
; 43 : cdr.StartAddr.Mode = CDROM_ADDR_LBA;
003e4 e3a03000 mov r3, #0
003e8 e58d3010 str r3, [sp, #0x10]
; 44 : cdr.bRawMode = TRUE;
003ec e3a03001 mov r3, #1
003f0 e58d301c str r3, [sp, #0x1C]
; 45 : cdr.sgcount = 1;
003f4 e3a03001 mov r3, #1
003f8 e58d3024 str r3, [sp, #0x24]
; 46 : cdr.TrackMode = CDDA;
003fc e3a03002 mov r3, #2
00400 e58d3020 str r3, [sp, #0x20]
; 47 : cdr.StartAddr.Address.lba = prri->DiskOffset.LowPart;
00404 e59d3008 ldr r3, [sp, #8]
00408 e5933000 ldr r3, [r3]
0040c e58d3014 str r3, [sp, #0x14]
; 48 : cdr.TransferLength = (DWORD)(prri->SectorCount & 0xffffffff);
00410 e59d3008 ldr r3, [sp, #8]
00414 e2831008 add r1, r3, #8
00418 e5d13003 ldrb r3, [r1, #3]
0041c e1a02403 mov r2, r3, lsl #8
00420 e5d13002 ldrb r3, [r1, #2]
00424 e1833002 orr r3, r3, r2
00428 e1a02403 mov r2, r3, lsl #8
0042c e5d13001 ldrb r3, [r1, #1]
00430 e1833002 orr r3, r3, r2
00434 e1a02403 mov r2, r3, lsl #8
00438 e5d13000 ldrb r3, [r1]
0043c e1833002 orr r3, r3, r2
00440 e58d3018 str r3, [sp, #0x18]
; 49 : cdr.sglist[0].sb_buf = pIOReq->pOutBuf;
00444 e59d30c0 ldr r3, [sp, #0xC0]
00448 e2833020 add r3, r3, #0x20
0044c e5933000 ldr r3, [r3]
00450 e58d3028 str r3, [sp, #0x28]
; 50 : cdr.sglist[0].sb_len = pIOReq->dwOutBufSize;
00454 e59d30c0 ldr r3, [sp, #0xC0]
00458 e2833024 add r3, r3, #0x24
0045c e5933000 ldr r3, [r3]
00460 e58d302c str r3, [sp, #0x2C]
; 51 : dwError = ReadCdRom(&cdr, pIOReq->pBytesReturned);
00464 e59d30c0 ldr r3, [sp, #0xC0]
00468 e2833028 add r3, r3, #0x28
0046c e5932000 ldr r2, [r3]
00470 e28d1010 add r1, sp, #0x10
00474 e59d00bc ldr r0, [sp, #0xBC]
00478 eb000000 bl |?ReadCdRom@CPCIDiskAndCD@@QAAKPAUCDROM_READ@@PAK@Z|
0047c e58d0058 str r0, [sp, #0x58]
00480 e59d3058 ldr r3, [sp, #0x58]
00484 e58d3004 str r3, [sp, #4]
; 52 : } else {
00488 ea000001 b |$L32121|
0048c |$L32118|
; 53 : dwError = ERROR_INVALID_PARAMETER;
0048c e3a03057 mov r3, #0x57
00490 e58d3004 str r3, [sp, #4]
00494 |$L32121|
; 54 : }
; 55 : }
; 56 : break;
00494 ea0000f0 b |$L32103|
00498 |$L32122|
; 57 : case IOCTL_CDROM_TEST_UNIT_READY:
; 58 : if (!AtapiIsUnitReady(pIOReq)) {
00498 e59d10c0 ldr r1, [sp, #0xC0]
0049c e59d00bc ldr r0, [sp, #0xBC]
004a0 eb000000 bl |?AtapiIsUnitReady@CPCIDiskAndCD@@QAAHPAU_IOREQ@@@Z|
004a4 e58d005c str r0, [sp, #0x5C]
004a8 e59d305c ldr r3, [sp, #0x5C]
004ac e3530000 cmp r3, #0
004b0 1a000001 bne |$L32123|
; 59 : dwError = ERROR_NOT_READY;
004b4 e3a03015 mov r3, #0x15
004b8 e58d3004 str r3, [sp, #4]
004bc |$L32123|
; 60 : }
; 61 : break;
004bc ea0000e6 b |$L32103|
004c0 |$L32124|
; 62 : case IOCTL_CDROM_DISC_INFO:
; 63 : if (!AtapiIsUnitReadyEx()) return ERROR_NOT_READY;
004c0 e59d00bc ldr r0, [sp, #0xBC]
004c4 eb000000 bl |?AtapiIsUnitReadyEx@CPCIDiskAndCD@@QAAHXZ|
004c8 e58d0060 str r0, [sp, #0x60]
004cc e59d3060 ldr r3, [sp, #0x60]
004d0 e3530000 cmp r3, #0
004d4 1a000002 bne |$L32125|
004d8 e3a03015 mov r3, #0x15
004dc e58d303c str r3, [sp, #0x3C]
004e0 ea0000df b |$L32097|
004e4 |$L32125|
; 64 : dwError = AtapiGetDiscInfo(pIOReq);
004e4 e59d10c0 ldr r1, [sp, #0xC0]
004e8 e59d00bc ldr r0, [sp, #0xBC]
004ec eb000000 bl |?AtapiGetDiscInfo@CPCIDiskAndCD@@QAAKPAU_IOREQ@@@Z|
004f0 e58d0064 str r0, [sp, #0x64]
004f4 e59d3064 ldr r3, [sp, #0x64]
004f8 e58d3004 str r3, [sp, #4]
; 65 : break;
004fc ea0000d6 b |$L32103|
00500 |$L32126|
; 66 : case IOCTL_CDROM_EJECT_MEDIA:
; 67 : dwError = AtapiLoadMedia(TRUE);
00500 e3a01001 mov r1, #1
00504 e59d00bc ldr r0, [sp, #0xBC]
00508 eb000000 bl |?AtapiLoadMedia@CPCIDiskAndCD@@QAAKH@Z|
0050c e58d0068 str r0, [sp, #0x68]
00510 e59d3068 ldr r3, [sp, #0x68]
00514 e58d3004 str r3, [sp, #4]
; 68 : break;
00518 ea0000cf b |$L32103|
0051c |$L32127|
; 69 : case IOCTL_CDROM_LOAD_MEDIA:
; 70 : dwError = AtapiLoadMedia(FALSE);
0051c e3a01000 mov r1, #0
00520 e59d00bc ldr r0, [sp, #0xBC]
00524 eb000000 bl |?AtapiLoadMedia@CPCIDiskAndCD@@QAAKH@Z|
00528 e58d006c str r0, [sp, #0x6C]
0052c e59d306c ldr r3, [sp, #0x6C]
00530 e58d3004 str r3, [sp, #4]
; 71 : break;
00534 ea0000c8 b |$L32103|
00538 |$L32128|
; 72 : case IOCTL_CDROM_GET_SENSE_DATA:
; 73 : {
; 74 : CD_SENSE_DATA *pSenseData = (CD_SENSE_DATA *)pIOReq->pOutBuf;
00538 e59d30c0 ldr r3, [sp, #0xC0]
0053c e2833020 add r3, r3, #0x20
00540 e5933000 ldr r3, [r3]
00544 e58d3030 str r3, [sp, #0x30]
; 75 : if ((pSenseData == NULL) ||
; 76 : (pIOReq->dwOutBufSize < sizeof(CD_SENSE_DATA))) {
00548 e59d3030 ldr r3, [sp, #0x30]
0054c e3530000 cmp r3, #0
00550 0a000004 beq |$L32133|
00554 e59d30c0 ldr r3, [sp, #0xC0]
00558 e2833024 add r3, r3, #0x24
0055c e5933000 ldr r3, [r3]
00560 e3530012 cmp r3, #0x12
00564 2a000002 bcs |$L32132|
00568 |$L32133|
; 77 : dwError = ERROR_INVALID_PARAMETER;
00568 e3a03057 mov r3, #0x57
0056c e58d3004 str r3, [sp, #4]
; 78 : } else {
00570 ea00000d b |$L32134|
00574 |$L32132|
; 79 : dwError = AtapiGetSenseInfo(pSenseData)? ERROR_SUCCESS : ERROR_GEN_FAILURE;
00574 e59d1030 ldr r1, [sp, #0x30]
00578 e59d00bc ldr r0, [sp, #0xBC]
0057c eb000000 bl |?AtapiGetSenseInfo@CPCIDiskAndCD@@QAAHPAU_CD_SENSE_DATA@@@Z|
00580 e58d0070 str r0, [sp, #0x70]
00584 e59d3070 ldr r3, [sp, #0x70]
00588 e3530000 cmp r3, #0
0058c 0a000002 beq |$L32721|
00590 e3a03000 mov r3, #0
00594 e58d3074 str r3, [sp, #0x74]
00598 ea000001 b |$L32722|
0059c |$L32721|
0059c e3a0301f mov r3, #0x1F
005a0 e58d3074 str r3, [sp, #0x74]
005a4 |$L32722|
005a4 e59d3074 ldr r3, [sp, #0x74]
005a8 e58d3004 str r3, [sp, #4]
005ac |$L32134|
; 80 : }
; 81 : }
; 82 : break;
005ac ea0000aa b |$L32103|
005b0 |$L32135|
; 83 : case IOCTL_CDROM_ISSUE_INQUIRY:
; 84 : {
; 85 : INQUIRY_DATA *pInquiryData = (INQUIRY_DATA *)pIOReq->pOutBuf;
005b0 e59d30c0 ldr r3, [sp, #0xC0]
005b4 e2833020 add r3, r3, #0x20
005b8 e5933000 ldr r3, [r3]
005bc e58d3034 str r3, [sp, #0x34]
; 86 : if ((pInquiryData == NULL) ||
; 87 : (pIOReq->dwOutBufSize< sizeof(INQUIRY_DATA))) {
005c0 e59d3034 ldr r3, [sp, #0x34]
005c4 e3530000 cmp r3, #0
005c8 0a000004 beq |$L32140|
005cc e59d30c0 ldr r3, [sp, #0xC0]
005d0 e2833024 add r3, r3, #0x24
005d4 e5933000 ldr r3, [r3]
005d8 e3530060 cmp r3, #0x60
005dc 2a000002 bcs |$L32139|
005e0 |$L32140|
; 88 : dwError = ERROR_INVALID_PARAMETER;
005e0 e3a03057 mov r3, #0x57
005e4 e58d3004 str r3, [sp, #4]
; 89 : } else {
005e8 ea00000d b |$L32141|
005ec |$L32139|
; 90 : dwError = AtapiIssueInquiry(pInquiryData)? ERROR_SUCCESS : ERROR_GEN_FAILURE;
005ec e59d1034 ldr r1, [sp, #0x34]
005f0 e59d00bc ldr r0, [sp, #0xBC]
005f4 eb000000 bl |?AtapiIssueInquiry@CPCIDiskAndCD@@QAAHPAU_INQUIRY_DATA@@@Z|
005f8 e58d0078 str r0, [sp, #0x78]
005fc e59d3078 ldr r3, [sp, #0x78]
00600 e3530000 cmp r3, #0
00604 0a000002 beq |$L32723|
00608 e3a03000 mov r3, #0
0060c e58d307c str r3, [sp, #0x7C]
00610 ea000001 b |$L32724|
00614 |$L32723|
00614 e3a0301f mov r3, #0x1F
00618 e58d307c str r3, [sp, #0x7C]
0061c |$L32724|
0061c e59d307c ldr r3, [sp, #0x7C]
00620 e58d3004 str r3, [sp, #4]
00624 |$L32141|
; 91 : }
; 92 : }
; 93 : break;
00624 ea00008c b |$L32103|
00628 |$L32142|
; 94 : case IOCTL_CDROM_READ_TOC:
; 95 : {
; 96 : if (!AtapiIsUnitReadyEx()) return ERROR_NOT_READY;
00628 e59d00bc ldr r0, [sp, #0xBC]
0062c eb000000 bl |?AtapiIsUnitReadyEx@CPCIDiskAndCD@@QAAHXZ|
00630 e58d0080 str r0, [sp, #0x80]
00634 e59d3080 ldr r3, [sp, #0x80]
00638 e3530000 cmp r3, #0
0063c 1a000002 bne |$L32143|
00640 e3a03015 mov r3, #0x15
00644 e58d303c str r3, [sp, #0x3C]
00648 ea000085 b |$L32097|
0064c |$L32143|
; 97 : CDROM_TOC *pTOC = NULL;
0064c e3a03000 mov r3, #0
00650 e58d3038 str r3, [sp, #0x38]
; 98 : if (pIOReq->pInBuf && (pIOReq->dwInBufSize == sizeof(CDROM_TOC))) {
00654 e59d30c0 ldr r3, [sp, #0xC0]
00658 e2833018 add r3, r3, #0x18
0065c e5933000 ldr r3, [r3]
00660 e3530000 cmp r3, #0
00664 0a000009 beq |$L32146|
00668 e59d30c0 ldr r3, [sp, #0xC0]
0066c e283301c add r3, r3, #0x1C
00670 e5933000 ldr r3, [r3]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -