PDA

Ver la Versión Completa : Código para cambiar el ID del volumen de un Disco


deliriun
12-02-2016, 22:18:31
Hola buen día a todos, Hace unos días hice una publicación pidiendo algo de ayuda para algo que quería realizar,
Hable con un amigo que conoce más del tema y me brindo este código,

UDiskVolumeIDChanger.pas

unit UDiskVolumeIDChanger;

interface

uses Windows, StrUtils, SysUtils, Dialogs;

type partial_boot_sector_info = record
Fs: PAnsiChar;
FsOffs: Integer;
SerialOffs: Integer;
end;

type
TDiskVolumeIDChanger = class
private
m_hDisk: THandle;
Unidad: AnsiString;
public
constructor Create;
function AbrirDisco(Volumen: AnsiString): Boolean;
procedure CerrarDisco();
function LeerSector(Sector: DWORD; Buffer: AnsiString): Boolean;
function EscribirSector(Sector: DWORD; Buffer: AnsiString): Boolean;
function LeerDiscoID(): AnsiString;
function SerialAStr(Serial: Integer): AnsiString;
function StrASerial(Serial: AnsiString): Integer;
function CambiarDiscoID(NuevoID: AnsiString): Boolean;
end;

implementation

constructor TDiskVolumeIDChanger.Create;
begin
m_hDisk := INVALID_HANDLE_VALUE;
end;

function TDiskVolumeIDChanger.AbrirDisco(Volumen: AnsiString): Boolean;
var
Disco: AnsiString;
begin
Disco := '\\.\' + Volumen + ':';
m_hDisk := CreateFileA(
PAnsiChar(Disco),
GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE,
nil,
OPEN_EXISTING,
0,
0);
Result := m_hDisk <> INVALID_HANDLE_VALUE;
if Result then Unidad := Volumen + ':\';
end;

procedure TDiskVolumeIDChanger.CerrarDisco();
begin
if m_hDisk <> INVALID_HANDLE_VALUE then begin
CloseHandle(m_hDisk);
m_hDisk := INVALID_HANDLE_VALUE;
end;
end;

function TDiskVolumeIDChanger.LeerSector(Sector: DWORD; Buffer: AnsiString): Boolean;
var
read: DWORD;
begin
if SetFilePointer(m_hDisk, sector, nil, FILE_BEGIN) = UINT(-1) then
begin
Result := False;
Exit;
end;

if ReadFile(m_hDisk, Buffer, 512, read, nil) = False then
Result := False
else
Result := True;
end;

function TDiskVolumeIDChanger.EscribirSector(Sector: DWORD; Buffer: AnsiString): Boolean;
var
write: DWORD;
begin
if SetFilePointer(m_hDisk, sector, nil, FILE_BEGIN) = UINT(-1) then
begin
Result := False;
Exit;
end;

if WriteFile(m_hDisk, Buffer, 512, write, nil) = False then
Result := False
else
Result := True;
end;

function TDiskVolumeIDChanger.LeerDiscoID(): AnsiString;
var
Serial: Integer;
Max1, Max2: Cardinal;
begin
if not GetVolumeInformationA(PAnsiChar(Unidad), nil, 0, @Serial, Max1, Max2, nil, 0) then
begin
Result := '';
Exit;
end;

Result := SerialAStr(Serial);
end;

function TDiskVolumeIDChanger.SerialAStr(Serial: Integer): AnsiString;
begin
Result := AnsiString(IntToHex(Serial shr 16, 4)) + '-' + AnsiString(IntToHex(Serial and $FFFF, 4));
end;

function TDiskVolumeIDChanger.StrASerial(Serial: AnsiString): Integer;
var
S1, S2: AnsiString;
begin
SetLength(S1, 12);

try
S1 := '$';
S2 := Serial;
S2[5] := S2[6];
S2[6] := S2[7];
S2[7] := S2[8];
S2[8] := S2[9];
S2[9] := #0;
S1 := S1 + S2;
Result := StrToInt(String(S1));
except
Result := 0;
end;
end;

function TDiskVolumeIDChanger.CambiarDiscoID(NuevoID: AnsiString): Boolean;
var
read: Cardinal;
PActual, PSerial, POffs: ^Cardinal;
PDiskHandle: ^THandle;
Serial, i: Integer;
Sector: AnsiString;
VolType: PAnsiChar;
pbsi: array [0..2] of partial_boot_sector_info;
begin
Result := False;
Serial := StrASerial(NuevoID);
SetLength(Sector, 512);
PActual := @read;
PSerial := @Serial;
PDiskHandle := @m_hDisk;

if (Serial = 0) or (m_hDisk = INVALID_HANDLE_VALUE) then Exit;

pbsi[0].Fs := 'FAT32';
pbsi[0].FsOffs := $52;
pbsi[0].SerialOffs := $43;
pbsi[1].Fs := 'FAT';
pbsi[1].FsOffs := $36;
pbsi[1].SerialOffs := $27;
pbsi[2].Fs := 'NTFS';
pbsi[2].FsOffs := $03;
pbsi[2].SerialOffs := $48;

