На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела FAQ в группе разделов С++.
1. Раздел FAQ предназначен для публикации готовых статей.
2. Здесь нельзя задавать вопросы, для этого существуют соответствующие разделы:
Чистый С++
Visual C++ / MFC / WTL / WinApi
Borland C++ Builder
COM / DCOM / ActiveX / ATL
Сопутствующие вопросы
3. Внимание, все темы и сообщения в разделе премодерируются. Любое сообщение или тема будут видны остальным участникам только после одобрения модератора.
Модераторы: B.V., Qraizer
  
> Получить инфо о серийном номере, производителе и названии USB Storage Device , тема для FAQ
    Получить инфо о серийном номере, производителе и названии USB Storage Device.
    Если тестируемый диск является съёмным диском USB Storage Device(флешка, телефон, mp3-плеер и т.д.) функция PrintFlashDriveInfo печатает название производителя устройства, название продукта и серийный номер устройства. Если диск не является USB Storage Device, то выводится об этом сообщение. Функция работает с полным контролем ошибок.

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

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


    PrintFlashDriveInfo
    ExpandedWrap disabled
      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);
         }
      }


    Использование
    ExpandedWrap disabled
         PrintFlashDriveInfo(_T('G'));
         PrintFlashDriveInfo(_T('C'));
         PrintFlashDriveInfo(_T('H'));
         PrintFlashDriveInfo(_T('I'));



    Полный исходный код
    ExpandedWrap disabled
      #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.
    Сообщение отредактировано: neokoder -
    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
    0 пользователей:


    Рейтинг@Mail.ru
    [ Script execution time: 0,0231 ]   [ 15 queries used ]   [ Generated: 28.03.24, 16:21 GMT ]