news 2026/5/1 4:06:56

hal!HalGetBusDataByOffset函数分析之hal!HalpReadPCIConfig中hal!HalpPCIReadUlongType1函数的IO访问--特别重要

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
hal!HalGetBusDataByOffset函数分析之hal!HalpReadPCIConfig中hal!HalpPCIReadUlongType1函数的IO访问--特别重要

hal!HalGetBusDataByOffset函数分析之hal!HalpReadPCIConfig中hal!HalpPCIReadUlongType1函数的IO访问--特别重要

1: kd> dt GET_ADDRESS_CONTEXT 895901f8
ACPI!GET_ADDRESS_CONTEXT
   +0x000 PciObject        : 0x8996e010 _NSObj
   +0x004 Bus              : 0x89986fc0  "???"
   +0x008 Slot             : 0x89986fbc _PCI_SLOT_NUMBER
   +0x00c ParentBus        : 0 ''
   +0x010 ParentSlot       : _PCI_SLOT_NUMBER
   +0x014 Flags            : 0x128
   +0x018 Address          : 0x30000
   +0x01c BaseBusNumber    : 0
   +0x020 RunCompletion    : 0n2
   +0x024 CompletionRoutine : 0xf740d62c     void  ACPI!PciConfigSpaceHandlerWorker+0
   +0x028 CompletionContext : 0x89986f88 Void
1: kd> dx -id 0,0,899a2278 -r1 (*((ACPI!_PCI_SLOT_NUMBER *)0x89590208))
(*((ACPI!_PCI_SLOT_NUMBER *)0x89590208))                 [Type: _PCI_SLOT_NUMBER]
    [+0x000] u                [Type: __unnamed]
1: kd> dt _PCI_SLOT_NUMBER 0x89590208
hal!_PCI_SLOT_NUMBER
   +0x000 u                : __unnamed
1: kd> dt _PCI_SLOT_NUMBER 0x89590208 -r
hal!_PCI_SLOT_NUMBER
   +0x000 u                : __unnamed
      +0x000 bits             : __unnamed
         +0x000 DeviceNumber     : 0y10001 (0x11)
         +0x000 FunctionNumber   : 0y000
         +0x000 Reserved         : 0y000000000000000000000000 (0)
      +0x000 AsULONG          : 0x11
1: kd> dt _PCI_SLOT_NUMBER 0x89986fbc -r
hal!_PCI_SLOT_NUMBER
   +0x000 u                : __unnamed
      +0x000 bits             : __unnamed
         +0x000 DeviceNumber     : 0y00011 (0x3)
         +0x000 FunctionNumber   : 0y000
         +0x000 Reserved         : 0y000000000000000000000000 (0)
      +0x000 AsULONG          : 3


0010 0001 1000 0000 0000

0100 0000    40


1: kd> kc
 #
00 ACPI!PciConfigSpaceHandlerWorker
01 ACPI!GetPciAddressWorker
02 ACPI!GetPciAddressWorker
03 ACPI!ACPIGetWorkerForInteger
04 ACPI!AsyncCallBack
05 ACPI!RunContext
06 ACPI!DispatchCtxtQueue
07 ACPI!StartTimeSlicePassive
08 ACPI!ACPIWorker
09 nt!PspSystemThreadStartup
0a nt!KiThreadStartup
1: kd> dv
               AcpiObject = 0x899b00ac
         CompletionStatus = 0n0
                   Result = 0x00000000
                  Context = 0x89986f88


1: kd> dt PCI_CONFIG_STATE 0x89986f88
ACPI!PCI_CONFIG_STATE
   +0x000 AccessType       : 0
   +0x004 OpRegion         : 0x89986fc4 _NSObj
   +0x008 Address          : 0
   +0x00c Size             : 0x40
   +0x010 Data             : 0x899c5240  -> 0
   +0x014 Context          : 0
   +0x018 CompletionHandler : 0xf740dab2 Void
   +0x01c CompletionContext : 0x899c5218 Void
   +0x020 PciObj           : 0x8996e010 _NSObj
   +0x024 ParentObj        : (null)
   +0x028 CompletionHandlerType : 1
   +0x02c Flags            : 0x100
   +0x030 RunCompletion    : 0n0
   +0x034 Slot             : _PCI_SLOT_NUMBER
   +0x038 Bus              : 0x2 ''
   +0x039 IsPciDeviceResult : 0 ''
