Содержание материала

Ну а теперь сам код разбора структуры диска:

Code:

const

   PartitionTableOffset = $1be;

   ExtendedPartitions = [5,$f];

 

var

   MainExPartOffset: DWORD = 0;

 

function GetDriveInfo(DriveNumber: Byte; DriveInfo: PDriveInfo;

   StartingSector: DWORD; BytesPerSector: DWORD = 512): Boolean;

var

   buf: array of Byte;

   CurExPartOffset: DWORD;

   i: Integer;

begin

   SetLength(buf,BytesPerSector);

   // читаем сектор в буфер

   if ReadSectors(DriveNumber,MainExPartOffset+StartingSector,1,@buf[0]) = 0 then

   begin

     Result := False;

     Exit;

   end;

   // заполняем структуру DriveInfo.PartitionTable

   Move(buf[PartitionTableOffset],DriveInfo.PartitionTable,SizeOf(TPartitionTable));

   Finalize(buf); // буфер больше не нужен

 

   Result := True;

   for i := 0 to 3 do // для каждой записи в Partition Table

     if DriveInfo.PartitionTable[i].SystemIndicator in ExtendedPartitions then

     begin

       New(DriveInfo.LogicalDrives[I]);

       if MainExPartOffset = 0 then

       begin

         MainExPartOffset := DriveInfo.PartitionTable[I].StartingSector;

         CurExPartOffset := 0;

       end else CurExPartOffset := DriveInfo.PartitionTable[I].StartingSector;

       Result := Result and GetDriveInfo(DriveNumber,DriveInfo.LogicalDrives[I],

         CurExPartOffset);

     end else DriveInfo.LogicalDrives[I] := nil;

end;

 

 

Функция заполняет структуру DriveInfo и возвращает True, если операция прошла успешно, или False в противном случае.

Теперь у нас есть такая полезная информация о разделах как начальный сектор, общее количество секторов, а также файловая система.

В нулевом секторе каждого основного раздела находится BIOS Parameter Block, содержаший такую информацию как название файловой системы, количество секторов в кластере и т.д. А также программа-загрузчик (сохраняем сектор в файл и смотрим дизасмом).

Теперь, когда мы закончили с теоретической частью, можно приступить к реализации редактора.

С чтением и записью информации мы уже разобрались. Теперь займемся ее отображением. Отображать содержимое выбранного сектора удобнее всего в компоненте TStringGrid.

Так как TStringGrid отображает в своих ячейках текст, а мы имеем в буфере двоичные данные, нам понадобятся функции для преобразования.

К счастью, в Delphi они уже есть (IntToHex и StrToInt) и остается их только правильно использовать. StrToInt можно использовать для преобразования строки, содержащей шестнадцатиричное число в Integer, если дописать впереди символ $.

Например, StrToInt('$FF');

Полный код программы, демонстирующей описанное в статье прилагается. Программа умеет показывать структуру логических дисков, выводить на экран содержимое указанного сектора, а также позволяет сохранять дамп выделенного сектора в файл. Реализация возможности редактирования диска в программе особого труда не составит.

P.S.

Для получения доступа к физическому диску мы открывали устройство \\.\PHYSICALDRIVE<n>, далее разбирали его структуру. Можно было поступить проще - открывать сразу логические диски (\\.\C:,\\.\D: и т.д.), но при таком варианте мы бы упустили из виду некоторые области диска, такие как, MBR и неразмеченные области. Какой вариант предпочтительнее, зависит от задачи.

(сKerk
При перепечаке ссылка на сайт https://kladovka.net.ru обязательна.

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить