sdyxz123 2024-03-09 12:00 采纳率: 39%
浏览 4
已结题

KMDF ACPI 相关疑问

在KDF 设备后调用 中,我想获取,给出示例 KMDF ACPI 相关疑问

  • 写回答

7条回答 默认 最新

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

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

    在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_HIDACPI_METHOD_UID来分别获取HID和UID。然后,通过调用Ioctl_ACPI_EVAL_METHOD函数执行ACPI方法并解析输出结果。

    请注意,实际应用中可能需要根据具体的ACPI表结构来调整上述代码,因为并非所有ACPI设备都直接支持HID或UID方法。此外,在某些情况下,可能需要遍历ACPI命名空间或读取ACPI设备对象的属性来获取所需信息。

    另外,以上代码片段为了演示目的简化了一些错误处理和同步逻辑,请确保在生产环境中进行适当的错误检查和资源管理。

    评论 编辑记录

报告相同问题?

问题事件

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

悬赏问题

  • ¥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 库的使用