我使用WDK8.1自定义windows驱动程序。
我希望在WDF/KMDF驱动程序中获得设备实例id,这对于每个设备都是唯一的。
是否可以为附加的PCI设备获取完整的设备实例id?
谁能建议可能的方式,以便我可以获得设备实例Id使用KMDF。
发布于 2015-09-25 13:20:45
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,就像前面提到的那样,在打开注册表之后。ZwQueryKey函数的第二个参数中获取子键,请使用KEY_BASIC_INFORMATION作为KEY_INFORMATION_CLASS。ZwEnumerateKey调用查找子键,在使用ZwClose的关闭句柄之后查找subkeys.And。发布于 2016-12-26 14:42:52
由于设备Id和实例Id完全由PDO驱动程序确定,因此我们可以查询PDO以获取这些信息。这在MSDN(ID )中得到了明确的说明。
所以查询实例id的代码如下所示:
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内核驱动程序中获取设备实例路径?
发布于 2015-12-03 23:17:10
将WdfDeviceAllocAndQueryPropertyEx与DEVPKEY_Device_InstanceId结合使用
https://stackoverflow.com/questions/32500557
复制相似问题