Получить список SATA HBA из настроек API - PullRequest
0 голосов
/ 30 января 2012

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

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

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

1 Ответ

0 голосов
/ 01 февраля 2012

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

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

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

Для тех, кто достаточно знаком с SetupApi, я бы очень признателен за некоторые знания о том, что это такое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...