news 2026/3/18 22:36:54

ACPI!AcpiInitIrqArbiter函数分析检测PCI设备类型是否是PCI_CARDBUS_BRIDGE_TYPE

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ACPI!AcpiInitIrqArbiter函数分析检测PCI设备类型是否是PCI_CARDBUS_BRIDGE_TYPE

ACPI!AcpiInitIrqArbiter函数分析检测PCI设备类型是否是PCI_CARDBUS_BRIDGE_TYPE

第一部分:


if (PCI_CONFIGURATION_TYPE(pciData) == PCI_CARDBUS_BRIDGE_TYPE) {
AcpiArbCardbusPresent = TRUE;
}

//
// Bit encodings for PCI_COMMON_CONFIG.HeaderType
//

#define PCI_MULTIFUNCTION 0x80
#define PCI_DEVICE_TYPE 0x00
#define PCI_BRIDGE_TYPE 0x01
#define PCI_CARDBUS_BRIDGE_TYPE 0x02

#define PCI_CONFIGURATION_TYPE(PciData) \
(((PPCI_COMMON_CONFIG)(PciData))->HeaderType & ~PCI_MULTIFUNCTION)

第二部分:


0: kd> kc
#
00 hal!HaliPciInterfaceReadConfig
01 ACPI!AcpiInitIrqArbiter
02 ACPI!ACPIInitStartACPI
03 ACPI!ACPIRootIrpStartDevice
04 ACPI!ACPIDispatchIrp
05 nt!IofCallDriver
06 nt!IopSynchronousCall
07 nt!IopStartDevice
08 nt!PipProcessStartPhase1
09 nt!PipProcessDevNodeTree
0a nt!PipDeviceActionWorker
0b nt!PipRequestDeviceAction
0c nt!IopInitializeBootDrivers
0d nt!IoInitSystem
0e nt!Phase1Initialization
0f nt!PspSystemThreadStartup
10 nt!KiThreadStartup
0: kd> dv
Context = 0x00000000
BusOffset = 0x00 ''
Slot = 0x36
Buffer = 0xf789a204
Offset = 0
Length = 0x40
busHand = struct _BUS_HANDLER


1: kd> g
Breakpoint 92 hit
eax=00000040 ebx=00000016 ecx=00000000 edx=00000cf8 esi=00000001 edi=00000000
eip=f744760d esp=f789a1c4 ebp=f789a248 iopl=0 nv up ei ng nz ac po cy
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000293
ACPI!AcpiInitIrqArbiter+0x297:
f744760d 66817dbcffff cmp word ptr [ebp-44h],0FFFFh ss:0010:f789a204=15ad
0: kd> dv
RootFdo = 0x0b000009
context = struct AMLISUPP_CONTEXT_PASSIVE
buffer = unsigned char [64] "???"
adjVector = 0xb000009
driverKeyHandle = 0x00000000
deviceNum = 0x16
lastBus = 0x0b ''
driverKey = ""
currentBus = 0x00 ''
pciSlot = struct _PCI_SLOT_NUMBER
regValue = 0x00000000
foundBootConfig = 0x01 ''
noBootConfigAgreement = 0x01 ''
flags = 0x36 '6'


0: kd> dt PCI_COMMON_CONFIG 0xf789a204 -r
hal!PCI_COMMON_CONFIG
+0x000 VendorID : 0x15ad
+0x002 DeviceID : 0x7a0
+0x004 Command : 7
+0x006 Status : 0x10
+0x008 RevisionID : 0x1 ''
+0x009 ProgIf : 0 ''
+0x00a SubClass : 0x4 ''
+0x00b BaseClass : 0x6 ''
+0x00c CacheLineSize : 0x8 ''
+0x00d LatencyTimer : 0 ''
+0x00e HeaderType : 0x81 ''
+0x00f BIST : 0 ''
+0x010 u : __unnamed
+0x000 type0 : _PCI_HEADER_TYPE_0
+0x000 BaseAddresses : [6] 0
+0x018 CIS : 0
+0x01c SubVendorID : 0
+0x01e SubSystemID : 0
+0x020 ROMBaseAddress : 0
+0x024 CapabilitiesPtr : 0x40 '@'
+0x025 Reserved1 : [3] ""
+0x028 Reserved2 : 0
+0x02c InterruptLine : 0xff ''
+0x02d InterruptPin : 0 ''
+0x02e MinimumGrant : 0x4 ''
+0x02f MaximumLatency : 0 ''
+0x000 type1 : _PCI_HEADER_TYPE_1
+0x000 BaseAddresses : [2] 0
+0x008 PrimaryBus : 0 ''
+0x009 SecondaryBus : 0xc ''
+0x00a SubordinateBus : 0xc ''
+0x00b SecondaryLatency : 0 ''
+0x00c IOBase : 0x90 ''
+0x00d IOLimit : 0x90 ''
+0x00e SecondaryStatus : 0
+0x010 MemoryBase : 0xfcf0
+0x012 MemoryLimit : 0xfcf0
+0x014 PrefetchBase : 0xe751
+0x016 PrefetchLimit : 0xe751
+0x018 PrefetchBaseUpper32 : 0
+0x01c PrefetchLimitUpper32 : 0
+0x020 IOBaseUpper16 : 0
+0x022 IOLimitUpper16 : 0
+0x024 CapabilitiesPtr : 0x40 '@'
+0x025 Reserved1 : [3] ""
+0x028 ROMBaseAddress : 0
+0x02c InterruptLine : 0xff ''
+0x02d InterruptPin : 0 ''
+0x02e BridgeControl : 4

