Получите список адаптеров SATA HBA из setup api

Я не уверен, что мне не хватает, но пришло время спросить у более знающих людей, чем я. Я использую GUID HDC, который я нашел здесь. Я пытаюсь открыть это в своем коде 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 «интерфейса» (т. Е. В названии нет слова «интерфейс»). Итак, я попытался снять побитовое или с помощью DIGCF_DEVICEINTERFACE, но это не помогло.

Мои знания о том, как использовать этот API, довольно ограничены, и сейчас я ничего не делаю, кроме как крутить свои колеса.

Спасибо за любую помощь.


person Andrew Falanga    schedule 30.01.2012    source источник


Ответы (1)


Я, видимо, не знаю, что означает интерфейс в этом контексте. Похоже, что ответ был связан с вызовом SetupDiEnumDeviceInfo() вместо использования SetupDiEnumDeviceInterfaces(). Видимо, я был на правильном пути, когда задал вопрос. Действительно, казалось бы, проблема была связана с попыткой перебрать интерфейсы, которых у меня не было.

Во всяком случае, теперь я могу включать/отключать свои устройства ATA с помощью этого кода (именно это я и хотел). Для справки, я перешел от этой прошлой статьи к Stack Overflow: Win32 API функция для программного включения/отключения устройства

Этот код был адаптирован для C++.

Всем, кто хорошо знаком с SetupApi, я был бы признателен за некоторую информацию о том, что это за вещи.

person Andrew Falanga    schedule 01.02.2012