1: kd> dx -id 0,0,899a2278 -r1 ((ACPI!_NSObj *)0x89986fc4)
((ACPI!_NSObj *)0x89986fc4)                 : 0x89986fc4 [Type: _NSObj *]
    [+0x000] list             [Type: _List]
    [+0x008] pnsParent        : 0x0 [Type: _NSObj *]
    [+0x00c] pnsFirstChild    : 0x0 [Type: _NSObj *]
    [+0x010] dwNameSeg        : 0x0 [Type: unsigned long]
    [+0x014] hOwner           : 0x0 [Type: void *]
    [+0x018] pnsOwnedNext     : 0x0 [Type: _NSObj *]
    [+0x01c] ObjData          [Type: _ObjData]
    [+0x030] Context          : 0x8996e010 [Type: void *]
    [+0x034] dwRefCount       : 0x0 [Type: unsigned long]
1: kd> dx -id 0,0,899a2278 -r1 ((ACPI!_NSObj *)0x8996e010)
((ACPI!_NSObj *)0x8996e010)                 : 0x8996e010 [Type: _NSObj *]
    [+0x000] list             [Type: _List]
    [+0x008] pnsParent        : 0x8996cd78 [Type: _NSObj *]
    [+0x00c] pnsFirstChild    : 0x8996e054 [Type: _NSObj *]
    [+0x010] dwNameSeg        : 0x30463453 [Type: unsigned long]
    [+0x014] hOwner           : 0x899af330 [Type: void *]
    [+0x018] pnsOwnedNext     : 0x8996dfcc [Type: _NSObj *]
    [+0x01c] ObjData          [Type: _ObjData]
    [+0x030] Context          : 0x89968688 [Type: void *]
    [+0x034] dwRefCount       : 0x0 [Type: unsigned long]
1: kd> dt acpi!_DEVICE_EXTENSION 0x89968688
   +0x000 Flags            : 0x00401000`00010008
   +0x000 UFlags           : __unnamed
   +0x008 Signature        : 0x5f534750
   +0x00c DebugFlags       : 0
   +0x010 DispatchTable    : (null)
   +0x014 WorkContext      : WORK_QUEUE_CONTEXT
   +0x014 Fdo              : _FDO_DEVICE_EXTENSION
   +0x014 Filter           : _FILTER_DEVICE_EXTENSION
   +0x014 Pdo              : _PDO_DEVICE_EXTENSION
   +0x058 WorkQueue        : EXTENSION_WORKER
   +0x058 Button           : BUTTON_EXTENSION
   +0x058 Thermal          : THERMAL_EXTENSION
   +0x058 LinkNode         : LINK_NODE_EXTENSION
   +0x058 Dock             : DOCK_EXTENSION
   +0x058 Processor        : _PROCESSOR_DEVICE_EXTENSION
   +0x088 DeviceState      : 0 ( Stopped )
   +0x08c PreviousState    : 0 ( Stopped )
   +0x090 PowerInfo        : _ACPI_POWER_INFO
   +0x10c DeviceID         : 0x00030000  ""
   +0x10c Address          : 0x30000
   +0x110 InstanceID       : (null)
   +0x114 ResourceList     : (null)
   +0x118 PnpResourceList  : (null)
   +0x11c OutstandingIrpCount : 0n1
   +0x120 ReferenceCount   : 0n3
   +0x124 HibernatePathCount : 0n0
   +0x128 RemoveEvent      : (null)
   +0x12c AcpiObject       : 0x8996e010 _NSObj
   +0x130 DeviceObject     : (null)
   +0x134 TargetDeviceObject : (null)
   +0x138 PhysicalDeviceObject : (null)
   +0x13c ParentExtension  : 0x89968ea0 _DEVICE_EXTENSION
   +0x140 ChildDeviceList  : _LIST_ENTRY [ 0x899687c8 - 0x899687c8 ]
   +0x148 SiblingDeviceList : _LIST_ENTRY [ 0x899685d0 - 0x899689d0 ]
   +0x150 EjectDeviceHead  : _LIST_ENTRY [ 0x899687d8 - 0x899687d8 ]
   +0x158 EjectDeviceList  : _LIST_ENTRY [ 0x899687e0 - 0x899687e0 ]
1: kd> dx -id 0,0,899a2278 -r1 (*((ACPI!_FILTER_DEVICE_EXTENSION *)0x8996869c))
(*((ACPI!_FILTER_DEVICE_EXTENSION *)0x8996869c))                 [Type: _FILTER_DEVICE_EXTENSION]
    [+0x000] WorkContext      [Type: WORK_QUEUE_CONTEXT]
    [+0x018] Interface        : 0x0 [Type: _BUS_INTERFACE_STANDARD *]

    interface = pciDeviceFilter->Filter.Interface;    =0

#define PCISUPP_GOT_SLOT_INFO             0x100

1: kd> dt PCI_CONFIG_STATE 0x89986f88
ACPI!PCI_CONFIG_STATE
   +0x000 AccessType       : 0
   +0x004 OpRegion         : 0x89986fc4 _NSObj
   +0x008 Address          : 0
   +0x00c Size             : 0x40
   +0x010 Data             : 0x899c5240  -> 0
   +0x014 Context          : 0
   +0x018 CompletionHandler : 0xf740dab2 Void
   +0x01c CompletionContext : 0x899c5218 Void
   +0x020 PciObj           : 0x8996e010 _NSObj
   +0x024 ParentObj        : (null)
   +0x028 CompletionHandlerType : 1
   +0x02c Flags            : 0x100


    if (!interface) {

        if (!(state->Flags & PCISUPP_GOT_SLOT_INFO)) {    不符合条件。

            state->Flags |= PCISUPP_GOT_SLOT_INFO;


#define RSACCESS_READ                   0
#define RSACCESS_WRITE                  1


        } else {

            //
            // Do config space op through HAL
            //

            bytes = HalGetBusDataByOffset(PCIConfiguration,
                                          state->Bus,
                                          state->Slot.u.AsULONG,
                                          state->Data,
                                          state->Address,
                                          state->Size);

        }

第二部分:


1: kd> t
Breakpoint 6 hit
eax=00000002 ebx=89986f88 ecx=00000100 edx=89986fc4 esi=00000000 edi=00000000
eip=804f25ee esp=f791ab74 ebp=f791abe0 iopl=0         nv up ei pl zr na pe nc
cs=0008  ss=0010  ds=0023  es=0023  fs=0030  gs=0000             efl=00000246
hal!HalGetBusDataByOffset:
804f25ee 55              push    ebp
1: kd> kc
 #
00 hal!HalGetBusDataByOffset
01 ACPI!PciConfigSpaceHandlerWorker

02 ACPI!GetPciAddressWorker
03 ACPI!GetPciAddressWorker
04 ACPI!ACPIGetWorkerForInteger
05 ACPI!AsyncCallBack
06 ACPI!RunContext
07 ACPI!DispatchCtxtQueue
08 ACPI!StartTimeSlicePassive
09 ACPI!ACPIWorker
0a nt!PspSystemThreadStartup
0b nt!KiThreadStartup
1: kd> dv
    BusDataType = PCIConfiguration (0n4)
      BusNumber = 2
     SlotNumber = 3
         Buffer = 0x899c5240
         Offset = 0
         Length = 0x40
            bus = struct _BUS_HANDLER


        RtlCopyMemory(&bus, &HalpFakePciBusHandler, sizeof(BUS_HANDLER));
        bus.BusNumber = BusNumber;    2
        slot.u.AsULONG = SlotNumber;
    
        length = HalpGetPCIData(&bus,
                                &bus,
                                slot,
                                Buffer,
                                Offset,
                                Length
                                );


1: kd> x hal!HalpFakePciBusHandler
804fb658          hal!HalpFakePciBusHandler = struct _BUS_HANDLER
1: kd> dx -r1 (*((halmacpi!_BUS_HANDLER *)0x804fb658))
(*((halmacpi!_BUS_HANDLER *)0x804fb658))                 [Type: _BUS_HANDLER]
    [+0x000] Version          : 0x1 [Type: unsigned long]
    [+0x004] InterfaceType    : PCIBus (5) [Type: _INTERFACE_TYPE]
    [+0x008] ConfigurationType : PCIConfiguration (4) [Type: _BUS_DATA_TYPE]
    [+0x00c] BusNumber        : 0x0 [Type: unsigned long]
    [+0x010] DeviceObject     : 0x0 [Type: _DEVICE_OBJECT *]
    [+0x014] ParentHandler    : 0x0 [Type: _BUS_HANDLER *]
    [+0x018] BusData          : 0x804fb5e0 [Type: void *]
    [+0x01c] DeviceControlExtensionSize : 0x0 [Type: unsigned long]
    [+0x020] BusAddresses     : 0x0 [Type: _SUPPORTED_RANGES *]
    [+0x024] Reserved         [Type: unsigned long [4]]
    [+0x034] GetBusData       : 0x804f18ec [Type: unsigned long (*)(_BUS_HANDLER *,_BUS_HANDLER *,unsigned long,void *,unsigned long,unsigned long)]
    [+0x038] SetBusData       : 0x804f1a24 [Type: unsigned long (*)(_BUS_HANDLER *,_BUS_HANDLER *,unsigned long,void *,unsigned long,unsigned long)]
    [+0x03c] AdjustResourceList : 0x0 [Type: long (*)(_BUS_HANDLER *,_BUS_HANDLER *,_IO_RESOURCE_REQUIREMENTS_LIST * *)]
    [+0x040] AssignSlo

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

PUBG压枪黑科技:5步搞定罗技鼠标精准射击

PUBG压枪黑科技:5步搞定罗技鼠标精准射击 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 还在为《绝地求生》中枪口乱跳而烦恼吗&…

作者头像 李华
网站建设 2026/4/16 20:20:36

小白也能懂:用Qwen3-4B快速搭建智能问答系统全攻略

小白也能懂:用Qwen3-4B快速搭建智能问答系统全攻略 1. 引言:为什么选择 Qwen3-4B-Instruct-2507? 在当前大模型技术飞速发展的背景下,越来越多开发者希望将强大的语言模型集成到自己的应用中。然而,动辄百亿参数的模…

作者头像 李华
网站建设 2026/4/27 3:10:59

AI视觉模型选型:GLM-4.6V-Flash-WEB实战分析

AI视觉模型选型:GLM-4.6V-Flash-WEB实战分析 💡 获取更多AI镜像 想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键…

作者头像 李华
网站建设 2026/4/28 2:29:20

AI人脸隐私卫士如何应对帽子/眼镜?配件干扰测试

AI人脸隐私卫士如何应对帽子/眼镜?配件干扰测试 1. 背景与挑战:当人脸戴上“伪装”——配件对自动打码的影响 在现实场景中,人们佩戴帽子、墨镜、口罩、围巾等配饰是常态。这些物品不仅改变了面部的视觉特征,还可能遮挡关键检测…

作者头像 李华
网站建设 2026/3/26 22:55:33

HunyuanVideo-Foley插件生态:未来可扩展功能设想与规划

HunyuanVideo-Foley插件生态:未来可扩展功能设想与规划 1. 引言:视频音效生成的智能化跃迁 1.1 行业背景与技术痛点 在影视、短视频、广告等多媒体内容创作中,音效设计是提升沉浸感和叙事张力的关键环节。传统音效制作依赖专业音频工程师手…

作者头像 李华
网站建设 2026/4/23 12:43:24

LaTeX公式转换完全指南:轻松实现网页公式到Word的完美迁移

LaTeX公式转换完全指南:轻松实现网页公式到Word的完美迁移 【免费下载链接】LaTeX2Word-Equation Copy LaTeX Equations as Word Equations, a Chrome Extension 项目地址: https://gitcode.com/gh_mirrors/la/LaTeX2Word-Equation 还在为学术写作中公式转换…

作者头像 李华