SetupDiGetClassDevs列出SCSI驱动器失败,错误代码为13(ERROR_INVALID_DATA)

时间:2013-01-18 18:20:16

标签: windows visual-c++ setupapi

我有一个相当有趣的问题,我无法找到解决方案。我正在使用Setup API列出系统中的驱动器。将枚举器设置为“IDE”时,使用下面列出的代码没有问题。当枚举器值设置为“SCSI”时,我感到焦虑。重现此问题的代码如下:

#include <iostream>
#include <Windows.h>
#include <SetupAPI.h>
#include <cfgmgr32.h>
#include <devguid.h>

int main() {
    std::cout << "Looking for only SCSI disks" << std::endl;
    HDEVINFO hDevs(SetupDiGetClassDevs(&GUID_DEVCLASS_DISKDRIVE, "SCSI", NULL, DIGCF_PRESENT));
    if(INVALID_HANDLE_VALUE == hDevs) {
        DWORD error(GetLastError());
        std::cout << "Handle returned is invalid. Error code: " << error << std::endl;
        return 1;
    }

    SP_DEVINFO_DATA sp = {sizeof(SP_DEVINFO_DATA)};
    char buff[256];
    memset(buff, 0, 256);
    DWORD index(0);

    std::cout << "The handle is valid, listing drives now" << std::endl;
    while(SetupDiEnumDeviceInfo(hDevs, index++, &sp)) {
        CM_Get_Device_ID(sp.DevInst, buff, 256, 0);
        std::cout << buff << std::endl;
        memset(buff, 0, 256);
    }

    SetupDiDestroyDeviceInfoList(hDevs);
    return 0;
}

正如您所看到的,这段代码没什么了不起的。在某些笔记本电脑上,问题是SetupDiGetClassDevs()处的代码错误。检查GetLastError()显示ERROR_INVALID_DATA(0xd)失败。我不明白的是为什么。这个完全相同的程序在我的开发盒上运行,无论是作为我的用户(具有管理员权限)还是作为非特权用户,无论是否存在SCSI驱动器都能正常运行。

我知道正在使用的GUID是正确的。它在devguid.h中定义。 “SCSI”是此MSDN page上引用的有效PnP枚举器,也是检查设备管理器中“Enumerator”属性的有效PnP枚举器。第三个参数可以是NULL,第四个参数是此函数的有效定义标志。我知道这是因为,除了这些笔记本电脑,这适用于我曾经尝试过的所有系统(在我的组织中,这是很多)。我希望这里有人可能知道什么会导致SetupDiGetClassDevs()因这些条件导致此错误失败,或者至少可以指向正确的方向。我不是Windows专家,我可能会遗漏一些关于系统配置或权限的内容(虽然没有暗示错误)。

正如我希望的那样,我已经在一台笔记本电脑上运行此代码,我可以将其作为具有管理员权限的用户和管理员用户进行测试:两者具有相同的结果。笔记本电脑是运行Windows 7 64位Service Pack 1的HP EliteBook 8460p。使用32位或64位编译此代码没有任何区别。

1 个答案:

答案 0 :(得分:1)

我将发布我从MSDN支持论坛上的一位研究员那里得到的答案,以帮助可能会被同一问题困扰的人。显然,这是Windows 7的预期行为。如果系统从未见过具有为SetupDiGetClassDevs()指定的枚举器的硬件,则会发生故障并且预期会出现此错误代码。

作为参考,我问这个问题的主题是here

相关问题