Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Серийный номер флэшки

350
14 ноября 2007 года
cheburator
589 / / 01.06.2006
Есть какая-то возможность узнать серийный номер флэш-карты?
Точнее, задача обстоит так. Нужно найти все флэш-устройства и опросить их серийный номер.
342
15 ноября 2007 года
Yos
209 / / 21.06.2003
Во первых определить основные параметры устройств и выбрать флэшку можно использовав

GetDriveType
GetVolumeInformation

Потом использовать WMI

Win32_PhysicalMedia Class...

Блоее подробно можно почитать начиная вот отсюда http://msdn2.microsoft.com/en-us/library/aa394346.aspx и далее по логике продвижения мысли...

Успехов...
489
15 ноября 2007 года
NeO_u
277 / / 11.10.2006
Вот код получение серийного номера ХДД, думаю, по аналогии можно получить серийник флехи:
HDDserial.cpp
Код:
//---------------------------------------------------------------------------

#include <vcl.h>
#include <stdio.h>
#include <iostream.h>
#include <winioctl.h>
#include "HDDSerial.h"
cHDD Hdd;
using namespace std;
//---------------------------------------------------------------------------
//#define PRINTING_TO_CONSOLE_ALLOWED

char * cHDD::flipAndCodeBytes (char * str)
{
    static char flipped [1000];
    int i = 0;
    int j = 0;
    int k = 0;
    int num = strlen (str);

    strcpy (flipped, "");
    for (i = 0; i < num; i += 4)
    {
        for (j = 1; j >= 0; j--)
        {
            int sum = 0;
            for (k = 0; k < 2; k++)
            {
                sum *= 16;
                switch (str [i + j * 2 + k])
                {
                case '0': sum += 0; break;
                case '1': sum += 1; break;
                case '2': sum += 2; break;
                case '3': sum += 3; break;
                case '4': sum += 4; break;
                case '5': sum += 5; break;
                case '6': sum += 6; break;
                case '7': sum += 7; break;
                case '8': sum += 8; break;
                case '9': sum += 9; break;
                case 'a': sum += 10; break;
                case 'b': sum += 11; break;
                case 'c': sum += 12; break;
                case 'd': sum += 13; break;
                case 'e': sum += 14; break;
                case 'f': sum += 15; break;
                case 'A': sum += 10; break;
                case 'B': sum += 11; break;
                case 'C': sum += 12; break;
                case 'D': sum += 13; break;
                case 'E': sum += 14; break;
                case 'F': sum += 15; break;
                }
            }
            if (sum > 0)
            {
                char sub [2];
                sub [0] = (char) sum;
                sub [1] = 0;
                strcat (flipped, sub);
            }
        }
    }

    return flipped;
}
char* cHDD::ReadPhysicalDriveInNTWithZeroRights (int drive)
{
//   int drive = 0;
    char *serialNumber = new char[1000];
    HANDLE hPhysicalDriveIOCTL = 0;

         //  Try to get a handle to PhysicalDrive IOCTL, report failure
         //  and exit if can't.
    char driveName [256];

    sprintf (driveName, "\\\\.\\PhysicalDrive%d", drive);

         //  Windows NT, Windows 2000, Windows XP - admin rights not required
    hPhysicalDriveIOCTL = CreateFile (driveName, 0,
                               FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
                               OPEN_EXISTING, 0, NULL);
      // if (hPhysicalDriveIOCTL == INVALID_HANDLE_VALUE)
      //    printf ("Unable to open physical drive %d, error code: 0x%lX\n",
      //            drive, GetLastError ());

      if (hPhysicalDriveIOCTL != INVALID_HANDLE_VALUE)
      {
         STORAGE_PROPERTY_QUERY query;
         DWORD cbBytesReturned = 0;
         char buffer [10000];

         memset ((void *) & query, 0, sizeof (query));
         query.PropertyId = StorageDeviceProperty;
         query.QueryType = PropertyStandardQuery;

         memset (buffer, 0, sizeof (buffer));

         if ( DeviceIoControl (hPhysicalDriveIOCTL, IOCTL_STORAGE_QUERY_PROPERTY,
                   & query,
                   sizeof (query),
                   & buffer,
                   sizeof (buffer),
                   & cbBytesReturned, NULL) )
         {        
             STORAGE_DEVICE_DESCRIPTOR * descrip = (STORAGE_DEVICE_DESCRIPTOR *) & buffer;
//           char serialNumber [1000];
             char modelNumber [1000];

             strcpy (serialNumber,
                     flipAndCodeBytes ( & buffer [descrip -> SerialNumberOffset]));
             strcpy (modelNumber, & buffer [descrip -> ProductIdOffset]);
             if (0 == HardDriveSerialNumber [0] &&
                        //  serial number must be alphanumeric
                        //  (but there can be leading spaces on IBM drives)
                   (isalnum (serialNumber [0]) || isalnum (serialNumber [19])))
             {
                strcpy (HardDriveSerialNumber, serialNumber);
                strcpy (HardDriveModelNumber, modelNumber);
             }
#ifdef PRINTING_TO_CONSOLE_ALLOWED
             printf ("\n**** STORAGE_DEVICE_DESCRIPTOR for drive %d ****\n"
                     "Vendor Id = %s\n"
                     "Product Id = %s\n"
                     "Product Revision = %s\n"
                     "Serial Number = %s\n",
                     drive,
                     & buffer [descrip -> VendorIdOffset],
                     & buffer [descrip -> ProductIdOffset],
                     & buffer [descrip -> ProductRevisionOffset],
                     serialNumber);
#endif
         }
         else
         {
             DWORD err = GetLastError ();
#ifdef PRINTING_TO_CONSOLE_ALLOWED
             printf ("\nDeviceIOControl IOCTL_STORAGE_QUERY_PROPERTY error = %d\n", err);
#endif
         }

         memset (buffer, 0, sizeof (buffer));

         if ( DeviceIoControl (hPhysicalDriveIOCTL, IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER,
                   NULL,
                   0,
                   & buffer,
                   sizeof (buffer),
                   & cbBytesReturned, NULL) )
         {
     MEDIA_SERIAL_NUMBER_DATA * mediaSerialNumber =
                            (MEDIA_SERIAL_NUMBER_DATA *) & buffer;
//           char serialNumber [1000];
             // char modelNumber [1000];

             strcpy (serialNumber, (char *) mediaSerialNumber -> SerialNumberData);
             // strcpy (modelNumber, & buffer [descrip -> ProductIdOffset]);
             if (0 == HardDriveSerialNumber [0] &&
                        //  serial number must be alphanumeric
                        //  (but there can be leading spaces on IBM drives)
                   (isalnum (serialNumber [0]) || isalnum (serialNumber [19])))
             {
                strcpy (HardDriveSerialNumber, serialNumber);
                // strcpy (HardDriveModelNumber, modelNumber);
             }
#ifdef PRINTING_TO_CONSOLE_ALLOWED
             printf ("\n**** MEDIA_SERIAL_NUMBER_DATA for drive %d ****\n"
                     "Serial Number = %s\n",
                     drive, serialNumber);
#endif
         }
         else
         {
             DWORD err = GetLastError ();
#ifdef PRINTING_TO_CONSOLE_ALLOWED
             switch (err)
             {
             case 1:
                 printf ("\nDeviceIOControl IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER error = \n"
                            "              The request is not valid for this device.\n\n");
                 break;
             case 50:
                 printf ("\nDeviceIOControl IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER error = \n"
                            "              The request is not supported for this device.\n\n");
                 break;
             default:
                 printf ("\nDeviceIOControl IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER error = %d\n\n", err);
             }
#endif
         }

         CloseHandle (hPhysicalDriveIOCTL);
      }
   while(serialNumber[0] == ' ')
    *serialNumber++;

   return serialNumber;
}
//---------------------------------------------------------------------------


