06/07 à 00:21Bonjour,
Une possibilité, mais surtout faire très attention
Uniquement pour NT/2000/XP
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
const TailleSecteur=512; //Taille supposée en octets, d'un secteur
type
TDump=array[0..TailleSecteur-1] of byte;
partial_boot_sector_info=packed record
Fs:string; // Systeme de fichiers
FsOffs:DWORD; // offset du nom du Systeme de fichiers dans le secteur boot sector
SerialOffs:DWORD; // offset du nom du numéro de série de fichiers dans le secteur boot sector
end;
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Déclarations privées }
public
{ Déclarations publiques }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TForm1 }
//lecture d'un secteur du disque
procedure ReadSector(drive:char;logicalsector:DWORD;var Dump:TDump);
var hDevice:THandle;
bytesread:DWord;
begin
FillChar(Dump,TailleSecteur,0);
hDevice:= CreateFile(PChar('\\.\'+drive+':'),
GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE,
nil, OPEN_EXISTING, 0, 0);
if (hDevice = INVALID_HANDLE_VALUE)
then begin
CloseHandle(hDevice);
exit;
end;
// Setting the pointer to point to the start of the sector we want to read ..
SetFilePointer (hDevice,(logicalsector*TailleSecteur), nil, FILE_BEGIN);
ReadFile (hDevice, Dump, TailleSecteur, bytesread, nil);
CloseHandle(hDevice);
end;
procedure WriteSector(drive: char; logicalsector: DWORD;
Dump: TDump);
var hDevice:THandle;
byteswritten:DWord;
begin
hDevice:= CreateFile(PChar('\\.\'+drive+':'),
GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE,
nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if (hDevice = INVALID_HANDLE_VALUE)
then begin
CloseHandle(hDevice);
exit;
end;
// Setting the pointer to point to the start of the sector we want to read ..
SetFilePointer (hDevice,(logicalsector*TailleSecteur), nil, FILE_BEGIN);
WriteFile (hDevice, Dump, 512, byteswritten, nil);
CloseHandle(hDevice);
end;
procedure ChangeNumSerie(drive: char; NewSerial: string;Rapport:TMemo=nil);
const max_pbsi = 3;
pbsi:array[0..max_pbsi-1] of partial_boot_sector_info
=((Fs:'FAT32'; FsOffs:$52; SerialOffs:$43),
(Fs:'FAT'; FsOffs:$36; SerialOffs:$27),
(Fs:'NTFS'; FsOffs:$03; SerialOffs:$48));
var Dump:TDump;
i,j:integer;
trouve:boolean;
Serial,NSerial:String;
NSerie:array[0..3] of byte;
NSerieDWord:DWord;
begin
if NewSerial=''
then Serial:='1234-5678'
else Serial:=uppercase(NewSerial);
NSerial:='';
for i:=1 to length(NewSerial) do
if NewSerial[i] in ['0'..'9','A'..'F'] then NSerial:=NSerial+NewSerial[i];
if length(NSerial)<>8
then begin
ShowMessage('Problème sur lenuméro de série : doit avoir 8 caractères héxadécimaux');
exit;
end;
NSerieDWord:=strtoint('$'+NSerial);
Move(NSerieDWord,NSerie,4); //Le nouveau numéro de série est prêt
ReadSector(drive,0,Dump); //Lit le boot record
if Assigned(Rapport) then
Rapport.Lines.add('Dump du secteur de boot');
for i:=0 to high(dump) do
if Assigned(Rapport) then
Rapport.Lines.add(inttostr(i)+' : '+IntToHex(Dump[i],2)+' '+chr(Dump[i]));
//On Cherche un secteur de boot valide
trouve:=false;
i:=0;
while ((i<max_pbsi) and (not trouve)) do
begin
trouve:=CompareMem(@pbsi[i].fs[1],@Dump[pbsi[i].FsOffs],length(pbsi[i].Fs));
if trouve
then if Assigned(Rapport)
then Rapport.Lines.add('Secteur de boot '+pbsi[i].fs+' valide trouve!')
else showmessage('Secteur de boot '+pbsi[i].fs+' valide trouve !')
else inc(i);
end;
if not trouve
then begin
if Assigned(Rapport)
then Rapport.Lines.add('Je ne sais pas changer le numéro de série sur ce système de fichier !')
else showmessage('Je ne sais pas changer le numéro de série sur ce système de fichier !');
exit;
end;
// afficher le numéro de serie
Serial:='';
for j:=3 downto 0 do
begin
Serial:=Serial+IntToHex(Dump[pbsi[i].SerialOffs+j],2);
if j=2 then Serial:=serial+'-';
end;
NSerial:='';
for j:=3 downto 0 do
begin
NSerial:=NSerial+IntToHex(NSerie[j],2);
if j=2 then NSerial:=Nserial+'-';
end;
if Assigned(Rapport)
then Rapport.Lines.add('Numéro de série actuel :'+Serial+' Nouveau num : '+Nserial)
else showmessage('Je ne sais pas changer le numéro de série sur ce système de fichier !');
if (MessageDlg('Etes-vous sur de vouloir changer le numéro de série ?', mtInformation, [mbYes, mbNo], 0) = mrNo) then exit;
//Copie du nouveau numéro de série dans le boot sector
for j:=0 to 3 do
Dump[pbsi[i].SerialOffs+j]:=NSerie[j];
WriteSector(drive,0,dump);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ChangeNumSerie('E','1234-5678',memo1);
end;
C'est tout ce que j'ai en magasin
![[:)(]](/medias/forum/images/smileys/13.gif)
.
----------
C'est pas toujours facile !
