Mirror

Determine the type of an EXE file (Views: 101)


Problem/Question/Abstract:

Determine the type of an EXE file

Answer:

Here's a function to return the platform the executable was designed for (16/32 bit Windows or DOS). Read the comment for the usage. This function works as well with DLLs, COMs, and maybe others. Thanks to Peter Below for this code.

Use it as shown at the bottom of the code snippet.

//-------------------------------------------------------------------------
//  function to return the type of executable or dll (DOS, 16-bit, 32-bit).
//-------------------------------------------------------------------------

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

function GetExeType(const FileName: string): TExeType;
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;

begin
  case GetExeType(aFileName) 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;
end;

<< Back to main page