HDDserial.h
Код:
#ifndef _HDDSERIAL
#define _HDDSERIAL
    class cHDD
    {
        private:
            typedef struct _MEDIA_SERAL_NUMBER_DATA
            {
                ULONG  SerialNumberLength;
                ULONG  Result;
                ULONG  Reserved[2];
                UCHAR  SerialNumberData[1];
            } MEDIA_SERIAL_NUMBER_DATA, *PMEDIA_SERIAL_NUMBER_DATA;
            char HardDriveSerialNumber [1024];
            char HardDriveModelNumber [1024];
            char * flipAndCodeBytes (char * str);
        public:
            char* ReadPhysicalDriveInNTWithZeroRights (int drive);
    };
    extern cHDD Hdd;
#endif
342
15 ноября 2007 года
Yos
209 / / 21.06.2003
Вот только вспомнил что можно DeviceIoControl поюзать... (хотя там есть интересный момент при определении CD / DVD параметров. Там в лоб с ВМВ не проходит. Как с флэшкой не знаю)

Так что код от NeO_u надо еще погонять :), и надо правильно определить \\\\.\\PhysicalDrive%d...

ЗЫ Самому стало интересно вернуться к тому чего давно не делал...
489
15 ноября 2007 года
NeO_u
277 / / 11.10.2006
Цитата: Yos
Вот только вспомнил что можно DeviceIoControl поюзать... (хотя там есть интересный момент при определении CD / DVD параметров. Там в лоб с ВМВ не проходит. Как с флэшкой не знаю)

Так что код от NeO_u надо еще погонять :), и надо правильно определить \\\\.\\PhysicalDrive%d...

ЗЫ Самому стало интересно вернуться к тому чего давно не делал...



Код протестирован и успешно используется в некоторых крупных проектах:-) пока что жалоб не поступало:-)

342
15 ноября 2007 года
Yos
209 / / 21.06.2003
Жалоба №1 - IOCTL_STORAGE_QUERY_PROPERTY мало где (среды разработки) прописан. На МСДН точно нет даже намека на него...

Жалоба № 2 - IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER - выдает 1 код ошибки...

:)))
489
15 ноября 2007 года
NeO_u
277 / / 11.10.2006
Цитата: Yos
Жалоба №1 - IOCTL_STORAGE_QUERY_PROPERTY мало где (среды разработки) прописан. На МСДН точно нет даже намека на него...

Жалоба № 2 - IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER - выдает 1 код ошибки...

:)))


1) #define IOCTL_STORAGE_QUERY_PROPERTY CTL_CODE(IOCTL_STORAGE_BASE, 0x0500, METHOD_BUFFERED, FILE_ANY_ACCESS)
2) #define IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER CTL_CODE(IOCTL_STORAGE_BASE, 0x0304, METHOD_BUFFERED, FILE_ANY_ACCESS)

Не знаю, как ты искал:-)

342
15 ноября 2007 года
Yos
209 / / 21.06.2003
У меня в Microsoft Platform SDK IOCTL_STORAGE_QUERY_PROPERTY нет как такового :(

А оборудование запрос по IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER просто не обрабатывает и выдает 1 в вашем примере (а в описании есть), пробовал в другом программном коде - результат тот же, хотя "физику" устройств выдает нормально...

ЗЫ Извиняюсь за оффтоп (прочитал откуда) там бюст Дзержинского на входе в метро со стороны площади/гостиницы/и бывщего здания горкома партии :) еще не убрали (я там раньше жил, и на 2 ездил в ХАИ, хорошие были времена...)
342
16 ноября 2007 года
Yos
209 / / 21.06.2003
NeO_u, кстати, Ваш пример это вырезка из DiskId32.exe (winsim.com - там можно ее исходник нарыть) но она работать (именно выдавать сенийник а все остальное там нормально показывается) не будет из-за отсутствия административных прав (проверил на своей компиляции)...

В полном исходнике есть процедурина ReadPhysicalDriveInNTWithAdminRights которая выдает все и правильно, но... Для USB Drive скорее всего надо определять новую "переменную" типа IDE_*_IDENTIFY... хотя,...

Вообщем буду пробовать дальше, а вдруг как говориться :)
350
21 ноября 2007 года
cheburator
589 / / 01.06.2006
Цитата: NeO_u
Вот код получение серийного номера ХДД...


