Ver Mensaje Individual
  #1  
Antiguo 01-08-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Reputación: 24
seoane Va por buen camino
Copiar el Master Boot Record (MBR)

El MBR (Master Boot Record) es un sector de 512 bytes al principio del disco duro que contiene la secuencia de comandos necesarios para cargar el SO y una tabla donde están definidas las particiones del disco duro.

Puede resultar útil guardar una copia de seguridad del mismo para casos de emergencia. Un simple disco de inicio y algún programa como RESTORRB, pueden sacarnos del apuro si tenemos guardada nuestra copia de seguridad.

Copiarlo es sencillo y seguro. Utilizaremos las funciones CreateFile y ReadFile para leer el primer sector del disco duro. Esta función copia el sector a un buffer, el parámetro Drive se refiere al disco duro, normalmente sera el 0.

Código Delphi [-]
function LeerMBR(Drive: Integer; Sector: Pointer): Boolean;
var
  hDisk: THandle;
  BytesRead: DWORD;
begin
  Result:= FALSE;
  hDisk:= CreateFile(PChar('\\.\Physicaldrive' + IntToStr(Drive)),GENERIC_READ,
    FILE_SHARE_READ,nil,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0);
  if hDisk <> INVALID_HANDLE_VALUE then
  begin
    if ReadFile(hDisk,Sector^,512,BytesRead,nil) then
      Result:= BytesRead = 512
    else ShowMessage(SysErrorMessage(GetLastError));
    CloseHandle(hDisk);
  end else ShowMessage(SysErrorMessage(GetLastError));
end;

Utilizando la funcion anterior podemos crear una copia de seguridad lista para usar con el programa RESTORRB y un disco de inicio:

Código Delphi [-]
function GuardarMBR(Filename: String): Boolean;
var
  F: File;
  Buffer: Array[1..512] of Byte;
  Escritos: Integer;
begin
  Result:= TRUE;
  if LeerMBR(0,@Buffer) then
  begin
    AssignFile(F,Filename);
    {$I-}
      Rewrite(F,1);
    {$I+}
    if IOResult = 0 then
    begin
      BlockWrite(F,Buffer,Sizeof(Buffer),Escritos);
      Result:= Escritos = Sizeof(buffer);
      CloseFile(F);
    end;
  end;
end;


GuardarMBR('A:\rootboot.000');

Hasta aquí lo sensato y lo que funciona de forma probada, pero que pasaría si copiamos el MBR al primer sector de un disquete. Pues parece que el sistema arranca perfectamente desde el disquete, ahora bien no tengo forma de comprobar si la información de la particiones la toma del nuevo sector o la sigue obteniendo del viejo. La única forma de comprobarlo seria destrozando mi MBR y no pienso hacerlo, si alguien se anima ... Aquí dejo lo necesario para el trasplante de MBR.

Código Delphi [-]
function EscribirMBR(Letra: Char; Sector: Pointer): Boolean;
var
  hDisk: THandle;
  BytesWritten: DWORD;
begin
  Result:= FALSE;
  hDisk:= CreateFile(PChar('\\.\' + Letra + ':'),GENERIC_WRITE,FILE_SHARE_READ,
    nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
  if hDisk <> INVALID_HANDLE_VALUE then
  begin
    if WriteFile(hDisk,Sector^,512,BytesWritten,nil) then
      Result:= BytesWritten = 512
    else ShowMessage(SysErrorMessage(GetLastError));
    CloseHandle(hDisk);
  end else ShowMessage(SysErrorMessage(GetLastError));
end;


var
  Buffer: array[1..512] of Byte;
begin
  // Leemos el primer sector del primer disco duro
  if LeerMBR(0,@Buffer) then
    // Lo copiamos al primer sector del disquete A
    if EscribirMBR('A',@Buffer) then
      ShowMessage('El sector se ha copiado al disquete');
end;

Bueno, solo dejar una ultima advertencia. Copiar el MBR a un archivo es seguro y recomendable, copiarlo a un disquete es seguro pero de eficacia no probada e intentar escribir el MBR del disco duro es muy inseguro y no lo recomiendo.


Nota: RESTORRB forma parte del programa fips20, que se solía encontrar en casi todas las distribuciones linux como utilidad de particionado no destructivo para DOS.

http://www.tux.org/pub/dos/partition-programs/fips/fips-20/
Responder Con Cita