Entwickler-Ecke

Dateizugriff - shellexecute umgehen


ShadowCaster - Fr 21.03.03 11:06
Titel: shellexecute umgehen
Hallo Leute,

ich möchte in meiner Delphi-Applikation eine komprimierte Datei als Recourcestream einbinden und später dekomprimieren. wie das alles geht, weiß ich bereits ;)

Nehmen wir an, ich habe jetzt einen Memorystream im Arbeitsspeicher zur Verfügung stehen, indem sich eine Exe oder eine Dll befindet. Jetzt möchte ich aber diese Datei (Exe oder Dll) ausführen, ohne sie vorher auf die Festplatte zu speichern und shellexecute zu verwenden.

Kennt jemand eine Api-funktion von Windows vielleicht oder eine Delphifunktion mit der ich das machen kann?

Ich wäre für eure Hilfe wirklich sehr dankbar :)


Delete - Fr 21.03.03 11:25

Also ich habe noch nie davon gehört, dass man ausführbare Dateien aus dem Speicher direkt ausführen könnte. Meiner Meinung nach muß die Datei vorher auf die Festplatte schreiben.


Motzi - Fr 21.03.03 11:52

Ich hab schon mehrere Diskussionen über sowas gelesen und angeblich soll es irgendwie wahrscheinlich sogar gehen, allerdings müsstest du dann einen Großteil der Arbeit erledigen, die sonst das Betriebssystem macht (Adressraum erstellen, ...) also fast nur mit internen und undokumentierten Befehlen arbeiten...


ShadowCaster - Fr 21.03.03 11:56

die Arbeit zu erledigen ist weniger das Problem. Ich hab schon drüber nachgedacht mir sozusagen einen Exe-Loader zu schreiben, der Exefiles ausführt, ohne diese auf die Platte zu speichern.


Die Frage kam mir eigentlich auch nur, weil man mit Recourcestreams z.B. auch Bitmaps anzeigen kann, ohne sie vorher auf der Platte zu speichern, etc. Da müsste doch sicher schonmal einer eine Funktion geschrieben haben, damit das auch mit exe-dateien und dll's geht.


ShadowCaster - Fr 21.03.03 14:29

ich war mal googlen und hab überhaupt nichts dazu gefunden, wie man Exe-dateien direkt aus einem Recourcestream ausführen kann.

Ich hoffe, ich muss da nicht selbst ran und mir so ne Funktion schreiben :cry:


Popov - Fr 21.03.03 14:43

ShadowCaster hat folgendes geschrieben:
Die Frage kam mir eigentlich auch nur, weil man mit Recourcestreams z.B. auch Bitmaps anzeigen kann, ohne sie vorher auf der Platte zu speichern, etc. Da müsste doch sicher schonmal einer eine Funktion geschrieben haben, damit das auch mit exe-dateien und dll's geht.


Das kannst du doch nicht vergleichen. Außerdem wird eine Bitmap nicht ausgeführt, sondern irgendwo reingeladen. Es ist also nur eine Datei. Eine EXE ist aber keine Datei die irgendwie nur angezeigt werden soll, sonder ein Programm das ausgeführt wird.

Aber um deine Frage zu beantworten:

ShadowCaster hat folgendes geschrieben:
Da müsste doch sicher schonmal einer eine Funktion geschrieben haben, damit das auch mit exe-dateien und dll's geht.


Klar geht das. Es ist im Grunde ist es nur eine Binärdatei die du in einen String laden kannst. Damit kannst du dann machen was du willst. Allerdings noch lange nicht als Programm ausführen.


ShadowCaster - Fr 21.03.03 15:05

das heißt, meine These, dass man eine Exe aus einem Recourcestream ausführen können müsste (wasn Deutsch :lol: ) ist damit hinfällig, oder?

Es ist ja egal. Wenns nicht geht, dann werd ich auch nciht mehr weiter fragen und euch damit die Zeit stehlen ;)

Ich bin sicher dass irgendwann mal einer hierdrauf eine Antwort postet wie es geht... Ich wüsste da schon was. Man müsste eigentlich nur den Windowskernel emulieren und damit die Bits und Bytes der Exe abarbeiten. Allerdings dürfte das ziemlich langsam werden, den Code durch den emulierten Kernel zu pipen.

Dennoch vielen Dank, dass doch einige auf den Beitrag geantwortet haben. :)


Popov - Fr 21.03.03 15:15

ShadowCaster hat folgendes geschrieben:
Ich bin sicher dass irgendwann mal einer hierdrauf eine Antwort postet wie es geht...


Das es irgendwie geht ist unbestritten. Allerdings glaube ich nicht, daß einer es mal als Antwort hier posten wird. Ich schätze, daß es ein wenig mehr Aufwand ist als nur eine Prozedur.


ShadowCaster - Fr 21.03.03 15:28

das denke ich auch. Irgendwann werd ich mich mal dahinter setzen und schauen, wie ich es geregelt bekomme. So ein Feature wäre schon nicht schlecht. Hätte ja sein können, dass Delphi oder Windows schon API-Funktionen dafür hat.


Motzi - Fr 21.03.03 15:51

Habt ihr mein Posting irgendwie überlesen oder so..? :?
Ich hab doch schon geschrieben... einen Prozess zu erzeugen bleibt dem im Normalfall dem Betriebssystem überlassen. Willst du das jetzt per Hand tun, dann musst du alles machn, was normalerweise das Betriebssystem an Vorbereitungen trifft um einen neuen Prozess ins Leben zu rufen wie zB einen neuen Adressraum für den Prozess erstellen. Da diese Aufgaben aber wie bereits gesagt dem Betriebssystem unterliegen gibt es auch keinerlei (offizielle) Dokumentationen über Funktionen mit denen sich so etwas realisieren lässt. Und da wird dir deine Überlegung für einen Exe-Loader auch nicht viel helfen...


ShadowCaster - Fr 21.03.03 15:58

in delphi gibt es die Funktion createprocess

Diese funktion kann einen Prozess erstellen. Allerdings wird dazu eine Datei von der Platte verwendet. Ich hab mal nachgeschaut. Die Prozedur Createprocess steht in der toolapi.pas und verweist leider auf ein Interface und dieses auf die Windowsapi. Somit ist die Prozedur leider unerreichbar. Wenn sie erreichbar wäre, könnte man ja einfach versuchen, anstelle des Dateinamen und dem öffnen einer Datei einen Pointer von einem Buffer (Memorystream) zu übergeben.

Aber naja, geht halt net.


AndyB - Mo 24.03.03 18:47

Du verwechselst da die ToolsAPI (Erweiterungs API für die Delphi IDE) mit der Windows API. CreateProcess wird in Windows.pas eingebunden und befindet sich in 'kernel32.dll'.


ShadowCaster - Mo 24.03.03 18:49

uff... da ist mir wohl eine Fehler unterlaufen :oops: Naja, nützen tut das auch nix für das Problem. Hab mal ein paar Programmierer mit großer Erfahrung gefragt und von denen wusste das auch keiner wie man eine Anwendung direkt in den Arbeitsspeicher lädt. Ist ja net so schlimm. :)