Entwickler-Ecke

Windows API - Kleinstmögliche EXE?


Aya - Sa 04.06.05 21:12
Titel: Kleinstmögliche EXE?
Hi,

ich bastle grad an einer 64k Demo rum und hab da ein mehr oder weniger großes problem *g*

Der reine Code zum Fenster erstellen schluckt 8.5kb der EXE Datei... geht das mit Delphi noch irgendwie kleiner???

Denn das ist mir dann doch noch etwas zu groß.. und möglich muß es sein, denn es gibt viele Fenster-Programme die kleiner als 4kb sind.
(Mein OpenGL kram den ich bisher drin hab verbraucht grad mal 4kb und das sind schon knapp 100.000 Vertices mit Texturen... *g*)

Hier mal mein Code für's Fenster erstellen:



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
program Project1;

uses
  K64Windows,
  K64Messages;

const
  ClassName = 'K64';
  AppName = 'Koshigaya Studios - 64k Demo';

var
  Handle: hWnd;
  Go: Array[0..255of Boolean;
  WindowWidth: Integer = 1280;
  WindowHeight: Integer = 960;


function WndProc(hWnd: HWND; message: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
  Result:=0;
  Case message of
    WM_CREATE: begin

    end;
    WM_DESTROY, WM_CLOSE: begin
      PostQuitMessage(0);
    end;
    WM_KEYDOWN: begin
      Go[wParam]:=true;
    end;
    WM_KEYUP: begin
      Go[wParam]:=false;
    end;
    WM_SIZE: begin

    end;
    else begin
      Result:=DefWindowProc(hWnd,message,wParam,lParam);
      exit;
    end;
  end;
end;

var
  wc: TWndClassEx = (
    cbSize          : SizeOf(TWndClassEx);
    Style           : CS_HREDRAW or CS_VREDRAW;
    lpfnWndProc     : @WndProc;
    cbClsExtra      : 0;
    cbWndExtra      : 0;
    hbrBackground   : COLOR_APPWORKSPACE;
    lpszMenuName    : nil;
    lpszClassName   : ClassName;
    hIconSm         : 0;
  );
  msg: TMSG;
  done: Boolean = false;
begin
  wc.hInstance  := hInstance;
  wc.hIcon      := LoadIcon(0,IDI_APPLICATION);
  wc.hCursor    := LoadCursor(0,IDC_ARROW);
  RegisterClassEx(wc);
  Handle:=CreateWindowEx(0,ClassName,AppName,WS_CAPTION or WS_VISIBLE or WS_SYSMENU or WS_MINIMIZEBOX or WS_MAXIMIZEBOX or WS_SIZEBOX,Integer(CW_USEDEFAULT),Integer(CW_USEDEFAULT),WindowWidth,WindowHeight,0,0,hInstance,nil);
  ShowWindow(Handle,SW_MAXIMIZE);
  while not done do begin
    if (PeekMessage(msg,0,0,0,PM_REMOVE)) then begin
      if msg.message=WM_QUIT then begin
        done:=true;
      end else begin
        TranslateMessage(msg);
        DispatchMessage(msg);
      end;
    end;
  end;
end.


Wie ihr steht hab ich bei den Uses schon eigene Units gemacht... in der K64Messages und K64Windows ist nurnoch das drin was wirklich benötigt wird (beide nurnoch ca. 30-40 Zeilen).

Ich hab auch nirgendwo noch ne andere Unit eingebunden.

Und jetzt kann mir hoffentlich einer von den NonVCL'lern sagen wie ich es noch kleiner bekomme ;)

Au'revoir,
Aya~

PS: Mit ExePacker wird's von 8.5 auf 5.5kb gepackt.. immernoch zuviel ;)


Coder - Sa 04.06.05 21:18

Mit dem Resource Hacker [http://www.users.on.net/johnson/resourcehacker/] kann man auch Resourcen aus exe-Dateien löschen.
Das meiste was ich gefunden hab konnte ich ohne Probleme rauslöschen. zb die Cursor.
Weis nich ob das dir was hilft. :lol:


3rdnuss - Sa 04.06.05 21:36

Wo hast du denn da Cursor gefunden? Ich hab das gerade auch mit dem ResHacker und anderen Programmen wie ExeScope versucht. Aber ich hab da nix rauslöschbares gefunden?

Aber ich denke nicht, dass man das Prorgramm viel kleiner bekommt.
Also bei Luckies Beispielen (irgendwo auf seiner HP) sind die Programme auch nicht kleiner.


JayEff - Sa 04.06.05 21:44

das prog klappt nur bei delphi programmen soweit ich weis.


raziel - So 05.06.05 06:09

Selbst mit Assembler kommst du bei einigen Assembler/Linker Gespannen nicht unter 4kB. Knapp über 1kB geht schon alleine für die Header drauf. Es würde kleiner gehen, aber nur mit viel Mühe+Hexeditor+Genaueres Studium der PE-Exe-Header. ;)


hansa - So 05.06.05 06:52

Was soll denn der Zweck solcher Aktionen sein ? :shock: Wem nützt denn heutzutage eine Festplatten-Ersparniss von 10 KB ?? Die deutsche Bank würde zurecht sagen, das wären Peanuts um die sich keiner kümmern wird. :mrgreen:


mimi - So 05.06.05 07:29

ganz einfach: Es gibt ganze demo sezne die mit 64 KB rum spielen und toll sachen damit schaffen, es ist eine Sport art wenn man so möchte, es gibt viele messen und veranstalltungen zu diesem thema...

@Aya ist ist möglich ich habe mal irgenwo beispiele gesehen asm+winapi und da waren die exe dateien kleiner als 4 KB, ich weiß leider nicht mehr wo, ich habe die demos aber gesichert ich werde mal in der nächsten woche danach suchen(sobalt ich zuhause bin)

Es ist aber schon toll: das ein normales delphi progamm über 300 KB verbraucht und die WinApi gerade mal 7-8 KB verbraucht(bzw. die KOL kompos)


matze - So 05.06.05 10:28

die leute aus der demo szene nehmen dann noch am shcluss eine modifizierte UPX Version her um das ding zu packen !


Aya - So 05.06.05 10:31

Hi,

user profile iconmatze hat folgendes geschrieben:
die leute aus der demo szene nehmen dann noch am shcluss eine modifizierte UPX Version her um das ding zu packen !


jap.. aber wie gesagt bekomme ich damit das ganze auch nur auf 5.5kb klein gepackt.. :(

Au'revoir,
Aya~


tommie-lie - So 05.06.05 11:33

Hast du Nicos system.pas und sysinit.pas schon drin (http://www.bendlins.de/nico/delphi/MiniDExe.zip)? Allerdings darfst du dann auf Compiler-Magic und damit auch auf Objektorientierung verzichten, aber immerhin kriegt er seine Echsen auf viereinhalb kB.


Aya - So 05.06.05 11:38

Hi,

hab es auf andere art und weise hinbekommen.. :)

Wenn man Windows vorgaukelt es sein eine COM Datei und das dann mit UPX packt etc wird die exe im endeffekt knapp 2kb groß... :)
(Hab eine system.pas von "Vladimir Kladov" benutzt)

Danke trotzdem für eure hilfe :)

Au'revoir,
Aya~


Delete - Mo 13.06.05 10:50

Und das funktioniert auf Windows 9x? Sollte eigentlich nicht, da das File-Alignment dort einen Wert von 0x1000 haben muß.


retnyg - Mo 13.06.05 11:57

user profile iconSTATUS_ACCESS_DENIED hat folgendes geschrieben:
Und das funktioniert auf Windows 9x? Sollte eigentlich nicht, da das File-Alignment dort einen Wert von 0x1000 haben muß.

bei com-dateien gibts kein alignment :mahn:


Delete - Mo 13.06.05 12:55

user profile iconretnyg hat folgendes geschrieben:
user profile iconSTATUS_ACCESS_DENIED hat folgendes geschrieben:
Und das funktioniert auf Windows 9x? Sollte eigentlich nicht, da das File-Alignment dort einen Wert von 0x1000 haben muß.

bei com-dateien gibts kein alignment :mahn:
Natürlich gibt es ein Alignment, auch wenn es 16 Byte (1 Paragraph) ist, oder?

Mich würde vielmehr interessieren, wie man UPX eine COM-Datei "vorgaukelt" und dann die Sache packt! Schließlich überprüft UPX normalerweise die Strukturen einer PE-Datei und läßt packen nur innerhalb der Parameter zu. Für Windows 9x gibt es dann besagtes 4kB-Aligment. Ohne das wird die PE garnicht erst geladen, weil der Loader es verhindert. Fazit: mich interessiert, ob die PE danach noch sowohl auf Windows 9x als auch NT sauber läuft.


retnyg - Mo 13.06.05 13:02

user profile iconSTATUS_ACCESS_DENIED hat folgendes geschrieben:
Natürlich gibt es ein Alignment, auch wenn es 16 Byte (1 Paragraph) ist, oder?
sonderbar, wenn ich mit TASM ein "hallo-welt" kompiliere, hat 22 bytes...

user profile iconSTATUS_ACCESS_DENIED hat folgendes geschrieben:
Mich würde vielmehr interessieren, wie man UPX eine COM-Datei "vorgaukelt" und dann die Sache packt! Schließlich überprüft UPX normalerweise die Strukturen einer PE-Datei und läßt packen nur innerhalb der Parameter zu. Für Windows 9x gibt es dann besagtes 4kB-Aligment. Ohne das wird die PE garnicht erst geladen, weil der Loader es verhindert. Fazit: mich interessiert,
ob die PE danach noch sowohl auf Windows 9x als auch NT sauber läuft.


http://www.virusexchange.org/positron/delphi/migeel/index.htm


Delete - Mo 13.06.05 13:13

user profile iconretnyg hat folgendes geschrieben:
user profile iconSTATUS_ACCESS_DENIED hat folgendes geschrieben:
Natürlich gibt es ein Alignment, auch wenn es 16 Byte (1 Paragraph) ist, oder?
sonderbar, wenn ich mit TASM ein "hallo-welt" kompiliere, hat 22 bytes...
Wirst du recht haben. Habe ich verwechselt mit Speicher-Alignment. Ist eben 1 Byte.

user profile iconretnyg hat folgendes geschrieben:
http://www.virusexchange.org/positron/delphi/migeel/index.htm
Danke. Ich schau's mir an.