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;
    }

    /* ... */
}

(此处提供了此示例的更完整版本。)

运行时SetupDiEnumDeviceInterfaces()失败并GetLastError()返回错误 259 ( ERROR_NO_MORE_ITEMS),好像没有任何接口可用于设置设备信息。这似乎是为设备设置类而不是设备接口类获得的所有设备信息集的行为。

但是,当我将DIGCF_DEVICEINTERFACE标志添加到SetupDiGetClassDevsA()调用的最后一个参数时,以便为接口类获取集合时,后者失败并出现错误 13 ( ERROR_INVALID_DATA)。当指定的 PnP 枚举器未在系统中注册时,在设备设置类的情况下通常会发生相同的错误。确实,当我将枚举器参数替换为 时NULL,就成功获取了接口。根据 MSDN,指定DIGCF_DEVICEINTERFACE标志允许使用设备实例 ID 代替枚举器参数,但在我看来,上述设备实例 ID是调用的枚举器参数NULL的唯一选项,当它具有标志时,实际枚举器在这种情况下无法选择。SetupDiGetClassDevs()DIGCF_DEVICEINTERFACE

你能解释一下吗,这里到底发生了什么?我不熟悉 SetupAPI 语义,因此我不知道与device interface classes相比,为device setup classes设置 device info 会施加什么限制。另外,这里可能有一些特定于版本的行为吗?上面的代码在 Windows 7 x64 系统上进行了测试,但它本身被编译成 32 位可执行文件。我需要特别知道为此提出的任何特定解决方案是否也适用于良好的 Windows XP。

PS与使用 SetupDiEnumDeviceInfo 枚举设备时获取 CreateFile 的设备路径不重复,尽管基本目的相似。;)

4

0 回答 0