![]() |
Alternative für MapAndLoad
In der JCL (TJclPeImage) wird beim Laden die WinAPI MapAndLoad verwendet.
Unglücklicherweise verwendet diese AnsiStrings statt Unicodestrings. Kombiniert damit das nich überalle 8.3-Dateinamen mehr existieren schlägt damit die Prüfung ob eine Exe-Datei 64-Bit ist fehlt (LoadedImage.FileHeader^.FileHeader.Machine aus dem TJclPeImage). Was wäre die alternative festzustellen ob eine Exe 64 Bit ist? Ich würde das eigentlich benötigen ohne das ich dise Exe Starte? |
AW: Alternative für MapAndLoad
Zitat:
![]() z.B. IMAGE_FILE_MACHINE_AMD64 und IMAGE_FILE_MACHINE_IA64 |
AW: Alternative für MapAndLoad
Also bei mir funktioniert folgende Funktion seit vielen Jahren einwandfrei, auch unter Win64 und für 64-bit Executables:
Delphi-Quellcode:
Ich gebe zu, dass es auch etwas problematisch sein dürfte mit Unicode-Zeichen im Pfad, aber bislang hab ich keine andere Möglichkeit gefunden (aber in den vergangenen paar Jahren auch nicht mehr danach gesucht).
function GetExecutableArchitecture(const AFileName: string): Word;
var LI: TLoadedImage; begin if NOT MapAndLoad(PAnsiChar(AnsiString(AFileName)), nil, @LI, False, True) then RaiseLastOsError; Result := LI.FileHeader.FileHeader.Machine; UnMapAndLoad(@LI); end; Grüße Dalai |
AW: Alternative für MapAndLoad
Zitat:
Und auch ein GetShortPathName funktioniert nicht, wenn für E:\ diese Logik der kurzen Dateinnamen nicht aktiv ist. |
AW: Alternative für MapAndLoad
Oder die Datei nach TEMP kopieren und dort MappenUndLaden :stupid:
|
AW: Alternative für MapAndLoad
Zitat:
![]() Also 1, Suche "PE" in der Datei 2, Überspringe die beiden Null-Zeichen (\0\0) 3, Wenn jetzt d† kommt ($64 $86) kommt dann hat man AMD64 |
AW: Alternative für MapAndLoad
Zitat:
Hatte ich mir auch schon überlegt. Wenn dann noch Netzwerk oder VPN dazu kommt hat man gleich ein SAP erschaffen ... |
AW: Alternative für MapAndLoad
Hey, die sind das Nonplusultra .... jeder will so sein wie die. :stupid:
Pssst, wenn MapAndLoad bissl Fehlertollerant ist, dann reicht es ja das erste KB/MB zu kopieren. Du brauchst ja nur die zwei/drei Header am Anfang. Das sind zwei Records. Im Ersten ab Adresse 0 steht drin, wo der Andere anfängt und dort drin findeste dann das interessante Byte/Feld. An Position X steht der Offset zum Zweiten, dort noch bissl was drauf rechnen (im zweiten Record) und djeses Byte dann auslesen. |
AW: Alternative für MapAndLoad
Zitat:
Ich denke damit kann ich die nächsten 3-5 Jahre überbrücken, bis 32-Bit auch für uns komplett gestorben ist. |
AW: Alternative für MapAndLoad
Zitat:
Zitat:
Zitat:
Grüße Dalai |
AW: Alternative für MapAndLoad
Zitat:
|
AW: Alternative für MapAndLoad
Zitat:
PS: Die durch MapAndLoad gefüllte Datenstruktur LOADED_IMAGE lässt noch mehr zu, als nur die Plattform auszulesen. Grüße Dalai |
AW: Alternative für MapAndLoad
Die
![]() Heißt, dass Unicode-Dateinamen damit nicht möglich sind und man sie z.B. durch GetShortPathName in ANSI umwandeln müsste. |
AW: Alternative für MapAndLoad
Ah, jetzt verstehe ich den Zusammenhang. Ja, das ist nachvollziehbar. Vielleicht könnte man mit den Funktionen
![]() ![]() ![]() Übrigens gibt's MapAndLoad im Win2k auch schon. Grüße Dalai |
AW: Alternative für MapAndLoad
Ich würde die Funktion selbst schreiben, ohne MapAndLoad, sondern einfach mit einem TFileStream, da ist die Dateigröße auch egal und das funktioniert performant.
Ich kann meinen getesteten Code hier teilen, um die Bittigkeit einer EXE zu prüfen, falsch gewünscht. Edit: LoadLibraryEx() mit LOAD_LIBRARY_AS_DATAFILE, ist sonst was man verwendet um Module (DLLs/EXE usw.) in den Speicher zu laden, und dann dort direkt mit Pointern weiter zu arbeiten. Windows verwendet hier automatisch Paging und wird nur die relevanten Teile laden. Aber wenn etwas mit virtuellen Addressen zu tun hat, muss man trotzdem umrechnen. Und die Offsets in den Dateiheadern muss man auch beachten. Feste Offsets/Konstanten sollte man nicht verwenden, um an die richtige Stelle zu springen. |
AW: Alternative für MapAndLoad
Zitat:
Der Code bleibt trotzdem knapp, etwa eine Bildschirmseite. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz