从setup api获取SATA HBA列表

时间:2012-01-30 19:29:52

标签: c++ setupapi

我不确定我错过了什么,但现在是时候向比我更知识渊博的人询问了。我正在使用我发现的here HDC GUID。我试图用我的C ++代码打开它:

// note: devGuid is pointer of type struct GUID in the class this ctor belongs to
DeviceHelper::DeviceManager::DeviceManager(GUID devClassGuid) : devGuid(new GUID(devClassGuid)) {
    hDevices = SetupDiGetClassDevs(&devClassGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
    if(INVALID_HANDLE_VALUE == hDevices) {
        throw std::exception("Failure to get a handle to a list of device classes");
    }
}

此调用传递,hDevices包含有效引用。但是,当我调用SetupDiEnumDeviceInterfaces()时,它会迭代到任何东西:

// hDevices is assigned in the c-tor as is devGuid which is a pointer
DWORD index(0);
SP_DEVICE_INTERFACE_DATA devInterfaceData = {sizeof(SP_DEVICE_INTERFACE_DATA)};
while(SetupDiEnumDeviceInterfaces(hDevices, NULL, devGuid, index, &devInterfaceData)) {
    // look for the HBA I want from parameters passed to the class function
    // FindHba()
}

SetupDiEnumDeviceInterfaces()将系统错误代码设置为249,这是“不再有项目”,但没有迭代任何内容。显然,句柄指向一个空列表。什么是调用SetupDiGetClassDevs()时出错了?我认为可能是GUID不是“接口”GUID(即“接口”一词不在名称中)。所以,我尝试使用bitwise或DIGCF_DEVICEINTERFACE,但这没有用。

我对如何使用这个API的知识非常有限,我现在什么也没做,只是旋转我的车轮。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我显然不知道接口在这种情况下的含义。答案似乎是调用SetupDiEnumDeviceInfo()而不是使用SetupDiEnumDeviceInterfaces()。显然,当我问这个问题时,我走在了正确的轨道上。事实上,似乎问题与尝试迭代我没有接口的接口有关。

无论如何,我现在能够通过此代码启用/禁用我的ATA设备(这就是我所追求的)。作为参考,我将上一篇文章转到Stack Overflow:Win32 API function to programatically enable/disable device

该代码适用于C ++。

对于那些非常熟悉SetupApi的人,我肯定会对这些事情的教育有所了解。