Прочитать boot сектор

Материал из DRKB

Прочитать boot сектор[править | править код]

Вообще-то загрузочный сектор можно прочитать вот так:


type
  TSector = array[0..511] of Byte;
var
  Boot: TSector;
begin
  ReadBoot(Drive, Boot);


Но учитывая разницу платформ 95, 98, Me и NT, 2000, XP можно сделать 2 процедуры, а в главной части проги вызывать необходимую:


// для 95, 98, Me
type
  TDiocRegisters = record
    EBX, EDX, ECX, EAX, EDI, ESI, Flags: LongWord;
  end;

  TVWin32CtlCode = (ccNone, ccVWin32IntIoctl, ccVWin32Int25,
    ccVWin32Int26, ccVWin32Int13);

function VWin32(CtlCode: TVWin32CtlCode; var Regs: TDiocRegisters): Boolean; // вспомогательная процедура
var
  Device: THandle;
  Count: LongWord;
begin
  Device := CreateFile('\.\VWIN32', 0, 0, nil, 0,
    FILE_FLAG_DELETE_ON_CLOSE, 0);
  if Device = INVALID_HANDLE_VALUE then
    raise Exception.Create(SysErrorMessage(GetLastError));
  try
    Result := DeviceIoControl(Device, Ord(CtlCode), @Regs,
      SizeOf(Regs), @Regs, SizeOf(Regs), Count, nil);
  finally
    CloseHandle(Device);
  end;
end;

// само чтение
procedure ReadBoot95(Drive: Char; var Boot: TSector);
var
  Regs: TDiocRegisters;
begin
  with Regs do
  begin
    EAX := Ord(UpCase(Drive)) - Ord('A');
    EBX := LongWord(@Boot);
    ECX := 1;
    EDX := 0;
  end;
  if not VWin32(ccVWin32Int25, Regs) then
    raise Exception.Create(SysErrorMessage(GetLastError))
end;

// для NT, 2000, XP попроще
type
  TSector = array[0..511] of Byte;

procedure ReadBootNT(Drive: Char; var Boot: TSector);
var
  BytesRead: Cardinal;
  H: THandle;
begin
  H := CreateFile(PChar(Format('\.\%s:', [UpCase(Drive)])),
    GENERIC_READ, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  if H = INVALID_HANDLE_VALUE then
    raise Exception.Create(SysErrorMessage(GetLastError));
  try
    if not ReadFile(H, Boot, SizeOf(Boot), BytesRead, nil) then
      raise Exception.Create(SysErrorMessage(GetLastError));
  finally
    CloseHandle(H);
  end;
end;

// а юзать так

var
  Boot: TSector;
begin
  case Win32Platform of
    VER_PLATFORM_WIN32_WINDOWS:
      ReadBoot95(Drive, Boot);
    VER_PLATFORM_WIN32_NT:
      ReadBootNT(Drive, Boot);
  end;
end;


Boot и есть необходимый массив.


Author: startinger
Source: Взято из http://forum.sources.ru
ID: 01380