Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Привязка к серийному номеру HDD


Автор: djman2006 20.7.2007, 13:38
Пишу одну софтину и очень хотелось бы чтоб она запускалась только на одном компютере. Только вот как привязать к железу не знаю, вроде как бы привязуют к SN винта, но не знаю как его считать. Помогите плс...

Автор: _hunter 20.7.2007, 13:51
нужно всего лиш воспользоваться поиском: темы о получении серийного номера жесткого диска уже поднимались...

Автор: djman2006 20.7.2007, 14:29
Нашол на паскале, и то там серийный номер тома, а мне надо HDD
Вот пример:
Model number: Maxtor 2F040L0                          
 Firmware rev: VAM51JJ0
 Serial number: F16WA2EE
нужно получить значение выделеное красным.

Автор: bsa 20.7.2007, 14:31
http://forum.vingrad.ru/act-Search/CODE/show/searchid-7e01be3b17d9db42e698167ec1008c8b/search_in-posts/result_type/topics/flag/search/highlite/%25D1%2581%25D0%25B5%25D1%2580%25D0%25B8%25D0%25B9%25D0%25BD%25D1%258B%25D0%25B9/index.html

Автор: djman2006 20.7.2007, 15:22
http://forum.vingrad.ru/forum/topic-103745/unread-1/hl/%25D1%2581%25D0%25B5%25D1%2580%25D0%25B8%25D0%25B9%25D0%25BD%25D0%25AB%25D0%25B9/index.html тема вопроса не решает  smile 
В других нашол на http://www.delphirus.com/modules.php?name=Pages&pa=showpage&pid=648 
И вааще куда не смотрю http://forum.vingrad.ru/act-Search/CODE/show/searchid-7e01be3b17d9db42e698167ec1008c8b/search_in-posts/result_type/topics/flag/search/highlite/%25D1%2581%25D0%25B5%25D1%2580%25D0%25B8%25D0%25B9%25D0%25BD%25D1%258B%25D0%25B9/index.html все говорят "Такая тема уже была" итд, но ни в одной решения не было  smile 
На делфи функция занемает 14 строчек кода, может ктото переведет?
Код

function GetHardDiskSerial(const DriveLetter: Char): string; 
var 
  NotUsed:     DWORD; 
  VolumeFlags: DWORD; 
  VolumeInfo:  array[0..MAX_PATH] of Char; 
  VolumeSerialNumber: DWORD; 
begin 
  GetVolumeInformation(PChar(DriveLetter + ':'), 
    nil, SizeOf(VolumeInfo), @VolumeSerialNumber, NotUsed, 
    VolumeFlags, nil, 0); 
  Result := Format('Label = %s   VolSer = %8.8X', 
    [VolumeInfo, VolumeSerialNumber]) 
end; 


ЗЫ Простите за мой плохой русский

Автор: bsa 20.7.2007, 15:29
GetVolumeInformation возвращет серийный номер раздела, а не диска.
Серийный номер жесткого диска можно узнать только обратившись напрямую к драйверу контроллера жестких дисков, если, конечно, этот драйвер имеет возможность вернуть серийник.

Добавлено через 2 минуты и 23 секунды
Может это тебе поможет: http://msdn2.microsoft.com/en-us/library/aa363216.aspx

Автор: djman2006 20.7.2007, 15:42
Кое что нашол:
Код

  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);
                done = TRUE;
             }

Ето кусок http://www.winsim.com/diskid32/diskid32.cpp
Только как его сформировать в функцию, и заставить работать...

Автор: djman2006 20.7.2007, 22:32
bsa , спс DeviceIoControl реально помог  smile 

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