volume serial number değiştirme

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
trpasport
Üye
Mesajlar: 27
Kayıt: 03 Eki 2007 05:53

volume serial number değiştirme

Mesaj gönderen trpasport »

Herkese hayırlı bayramlar öncelikle benim bu sorduğum soruyu çok kez sordum ama bir cevap alamadım ve yılmadım halen sormaya devam edicem aşşağıda kaynak kodlara göre harddisk volue serial number denilen numara alınıyor fakat bu numaranın istediğim şekilde değiştirilebildiğini yazan pek çok insan var ama kimseden cevap gelmiyor bu numarayı benzer bir numara ile kendi belirlediğim bir numara ile değiştirmek istiyorum bunun için elinde kod olan arkadaşlar lütfen yardım edin

procedure TForm1.Button1Click(Sender: TObject);
var
VolumeSerialNumber : DWORD;
MaximumComponentLength : DWORD;
FileSystemFlags : DWORD;
SerialNumber : string;
begin
GetVolumeInformation('C:\',nil,0,@VolumeSerialNumber,MaximumComponentLength,FileSystemFlags,nil,0);
SerialNumber := IntToHex(HiWord(VolumeSerialNumber), 4) + '-' +IntToHex(LoWord(VolumeSerialNumber), 4);
Memo1.Lines.Add(SerialNumber);
end;
Kullanıcı avatarı
pazartesi1
Üye
Mesajlar: 23
Kayıt: 11 Haz 2004 08:36
İletişim:

Mesaj gönderen pazartesi1 »

{$R *.DFM}



const
Key : TKey = ($EE,$BB,$D5,$82,$F7,$00,$C6,$4A,
$23,$66,$AF,$DE,$BB,$77,$C4,$42);

function GetDiskVolSerialID( cDriveName : char ) : DWord;
var
dwTemp1,dwTemp2 : DWord;
begin
GetVolumeInformation( PChar( cDriveName + ':\' ), Nil, 0,
@Result,dwTemp1, dwTemp2, Nil, 0 );
end;
{ generate unlocking code based on user name }
procedure TForm01.btnGenCodeClick(Sender: TObject);
var
HashValue : Longint;
Code : TCode;
begin
HashValue := StringHashElf(edtUserName1.Text);
InitSpecialCode(Key, HashValue, Now / 71.1 + 101.1 * 91.78 / 2.24 + 3.10 / 3.04 + 4.91 * 2.22, Code);
edtCode1.Text := BufferToHex(Code, SizeOf(Code));
end;
function GetCompName: string;
var
buffer:array[0..MAX_COMPUTERNAME_LENGTH+1] of Char;
length:Cardinal;
begin
length:=MAX_COMPUTERNAME_LENGTH+1;
GetComputerName(@Buffer,length);
Result := Buffer;
end;
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

@pazartesi1

- Neyi ifade etmeyi istediğin bir iki cümle ile anlatsan çok vaktini almazdı. Kodun eksik ve anlamsız. Neyi ne için yazdığını, deneyip denemediğini yazmalısın. Referansın neresidir bunu da belirtmemişsin. :!:

@trpasport

- Senin soruya gelince, konuyu yanlış anlamışsın. VolumeID bilgisi herkesin istediği anda dilediği gibi değiştirdiği bir veri değildir. Sabit Disk formatlandığında Disk İşletim Sistemi tarafından otomatik atanan bir veridir. Bu nedenle genel ifade aslında "bu seri nosunu referans almayınız, disk formatlandığında değişeceğinden referansınız bozulur" şeklinde ifade edilmek isteniyor.

- Delphi 1.0 varsa googledan 16 bitlik bir kod örneği buldum. Denemek isteyenler için yeri gelmişken yazayım. Arşivden Delphi 1.0'ı çıkardığım bir zaman şahsen denerim şu an vaktim yok.

Kod: Tümünü seç

Type
  TMediaID = Record  // This is the MS-DOS original MediaID structur
    wInfoLevel: WORD;
    dwSerialNumber: LongInt;
    VolLabel: ARRAY [0..10] of Char;
    FileSysType: ARRAY [0..7] of Char;
  End;

Procedure SetDiskSerialNum( drive: word; serialNo: LongInt );
// drive = 1 for A:, 2 for B: etc.
Var
  MediaID: TMediaID;
Begin
  // first do a GetMediaID to fill MediaID with valid values
  asm
    push ds
    lea dx, MediaID
    mov cx, $0866
    mov bx, drive
    mov ax, ss
    mov ds, ax
    mov ax, $440D
    int $21
    pop ds
  end;
  // load the new serial number
  MediaID.dwSerialNumber := serialNo;
  // do a set media ID
  asm
    push ds
    lea dx, MediaID
    mov cx, $0846
    mov bx, drive
    mov ax, ss
    mov ds, ax
    mov ax, $440D
    int $21
    pop ds
  end;
End; { SetDiskSerialNum }
- Kendi belirlediğin bir numara ile değiştirmek için DOS komut satırı altında çalışan bizzat Microsoft'un sitesinde bulunan utility tarzındaki bir yazılımı kullanabilirsin. Linki için bkz.

VolumeID v2.0
By Mark Russinovich

http://www.microsoft.com/technet/sysint ... umeId.mspx
Resim
Resim ....Resim
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

DelphiTürk kod bankasında Tüm Platformlarda Disk Volume Seri numarasının degiştirilmesi :) başlıklı bir kod vardı ama denemedim. Belki çalışıyordur :) .

Kod: Tümünü seç

type 
   TSector = array[0..511] of Byte; 

 procedure ChangeVolumeSerialNumber(Drive: Char; 
   SerialNumber: LongWord); 
   var 
     Boot: TSector; 
   begin 
   ReadBoot(Drive, Boot); 
   Move(SerialNumber, Boot[39], SizeOf(SerialNumber)); 
   WriteBoot(Drive, Boot) end; 

A complication occurs, however, because reading and writing the boot sector in NT requires completely different code from that used in reading and writing the boot sector in Win95/98. 

So here's the complete code, taking into account the differences between NT and Win95/98: 


type 
   TSector = array[0..511] of Byte; 

 procedure ReadBootNT(Drive: Char; var Boot: TSector); 
   var 
     BytesRead: Cardinal; 
     H: THandle; 
   begin 
   H := CreateFile(PChar(Format('\\.\%s:', [UpCase(Drive)])), 
     GENERIC_READ, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); 
   if H = INVALID_HANDLE_VALUE then 
     raise Exception.Create(SysErrorMessage(GetLastError)); 
   try 
     if not ReadFile(H, Boot, SizeOf(Boot), BytesRead, nil)then 
       raise Exception.Create(SysErrorMessage(GetLastError)); 
   finally 
     CloseHandle(H) end end; 

 procedure WriteBootNT(Drive: Char; var Boot: TSector); 
   var 
     BytesWritten: Cardinal; 
     H: THandle; 
   begin 
   H := CreateFile(PChar(Format('\\.\%s:', [UpCase(Drive)])), 
     GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); 
   if H = INVALID_HANDLE_VALUE then 
     raise Exception.Create(SysErrorMessage(GetLastError)); 
   try 
     if not WriteFile(H, Boot, SizeOf(Boot), BytesWritten, nil)then 
       raise Exception.Create(SysErrorMessage(GetLastError)); 
   finally 
     CloseHandle(H) end end; 

 type 
   TDiocRegisters = record 
     EBX, EDX, ECX, EAX, EDI, ESI, Flags: LongWord end; 

   TVWin32CtlCode = (ccNone, ccVWin32IntIoctl, ccVWin32Int25, 
     ccVWin32Int26, ccVWin32Int13); 

 function VWin32(CtlCode: TVWin32CtlCode; 
   var Regs: TDiocRegisters): Boolean; 
   var 
     Device: THandle; 
     Count: LongWord; 
   begin 
   Device := CreateFile('\\.\VWIN32', 0, 0, nil, 0, 
     FILE_FLAG_DELETE_ON_CLOSE, 0); 
   if Device = INVALID_HANDLE_VALUE then 
     raise Exception.Create(SysErrorMessage(GetLastError)); 
   try 
     Result := DeviceIoControl(Device, Ord(CtlCode), @Regs, 
       SizeOf(Regs), @Regs, SizeOf(Regs), Count, nil); 
   finally 
     CloseHandle(Device) end end; 

 procedure ReadBoot95(Drive: Char; var Boot: TSector); 
   var 
     Regs: TDiocRegisters; 
   begin 
   with Regs do begin 
     EAX := Ord(UpCase(Drive)) - Ord('A'); 
     EBX := LongWord(@Boot); 
     ECX := 1; 
     EDX := 0 end; 
   if not VWin32(ccVWin32Int25, Regs) then 
     raise Exception.Create(SysErrorMessage(GetLastError)) end; 

 procedure WriteBoot95(Drive: Char; var Boot: TSector); 
   var 
     Regs: TDiocRegisters; 
   begin 
   with Regs do begin 
     EAX := Ord(UpCase(Drive)) - Ord('A'); 
     EBX := LongWord(@Boot); 
     ECX := 1; 
     EDX := 0 end; 
   if not VWin32(ccVWin32Int26, Regs) then 
     raise Exception.Create(SysErrorMessage(GetLastError)) end; 

 procedure ChangeVolumeSerialNumber(Drive: Char; 
   SerialNumber: LongWord); 
   var 
     Boot: TSector; 
   begin 
   case Win32Platform of 
     VER_PLATFORM_WIN32_WINDOWS: 
       ReadBoot95(Drive, Boot); 
     VER_PLATFORM_WIN32_NT: 
       ReadBootNT(Drive, Boot) end; 
   Move(SerialNumber, Boot[39], SizeOf(SerialNumber)); 
   case Win32Platform of 
     VER_PLATFORM_WIN32_WINDOWS: 
       WriteBoot95(Drive, Boot); 
     VER_PLATFORM_WIN32_NT: 
       WriteBootNT(Drive, Boot) end end;
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Cevapla