
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.14.89] |
![]() |
|
Сообщ.
#1
,
|
|
|
Получить инфо о серийном номере, производителе и названии USB Storage Device.
Если тестируемый диск является съёмным диском USB Storage Device(флешка, телефон, mp3-плеер и т.д.) функция PrintFlashDriveInfo печатает название производителя устройства, название продукта и серийный номер устройства. Если диск не является USB Storage Device, то выводится об этом сообщение. Функция работает с полным контролем ошибок. При необходимости получения выходных параметров(серийный номер, вендор, название) в качестве переменных вместо печати, функция легко переделывается: можно ввести дополнительный выходной параметр-структуру из 3-х строк и их размеров и заполнять её вместо печати. Примечание: при получении инфо о USB-устройстве таким способом, иногда внешний жесткий диск также может определиться как съёмное USB-устройство. В этом случае можно ввести доп. проверку того является ли диск съёмным USB Storage Device (1 Способ по ссылке) PrintFlashDriveInfo ![]() ![]() WCHAR* GetElem(WCHAR *ptr,WCHAR delim,WCHAR *buf) { WCHAR *ptr1=NULL; ptr1=wcschr(ptr,delim); if (ptr1) { wcsncpy(buf,ptr,(int)(ptr1-ptr)); buf[(int)(ptr1-ptr)]=0; return (ptr1+1); } else { wcscpy(buf,ptr); return NULL; } } //Входные данные: // drive_letter - буква диска void PrintFlashDriveInfo(WCHAR drive_letter) { HKEY hk=NULL; LONG Ret=0; HANDLE hdrive=INVALID_HANDLE_VALUE; DWORD data_size,dtype; WCHAR *data=NULL,*buf1=NULL,*buf2=NULL; WCHAR *ptr1_1=NULL,*ptr1_2=NULL,*ptr2_1=NULL,*ptr2_2=NULL; WCHAR dos_link[50]; WCHAR drive_name2[20]; __try { //проверяем существует ли диск в системе wsprintf(drive_name2,L"\\\\.\\%c:",drive_letter); hdrive = CreateFileW(drive_name2,0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if (hdrive==INVALID_HANDLE_VALUE) { wprintf(L"Ошибка PrintFlashDriveInfo: Ошибка CreateFile: %u\n\n",GetLastError()); __leave; } CloseHandle(hdrive); Ret = RegOpenKeyExW(HKEY_LOCAL_MACHINE,L"SYSTEM\\MountedDevices",0,KEY_READ,&hk); if (Ret!=ERROR_SUCCESS) { wprintf(L"Ошибка PrintFlashDriveInfo: Ошибка RegOpenKeyEx: %u\n\n",Ret); __leave; } wsprintf(dos_link,L"\\DosDevices\\%c:",drive_letter); Ret=RegQueryValueExW(hk,dos_link,NULL,&dtype,NULL,&data_size); if (Ret==ERROR_SUCCESS) { data=(WCHAR *)malloc(data_size+2); buf1=(WCHAR *)malloc(data_size+2); buf2=(WCHAR *)malloc(data_size+2); if (data==NULL||buf1==NULL||buf2==NULL) { wprintf(L"Ошибка PrintFlashDriveInfo: Ошибка malloc.\n\n"); __leave; } memset(data,0,data_size+2); Ret=RegQueryValueExW(hk,dos_link,NULL,&dtype,(LPBYTE)data,&data_size); if (Ret!=ERROR_SUCCESS) { wprintf(L"Ошибка PrintFlashDriveInfo: Ошибка RegQueryValueEx: %u\n\n",Ret); __leave; } if(wcsstr(data,L"USBSTOR")!=NULL) { wprintf(L"Данные флеш-диска %c:\n",drive_letter); ptr1_1=GetElem(data,L'#',buf1); if (ptr1_1) { ptr1_2=GetElem(ptr1_1,L'#',buf1); ptr1_1=buf1; do { ptr2_2=GetElem(ptr1_1,L'&',buf2); if (wcsstr(buf2,L"Ven_")) wprintf(L"Производитель: %s\n",buf2+4); else if (wcsstr(buf2,L"Prod_")) wprintf(L"Название продукта: %s\n",buf2+5); ptr1_1=ptr2_2; } while (ptr2_2); ptr1_1=GetElem(ptr1_2,L'#',buf1); ptr1_1=buf1; do { ptr2_2=GetElem(ptr1_1,L'&',buf2); if (wcslen(buf2)>3) { wprintf(L"Серийный номер: %s\n",buf2); break; } ptr1_1=ptr2_2; } while (ptr2_2); } }//if USBSTOR else wprintf(L"Диск %c: НЕ является флешкой\n",drive_letter); } else wprintf(L"Ошибка PrintFlashDriveInfo: Ошибка RegQueryValueEx: %u\n",Ret); wprintf(L"\n"); } __finally { if (data!=NULL) free(data); if (buf1!=NULL) free(buf1); if (buf2!=NULL) free(buf2); if (hk!=NULL) RegCloseKey(hk); } } Использование ![]() ![]() PrintFlashDriveInfo(_T('G')); PrintFlashDriveInfo(_T('C')); PrintFlashDriveInfo(_T('H')); PrintFlashDriveInfo(_T('I')); Полный исходный код ![]() ![]() #define UNICODE #define _UNICODE #include <windows.h> #include <stdio.h> #include <conio.h> #include <locale.h> #include <WinIoCtl.h> WCHAR* GetElem(WCHAR *ptr,WCHAR delim,WCHAR *buf) { WCHAR *ptr1=NULL; ptr1=wcschr(ptr,delim); if (ptr1) { wcsncpy(buf,ptr,(int)(ptr1-ptr)); buf[(int)(ptr1-ptr)]=0; return (ptr1+1); } else { wcscpy(buf,ptr); return NULL; } } //Входные данные: // drive_letter - буква диска void PrintFlashDriveInfo(WCHAR drive_letter) { HKEY hk=NULL; LONG Ret=0; HANDLE hdrive=INVALID_HANDLE_VALUE; DWORD data_size,dtype; WCHAR *data=NULL,*buf1=NULL,*buf2=NULL; WCHAR *ptr1_1=NULL,*ptr1_2=NULL,*ptr2_1=NULL,*ptr2_2=NULL; WCHAR dos_link[50]; WCHAR drive_name2[20]; __try { //проверяем существует ли диск в системе wsprintf(drive_name2,L"\\\\.\\%c:",drive_letter); hdrive = CreateFileW(drive_name2,0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if (hdrive==INVALID_HANDLE_VALUE) { wprintf(L"Ошибка PrintFlashDriveInfo: Ошибка CreateFile: %u\n\n",GetLastError()); __leave; } CloseHandle(hdrive); Ret = RegOpenKeyExW(HKEY_LOCAL_MACHINE,L"SYSTEM\\MountedDevices",0,KEY_READ,&hk); if (Ret!=ERROR_SUCCESS) { wprintf(L"Ошибка PrintFlashDriveInfo: Ошибка RegOpenKeyEx: %u\n\n",Ret); __leave; } wsprintf(dos_link,L"\\DosDevices\\%c:",drive_letter); Ret=RegQueryValueExW(hk,dos_link,NULL,&dtype,NULL,&data_size); if (Ret==ERROR_SUCCESS) { data=(WCHAR *)malloc(data_size+2); buf1=(WCHAR *)malloc(data_size+2); buf2=(WCHAR *)malloc(data_size+2); if (data==NULL||buf1==NULL||buf2==NULL) { wprintf(L"Ошибка PrintFlashDriveInfo: Ошибка malloc.\n\n"); __leave; } memset(data,0,data_size+2); Ret=RegQueryValueExW(hk,dos_link,NULL,&dtype,(LPBYTE)data,&data_size); if (Ret!=ERROR_SUCCESS) { wprintf(L"Ошибка PrintFlashDriveInfo: Ошибка RegQueryValueEx: %u\n\n",Ret); __leave; } if(wcsstr(data,L"USBSTOR")!=NULL) { wprintf(L"Данные флеш-диска %c:\n",drive_letter); ptr1_1=GetElem(data,L'#',buf1); if (ptr1_1) { ptr1_2=GetElem(ptr1_1,L'#',buf1); ptr1_1=buf1; do { ptr2_2=GetElem(ptr1_1,L'&',buf2); if (wcsstr(buf2,L"Ven_")) wprintf(L"Производитель: %s\n",buf2+4); else if (wcsstr(buf2,L"Prod_")) wprintf(L"Название продукта: %s\n",buf2+5); ptr1_1=ptr2_2; } while (ptr2_2); ptr1_1=GetElem(ptr1_2,L'#',buf1); ptr1_1=buf1; do { ptr2_2=GetElem(ptr1_1,L'&',buf2); if (wcslen(buf2)>3) { wprintf(L"Серийный номер: %s\n",buf2); break; } ptr1_1=ptr2_2; } while (ptr2_2); } }//if USBSTOR else wprintf(L"Диск %c: НЕ является флешкой\n",drive_letter); } else wprintf(L"Ошибка PrintFlashDriveInfo: Ошибка RegQueryValueEx: %u\n",Ret); wprintf(L"\n"); } __finally { if (data!=NULL) free(data); if (buf1!=NULL) free(buf1); if (buf2!=NULL) free(buf2); if (hk!=NULL) RegCloseKey(hk); } } int wmain(int argc, WCHAR* argv[]) { setlocale(LC_ALL,"Russian"); PrintFlashDriveInfo(L'H'); PrintFlashDriveInfo(L'G'); PrintFlashDriveInfo(L'C'); PrintFlashDriveInfo(L'Я'); wprintf(L"Нажмите любую клавишу..."); _getch(); return 0; } p.s. учитывая "просьбы" ![]() |