นวัตกรรม สิ่งประดิษฐ์ และเทคโนโลยี

กรุณา เข้าสู่ระบบ หรือ สมัครสมาชิก.

เข้าสู่ระบบด้วยชื่อผู้ใช้ รหัสผ่าน และระยะเวลาในเซสชั่น
การค้นหาขั้นสูง  

ผู้เขียน หัวข้อ: define binary exe type  (อ่าน 77 ครั้ง)

NAWATTAKAM

  • Administrator
  • Sr. Member
  • *****
  • กระทู้: 383
define binary exe type
« เมื่อ: กุมภาพันธ์ 11, 2019, 09:14:55 PM »

Delphi


แบบที่ 1
โค๊ด
{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

โค๊ด
{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;
บันทึกการเข้า