flash harddisk seri numarasın alma

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
brs
Üye
Mesajlar: 626
Kayıt: 04 Eki 2012 03:52

flash harddisk seri numarasın alma

Mesaj gönderen brs »

Selam, kafama takılan konu yardıma ihtiyacım var...

Programı kullanıcıya flash harddisk ile birlikte vereceğim, programı korumak için de şifreleme yöntemi olarak harddisk seri numarasını programa ekledim, hardisk numarası ve programdaki numaralar eşleşirse program sorunsuz olarak çalışacak buraya kadar sorun yok...

Sorun ise flash harddisk benim bilgisayarda ( I ) başka bir bilgisayara katıldığında E, F, Z gibi farklı isimler alabiliyor işte bu durumda bunu nasıl çözümleyebilirim...

Örnek:

Kod: Tümünü seç

procedure TForm1.HdClick(Sender: TObject);
var
  VolumeSerialNumber: DWORD;
  MaximumComponentLength: DWORD;
  FileSystemFlags: DWORD;
  TheSerialNumber: String;
begin
  if GetVolumeInformation('C:\', nil, 0, @VolumeSerialNumber,
    MaximumComponentLength, FileSystemFlags, nil, 0) then
  begin
    TheSerialNumber := IntToHex(HiWord(VolumeSerialNumber), 4) +
      IntToHex(LoWord(VolumeSerialNumber), 4);
    Edit1.Text := TheSerialNumber;
  end;
end;
İşi bilen yardım eder, az bilen akıl verir, bilmeyen eleştirir, yapamayan ise çamur atar...
Kullanıcı avatarı
mia
Üye
Mesajlar: 239
Kayıt: 17 Nis 2015 02:18

Re: flash harddisk seri numarasın alma

Mesaj gönderen mia »

you can use this unit

Kod: Tümünü seç

unit sysInfo;

interface
  Uses Windows, SysUtils;

  function GetIdeSerialNumber ():string;
  function Unique():string;
  function GetVolumeSerialNumber: string;
  function GetUniqueID:string;
var
  AppPath : String;
implementation

function GetVolumeSerialNumber: string;
var
  NotUsed, VolFlags: DWORD;
  VolSN: DWORD;
  VolumeSerialNumber: string;
begin
  SetCurrentDirectory(pChar(ExtractFilePath(AppPath)));
  GetVolumeInformation(nil, nil, 0, @VolSN, NotUsed, VolFlags, nil, 0);
  VolumeSerialNumber := AnsiUpperCase(IntToHex(VolSN, 8));
  Result := Copy(VolumeSerialNumber, 1, 4) + '-' + Copy(VolumeSerialNumber, 5, 4);
end;

function GetIdeSerialNumber ():string;
const IDENTIFY_BUFFER_SIZE = 512;
type
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;
TSendCmdInParams = packed record
{ Buffer size in bytes  }
cBufferSize : DWORD;
{ Structure with drive register values. }
irDriveRegs : TIDERegs;
{ Physical drive number to send command to (0,1,2,3). }
bDriveNumber : BYTE;
bReserved : Array[0..2] of Byte;
dwReserved : Array[0..3] of DWORD;
bBuffer : Array[0..0] of Byte; { Input buffer. }
end;
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 : DWORD;
wMultSectorStuff : Word;
ulTotalAddressableSectors : DWORD;
wSingleWordDMA : Word;
wMultiWordDMA : Word;
bReserved : Array[0..127] of BYTE;
end;
PIdSector = ^TIdSector;
TDriverStatus = packed record
{ Error code from driver, or 0 if no error. }
bDriverError : Byte;
{ Contents of IDE Error register. Only valid when bDriverError is SMART_IDE_ERROR. }
bIDEStatus : Byte;
bReserved : Array[0..1] of Byte;
dwReserved : Array[0..1] of DWORD;
end;
TSendCmdOutParams = packed record
{ Size of bBuffer in bytes  }
cBufferSize : DWORD;
{ Driver status structure.}
DriverStatus : TDriverStatus;
{ Buffer of arbitrary length in which to store the data read from the drive.}
bBuffer : Array[0..0] of BYTE;
end;

var
hDevice : THandle;
cbBytesReturned : DWORD;

