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/27 19:49:07

HunyuanVideo-Foley失败案例复盘:哪些场景还不适合自动配声

HunyuanVideo-Foley失败案例复盘:哪些场景还不适合自动配声 1. 背景与技术定位 1.1 HunyuanVideo-Foley 是什么? HunyuanVideo-Foley 是腾讯混元于2025年8月28日宣布开源的一款端到端视频音效生成模型,标志着AI在影视后期自动化领域迈出了…

作者头像 李华
网站建设 2026/3/28 15:37:33

动态打码系统部署:应对大规模图片处理的策略

动态打码系统部署:应对大规模图片处理的策略 1. 引言:AI 人脸隐私卫士 - 智能自动打码 随着社交媒体、公共监控和数字档案管理的普及,图像中的人脸信息暴露风险日益加剧。尤其是在多人合照、会议记录或街景拍摄等场景下,未经脱敏…

作者头像 李华
网站建设 2026/3/21 2:19:02

动态打码技术实战:AI人脸隐私卫士高级应用教程

动态打码技术实战:AI人脸隐私卫士高级应用教程 1. 引言:为何需要智能动态打码? 随着社交媒体和数字影像的普及,个人隐私保护问题日益突出。在分享合照、会议记录或公共监控截图时,未经处理的人脸信息极易造成隐私泄露…

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

AI隐私卫士应用展示:前后效果对比视频

AI隐私卫士应用展示:前后效果对比视频 1. 引言:AI人脸隐私保护的现实需求 随着社交媒体和智能设备的普及,个人图像数据正以前所未有的速度被采集、存储和传播。一张看似普通的合照,可能无意中暴露了多位陌生人的面部信息——这正…

作者头像 李华
网站建设 2026/3/27 12:47:27

HunyuanVideo-Foley架构剖析:多模态对齐机制深度解读

HunyuanVideo-Foley架构剖析:多模态对齐机制深度解读 1. 技术背景与问题提出 随着短视频、影视制作和虚拟现实内容的爆发式增长,音效生成已成为提升视听体验的关键环节。传统音效添加依赖人工逐帧匹配,耗时耗力且难以保证声画同步精度。尽管…

作者头像 李华
网站建设 2026/3/16 16:53:41

HunyuanVideo-Foley CI/CD集成:自动化测试与发布流程搭建

HunyuanVideo-Foley CI/CD集成:自动化测试与发布流程搭建 随着AI生成内容(AIGC)技术的快速发展,音视频生成领域正迎来新一轮变革。HunyuanVideo-Foley作为腾讯混元于2025年8月28日开源的端到端视频音效生成模型,凭借其…

作者头像 李华