Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2007.02.04;
Скачать: [xml.tar.bz2];

Вниз

Считать серийник винта   Найти похожие ветки 

 
Alex_AA ©   (2006-09-11 12:40) [0]

Добрый день. Прошу помочь. С помощью какой функции можно определить серийный номер (заводской номер) жесткого диска?
Это необходимо для защиты приложения.


 
PSPF2003 ©   (2006-09-11 13:24) [1]

GetVolumeInformation?


 
Alex Konshin ©   (2006-09-11 14:53) [2]

Традиционый ответ: сходить на сайт, указаный в моей анкете.


 
NickCoder ©   (2006-09-21 21:56) [3]

GetVolumeInformation()!  Я так делал.


 
DC-AC   (2006-09-22 07:24) [4]

>Это необходимо для защиты приложения.

А вот это плохой способ защиты. Пользователю пока ещё никто не запрещал  менять HDD у себя на машине.
XXI век уже на дворе, пора бросать замашки "подвальных" программеров начала 90-х...


 
Alex Konshin ©   (2006-09-22 08:01) [5]

> NickCoder ©   (21.09.06 21:56) [3]
> GetVolumeInformation()!  Я так делал.

Это не серийный номер винчестера.
Правильное решение - у меня на сайте.


 
PEAKTOP ©   (2006-09-22 16:04) [6]

