3

SetupDiEnumDeviceInterfaces()特定の PnP 列挙子に対応するすべてのデバイスのデバイス インターフェイス データを取得しようとしています。次の例を検討してください (インデックス 0 のインターフェイスのみ)。

#include <stdio.h>
#include <Windows.h>
#include <SetupAPI.h>

static int get_interface(HDEVINFO);

int main()
{
    HDEVINFO devInfoSet = SetupDiGetClassDevsA(NULL, "USBSTOR", NULL, DIGCF_ALLCLASSES | DIGCF_PRESENT);
    if (devInfoSet == INVALID_HANDLE_VALUE)
    {
        fprintf(stderr, "SetupDiGetClassDevsA: Error %lu\n", GetLastError());
        return 1;
    }

    int ret = get_interface(devInfoSet);

    SetupDiDestroyDeviceInfoList(devInfoSet);
    return ret;
}

int get_interface(HDEVINFO devInfoSet)
{
    SP_DEVICE_INTERFACE_DATA devIface = { sizeof(SP_DEVICE_INTERFACE_DATA) };
    if (!SetupDiEnumDeviceInterfaces(devInfoSet, NULL, &GUID_DEVINTERFACE_DISK, 0, &devIface))
    {
        fprintf(stderr, "SetupDiEnumDeviceInterfaces: Error %lu\n", GetLastError());
        return 1;
    }

    /* ... */
}

(この例のより完全なバージョンは、こちらから入手できます。)

それを実行すると、エラー 259 ( ) が返されてSetupDiEnumDeviceInterfaces()失敗し、最初からデバイス情報セットのインターフェイスがなかったかのようになります。デバイス インターフェイス クラスではなく、デバイス セットアップ クラスに対して取得されたすべてのデバイス情報セットの動作のようです。GetLastError()ERROR_NO_MORE_ITEMS

ただし、呼び出しDIGCF_DEVICEINTERFACEの最後の引数にフラグを追加しSetupDiGetClassDevsA()て、インターフェイス クラスのセットを取得すると、後者はエラー 13 ( ERROR_INVALID_DATA) で失敗します。指定された PnP 列挙子がシステム内に登録されていないデバイス セットアップ クラスの場合、通常は同じエラーが発生します。実際、enumerator 引数を に置き換えるとNULL、インターフェイスが正常に取得されます。MSDN によると、フラグを指定するDIGCF_DEVICEINTERFACEと、列挙子引数の代わりにデバイス インスタンス ID を使用できますが、前述のデバイス インスタンス ID と、実際の列挙子を使用してフラグが存在する場合、呼び出しの列挙子引数のNULL唯一のオプションであることがわかります。その場合はオプション外です。SetupDiGetClassDevs()DIGCF_DEVICEINTERFACE

ここで実際に何が起こっているのか説明していただけますか? 私は SetupAPI セマンティクスに精通していないので、デバイス インターフェース クラスの場合とは対照的に、デバイス セットアップ クラスのデバイス情報セットを取得する際にどのような制限が課せられるのかわかりません。また、ここにバージョン固有の動作がある可能性はありますか? 上記のコードは Windows 7 x64 システムでテストされましたが、それ自体は 32 ビットの実行可能ファイルにコンパイルされていました。これに対して提案された特定のソリューションが古き良きWindows XPでも機能するかどうかを具体的に知る必要があります。

PS SetupDiEnumDeviceInfoを使用してデバイスを列挙しているときに CreateFile のデバイス パスを取得するのとは異なりますが、基本的な目的は似ています。;)

4

0 に答える 0