На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются.
4. Используйте теги [ code=cpp ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Старайтесь формулировать свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной и более давности без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта (C++) user posted image FAQ Форума user posted image Наши Исходники user posted image Поиск по Разделу user posted image MSDN Library Online (Windows Driver Kit) user posted image Google

Ваше мнение о модераторах: user posted image B.V.
Модераторы: B.V.
  
> Узнать версию драйвера для составного USB устройства.
    Мне надо узнать версию драйвера… Гугл подсказывает о SetupDiEnumDriverInfo, однако возникло две проблемы:

    Сейчас куча USB-устройств являются составными устройствами.
    Прикреплённая картинка
    Прикреплённая картинка

    И SetupDiEnumDriverInfo выдаёт инфу только по этим корневым девайсам.
    Вот что у меня получается:
    i1=0 i2=0 - Generic Bluetooth Adapter v.6.3.9600.17901
    i1=0 i2=1 - Broadcom Bluetooth 2.0+EDR USB dongle v.12.0.0.8047
    i1=0 i2=2 - BlueSoleil Generic Bluetooth Driver v.6.2.84.273
    i1=0 i2=3 - BlueSoleil Generic Bluetooth Driver v.6.2.84.273
    i1=1 i2=0 - USB-устройство ввода v.6.3.9600.18341
    i1=2 i2=0 - USB-устройство ввода v.6.3.9600.18341
    i1=4 i2=0 - Составное USB устройство v.6.3.9600.17238
    i1=5 i2=0 - Запоминающее устройство для USB v.6.3.9600.18224
    i1=6 i2=0 - Составное USB устройство v.6.3.9600.17238
    i1=7 i2=0 - Запоминающее устройство для USB v.6.3.9600.18224
    i1=8 i2=0 - Составное USB устройство v.6.3.9600.17238


    hDevInfo = SetupDiGetClassDevsW(&(GUID_DEVINTERFACE_USB_DEVICE), 0, 0, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);
    SetupDiEnumDeviceInterfaces(hDevInfo, 0, &(GUID_CLASS_USB_DEVICE), index1, &DeviceInterfaceData);
    SetupDiGetDeviceInterfaceDetail(hDevInfo, &DeviceInterfaceData, InterfaceDetailData, Length, &Required, &DeviceInfo)
    - даёт инфу по корневому девайсу, но у него микрофтовский драйвер «Составное USB устройство v.6.3.9600.17238»…
    А как найти его дочерние устройства?
    Пробовал вложенную функцию сделать, используя полученный GUID DeviceInterfaceData.InterfaceClassGuid вместо GUID_DEVINTERFACE_USB_DEVICE - однако оно выдаёт тот же самый список что и на GUID_DEVINTERFACE_USB_DEVICE.


    И второй вопрос - у некоторых девайсов SetupDiEnumDriverInfo выдаёт список из нескольких драйверов. Насколько я понимаю, это старые драйвера которые когда-то давно устанавливались но не были вычищены при установке других драйверов.
    Как узнать какой драйвер из этого список используемый?



    ExpandedWrap disabled
      #include "stdafx.h"
       
      WCHAR log_filename[MAX_PATH];
       
      VOID init_filename()
      {
          GetModuleFileNameW(0, log_filename, _countof(log_filename));
          PathRemoveFileSpecW(log_filename);
          StringCbCatW(log_filename, sizeof(log_filename), L"\\x.log");
          return;
      }
       
      VOID errorcode_to_log(LPCWSTR text_buffer, DWORD error_code)
      {
          WCHAR buffer_text_result[300];
          DWORD Temp;
          DWORD BuffSizeBytes;
          wnsprintfW(buffer_text_result, _countof(buffer_text_result), L"Positin=%s Error=%u\r\n", text_buffer, error_code);
          HANDLE hFile = CreateFileW(log_filename, GENERIC_WRITE, FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
          SetFilePointer(hFile, 0, 0, FILE_END);
          BuffSizeBytes = lstrlenW(buffer_text_result) << 1;
          WriteFile(hFile, buffer_text_result, BuffSizeBytes, &Temp, 0);
          CloseHandle(hFile);
          return;
      }
       
      VOID export_to_log(LPCWSTR text_buffer)
      {
          DWORD Temp;
          DWORD BuffSizeBytes;
          HANDLE hFile = CreateFileW(log_filename, GENERIC_WRITE, FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
          SetFilePointer(hFile, 0, 0, FILE_END);
          BuffSizeBytes = lstrlenW(text_buffer) << 1;
          WriteFile(hFile, text_buffer, BuffSizeBytes, &Temp, 0);
          CloseHandle(hFile);
          return;
      }
       
       
      VOID drivers_list(HDEVINFO hDevInfo, INT i1, SP_DEVINFO_DATA DeviceInfo)
      {
          INT TempResult;
          DWORD ErrorCode;
          WCHAR buffer_text_result[300];
          SP_DRVINFO_DATA_W DriverInfo;
       
          TempResult = SetupDiBuildDriverInfoList(hDevInfo, &DeviceInfo, SPDIT_COMPATDRIVER);
          if (!TempResult)
          {
              errorcode_to_log(L"SetupDiBuildDriverInfoList", GetLastError());
          }
          else
          {
              for (int i2 = 0; ; i2++)
              {
                  DriverInfo.cbSize = sizeof(DriverInfo);
                  TempResult = SetupDiEnumDriverInfoW(hDevInfo, &DeviceInfo, SPDIT_COMPATDRIVER, i2, &DriverInfo);
                  ErrorCode = GetLastError();
                  if (ErrorCode == ERROR_NO_MORE_ITEMS)
                  {
                      break;
                  }
                  else if (!TempResult)
                  {
                      errorcode_to_log(L"SetupDiEnumDriverInfoW", ErrorCode);
                      break;
                  }
       
                  wnsprintfW(buffer_text_result, _countof(buffer_text_result),
                      L"i1=%u i2=%u - %s v.%u.%u.%u.%u\r\n", i1, i2, DriverInfo.Description,
                      (DWORD32)(DriverInfo.DriverVersion >> 48) & 0xFFFF, (DWORD32)(DriverInfo.DriverVersion >> 32) & 0xFFFF, (DWORD32)(DriverInfo.DriverVersion >> 16) & 0xFFFF, (DWORD32)(DriverInfo.DriverVersion) & 0xFFFF);
                  export_to_log(buffer_text_result);
              }
          }
       
      }
       
       
      VOID scan_devices()
      {
       
          HDEVINFO hDevInfo;
          SP_DEVICE_INTERFACE_DATA DeviceInterfaceData;
          PSP_DEVICE_INTERFACE_DETAIL_DATA InterfaceDetailData = NULL;
          INT TempResult;
          DWORD ErrorCode;
       
          DWORD Length;
          DWORD Required;
       
          SP_DRVINFO_DATA_W DriverInfo;
          SP_DEVINFO_DATA DeviceInfo;
          WCHAR buffer_text_result[300];
       
          hDevInfo = SetupDiGetClassDevsW(&(GUID_DEVINTERFACE_USB_DEVICE), 0, 0, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);
          if (hDevInfo == INVALID_HANDLE_VALUE)
          {
              errorcode_to_log(L"SetupDiGetClassDevsW", GetLastError());
          }
          else
          {
              for (int i1 = 0; ; i1++)
              {
                  DeviceInterfaceData.cbSize = sizeof(DeviceInterfaceData);
                  TempResult = SetupDiEnumDeviceInterfaces(hDevInfo, 0, &(GUID_CLASS_USB_DEVICE), i1, &DeviceInterfaceData);
                  ErrorCode = GetLastError();
                  if (ErrorCode == ERROR_NO_MORE_ITEMS)
                  {
                      break;
                  }
                  else if (ErrorCode)
                  {
                      errorcode_to_log(L"SetupDiEnumDeviceInterfaces", ErrorCode);
                      break;
                  }
                  
                  Length = 0;
                  TempResult = SetupDiGetDeviceInterfaceDetailW(hDevInfo, &DeviceInterfaceData, 0, 0, &Length, 0);
                  ErrorCode = GetLastError();
                  if (!TempResult && (ErrorCode != ERROR_INSUFFICIENT_BUFFER))
                  {
                      errorcode_to_log(L"SetupDiGetDeviceInterfaceDetailW_1", ErrorCode);
                  }
                  if (Length)
                  {
                      InterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)LocalAlloc(GPTR, Length);
                      if (InterfaceDetailData)
                      {
                          InterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
                          DeviceInfo.cbSize = sizeof(DeviceInfo);
                          TempResult = SetupDiGetDeviceInterfaceDetailW(hDevInfo, &DeviceInterfaceData, InterfaceDetailData, Length, &Required, &DeviceInfo);
                          if (!TempResult)
                          {
                              errorcode_to_log(L"SetupDiGetDeviceInterfaceDetailW_2", GetLastError());
                          }
                          else
                          {
                  //          if (StrCmpNIW(InterfaceDetailData->DevicePath, L"\\\\?\\usb#vid_15f4&pid_0135#", 26) == 0)
      //                      {
                                  //================
       
                              drivers_list(hDevInfo, i1, DeviceInfo);
       
      //======================================================================================================================================
      // тут надо как-то запросить инфу о дочерних устройствах составного USB... попытка неудачная:
       
                              HDEVINFO hDevInfo2;
                              SP_DEVICE_INTERFACE_DATA DeviceInterfaceData2;
                              PSP_DEVICE_INTERFACE_DETAIL_DATA InterfaceDetailData2 = NULL;
                              SP_DRVINFO_DATA_W DriverInfo2;
                              SP_DEVINFO_DATA DeviceInfo2;
       
                              hDevInfo2 = SetupDiGetClassDevsW(&DeviceInterfaceData.InterfaceClassGuid, 0, 0, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);
                              if (hDevInfo2 == INVALID_HANDLE_VALUE)
                              {
                                  errorcode_to_log(L"SetupDiGetClassDevsW 2", GetLastError());
                              }
                              else
                              {
                                  for (int i3 = 0; ; i3++)
                                  {
                                      DeviceInterfaceData2.cbSize = sizeof(DeviceInterfaceData2);
                                      TempResult = SetupDiEnumDeviceInterfaces(hDevInfo2, 0, &DeviceInterfaceData.InterfaceClassGuid, i3, &DeviceInterfaceData2);
                                      ErrorCode = GetLastError();
                                      if (ErrorCode == ERROR_NO_MORE_ITEMS)
                                      {
                                          break;
                                      }
                                      else if (ErrorCode)
                                      {
                                          errorcode_to_log(L"SetupDiEnumDeviceInterfaces 2", ErrorCode);
                                          break;
                                      }
       
                                      Length = 0;
                                      TempResult = SetupDiGetDeviceInterfaceDetailW(hDevInfo2, &DeviceInterfaceData2, 0, 0, &Length, 0);
                                      ErrorCode = GetLastError();
                                      if (!TempResult && (ErrorCode != ERROR_INSUFFICIENT_BUFFER))
                                      {
                                          errorcode_to_log(L"SetupDiGetDeviceInterfaceDetailW_1 2", ErrorCode);
                                      }
                                      if (Length)
                                      {
                                          InterfaceDetailData2 = (PSP_DEVICE_INTERFACE_DETAIL_DATA)LocalAlloc(GPTR, Length);
                                          if (InterfaceDetailData2)
                                          {
                                              InterfaceDetailData2->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
                                              DeviceInfo2.cbSize = sizeof(DeviceInfo2);
                                              TempResult = SetupDiGetDeviceInterfaceDetailW(hDevInfo2, &DeviceInterfaceData2, InterfaceDetailData2, Length, &Required, &DeviceInfo2);
                                              errorcode_to_log(L"a", GetLastError());
                                              drivers_list(hDevInfo2, i3, DeviceInfo2);
                                          }
                                      }
       
                                  }
                              }
       
                              
       
      //======================================================================================================================================
       
                  //          } check pnp
                          }
                          LocalFree(InterfaceDetailData);
                      }
                  }
       
       
       
                  //      } while ((MemberIndex < 1000) && !flag_tuner0131_present && !flag_tuner0135_present);
              }
       
              SetupDiDestroyDeviceInfoList(hDevInfo);
          }
       
          return;
      }
       
       
      int main()
      {
          init_filename();
          scan_devices();
       
       
          return 0;
      }
    1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
    0 пользователей:


    Рейтинг@Mail.ru
    [ Script execution time: 0,0430 ]   [ 16 queries used ]   [ Generated: 19.05.24, 19:23 GMT ]