Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.142.156.202] |
|
Сообщ.
#1
,
|
|
|
Мне надо узнать версию драйвера… Гугл подсказывает о 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 выдаёт список из нескольких драйверов. Насколько я понимаю, это старые драйвера которые когда-то давно устанавливались но не были вычищены при установке других драйверов. Как узнать какой драйвер из этого список используемый? #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; } |