sdyxz123 2024-03-09 10:52 采纳率: 39%
浏览 5
已结题

WDF 的 APCI 设备定义相关

  1. 在KMDF 中有 提供表示ACPI 设备的现成数据结构吗?比如我想定义一个ACPI 的 按钮 设备,KMDF这个有类似的ACPI 设备数据结构体吗?还是需要我自己去定义?
  2. 在KMDF 枚举 ACPI 设备后调用 EvtDeviceAdd 中,我想获取ACPI 设备的 HID 和 UID 应该怎么获取呢,给出示例
  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-03-09 10:53
    关注

    引自免费微信小程序:皆我百晓生

    在Windows内核模式驱动程序框架(KMDF)中,没有直接提供用于表示ACPI设备的现成数据结构。对于ACPI设备的管理,Windows操作系统层提供了基础的ACPI接口和数据结构,而这些通常由WDM驱动开发者或者基于KMDF编写驱动的开发者间接使用。

    具体到ACPI按钮设备,在KMDF中定义这样的设备,你需要按照以下步骤操作:

    1. 首先,系统通过ACPI解析得到的硬件资源(如ACPI方法、通知对象等)会被操作系统转换并分配给相应的PDO(物理设备对象),这一过程由系统底层处理完成。

    2. 在编写KMDF驱动时,你并不直接创建或定义ACPI设备的数据结构,而是针对你的ACPI按钮设备创建一个功能设备对象(FDO或过滤设备对象FFDO),并通过WdfDeviceCreate等API来注册设备。

    3. 若要获取与ACPI相关的属性或事件(例如ACPI按钮按下产生的通知),你需要调用KMDF提供的接口去访问和处理这些ACPI资源。例如,可以通过调用WdfDeviceRetrieveAcpiObject函数获取设备关联的ACPI对象,并进一步调用ACPI相关的方法或其他接口。

    4. 若要响应ACPI按钮事件,可能需要注册设备通知回调函数,通过WdfDeviceInitSetNotificationCallback配置中断请求通知回调,然后在回调函数中处理按钮事件。

    示例代码并非针对ACPI按钮设备,但可以体现如何在KMDF中处理ACPI资源的思路:

    NTSTATUS
    DriverEntry(
        _In_ PDRIVER_OBJECT DriverObject,
        _In_ PUNICODE_STRING RegistryPath
    )
    {
        WDF_DRIVER_CONFIG config;
        NTSTATUS status;
    
        WDF_DRIVER_CONFIG_INIT(&config, EvtDeviceAdd);
    
        status = WdfDriverCreate(DriverObject,
                                RegistryPath,
                                WDF_NO_OBJECT_ATTRIBUTES,
                                &config,
                                WDF_NO_HANDLE);
        if (!NT_SUCCESS(status))
        {
            return status;
        }
    
        return STATUS_SUCCESS;
    }
    
    NTSTATUS
    EvtDeviceAdd(
        _In_ WDFDRIVER Driver,
        _Inout_ PWDFDEVICE_INIT DeviceInit
    )
    {
        WDF_PNPPOWER_EVENT_CALLBACKS pnpPowerCallbacks;
        WDF_OBJECT_ATTRIBUTES deviceAttributes;
        WDFDEVICE hDevice;
        NTSTATUS status;
    
        // Initialize PnP and power callbacks
        WDF_PNPPOWER_EVENT_CALLBACKS_INIT(&pnpPowerCallbacks);
        pnpPowerCallbacks.EvtDevicePrepareHardware = EvtDevicePrepareHardware;
        pnpPowerCallbacks.EvtDeviceD0Entry = EvtDeviceD0Entry;
        // 添加对ACPI资源的处理回调,例如EvtDeviceResourcesQuery等
    
        WdfDeviceInitSetPnpPowerEventCallbacks(DeviceInit, &pnpPowerCallbacks);
    
        WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&deviceAttributes, DEVICE_CONTEXT);
    
        status = WdfDeviceCreate(&DeviceInit, &deviceAttributes, &hDevice);
        if (!NT_SUCCESS(status))
        {
            return status;
        }
    
        // 在EvtDevicePrepareHardware或EvtDeviceD0Entry等函数中处理ACPI资源
        // ...
    
        return status;
    }
    
    // 在适当的回调函数中处理ACPI对象及事件
    NTSTATUS
    EvtDevicePrepareHardware(
        _In_ WDFDEVICE Device,
        _In_ WDFCMRESLIST ResourcesRaw,
        _In_ WDFCMRESLIST ResourcesTranslated
    )
    {
        PDEVICE_CONTEXT devCtx = GetDeviceContext(Device);
        PCM_PARTIAL_RESOURCE_DESCRIPTOR desc;
        ULONG resourceCount;
        ULONG i;
    
        for (i = 0, resourceCount = WdfCmResourceListGetCount(ResourcesRaw); i < resourceCount; ++i)
        {
            desc = WdfCmResourceListGetDescriptor(ResourcesTranslated, i);
    
            // 检查资源类型,如果是ACPI指针资源
            if (desc->Type == CmResourceTypeConnection &&
                desc->u.Connection.Class == CM_RESOURCE_CONNECTION_CLASS_ACPI)
            {
                // 获取ACPI对象
                PACPI_OBJECT acpiObj = NULL;
                status = WdfDeviceRetrieveAcpiObject(Device, desc->u.Connection.IdLow, &acpiObj);
                if (NT_SUCCESS(status) && acpiObj != NULL)
                {
                    // 处理ACPI对象...
                }
            }
        }
    
        return STATUS_SUCCESS;
    }
    

    请注意,上述代码仅为示意,并未包含ACPI按钮设备的具体实现细节,实际开发过程中需要根据ACPI规范和设备的实际需求来编写相应代码。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月9日
  • 修改了问题 3月9日
  • 创建了问题 3月9日

悬赏问题

  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 关于大棚监测的pcb板设计
  • ¥15 stm32开发clion时遇到的编译问题
  • ¥15 lna设计 源简并电感型共源放大器
  • ¥15 如何用Labview在myRIO上做LCD显示?(语言-开发语言)
  • ¥15 Vue3地图和异步函数使用
  • ¥15 C++ yoloV5改写遇到的问题
  • ¥20 win11修改中文用户名路径
  • ¥15 win2012磁盘空间不足,c盘正常,d盘无法写入