AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Alternative für MapAndLoad

Ein Thema von Bernhard Geyer · begonnen am 1. Dez 2020 · letzter Beitrag vom 7. Dez 2020
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.201 Beiträge
 
Delphi 10.4 Sydney
 
#1

Alternative für MapAndLoad

  Alt 1. Dez 2020, 13:18
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?
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

AW: Alternative für MapAndLoad

  Alt 1. Dez 2020, 13:27
Was wäre die alternative festzustellen ob eine Exe 64 Bit ist?
Im Prinzip das Gleiche, was diese Funktion macht. In den PE-Header der EXE schauen, ob die Bits für 64-Bit gesetzt sind.

https://docs.microsoft.com/en-us/win...ebug/pe-format
z.B. IMAGE_FILE_MACHINE_AMD64 und IMAGE_FILE_MACHINE_IA64
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.682 Beiträge
 
Delphi 5 Professional
 
#3

AW: Alternative für MapAndLoad

  Alt 1. Dez 2020, 13:28
Also bei mir funktioniert folgende Funktion seit vielen Jahren einwandfrei, auch unter Win64 und für 64-bit Executables:
Delphi-Quellcode:
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;
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).

Grüße
Dalai
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.201 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Alternative für MapAndLoad

  Alt 1. Dez 2020, 13:30
Also bei mir funktioniert folgende Funktion seit vielen Jahren einwandfrei, auch unter Win64:[DELPHI]
Na dann lass es mal auf eine Exe im Verzeichnis E:\עברית laufen unter Deutschen Windows laufen.
Und auch ein GetShortPathName funktioniert nicht, wenn für E:\ diese Logik der kurzen Dateinnamen nicht aktiv ist.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

AW: Alternative für MapAndLoad

  Alt 1. Dez 2020, 13:34
Oder die Datei nach TEMP kopieren und dort MappenUndLaden
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.201 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Alternative für MapAndLoad

  Alt 1. Dez 2020, 13:34
Was wäre die alternative festzustellen ob eine Exe 64 Bit ist?
Im Prinzip das Gleiche, was diese Funktion macht. In den PE-Header der EXE schauen, ob die Bits für 64-Bit gesetzt sind.

https://docs.microsoft.com/en-us/win...ebug/pe-format
z.B. IMAGE_FILE_MACHINE_AMD64 und IMAGE_FILE_MACHINE_IA64
Also ein Brutalversion wie hier vorgeschlagen:
https://superuser.com/questions/3584...bit-on-windows
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
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.201 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Alternative für MapAndLoad

  Alt 1. Dez 2020, 13:36
Oder die Datei nach TEMP kopieren und dort MappenUndLaden
Ist leider eine 320 MB-Exe (das 32-Bit "könnte noch vorkommen) Gegenstück ist aktuell 270 MB.
Hatte ich mir auch schon überlegt. Wenn dann noch Netzwerk oder VPN dazu kommt hat man gleich ein SAP erschaffen ...
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#8

AW: Alternative für MapAndLoad

  Alt 1. Dez 2020, 14:21
Hey, die sind das Nonplusultra .... jeder will so sein wie die.


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.
$2B or not $2B

Geändert von himitsu ( 1. Dez 2020 um 14:24 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.201 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Alternative für MapAndLoad

  Alt 1. Dez 2020, 14:27
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
Mach jetzt meinen selbstlesen. 1 kB + "Suche PE" und dann 2 Byte weiter die 2 Byte einlesen.
Ich denke damit kann ich die nächsten 3-5 Jahre überbrücken, bis 32-Bit auch für uns komplett gestorben ist.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.682 Beiträge
 
Delphi 5 Professional
 
#10

AW: Alternative für MapAndLoad

  Alt 1. Dez 2020, 19:07
Na dann lass es mal auf eine Exe im Verzeichnis E:\עברית laufen unter Deutschen Windows laufen.
Deswegen sagte ich ja
Ich gebe zu, dass es auch etwas problematisch sein dürfte mit Unicode-Zeichen im Pfad
Zitat:
Und auch ein GetShortPathName funktioniert nicht, wenn für E:\ diese Logik der kurzen Dateinnamen nicht aktiv ist.
In welcher Verbindung steht das mit der Frage, welche Architektur ein Executable hat?

Grüße
Dalai
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:13 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz