...define binary exe type?

Author: Simon Grossenbacher
Homepage: http://www.swissdelphicenter.ch

Category: Files

{1.}

function GetEXEType(FileName: string): string;
var
  
BinaryType: DWORD;
begin
  if 
GetBinaryType(PChar(FileName), Binarytype) then
    case 
BinaryType of
      
SCS_32BIT_BINARY: Result := 'Win32 executable';
      SCS_DOS_BINARY: Result   := 'DOS executable';
      SCS_WOW_BINARY: Result   := 'Win16 executable';
      SCS_PIF_BINARY: Result   := 'PIF file';
      SCS_POSIX_BINARY: Result := 'POSIX executable';
      SCS_OS216_BINARY: Result := 'OS/2 16 bit executable'
        else
          
Result := 'unknown executable'
    end
  else
    
Result := 'File is not an executable';
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  
label1.Caption := GetEXEType('c:\windows\notepad.exe');
end;


{
 Windows NT/2000: Requires Windows NT 3.5 or later.
 Windows 95/98: Unsupported.
}


{********************************************************************}

{2.}

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;

 

printed from
www.swissdelphicenter.ch
developers knowledge base