Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: SetupDiEnumDeviceInterfaces всегда false  (Прочитано 8390 раз)
0 Пользователей и 1 Гость смотрят эту тему.
gluhow
Гость
« : 15-10-2009 09:25 » 

Здравствуйте! Я пишу свой первый драйвер для PCI платы. Проблема возникла когда решил переделать драйвер для работы с несколькими устройствами (с одним все работает). Для этого в AddDevice поменял в IoCreateDevice параметр Characteristics с 0 на FILE_AUTOGENERATED_DEVICE_NAME. Как я понимаю после этого имя устройства надо получать перечислением. У меня получилось следующее:
Код:
	HDEVINFO hDevinfo;
SP_DEVICE_INTERFACE_DATA DeviceInterfaceData;
DeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
        GUID pClassGuid;

int index = 0;
         pClassGuid.Data1 = 0xDB84F863;
         pClassGuid.Data2 = 0x53E2;
         pClassGuid.Data3 = 0x4b3f;
         pClassGuid.Data4[0] = 0xAD;
         pClassGuid.Data4[1] = 0x22;
         pClassGuid.Data4[2] = 0xA0;
         pClassGuid.Data4[3] = 0xEB;
         pClassGuid.Data4[4] = 0x79;
         pClassGuid.Data4[5] = 0x5D;
         pClassGuid.Data4[6] = 0x87;
         pClassGuid.Data4[7] = 0x11;
//GUID моего класса устройств, который я прописываю в Inf-файле

do{

hDevinfo = SetupDiGetClassDevs(&pClassGuid, NULL, NULL,
DIGCF_DEVICEINTERFACE |DIGCF_PRESENT);
 //hDevinfo  в любом случае мне выдает НЕ INVALID_HANDLE_VALUE!!! Даже если подаю заведомо ложный GUID
if(hDevinfo == INVALID_HANDLE_VALUE)
{
return INVALID_HANDLE_VALUE;
}
if (!SetupDiEnumDeviceInterfaces( hDevinfo, NULL, &pClassGuid, index,
                                          &DeviceInterfaceData))

{
return INVALID_HANDLE_VALUE; //Всегда происходит переход на эту ветку!
}

Искал свой GUID в реестре, нашел только в ветках типа HKLM\System\CurrentControlSet (ControlSet001...)\Class, а в Deviceclasses Guid отсутствует!
Где искать ошибку в драйвере, inf файле?

* drv_c0.inf (2.26 Кб - загружено 1034 раз.)
Записан
gluhow
Гость
« Ответ #1 : 16-10-2009 08:20 » 

Сейчас пробовал найти устройство на другой PCI плате (готовой), устройство обнаруживается, т.е. SetupDiEnumDeviceInterfaces==true, но когда я подменил .sys файл своим, тут же SetupDiEnumDeviceInterfaces==false. Значит искать надо в драйвере. Есть идеи в каком разделе?
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 16-10-2009 21:24 » 

похоже что в драйвере.
Цитата
Example 4: Build a list of all devices that are present in the system that have enabled an interface from the storage volume device interface class.
Handle = SetupDiGetClassDevs(&GUID_DEVINTERFACE_VOLUME, NULL, NULL, DIGCF_PRESENT | DIGCF_INTERFACEDEVICE);
включили? IoRegisterDeviceInterface или IoGetDeviceInterfaces/IoSetDeviceInterfaceState
« Последнее редактирование: 16-10-2009 21:26 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
gluhow
Гость
« Ответ #3 : 20-10-2009 06:42 » 

Спасибо! Разобрался! Действительно у меня не было IoRegisterDeviceInterface, т.к. начинал делать на основе portio. Cейчас сделал на основе примера DDK toaster incomplete2. Плюс к этому ошибка была в том что GUID надо подставлять не из inf файла, а тот который передается параметром в IoRegisterDeviceInterface - а они могут не совпадать.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines