Frage zu DLL/Gegenseitige Bereitstellung von Funktionen
-
Martin Richter schrieb:
Mit Sicherheit kann der Lader keine EXE in den aktuellen Prozess laden in der bereits eine EXE läuft. Die Mechanismen die das erlauben wie DllMain fehlen dieser ja.
was redest du denn da? was meinst du damit?
-
wenn die exe ne andere base adresse als die exe vom prozess hat, wieso soll er die ned laden können? oder was meinst du jetzt.
-
noobi schrieb:
Martin Richter schrieb:
Mit Sicherheit kann der Lader keine EXE in den aktuellen Prozess laden in der bereits eine EXE läuft. Die Mechanismen die das erlauben wie DllMain fehlen dieser ja.
was redest du denn da? was meinst du damit?
Dein Ton gefällt mir nicht.

Es kommt nicht auf die Basisadresse an.
Das Problem ist, dass das Laden einer DLL etweas anderes ist als das Laden eines Prozesses.
Bei einem Prozess wird ein neuer Thread gestartet, dieser erhält die Kontrolle und führt dann den Code aus, der durch den Linker als Einsprungspunkt definiert wurde.Was soll denn bitte passieren, wenn man LoadLibrary auf eine EXE ausführt? Eine DllMain hat er natürlich nicht. Wer sollte die Initialisierung durchführen, sollte einer zusätzlicher Thread gestartet werden..., wer kontrolliert diesen...
Eine Exe kann als Ressource in den aktuellen/bestehenden Prozess geladen werden (LoadLibraryEx LOAD_LIBRARY_AS_IMAGE_RESOURCE), aber nicht als ausführbarer Code...
-
Martin Richter schrieb:
Eine Exe kann als Ressource in den aktuellen/bestehenden Prozess geladen werden (LoadLibraryEx LOAD_LIBRARY_AS_IMAGE_RESOURCE), aber nicht als ausführbarer Code...
andererseits ist die exe bereits einmal im prozess geladen, da die dll ja durch die exe geladen wurde.
d.h. es könnte ja durchaus sein, dass bereits ein handle auf die exe im prozess vorhanden ist, das bloß noch geholt und mittels getprocadress benutzt werden kann.
werd ich heut abend mal ausprobiern
schwieriger wirds natürlich wenn wir von zwei verschiedenen exe dateien reden.
da kommt dann die von martin angesprochene problematik ins spiel.allerdings verstehe ich nicht was dllmain mit der ladefähigkeit zu tun hat.
dllmain ist doch vollkommen optional
-
Nicht jetzt alles durcheinanderwerfen...

Wenn es um die selbe EXE geht, müsste es gehen!
Wenn es um eine andere EXE geht, kannn es nicht gehen!
-
was? ich meine nur du kannst doch ne exe mit LoadLibrary laden und dann genauso code daraus ausführen lassen wie bei einer dll auch mit GetProcAddress und dem ganzen quatsch. das geht jawohl und das ist auch alles was ich meinte. was das bringen soll ist ja eine andere frage. aber ich meine doch ned einen neuen prozess zu starten, das hat doch nie jemand gesagt.
-
das laden einer exe ist aber eigentlich gleichbedeutend mit dem starten eines neuen prozesses wohingegen das laden einer dll nie einen neuen prozess erzeugt.
das ist die theoretische problematik.die frage ist im prinzip nur wie windows das problem löst oder eben nicht löst
-
Sovok schrieb:
das laden einer exe ist aber eigentlich gleichbedeutend mit dem starten eines neuen prozesses wohingegen das laden einer dll nie einen neuen prozess erzeugt.
das ist die theoretische problematik.die frage ist im prinzip nur wie windows das problem löst oder eben nicht löst
Das ist gar nicht das selbe. Und es ist auch nicht dasselbe Problem.
Du verwendest nur das selbe Wort: "Laden"!Windows verwendet einmal CreateProcess und einmal LoadLibrary!
Die Funktionsweisen sind komplett unterschiedlich.
-
so unterschiedlich sind sie auch wieder nicht
im wesentlichen werden nur ausführbare befehle in den arbeitsspeicher befördertbei einer exe müssen halt zusätzlich noch verwaltungsinformationen für einen neuen prozess angelegt werden
-
Windows verwendet einmal CreateProcess und einmal LoadLibrary!
Die Funktionsweisen sind komplett unterschiedlich.Also das glaube ich nämlich garnicht. Es sind beides bloss PE Images. Die werden in den Speicher geladen, dann werden weitere Dependencies aufgelöst wodurch evtl. weitere PE Images geladen werden etc.
Der einzige Unterschied ist IMO dass beim Starten einer .EXE vorher ein "leerer" Prozess angelegt wird, und beim nachladen von Dependencies eben diese in den "aktuellen" Prozess geladen werden.
Davon abgesehen habe ich schon diese Situation gemeint:
A.EXE importiert (statisch) X@B.DLL
B.DLL importiert (statisch) Y@A.EXE
-
Wenn man nur ds Laden der PE-Images betrachtet ist das Verhalten des Laders identisch.
Der extreme Unterschied ist was verbunden ist mit dem Starten eines Prozesses und dem Laden einer DLL!Dise Abhängigkeit, die Du aufzeigst müsste gelöst werden können.
Was in keinem Fall geht:
Prozess X lädt statisch oder dynamisch die B.DLL, denn diese benötigt A.EXE!