Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > C/C++ FAQ > Получить инфо о серийном номере, производителе и названии USB Storage Device


Автор: neokoder 26.02.12, 13:14
Получить инфо о серийном номере, производителе и названии USB Storage Device.
Если тестируемый диск является съёмным диском USB Storage Device(флешка, телефон, mp3-плеер и т.д.) функция PrintFlashDriveInfo печатает название производителя устройства, название продукта и серийный номер устройства. Если диск не является USB Storage Device, то выводится об этом сообщение. Функция работает с полным контролем ошибок.

При необходимости получения выходных параметров(серийный номер, вендор, название) в качестве переменных вместо печати, функция легко переделывается: можно ввести дополнительный выходной параметр-структуру из 3-х строк и их размеров и заполнять её вместо печати.

Примечание: при получении инфо о USB-устройстве таким способом, иногда внешний жесткий диск также может определиться как съёмное USB-устройство. В этом случае можно ввести доп. проверку того является ли диск съёмным USB Storage Device (1 Способ по ссылке)


PrintFlashDriveInfo
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    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);
       }
    }


Использование
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
       PrintFlashDriveInfo(_T('G'));
       PrintFlashDriveInfo(_T('C'));
       PrintFlashDriveInfo(_T('H'));
       PrintFlashDriveInfo(_T('I'));



Полный исходный код
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    #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. учитывая "просьбы" :) код передалан из универсального(работающего как с UNICODE так и с обычной 8-ми битовой ANSI-строкой) в код работающий только с UNICODE.

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)