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;
volume serial number değiştirme
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
- pazartesi1
- Üye
- Mesajlar: 23
- Kayıt: 11 Haz 2004 08:36
- İletişim:
{$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;
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;
@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.
- 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
- 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 }
VolumeID v2.0
By Mark Russinovich
http://www.microsoft.com/technet/sysint ... umeId.mspx
- sabanakman
- Kıdemli Üye
- Mesajlar: 3081
- Kayıt: 17 Nis 2006 08:11
- Konum: Ah bi Antalya olaydı keşke (Ankara)
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. - .
_________________
Derin olan kuyu değil kısa olan iptir. - .