- 在KMDF 中有 提供表示ACPI 设备的现成数据结构吗?比如我想定义一个ACPI 的 按钮 设备,KMDF这个有类似的ACPI 设备数据结构体吗?还是需要我自己去定义?
- 在KMDF 枚举 ACPI 设备后调用 EvtDeviceAdd 中,我想获取ACPI 设备的 HID 和 UID 应该怎么获取呢,给出示例
WDF 的 APCI 设备定义相关
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
5条回答 默认 最新
关注 引自免费微信小程序:皆我百晓生
在Windows内核模式驱动程序框架(KMDF)中,没有直接提供用于表示ACPI设备的现成数据结构。对于ACPI设备的管理,Windows操作系统层提供了基础的ACPI接口和数据结构,而这些通常由WDM驱动开发者或者基于KMDF编写驱动的开发者间接使用。
具体到ACPI按钮设备,在KMDF中定义这样的设备,你需要按照以下步骤操作:
-
首先,系统通过ACPI解析得到的硬件资源(如ACPI方法、通知对象等)会被操作系统转换并分配给相应的PDO(物理设备对象),这一过程由系统底层处理完成。
-
在编写KMDF驱动时,你并不直接创建或定义ACPI设备的数据结构,而是针对你的ACPI按钮设备创建一个功能设备对象(FDO或过滤设备对象FFDO),并通过
WdfDeviceCreate
等API来注册设备。 -
若要获取与ACPI相关的属性或事件(例如ACPI按钮按下产生的通知),你需要调用KMDF提供的接口去访问和处理这些ACPI资源。例如,可以通过调用
WdfDeviceRetrieveAcpiObject
函数获取设备关联的ACPI对象,并进一步调用ACPI相关的方法或其他接口。 -
若要响应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规范和设备的实际需求来编写相应代码。
解决 无用评论 打赏 举报 编辑记录-
悬赏问题
- ¥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盘无法写入