⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 atapipm.cod

📁 windows CE 的BSP开发包.包含众多的驱动程序和OAL层的开发代码
💻 COD
📖 第 1 页 / 共 5 页
字号:
  00074	e3a06000	 mov         r6, #0
  00078	e58de000	 str         lr, [sp]
  0007c	eb000000	 bl          RegOpenKeyExW
  00080	e3500000	 cmp         r0, #0

; 389  :         if(dwStatus == ERROR_SUCCESS) {

  00084	1a00003e	 bne         |$L32553|

; 390  :             // read the PM class
; 391  :             DWORD dwSize = sizeof(szClass);
; 392  :             dwStatus = RegQueryValueEx(hk, L"PowerClass", NULL, NULL, (LPBYTE) szClass, &dwSize);

  00088	e59f137c	 ldr         r1, [pc, #0x37C]
  0008c	e59d0028	 ldr         r0, [sp, #0x28]
  00090	e3a08080	 mov         r8, #0x80
  00094	e28de02c	 add         lr, sp, #0x2C
  00098	e28d4060	 add         r4, sp, #0x60
  0009c	e3a03000	 mov         r3, #0
  000a0	e3a02000	 mov         r2, #0
  000a4	e58d802c	 str         r8, [sp, #0x2C]
  000a8	e58de004	 str         lr, [sp, #4]
  000ac	e58d4000	 str         r4, [sp]
  000b0	eb000000	 bl          RegQueryValueExW

; 393  :             if(dwStatus == ERROR_SUCCESS) {
; 394  :                 fGotClass = TRUE;
; 395  :             }
; 396  : 
; 397  :             // get the inactivity timeout
; 398  :             DWORD dwValue;
; 399  :             dwSize = sizeof(dwValue);
; 400  :             dwStatus = RegQueryValueEx(hk, L"InactivityTimeout", NULL, NULL, (LPBYTE) &dwValue, &dwSize);

  000b4	e59f134c	 ldr         r1, [pc, #0x34C]
  000b8	e3500000	 cmp         r0, #0
  000bc	e59d0028	 ldr         r0, [sp, #0x28]
  000c0	e3a08004	 mov         r8, #4
  000c4	e28de02c	 add         lr, sp, #0x2C
  000c8	e28d4030	 add         r4, sp, #0x30
  000cc	e3a03000	 mov         r3, #0
  000d0	e3a02000	 mov         r2, #0
  000d4	03a06001	 moveq       r6, #1
  000d8	e58d802c	 str         r8, [sp, #0x2C]
  000dc	e58de004	 str         lr, [sp, #4]
  000e0	e58d4000	 str         r4, [sp]
  000e4	eb000000	 bl          RegQueryValueExW
  000e8	e3500000	 cmp         r0, #0

; 401  :             if(dwStatus == ERROR_SUCCESS) {
; 402  :                 m_dwPowerTimeout = dwValue;

  000ec	059d3030	 ldreq       r3, [sp, #0x30]

; 403  :             }
; 404  :             DEBUGMSG(ZONE_INIT, (_T("CDiskPower::Init: inactivity timeout is %u ms\r\n"), m_dwPowerTimeout));
; 405  :             
; 406  :             // get the inactivity timeout
; 407  :             dwSize = sizeof(dwValue);
; 408  :             dwStatus = RegQueryValueEx(hk, L"TimeoutDx", NULL, NULL, (LPBYTE) &dwValue, &dwSize);

  000f0	e59f130c	 ldr         r1, [pc, #0x30C]
  000f4	e59d0028	 ldr         r0, [sp, #0x28]
  000f8	05853018	 streq       r3, [r5, #0x18]
  000fc	e3a08004	 mov         r8, #4
  00100	e28de02c	 add         lr, sp, #0x2C
  00104	e28d4030	 add         r4, sp, #0x30
  00108	e3a03000	 mov         r3, #0
  0010c	e3a02000	 mov         r2, #0
  00110	e58d802c	 str         r8, [sp, #0x2C]
  00114	e58de004	 str         lr, [sp, #4]
  00118	e58d4000	 str         r4, [sp]
  0011c	eb000000	 bl          RegQueryValueExW
  00120	e3500000	 cmp         r0, #0

; 409  :             if(dwStatus == ERROR_SUCCESS) {

  00124	1a000004	 bne         |$L32152|

; 410  :                 if(VALID_DX((CEDEVICE_POWER_STATE)dwValue) && dwValue != D3) {

  00128	e59d3030	 ldr         r3, [sp, #0x30]
  0012c	e3530004	 cmp         r3, #4
  00130	8a000001	 bhi         |$L32152|
  00134	e3530003	 cmp         r3, #3

; 411  :                     m_timeoutDx = (CEDEVICE_POWER_STATE) dwValue;

  00138	1585300c	 strne       r3, [r5, #0xC]
  0013c		 |$L32152|

; 412  :                 } else {
; 413  :                     DEBUGMSG(ZONE_WARNING, (_T("CDiskPower::Init: invalid or unsupported timeout device power state %d (0x%x)\r\n"), dwValue, dwValue));
; 414  :                 }
; 415  :             }
; 416  :             DEBUGMSG(ZONE_INIT, (_T("CDiskPower::Init: timeout state is D%d\r\n"), m_timeoutDx));
; 417  :             
; 418  :             // get the inactivity timeout
; 419  :             dwSize = sizeof(dwValue);
; 420  :             dwStatus = RegQueryValueEx(hk, L"InactivityPriority256", NULL, NULL, (LPBYTE) &dwValue, &dwSize);

  0013c	e59f12bc	 ldr         r1, [pc, #0x2BC]
  00140	e59d0028	 ldr         r0, [sp, #0x28]
  00144	e3a08004	 mov         r8, #4
  00148	e28de02c	 add         lr, sp, #0x2C
  0014c	e28d4030	 add         r4, sp, #0x30
  00150	e3a03000	 mov         r3, #0
  00154	e3a02000	 mov         r2, #0
  00158	e58d802c	 str         r8, [sp, #0x2C]
  0015c	e58de004	 str         lr, [sp, #4]
  00160	e58d4000	 str         r4, [sp]
  00164	eb000000	 bl          RegQueryValueExW
  00168	e3500000	 cmp         r0, #0

; 421  :             if(dwStatus == ERROR_SUCCESS) {
; 422  :                 nPriority = (int) dwValue;

  0016c	059d3030	 ldreq       r3, [sp, #0x30]

; 423  :             }
; 424  :             DEBUGMSG(ZONE_INIT, (_T("CDiskPower::Init: inactivity timeout thread priority is %d\r\n"), nPriority));
; 425  :             
; 426  :             RegCloseKey(hk);

  00170	e59d0028	 ldr         r0, [sp, #0x28]
  00174	058d3048	 streq       r3, [sp, #0x48]
  00178	eb000000	 bl          RegCloseKey

; 427  :         }   
; 428  : 
; 429  :         // did we get a class string?
; 430  :         if(!fGotClass) {

  0017c	e3560000	 cmp         r6, #0
  00180	1a000005	 bne         |$L32162|
  00184		 |$L32553|

; 431  :             // no, use the default disk class
; 432  :             wcsncpy(szClass, PMCLASS_BLOCK_DEVICE, dim(szClass));

  00184	e59f1270	 ldr         r1, [pc, #0x270]
  00188	e3a02040	 mov         r2, #0x40
  0018c	e28d0060	 add         r0, sp, #0x60
  00190	eb000000	 bl          wcsncpy

; 433  :             szClass[dim(szClass) - 1] = 0;

  00194	e3a03000	 mov         r3, #0
  00198	e1cd3dbe	 strh        r3, [sp, #0xDE]
  0019c		 |$L32162|

; 434  :         }
; 435  : 
; 436  :         // convert to a GUID
; 437  :         fOk = GUIDFromString(szClass, &gPMClass);

  0019c	e1dd36b0	 ldrh        r3, [sp, #0x60]
  001a0	e353007b	 cmp         r3, #0x7B
  001a4	1a000007	 bne         |$L32573|
  001a8	e28d1038	 add         r1, sp, #0x38
  001ac	e28d0062	 add         r0, sp, #0x62
  001b0	eb000000	 bl          |?wUUIDFromString@@YAHPBGPAU_GUID@@@Z|
  001b4	e3500001	 cmp         r0, #1
  001b8	1a000002	 bne         |$L32573|
  001bc	e1dd3aba	 ldrh        r3, [sp, #0xAA]
  001c0	e353007d	 cmp         r3, #0x7D
  001c4	0a000001	 beq         |$L32540|
  001c8		 |$L32573|
  001c8	e3a04000	 mov         r4, #0
  001cc	ea000000	 b           |$L32537|
  001d0		 |$L32540|
  001d0	e3a04001	 mov         r4, #1
  001d4		 |$L32537|

; 438  :         if(!fOk) {
; 439  :             DEBUGMSG(ZONE_WARNING || ZONE_INIT, (_T("CDiskPower::Init: invalid power management class '%s'\r\n"),
; 440  :                 szClass));
; 441  :         }
; 442  :     }
; 443  : 
; 444  :     // get our active key from the registry
; 445  :     if(fOk) {

  001d4	e3540000	 cmp         r4, #0
  001d8	0a000080	 beq         |$L32213|

; 446  :         HKEY hk;
; 447  :         dwStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE, m_pDisk->m_szActiveKey, 0, 0, &hk);

  001dc	e5952044	 ldr         r2, [r5, #0x44]
  001e0	e28de028	 add         lr, sp, #0x28
  001e4	e3a03000	 mov         r3, #0
  001e8	e2821070	 add         r1, r2, #0x70
  001ec	e3a02000	 mov         r2, #0
  001f0	e3a0010a	 mov         r0, #0xA, 2
  001f4	e58de000	 str         lr, [sp]
  001f8	eb000000	 bl          RegOpenKeyExW
  001fc	e3500000	 cmp         r0, #0

; 448  :         if(dwStatus == ERROR_SUCCESS) {

  00200	1a00000d	 bne         |$L32177|

; 449  :             DWORD dwValue;
; 450  :             DWORD dwSize = sizeof(dwValue);
; 451  :             dwStatus = RegQueryValueEx(hk, DEVLOAD_HANDLE_VALNAME, NULL, NULL, (LPBYTE) &dwValue, &dwSize);

  00204	e59f11ec	 ldr         r1, [pc, #0x1EC]
  00208	e59d0028	 ldr         r0, [sp, #0x28]
  0020c	e3a05004	 mov         r5, #4
  00210	e28de030	 add         lr, sp, #0x30
  00214	e28d402c	 add         r4, sp, #0x2C
  00218	e3a03000	 mov         r3, #0
  0021c	e3a02000	 mov         r2, #0
  00220	e58d5030	 str         r5, [sp, #0x30]
  00224	e58de004	 str         lr, [sp, #4]
  00228	e58d4000	 str         r4, [sp]
  0022c	eb000000	 bl          RegQueryValueExW
  00230	e3500000	 cmp         r0, #0

; 452  :             if(dwStatus != ERROR_SUCCESS) {
; 453  :                 DEBUGMSG(ZONE_WARNING || ZONE_INIT, (_T("CDiskPower::Init: can't read '%s' from '%s'\r\n"),
; 454  :                     DEVLOAD_HANDLE_VALNAME, m_pDisk->m_szActiveKey));
; 455  :                 fOk = FALSE;
; 456  :             } else {

  00234	1a00005f	 bne         |$L32574|

; 457  :                 DEBUGCHK(dwValue != 0);
; 458  :                 hActive = (HANDLE) dwValue;

  00238	e59d702c	 ldr         r7, [sp, #0x2C]
  0023c		 |$L32177|

; 459  :             }
; 460  :         }
; 461  :     }
; 462  : 
; 463  :     // figure out the name we are using
; 464  :     if(fOk) {
; 465  :         WCHAR szName[MAX_PATH];
; 466  :         DWORD dwIndex = 0;

  0023c	e3a05000	 mov         r5, #0
  00240	e3a08f82	 mov         r8, #0x82, 30
  00244	e28d6028	 add         r6, sp, #0x28
  00248		 |$L32183|

; 467  :         do {
; 468  :             DWORD dwSize = sizeof(szName);
; 469  :             GUID gClass;
; 470  :             fOk = EnumDeviceInterfaces(hActive, dwIndex, &gClass, szName, &dwSize);

  00248	e28d30e0	 add         r3, sp, #0xE0
  0024c	e28d2050	 add         r2, sp, #0x50
  00250	e1a01005	 mov         r1, r5
  00254	e1a00007	 mov         r0, r7
  00258	e58d8028	 str         r8, [sp, #0x28]
  0025c	e58d6000	 str         r6, [sp]
  00260	eb000000	 bl          EnumDeviceInterfaces
  00264	e1b04000	 movs        r4, r0

; 471  :             if(fOk && gPMClass == gClass) {

  00268	0a000005	 beq         |$L32550|
  0026c	e3a02010	 mov         r2, #0x10
  00270	e28d1050	 add         r1, sp, #0x50
  00274	e28d0038	 add         r0, sp, #0x38
  00278	eb000000	 bl          memcmp
  0027c	e3500000	 cmp         r0, #0
  00280	0a000003	 beq         |$L32555|
  00284		 |$L32550|

; 472  :                 // we found the interface
; 473  :                 break;
; 474  :             }
; 475  :             dwIndex++;

  00284	e2855001	 add         r5, r5, #1

; 476  :         } while(fOk);

  00288	e3540000	 cmp         r4, #0
  0028c	1affffed	 bne         |$L32183|
  00290	ea000052	 b           |$L32213|
  00294		 |$L32555|

; 477  :         DEBUGMSG(!fOk && (ZONE_WARNING || ZONE_INIT), (_T("CDiskPower::Init: can't find PM interface\r\n")));
; 478  : 
; 479  :         // did we find the name?
; 480  :         if(fOk) {
; 481  :             // yes, allocate a name buffer to use to talk to the power manager
; 482  :             DWORD dwChars = wcslen(PMCLASS_BLOCK_DEVICE) + wcslen(szName) + 2;  // class + separator + name + null

  00294	e28d00e0	 add         r0, sp, #0xE0
  00298	eb000000	 bl          wcslen
  0029c	e2803028	 add         r3, r0, #0x28

; 483  :             LPWSTR pszPMName = (LPWSTR) LocalAlloc(LPTR, dwChars * sizeof(WCHAR));

  002a0	e1a01083	 mov         r1, r3, lsl #1
  002a4	e3a00040	 mov         r0, #0x40
  002a8	e58d3028	 str         r3, [sp, #0x28]
  002ac	eb000000	 bl          LocalAlloc

; 484  :             fOk = FALSE;        // assume failure

  002b0	e3a04000	 mov         r4, #0
  002b4	e58d402c	 str         r4, [sp, #0x2C]
  002b8	e3500000	 cmp         r0, #0
  002bc	e58d0030	 str         r0, [sp, #0x30]

; 485  :             if(pszPMName) {

  002c0	0a000046	 beq         |$L32213|

; 486  :                 HRESULT hr = StringCchPrintfW(pszPMName, dwChars, L"{%08x-%04x-%04x-%04x-%02x%02x%02x%02x%02x%02x}\\%s",
; 487  :                     gPMClass.Data1, gPMClass.Data2, gPMClass.Data3,
; 488  :                     (gPMClass.Data4[0] << 8) + gPMClass.Data4[1], gPMClass.Data4[2], gPMClass.Data4[3], 
; 489  :                     gPMClass.Data4[4], gPMClass.Data4[5], gPMClass.Data4[6], gPMClass.Data4[7],
; 490  :                     szName);

  002c4	e5dd4041	 ldrb        r4, [sp, #0x41]
  002c8	e5dde040	 ldrb        lr, [sp, #0x40]
  002cc	e5dd5047	 ldrb        r5, [sp, #0x47]
  002d0	e5dd6046	 ldrb        r6, [sp, #0x46]
  002d4	e084e40e	 add         lr, r4, lr, lsl #8
  002d8	e5dd7045	 ldrb        r7, [sp, #0x45]
  002dc	e5dd8044	 ldrb        r8, [sp, #0x44]
  002e0	e5dd9043	 ldrb        r9, [sp, #0x43]
  002e4	e5dda042	 ldrb        r10, [sp, #0x42]
  002e8	e1ddb3be	 ldrh        r11, [sp, #0x3E]
  002ec	e58de008	 str         lr, [sp, #8]
  002f0	e1dde3bc	 ldrh        lr, [sp, #0x3C]
  002f4	e59d3038	 ldr         r3, [sp, #0x38]
  002f8	e59f20f4	 ldr         r2, [pc, #0xF4]
  002fc	e59d1028	 ldr         r1, [sp, #0x28]
  00300	e28d40e0	 add         r4, sp, #0xE0
  00304	e58de000	 str         lr, [sp]
  00308	e58d4024	 str         r4, [sp, #0x24]
  0030c	e58d5020	 str         r5, [sp, #0x20]
  00310	e58d601c	 str         r6, [sp, #0x1C]
  00314	e58d7018	 str         r7, [sp, #0x18]
  00318	e58d8014	 str         r8, [sp, #0x14]
  0031c	e58d9010	 str         r9, [sp, #0x10]
  00320	e58da00c	 str         r10, [sp, #0xC]
  00324	e58db004	 str         r11, [sp, #4]
  00328	eb000000	 bl          StringCchPrintfW
  0032c	e3500000	 cmp         r0, #0

; 491  :                 if(SUCCEEDED(hr)) {

  00330	4a000029	 bmi         |$L32572|

; 492  :                     m_pszPMName = (LPCWSTR) pszPMName;
; 493  :                     fOk = TRUE;
; 494  :                 }
; 495  :             }
; 496  :             DEBUGMSG(!fOk && (ZONE_WARNING || ZONE_INIT), (_T("CDiskPower::Init: can't find PM interface\r\n")));

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -