Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 12-02-2016
deliriun deliriun is offline
Miembro
 
Registrado: ago 2014
Posts: 51
Poder: 10
deliriun Va por buen camino
Question Código para cambiar el ID del volumen de un Disco

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

Código 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.




Código 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.

https://www.facebook.com/photo.php?f...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
Responder Con Cita
  #2  
Antiguo 12-02-2016
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.042
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por deliriun Ver Mensaje
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?... ....
Responder Con Cita
  #3  
Antiguo 12-02-2016
deliriun deliriun is offline
Miembro
 
Registrado: ago 2014
Posts: 51
Poder: 10
deliriun Va por buen camino
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
Responder Con Cita
  #4  
Antiguo 12-02-2016
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.042
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿Y lo has seguido paso a paso para ver el motivo?
Responder Con Cita
  #5  
Antiguo 13-02-2016
deliriun deliriun is offline
Miembro
 
Registrado: ago 2014
Posts: 51
Poder: 10
deliriun Va por buen camino
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..
Responder Con Cita
  #6  
Antiguo 13-02-2016
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.042
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por deliriun Ver Mensaje
é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?
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
volumen para mi reproductor Lucass Varios 5 19-10-2007 18:22:56
Como obtener el serial del volumen del Disco Duro JoAnCa API de Windows 3 12-10-2007 20:17:17
¿Es posible cambiar el volumen del TMediaPlayer? Delphius Varios 11 24-08-2005 15:33:01
Cambiar el volumen de grabación del micrófono syntetiko API de Windows 0 25-01-2005 19:11:58
Como cambiar volumen de la tarjeta de sonido kalisto Varios 2 04-08-2004 18:55:47


La franja horaria es GMT +2. Ahora son las 13:36:32.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi