news 2026/4/1 17:43:02

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/3/23 9:53:54

本地运行更安全!AI人脸卫士离线部署入门必看

本地运行更安全!AI人脸卫士离线部署入门必看 💡 获取更多AI镜像 想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键…

作者头像 李华
网站建设 2026/3/30 17:56:30

Android UI 优化指南:流畅度与体验双提升

Android 应用的 UI 体验直接影响用户留存率,优化核心围绕 流畅度、响应速度、内存占用 三大维度,同时兼顾兼容性与视觉一致性。以下是一套通俗易懂、可落地的优化方案,适合开发和测试人员参考。一、 布局优化:减少层级&#xff0c…

作者头像 李华
网站建设 2026/3/24 11:42:28

数学公式自由转换:LaTeX到Word的无缝迁移方案

数学公式自由转换:LaTeX到Word的无缝迁移方案 【免费下载链接】LaTeX2Word-Equation Copy LaTeX Equations as Word Equations, a Chrome Extension 项目地址: https://gitcode.com/gh_mirrors/la/LaTeX2Word-Equation 还在为学术论文中的数学公式转换而头疼…

作者头像 李华
网站建设 2026/3/31 19:57:30

AI人脸隐私卫士在社区论坛中的用户头像自动审核应用

AI人脸隐私卫士在社区论坛中的用户头像自动审核应用 1. 引言:社区场景下的隐私保护新挑战 随着社交网络和社区论坛的普及,用户上传个人照片已成为日常交流的重要组成部分。然而,未经处理的原始图像中往往包含大量敏感的人脸信息&#xff0c…

作者头像 李华
网站建设 2026/3/27 18:13:45

AI人脸隐私卫士性能优化:提升打码效率的5个技巧

AI人脸隐私卫士性能优化:提升打码效率的5个技巧 1. 背景与挑战:智能打码中的效率瓶颈 随着数字影像在社交、办公、医疗等场景的广泛应用,图像中的人脸隐私保护已成为不可忽视的安全议题。传统的手动打码方式耗时耗力,难以应对批…

作者头像 李华
网站建设 2026/3/25 5:33:32

GLM-4.6V-Flash-WEB农业应用:作物病害图像识别案例

GLM-4.6V-Flash-WEB农业应用:作物病害图像识别案例 💡 获取更多AI镜像 想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支…

作者头像 李华