核心内容摘要
61天美丶蜜桃丶糖心MV:抖音上的夏日限定心动,不止心动那么简单
ACPI!ACPIBuildProcessDevicePhaseAdrOrHid函数的到节点DMAC的_HID和ACPIAmliDoubleToName函数算法Direct memory access
分NTSTATUSACPIBuildProcessDevicePhaseAdrOrHid(IN PACPI_BUILD_REQUEST BuildRequest)/*Routine Description:This routine is called after all the children of the current devicehave been created with the name space tree. This function is responsiblethen for evaluating the safe control methods to determine the nameof the extension, etc, etcPath: PhaseAdrOrHid - PhaseAdr|- PhaseUid|- PhaseHidArguments:BuildRequest - The request that we will try to fillReturn Value:NTSTATUS--*/{NTSTATUS status;PDEVICE_EXTENSION deviceExtension (PDEVICE_EXTENSION) BuildRequest-BuildContext;PNSOBJ nsObject NULL;POBJDATA resultData (BuildRequest-DeviceRequest.ResultData);//// We need to name this node, so lets determine if there is an _HID// or an _ADR is present//nsObject ACPIAmliGetNamedChild(deviceExtension-AcpiObject,PACKED_HID);if (nsObject NULL) {//// Otherwise, there had better be an _ADR present//nsObject ACPIAmliGetNamedChild(deviceExtension-AcpiObject,PACKED_ADR);if (nsObject NULL) {//// At this point, we have an invalid name space object ---// this should not happen//KeBugCheckEx(ACPI_BIOS_ERROR,ACPI_REQUIRED_METHOD_NOT_PRESENT,(ULONG_PTR) deviceExtension,PACKED_ADR,
;//// Never get here//return STATUS_NO_SUCH_DEVICE;} else {//// If we think there is an ADR, then the correct next stage is// to post process the ADR//BuildRequest-NextWorkDone WORK_DONE_ADR;//// Remember which name space object we are evaluating//BuildRequest-CurrentObject nsObject;//// Get the Address//status ACPIGetAddressAsync(deviceExtension,ACPIBuildCompleteMustSucceed,BuildRequest,(PVOID *) (deviceExtension-Address),NULL);}
分Device (DMAC){Name (_HID, EisaId (PNP
) // _HID: Hardware ID1: kd gBreakpoint 17 hiteaxf7420746 ebx00000000 ecx89906e38 edx00000000 esi89906e3c edif743b318eipf74133c3 espf791ad6c ebpf791adac iopl0 nv up ei pl zr na pe nccs0008 ss0010 ds0023 es0023 fs0030 gs0000 efl00000246ACPI!ACPIWorker0xbd:f74133c3 ffd0 call eax {ACPI!RestartCtxtPassive (f
}1: kd teaxf7420746 ebx00000000 ecx89906e38 edx00000000 esi89906e3c edif743b318eipf7420746 espf791ad68 ebpf791adac iopl0 nv up ei pl zr na pe nccs0008 ss0010 ds0023 es0023 fs0030 gs0000 efl00000246ACPI!RestartCtxtPassive:f7420746 55 push ebp1: kd kc#00 ACPI!RestartCtxtPassive01 ACPI!ACPIWorker02 nt!PspSystemThreadStartup03 nt!KiThreadStartup1: kd dvprest 0x89906e381: kd dx -r1 ((ACPI!_restart *)0x89906e
((ACPI!_restart *)0x89906e
: 0x89906e38 [Type: _restart *][0x000] pctxt : 0x8985c000 [Type: _ctxt *][0x004] WorkItem [Type: _WORK_QUEUE_ITEM]1: kd dt _ctxt 0x8985c000ACPI!_ctxt0x000 dwSig : 0x545854430x004 pbCtxtEnd : 0x8985e000 CTXT0x008 listCtxt : _List0x010 listQueue : _List0x018 pplistCtxtQueue : (null)0x01c plistResources : (null)0x020 dwfCtxt : 0x1200x024 pnsObj : 0x899b2604 _NSObj0x028 pnsScope : 0x899b2604 _NSObj0x02c powner : (null)0x030 pcall : (null)0x034 pnctxt : (null)0x038 dwSyncLevel : 00x03c pbOp : (null)0x040 Result : _ObjData0x054 pfnAsyncCallBack : 0xf74074ae void ACPI!ACPIGetWorkerForString00x058 pdataCallBack : 0x898f7334 _ObjData0x05c pvContext : 0x898f7308 Void0x060 Timer : _KTIMER0x088 Dpc : _KDPC0x0a8 pheapCurrent : 0x8985c0bc _heap0x0ac CtxtData : _ctxtdata0x0bc LocalHeap : _heap1: kd u f74074aeACPI!ACPIGetWorkerForString [d:\srv03rtm\base\busdrv\acpi\driver\nt\get.c 4952]:f74074ae 55 push ebpf74074af 8bec mov ebp,espf74074b1 51 push ecxf74074b2 53 push ebxf74074b3 56 push esif74074b4 57 push edif74074b5 8b7d0c mov edi,dword ptr [ebp0Ch]f74074b8 85ff test edi,ediwindbg .open -a fffffffff74074ae1: kd dt ACPI_GET_REQUEST 0x898f73080x000 Flags : 0x500800260x000 UFlags : __unnamed0x004 ObjectID : 0x4449485f0x008 ListEntry : _LIST_ENTRY [ 0x898f7378 - 0xf743b940 ]0x010 DeviceExtension : 0x899c07b8 _DEVICE_EXTENSION0x014 AcpiObject : 0x899b25c0 _NSObj0x018 CallBackRoutine : 0xf73fa5bc void ACPI!ACPIBuildCompleteMustSucceed00x01c CallBackContext : 0x899c21d8 Void0x020 Buffer : 0x899c08c4 - (null)0x024 BufferSize : (null)0x028 Status : 0n00x02c ResultData : _ObjData1: kd db 0x898f7308898f7308 26 00 08 50 5f 48 49
73 8f 89 40 b9 43 f7 ..P_HIDxs...C.898f7318 b8 07 9c 89 c0 25 9b 89-bc a5 3f f7 d8 21 9c 89 .....%....?..!..898f7328 c4 08 9c 89 00 00 00
00 00 00 00 00 00 00 ................898f7338 00 00 00 00 00 00 00
00 00 00 00 00 00 00 ................898f7348 09 00 04 00 41 6d 6c 54-e9 72 8f 89 b9 73 8f 89 ....AmlT.r...s..898f7358 18 b3 43 f7 46 07 42 f
73 8f 89 00 00 00 00 ..C.F.B.Ps......898f7368 04 00 09 0a 41 63 70 4d-26 00 08 50 5f 48 49 44 ....AcpM..P_HID898f7378 e0 73 8f 89 10 73 8f
06 9c 89 b8 26 9b 89 .s...s..P......1: kd db 0x899b25c0899b25c0 00 23 9b 89 b8 26 9b
22 9b 89 04 26 9b 89 .#.....x.....899b25d0 44 4d 41 43 30 f3 9a 89-f0 24 9b 89 00 00 06 00 DMAC
...$......1: kd kc#00 ACPI!RunContext01 ACPI!InsertReadyQueue02 ACPI!RestartCtxtPassive03 ACPI!ACPIWorker04 nt!PspSystemThreadStartup05 nt!KiThreadStartup1: kd dvpctxt 0x8985c000pctxtSave 0xf741d711pkthSave 0x00000008rc 0n-19877232641: kd kc#00 ACPI!AsyncCallBack01 ACPI!RunContext02 ACPI!InsertReadyQueue03 ACPI!RestartCtxtPassive04 ACPI!ACPIWorker05 nt!PspSystemThreadStartup06 nt!KiThreadStartup1: kd dvpctxt 0x8985c0001: kd kc#00 ACPI!ACPIGetWorkerForString01 ACPI!AsyncCallBack02 ACPI!RunContext03 ACPI!InsertReadyQueue04 ACPI!RestartCtxtPassive05 ACPI!ACPIWorker06 nt!PspSystemThreadStartup07 nt!KiThreadStartup1: kd dvAcpiObject 0x899b2604Status 0n0Result 0x898f7334Context 0x898f73081: kd dt ACPI_GET_REQUEST 0x898f73080x000 Flags : 0x500800260x000 UFlags : __unnamed0x004 ObjectID : 0x4449485f0x008 ListEntry : _LIST_ENTRY [ 0x898f7378 - 0xf743b940 ]0x010 DeviceExtension : 0x899c07b8 _DEVICE_EXTENSION0x014 AcpiObject : 0x899b25c0 _NSObj0x018 CallBackRoutine : 0xf73fa5bc void ACPI!ACPIBuildCompleteMustSucceed00x01c CallBackContext : 0x899c21d8 Void0x020 Buffer : 0x899c08c4 - (null)0x024 BufferSize : (null)0x028 Status : 0n00x02c ResultData : _ObjData#define GET_CONVERT_TO_WIDESTRING 0x00000010#define GET_CONVERT_TO_DEVICEID 0x00000020} else {//// Are we doing some other kind of conversion? Eg: DeviceID,// InstanceIDs, etc, etc?//if (request-Flags GET_CONVERT_TO_DEVICEID) {status ACPIGetConvertToDeviceID(request-DeviceExtension,Status,Result,request-Flags,request-Buffer,request-BufferSize);Device (DMAC){Name (_HID, EisaId (PNP
) // _HID: Hardware ID1: kd kc#00 ACPI!ACPIGetConvertToDeviceID01 ACPI!ACPIGetWorkerForString02 ACPI!AsyncCallBack03 ACPI!RunContext04 ACPI!InsertReadyQueue05 ACPI!RestartCtxtPassive06 ACPI!ACPIWorker07 nt!PspSystemThreadStartup08 nt!KiThreadStartup1: kd dvDeviceExtension 0x899c07b8Status 0n0Result 0x898f7334Flags 0x50080026Buffer 0x899c08c4BufferSize 0x00000000memSize 01: kd dx -r1 ((ACPI!_ObjData *)0x898f
((ACPI!_ObjData *)0x898f
: 0x898f7334 [Type: _ObjData *][0x000] dwfData : 0x0 [Type: unsigned short][0x002] dwDataType : 0x1 [Type: unsigned short][0x004] dwRefCount : 0x0 [Type: unsigned long][0x004] pdataBase : 0x0 [Type: _ObjData *][0x008] dwDataValue : 0x2d041 [Type: unsigned long][0x008] uipDataValue : 0x2d041 [Type: unsigned long][0x008] pnsAlias : 0x2d041 [Type: _NSObj *][0x008] pdataAlias : 0x2d041 [Type: _ObjData *][0x008] powner : 0x2d041 [Type: void *][0x00c] dwDataLen : 0x0 [Type: unsigned long][0x010] pbDataBuff : 0x0 [Type: unsigned char *]switch (Result-dwDataType) {case OBJTYPE_INTDATA://// For a device ID, we need 4 (ACPI) 1 (\\) 7 (PNPxxxx) 1 (\
// 13 characters//memSize 13;//// Allocate the memory//buffer ExAllocatePoolWithTag(( (Flags GET_PROP_ALLOCATE_NON_PAGED) ? NonPagedPool : PagedPool),memSize * sizeof(UCHAR),ACPI_STRING_POOLTAG);if (buffer NULL) {return STATUS_INSUFFICIENT_RESOURCES;}RtlZeroMemory( buffer, memSize * sizeof(UCHAR) );//// Put the leading characters in place//sprintf( buffer, ACPI\\ );//// Convert the packed string 转换压缩字符//ACPIAmliDoubleToName( buffer5, (ULONG)Result-uipDataValue, FALSE );//// Done//break;
分1: kd db 899bfe88899bfe88 41 43 50 49 5c 00 00
00 00 00 00 50 9c 89 ACPI\........P..1: kd kc#00 ACPI!ACPIAmliDoubleToName01 ACPI!ACPIGetConvertToDeviceID02 ACPI!ACPIGetWorkerForString03 ACPI!AsyncCallBack04 ACPI!RunContext05 ACPI!InsertReadyQueue06 ACPI!RestartCtxtPassive07 ACPI!ACPIWorker08 nt!PspSystemThreadStartup09 nt!KiThreadStartup1: kd dvACPIName 0x899bfe8d DwordID 0x2d041ConvertToID 0x00 0002 d0411101 0000 0100 0001//// First character of DwordID[
.6]//*ACPIName (UCHAR) ( ( (DwordID 0x007C) 2 ) A -
;ACPIName;100 000x1016ABCDE 5FGHIJ 10KLMNO 15P 16第二位到第6位对应的偏移相对于A就是我们需要的字符。
为什么是5位5为最大能表示31英文大写字符就26个。
所以足够了。
//// Second Character from DwordID[
.15,
.1]//*ACPIName (UCHAR) ( ( (DwordID 0x3 ) 3 ) ( (DwordID 0xE
13 ) A -
;ACPIName;01 1100xE14ABCDE 5FGHIJ 10KLMNO 15//// Third Character from dwID[
.12]//*ACPIName (UCHAR) ( ( (DwordID 8 ) 0x1F) A -
;ACPIName;1 00000x1016ABCDE 5FGHIJ 10KLMNO 15P 16//// Add to the reset of the string//sprintf(ACPIName, %02X%02X,(value 0xFF ) ,( value 8 ));}剩下的第三个字节和第四个字节直接转换成字符00 02 d041最后是PNP02001: kd gueax00000004 ebx899bfe88 ecx00000000 edx899bfe93 esi898f7334 edi899bfe95eipf7406a8c espf791ac84 ebpf791ac90 iopl0 nv up ei ng nz na pe nccs0008 ss0010 ds0023 es0023 fs0030 gs0000 efl00000286ACPI!ACPIGetConvertToDeviceID0x1de:f7406a8c 8b4518 mov eax,dword ptr [ebp18h] ss:0010:f791aca8899c08c41: kd db 0x899bfe8d899bfe8d 50 4e 50 30 32 30 30
9c 89 03 00 03 0a 41 PNP
P......A//// Let the originator see this copy. Make sure to also see the buffer// length, if possible//*(Buffer) buffer;if (BufferSize ! NULL) {*(BufferSize) memSize;}1: kd kc#00 ACPI!ACPIGetConvertToDeviceID01 ACPI!ACPIGetWorkerForString02 ACPI!AsyncCallBack03 ACPI!RunContext04 ACPI!InsertReadyQueue05 ACPI!RestartCtxtPassive06 ACPI!ACPIWorker07 nt!PspSystemThreadStartup08 nt!KiThreadStartup1: kd dvDeviceExtension 0x899c07b8Status 0n13Result 0x898f7334Flags 0x50080026Buffer 0x899c08c4BufferSize 0x00000000memSize 0xd1: kd dx -r1 ((ACPI!void * *)0x899c08c
((ACPI!void * *)0x899c08c
: 0x899c08c4 [Type: void * *]0x0 [Type: void *]1: kd dx -r1 ((ACPI!void * *)0x899c08c
((ACPI!void * *)0x899c08c
: 0x899c08c4 [Type: void * *]0x899bfe88 [Type: void *]1: kd db 0x899bfe88899bfe88 41 43 50 49 5c 50 4e
32 30 30 00 50 9c 89 ACPI\PNP
P..1: kd gueax00000000 ebx898f7334 ecx00000000 edx899bfe93 esi898f7308 edi00000000eipf740757a espf791acb0 ebpf791acc0 iopl0 nv up ei pl zr na pe nccs0008 ss0010 ds0023 es0023 fs0030 gs0000 efl00000246ACPI!ACPIGetWorkerForString0xcc:f740757a eb33 jmp ACPI!ACPIGetWorkerForString0x101 (f74075af)1: kd dvAcpiObject 0x899b2604Status 0n0Result 0x898f7334Context 0x898f7308freeData 0x01 1: kd dt ACPI_GET_REQUEST 0x898f73080x000 Flags : 0x500800260x000 UFlags : __unnamed0x004 ObjectID : 0x4449485f0x008 ListEntry : _LIST_ENTRY [ 0x898f7378 - 0xf743b940 ]0x010 DeviceExtension : 0x899c07b8 _DEVICE_EXTENSION0x014 AcpiObject : 0x899b25c0 _NSObj0x018 CallBackRoutine : 0xf73fa5bc void ACPI!ACPIBuildCompleteMustSucceed00x01c CallBackContext : 0x899c21d8 Void0x020 Buffer : 0x899c08c4 - 0x899bfe88 Void0x024 BufferSize : (null)0x028 Status : 0n00x02c ResultData : _ObjData1: kd db 0x899bfe88899bfe88 41 43 50 49 5c 50 4e
32 30 30 00 50 9c 89 ACPI\PNP
P..1: kd dx -id 0,0,899a2278 -r1 ((ACPI!_DEVICE_EXTENSION *)0x899c07b
((ACPI!_DEVICE_EXTENSION *)0x899c07b
: 0x899c07b8 [Type: _DEVICE_EXTENSION *][0x000] Flags : 0x40000000000008 [Type: unsigned __int64][0x000] UFlags [Type: __unnamed][0x008] Signature : 0x5f534750 [Type: unsigned long][0x00c] DebugFlags : 0x0 [Type: unsigned long][0x010] DispatchTable : 0x0 [Type: IRP_DISPATCH_TABLE *][0x014] WorkContext [Type: WORK_QUEUE_CONTEXT][0x014] Fdo [Type: _FDO_DEVICE_EXTENSION][0x014] Filter [Type: _FILTER_DEVICE_EXTENSION][0x014] Pdo [Type: _PDO_DEVICE_EXTENSION][0x058] WorkQueue [Type: EXTENSION_WORKER][0x058] Button [Type: BUTTON_EXTENSION][0x058] Thermal [Type: THERMAL_EXTENSION][0x058] LinkNode [Type: LINK_NODE_EXTENSION][0x058] Dock [Type: DOCK_EXTENSION][0x058] Processor [Type: _PROCESSOR_DEVICE_EXTENSION][0x088] DeviceState : Stopped (
[Type: _ACPI_DEVICE_STATE][0x08c] PreviousState : Stopped (
[Type: _ACPI_DEVICE_STATE][0x090] PowerInfo [Type: _ACPI_POWER_INFO][0x10c] DeviceID : 0x899bfe88 : 0x41 [Type: unsigned char *] 完成赋值1: kd ?0x899c07b810cEvaluate expression: -1986262844 899c08c41: kd db 0x899bfe88899bfe88 41 43 50 49 5c 50 4e
32 30 30 00 50 9c 89 ACPI\PNP
P..参考DevNode 0x89d02b68 for PDO 0x89d393a8InstancePath is ACPI\PNP0200\45289e180State DeviceNodeInitialized (0x
Previous State DeviceNodeUninitialized (0x
参考结束Device (DMAC){Name (_HID, EisaId (PNP
) // _HID: Hardware ID硬件ID: ACPI\PNP0200设备类别: 4d36e97d-e
ce-bfc
be10318设备名称: Direct memory access controller[ 系统设备 / Motherboard resources ]驱动程序:驱动程序描述 Motherboard resources驱动程序日期
驱动程序版本
5.
1.
2
5512驱动程序供应商 MicrosoftINF 文件 machine.inf硬件 ID ACPI\PNP0C02PnP 设备 Motherboard Resources设备资源:内存
FFFFFFF[ 系统设备 / Motherboard resources ]驱动程序:驱动程序描述 Motherboard resources驱动程序日期
驱动程序版本
5.
1.
2
5512驱动程序供应商 MicrosoftINF 文件 machine.inf硬件 ID ACPI\PNP0C02PnP 设备 Motherboard Resources设备资源:内存 FEC00000-FEC00FFF内存 FEE00000-FEE00FFF端口
端口
[ 系统设备 / Motherboard resources ]驱动程序:驱动程序描述 Motherboard resources驱动程序日期
驱动程序版本
5.
1.
2
5512驱动程序供应商 MicrosoftINF 文件 machine.inf硬件 ID ACPI\PNP0C02PnP 设备 Motherboard Resources设备资源:内存 FEC10000-FEC1001F内存 FFB80000-FFBFFFFF端口
F端口
F端口
端口
端口
端口
F端口
F端口
端口
端口
端口 008C-008E端口
F端口 00A
BF端口 00B
B1端口 00E
EF端口 040B-040B端口 04D
D1端口 04D
D6端口
F端口
F端口
F端口 0B
B0F端口 0B
B3F端口 0C
C01端口 0C
C14端口 0C
C51端口 0C
C52端口 0C6C-0C6C端口 0C6F-0C6F端口 0CD
CD1端口 0CD
CD3端口 0CD
CD5端口 0CD
CD7端口 0CD
CDF端口 FE00-FEFE[ 系统设备 / Motherboard resources ]驱动程序:驱动程序描述 Motherboard resources驱动程序日期
驱动程序版本
5.
1.
2
5512驱动程序供应商 MicrosoftINF 文件 machine.inf硬件 ID ACPI\PNP0C02PnP 设备 Motherboard Resources设备资源:内存 E0000000-EFFFFFFF[ 系统设备 / Motherboard resources ]驱动程序:驱动程序描述 Motherboard resources驱动程序日期
驱动程序版本
5.
1.
2