SCIP : TSendCmdInParams;
aIdOutCmd : Array
[0..(SizeOf(TSendCmdOutParams)+IDENTIFY_BUFFER_SIZE-1)-1] of Byte;
IdOutCmd : TSendCmdOutParams absolute aIdOutCmd;

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 := ''; { return empty string on error  }
if SysUtils.Win32Platform=VER_PLATFORM_WIN32_NT then { Windows NT,Windows 2000  }
begin
{ warning! change name for other drives: ex.: second drive '\\.\PhysicalDrive1\' }
hDevice := CreateFile( '\\.\PhysicalDrive0', GENERIC_READ or
GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0 );
if hDevice = 0 then
begin
hDevice := CreateFile( '\\.\PhysicalDrive1', GENERIC_READ or
GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0 );
end;
end
else { Version Windows 95 OSR2, Windows 98   }
hDevice := CreateFile( '\\.\SMARTVSD', 0, 0, nil, CREATE_NEW, 0, 0 );
if hDevice=INVALID_HANDLE_VALUE then Exit;
try
FillChar(SCIP,SizeOf(TSendCmdInParams)-1,#0);
FillChar(aIdOutCmd,SizeOf(aIdOutCmd),#0);
cbBytesReturned := 0;
{ Set up data structures for IDENTIFY command.  }
with SCIP do
begin
cBufferSize := IDENTIFY_BUFFER_SIZE;
{ bDriveNumber := 0;   }
with irDriveRegs do
begin
bSectorCountReg := 1;
bSectorNumberReg := 1;
{ if Win32Platform=VER_PLATFORM_WIN32_NT then bDriveHeadReg := $A0 }
{ else bDriveHeadReg := $A0 or ((bDriveNum and 1) shl 4); }
bDriveHeadReg := $A0;
bCommandReg := $EC;
end;
end;
if not DeviceIoControl( hDevice, $0007c088, @SCIP,
SizeOf(TSendCmdInParams)-1,
@aIdOutCmd, SizeOf(aIdOutCmd), cbBytesReturned, nil ) then Exit;
finally
CloseHandle(hDevice);
end;
with PIdSector(@IdOutCmd.bBuffer)^ do
begin
ChangeByteOrder( sSerialNumber, SizeOf(sSerialNumber) );
(PChar(@sSerialNumber)+SizeOf(sSerialNumber))^ := #0;
Result := PChar(@sSerialNumber);
end;
end;

function Unique():string;
const IDENTIFY_BUFFER_SIZE = 512;
type
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;
TSendCmdInParams = packed record
// Buffer size in bytes
cBufferSize : DWORD;
// Structure with drive register values.
irDriveRegs : TIDERegs;
// Physical drive number to send command to (0,1,2,3).
bDriveNumber : BYTE;
bReserved : Array[0..2] of Byte;
dwReserved : Array[0..3] of DWORD;
bBuffer : Array[0..0] of Byte; // Input buffer.
end;
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 : DWORD;
wMultSectorStuff : Word;
ulTotalAddressableSectors : DWORD;
wSingleWordDMA : Word;
wMultiWordDMA : Word;
bReserved : Array[0..127] of BYTE;
end;
PIdSector = ^TIdSector;
TDriverStatus = packed record
// Error code from driver, or 0 if no error.
bDriverError : Byte;
// Contents of IDE Error register. Only valid when bDriverError is SMART_IDE_ERROR.
bIDEStatus : Byte;
bReserved : Array[0..1] of Byte;
dwReserved : Array[0..1] of DWORD;
end;
TSendCmdOutParams = packed record
// Size of bBuffer in bytes
cBufferSize : DWORD;
// Driver status structure.
DriverStatus : TDriverStatus;
// Buffer of arbitrary length in which to store the data read from the drive.
bBuffer : Array[0..0] of BYTE;
end;

var
hDevice : THandle;
cbBytesReturned : DWORD;
SCIP : TSendCmdInParams;
aIdOutCmd : Array [0..(SizeOf(TSendCmdOutParams)+IDENTIFY_BUFFER_SIZE-1)-1] of Byte;
IdOutCmd : TSendCmdOutParams absolute aIdOutCmd;

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 := ''; // return empty string on error
if SysUtils.Win32Platform=VER_PLATFORM_WIN32_NT then // Windows NT, Windows 2000
begin
// warning! change name for other drives: ex.: second drive '\\.\PhysicalDrive1\'
hDevice := CreateFile( '\\.\PhysicalDrive0', GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0 );
end
else // Version Windows 95 OSR2, Windows 98
hDevice := CreateFile( '\\.\SMARTVSD', 0, 0, nil, CREATE_NEW, 0, 0 );
if hDevice=INVALID_HANDLE_VALUE then Exit;
try
FillChar(SCIP,SizeOf(TSendCmdInParams)-1,#0);
FillChar(aIdOutCmd,SizeOf(aIdOutCmd),#0);
cbBytesReturned := 0;
// Set up data structures for IDENTIFY command.
with SCIP do
begin
cBufferSize := IDENTIFY_BUFFER_SIZE;
// bDriveNumber := 0;
with irDriveRegs do
begin
bSectorCountReg := 1;
bSectorNumberReg := 1;
// if Win32Platform=VER_PLATFORM_WIN32_NT then bDriveHeadReg := $A0
// else bDriveHeadReg := $A0 or ((bDriveNum and 1) shl 4);
bDriveHeadReg := $A0;
bCommandReg := $EC;
end;
end;
if not DeviceIoControl( hDevice, $0007c088, @SCIP, SizeOf(TSendCmdInParams)-1,
@aIdOutCmd, SizeOf(aIdOutCmd), cbBytesReturned, nil ) then Exit;
finally
CloseHandle(hDevice);
end;
with PIdSector(@IdOutCmd.bBuffer)^ do
begin
ChangeByteOrder( sSerialNumber, SizeOf(sSerialNumber) );
(PChar(@sSerialNumber)+SizeOf(sSerialNumber))^ := #0;
Result := PChar(@sSerialNumber);
end;
end;

function GetUniqueID:string;
begin
    Result := '';
    Result := GetIdeSerialNumber;
    if Length(Trim(Result)) < 1 then
    begin
      Result := Unique;
      if Length(Trim(Result)) < 1 then
      begin
        Result := GetVolumeSerialNumber;
      end;
		end;
    Result := StringReplace(Result,' ','',[rfReplaceAll])
end;

end.
and here is how its uses

Kod: Tümünü seç

uses 
sysInfo;

....

procedure TForm1.Button1Click(Sender: TObject);
begin
showmessage(GetUniqueID);
end;
its going to get each current drive serial number that running this project .
بِسْمِ اللهِ الرَّحْمنِ الرَّحِيمِ
in god i trust with every movement i do
graduated student and looking for knowledge
Kullanıcı avatarı
hido
Üye
Mesajlar: 268
Kayıt: 29 Mar 2014 04:32

Re: flash harddisk seri numarasın alma

Mesaj gönderen hido »

Çok basit.

Kod: Tümünü seç

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  Showmessage(ExtractFileDrive(Application.Exename));
end;

Fakat bunu kod içinde kullanmak istediğinde nasıl yaparsın bilemiyorum bende resimdeki hatayı verdi :shock:

Resim
AfterPost
Üye
Mesajlar: 158
Kayıt: 12 Tem 2014 10:22

Re: flash harddisk seri numarasın alma

Mesaj gönderen AfterPost »

faketmez ki bu kodlar salt nümerik (sayısal) değerler üretmiyor ...içinde ACD gibi değerler üretiyor ..

bu konuyu açan arkadaşın yazdıkları "E, F, Z gibi farklı isimler alabiliyor işte bu durumda bunu nasıl çözümleyebilirim..."
Kullanıcı avatarı
hido
Üye
Mesajlar: 268
Kayıt: 29 Mar 2014 04:32

Re: flash harddisk seri numarasın alma

Mesaj gönderen hido »

AfterPost yazdı:faketmez ki bu kodlar salt nümerik (sayısal) değerler üretmiyor ...içinde ACD gibi değerler üretiyor ..

bu konuyu açan arkadaşın yazdıkları "E, F, Z gibi farklı isimler alabiliyor işte bu durumda bunu nasıl çözümleyebilirim..."

Selam, Ne demek istediğiniz anlayamadın, sonuca odaklı bir cevabınız varsa paylaşmanızı rica ederim...
AfterPost
Üye
Mesajlar: 158
Kayıt: 12 Tem 2014 10:22

Re: flash harddisk seri numarasın alma

Mesaj gönderen AfterPost »

viewtopic.php?f=2&t=34449 aynı konuyu ben de açtım benimde böyle sorunum var yani bizim istediğimiz donanım bileşenlerinden numerik(sayı) değerler okutmak, her seferinde içinde ABD gibi alfa nümerik (sayı olmayan) değerler olmasını istemiyoruz .Yoksa bir çok kod buldum ama hepsi alfa nümerik değerler de üretiyor.
örnek :3216487 bu olur
örnek :A654B olmaz çünkü içinde A ve B var
Kullanıcı avatarı
ALUCARD
Üye
Mesajlar: 1270
Kayıt: 27 Eyl 2003 10:12
Konum: Samsun
İletişim:

Re: flash harddisk seri numarasın alma

Mesaj gönderen ALUCARD »

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var
HarddiskAd: string;
VolumeSerialNumber : dWord;
 Maximumcomponentlengt : DWORD;
 FileSystemFlag : DWORD;
 TheSerialNumber : string;
begin

HarddiskAd := ExtractFileDrive(Application.ExeName)+'/';
label1.Caption := HarddiskAd;

 if GetVolumeInformation(pchar(HarddiskAd),nil,0,@VolumeSerialNumber,Maximumcomponentlengt,FileSystemFlag,nil,0) then
    begin
    TheSerialNumber := IntToHex(hiword(VolumeSerialNumber),4) + IntToHex (Loword(VolumeSerialNumber),4) ;
     edit1.Text := TheSerialNumber;
    end;
end;
bu kod exe yi hangi diskte çalıştırısan onun seri nosunu verir. win 7 ve xe3 ile test ettim çalışıyor.
بِسْمِ اللهِ الرَّحْمنِ الرَّحِيمِ
Forumun 365. Üyesi
Hiç Bir Şey İnsan Kadar Yükselemez ve Alçalamaz

Erkan ÇAĞLAR
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: flash harddisk seri numarasın alma

Mesaj gönderen SimaWB »

AfterPost yazdı:viewtopic.php?f=2&t=34449 aynı konuyu ben de açtım benimde böyle sorunum var yani bizim istediğimiz donanım bileşenlerinden numerik(sayı) değerler okutmak, her seferinde içinde ABD gibi alfa nümerik (sayı olmayan) değerler olmasını istemiyoruz .Yoksa bir çok kod buldum ama hepsi alfa nümerik değerler de üretiyor.
örnek :3216487 bu olur
örnek :A654B olmaz çünkü içinde A ve B var
Bu bahsettiğiniz A'lar, B'ler hexadecimal ifade olduğu için sanırım. Yani 16'lık taban(0,1,2,3,4,5,6,7,8,9,0,A,B,C,D,E,F)
Bunları istemiyorsanız kodlardaki IntToHex kısmını kullanmazsınız.
There's no place like 127.0.0.1
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: flash harddisk seri numarasın alma

Mesaj gönderen SimaWB »

AfterPost yazdı:faketmez ki bu kodlar salt nümerik (sayısal) değerler üretmiyor ...içinde ACD gibi değerler üretiyor ..

bu konuyu açan arkadaşın yazdıkları "E, F, Z gibi farklı isimler alabiliyor işte bu durumda bunu nasıl çözümleyebilirim..."
Üstte yazdığım sebepten içerisinde Z bulunmaz diye tahmin ediyorum :wink:
There's no place like 127.0.0.1
Kullanıcı avatarı
brs
Üye
Mesajlar: 626
Kayıt: 04 Eki 2012 03:52

Re: flash harddisk seri numarasın alma

Mesaj gönderen brs »

ALUCARD yazdı:

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var
HarddiskAd: string;
VolumeSerialNumber : dWord;
 Maximumcomponentlengt : DWORD;
 FileSystemFlag : DWORD;
 TheSerialNumber : string;
begin

HarddiskAd := ExtractFileDrive(Application.ExeName)+'/';
label1.Caption := HarddiskAd;

 if GetVolumeInformation(pchar(HarddiskAd),nil,0,@VolumeSerialNumber,Maximumcomponentlengt,FileSystemFlag,nil,0) then
    begin
    TheSerialNumber := IntToHex(hiword(VolumeSerialNumber),4) + IntToHex (Loword(VolumeSerialNumber),4) ;
     edit1.Text := TheSerialNumber;
    end;
end;
bu kod exe yi hangi diskte çalıştırısan onun seri nosunu verir. win 7 ve xe3 ile test ettim çalışıyor.


Teşekkür ederim iyi çalışmalar...
İşi bilen yardım eder, az bilen akıl verir, bilmeyen eleştirir, yapamayan ise çamur atar...
Kullanıcı avatarı
ALUCARD
Üye
Mesajlar: 1270
Kayıt: 27 Eyl 2003 10:12
Konum: Samsun
İletişim:

Re: flash harddisk seri numarasın alma

Mesaj gönderen ALUCARD »

işinize yaradıysa ne mutlu bize
بِسْمِ اللهِ الرَّحْمنِ الرَّحِيمِ
Forumun 365. Üyesi
Hiç Bir Şey İnsan Kadar Yükselemez ve Alçalamaz

Erkan ÇAĞLAR
Cevapla