Действителен IMAGE_DOS_SIGNATURE - PullRequest
2 голосов
/ 21 апреля 2010

Я хочу проверить, что файл имеет действительный IMAGE_DOS_SIGNATURE (MZ)

function isMZ(FileName : String) : boolean;
var
 Signature: Word;
 fexe: TFileStream;
begin
result:=false;
try
  fexe := TFileStream.Create(FileName, fmOpenRead or fmShareDenyNone);
  fexe.ReadBuffer(Signature, SizeOf(Signature));
  if Signature = $5A4D { 'MZ' } then
  result:=true;
finally
fexe.free;
end;
end;

Я знаю, что могу использовать некоторый код в модуле Windows, чтобы проверить IMAGE_DOS_SIGNATURE. Проблема в том, что я хочу, чтобы самый быстрый способ проверил IMAGE_DOS_SIGNATURE (для большого файла). Мне нужно ваше предложение о моем коде или, возможно, новый код?

Спасибо

1 Ответ

4 голосов
/ 21 апреля 2010

Размер файла не имеет значения, потому что ваш код читает только первые два байта.

Любые накладные расходы от выделения и использования TFileStream, которые проходят через SysUtils.FileRead до достижения Win32 ReadFile, должны быть почти невидимым шумом по сравнению со стоимостью поиска в единственной ситуации, где это должно иметь значение, где вы сканируете сотни исполняемых файлов.

Возможно, есть некоторая выгода в настройке кэширования Windows с помощью необработанного WinAPI, но я ожидаю, что он будет очень незначительным.

...