📄 dvdioctl.cod
字号:
; 262 : DWORD dwTmp;
; 263 : PRKCDB pcdb = (PRKCDB)pCmd;
; 264 : PVOID pdata = &(pKey->KeyData[0]);
; 265 :
; 266 :
; 267 : 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]
; 268 : 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
; 269 :
; 270 : pcdb->OpCode = DVDOP_SEND_KEY;
; 271 : pcdb->Lun = 0;
; 272 : 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]
0005c e28a6020 add r6, r10, #0x20
00060 e5c92000 strb r2, [r9]
00064 e5c97001 strb r7, [r9, #1]
; 273 :
; 274 : if (!KeyType || KeyType > DvdBusKey2 || (pKey->KeyLength <
; 275 : ((dwRet = rkret[KeyType]) >> 24)))
00068 0a00003c beq |$L32931|
0006c e3540003 cmp r4, #3
00070 8a00003a bhi |$L32931|
00074 e5da1004 ldrb r1, [r10, #4]
00078 e5da3005 ldrb r3, [r10, #5]
0007c e59f00ec ldr r0, [pc, #0xEC]
00080 e5da2006 ldrb r2, [r10, #6]
00084 e1813403 orr r3, r1, r3, lsl #8
00088 e5da1007 ldrb r1, [r10, #7]
0008c e790e104 ldr lr, [r0, +r4, lsl #2]
00090 e1833802 orr r3, r3, r2, lsl #16
00094 e1833c01 orr r3, r3, r1, lsl #24
00098 e1530c2e cmp r3, lr, lsr #24
0009c 3a00002f bcc |$L32931|
; 278 : }
; 279 :
; 280 : keyBuf->Len = (WORD)((dwRet >> 16) - (2 << 8));
000a0 e1a0582e mov r5, lr, lsr #16
000a4 e2852cfe add r2, r5, #0xFE, 24
000a8 e1a03422 mov r3, r2, lsr #8
000ac e5c83001 strb r3, [r8, #1]
000b0 e5c82000 strb r2, [r8]
; 281 : keyBuf->Reserved[0] = keyBuf->Reserved[1] = 0;
000b4 e5c87003 strb r7, [r8, #3]
000b8 e5c87002 strb r7, [r8, #2]
; 282 :
; 283 : if (KeyType == DvdBusKey2)
000bc e3540003 cmp r4, #3
000c0 1a00000f bne |$L32933|
; 284 : {
; 285 : for (dwTmp = 0;dwTmp < 5;dwTmp++ )
000c4 e1a02008 mov r2, r8
000c8 e0460008 sub r0, r6, r8
000cc e3a01005 mov r1, #5
000d0 |$L32934|
; 286 : {
; 287 : *((PBYTE)(&keyBuf->chlgkey) + dwTmp) = *((PBYTE)pdata + dwTmp);
000d0 e7d03002 ldrb r3, [r0, +r2]
000d4 e2511001 subs r1, r1, #1
000d8 e5c23004 strb r3, [r2, #4]
000dc e2822001 add r2, r2, #1
000e0 1afffffa bne |$L32934|
; 288 : }
; 289 :
; 290 : for (;dwTmp < 8; dwTmp++)
000e4 e2883005 add r3, r8, #5
000e8 e2833004 add r3, r3, #4
000ec e2832003 add r2, r3, #3
000f0 e3a01000 mov r1, #0
000f4 |$L33166|
000f4 e4c31001 strb r1, [r3], #1
000f8 e1530002 cmp r3, r2
000fc 1afffffc bne |$L33166|
; 291 : {
; 292 : *((PBYTE)(&keyBuf->chlgkey) + dwTmp) = 0;
; 293 : }
; 294 : }
; 295 : else
00100 ea000007 b |$L32946|
00104 |$L32933|
; 296 : {
; 297 : for (dwTmp = 0;dwTmp < ((dwRet >> 26) - 1);dwTmp++ )
00104 e1a03d2e mov r3, lr, lsr #26
00108 e2532001 subs r2, r3, #1
0010c 0a000004 beq |$L32946|
00110 e0461008 sub r1, r6, r8
00114 |$L32944|
; 298 : {
; 299 : *((PDWORD)(&keyBuf->chlgkey) + dwTmp) = *((PDWORD)pdata + dwTmp);
00114 e7983001 ldr r3, [r8, +r1]
00118 e2522001 subs r2, r2, #1
0011c e5a83004 str r3, [r8, #4]!
00120 1afffffb bne |$L32944|
00124 |$L32946|
; 300 : }
; 301 : }
; 302 :
; 303 :
; 304 : //
; 305 : // set up endian swapped allocation length, and clear reserved
; 306 : //
; 307 :
; 308 : *(PDWORD)(&pcdb->Reserved) = dwRet;
; 309 :
; 310 : pcdb->LBA = 0;
; 311 :
; 312 : pcdb->NACA = 0;
; 313 :
; 314 : return(EndSwap(dwRet));
00124 e20e3cff and r3, lr, #0xFF, 24
00128 e183380e orr r3, r3, lr, lsl #16
0012c e20e28ff and r2, lr, #0xFF, 16
00130 e1a01403 mov r1, r3, lsl #8
00134 e1823005 orr r3, r2, r5
00138 e1a0082e mov r0, lr, lsr #16
0013c e1813423 orr r3, r1, r3, lsr #8
00140 e1c9e0b6 strh lr, [r9, #6]
00144 e1c900b8 strh r0, [r9, #8]
00148 e5c97002 strb r7, [r9, #2]
0014c e5c97003 strb r7, [r9, #3]
00150 e5c97004 strb r7, [r9, #4]
00154 e5c97005 strb r7, [r9, #5]
00158 e5c9700b strb r7, [r9, #0xB]
0015c ea000000 b |$L32920|
00160 |$L32931|
; 276 : {
; 277 : return(0);
00160 e3a03000 mov r3, #0
00164 |$L32920|
; 300 : }
; 301 : }
; 302 :
; 303 :
; 304 : //
; 305 : // set up endian swapped allocation length, and clear reserved
; 306 : //
; 307 :
; 308 : *(PDWORD)(&pcdb->Reserved) = dwRet;
; 309 :
; 310 : pcdb->LBA = 0;
; 311 :
; 312 : pcdb->NACA = 0;
; 313 :
; 314 : return(EndSwap(dwRet));
00164 e1a00003 mov r0, r3
; 315 : }
00168 e8bd47f0 ldmia sp!, {r4 - r10, lr}
0016c e12fff1e bx lr
00170 |$L33182|
00170 00000000 DCD |rkret|
00174 |$M33178|
ENDP ; |?DVDSetupSendKey@@YAKPAU_ATAPI_COMMAND_PACKET@@PAU_DVD_COPY_PROTECT_KEY@@PAU_RKFMT_CHLGKEY@@@Z|, DVDSetupSendKey
EXPORT |?DVDSendKey@CDisk@@QAAKPAU_IOREQ@@@Z| ; CDisk::DVDSendKey
IMPORT |?AtapiSendData@CDisk@@QAAHPAU_SGX_BUF@@KPAK@Z| ; CDisk::AtapiSendData
00000 AREA |.text| { |?DVDSendKey@CDisk@@QAAKPAU_IOREQ@@@Z| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 AREA |.pdata$$?DVDSendKey@CDisk@@QAAKPAU_IOREQ@@@Z|, PDATA, SELECTION=5, ASSOC=|.text| { |?DVDSendKey@CDisk@@QAAKPAU_IOREQ@@@Z| } ; comdat associative
|$T33197| DCD |$L33196|
DCD 0x40004002
; Function compile flags: /Ogsy
00000 AREA |.text| { |?DVDSendKey@CDisk@@QAAKPAU_IOREQ@@@Z| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 |?DVDSendKey@CDisk@@QAAKPAU_IOREQ@@@Z| PROC ; CDisk::DVDSendKey
; 319 : {
00000 |$L33196|
00000 e92d40f0 stmdb sp!, {r4 - r7, lr}
00004 e24dd034 sub sp, sp, #0x34
00008 |$M33194|
00008 e1a04001 mov r4, r1
0000c e1a07000 mov r7, r0
; 320 : DWORD dwError = ERROR_SUCCESS;
; 321 : ATAPI_COMMAND_PACKET CmdPkt;
; 322 : PDVD_COPY_PROTECT_KEY pKey = (PDVD_COPY_PROTECT_KEY)pIOReq->pInBuf;
; 323 : DWORD dwLength;
; 324 : RKFMT_CHLGKEY keyBuf;
; 325 : SGX_BUF SgBuf;
; 326 : DWORD dwRet;
; 327 :
; 328 : memset( &CmdPkt, 0, sizeof(ATAPI_COMMAND_PACKET));
00010 e5946018 ldr r6, [r4, #0x18]
00014 e3a02014 mov r2, #0x14
00018 e3a01000 mov r1, #0
0001c e28d0020 add r0, sp, #0x20
00020 e3a05000 mov r5, #0
00024 eb000000 bl memset
; 329 :
; 330 : if (pIOReq->dwCode == IOCTL_DVD_END_SESSION) {
00028 e5942014 ldr r2, [r4, #0x14]
0002c e3a039cd mov r3, #0xCD, 18
00030 e383300c orr r3, r3, #0xC
00034 e1520003 cmp r2, r3
00038 1a000013 bne |$L32963|
; 331 : BYTE bAgid;
; 332 : pKey->KeyType = DvdAGID;
; 333 : bAgid= (BYTE)pKey->SessionId;
0003c e5d6e008 ldrb lr, [r6, #8]
00040 e5d63009 ldrb r3, [r6, #9]
00044 e5d6200a ldrb r2, [r6, #0xA]
00048 e5d6100b ldrb r1, [r6, #0xB]
0004c e18e3403 orr r3, lr, r3, lsl #8
00050 e1833802 orr r3, r3, r2, lsl #16
00054 e1833c01 orr r3, r3, r1, lsl #24
00058 e20320ff and r2, r3, #0xFF
0005c e3a03000 mov r3, #0
; 334 : if (bAgid == -1)
00060 e3720001 cmn r2, #1
00064 e5c6300c strb r3, [r6, #0xC]
00068 e5c6300d strb r3, [r6, #0xD]
0006c e5c6300e strb r3, [r6, #0xE]
00070 e5c6300f strb r3, [r6, #0xF]
; 335 : bAgid = 0;
00074 03a02000 moveq r2, #0
; 336 :
; 337 : dwLength = DVDSetupReadTitleKey(&CmdPkt, -1, bAgid, 0);
00078 e3a03000 mov r3, #0
0007c e3a010ff mov r1, #0xFF
00080 e28d0020 add r0, sp, #0x20
00084 eb000000 bl |?DVDSetupReadTitleKey@@YAKPAU_ATAPI_COMMAND_PACKET@@EEK@Z|
; 338 : } else {
00088 ea000003 b |$L33193|
0008c |$L32963|
; 339 : dwLength = DVDSetupSendKey(&CmdPkt, pKey, &keyBuf);
0008c e28d2010 add r2, sp, #0x10
00090 e1a01006 mov r1, r6
00094 e28d0020 add r0, sp, #0x20
00098 eb000000 bl |?DVDSetupSendKey@@YAKPAU_ATAPI_COMMAND_PACKET@@PAU_DVD_COPY_PROTECT_KEY@@PAU_RKFMT_CHLGKEY@@@Z|
0009c |$L33193|
; 340 : }
; 341 :
; 342 : SgBuf.sb_len = dwLength;
; 343 : SgBuf.sb_buf = (PBYTE) &keyBuf;
0009c e28d3010 add r3, sp, #0x10
000a0 e58d3008 str r3, [sp, #8]
000a4 e1a0e000 mov lr, r0
; 344 :
; 345 : if (AtapiSendCommand(&CmdPkt)) {
000a8 e3a03000 mov r3, #0
000ac e3a02000 mov r2, #0
000b0 e28d1020 add r1, sp, #0x20
000b4 e1a00007 mov r0, r7
000b8 e58de00c str lr, [sp, #0xC]
000bc eb000000 bl |?AtapiSendCommand@CDisk@@QAAHPAU_ATAPI_COMMAND_PACKET@@GH@Z|
000c0 e3500000 cmp r0, #0
000c4 0a000008 beq |$L32969|
; 346 : if (!AtapiSendData(&SgBuf, 1, &dwRet)) {
000c8 e28d3000 add r3, sp, #0
000cc e3a02001 mov r2, #1
000d0 e28d1008 add r1, sp, #8
000d4 e1a00007 mov r0, r7
000d8 eb000000 bl |?AtapiSendData@CDisk@@QAAHPAU_SGX_BUF@@KPAK@Z|
000dc e3500000 cmp r0, #0
000e0 1a000002 bne |$L32972|
; 347 : DEBUGMSG( ZONE_ERROR|ZONE_CDROM, (TEXT("Atapi::DVDSendKey Failed\r\n")));
; 348 : dwError = ERROR_WRITE_FAULT;
000e4 e3a0501d mov r5, #0x1D
; 349 : }
; 350 : } else {
000e8 ea000000 b |$L32972|
000ec |$L32969|
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -