PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wie die erkennt man die 3D API eines Games?


Tom Servo
2003-07-31, 16:30:29
Hallo,

ich wollte anhand der exe dateien in einem Game Folder feststellen, welche 3D APIs vom Spiel verwendet werden.

Ich habe zwar ein Programm gefunden was rekursiv (!) alle verwendeten DLLs auflistet (http://www.microsoft.com/msj/0297/hood/hood0297.aspx), aber nur bei manchen Spielen findet man damit Spuren von 3D APIs. Weder bei "No One Lives Forever" noch bei "Seriuos Sam - SE" ist D3D oder OpenGL als DLL zu finden. Mache ich da nur was falsch, oder kann man das auf diese Weise nicht herausfinden?

lithech.exe (NOLF)
==================

WS2HELP.dll
WS2_32.dll
WSOCK32.dll
mss32.dll
ole32.dll
msvcrt.dll
DINPUT.dll
RPCRT4.dll
ADVAPI32.dll
GDI32.dll
KERNEL32.dll
USER32.dll
ntdll.dll
WINMM.dll
lithtech.exe

SeriousSam.exe
==============

SHLWAPI.dll
SHELL32.DLL
WS2HELP.dll
WS2_32.dll
WSOCK32.dll
WINMM.dll
MSVCRT.dll
GDI32.dll
USER32.dll
ENGINE.DLL
RPCRT4.dll
KERNEL32.dll
ntdll.dll
ADVAPI32.DLL
SeriousSam.exe

Aqualon
2003-07-31, 16:42:10
Bei SeriousSam könnte es sein, dass die engine.dll je nach eingestellter API die benötigten Dateien erst aus nem Archiv entpackt und du sie deswegen nicht findest.

Und bei NOLF2 weist lithtech.exe darauf hin, dass die Lithtech-Engine zum Einsatz kommt und damit DirectX 8.

Aqua

Demirug
2003-07-31, 17:18:08
Engines die beide APIs unterstützen laden die benötigten DLLs erst zur Laufzeit da ist es im Vorfeld unmöglich die API zu bestimmen.

Die erst zur Laufzeit laden Technik wird aber durchaus auch von anderen nicht API-Unabhängien Progarmmen benutzt. Macht zwar nicht unbedingt Sinn aber was solls.

Tom Servo
2003-07-31, 17:30:03
@Aqualon
Danke für die Antwort.

Es ist zwar nur NOLF-1, aber auch dort wird D3D benutzt.

Wenn das mit den DLLs nicht geht, hatte ich aber auch eher eine Liste nur mit OpenGL oder Multi-API Engines geplant, weil das m.W. sehr viel weniger sind. Den Rest nehme ich dann als D3D-only an. Glide kann ich ignorieren.

Wäre natürlich besser, wenn es doch irgendwie ginge. Hatte bisher nur bei recht wenigen Spielen Erfolg mit dem Auflisten der DLLs.

Weiss vielleicht jemand einen Weg um die API zur Laufzeit eines Spiels zu ermitteln. Wäre als Notlösung und Ergänzung zur Liste auch geignet.

Gast
2003-07-31, 17:40:17
http://www.dependencywalker.com/

Tom Servo
2003-07-31, 18:00:56
Original geschrieben von Demirug
Engines die beide APIs unterstützen laden die benötigten DLLs erst zur Laufzeit da ist es im Vorfeld unmöglich die API zu bestimmen.

Die erst zur Laufzeit laden Technik wird aber durchaus auch von anderen nicht API-Unabhängien Progarmmen benutzt. Macht zwar nicht unbedingt Sinn aber was solls.

Schade. Wäre ein nettes Feature gewesen. Trotzdem Danke für die Info.

Wäre aber auch alles nicht so schlimm, wenn ich wenigstens per Text-Scan immmer die DLL Namen finden könnte. Hatte damit bisher aber auch keinen grossen Erfolg. Funktioniert immerhin mit einigen Games. Counterstrike wird damit z.B. korrekt als OGL+D3D erkannt. Bei anderen Spielen stehen die Namen leider nicht immer in der Game-exe.

@Gast

Danke, aber dieses gute Programm hilft in diesem Fall wohl nichts. Es macht m.W. auch genau das selbe wie das von mir genannte Programm. Dieses kann ich aber direkt in mein Programm einbauen, da es rein mit Textausgabe arbeitet.

Gast
2003-07-31, 18:12:18
Öffne mit dem Programm mal eine EXE und drücke F7. Dann kannst du auch sehen, welche DLLs zur Laufzeit geladen werden. Oder kann dein Programm das auch?

EgonOlsen
2003-07-31, 18:49:36
Kannst du nicht einfach die Einstellungen der Grafikkarte z.B. für OpenGL auf übelst (d.h. kein AA/AF, niedrigste Texturqualität) stellen und für D3D voll aufdrehen? Dann sollte es zumindest visuell möglich sein zu erkennen, was verwendet wird. Ist zwar nicht sehr "wissenschaftlich", mache ich aber immer so, wenn ich schnell wissen will was verwendet wird.

456
2003-07-31, 19:02:28
lol

das erkennt man doch eigentlich direkt ob ein Spiel mit DirectX oder OpenGL gemacht wurde. Steht doch auf der Packung ! ;)

EgonOlsen
2003-07-31, 19:09:08
Original geschrieben von 456
das erkennt man doch eigentlich direkt ob ein Spiel mit DirectX oder OpenGL gemacht wurde. Steht doch auf der Packung ! ;) Auch wieder wahr...aber das immer so stimmt bzw. eindeutig ist? Und bei Demos klappt das auch nicht...und bei dieser "anderen" Distributionsform wohl auch nicht...:)

Darkstar
2003-07-31, 20:06:08
Das benutzte 3D-API kann man doch ganz einfach herausfinden:
Spiel starten und beenden. Anschließend in den Treibereinstellungen bzw. der Registry das benutzte API ablesen.

Kann allerdings sein, daß man dafür eine Karte mit PowerVR-Chipsatz braucht. :D

ScottManDeath
2003-07-31, 23:18:22
einfach die datei opengl32.dll/d3d8.dll/d3d9.dll ,,, im windows ordner umbenennen, wenns piept siehst du welche dll er braucht (wennn die dlls statisch eingelinkt sind), beim dynamischen linken gibts dann halt einen laufzeitfehler

HellHorse
2003-08-01, 00:44:10
Oder zum Beispiel in D3D AA aktivieren und in OpenGL nicht, oder umgekehert.

zeckensack
2003-08-01, 04:11:41
Man nehme einen Hex-Editor.

Dann durchsuche man die EXE (und notfalls DLLs) nach
grGlideInit => Glide

glVertex (erfaßt immediate mode und vertex arrays)
glDraw (erfaßt Pixel-Transfers)
=> OpenGL

Zu D3D weiß sicher Demirug eine passende Funktion :)

Tom Servo
2003-08-01, 05:59:34
Danke für die vielen Antworten. Leider konnte ich nicht früher antworten.

@zeckensack

Wäre natürlich naheliegend, einfach nach Funktionsnamen zu scannen die auf jeden Fall benutzt werden müssten. Hatte mich auch schon gefragt, welche man dafür nehmen könnte. Ich werde es probieren ob damit die Trefferquote verbessert werden kann. Es funktioniert ja leider nicht immer. Bei Serious Sam findet man überhaupt keine gl-Funktinen in der exe. Man würde dort aber durch scannen nach "OpenGL" und "Direct3D" fündig werden. Aber auch nur weil diese Namen im Settings-Menü benutzt werden (ETRS4 - split screen, ETRSOpenGL, ETRSDirect3D, ETRSSpeed).

@ScottManDeath

Leider nicht praktikabel. Es müsste schon automatisch ablaufen.
Mein Game-Launcher soll herausfinden können, ob er z.B. die OpenGL Tweaks per Default disablen kann, wenn das Game sowieso D3D-only ist. Hätte ich vielleicht dazuschreiben sollen. Ich kann auch keine Änderungen am System vornehmen, da ich keine Garantie habe, dass mein Tweaker-Prozess lange genug lebt um es wieder rückgängig zu machen.


@Gast

Muss ich mal ausprobieren. Mit der z.Zt. bei mir installierten älteren Version funktioniert es aber nicht. Das Problem ist aber eben auch, dass ich ein Programm brauche, was ich in mein Programm integrieren kann. Da wäre dieses OpenSource Programm mit Textausgabe genau richtig gewesen.

@Egon Olsen

Das Aufdrehen der Einstellungen ist sicher eine gute Methode für den User selber. Man kann bei NVidia Karten wohl auch ein Logo bei D3D Spielen einblenden lassen.

@Darkstar

Vermutlich gehts nur mit PowerVR/Kyro. Vielleicht könnte man mein Programm auch dafür anpassen, aber vmtl. wäre er bei diesen Karten auch überflüssig, weil die 3D Einstellungen wohl ohnehin für jedes Spiel extra eingestellt werden können. Hatte zwar nie eine Kyro, aber habe das schon öfter so gelesen.

zeckensack
2003-08-01, 06:40:03
Original geschrieben von Tom Servo
@zeckensack

Wäre natürlich naheliegend, einfach nach Funktionsnamen zu scannen die auf jeden Fall benutzt werden müssten. Hatte mich auch schon gefragt, welche man dafür nehmen könnte. Ich werde es probieren ob damit die Trefferquote verbessert werden kann. Es funktioniert ja leider nicht immer. Bei Serious Sam findet man überhaupt keine gl-Funktinen in der exe.Aber in .\bin\engine.dll :)

Tom Servo
2003-08-01, 07:12:20
Die Engine.dll wäre sogar leicht auffindbar mit dem dependency Programm. Wollte sogar vor dem Posten nochmal reinsehen.

Zur Not könnte ich auch alle DLLs im Game Verzeichnis scannen.

Aber ich hatte irgendwie den Eindruck, dass diese Module oft komprimiert sind oder vielleicht sogar in Archiven liegen. Bei NOLF gibts z.B. eine NOLFDLL.REZ Datei. Die ist allerdings nicht komprimiert.

Bei Half-Life gibts die OpenGL Funktionen auch nirgends in einer DLL oder EXE:


$ pwd
/d/sierra/Half-Life
$ find -iname '*.dll' -or -iname '*.exe' | xargs grep -i gldraw
Binary file ./GLDRV/3DFXGL.DLL matches
$ find -iname '*.dll' -or -iname '*.exe' | xargs grep -i glvertex
Binary file ./GLDRV/3DFXGL.DLL matches
$

Demirug
2003-08-01, 07:27:02
Original geschrieben von zeckensack
Man nehme einen Hex-Editor.

Dann durchsuche man die EXE (und notfalls DLLs) nach
grGlideInit => Glide

glVertex (erfaßt immediate mode und vertex arrays)
glDraw (erfaßt Pixel-Transfers)
=> OpenGL

Zu D3D weiß sicher Demirug eine passende Funktion :)

Viel auswahl gibt es da nicht. Funktioniert ja fast alles über COM. Deswegen bleibt da eigentlich nur die Funktion um das zentrale Objekt zu beschafen:

Direct3DCreate9 bzw Direct3DCreate8.

Man könnte auch noch nach einem verweiss auf D3D9.DLL bzw D3D8.DLL suchen.

zeckensack
2003-08-01, 07:31:19
Tom,
ist find sicher für Dateien mit Binär-Müll anwendbar? Half-Life habe ich nicht, sonst würde ich mal nachsehen ...

Demirug,
gute Idee mit der DLL. Dann könnte man natürlich opengl32.dll hinzufügen (auf Wunsch auch glide2x.dll und glide3x.dll).

Tom Servo
2003-08-01, 07:36:22
GNU-find (nicht das von MS-DOS) findet nur die Dateinamen und grep sucht dann. Geht auf jeden Fall. Hat ja auch die 3DFX-DLL gefunden

Habe jetzt mal alle Dateien durchsucht, was recht lange gedauert hat, weil ja die grosse pak-Datei schon 400MB hat.


$ find . -type f -exec grep -i glvertex {} ';'
Binary file ./GLDRV/3DFXGL.DLL matches
$ find . -type f -exec grep -i gldraw {} ';'
Binary file ./GLDRV/3DFXGL.DLL matches


Wird also irgendwie komprimiert sein. Vielleicht in einer pak Datei.

edit:
Das mit den DLL Namen hatte ich ja auch zuallererst probiert, noch bevor ich das dependency Programm überhaupt gefunden hatte. Die sind bei HL auch wirklich zu finden:


$ find -iname '*.dll' -or -iname '*.exe' | xargs grep -i opengl32.dll
Binary file ./GLDRV/3DFXGL.DLL matches
Binary file ./platinfo.dll matches
Binary file ./survey1109.dll matches
$ find -iname '*.dll' -or -iname '*.exe' | xargs grep -i d3d8.dll
Binary file ./survey1109.dll matches
$


Bei anderen Spielen ging es leider nicht so gut. Aber ich muss nochmal sehen, ob ich da auch alle DLLs mit durchsucht hatte und nicht nur die EXE.

Demirug
2003-08-01, 08:07:00
Original geschrieben von Tom Servo
Bei anderen Spielen ging es leider nicht so gut. Aber ich muss nochmal sehen, ob ich da auch alle DLLs mit durchsucht hatte und nicht nur die EXE.

Ja du musst auch die DLLs durchsuchen weil die eigentliche Engine welche dann OpenGL/D3D oder was auch immer benutzt in vielen Fällen in einer DLL liegt. Gerade in Fällen wenn es sich um eine Lizenzengine handelt ist das oft der Fall.

Tom Servo
2003-08-01, 08:51:07
Habe es jetzt nochmal systematisch versucht und alle EXE und DLL case-insensitiv nach opengl32.dll oder d3d*.dll durchsucht. Hat schon ganz gut Treffer gebracht, aber überall funktionierts leider nicht. Aber schon deutlich besser als vorher:



Keine erkannte API
=================================================================
=== Scan directory /d/programme/fox/no one lives forever
=================================================================

=================================================================
=== Scan directory /c/Programme/Electronic Arts/Need For Speed - Porsche
=================================================================

=================================================================
=== Scan directory /d/GameCon/emul/windows/n64/pj64_1_5
=================================================================

=================================================================
=== Scan directory /f/Programme/Jowood/Gothic II
=================================================================

Erkannte API
=================================================================
=== Scan directory /f/Programme/EA GAMES/Battlefield 1942/BF1942.exe
=================================================================
Binary file /f/Programme/EA GAMES/Battlefield 1942/BF1942.exe matches

=================================================================
=== Scan directory /c/Program Files/LucasArts/Grim
=================================================================
Binary file /c/Program Files/LucasArts/Grim/dsetup32.dll matches

=================================================================
=== Scan directory /d/Programme/Quake III Arena
=================================================================
Binary file /d/Programme/Quake III Arena/Tools/q3map.exe matches
Binary file /d/Programme/Quake III Arena/Tools/q3radiant_197.exe matches

=================================================================
=== Scan directory /f/Programme/Rockstar Games/GTAIII
=================================================================
Binary file /f/Programme/Rockstar Games/GTAIII/gta3.exe matches

=================================================================
=== Scan directory /f/Programme/UT2003
=================================================================
Binary file /f/Programme/UT2003/System/D3DDrv.dll matches
Binary file /f/Programme/UT2003/System/UT2003.exe matches

=================================================================
=== Scan directory /f/Programme/Mafia
=================================================================
Binary file /f/Programme/Mafia/LS3DF.dll matches
Binary file /f/Programme/Mafia/Setup.exe matches

=================================================================
=== Scan directory /d/sierra/half-life
=================================================================
Binary file /d/sierra/half-life/GLDRV/3DFXGL.DLL matches
Binary file /d/sierra/half-life/platinfo.dll matches
Binary file /d/sierra/half-life/survey1109.dll matches

=================================================================
=== Scan directory /d/programme/croteam/Serious Sam
=================================================================
Binary file /d/programme/croteam/Serious Sam/Bin/Engine.dll matches

=================================================================
=== Scan directory /d/programme/Croteam/Serious Sam - The Second Encounter
=================================================================
Binary file /d/programme/Croteam/Serious Sam - The Second Encounter/Bin/Engine.dll matches

=================================================================
=== Scan directory /e/Programme/Bethesda Softworks/Morrowind
=================================================================
Binary file /e/Programme/Bethesda Softworks/Morrowind/Morrowind Launcher.exe matches
Binary file /e/Programme/Bethesda Softworks/Morrowind/Morrowind.exe matches
Binary file /e/Programme/Bethesda Softworks/Morrowind/TES Construction Set.exe matches





#! /bin/bash

function scan_game_dir () {
game_dir=$1
echo "=================================================================" ;
echo "=== Scan directory $game_dir" ;
echo "=================================================================" ;

find "$game_dir" '(' -iname '*.dll' -or -iname '*.exe' ')' \
-exec grep -i -e '\(d3d.\.dll\)\|\(opengl32\.dll\)' {} ';'
echo
}
echo "Keine erkannte API"
scan_game_dir '/d/programme/fox/no one lives forever'
scan_game_dir '/c/Programme/Electronic Arts/Need For Speed - Porsche'
scan_game_dir '/d/GameCon/emul/windows/n64/pj64_1_5'
scan_game_dir '/f/Programme/Jowood/Gothic II'

echo "Erkannte API"
scan_game_dir '/f/Programme/EA GAMES/Battlefield 1942/BF1942.exe'
scan_game_dir '/c/Program Files/LucasArts/Grim'
scan_game_dir '/d/Programme/Quake III Arena'
scan_game_dir '/f/Programme/Rockstar Games/GTAIII'
scan_game_dir '/f/Programme/UT2003'
scan_game_dir '/f/Programme/Mafia'
scan_game_dir '/d/sierra/half-life'
scan_game_dir '/d/programme/croteam/Serious Sam'
scan_game_dir '/d/programme/Croteam/Serious Sam - The Second Encounter'
scan_game_dir '/e/Programme/Bethesda Softworks/Morrowind'

Tom Servo
2003-08-01, 09:43:18
Bei Q3A habe ich nur einen "OpenGL32" String gefunden, also ohne ".DLL" Suffix. Die "OpenGL32.dll" Treffer waren leider nur in Zusatz-Tools.

Wenn ich nach D3D und OpenGL32 suche, dann habe ich praktisch in jedem Spiel irgendwelche Treffer. Bei D3D[89] statt D3D wirds aber schon wieder viel schlechter.

Mal sehen ob ich damit schon ein Erkennungsprogramm hinkriege, was ausreichend gut und schnell genug funktioniert.

Danke für die Hilfe.