if SetFilePointer(m_hDisk, 0, nil, FILE_BEGIN) = INVALID_HANDLE_VALUE then Exit;

asm
push 0
push PActual
push 512
push Sector
mov eax, PDiskHandle
push [eax]
call ReadFile
end;

if SetFilePointer(m_hDisk, 0, nil, FILE_BEGIN) = INVALID_HANDLE_VALUE then Exit;
//if WriteFile(m_hDisk, Sector, 512, write, nil) = False then Exit;

for i := 0 to 2 do
begin
POffs := @pbsi[i].FsOffs;
asm
mov eax, Sector
mov ecx, POffs
add eax, [ecx]
push eax
pop VolType
end;

if AnsiStrLComp(VolType, pbsi[i].Fs, 3) = 0 then Break;
end;

if i = 3 then Exit;

POffs := @pbsi[i].SerialOffs;
asm
mov eax, Sector
mov ecx, PActual
mov ebx, PSerial
add eax, [ecx]
mov ecx, [ebx]
mov [eax], ecx

push 0
push PActual
push 512
push Sector
mov eax, PDiskHandle
push [eax]
call WriteFile
end;

Result := True;
end;

end.




unit UPruebaDelphi;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, UDiskVolumeIDChanger, StdCtrls, FileCtrl, ExtCtrls, Mask;

type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
MaskEdit1: TMaskEdit;
Label3: TLabel;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
UDVID: TDiskVolumeIDChanger;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
if MessageBox(0, PWideChar('Estás a punto de cambiar el ID del volumen de la unidad C' + #13#13#13 + 'Esto puede ser peligroso. ¿Desea continuar?'), PWideChar('AVISO'), MB_YESNO or
MB_ICONQUESTION) = IDYES then
begin
UDVID.AbrirDisco(AnsiString('C'));
if not UDVID.CambiarDiscoID(AnsiString(MaskEdit1.Text)) then
ShowMessage('ID DE 32 BITS NO VÁLIDO O UNIDAD PROTEGIDA CONTRA R / W')
else
ShowMessage('DE DE VOLUMEN CAMBIADO EXITOSAMENTE. REINICIA LA PC');
UDVID.CerrarDisco();
end;
end;
(*
procedure TForm1.dcbChange(Sender: TObject);
begin
UDVID.AbrirDisco(AnsiString(dcb.Drive));

if UDVID.LeerDiscoID() = '' then
begin
Label1.Caption := 'Volumen no válido';
Button1.Enabled := False;
MaskEdit1.Enabled := False;
end else
begin
Label1.Caption := String(UDVID.LeerDiscoID());
Button1.Enabled := True;
MaskEdit1.Enabled := True;
end;

UDVID.CerrarDisco();
end; *)

procedure TForm1.FormCreate(Sender: TObject);
begin
UDVID := TDiskVolumeIDChanger.Create;
UDVID.AbrirDisco(AnsiString('C'));

if UDVID.LeerDiscoID() = '' then
begin
Label1.Caption := 'Volumen no válido';
Button1.Enabled := False;
MaskEdit1.Enabled := False;
end else
begin
Label1.Caption := String(UDVID.LeerDiscoID());
Button1.Enabled := True;
MaskEdit1.Enabled := True;
end;

UDVID.CerrarDisco();
end;

end.

https://www.facebook.com/photo.php?fbid=986019484811075&set=a.153491064730592.40880.100002090995745&type=3&theater

[ESTE CÓDIGO SOLO CAMBIA EL ID DEL DISCO C]

Siendo sinceros, yo me perdí un poco en el código, Aunque él me dijo que todo le andaba bien en su PC y le funcionaba con normalidad.

Pero al parecer en mi PC y Laptop no funciona, alguien sabe a que se debe? O me pueden decir sí si les funciona el código

Muchas Gracias

Casimiro Notevi
12-02-2016, 22:56:35
Pero al parecer en mi PC y Laptop no funciona, alguien sabe a que se debe? ¿Al parecer no funciona?, ¿qué hace?, ¿algún mensaje?, ¿por qué sabes que no funciona?... ....

deliriun
12-02-2016, 23:27:29
Como dije ese programa cambia el ID del Volumen de un Disco por otro, pero lo he probado en mi PC y no cambia nada, en resumen el programa no funciona

Casimiro Notevi
12-02-2016, 23:58:50
¿Y lo has seguido paso a paso para ver el motivo?

deliriun
13-02-2016, 00:21:22
Sí, pero con mi poca experiencia no encuentro nada...

él también lo ha revisado y no tiene idea, es raro que en su PC ande y en la mía no..

Casimiro Notevi
13-02-2016, 13:45:11
él también lo ha revisado y no tiene idea, es raro que en su PC ande y en la mía no..¿Y qué diferencia hay?