Мне нужно проанализировать дамп ОЗУ на наличие записей MFT (из Файловая система NTFS).
В прошлом я занимался программированием в отношении чтения заголовков нескольких файлов (используя класс FileSearcher и т. д.), но я не совсем уверен, как начать чтение с начала большого файла, прочитать его и когда найдено определенное значение, мне нужно прочитать 1024 байта с точки, в которой найдено магическое значение (FILE0
, в случае записей MFT), и «делать что-то» со значениями между этим и концом 1024 байта диапазон. Затем необходимо продолжить поиск следующей FILE0
записи.
Пока у меня есть следующее: мое намерение состоит в том, чтобы он читал исходный файл (который является TFileStream) в поисках «FILE0». Когда он найдет его, на данном этапе я просто хочу, чтобы он сообщил, что он нашел запись, и вывел позицию, но со временем мне нужно, чтобы он затем прочитал серию байтов с точки, в которой был найден FILE0:
type
MFTRecordsStore = packed record
FILE0MagicMarker: array[0..4] of byte;
// Lots more follow....
end;
var
MFTHeaderArray : MFTRecordsStore;
FILE0Present : string;
i : integer;
begin
SourceFile.Position := 0;
while (SourceFile.Position < SourceFile.Size) do
begin
SourceFile.ReadBuffer(MFTHeaderArray, SizeOf(MFTHeaderArray));
for i := 0 to 4 do
FILE0Present := FILE0Present + IntToHex(MFTHeaderArray.FILE0MagicMarker[i], 2);
if FILE0Present = 'FILE0' then
begin
Memo1.Lines.Add('FILE0 Entry found at '+ IntToStr(SourceFile.Position));
end;
end;
end;
Этот код компилируется и запускается (начинает анализировать файл), но после нескольких минут интенсивной загрузки процессора программа вылетает и сообщает, что не может прочитать поток. У меня такое ощущение, что это как-то связано с тем, что файл дошел до конца, и не осталось полного «куска» для чтения, поэтому он вылетает?
Каково решение?