1: kd> g
Breakpoint 91 hit
eax=804fb6c4 ebx=00000016 ecx=00000000 edx=00000c0c esi=00000002 edi=00000000
eip=804f2824 esp=f789a1a8 ebp=f789a248 iopl=0 nv up ei pl nz na pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000206
hal!HaliPciInterfaceReadConfig:
804f2824 55 push ebp
0: kd> dv
Context = 0x00000000
BusOffset = 0x00 ''
Slot = 0x56
Buffer = 0xf789a204
Offset = 0
Length = 0x40
busHand = struct _BUS_HANDLER

0: kd> gu
Breakpoint 92 hit
eax=00000040 ebx=00000016 ecx=00000000 edx=00000cf8 esi=00000002 edi=00000000
eip=f744760d esp=f789a1c4 ebp=f789a248 iopl=0 nv up ei ng nz ac po cy
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000293
ACPI!AcpiInitIrqArbiter+0x297:
f744760d 66817dbcffff cmp word ptr [ebp-44h],0FFFFh ss:0010:f789a204=15ad
0: kd> dt PCI_COMMON_CONFIG 0xf789a204 -r
hal!PCI_COMMON_CONFIG
+0x000 VendorID : 0x15ad
+0x002 DeviceID : 0x7a0
+0x004 Command : 7
+0x006 Status : 0x10
+0x008 RevisionID : 0x1 ''
+0x009 ProgIf : 0 ''
+0x00a SubClass : 0x4 ''
+0x00b BaseClass : 0x6 ''
+0x00c CacheLineSize : 0x8 ''
+0x00d LatencyTimer : 0 ''
+0x00e HeaderType : 0x81 ''
+0x00f BIST : 0 ''
+0x010 u : __unnamed
+0x000 type0 : _PCI_HEADER_TYPE_0
+0x000 BaseAddresses : [6] 0
+0x018 CIS : 0
+0x01c SubVendorID : 0
+0x01e SubSystemID : 0
+0x020 ROMBaseAddress : 0
+0x024 CapabilitiesPtr : 0x40 '@'
+0x025 Reserved1 : [3] ""
+0x028 Reserved2 : 0
+0x02c InterruptLine : 0xff ''
+0x02d InterruptPin : 0 ''
+0x02e MinimumGrant : 0x4 ''
+0x02f MaximumLatency : 0 ''
+0x000 type1 : _PCI_HEADER_TYPE_1
+0x000 BaseAddresses : [2] 0
+0x008 PrimaryBus : 0 ''
+0x009 SecondaryBus : 0xd ''
+0x00a SubordinateBus : 0xd ''
+0x00b SecondaryLatency : 0 ''
+0x00c IOBase : 0xd0 ''
+0x00d IOLimit : 0xd0 ''
+0x00e SecondaryStatus : 0
+0x010 MemoryBase : 0xfcb0
+0x012 MemoryLimit : 0xfcb0
+0x014 PrefetchBase : 0xe711
+0x016 PrefetchLimit : 0xe711
+0x018 PrefetchBaseUpper32 : 0
+0x01c PrefetchLimitUpper32 : 0
+0x020 IOBaseUpper16 : 0
+0x022 IOLimitUpper16 : 0
+0x024 CapabilitiesPtr : 0x40 '@'
+0x025 Reserved1 : [3] ""
+0x028 ROMBaseAddress : 0
+0x02c InterruptLine : 0xff ''
+0x02d InterruptPin : 0 ''
+0x02e BridgeControl : 4

0: kd> g
Breakpoint 91 hit
eax=804fb6c4 ebx=00000016 ecx=00000000 edx=00000c0d esi=00000003 edi=00000000
eip=804f2824 esp=f789a1a8 ebp=f789a248 iopl=0 nv up ei pl nz na po nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000202
hal!HaliPciInterfaceReadConfig:
804f2824 55 push ebp
0: kd> dv
Context = 0x00000000
BusOffset = 0x00 ''
Slot = 0x76
Buffer = 0xf789a204
Offset = 0
Length = 0x40
busHand = struct _BUS_HANDLER
0: kd> g
Breakpoint 92 hit
eax=00000040 ebx=00000016 ecx=00000000 edx=00000cf8 esi=00000003 edi=00000000
eip=f744760d esp=f789a1c4 ebp=f789a248 iopl=0 nv up ei ng nz ac po cy
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000293
ACPI!AcpiInitIrqArbiter+0x297:
f744760d 66817dbcffff cmp word ptr [ebp-44h],0FFFFh ss:0010:f789a204=15ad
0: kd> dt PCI_COMMON_CONFIG 0xf789a204 -r
hal!PCI_COMMON_CONFIG
+0x000 VendorID : 0x15ad
+0x002 DeviceID : 0x7a0
+0x004 Command : 7
+0x006 Status : 0x10
+0x008 RevisionID : 0x1 ''
+0x009 ProgIf : 0 ''
+0x00a SubClass : 0x4 ''
+0x00b BaseClass : 0x6 ''
+0x00c CacheLineSize : 0x8 ''
+0x00d LatencyTimer : 0 ''
+0x00e HeaderType : 0x81 ''
+0x00f BIST : 0 ''
+0x010 u : __unnamed
+0x000 type0 : _PCI_HEADER_TYPE_0
+0x000 BaseAddresses : [6] 0
+0x018 CIS : 0
+0x01c SubVendorID : 0
+0x01e SubSystemID : 0
+0x020 ROMBaseAddress : 0
+0x024 CapabilitiesPtr : 0x40 '@'
+0x025 Reserved1 : [3] ""
+0x028 Reserved2 : 0
+0x02c InterruptLine : 0xff ''
+0x02d InterruptPin : 0 ''
+0x02e MinimumGrant : 0x4 ''
+0x02f MaximumLatency : 0 ''
+0x000 type1 : _PCI_HEADER_TYPE_1
+0x000 BaseAddresses : [2] 0
+0x008 PrimaryBus : 0 ''
+0x009 SecondaryBus : 0xe ''
+0x00a SubordinateBus : 0xe ''
+0x00b SecondaryLatency : 0 ''
+0x00c IOBase : 0xf0 ''
+0x00d IOLimit : 0 ''
+0x00e SecondaryStatus : 0
+0x010 MemoryBase : 0xfc70
+0x012 MemoryLimit : 0xfc70
+0x014 PrefetchBase : 0xe6d1
+0x016 PrefetchLimit : 0xe6d1
+0x018 PrefetchBaseUpper32 : 0
+0x01c PrefetchLimitUpper32 : 0
+0x020 IOBaseUpper16 : 0
+0x022 IOLimitUpper16 : 0
+0x024 CapabilitiesPtr : 0x40 '@'
+0x025 Reserved1 : [3] ""
+0x028 ROMBaseAddress : 0
+0x02c InterruptLine : 0xff ''
+0x02d InterruptPin : 0 ''
+0x02e BridgeControl : 4

} else {

//
// This is a bridge. Update lastBus with the Subordinate
// bus if it is higher.
//

lastBus = lastBus > pciData->u.type1.SubordinateBus ?
lastBus : pciData->u.type1.SubordinateBus;

if (PCI_CONFIGURATION_TYPE(pciData) == PCI_CARDBUS_BRIDGE_TYPE) {
AcpiArbCardbusPresent = TRUE;
}


//
// Bit encodings for PCI_COMMON_CONFIG.HeaderType
//

#define PCI_MULTIFUNCTION 0x80
#define PCI_DEVICE_TYPE 0x00
#define PCI_BRIDGE_TYPE 0x01
#define PCI_CARDBUS_BRIDGE_TYPE 0x02

#define PCI_CONFIGURATION_TYPE(PciData) \
(((PPCI_COMMON_CONFIG)(PciData))->HeaderType & ~PCI_MULTIFUNCTION)


for (deviceNum = 0; deviceNum < PCI_MAX_DEVICES; deviceNum++) {
for (funcNum = 0; funcNum < PCI_MAX_FUNCTION;funcNum++) {


0: kd> p
eax=00000001 ebx=00000016 ecx=0000000d edx=00000c0eesi=00000003edi=00000000
eip=f7447764 esp=f789a1c4 ebp=f789a248 iopl=0 nv up ei ng nz na po nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000282
ACPI!AcpiInitIrqArbiter+0x3ee:
f7447764 46inc esi
0: kd> p
eax=00000001 ebx=00000016 ecx=0000000d edx=00000c0eesi=00000004edi=00000000
eip=f7447765 esp=f789a1c4 ebp=f789a248 iopl=0 nv up ei pl nz na po nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000202
ACPI!AcpiInitIrqArbiter+0x3ef:
f7447765 83fe08 cmp esi,8


0: kd> g
Breakpoint 91 hit
eax=804fb6c4 ebx=00000016 ecx=00000000 edx=00000c0e esi=00000004 edi=00000000
eip=804f2824 esp=f789a1a8 ebp=f789a248 iopl=0 nv up ei pl nz na pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000206
hal!HaliPciInterfaceReadConfig:
804f2824 55 push ebp
0: kd> dv
Context = 0x00000000
BusOffset = 0x00 ''
Slot = 0x96
Buffer = 0xf789a204
Offset = 0
Length = 0x40
busHand = struct _BUS_HANDLER


10010110 0x16 160004

现在:

funcNum=4

deviceNum=6

下一个1:

funcNum=5

deviceNum=6

101 10110=0xb6

下一个2:

funcNum=6

deviceNum=6

110 10110=0xd6

下一个3:

funcNum=7

deviceNum=6

111 10110=0xf6

0: kd> dt PCI_SLOT_NUMBER -r
hal!PCI_SLOT_NUMBER
+0x000 u : __unnamed
+0x000 bits : __unnamed
+0x000 DeviceNumber : Pos 0, 5 Bits
+0x000 FunctionNumber : Pos 5, 3 Bits
+0x000 Reserved : Pos 8, 24 Bits
+0x000 AsULONG : Uint4B


0: kd> g
Breakpoint 92 hit
eax=00000040 ebx=00000016 ecx=00000000 edx=00000cf8 esi=00000004 edi=00000000
eip=f744760d esp=f789a1c4 ebp=f789a248 iopl=0 nv up ei ng nz ac po cy
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000293
ACPI!AcpiInitIrqArbiter+0x297:
f744760d 66817dbcffff cmp word ptr [ebp-44h],0FFFFh ss:0010:f789a204=15ad
0: kd> dt PCI_COMMON_CONFIG 0xf789a204 -r
hal!PCI_COMMON_CONFIG
+0x000 VendorID : 0x15ad
+0x002 DeviceID : 0x7a0
+0x004 Command : 7
+0x006 Status : 0x10
+0x008 RevisionID : 0x1 ''
+0x009 ProgIf : 0 ''
+0x00a SubClass : 0x4 ''
+0x00b BaseClass : 0x6 ''
+0x00c CacheLineSize : 0x8 ''
+0x00d LatencyTimer : 0 ''
+0x00e HeaderType : 0x81 ''
+0x00f BIST : 0 ''
+0x010 u : __unnamed
+0x000 type0 : _PCI_HEADER_TYPE_0
+0x000 BaseAddresses : [6] 0
+0x018 CIS : 0
+0x01c SubVendorID : 0
+0x01e SubSystemID : 0
+0x020 ROMBaseAddress : 0
+0x024 CapabilitiesPtr : 0x40 '@'
+0x025 Reserved1 : [3] ""
+0x028 Reserved2 : 0
+0x02c InterruptLine : 0xff ''
+0x02d InterruptPin : 0 ''
+0x02e MinimumGrant : 0x4 ''
+0x02f MaximumLatency : 0 ''
+0x000 type1 : _PCI_HEADER_TYPE_1
+0x000 BaseAddresses : [2] 0
+0x008 PrimaryBus : 0 ''
+0x009 SecondaryBus : 0xf ''
+0x00a SubordinateBus : 0xf ''
+0x00b SecondaryLatency : 0 ''
+0x00c IOBase : 0xf0 ''
+0x00d IOLimit : 0 ''
+0x00e SecondaryStatus : 0
+0x010 MemoryBase : 0xfc30
+0x012 MemoryLimit : 0xfc30
+0x014 PrefetchBase : 0xe691
+0x016 PrefetchLimit : 0xe691
+0x018 PrefetchBaseUpper32 : 0
+0x01c PrefetchLimitUpper32 : 0
+0x020 IOBaseUpper16 : 0
+0x022 IOLimitUpper16 : 0
+0x024 CapabilitiesPtr : 0x40 '@'
+0x025 Reserved1 : [3] ""
+0x028 ROMBaseAddress : 0
+0x02c InterruptLine : 0xff ''
+0x02d InterruptPin : 0 ''
+0x02e BridgeControl : 4

第四部分:

0: kd> g
Breakpoint 91 hit
eax=804fb6c4 ebx=00000016 ecx=00000000 edx=00000c0f esi=00000005 edi=00000000
eip=804f2824 esp=f789a1a8 ebp=f789a248 iopl=0 nv up ei pl nz na po nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000202
hal!HaliPciInterfaceReadConfig:
804f2824 55 push ebp
0: kd> dv
Context = 0x00000000
BusOffset = 0x00 ''
Slot = 0xb6
Buffer = 0xf789a204
Offset = 0
Length = 0x40
busHand = struct _BUS_HANDLER

91 e Disable Clear 804f2824 0001 (0001) hal!HaliPciInterfaceReadConfig
92 e Disable Clear f744760d 0001 (0001) ACPI!AcpiInitIrqArbiter+0x297
93 e Disable Clear f744774a 0001 (0001) ACPI!AcpiInitIrqArbiter+0x3d4

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

腾讯混元翻译大模型实测:Hunyuan-MT 7B解决韩俄语偏移问题

腾讯混元翻译大模型实测&#xff1a;Hunyuan-MT 7B解决韩俄语偏移问题 你有没有遇到过这样的情况&#xff1a;用主流翻译工具把一段韩文技术文档翻成中文&#xff0c;结果关键术语全错了&#xff0c;句子结构支离破碎&#xff1b;或者把俄语合同条款转译后&#xff0c;数字单位…

作者头像 李华
网站建设 2026/3/15 8:08:21

零配置部署!Hunyuan-MT-7B-WEBUI让多语言支持更简单

零配置部署&#xff01;Hunyuan-MT-7B-WEBUI让多语言支持更简单 你是否曾为一款优秀的开源工具无法看懂而放弃使用&#xff1f;是否在给团队交付产品时&#xff0c;被“中文化”“藏语化”“维吾尔语化”的需求卡在最后一公里&#xff1f;是否试过调用翻译API却因配环境、写接…

作者头像 李华
网站建设 2026/3/15 10:10:13

StructBERT实战教程:手把手教你构建法律文书智能分类系统

StructBERT实战教程&#xff1a;手把手教你构建法律文书智能分类系统 1. 为什么不用训练就能分类&#xff1f;从零开始理解法律文书的“语义直觉” 你有没有遇到过这样的场景&#xff1a;法院立案庭每天收到上百份起诉书&#xff0c;律所实习生要花半天时间给新收的合同归档&…

作者头像 李华
网站建设 2026/3/17 3:22:29

无需代码!用Ollama玩转ChatGLM3-6B-128K:长文本处理神器

无需代码&#xff01;用Ollama玩转ChatGLM3-6B-128K&#xff1a;长文本处理神器 你是否遇到过这样的困扰&#xff1a; 一份50页的PDF技术文档&#xff0c;想快速提取关键结论却要逐页翻找&#xff1f;客户发来上万字的需求说明书&#xff0c;人工梳理要点耗时又容易遗漏&…

作者头像 李华
网站建设 2026/3/16 8:45:21

gpt-oss-20b-WEBUI功能测评:OpenAI开源模型表现如何

gpt-oss-20b-WEBUI功能测评&#xff1a;OpenAI开源模型表现如何 1. 这不是另一个“跑通就行”的测评&#xff0c;而是真实用起来的感受 你有没有试过在本地部署一个号称“OpenAI开源”的大模型&#xff0c;结果点开网页界面后——卡顿、响应慢、生成内容空洞、连基本的多轮对…

作者头像 李华