{ **** UBPFD *********** by delphibase.endimus.com ****
>> Поличение серийного номера IDE диска.


{Зависимости: Windows, SysUtils
Автор: Alex Konshin, akonshin@earthlink.net, Boston, USA
Copyright: http://home.earthlink.net/~akonshin/index.htm
Дата: 30 декабря 2002 г.
***************************************************** }

function GetIdeDiskSerialNumber : String;
type
 TSrbIoControl = packed record
   HeaderLength : ULONG;
   Signature : Array[0..7] of Char;
   Timeout : ULONG;
   ControlCode : ULONG;
   ReturnCode : ULONG;
   Length : ULONG;
 end;
 SRB_IO_CONTROL = TSrbIoControl;
 PSrbIoControl = ^TSrbIoControl;

 TIDERegs = packed record
   bFeaturesReg : Byte; // Used for specifying SMART "commands".
   bSectorCountReg : Byte; // IDE sector count register
   bSectorNumberReg : Byte; // IDE sector number register
   bCylLowReg : Byte; // IDE low order cylinder value
   bCylHighReg : Byte; // IDE high order cylinder value
   bDriveHeadReg : Byte; // IDE drive/head register
   bCommandReg : Byte; // Actual IDE command.
   bReserved : Byte; // reserved for future use. Must be zero.
 end;
 IDEREGS = TIDERegs;
 PIDERegs = ^TIDERegs;

 TSendCmdInParams = packed record
   cBufferSize : DWORD; // Buffer size in bytes
   irDriveRegs : TIDERegs; // Structure with drive register values.
   bDriveNumber : Byte; // Physical drive number to send command to (0,1,2,3).
   bReserved : Array[0..2] of Byte; // Reserved for future expansion.
   dwReserved : Array[0..3] of DWORD; // For future use.
   bBuffer : Array[0..0] of Byte; // Input buffer.
 end;
 SENDCMDINPARAMS = TSendCmdInParams;
 PSendCmdInParams = ^TSendCmdInParams;

 TIdSector = packed record
   wGenConfig : Word;
   wNumCyls : Word;
   wReserved : Word;
   wNumHeads : Word;
   wBytesPerTrack : Word;
   wBytesPerSector : Word;
   wSectorsPerTrack : Word;
   wVendorUnique : Array[0..2] of Word;
   sSerialNumber : Array[0..19] of Char;
   wBufferType : Word;
   wBufferSize : Word;
   wECCSize : Word;
   sFirmwareRev : Array[0..7] of Char;
   sModelNumber : Array[0..39] of Char;
   wMoreVendorUnique : Word;
   wDoubleWordIO : Word;
   wCapabilities : Word;
   wReserved1 : Word;
   wPIOTiming : Word;
   wDMATiming : Word;
   wBS : Word;
   wNumCurrentCyls : Word;
   wNumCurrentHeads : Word;
   wNumCurrentSectorsPerTrack : Word;
   ulCurrentSectorCapacity : ULONG;
   wMultSectorStuff : Word;
   ulTotalAddressableSectors : ULONG;
   wSingleWordDMA : Word;
   wMultiWordDMA : Word;
   bReserved : Array[0..127] of Byte;
 end;
 PIdSector = ^TIdSector;

const
 IDE_ID_FUNCTION = $EC;
 IDENTIFY_BUFFER_SIZE = 512;
 DFP_RECEIVE_DRIVE_DATA = $0007c088;
 IOCTL_SCSI_MINIPORT = $0004d008;
 IOCTL_SCSI_MINIPORT_IDENTIFY = $001b0501;
 DataSize = sizeof(TSendCmdInParams)-1+IDENTIFY_BUFFER_SIZE;
 BufferSize = SizeOf(SRB_IO_CONTROL)+DataSize;
 W9xBufferSize = IDENTIFY_BUFFER_SIZE+16;
var
 hDevice : THandle;
 cbBytesReturned : DWORD;
 pInData : PSendCmdInParams;
 pOutData : Pointer; // PSendCmdInParams;
 Buffer : Array[0..BufferSize-1] of Byte;
 srbControl : TSrbIoControl absolute Buffer;

 procedure ChangeByteOrder( var Data; Size : Integer );
 var ptr : PChar;
     i : Integer;
     c : Char;
 begin
   ptr := @Data;
   for i := 0 to (Size shr 1)-1 do
   begin
     c := ptr^;
     ptr^ := (ptr+1)^;
     (ptr+1)^ := c;
     Inc(ptr,2);
   end;
 end;

begin
 Result := "";
 FillChar(Buffer,BufferSize,#0);
 if Win32Platform=VER_PLATFORM_WIN32_NT then
   begin // Windows NT, Windows 2000
     // Get SCSI port handle
     hDevice := CreateFile( "\\.\Scsi0:", GENERIC_READ or GENERIC_WRITE,
       FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0 );
     if hDevice=INVALID_HANDLE_VALUE then Exit;
     try
       srbControl.HeaderLength := SizeOf(SRB_IO_CONTROL);
       System.Move("SCSIDISK",srbControl.Signature,8);
       srbControl.Timeout := 2;
       srbControl.Length := DataSize;
       srbControl.ControlCode := IOCTL_SCSI_MINIPORT_IDENTIFY;
       pInData := PSendCmdInParams(PChar(@Buffer)+SizeOf(SRB_IO_CONTROL));
       pOutData := pInData;
       with pInData^ do
       begin
         cBufferSize := IDENTIFY_BUFFER_SIZE;
         bDriveNumber := 0;
         with irDriveRegs do
         begin
           bFeaturesReg := 0;
           bSectorCountReg := 1;
           bSectorNumberReg := 1;
           bCylLowReg := 0;
           bCylHighReg := 0;
           bDriveHeadReg := $A0;
           bCommandReg := IDE_ID_FUNCTION;
         end;
       end;
       if not DeviceIoControl( hDevice, IOCTL_SCSI_MINIPORT, @Buffer,
         BufferSize, @Buffer, BufferSize, cbBytesReturned, nil ) then Exit;
     finally
       CloseHandle(hDevice);
     end;
   end
 else
   begin // Windows 95 OSR2, Windows 98
     hDevice := CreateFile( "\\.\SMARTVSD", 0, 0, nil, CREATE_NEW, 0, 0 );
     if hDevice=INVALID_HANDLE_VALUE then Exit;
     try
       pInData := PSendCmdInParams(@Buffer);
       pOutData := PChar(@pInData^.bBuffer);
       with pInData^ do
       begin
         cBufferSize := IDENTIFY_BUFFER_SIZE;
         bDriveNumber := 0;
         with irDriveRegs do
         begin
           bFeaturesReg := 0;
           bSectorCountReg := 1;
           bSectorNumberReg := 1;
           bCylLowReg := 0;
           bCylHighReg := 0;
           bDriveHeadReg := $A0;
           bCommandReg := IDE_ID_FUNCTION;
         end;
       end;
       if not DeviceIoControl( hDevice, DFP_RECEIVE_DRIVE_DATA, pInData,  
          SizeOf(TSendCmdInParams)-1, pOutData, W9xBufferSize,
          cbBytesReturned, nil ) then Exit;
     finally
       CloseHandle(hDevice);
     end;
   end;
   with PIdSector(PChar(pOutData)+16)^ do
   begin
     ChangeByteOrder(sSerialNumber,SizeOf(sSerialNumber));
     SetString(Result,sSerialNumber,SizeOf(sSerialNumber));
   end;
end;

Пример использования:

var s : String;
   rc : DWORD;
begin
 s := GetIdeDiskSerialNumber;
 if s="" then
   begin
     rc := GetLastError;
     if rc=0 then WriteLn("IDE drive is not support SMART feature")
     else WriteLn(SysErrorMessage(rc));
   end
 else WriteLn("Disk serial number: """, s,"""");
end.  

Автор: Alex Konshin, akonshin@earthlink.net, Boston, USA


 
Alex Konshin ©   (2006-09-23 11:46) [7]

Я бы все-таки посоветовал на моем сайте брать. Я не могу ручаться за то, что в других местах будет именно последняя версия.



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2007.02.04;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.049 c
6-1156932781
BFG9k
2006-08-30 14:13
2007.02.04
Генерирование изображений с помощью IdHTTPServer


15-1168361722
Alexis
2007-01-09 19:55
2007.02.04
Две книги по AI (ИИ)


8-1149657707
Dr. Andrew
2006-06-07 09:21
2007.02.04
Как читать или конвертировать rm/ram к wav?


4-1157964007
Alex_AA
2006-09-11 12:40
2007.02.04
Считать серийник винта


15-1168954110
Black_Live
2007-01-16 16:28
2007.02.04
Что тварят, Что тварят!?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский