VisualBasic erkennen ob eine .exe 16 oder 32 Bit ist

easy.2ci

Commodore
Registriert
Mai 2006
Beiträge
4.388
Hallo,

ich muss von einem Programm aus erkennen können, ob in einem Verzeichnis vorhandene .exe Dateien als 16 Bit oder 32 Bit .exe Dateien kompiliert wurden.

Ein Kommandozeilentool dessen Aufruf ich in meinem Programm einbauen könnte habe ich nicht gefunden.

Die Information muss in den .exe Dateien im PE Header stehen, damit Windows selbst überhaupt weiß, wie er die .exe zu nehmen hat.

Nur leider weiß ich nicht, wie ich an die Daten im PE Header komme, und vor allem wenn man sich die Daten mit einem PE Explorer anschaut, wie diese zu interpretieren sind.


Hat da jemand eine schlaue Idee zu? Falls jemand ein Kommandozeilentool kennt, dann würde mir das auch reichen.


Viele Grüße
 
Die 32-Bit-.exe hat nach ein paar Bytes diese typische Meldung, dass es eine Win32-Anwendung ist. Diese wird in 16-Bit-Umgebungen (zB DOS) immer ausgegeben. Afaik gibt es diesen 16-Bit-Stub in jeder (!) 32-Bit-exe.
 

Anhänge

  • Unbenannt.png
    Unbenannt.png
    134,2 KB · Aufrufe: 417
Okay, das heisst dein Ansatz wäre eine definierte Anzahl an Bytes der .exe einzulesen und auf diesen String zu prüfen.

Klingt interessant. Danke für den Hinweis. Muss da jetzt erstmal drüber nachdenken ;-)
 
Google mal ein wenig nach "pe header" oder "pe header visual basic". Dann findest du wohl auch Informationen, wie du eine PE-Datei (also .exe, .dll etc.) mit Hilfe von WinAPI-Funktionen auf 32/16-Bit prüfen kannst.
 
Da wäre noch ein Problem, dass mir gerade einfällt. Der Text kann sich unterscheiden. Ich weiß noch, dass damals zu DOS & Win95-Zeiten der Text etwa "This is a Win32 programm bla" ging. D. h., es wohl doch kein allgemeingültiger Ansatz.

Allerdings war das noch bei den ersten 32-Bit-Programmen. Es kann sein, dass der Satz mit dem "can not run in dos mode" heute überall Standard ist.
 
Danke soweit. Melde mich wenn ich ein Stück weiter bin.
 
das is quatsch nach dem text zu suchen. man kann den PE header auslesen und bekommt die info dort direkt als integer-konstante geliefert.

Am Dateianfang befindet sich die Struktur IMAGE_PE_HEADER (http://www.nirsoft.net/kernel_struct/vista/IMAGE_DOS_HEADER.html)
Auf Dateioffset IMAGE_PE_HEADER.e_lfanew befindet sich ein IMAGE_NT_HEADERS (http://msdn.microsoft.com/en-us/library/ms680336(VS.85).aspx)

Und in IMAGE_NT_HEADERS.FileHeader.Machine befindet sich die gesuchte Information.
Siehe http://msdn.microsoft.com/en-us/library/ms680313(VS.85).aspx
 
Danke für deine Antwort. Ganz klar ob ich da richtig bin ist es mir allerdings nicht. Die Struktur vom IMAGE_FILE_HEADER gibt mir die Rechner Architektur zurück, für die eine .exe im PE Format ist. IA64 X64 X86

Das hilft mir aber nicht, denn ich muss wissen, welche der .exe Files 16Bit sind und somit nicht mehr bei abgeschaltetem 16Bit WOW NTVDM laufen würden.

Aufgrund der Masse an zu prüfenden Programmen muss eine Automatisierte Prüfung her, ein einlesen jeder einzelnen Datei in Tools wie den PE Explorer ist nicht durchführbar.

Ich werd morgen früh nach entsprechenden API Funktionen suchen, irgendwie muss es ja gehen.
 
16-Bit Windows-Files besitzen meines Wissens nach keinen IMAGE_NT_HEADER, sondern einen IMAGE_OS2_HEADER Header mit Magic IMAGE_OS2_SIGNATURE (0x454e)
 
Zurück
Oben