Определить тип EXE-файла 2

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Оформил: DeeCo

Автор: http://www.swissdelphicenter.ch

type

TExeType = (etUnknown, etDOS, etWinNE {16-bit}, etWinPE {32-bit});

function GetExeType(const FileName: string): TExeType;

{ func to return the type of executable or dll (DOS, 16-bit, 32-bit). }

(**************************************************************

Usage:

with OpenDialog1 do

if Execute then

begin

Label1.Caption := FileName;

Label2.Caption := ExeStrings[GetExetype(FileName)];

end;

— or —

case GetExeType(OpenDialog1.FileName) of

etUnknown: Label3.Caption := ‘Unknown file type’;

etDOS : Label3.Caption := ‘DOS executable’;

etWinNE : {16-bit} Label3.Caption := ‘Windows 16-bit executable’;

etWinPE : {32-bit} Label3.Caption := ‘Windows 32-bit executable’;

end;

***************************************************************)

var

Signature,

WinHdrOffset: Word;

fexe: TFileStream;

begin

Result := etUnknown;

try

fexe := TFileStream.Create(FileName, fmOpenRead or fmShareDenyNone);

try

fexe.ReadBuffer(Signature, SizeOf(Signature));

if Signature = $5A4D { ‘MZ’ } then

begin

Result := etDOS;

fexe.Seek($18, soFromBeginning);

fexe.ReadBuffer(WinHdrOffset, SizeOf(WinHdrOffset));

if WinHdrOffset >= $40 then

begin

fexe.Seek($3C, soFromBeginning);

fexe.ReadBuffer(WinHdrOffset, SizeOf(WinHdrOffset));

fexe.Seek(WinHdrOffset, soFrombeginning);

fexe.ReadBuffer(Signature, SizeOf(Signature));

if Signature = $454E { ‘NE’ } then

Result := etWinNE

else

if Signature = $4550 { ‘PE’ } then

Result := etWinPE;

end;

end;

finally

fexe.Free;

end;

except

end;

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

if OpenDialog1.Execute then

case GetExeType(OpenDialog1.FileName) of

etUnknown: Label_ExeType.Caption := ‘Unknown file type’;

etDOS : Label_ExeType.Caption := ‘DOS executable’;

etWinNE : Label_ExeType.Caption := ‘Windows 16-bit executable’;

etWinPE : Label_ExeType.Caption := ‘Windows 32-bit executable’;

end;

end;

{/codecitation}

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