news 2026/4/23 19:24:35

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/4/23 14:47:08

BSHM镜像自动创建输出目录,操作太贴心

BSHM镜像自动创建输出目录&#xff0c;操作太贴心 你有没有遇到过这样的情况&#xff1a;运行一个抠图脚本&#xff0c;结果跑完发现图片没保存、找不到输出文件、手动建目录又怕路径写错&#xff1f; 这次用上BSHM人像抠图镜像&#xff0c;第一反应是——“这设计也太懂打工人…

作者头像 李华
网站建设 2026/4/23 13:00:53

阿里通义SenseVoice Small实战:多语言语音识别零基础教程

阿里通义SenseVoice Small实战&#xff1a;多语言语音识别零基础教程 1. 你不需要懂模型&#xff0c;也能用好语音转文字 你有没有过这些时刻&#xff1f; 会议录音堆在文件夹里没时间听&#xff0c;采访素材要花半天手动打字&#xff0c;学生交来的方言作业听不清又不敢乱猜…

作者头像 李华
网站建设 2026/4/23 16:04:02

造相-Z-Image开源镜像:免许可商用、无API调用限制的文生图新选择

造相-Z-Image开源镜像&#xff1a;免许可商用、无API调用限制的文生图新选择 1. 为什么你需要一个真正属于自己的文生图工具&#xff1f; 你是不是也遇到过这些问题&#xff1a; 想批量生成商品图&#xff0c;却被平台API调用量卡在每天50张&#xff1b;做设计提案需要反复修…

作者头像 李华
网站建设 2026/4/22 16:42:55

基于Python员工管理系统_s6e9n9cv

前言基于Python的员工管理系统是一个用于管理企业内部员工信息的桌面或Web应用程序&#xff0c;支持员工数据的增删改查&#xff08;CRUD&#xff09;、部门管理、考勤统计、薪资计算等功能。系统采用模块化设计&#xff0c;可扩展性强&#xff0c;适合中小型企业或作为学习项目…

作者头像 李华
网站建设 2026/4/23 3:42:42

小白必看!美胸-年美-造相Z-Turbo快速入门指南

小白必看&#xff01;美胸-年美-造相Z-Turbo快速入门指南 1. 这个模型到底能做什么 你可能刚看到“美胸-年美-造相Z-Turbo”这个名字&#xff0c;心里一愣&#xff1a;这名字怎么这么特别&#xff1f;别急&#xff0c;咱们先说人话——它不是一个医疗工具&#xff0c;也不是什…

作者头像 李华
网站建设 2026/4/23 16:15:18

通过属性配置行为:Qwen3Guard-Gen-WEB组件灵活易用

通过属性配置行为&#xff1a;Qwen3Guard-Gen-WEB组件灵活易用 在内容安全审核从“关键词匹配”迈向“语义理解”的今天&#xff0c;一个真正好用的审核能力&#xff0c;不该是需要写几十行胶水代码才能调通的黑盒服务&#xff0c;而应像 <input> 一样自然——你告诉它要…

作者头像 李华