1

WindowsドライバーのカスタマイズにWDK 8.1を使用しています。

各デバイスに固有の WDF/KMDF ドライバーでデバイス インスタンス IDを取得したいと考えています。

  • OS : Windows 7(x64ビット)
  • デバイス インスタンス ID: {device-ID} \ {instance-specific-ID}
  • HKLM/SYSTEM/CurrentControlSet/Enum/PCI/の下にデバイスのレジストリエントリがあります。
  • すべてのデバイス ID の HKLM/SYSTEM/CurrentControlSet/Enum//PCI の下に、インスタンス ID がサブキーとして存在します。
  • WdfDeviceAllocAndQueryPropertyWdfMemoryGetBufferを使用すると、特定のデバイス IDを取得できますが、インスタンス固有の IDを取得できるようになりました。

接続された PCI デバイスの完全なデバイス インスタンス ID を取得することは可能ですか?

KMDF を使用してデバイス インスタンス ID を取得できるように、誰でも可能な方法を提案できますか。

4

3 に答える 3

3
  • はい、完全なデバイス インスタンス ID (デバイス ID + インスタンス ID) を取得することは可能です。
  • 例: からPCI\VEN_1000&DEV_0001&SUBSYS_00000000&REV_02\1&08

    デバイス ID :VEN_1000&DEV_0001&SUBSYS_00000000&REV_02およびインスタンス ID = 1&08 (一意の ID)

  • 最初のステップは、問題に記載されているようにデバイス ID を取得し、その後HKLM/SYSTEM/CurrentControlSet/Enum/PCI/{device-id}、この場合は特定のパスからレジストリを開くことです。以下の関数を使用します。

  • ZwOpenKeyとZwQueryKeyZwEnumerateKeyを(列挙目的で) 使用します。この関数は、開いているレジストリ パスに関する情報を提供できます

  • ZwQueryKey関数の 2 番目の引数 でサブキーを取得するには、 as を使用KEY_BASIC_INFORMATIONKEY_INFORMATION_CLASS ます。

  • その後、サブキーを見つけるためZwEnumerateKeyの呼び出しを使用してサブキーを見つけます。その後、 ZwClose を使用してハンドルを閉じます。

  • サブキーの列挙操作を見つけるために、このCODEを参照してください。

于 2015-09-25T13:20:45.427 に答える
1

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 を照会したい場合は、 に置き換えBusQueryInstanceIDBusQueryDeviceIDください。

私はこれを自分で確認しました。Windows 2000 以降のすべてのバージョンの Windows で確実に動作します。

[2017-06-27] うーん、「デバイス インスタンス ID」と「デバイス インスタンス パス」という 2 つの紛らわしい用語に関する問題に気付きました。同じものではありません。私のこの投稿を参照してください: How to get Device Instance Path from Windows kernel driver?

于 2016-12-26T14:42:52.120 に答える
1

DEVPKEY_Device_InstanceIdでWdfDeviceAllocAndQueryProperty Exを使用する

于 2015-12-03T23:17:10.743 に答える