На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: jack128, Rouse_, Krid
  
    > Прочитать boot сектор
      Вообще-то загрузочный сектор можно прочитать вот так:
      ExpandedWrap disabled
        type
           TSector = array[0..511] of Byte;
           var
             Boot: TSector;
           begin
           ReadBoot(Drive, Boot);

      Но учитывая разницу платформ 95, 98, Me и NT, 2000, XP можно сделать 2 процедуры, а в главной части проги вызывать необходимую:
      ExpandedWrap disabled
        //для 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;

      Boot и есть необходимый массив.
      Автор ответа - (с) startinger
      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script execution time: 0,0215 ]   [ 16 queries used ]   [ Generated: 28.04.24, 18:06 GMT ]