Device-id と Instance-Id は PDO ドライバーによって完全に決定されるため、これらの情報について PDO に問い合わせることができます。これは、MSDN ( IRP_MN_QUERY_ID )で明示的に述べられています。
したがって、Instance-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
}
}
Device-id を照会したい場合は、 に置き換えBusQueryInstanceID
てBusQueryDeviceID
ください。
私はこれを自分で確認しました。Windows 2000 以降のすべてのバージョンの Windows で確実に動作します。
[2017-06-27] うーん、「デバイス インスタンス ID」と「デバイス インスタンス パス」という 2 つの紛らわしい用語に関する問題に気付きました。同じものではありません。私のこの投稿を参照してください: How to get Device Instance Path from Windows kernel driver?