Hola pedí ayuda para realizar un programa que cambie el ID del volumen de un Disco a un amigo, y él me brindo este código,
UDiskVolumeIDChanger.pas :::
delphi
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.
delphi
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.
[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