在KDF 设备后调用 中,我想获取,给出示例 KMDF ACPI 相关疑问
7条回答 默认 最新
关注 引自免费微信小程序:皆我百晓生
在Windows内核模式驱动程序框架(KMDF)中,当枚举到ACPI设备并在
EvtDeviceAdd
回调函数中处理时,获取ACPI HID(Hardware ID)和UID(Unique IDentifier)通常涉及与ACPI接口进行交互。以下是一个示例说明如何获取这些信息:#include <ntddk.h> #include <wdf.h> #include <wdmsec.h> #include <acpiioct.h> // 在EvtDeviceAdd回调函数中 NTSTATUS YourEvtDeviceAdd( WDFDRIVER Driver, WDFDEVICE Device, PWDFDEVICE_INIT DeviceInit ) { NTSTATUS status; PACPI_EVAL_INPUT_BUFFER_SIMPLE inputBuffer; PACPI_EVAL_OUTPUT_BUFFER outputBuffer; ULONG bufferSize = sizeof(ACPI_EVAL_OUTPUT_BUFFER) + 256; // 假设HID和UID长度不会超过256字节 PVOID buffer; // 分配内存以存放输入和输出缓冲区 buffer = ExAllocatePoolWithTag(PagedPool, bufferSize, 'YourTag'); if (buffer == NULL) { return STATUS_INSUFFICIENT_RESOURCES; } inputBuffer = buffer; outputBuffer = buffer; RtlZeroMemory(buffer, bufferSize); inputBuffer->Signature = ACPI_EVAL_INPUT_BUFFER_SIMPLE_SIGNATURE; inputBuffer->MethodNameAsUlong = ACPI_METHOD_HID; // 获取HID status = IoAcquireRemoveLock(&Device->PendingIoCount, Device); if (!NT_SUCCESS(status)) { goto Exit; } status = Ioctl_ACPI_EVAL_METHOD(Device, IOCTL_ACPI_ASYNC_EVAL_METHOD, inputBuffer, bufferSize, outputBuffer, &bufferSize); IoReleaseRemoveLock(&Device->PendingIoCount, Device); if (NT_SUCCESS(status)) { PUNICODE_STRING hidString = (PUNICODE_STRING)&outputBuffer->Argument; DbgPrint("ACPI HID: %wZ\n", hidString); // 打印HID // 重置缓冲区以便获取UID RtlZeroMemory(buffer, bufferSize); inputBuffer->MethodNameAsUlong = ACPI_METHOD_UID; // 获取UID status = IoAcquireRemoveLock(&Device->PendingIoCount, Device); if (!NT_SUCCESS(status)) { goto Exit; } status = Ioctl_ACPI_EVAL_METHOD(Device, IOCTL_ACPI_ASYNC_EVAL_METHOD, inputBuffer, bufferSize, outputBuffer, &bufferSize); IoReleaseRemoveLock(&Device->PendingIoCount, Device); if (NT_SUCCESS(status)) { PUNICODE_STRING uidString = (PUNICODE_STRING)&outputBuffer->Argument; DbgPrint("ACPI UID: %wZ\n", uidString); // 打印UID } } Exit: ExFreePoolWithTag(buffer, 'YourTag'); return status; }
这段代码首先分配了足够的内存用于ACPI方法的输入和输出缓冲区,并设置要调用的方法名称为
ACPI_METHOD_HID
和ACPI_METHOD_UID
来分别获取HID和UID。然后,通过调用Ioctl_ACPI_EVAL_METHOD
函数执行ACPI方法并解析输出结果。请注意,实际应用中可能需要根据具体的ACPI表结构来调整上述代码,因为并非所有ACPI设备都直接支持HID或UID方法。此外,在某些情况下,可能需要遍历ACPI命名空间或读取ACPI设备对象的属性来获取所需信息。
另外,以上代码片段为了演示目的简化了一些错误处理和同步逻辑,请确保在生产环境中进行适当的错误检查和资源管理。
解决 无用评论 打赏 举报 编辑记录
悬赏问题
- ¥15 如何用Labview在myRIO上做LCD显示?(语言-开发语言)
- ¥15 Vue3地图和异步函数使用
- ¥15 C++ yoloV5改写遇到的问题
- ¥20 win11修改中文用户名路径
- ¥15 win2012磁盘空间不足,c盘正常,d盘无法写入
- ¥15 用土力学知识进行土坡稳定性分析与挡土墙设计
- ¥70 PlayWright在Java上连接CDP关联本地Chrome启动失败,貌似是Windows端口转发问题
- ¥15 帮我写一个c++工程
- ¥30 Eclipse官网打不开,官网首页进不去,显示无法访问此页面,求解决方法
- ¥15 关于smbclient 库的使用