Code: |
// 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; |
Boot и есть необходимый массив.
- << Назад
- Вперёд
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!