Спасибо, конечно, но не стоило опускаться до столь подробного кода,
достаточно было рассказать об особенностях CreateFile при работе с устройствами и отправить меня читать DeviceIoControl :)

P. S. Всем спасибо, завтра на трезвую голову разберу, если будут вопросы - продолжим разговор :)

489
21 ноября 2007 года
NeO_u
277 / / 11.10.2006
Цитата: cheburator
Спасибо, конечно, но не стоило опускаться до столь подробного кода,
достаточно было рассказать об особенностях CreateFile при работе с устройствами и отправить меня читать DeviceIoControl :)

P. S. Всем спасибо, завтра на трезвую голову разберу, если будут вопросы - продолжим разговор :)



Мне не жалко:-)

ЗЫ: Всегда пожалуйста.

7
22 ноября 2007 года
@pixo $oft
3.4K / / 20.09.2006
А чем не нравится открыть диск как файл и из начала прочитать серийник?
27K
27 ноября 2007 года
molod
3 / / 29.05.2007
Это как "открыть диск как файл"?
489
27 ноября 2007 года
NeO_u
277 / / 11.10.2006
Цитата: molod
Это как "открыть диск как файл"?



Помойму, это как раз, то, что предложено в моем коде:

 
Код:
hPhysicalDriveIOCTL = CreateFile (driveName, 0,
                               FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
                               OPEN_EXISTING, 0, NULL);

где driveName - имя нашего диска.
86K
25 октября 2012 года
Lexx8665
1 / / 24.10.2012
Кто-нибудь,подскажите,пож-ста,как избавиться от этих ошибок при компиляции кода,предоставленного NeO_u:
"
[C++ Error] HDDserial.cpp(93): E2451 Undefined symbol 'STORAGE_PROPERTY_QUERY'
[C++ Error] HDDserial.cpp(97): E2451 Undefined symbol 'query'
[C++ Error] HDDserial.cpp(98): E2451 Undefined symbol 'StorageDeviceProperty'
[C++ Error] HDDserial.cpp(99): E2451 Undefined symbol 'PropertyStandardQuery'
[C++ Error] HDDserial.cpp(103): E2451 Undefined symbol 'IOCTL_STORAGE_QUERY_PROPERTY'
[C++ Error] HDDserial.cpp(110): E2451 Undefined symbol 'STORAGE_DEVICE_DESCRIPTOR'
[C++ Error] HDDserial.cpp(110): E2451 Undefined symbol 'descrip'
"
Моя среда разработки С++Builder6.0 Enterprise Siute. И будет ли корректно работать код под OS: WinXP Home Edition ServicePack 3?
70K
25 октября 2012 года
ProkletyiPirat
76 / / 25.07.2012
Цитата: Lexx8665
Кто-нибудь,подскажите,пож-ста,как избавиться от этих ошибок при компиляции кода,предоставленного NeO_u:
"
[C++ Error] HDDserial.cpp(93): E2451 Undefined symbol 'STORAGE_PROPERTY_QUERY'
[C++ Error] HDDserial.cpp(97): E2451 Undefined symbol 'query'
[C++ Error] HDDserial.cpp(98): E2451 Undefined symbol 'StorageDeviceProperty'
[C++ Error] HDDserial.cpp(99): E2451 Undefined symbol 'PropertyStandardQuery'
[C++ Error] HDDserial.cpp(103): E2451 Undefined symbol 'IOCTL_STORAGE_QUERY_PROPERTY'
[C++ Error] HDDserial.cpp(110): E2451 Undefined symbol 'STORAGE_DEVICE_DESCRIPTOR'
[C++ Error] HDDserial.cpp(110): E2451 Undefined symbol 'descrip'
"
Моя среда разработки С++Builder6.0 Enterprise Siute. И будет ли корректно работать код под OS: WinXP Home Edition ServicePack 3?



у тебя пишет что не определены переменные, и перечисляет какие именно
или
1)либо не прописал их
или
2)не подрубил какой-то заголовок
а вообще или гугл переводчик
или юзаем поиск по ошибки как искать в гугле?

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог