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
if LeerMBR(0,@Buffer) then
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/