Страницы

Поиск по вопросам

воскресенье, 7 июля 2019 г.

Как программно получить список всех свойств устройства в Device Manager'e?

Привет всем!
Возникла идея написать приложение на подобии USBDeview (приложение, отображающее все подключенные на данный момент USB девайсы). Хочу также реализовать функционал включения/выключения USB устройства по расписанию (USBDeview тоже так умеет). Все манипуляции провожу через запросы к WMI . Столкнулся с рядом проблем:
При подключении нового USB устройства появляются два девайса - USB Mass Storage Device и Disk Drive. Какое из включать/выключать, чтобы USB устройство правильно отключилось? Запрос "select * from Win32_PnpEntity" возвращает довольно скудный набор свойств (например отсутствуют нужные мне параметры, такие как Matching device Id, Class, Is connected и т.д. - все эти параметры есть в Device Manager'e во вкладке Details). Отсюда вытекает вопрос. Как отобразить ВСЕ свойства, которые есть в Device Manager'e? Небольшой пример кода на C#:
class Program { static void Main(string[] args) { ManagementObjectCollection collection; using (var searcher = new ManagementObjectSearcher(@"Select * From Win32_PnpEntity")) collection = searcher.Get();
foreach (var device in collection) { Console.WriteLine("==================================="); foreach (var prop in device.Properties) Console.WriteLine("\t{0} : {1}", prop.Name, prop.Value); Console.WriteLine("==================================="); }
collection.Dispose();
Console.Read(); }
При подключении флешки появляется два новых устройства:
Disk Drive:
USB Mass Storage Device:
Мне же нужно получить список этих свойств:
Подскажите, пожалуйста, в каком направлении мне идти?


Ответ

При подключении нового USB устройства появляются два девайса - USB Mass Storage Device и Disk Drive. Какое из включать/выключать, чтобы USB устройство правильно отключилось?
Я полагаю, USB Mass Storage Device, т.к. Disk Drive является для него дочерним устройством, и отключается автоматически
Как отобразить ВСЕ свойства, которые есть в Device Manager'e?
Не знаю насчет "все", но довольно много свойств можно получить с помощью Setup API. Функция на C++ для вывода всех свойств по заданному ID устройства:
#pragma comment(lib,"Setupapi.lib")
#include #include #include #include #include #include
void ErrorMes(LPTSTR lpszFunction) { // Retrieve the system error message for the last-error code
LPVOID lpMsgBuf; LPVOID lpDisplayBuf; DWORD dw = GetLastError();
FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL );
// Display the error message and exit the process
lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT, (lstrlen((LPCTSTR)lpMsgBuf) + lstrlen((LPCTSTR)lpszFunction) + 40) * sizeof(TCHAR)); wprintf(L"%s failed with error %d: %s", lpszFunction, dw, lpMsgBuf);
LocalFree(lpMsgBuf); LocalFree(lpDisplayBuf);
}
/*Вывод информации об устройстве с указанным InstanceID*/ BOOL PrintDevice(wchar_t* id) { unsigned index; HDEVINFO hDevInfo; SP_DEVINFO_DATA DeviceInfoData; TCHAR id_upper[1024]=L""; TCHAR buf[1024]=L""; DEVPROPTYPE dpt=0; DEVPROPKEY arr[100]; DWORD count=0;
for(int i=0;i // List all connected devices hDevInfo = SetupDiGetClassDevs(NULL, NULL, NULL, DIGCF_PRESENT | DIGCF_ALLCLASSES); for (index = 0; ; index++) { DeviceInfoData.cbSize = sizeof(DeviceInfoData); if (!SetupDiEnumDeviceInfo(hDevInfo, index, &DeviceInfoData)) { return FALSE; // no match }
BOOL res=SetupDiGetDeviceProperty(hDevInfo,&DeviceInfoData, &DEVPKEY_Device_InstanceId,&dpt,(PBYTE)buf,1000,NULL,0); if(res==FALSE)continue;
if(wcscmp(buf,id_upper)==0){ //устройство найдено res=SetupDiGetDeviceProperty(hDevInfo,&DeviceInfoData, &DEVPKEY_Device_DeviceDesc,&dpt,(PBYTE)buf,1000,NULL,0);
//вывод названия устройства if(res==FALSE)ErrorMes(L"SetupDiGetDeviceProperty"); else wprintf(L"* %s's properties: *

",buf);
//получение свойств res=SetupDiGetDevicePropertyKeys(hDevInfo,&DeviceInfoData,arr,100,&count,0); if(res==FALSE)ErrorMes(L"SetupDiGetDevicePropertyKeys");
for(int i=0;i if(res==FALSE){ErrorMes(L"SetupDiGetDeviceProperty");continue;}
//вывод DEVPROPKEY wprintf(L"{%08lX-%04hX-%04hX-%02hhX%02hhX-%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX; %3d}: ", arr[i].fmtid.Data1, arr[i].fmtid.Data2, arr[i].fmtid.Data3, arr[i].fmtid.Data4[0], arr[i].fmtid.Data4[1], arr[i].fmtid.Data4[2], arr[i].fmtid.Data4[3], arr[i].fmtid.Data4[4], arr[i].fmtid.Data4[5], arr[i].fmtid.Data4[6], arr[i].fmtid.Data4[7], arr[i].pid);
//вывод типа и значения свойства switch (dpt) { case DEVPROP_TYPE_STRING:wprintf(L"String \t%s
",buf); break; case DEVPROP_TYPE_STRING_LIST:wprintf(L"Strings \tFirst line: %s
",buf);break; case DEVPROP_TYPE_BOOLEAN:wprintf(L"Bool \t%d
",(bool)*((LPBYTE)(&buf)));break; case DEVPROP_TYPE_UINT16:wprintf(L"%Uint16 \t%d
",*((LPWORD)(&buf)));break; case DEVPROP_TYPE_UINT32:wprintf(L"Uint \t%d
",*((LPUINT)(&buf)));break; case DEVPROP_TYPE_GUID: wprintf(L"GUID \t{%08lX-%04hX-%04hX-%02hhX%02hhX-%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX}
", (*((GUID*)(&buf))).Data1, (*((GUID*)(&buf))).Data2, (*((GUID*)(&buf))).Data3, (*((GUID*)(&buf))).Data4[0], (*((GUID*)(&buf))).Data4[1], (*((GUID*)(&buf))).Data4[2], (*((GUID*)(&buf))).Data4[3], (*((GUID*)(&buf))).Data4[4], (*((GUID*)(&buf))).Data4[5], (*((GUID*)(&buf))).Data4[6], (*((GUID*)(&buf))).Data4[7]);
break; case DEVPROP_TYPE_BINARY:wprintf(L"(Binary data)
");break;
default:wprintf(L"Other \tType: 0x%x
",(int)dpt); break; }
}
SetupDiDestroyDeviceInfoList(hDevInfo); return TRUE; }//end if
}//end for
SetupDiDestroyDeviceInfoList(hDevInfo); return FALSE;//устройство не найдено }
int main() { setlocale(LC_ALL,"Russian");
PrintDevice(L"USB\\VID_046E&PID_5505\\5&15C311E1&0&6");
system("PAUSE"); return 0; }
Пример вывода:
* Составное USB устройство's properties: *
{A45C254E-DF1C-4EFD-8020-67D146A850E0; 2}: String Составное USB устройство {A45C254E-DF1C-4EFD-8020-67D146A850E0; 3}: Strings First line: USB\VID_046E&PID_5505&REV_0100 {A45C254E-DF1C-4EFD-8020-67D146A850E0; 4}: Strings First line: USB\DevClass_00&SubClass_00&Prot_00 {A45C254E-DF1C-4EFD-8020-67D146A850E0; 6}: String usbccgp {A45C254E-DF1C-4EFD-8020-67D146A850E0; 9}: String USB {A45C254E-DF1C-4EFD-8020-67D146A850E0; 10}: GUID {36FC9E60-C465-11CF-8056-444553540000} {A45C254E-DF1C-4EFD-8020-67D146A850E0; 11}: String {36fc9e60-c465-11cf-8056-444553540000}\0009 {A45C254E-DF1C-4EFD-8020-67D146A850E0; 12}: Uint 0 {A45C254E-DF1C-4EFD-8020-67D146A850E0; 13}: String (Стандартный USB хост-контроллер) {A45C254E-DF1C-4EFD-8020-67D146A850E0; 15}: String Port_#0006.Hub_#0003 {A45C254E-DF1C-4EFD-8020-67D146A850E0; 16}: String \Device\USBPDO-6 {A45C254E-DF1C-4EFD-8020-67D146A850E0; 17}: Uint 132 {A45C254E-DF1C-4EFD-8020-67D146A850E0; 21}: GUID {9D7DEBBC-C85D-11D1-9EB4-006008C3A19A} {A45C254E-DF1C-4EFD-8020-67D146A850E0; 22}: Uint 15 {A45C254E-DF1C-4EFD-8020-67D146A850E0; 23}: Uint 0 {A45C254E-DF1C-4EFD-8020-67D146A850E0; 24}: String USB {A45C254E-DF1C-4EFD-8020-67D146A850E0; 30}: Uint 6 {A45C254E-DF1C-4EFD-8020-67D146A850E0; 32}: (Binary data) {A45C254E-DF1C-4EFD-8020-67D146A850E0; 33}: Uint 3 {A45C254E-DF1C-4EFD-8020-67D146A850E0; 34}: Uint 3 {A45C254E-DF1C-4EFD-8020-67D146A850E0; 36}: Uint 0 {A45C254E-DF1C-4EFD-8020-67D146A850E0; 38}: GUID {23447943-B752-11E7-B8FD-806E6F6E6963} {B725F130-47EF-101A-A5F1-02608C9EEBAC; 10}: String Составное USB устройство {78C34FC8-104A-4ACA-9EA4-524D52996E57; 256}: String USB\VID_046E&PID_5505\5&15C311E1&0&6 {4340A6C5-93FA-4706-972C-7B648008A5A7; 2}: Uint 25182218 {4340A6C5-93FA-4706-972C-7B648008A5A7; 3}: Uint 0 {4340A6C5-93FA-4706-972C-7B648008A5A7; 7}: Strings First line: USB\VID_046E&PID_5505&MI_00\6&157c6e38&0&0000 {4340A6C5-93FA-4706-972C-7B648008A5A7; 8}: String USB\ROOT_HUB30\4&1ed8c4ae&0&0 {4340A6C5-93FA-4706-972C-7B648008A5A7; 9}: Strings First line: USB\VID_046E&PID_5505&MI_00\6&157c6e38&0&0000 {4340A6C5-93FA-4706-972C-7B648008A5A7; 10}: Strings First line: USB\VID_09DA&PID_000A\5&15c311e1&0&3 {AFD97640-86A3-4210-B67C-289C41AABE55; 2}: Bool 0 {8C7ED206-3F8A-4827-B3AB-AE9E1FAEFC6C; 2}: GUID {23447943-B752-11E7-B8FD-806E6F6E6963} {540B947E-8B40-45BC-A8A2-6A0B894CBDA2; 5}: Bool 1 {540B947E-8B40-45BC-A8A2-6A0B894CBDA2; 6}: Bool 0 {83DA6326-97A6-4088-9453-A1923F573B29; 15}: Bool 1 {540B947E-8B40-45BC-A8A2-6A0B894CBDA2; 16}: Bool 0 {540B947E-8B40-45BC-A8A2-6A0B894CBDA2; 8}: Uint 2026182162 {8C7ED206-3F8A-4827-B3AB-AE9E1FAEFC6C; 4}: Bool 0 {540B947E-8B40-45BC-A8A2-6A0B894CBDA2; 14}: Strings First line: \Driver\usbccgp {3464F7A4-2444-40B1-980A-E0903CB6D912; 10}: Uint 3 {540B947E-8B40-45BC-A8A2-6A0B894CBDA2; 4}: String USB Multimedia Keyboard {540B947E-8B40-45BC-A8A2-6A0B894CBDA2; 7}: String usb.inf:USB\COMPOSITE,Composite.Dev.NT {540B947E-8B40-45BC-A8A2-6A0B894CBDA2; 9}: (Binary data) {540B947E-8B40-45BC-A8A2-6A0B894CBDA2; 10}: String \_SB.PCI0.XHC.RHUB.HS06 {80497100-8C73-48B9-AAD9-CE387E19C56E; 6}: Uint 0 {80497100-8C73-48B9-AAD9-CE387E19C56E; 7}: Other Type: 0x9 {83DA6326-97A6-4088-9453-A1923F573B29; 3}: String usb.inf:392c3d53461eda3a:Composite.Dev.NT:10.0.15063.674:USB\COMPOSITE {83DA6326-97A6-4088-9453-A1923F573B29; 10}: String USB\ROOT_HUB30\4&1ed8c4ae&0&0 {83DA6326-97A6-4088-9453-A1923F573B29; 100}: Other Type: 0x10 {83DA6326-97A6-4088-9453-A1923F573B29; 101}: Other Type: 0x10 {83DA6326-97A6-4088-9453-A1923F573B29; 102}: Other Type: 0x10 {A45C254E-DF1C-4EFD-8020-67D146A850E0; 37}: Strings First line: PCIROOT(0)#PCI(1400)#USBROOT(0)#USB(6) {A8B865DD-2E3D-4094-AD97-E593A70C75D6; 2}: Other Type: 0x10 {A8B865DD-2E3D-4094-AD97-E593A70C75D6; 3}: String 10.0.15063.674 {A8B865DD-2E3D-4094-AD97-E593A70C75D6; 4}: String USB Composite Device {A8B865DD-2E3D-4094-AD97-E593A70C75D6; 5}: String usb.inf {A8B865DD-2E3D-4094-AD97-E593A70C75D6; 6}: String Composite.Dev.NT {A8B865DD-2E3D-4094-AD97-E593A70C75D6; 8}: String USB\COMPOSITE {A8B865DD-2E3D-4094-AD97-E593A70C75D6; 9}: String Microsoft {A8B865DD-2E3D-4094-AD97-E593A70C75D6; 14}: Uint 16719875 Для продолжения нажмите любую клавишу . . .
Свойства определяются по значениям DEVPROPKEY. Чтобы понять, что это за свойство, нужно сравнить его с константами из Devpkey.h (например, Matching Device ID - это DEVPKEY_Device_MatchingDeviceId).

Комментариев нет:

Отправить комментарий