news 2026/6/10 14:28:04

ACPI!ACPIBuildProcessDevicePhaseAdrOrHid函数的到节点DMAC的_HID和ACPIAmliDoubleToName算法Direct memory access

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ACPI!ACPIBuildProcessDevicePhaseAdrOrHid函数的到节点DMAC的_HID和ACPIAmliDoubleToName算法Direct memory access

ACPI!ACPIBuildProcessDevicePhaseAdrOrHid函数的到节点DMAC的_HID和ACPIAmliDoubleToName函数算法Direct memory access


第一部分:

NTSTATUS
ACPIBuildProcessDevicePhaseAdrOrHid(
IN PACPI_BUILD_REQUEST BuildRequest
)
/*++

Routine Description:

This routine is called after all the children of the current device
have been created with the name space tree. This function is responsible
then for evaluating the 'safe' control methods to determine the name
of the extension, etc, etc

Path: PhaseAdrOrHid -> PhaseAdr
|-> PhaseUid
|-> PhaseHid

Arguments:

BuildRequest - The request that we will try to fill

Return 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,
0
);

//
// 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 ("PNP0200")) // _HID: Hardware ID

1: kd> g
Breakpoint 17 hit
eax=f7420746 ebx=00000000 ecx=89906e38 edx=00000000 esi=89906e3c edi=f743b318
eip=f74133c3 esp=f791ad6c ebp=f791adac iopl=0 nv up ei pl zr na pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000246
ACPI!ACPIWorker+0xbd:
f74133c3 ffd0 call eax {ACPI!RestartCtxtPassive (f7420746)}
1: kd> t
eax=f7420746 ebx=00000000 ecx=89906e38 edx=00000000 esi=89906e3c edi=f743b318
eip=f7420746 esp=f791ad68 ebp=f791adac iopl=0 nv up ei pl zr na pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000246
ACPI!RestartCtxtPassive:
f7420746 55 push ebp
1: kd> kc
#
00 ACPI!RestartCtxtPassive
01 ACPI!ACPIWorker
02 nt!PspSystemThreadStartup
03 nt!KiThreadStartup
1: kd> dv
prest = 0x89906e38
1: kd> dx -r1 ((ACPI!_restart *)0x89906e38)
((ACPI!_restart *)0x89906e38) : 0x89906e38 [Type: _restart *]
[+0x000] pctxt : 0x8985c000 [Type: _ctxt *]
[+0x004] WorkItem [Type: _WORK_QUEUE_ITEM]
1: kd> dt _ctxt 0x8985c000
ACPI!_ctxt
+0x000 dwSig : 0x54585443
+0x004 pbCtxtEnd : 0x8985e000 "CTXT"
+0x008 listCtxt : _List
+0x010 listQueue : _List
+0x018 pplistCtxtQueue : (null)
+0x01c plistResources : (null)
+0x020 dwfCtxt : 0x120
+0x024 pnsObj : 0x899b2604 _NSObj
+0x028 pnsScope : 0x899b2604 _NSObj
+0x02c powner : (null)
+0x030 pcall : (null)
+0x034 pnctxt : (null)
+0x038 dwSyncLevel : 0
+0x03c pbOp : (null)
+0x040 Result : _ObjData
+0x054 pfnAsyncCallBack : 0xf74074ae void ACPI!ACPIGetWorkerForString+0
+0x058 pdataCallBack : 0x898f7334 _ObjData
+0x05c pvContext : 0x898f7308 Void
+0x060 Timer : _KTIMER
+0x088 Dpc : _KDPC
+0x0a8 pheapCurrent : 0x8985c0bc _heap
+0x0ac CtxtData : _ctxtdata
+0x0bc LocalHeap : _heap
1: kd> u f74074ae
ACPI!ACPIGetWorkerForString [d:\srv03rtm\base\busdrv\acpi\driver\nt\get.c @ 4952]:
f74074ae 55 push ebp
f74074af 8bec mov ebp,esp
f74074b1 51 push ecx
f74074b2 53 push ebx
f74074b3 56 push esi
f74074b4 57 push edi
f74074b5 8b7d0c mov edi,dword ptr [ebp+0Ch]
f74074b8 85ff test edi,edi
windbg> .open -a fffffffff74074ae
1: kd> dt ACPI_GET_REQUEST 0x898f7308
+0x000 Flags : 0x50080026
+0x000 UFlags : __unnamed
+0x004 ObjectID : 0x4449485f
+0x008 ListEntry : _LIST_ENTRY [ 0x898f7378 - 0xf743b940 ]
+0x010 DeviceExtension : 0x899c07b8 _DEVICE_EXTENSION
+0x014 AcpiObject : 0x899b25c0 _NSObj
+0x018 CallBackRoutine : 0xf73fa5bc void ACPI!ACPIBuildCompleteMustSucceed+0
+0x01c CallBackContext : 0x899c21d8 Void
+0x020 Buffer : 0x899c08c4 -> (null)
+0x024 BufferSize : (null)
+0x028 Status : 0n0
+0x02c ResultData : _ObjData
1: kd> db 0x898f7308
898f7308 26 00 08 50 5f 48 49 44-78 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 00 00 ................
898f7338 00 00 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 f7-50 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_HID
898f7378 e0 73 8f 89 10 73 8f 89-50 06 9c 89 b8 26 9b 89 .s...s..P....&..
1: kd> db 0x899b25c0
899b25c0 00 23 9b 89 b8 26 9b 89-78 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 DMAC0....$......

1: kd> kc
#
00 ACPI!RunContext
01 ACPI!InsertReadyQueue
02 ACPI!RestartCtxtPassive
03 ACPI!ACPIWorker
04 nt!PspSystemThreadStartup
05 nt!KiThreadStartup
1: kd> dv
pctxt = 0x8985c000
pctxtSave = 0xf741d711
pkthSave = 0x00000008
rc = 0n-1987723264


1: kd> kc
#
00 ACPI!AsyncCallBack
01 ACPI!RunContext
02 ACPI!InsertReadyQueue
03 ACPI!RestartCtxtPassive
04 ACPI!ACPIWorker
05 nt!PspSystemThreadStartup
06 nt!KiThreadStartup
1: kd> dv
pctxt = 0x8985c000

1: kd> kc
#
00 ACPI!ACPIGetWorkerForString
01 ACPI!AsyncCallBack
02 ACPI!RunContext
03 ACPI!InsertReadyQueue
04 ACPI!RestartCtxtPassive
05 ACPI!ACPIWorker
06 nt!PspSystemThreadStartup
07 nt!KiThreadStartup
1: kd> dv
AcpiObject = 0x899b2604
Status = 0n0
Result = 0x898f7334
Context = 0x898f7308


1: kd> dt ACPI_GET_REQUEST 0x898f7308
+0x000 Flags : 0x50080026
+0x000 UFlags : __unnamed
+0x004 ObjectID : 0x4449485f
+0x008 ListEntry : _LIST_ENTRY [ 0x898f7378 - 0xf743b940 ]
+0x010 DeviceExtension : 0x899c07b8 _DEVICE_EXTENSION
+0x014 AcpiObject : 0x899b25c0 _NSObj
+0x018 CallBackRoutine : 0xf73fa5bc void ACPI!ACPIBuildCompleteMustSucceed+0
+0x01c CallBackContext : 0x899c21d8 Void
+0x020 Buffer : 0x899c08c4 -> (null)
+0x024 BufferSize : (null)
+0x028 Status : 0n0
+0x02c 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 ("PNP0200")) // _HID: Hardware ID


1: kd> kc
#
00 ACPI!ACPIGetConvertToDeviceID
01 ACPI!ACPIGetWorkerForString
02 ACPI!AsyncCallBack
03 ACPI!RunContext
04 ACPI!InsertReadyQueue
05 ACPI!RestartCtxtPassive
06 ACPI!ACPIWorker
07 nt!PspSystemThreadStartup
08 nt!KiThreadStartup
1: kd> dv
DeviceExtension = 0x899c07b8
Status = 0n0
Result = 0x898f7334
Flags = 0x50080026
Buffer = 0x899c08c4
BufferSize = 0x00000000
memSize = 0
1: kd> dx -r1 ((ACPI!_ObjData *)0x898f7334)
((ACPI!_ObjData *)0x898f7334) : 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 (\0)
// = 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( buffer+5, (ULONG)Result->uipDataValue, FALSE );

//
// Done
//
break;

第三部分:

1: kd> db 899bfe88
899bfe88 41 43 50 49 5c 00 00 00-00 00 00 00 00 50 9c 89 ACPI\........P..

1: kd> kc
#
00 ACPI!ACPIAmliDoubleToName
01 ACPI!ACPIGetConvertToDeviceID
02 ACPI!ACPIGetWorkerForString
03 ACPI!AsyncCallBack
04 ACPI!RunContext
05 ACPI!InsertReadyQueue
06 ACPI!RestartCtxtPassive
07 ACPI!ACPIWorker
08 nt!PspSystemThreadStartup
09 nt!KiThreadStartup
1: kd> dv
ACPIName = 0x899bfe8d ""
DwordID = 0x2d041
ConvertToID = 0x00 ''


0002 d041

1101 0000 0100 0001


//
// First character of DwordID[2..6]
//
*ACPIName = (UCHAR) ( ( (DwordID & 0x007C) >> 2 ) + 'A' - 1);
ACPIName++;

100 00

0x10
16
ABCDE 5
FGHIJ 10
KLMNO 15
P 16

第二位到第6位对应的偏移相对于A,就是我们需要的字符。
为什么是5位?5为最大能表示31,英文大写字符就26个。所以足够了。

//
// Second Character from DwordID[13..15,0..1]
//
*ACPIName = (UCHAR) ( ( (DwordID & 0x3 )<< 3 ) +
( (DwordID & 0xE000) >> 13 ) + 'A' - 1);
ACPIName++;


01 110
0xE=14
ABCDE 5
FGHIJ 10
KLMN
O 15

//
// Third Character from dwID[8..12]
//
*ACPIName = (UCHAR) ( ( (DwordID >> 8 ) & 0x1F) + 'A' - 1);
ACPIName++;

1 0000
0x10=16
ABCDE 5
FGHIJ 10
KLMNO 15
P 16

//
// Add to the reset of the string
//
sprintf(ACPIName, "%02X%02X",(value & 0xFF ) ,( value >> 8 ));
}


剩下的第三个字节和第四个字节直接转换成字符!!!

00 02 d041
最后是"PNP0200"


1: kd> gu
eax=00000004 ebx=899bfe88 ecx=00000000 edx=899bfe93 esi=898f7334 edi=899bfe95
eip=f7406a8c esp=f791ac84 ebp=f791ac90 iopl=0 nv up ei ng nz na pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000286
ACPI!ACPIGetConvertToDeviceID+0x1de:
f7406a8c 8b4518 mov eax,dword ptr [ebp+18h] ss:0010:f791aca8=899c08c4
1: kd> db 0x899bfe8d
899bfe8d 50 4e 50 30 32 30 30 00-50 9c 89 03 00 03 0a 41 PNP0200.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!ACPIGetConvertToDeviceID
01 ACPI!ACPIGetWorkerForString
02 ACPI!AsyncCallBack
03 ACPI!RunContext
04 ACPI!InsertReadyQueue
05 ACPI!RestartCtxtPassive
06 ACPI!ACPIWorker
07 nt!PspSystemThreadStartup
08 nt!KiThreadStartup
1: kd> dv
DeviceExtension = 0x899c07b8
Status = 0n13
Result = 0x898f7334
Flags = 0x50080026
Buffer = 0x899c08c4
BufferSize = 0x00000000
memSize = 0xd
1: kd> dx -r1 ((ACPI!void * *)0x899c08c4)
((ACPI!void * *)0x899c08c4) : 0x899c08c4 [Type: void * *]
0x0 [Type: void *]


1: kd> dx -r1 ((ACPI!void * *)0x899c08c4)
((ACPI!void * *)0x899c08c4) : 0x899c08c4 [Type: void * *]
0x899bfe88 [Type: void *]
1: kd> db 0x899bfe88
899bfe88 41 43 50 49 5c 50 4e 50-30 32 30 30 00 50 9c 89 ACPI\PNP0200.P..

1: kd> gu
eax=00000000 ebx=898f7334 ecx=00000000 edx=899bfe93 esi=898f7308 edi=00000000
eip=f740757a esp=f791acb0 ebp=f791acc0 iopl=0 nv up ei pl zr na pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000246
ACPI!ACPIGetWorkerForString+0xcc:
f740757a eb33 jmp ACPI!ACPIGetWorkerForString+0x101 (f74075af)
1: kd> dv
AcpiObject = 0x899b2604
Status = 0n0
Result = 0x898f7334
Context = 0x898f7308
freeData = 0x01 ''

1: kd> dt ACPI_GET_REQUEST 0x898f7308
+0x000 Flags : 0x50080026
+0x000 UFlags : __unnamed
+0x004 ObjectID : 0x4449485f
+0x008 ListEntry : _LIST_ENTRY [ 0x898f7378 - 0xf743b940 ]
+0x010 DeviceExtension : 0x899c07b8 _DEVICE_EXTENSION
+0x014 AcpiObject : 0x899b25c0 _NSObj
+0x018 CallBackRoutine : 0xf73fa5bc void ACPI!ACPIBuildCompleteMustSucceed+0
+0x01c CallBackContext : 0x899c21d8 Void
+0x020 Buffer : 0x899c08c4 -> 0x899bfe88 Void
+0x024 BufferSize : (null)
+0x028 Status : 0n0
+0x02c ResultData : _ObjData
1: kd> db 0x899bfe88
899bfe88 41 43 50 49 5c 50 4e 50-30 32 30 30 00 50 9c 89 ACPI\PNP0200.P..


1: kd> dx -id 0,0,899a2278 -r1 ((ACPI!_DEVICE_EXTENSION *)0x899c07b8)
((ACPI!_DEVICE_EXTENSION *)0x899c07b8) : 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 (0) [Type: _ACPI_DEVICE_STATE]
[+0x08c] PreviousState : Stopped (0) [Type: _ACPI_DEVICE_STATE]
[+0x090] PowerInfo [Type: _ACPI_POWER_INFO]
[+0x10c] DeviceID : 0x899bfe88 : 0x41 [Type: unsigned char *] 完成赋值!!!

1: kd> ?0x899c07b8+10c
Evaluate expression: -1986262844 = 899c08c4
1: kd> db 0x899bfe88
899bfe88 41 43 50 49 5c 50 4e 50-30 32 30 30 00 50 9c 89 ACPI\PNP0200.P..

参考:
DevNode 0x89d02b68 for PDO 0x89d393a8
InstancePath is "ACPI\PNP0200\4&5289e18&0"
State = DeviceNodeInitialized (0x302)
Previous State = DeviceNodeUninitialized (0x301)
参考结束:


Device (DMAC)
{
Name (_HID, EisaId ("PNP0200")) // _HID: Hardware ID


硬件ID: ACPI\PNP0200

设备类别: 4d36e97d-e325-11ce-bfc1-08002be10318

设备名称: Direct memory access controller


[ 系统设备 / Motherboard resources ]

驱动程序:
驱动程序描述 Motherboard resources
驱动程序日期 2001-7-1
驱动程序版本 5.1.2600.5512
驱动程序供应商 Microsoft
INF 文件 machine.inf
硬件 ID ACPI\PNP0C02
PnP 设备 Motherboard Resources

设备资源:
内存 70000000-7FFFFFFF

[ 系统设备 / Motherboard resources ]

驱动程序:
驱动程序描述 Motherboard resources
驱动程序日期 2001-7-1
驱动程序版本 5.1.2600.5512
驱动程序供应商 Microsoft
INF 文件 machine.inf
硬件 ID ACPI\PNP0C02
PnP 设备 Motherboard Resources

设备资源:
内存 FEC00000-FEC00FFF
内存 FEE00000-FEE00FFF
端口 0060-0060
端口 0064-0064

[ 系统设备 / Motherboard resources ]

驱动程序:
驱动程序描述 Motherboard resources
驱动程序日期 2001-7-1
驱动程序版本 5.1.2600.5512
驱动程序供应商 Microsoft
INF 文件 machine.inf
硬件 ID ACPI\PNP0C02
PnP 设备 Motherboard Resources

设备资源:
内存 FEC10000-FEC1001F
内存 FFB80000-FFBFFFFF
端口 0010-001F
端口 0022-003F
端口 0060-0060
端口 0062-0063
端口 0064-0064
端口 0065-006F
端口 0072-007F
端口 0080-0080
端口 0084-0086
端口 0088-0088
端口 008C-008E
端口 0090-009F
端口 00A2-00BF
端口 00B1-00B1
端口 00E0-00EF
端口 040B-040B
端口 04D0-04D1
端口 04D6-04D6
端口 0800-089F
端口 0900-090F
端口 0910-091F
端口 0B00-0B0F
端口 0B20-0B3F
端口 0C00-0C01
端口 0C14-0C14
端口 0C50-0C51
端口 0C52-0C52
端口 0C6C-0C6C
端口 0C6F-0C6F
端口 0CD0-0CD1
端口 0CD2-0CD3
端口 0CD4-0CD5
端口 0CD6-0CD7
端口 0CD8-0CDF
端口 FE00-FEFE

[ 系统设备 / Motherboard resources ]

驱动程序:
驱动程序描述 Motherboard resources
驱动程序日期 2001-7-1
驱动程序版本 5.1.2600.5512
驱动程序供应商 Microsoft
INF 文件 machine.inf
硬件 ID ACPI\PNP0C02
PnP 设备 Motherboard Resources

设备资源:
内存 E0000000-EFFFFFFF

[ 系统设备 / Motherboard resources ]

驱动程序:
驱动程序描述 Motherboard resources
驱动程序日期 2001-7-1
驱动程序版本 5.1.2600.5512
驱动程序供应商 Microsoft
INF 文件 machine.inf
硬件 ID ACPI\PNP0C02
PnP 设备 Motherboard Resources

设备资源:
端口 0A00-0A0F
端口 0A10-0A1F

Device (ISA)
{
Name (_ADR, 0x00070000) // _ADR: Address
Device (MBRD)
{
Name (_HID, EisaId ("PNP0C02")) // _HID: Hardware ID
Name (_UID, 0x1F) // _UID: Unique ID
Name (RSRC, ResourceTemplate ()
{
IO (Decode16,
0x0010, // Range Minimum
0x0010, // Range Maximum
0x01, // Alignment
0x10, // Length
)
IO (Decode16,
0x0024, // Range Minimum
0x0024, // Range Maximum
0x01, // Alignment
0x02, // Length
)
IO (Decode16,
0x0028, // Range Minimum
0x0028, // Range Maximum
0x01, // Alignment
0x02, // Length
)
IO (Decode16,
0x002C, // Range Minimum
0x002C, // Range Maximum
0x01, // Alignment
0x02, // Length
)
IO (Decode16,
0x002E, // Range Minimum
0x002E, // Range Maximum
0x01, // Alignment
0x02, // Length
)
IO (Decode16,
0x0030, // Range Minimum
0x0030, // Range Maximum
0x01, // Alignment
0x02, // Length
)
IO (Decode16,
0x0034, // Range Minimum
0x0034, // Range Maximum
0x01, // Alignment
0x02, // Length
)
IO (Decode16,
0x0038, // Range Minimum
0x0038, // Range Maximum
0x01, // Alignment
0x02, // Length
)
IO (Decode16,
0x003C, // Range Minimum
0x003C, // Range Maximum
0x01, // Alignment
0x02, // Length
)
IO (Decode16,
0x0050, // Range Minimum
0x0050, // Range Maximum
0x01, // Alignment
0x04, // Length
)
IO (Decode16,
0x0072, // Range Minimum
0x0072, // Range Maximum
0x01, // Alignment
0x06, // Length
)
IO (Decode16,
0x0080, // Range Minimum
0x0080, // Range Maximum
0x01, // Alignment
0x01, // Length
)
IO (Decode16,
0x0090, // Range Minimum
0x0090, // Range Maximum
0x01, // Alignment
0x10, // Length
)
IO (Decode16,
0x00A4, // Range Minimum
0x00A4, // Range Maximum
0x01, // Alignment
0x02, // Length
)
IO (Decode16,
0x00A8, // Range Minimum
0x00A8, // Range Maximum
0x01, // Alignment
0x02, // Length
)
IO (Decode16,
0x00AC, // Range Minimum
0x00AC, // Range Maximum
0x01, // Alignment
0x02, // Length
)
IO (Decode16,
0x00B0, // Range Minimum
0x00B0, // Range Maximum
0x01, // Alignment
0x06, // Length
)
IO (Decode16,
0x00B8, // Range Minimum
0x00B8, // Range Maximum
0x01, // Alignment
0x02, // Length
)
IO (Decode16,
0x00BC, // Range Minimum
0x00BC, // Range Maximum
0x01, // Alignment
0x02, // Length
)
IO (Decode16,
0x0100, // Range Minimum
0x0100, // Range Maximum
0x01, // Alignment
0x40, // Length
_Y0E)
IO (Decode16,
0x0140, // Range Minimum
0x0140, // Range Maximum
0x01, // Alignment
0x10, // Length
_Y0F)
IO (Decode16,
0x0CF0, // Range Minimum
0x0CF0, // Range Maximum
0x01, // Alignment
0x02, // Length
)
})

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/29 14:03:27

学生宿舍管理|基于springboot 学生宿舍管理系统(源码+数据库+文档)

学生宿舍管理 目录 基于springboot vue学生宿舍管理系统 一、前言 二、系统功能演示 ​三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 基于springboot vue学生宿舍管理系统 一、前言 博主介绍&am…

作者头像 李华
网站建设 2026/6/6 14:32:15

9款AI写论文哪个好?宏智树AI凭「真文献+实图表」实测封神!

“AI 写的文献查无此篇”“生成图表无法复用”“数据来源含糊其辞”—— 毕业季来临&#xff0c;AI 写论文工具成为刚需&#xff0c;但多数工具暗藏 “学术雷区”。作为专注论文写作科普的教育测评博主&#xff0c;我耗时 3 周&#xff0c;以《乡村振兴背景下农村电商消费者行为…

作者头像 李华
网站建设 2026/6/7 7:48:14

收藏这篇!一文掌握云雀智能体:从原理到实践构建专业级AI助手

腾讯PCG团队开源的云雀智能体是一套自主通用智能体系统&#xff0c;区别于传统聊天机器人&#xff0c;它专注于深度研究、事实核查等复杂场景。该系统具备搜索、阅读、任务拆解、结构化记忆、失败自纠等能力&#xff0c;运行过程可追踪、可复盘。通过六大场景测试&#xff0c;展…

作者头像 李华
网站建设 2026/6/9 16:19:47

WDW-GD系列微机控制高低温电子万能试验机

WDW-GD系列微机控制高低温电子万能试验机一、用途&#xff1a;WDW-GD系列微机控制高低温电子万能试验机适用于工业产品的高低温&#xff08;可调&#xff09;的可靠性试验&#xff0c;可以根据使用环境要求与试验机主机任意组合使用&#xff0c;可以完成各种金属、非金属、结构…

作者头像 李华
网站建设 2026/6/9 22:47:29

适合做3D设计(SolidWorks、UG、CATIA)的设计云桌面

随着工业设计软件对硬件性能要求的不断提升&#xff0c;设计师们正面临着一个关键挑战&#xff1a;如何在保证流畅操作体验的同时&#xff0c;实现跨地域协作与数据安全&#xff1f;智能共享云桌面技术为这一难题提供了创新解决方案&#xff0c;特别是在SolidWorks、UG&#xf…

作者头像 李华