📄 dvdioctl.cod
字号:
00000 |?CopyDVDKey@@YAKKPAU_DVD_COPY_PROTECT_KEY@@PAU_RKFMT_TITLE@@@Z| PROC ; CopyDVDKey
; 119 : {
00000 |$L32425|
00000 e92d4070 stmdb sp!, {r4 - r6, lr}
00004 e24dd004 sub sp, sp, #4
00008 |$M32423|
00008 e1a06001 mov r6, r1
; 120 : DWORD dwTmp;
; 121 : PBYTE psrc, pdest;
; 122 :
; 123 : dwTmp = dwKeyLength - 4;
; 124 :
; 125 : pdest = (PBYTE)&(pKey->KeyData[0]);
; 126 :
; 127 : switch (pKey->KeyType) {
0000c e5d6400c ldrb r4, [r6, #0xC]
00010 e5d6300d ldrb r3, [r6, #0xD]
00014 e5d6e00e ldrb lr, [r6, #0xE]
00018 e5d6500f ldrb r5, [r6, #0xF]
0001c e1843403 orr r3, r4, r3, lsl #8
00020 e183380e orr r3, r3, lr, lsl #16
00024 e1933c05 orrs r3, r3, r5, lsl #24
00028 e286e020 add lr, r6, #0x20
0002c e2404004 sub r4, r0, #4
00030 0a00000d beq |$L32154|
00034 e3530004 cmp r3, #4
; 137 : break;
; 138 : default:
; 139 : psrc = (PBYTE)&(pTitle->cgms);
00038 12825004 addne r5, r2, #4
0003c 1a000015 bne |$L32148|
00040 e5d20004 ldrb r0, [r2, #4]
00044 e2825005 add r5, r2, #5
00048 e2444001 sub r4, r4, #1
0004c e1a03420 mov r3, r0, lsr #8
00050 e1a02820 mov r2, r0, lsr #16
00054 e1a01c20 mov r1, r0, lsr #24
00058 e5c63015 strb r3, [r6, #0x15]
0005c e5c62016 strb r2, [r6, #0x16]
00060 e5c61017 strb r1, [r6, #0x17]
00064 e5c60014 strb r0, [r6, #0x14]
00068 ea00000a b |$L32148|
0006c |$L32154|
; 128 : case DvdTitleKey:
; 129 : pKey->KeyFlags = pTitle->cgms;
; 130 : dwTmp--;
; 131 : psrc = (PBYTE)&(pTitle->title[0]);
; 132 : pdest = (PBYTE)&(pKey->KeyData[0]);
; 133 : break;
; 134 : case DvdAGID:
; 135 : pKey->SessionId = ((PRKFMT_AGID)pTitle)->agid >> 6;
0006c e5d23007 ldrb r3, [r2, #7]
; 136 : dwTmp = 0;
00070 e59d5000 ldr r5, [sp]
00074 e3a04000 mov r4, #0
00078 e1a00323 mov r0, r3, lsr #6
0007c e1a03420 mov r3, r0, lsr #8
00080 e1a02820 mov r2, r0, lsr #16
00084 e1a01c20 mov r1, r0, lsr #24
00088 e5c63009 strb r3, [r6, #9]
0008c e5c6200a strb r2, [r6, #0xA]
00090 e5c6100b strb r1, [r6, #0xB]
00094 e5c60008 strb r0, [r6, #8]
00098 |$L32148|
; 140 : pdest = (PBYTE)&(pKey->KeyData[0]);
; 141 : break;
; 142 : }
; 143 :
; 144 : for (;dwTmp >0; dwTmp--) {
00098 e3540000 cmp r4, #0
0009c 0a000003 beq |$L32161|
000a0 |$L32159|
; 145 : *pdest++ = *psrc++;
000a0 e4d53001 ldrb r3, [r5], #1
000a4 e2544001 subs r4, r4, #1
000a8 e4ce3001 strb r3, [lr], #1
000ac 1afffffb bne |$L32159|
000b0 |$L32161|
; 146 : }
; 147 :
; 148 : return TRUE;
000b0 e3a00001 mov r0, #1
; 149 : }
000b4 e28dd004 add sp, sp, #4
000b8 e8bd4070 ldmia sp!, {r4 - r6, lr}
000bc e12fff1e bx lr
000c0 |$M32424|
ENDP ; |?CopyDVDKey@@YAKKPAU_DVD_COPY_PROTECT_KEY@@PAU_RKFMT_TITLE@@@Z|, CopyDVDKey
EXPORT |?DVDReadKey@CPCIDiskAndCD@@QAAKPAU_IOREQ@@@Z| ; CPCIDiskAndCD::DVDReadKey
IMPORT |?AtapiSendCommand@CPCIDiskAndCD@@QAAHPAU_ATAPI_COMMAND_PACKET@@GH@Z| ; CPCIDiskAndCD::AtapiSendCommand
IMPORT |?AtapiReceiveData@CPCIDiskAndCD@@QAAHPAU_SGX_BUF@@KPAK@Z| ; CPCIDiskAndCD::AtapiReceiveData
IMPORT |memset|
00000 AREA |.text| { |?DVDReadKey@CPCIDiskAndCD@@QAAKPAU_IOREQ@@@Z| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 AREA |.pdata$$?DVDReadKey@CPCIDiskAndCD@@QAAKPAU_IOREQ@@@Z|, PDATA, SELECTION=5, ASSOC=|.text| { |?DVDReadKey@CPCIDiskAndCD@@QAAKPAU_IOREQ@@@Z| } ; comdat associative
|$T32442| DCD |$L32441|
DCD 0x40004603
; Function compile flags: /Ogsy
00000 AREA |.text| { |?DVDReadKey@CPCIDiskAndCD@@QAAKPAU_IOREQ@@@Z| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 |?DVDReadKey@CPCIDiskAndCD@@QAAKPAU_IOREQ@@@Z| PROC ; CPCIDiskAndCD::DVDReadKey
; 155 : {
00000 |$L32441|
00000 e92d40f0 stmdb sp!, {r4 - r7, lr}
00004 e59fc108 ldr r12, [pc, #0x108]
00008 e08dd00c add sp, sp, r12
0000c |$M32439|
0000c e1a04001 mov r4, r1
00010 e1a07000 mov r7, r0
; 156 : DWORD dwError = ERROR_SUCCESS;
; 157 : SGX_BUF SgBuf;
; 158 : ATAPI_COMMAND_PACKET CmdPkt;
; 159 : PDVD_COPY_PROTECT_KEY pKey = (PDVD_COPY_PROTECT_KEY)pIOReq->pInBuf;
; 160 : DWORD dwLength;
; 161 : RKFMT_DISC keyBuf;
; 162 : DWORD dwRet;
; 163 :
; 164 : memset(&CmdPkt, 0, sizeof(ATAPI_COMMAND_PACKET));
00014 e5946018 ldr r6, [r4, #0x18]
00018 e3a02014 mov r2, #0x14
0001c e3a01000 mov r1, #0
00020 e28d0010 add r0, sp, #0x10
00024 e3a05000 mov r5, #0
00028 eb000000 bl memset
; 165 :
; 166 : if (IOCTL_DVD_START_SESSION == pIOReq->dwCode) {
0002c e5943014 ldr r3, [r4, #0x14]
; 167 : pKey->KeyType = DvdAGID;
; 168 : // TODO: Check region
; 169 : dwLength = DVDSetupReadTitleKey(&CmdPkt, DvdAGID, 0, 0);
00030 e28d0010 add r0, sp, #0x10
00034 e35309cd cmp r3, #0xCD, 18
00038 1a000009 bne |$L32175|
0003c e3a0e000 mov lr, #0
00040 e3a03000 mov r3, #0
00044 e3a02000 mov r2, #0
00048 e3a01000 mov r1, #0
0004c e5c6e00c strb lr, [r6, #0xC]
00050 e5c6e00d strb lr, [r6, #0xD]
00054 e5c6e00e strb lr, [r6, #0xE]
00058 e5c6e00f strb lr, [r6, #0xF]
0005c eb000000 bl |?DVDSetupReadTitleKey@@YAKPAU_ATAPI_COMMAND_PACKET@@EEK@Z|
; 170 : }
; 171 : else {
00060 ea000001 b |$L32438|
00064 |$L32175|
; 172 : dwLength = DVDSetupReadKey(&CmdPkt, pKey);
00064 e1a01006 mov r1, r6
00068 eb000000 bl |?DVDSetupReadKey@@YAKPAU_ATAPI_COMMAND_PACKET@@PAU_DVD_COPY_PROTECT_KEY@@@Z|
0006c |$L32438|
; 173 : }
; 174 :
; 175 : if (dwLength > pKey->KeyLength) {
0006c e5d63005 ldrb r3, [r6, #5]
00070 e1a04000 mov r4, r0
00074 e5d60004 ldrb r0, [r6, #4]
00078 e5d62006 ldrb r2, [r6, #6]
0007c e5d61007 ldrb r1, [r6, #7]
00080 e1803403 orr r3, r0, r3, lsl #8
00084 e1833802 orr r3, r3, r2, lsl #16
00088 e1833c01 orr r3, r3, r1, lsl #24
0008c e1540003 cmp r4, r3
; 176 : DEBUGMSG(ZONE_ERROR, (TEXT(
; 177 : "Atapi!CPCIDiskAndCD::DVDReadKey> illegal key request\r\n"
; 178 : )));
; 179 : return ERROR_INVALID_PARAMETER;
00090 83a05057 movhi r5, #0x57
00094 8a000018 bhi |$L32185|
; 180 : }
; 181 :
; 182 : SgBuf.sb_len = dwLength;
; 183 : SgBuf.sb_buf = (PBYTE) &keyBuf;
00098 e28d3028 add r3, sp, #0x28
0009c e58d3000 str r3, [sp]
; 184 :
; 185 : if (AtapiSendCommand(&CmdPkt)) {
000a0 e3a03000 mov r3, #0
000a4 e3a02000 mov r2, #0
000a8 e28d1010 add r1, sp, #0x10
000ac e1a00007 mov r0, r7
000b0 e58d4004 str r4, [sp, #4]
000b4 eb000000 bl |?AtapiSendCommand@CPCIDiskAndCD@@QAAHPAU_ATAPI_COMMAND_PACKET@@GH@Z|
000b8 e3500000 cmp r0, #0
000bc 0a00000d beq |$L32180|
; 186 : if (AtapiReceiveData(&SgBuf, 1, &dwRet)) {
000c0 e28d3008 add r3, sp, #8
000c4 e3a02001 mov r2, #1
000c8 e28d1000 add r1, sp, #0
000cc e1a00007 mov r0, r7
000d0 eb000000 bl |?AtapiReceiveData@CPCIDiskAndCD@@QAAHPAU_SGX_BUF@@KPAK@Z|
000d4 e3500000 cmp r0, #0
000d8 0a000004 beq |$L32181|
; 187 : CopyDVDKey(dwLength, pKey, (PRKFMT_TITLE)&keyBuf);
000dc e28d2028 add r2, sp, #0x28
000e0 e1a01006 mov r1, r6
000e4 e1a00004 mov r0, r4
000e8 eb000000 bl |?CopyDVDKey@@YAKKPAU_DVD_COPY_PROTECT_KEY@@PAU_RKFMT_TITLE@@@Z|
; 188 : }
; 189 : else {
000ec ea000002 b |$L32185|
000f0 |$L32181|
; 190 : DEBUGMSG(ZONE_ERROR|ZONE_CDROM, (TEXT(
; 191 : "Atapi!CPCIDiskAndCD::DVDReadKey> failed to execute command %d\r\n"
; 192 : ), CmdPkt.Opcode));
; 193 : dwError = ERROR_READ_FAULT;
000f0 e3a0501e mov r5, #0x1E
; 194 : }
; 195 : }
; 196 : else {
000f4 ea000000 b |$L32185|
000f8 |$L32180|
; 197 : dwError = ERROR_GEN_FAILURE;
000f8 e3a0501f mov r5, #0x1F
000fc |$L32185|
; 176 : DEBUGMSG(ZONE_ERROR, (TEXT(
; 177 : "Atapi!CPCIDiskAndCD::DVDReadKey> illegal key request\r\n"
; 178 : )));
; 179 : return ERROR_INVALID_PARAMETER;
000fc e1a00005 mov r0, r5
; 198 : }
; 199 :
; 200 : return dwError;
; 201 : }
00100 e3a0ce82 mov r12, #0x82, 28
00104 e38cc00c orr r12, r12, #0xC
00108 e08dd00c add sp, sp, r12
0010c e8bd40f0 ldmia sp!, {r4 - r7, lr}
00110 e12fff1e bx lr
00114 |$L32444|
00114 fffff7d4 DCD 0xfffff7d4
00118 |$M32440|
ENDP ; |?DVDReadKey@CPCIDiskAndCD@@QAAKPAU_IOREQ@@@Z|, CPCIDiskAndCD::DVDReadKey
EXPORT |?DVDSetupSendKey@@YAKPAU_ATAPI_COMMAND_PACKET@@PAU_DVD_COPY_PROTECT_KEY@@PAU_RKFMT_CHLGKEY@@@Z| ; DVDSetupSendKey
00000 AREA |.text| { |?DVDSetupSendKey@@YAKPAU_ATAPI_COMMAND_PACKET@@PAU_DVD_COPY_PROTECT_KEY@@PAU_RKFMT_CHLGKEY@@@Z| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 AREA |.pdata$$?DVDSetupSendKey@@YAKPAU_ATAPI_COMMAND_PACKET@@PAU_DVD_COPY_PROTECT_KEY@@PAU_RKFMT_CHLGKEY@@@Z|, PDATA, SELECTION=5, ASSOC=|.text| { |?DVDSetupSendKey@@YAKPAU_ATAPI_COMMAND_PACKET@@PAU_DVD_COPY_PROTECT_KEY@@PAU_RKFMT_CHLGKEY@@@Z| } ; comdat associative
|$T32471| DCD |$L32470|
DCD 0x40005d01
; Function compile flags: /Ogsy
00000 AREA |.text| { |?DVDSetupSendKey@@YAKPAU_ATAPI_COMMAND_PACKET@@PAU_DVD_COPY_PROTECT_KEY@@PAU_RKFMT_CHLGKEY@@@Z| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 |?DVDSetupSendKey@@YAKPAU_ATAPI_COMMAND_PACKET@@PAU_DVD_COPY_PROTECT_KEY@@PAU_RKFMT_CHLGKEY@@@Z| PROC ; DVDSetupSendKey
; 362 : {
00000 |$L32470|
00000 e92d47f0 stmdb sp!, {r4 - r10, lr}
00004 |$M32468|
00004 e1a08002 mov r8, r2
00008 e1a0a001 mov r10, r1
0000c e1a09000 mov r9, r0
; 363 : BYTE KeyType;
; 364 : BYTE agid;
; 365 : DWORD dwRet;
; 366 : DWORD dwTmp;
; 367 : PRKCDB pcdb = (PRKCDB)pCmd;
; 368 : PVOID pdata = &(pKey->KeyData[0]);
; 369 :
; 370 : KeyType = (BYTE)pKey->KeyType;
00010 e5dae00c ldrb lr, [r10, #0xC]
00014 e5da300d ldrb r3, [r10, #0xD]
00018 e5da400e ldrb r4, [r10, #0xE]
0001c e5da500f ldrb r5, [r10, #0xF]
; 371 : agid = (BYTE)pKey->SessionId;
00020 e5da7008 ldrb r7, [r10, #8]
00024 e18e3403 orr r3, lr, r3, lsl #8
00028 e5dae009 ldrb lr, [r10, #9]
0002c e1833804 orr r3, r3, r4, lsl #16
00030 e5da400a ldrb r4, [r10, #0xA]
00034 e5da600b ldrb r6, [r10, #0xB]
00038 e1835c05 orr r5, r3, r5, lsl #24
0003c e187340e orr r3, r7, lr, lsl #8
00040 e1833804 orr r3, r3, r4, lsl #16
; 372 :
; 373 : pcdb->OpCode = DVDOP_SEND_KEY;
; 374 : pcdb->Lun = 0;
; 375 : pcdb->KeyFmt = (agid << 6) | KeyType;
00044 e1833c06 orr r3, r3, r6, lsl #24
00048 e21540ff ands r4, r5, #0xFF
0004c e1843303 orr r3, r4, r3, lsl #6
00050 e3a020a3 mov r2, #0xA3
00054 e3a07000 mov r7, #0
00058 e5c9300a strb r3, [r9, #0xA]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -