Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Per batch herausfinden, ob das zu installierende programm x64 oder x86 lauffähig ist

Frage Entwicklung

Mitglied: ChrisDynamite

ChrisDynamite (Level 2) - Jetzt verbinden

11.08.2013, aktualisiert 21:41 Uhr, 3193 Aufrufe, 10 Kommentare

Guten Abend,

kennt jemand einen ein- oder zweizeiler, mit welchem ich eine installationsdatei in form einer exe prüfen kann, ob diese bei windows 7 bsp in das program files oder in das program files (x86) hineinschreiben wird, sprich welche architektur das setup unterstützt?

freundliche grüße chris

zusatz: oder kennt jemand eine andere lösung? ich schreibe eine bat, welche in abhängigkeit der prozessorarchitektur UND die Architektur des Setups die richtige EXE installiert.

sprich wenn OS=64 und die installierbare EXE=64, dann installiere die X64 variante. oder wenn OS=64 und die installierbare EXE=86, dann installiere die X86 variante.
Mitglied: rubberman
11.08.2013, aktualisiert um 22:32 Uhr
Hallo Chris,

ich kann deine Frage nicht so richtig nachvollziehen. Du wirst doch vorher wissen, ob dein Installer ein 64 Bit oder ein 32 Bit Programm ist, oder?

Es ist nicht so, dass man nicht auch den Dateiheader untersuchen könnte (per FC /B gegen eine vorher mit FSUTIL erzeugte temporäre Datei aus Nullzeichen), aber mit einem Ein- oder Zweizeiler hat das dann nichts mehr zu tun (es sei denn, es gibt irgendein 3rd Party Tool, Google wird's dir sagen ...).

Die Prozessorarchitektur hat übrigens auch nicht zwingend etwas mit dem Betriebssystem zu tun.

Grüße
rubberman
Bitte warten ..
Mitglied: 112778
11.08.2013, aktualisiert um 23:35 Uhr
Hi,

Zitat von ChrisDynamite:
.... oder wenn OS=64 und die installierbare EXE=86, dann installiere die X86 variante.

Wenn die Exe für x86 gedacht ist, ist die Architektur, mit der das (Windows-) OS installiert ist, völlig schnurz, dann kanst du sowieso keine andere EXE installieren.

Oder hast du dich nur etwas wirr ausgedrückt?

Gruß
Bitte warten ..
Mitglied: ChrisDynamite
12.08.2013 um 08:56 Uhr
Guten Morgen,

also VLC bsp. den gibt es als x86 und als x64 version. auf einem x64 system kann ich ja bekanntlich beide installieren. der unterschied ist, dass die dateien dann entweder im "program files" oder im "program files (x86) liegen. so. ich möchte nun eine batch schreiben, welche intelligent genug ist aus einem poolordner die exe herauszupicken, welche für das system am geeignetsten ist. hierzu muss ich ja vor der installation prüfen, ob die exe für x64 geeignet ist, oder ob es besser ist, die x86 variante zu installieren.
Bitte warten ..
Mitglied: rubberman
12.08.2013, aktualisiert um 19:19 Uhr
Hallo Chris,

ich habe keine Ahnung was so schwierig sein soll, 32 Bit Programme in ein Poolverzeichnis zu packen und 64 Bit Programme in ein anderes.
Ich habe gestern Abend mal noch fix eine Subroutine zusammengebaut, damit du eine Vorstellung bekommst, wie das was du vorhast aussieht
Funktion:
- Pfad wird an die Routine übergeben
- Hex Dump des Dateiheaders erstellen
- Suche nach der "Magic Number" Ermittle die Ziel-CPU
- Rückgabewert (Errorlevel) 0 bei Fehler, sonst 32 bzw. 64
01.
@echo off &setlocal 
02.
 
03.
call :get3264exe "%SystemRoot%\explorer.exe" 
04.
echo Windows Explorer: %errorlevel% Bit 
05.
 
06.
pause 
07.
goto :eof 
08.
 
09.
 
10.
::::::::::::::::::: 
11.
:get3264exe ExePath 
12.
setlocal DisableDelayedExpansion 
13.
 
14.
REM Eingehender Parameter (*.exe Dateipfad) 
15.
set "infile=%~1" 
16.
 
17.
if not exist "%infile%" (endlocal &exit /b 0) 
18.
if /i "%infile:~-4%" neq ".exe" (endlocal &exit /b 0) 
19.
 
20.
set "tmpf=%temp%\#.tmp~" 
21.
set "dump=%temp%\##.tmp~" 
22.
 
23.
REM 1024 mal A in temporäre Datei schreiben. 
24.
>"%tmpf%" (for /l %%i in (1 1 1024) do <nul set /p "=A") 
25.
 
26.
REM HexDump der ersten 1024 Byte des Executables erstellen 
27.
setlocal EnableDelayedExpansion 
28.
set /a x=1 
29.
>"!dump!" ( 
30.
  for /f "skip=1 tokens=1,2 delims=: " %%i in ('fc /b "!infile!" "!tmpf!"^|findstr /vbic:"FC:"') do ( 
31.
    set /a y=0x%%i 
32.
    for /l %%k in (!x! 1 !y!) do echo 41 
33.
    echo %%j 
34.
    set /a x=y+2 
35.
36.
37.
endlocal 
38.
 
39.
REM Temporäre Datei löschen. 
40.
del "%tmpf%" 
41.
 
42.
REM Position der PE Signatur ermitteln. 
43.
<"%dump%" ( 
44.
  for /l %%i in (1 1 60) do set /p "=" 
45.
  set /p "PosPE1=" 
46.
  set /p "PosPE2=" 
47.
48.
set /a "PosPE=0x%PosPE2%%PosPE1%" 
49.
 
50.
if %PosPE% gtr 1000 ( 
51.
  REM Kein Executable. 
52.
  endlocal &exit /b 0 
53.
54.
 
55.
REM PE Signatur und Machine ermitteln 
56.
<"%dump%" ( 
57.
  for /l %%i in (1 1 %PosPE%) do set /p "=" 
58.
  set /p "PE1=" 
59.
  set /p "PE2=" 
60.
  set /p "PE3=" 
61.
  set /p "PE4=" 
62.
  set /p "Machine1=" 
63.
  set /p "Machine2=" 
64.
65.
 
66.
 
67.
REM HexDump löschen. 
68.
del "%dump%" 
69.
 
70.
REM Prüfungen 
71.
set "Bit=" 
72.
if "%PE1%%PE2%%PE3%%PE4%"=="50450000" ( 
73.
  if "%Machine2%%Machine1%"=="8664" ( 
74.
    set "Bit=64" 
75.
  ) else ( 
76.
    set "Bit=32"     
77.
78.
) else ( 
79.
  REM PE Signatur nicht gefunden. 
80.
  endlocal &exit /b 0 
81.
82.
REM Alles OK 
83.
endlocal &exit /b %Bit%
Bei Fragen, bitte fragen Antwort kommt aber erst heute Abend ...

Grüße
rubberman

EDIT: @112778 's Anregungen aufgegriffen und "Magic" gegen "Machine" ausgetauscht.
Bitte warten ..
Mitglied: 112778
12.08.2013, aktualisiert um 16:53 Uhr
Hi,

@ rubberman
%Magic% kommt 4 Byte hinter der 32-Bit-langen PE-Kennung und muss
0x014c (also 50 45 00 00 4c 01) für 32-Bit und
0x8664 (also 50 45 00 00 64 86) für 64-Bit lauten.

Ein 16-Bit-Programm (trunk_16.exe aus Win7-64 z. B.) hat hinter der 2-Byte PE-Kennung keine 2 Nullen, sondern irgendwas Anderes.

@ ChrisDynamite
Du könntest dumpbin.exe (benötigt Link.exe) aus Microsoft Visual C ++ - Paketen nutzen mit dem Parameter /HEADERS
damit kannst du die Informationen ohne Umweg direkt aus der Exe/dll holen.
Wenn du ein kleines Programm haben möchtest, das ich in Delphi gestrickt habe (44k), melde dich per PN. ;)

Der Header vom VLC-2.1.0-pre1-64-Bit-Setup ist übrigens falsch und somit zum Testen unbrauchbar.

Gruß
Bitte warten ..
Mitglied: rubberman
12.08.2013 um 17:35 Uhr
@112778

%Magic% kommt 4 Byte hinter der 32-Bit-langen PE-Kennung und muss
0x014c (also 50 45 00 00 4c 01) für 32-Bit und
0x8664 (also 50 45 00 00 64 86) für 64-Bit lauten
Nope. Was du meinst ist "Machine" aus dem IMAGE_FILE_HEADER und gibt die Ziel-CPU an.
msdn.microsoft.com/en-us/library/ms809762.aspx
0x14d	Intel i860 
0x14c	Intel I386 (same ID used for 486 and 586) 
0x162	MIPS R3000 
0x166	MIPS R4000 
0x183	DEC Alpha AXP
... kann also für 32 Bit Programme auch was ganz Anderes als 0x014C sein

"Magic" steht im IMAGE_OPTIONAL_HEADER
IMAGE_NT_OPTIONAL_HDR32_MAGIC	0x10b  
IMAGE_NT_OPTIONAL_HDR64_MAGIC	0x20b.
Und ...
msdn.microsoft.com/en-us/magazine/cc301805.aspx
The only correct, Microsoft-approved way of differentiating between the two formats [32 und 64-Bit-Anwendungen] is via the value of the Magic field in the IMAGE_OPTIONAL_HEADER

Von 16-Bit-Anwendungen war zum Glück nie die Rede

Grüße
rubberman
Bitte warten ..
Mitglied: 112778
12.08.2013 um 17:54 Uhr
@ rubberman

Wenn du meinst ....
Deshalb liefert dein Script ja auch keine brauchbaren bzw. falsche Ergebnisse.

Meine Abfrage mit allen Exe-Dateien unter Windows7-64 hat jedenfalls alle korrekt erkannt.
Microsoft hat asuch einen Artikel veröffentlicht, in dem ausschließlich auf 014C für 32-Bit-Programme verwiesen wird. Den such ich jetzt aber nicht extra nochmal.

Nur die Ziel-CPU ist interessant: Intel x86/x64 und die entsprechenden von AMD. Was interessieren für Windows-OS-Nutzer andere CPUs (vielleicht außer IA64) mit denen Windows-Programme garantiert nicht laufen......

Gruß
Bitte warten ..
Mitglied: rubberman
12.08.2013, aktualisiert um 18:05 Uhr
Deshalb liefert dein Script ja auch keine brauchbaren bzw. falsche Ergebnisse.
Hmm, kann ich nicht bestätigen. Habe ausgiebig auf Win7 x86 und x64 getestet. Bislang ohne Negativergebnis.

Nur die Ziel-CPU ist interessant: Intel x86/x64 und die entsprechenden von AMD. Was interessieren für Windows-OS-Nutzer andere CPUs (vielleicht außer IA64) mit denen Windows-Programme garantiert nicht laufen......
Da hast du schon Recht. Letztlich kann man auch einfach auf 0x8664 testen. Ist es was Anderes, dann ist es eine 32-Bit-Anwendung. Egal, ich hab nichts anderes gefunden als den Verweis auf "Magic" im oben verlinkten Beitrag. Der ist allerdings nicht mehr so ganz up to date (2002). Schon möglich, dass M$ inzwischen eine andere Lesart als Maß der Dinge annimmt

Grüße
rubberman
Bitte warten ..
Mitglied: 112778
12.08.2013, aktualisiert um 18:40 Uhr
Hmm, kann ich nicht bestätigen. Habe ausgiebig auf Win7 x86 und x64 getestet. Bislang ohne Negativergebnis.
Gleich die ersten beiden, die ich getestet habe, lieferten mir 32-Bit zurück, obwohl es 64bitter waren: Totalcommander tcmdx64.exe und df64.exe (Defraggler).
Die Magic # ist dafür imo nicht gedacht.

Magic # definiert 10B = PE für die meisten Windows-Anwendungen. 20B = PE+ ist, soweit ich das verstanden habe, gedacht für Image-Limitierungen bis 2 GB. Die DOCX mit den neuesten Infos aus 2013 heißt pecoff_v83.docx

http://download.microsoft.com/download/9/C/5/9C5B2167-8017-4BAE-9FDE-D5 ...

Ob der Link funktioniert? *gg

Der geht jedenfalls: http://msdn.microsoft.com/library/windows/hardware/gg463125
Bitte warten ..
Mitglied: rubberman
12.08.2013, aktualisiert um 19:18 Uhr
Thnx, ich acker mich mal durch
Auf den ersten Blick haben die aber immer noch alle möglichen Prozessoren im Repertoir
Naja, falls sich Chris noch mal melden sollte, fass ich das Script meinetwegen auch noch mal an (schon passiert) ... Ich halte es aber immer noch für sinnvoller die Programme vorher nach 32 und 64 Bit zu sortieren, statt im Nachgang den Fileheader zu untersuchen.

Grüße
rubberman
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Microsoft
gelöst Visual C++ Redistributable 2005 2008 x64 x86 (2)

Frage von sabines zum Thema Microsoft ...

Batch & Shell
Batch zum bearbeiten mehrerer CSV (1)

Frage von Matzus87 zum Thema Batch & Shell ...

Batch & Shell
Batch-Variable nach Stichworten aus TXT Datei durchsuchen (3)

Frage von Markus5579 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (33)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...