从安装api获取SATA HBA的列表

Get a list of SATA HBAs from setup api

本文关键字:HBA 列表 SATA 获取 安装 api      更新时间:2023-10-16

我不确定我遗漏了什么,但是时候向比我更有知识的人询问了。我使用的是我在这里找到的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保存一个有效引用。然而,当我调用SetupDiEnumDeviceInterface()时,它什么都不迭代:

// 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()
}

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

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

谢谢你的帮助。

我显然不知道接口在这种情况下意味着什么。答案似乎是调用SetupDiEnumDeviceInfo(),而不是使用SetupDiEnum DeviceInterface()。显然,当我问这个问题时,我是在正确的轨道上。事实上,这个问题似乎与试图迭代我没有的接口有关。

无论如何,我现在可以通过这段代码启用/禁用我的ATA设备(这就是我所追求的)。作为参考,我从上一篇文章转到Stack Overflow:Win32 API函数,以编程方式启用/禁用设备

该代码是为C++而改编的。

对于任何熟悉SetupApi的人来说,我一定很感激对这些东西进行一些教育。