Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Серийный номер диска [D7, WinXP]


dima1234 ©   (2005-08-08 16:49:00) 

Необходимо считать серийный номер CD-диска. Нужно это для создания защиты от копирования.
Поискал в инете, нашел, что надо плясать от DeviceIoControl, но документации не нашел...
Если кто-нибудь сталкивался с подобным вопросом, подскажите хоть что-нибудь.


dima1234   (2005-08-09 08:27:00) [1]

GetVolumeInformation не подходит, т.к. вместо серийника он возвращает номер файловой системы, кот. меняется при записи и остается при снятии образа.
А на болванке все таки есть уникальная ATIP информация, единственно ее можно получить если болванка не пустая.
Работа с DeviceIoControl упирается в Microsoft DDK, точнее в ntddcdrm.h, может у кого то есть ссылка на перелопаченный этот h на pas?
Или подскажите какие методы еще есть? Не хочеться писать отдельную dll с функцией проверки серийника...


Ded Moroz   (2005-08-08 21:52:00) [2]

2 dima1234

Должен тебя разочаровать. На CD-болванке НЕТ НИЧЕГО УНИКАЛЬНОГО!
Там просто пустая матрица. Серийный номер ЛЕГКО задается/копируется при записи. Я тоже раньше думал к номеру привязываться...


MetalFan   (2005-08-08 18:48:00) [3]

да только толка от этого мало...


MetalFan   (2005-08-08 18:47:00) [4]

GetHardDiskSerial
ага, и для ЦД тоже сработает %)


Poirot   (2005-08-08 17:37:00) [5]

Угу, тока вот этот номер корячится просто а потом где хранить то, с чем проверять?! :)
Вот через первое и пляши + см таки MSDK :)


Ботвин Дмитрий   (2005-08-08 17:10:00) [6]

Думается сначала надо узнать имя дисковода, а по ней серийный
номер, т.е:

Буква CD-ROM:
function GetFirstCDROMDrive: char;
var
  drivemap, mask: DWORD;
  i: integer;
  root: string;
begin
  Result := #0;
  root := 'A:\';
  drivemap := GetLogicalDrives;
  mask := 1;
  for i := 1 to 32 do
  begin
    if (mask and drivemap) <> 0 then
      if GetDriveType(PChar(root)) = DRIVE_CDROM then
      begin
        Result := root[1];
        Break;
      end;
    mask := mask shl 1;
    Inc(root[1]);
  end;
end;

А серийник:
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;


Наверх

Титульная страница Поиск, карта сайта Написать письмо