首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Windows设备驱动程序(WDF)中获取完整的设备实例id

在Windows设备驱动程序(WDF)中获取完整的设备实例id
EN

Stack Overflow用户
提问于 2015-09-10 11:23:04
回答 3查看 6.4K关注 0票数 1

我使用WDK8.1自定义windows驱动程序。

我希望在WDF/KMDF驱动程序中获得设备实例id,这对于每个设备都是唯一的。

  • 操作系统: Windows 7(x64位)
  • 设备实例id:{设备-ID}\{特定实例-ID}
  • 在:HKLM/SYSTEM/CurrentControlSet/Enum/PCI/下面有注册表条目
  • 在HKLM/SYSTEM/CurrentControlSet/Enum//PCI下,每个设备id都以Subkey的形式存在。
  • 使用WdfDeviceAllocAndQueryPropertyWdfMemoryGetBuffer可以获得特定的设备id,但现在能够获得instance-specific-id.

是否可以为附加的PCI设备获取完整的设备实例id?

谁能建议可能的方式,以便我可以获得设备实例Id使用KMDF。

EN

回答 3

Stack Overflow用户

发布于 2015-09-25 13:20:45

  • 是的,可以获得完整的设备实例id (设备id +实例id).This解决方案,另一种方法可能是there.According到我的解决方案检查如下:
  • 例如:来自PCI\VEN_1000&DEV_0001&SUBSYS_00000000&REV_02\1&08 设备id:VEN_1000&DEV_0001&SUBSYS_00000000&REV_02和实例id = 1&08 (唯一id)
  • 第一步是从下面函数中的这个HKLM/SYSTEM/CurrentControlSet/Enum/PCI/{device-id}中的特定路径case.Use获取设备id,就像前面提到的那样,在打开注册表之后。
  • 使用ZwOpenKeyZwQueryKey以及ZwEnumerateKey(https://msdn.microsoft.com/en-us/library/windows/hardware/ff566447(v=vs.85%29.aspx)(for枚举目的).This函数可以提供有关打开的注册表路径的信息。
  • 要在ZwQueryKey函数的第二个参数中获取子键,请使用KEY_BASIC_INFORMATION作为KEY_INFORMATION_CLASS
  • 之后,使用ZwEnumerateKey调用查找子键,在使用ZwClose的关闭句柄之后查找subkeys.And。
  • 请参考此代码,以查找子项枚举操作。
票数 3
EN

Stack Overflow用户

发布于 2016-12-26 14:42:52

由于设备Id和实例Id完全由PDO驱动程序确定,因此我们可以查询PDO以获取这些信息。这在MSDN(ID )中得到了明确的说明。

所以查询实例id的代码如下所示:

代码语言:javascript
复制
void testGetInstanceId(WDFDEVICE wdfdevice)
{
    DEVICE_OBJECT *pdo = WdfDeviceWdmGetPhysicalDevice(wdfdevice);

    KEVENT ke;
    KeInitializeEvent(&ke, NotificationEvent, FALSE);
    IO_STATUS_BLOCK iosb = {};
    PIRP Irp = IoBuildSynchronousFsdRequest(IRP_MJ_PNP, pdo,
        NULL, 0, NULL,
        &ke, &iosb
        );
    Irp->IoStatus.Status = STATUS_NOT_SUPPORTED; // required initialize
    PIO_STACK_LOCATION stack= IoGetNextIrpStackLocation(Irp);
    stack->MinorFunction = IRP_MN_QUERY_ID;
    stack->Parameters.QueryId.IdType = BusQueryInstanceID;

    NTSTATUS nts = IoCallDriver(pdo, Irp); 

    if(nts==STATUS_PENDING)
    {   // Normally, we will not meet this, bcz QueryId should not be a "slow" operation.
        KeWaitForSingleObject(&ke, Executive, KernelMode, FALSE, NULL);
    }

    if(NT_SUCCESS(nts))
    {
        WCHAR *pInstanceId = (WCHAR*)iosb.Information;
        DbgPrint("InstanceId = %ws\n", pInstanceId); // tested.
        ExFreePool(pInstanceId); // IRP_MN_QUERY_ID require this
    }
}

如果您想查询设备id,只需将BusQueryInstanceID替换为BusQueryDeviceID即可。

我自己已经核实过了。自Windows 2000以来,它肯定适用于所有版本的Windows。

嗯,我意识到两个混淆术语的问题:“设备实例id”和“设备实例路径”不是一回事。看我的帖子:如何从Windows内核驱动程序中获取设备实例路径?

票数 2
EN

Stack Overflow用户

发布于 2015-12-03 23:17:10

将WdfDeviceAllocAndQueryPropertyExDEVPKEY_Device_InstanceId结合使用

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32500557

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档