Prozess / Datei aus dem arbeitsspeicher heraus starten (lösung in sicht)
-
zunächst mal wäre ich sehr erfreut, wenn mit wer nen link zur alten MSDN geben kann, ao auch die standard win api drin ist, in der neuen finde ich irgendwie garnichts mehr ....
zum problem an sich
ich habe eine anwendung die mit einer komprimierten version eines servers erstellt wurde (die datei liegt sozusagen als großes array im quellcode) meine frage an dieser stelle, kann ich überhaupt eine anwendung die ich in binärform habe aus der programm heraus in den arbeitsspeicher schieben und als prozess starten ?ich bruache zunächst erstmal den link zu msdn, dann schau ich selber nach, aber wenn sich wer genötigt fühlt vorschläge zu machen, immer her damit _
ich hätte ja fast sowas wie create thread im verdacht, aber wie bring ich dem bei das er eine exe starten soll ... oder ecreate process, aber wie mach ich ihm eine als array vorliegende exe-datei als eine reale datei begreiflich ? denn beim starten der anwendung liegt sie ja praktisch schon im speicher, ich müsste nur IRGENDWIE einen einsprungpunkt generieren oder den createprocess so umbiegen das er es wie eine datei nimmt
-
Nein, das geht nicht.
Du kannst höchstens ein schreiben auf die Platte teilweise unterbinden bei CreateFile mit "FILE_ATTRIBUTE_TEMPORARY".
-
-
uff ... also des muss ich erstmal probieren ... PS oben im edit hab ich paar ideen geschrieben ... aber das eigentliche problem ist dabei dass evtl. keine schreibrechte existieren (von CD gestartet z.B.) und deshalb "temporär" aus dem speicher was gestartet werden soll .. leider kann cih den code des server nicht mit einbinden, da wir ihn nur einmal übersetzen und er dann möglicht IMMER identisch sein soll, für den fall eines auftretenden fehlers (rekonstruktion des fehler, debugging anhand map-files) der uns gemeldet wird, wobei die identische übersetzung zwischen 2 rechnern schon stark unterschiedliche sein kann ...
falsch badestrand ...
[EDIT naja hast recht aber früher war die MSDN übersichtlicher]
unter deiner adresse finde ich leider nur diese bescheuerten "hilfen"
http://msdn2.microsoft.com/de-de/library/default.aspxwas ich suche ist aber das hier
http://msdn2.microsoft.com/en-us/library/default.aspxder einzige unterschied ist die sprache, aber früher war das deutsche MSDN wenigstens noch so freundlich und hat einen auf die englische seite verwiesen wenn man ne befehlsreferenz gesucht hat, das hat mich zur verzweiflung und diesem topic getrieben (auf seite 12 von google hab cih zufällig die richtige seite gefunden)
-
Ceos schrieb:
leider kann cih den code des server nicht mit einbinden, da wir ihn nur einmal übersetzen und er dann möglicht IMMER identisch sein soll, für den fall eines auftretenden fehlers (rekonstruktion des fehler, debugging anhand map-files) der uns gemeldet wird, wobei die identische übersetzung zwischen 2 rechnern schon stark unterschiedliche sein kann ...
?????
Das verstehe ich überhaupt nicht...
Wenn Du so viel Wert auf Fehleranalyse legst, dann gibt es min. zwei Möglichkeiten:
- Du meldest Dich bei WinQual an und der Kunde kann Fehlerberichte dorthin senden, die Du dann bekommst (mit MiniDumps, mit denen Du dann genau rausfinden kannst, an was es liegt)
- Du schreibest bei einem Fehler selber einen MiniDump und kannst dann genau rausfinden an was es liegt...Du musst natürlich immder die passende EXE/PDB auf Deinem Entwicklungssystem haben; aber etwas "nachzuübersetzen" macht man nie!
-
ich muss dazu sagen das ich heir mit BDS2006 arbeite ... wenn ich aus irgendeinem grund nen absturz kassiere, ala zugriffsverletzung ... wie soll cih dann noch ne minidump starten ? ein gedanke war es vll. aus der exe noch zusätzlich ne dll auszukoppeln oder die exe in eine dll zu packen und dann mit einzubinden ... ich hab leider keine ahnung was es bedutet sich bei WinQual anzumelden aber ich gehe mal davon aus das es schon an den kosten scheitern wird ...
EDIT: ich weis jetzt nciht was du mit "nachübersetzen" meinst, ich meinte eig. den Quellcode mit in die anwendung zu übersetzen und dann per createthread die anwendung im hintergrund zu starten, das problem dabei wäre das es doppelter speicherverbrauch wäre und wie gesagt genau DANN der quellcode immer wieder anders übersetzt werden würde ... doppelt heisst hier einmal on codeform zum starten ausm speicher dun einmal in binärform für den fall eines updates oder das doch schreibrechte existieren
EIDT nochmal zu meinen ideen zur lösung... kann ich die exe nicht in binärform in eine DLL packen und dann irgendwie einen einsprungpunkt mitten in die anwendung legen ?
oder eben die idee mit dem createthread() und dann den funktionspointer auf das array im speicher umbiegen ?EDIT: ich habe jetzt was gefunden und probiere es mal aus, es handelt sich dabei um die funktionen CreateFileMapping() und MapViewOfFile() mal sehen ob es so hinhaut wie ich mir das vorstelle.
-
Eine EXE muß vom Betriebssystem initialisiert werden (IAT!!) bevor der Einstiegspunkt aufgerufen wird.
Das leistet nur CreateProcess zusammen mit dem Namen einer Datei.
CreateThread würde den Einstiegspunkt direkt aufrufen (ohne Initialisierung) und mit 100%iger Wahrscheinlichkeit abstürzen.
-
hm das iss jetzt blöd .... nu hab ich die datei im speicher und sogar nen pointer drauf ... jetzt hab ich grad erst gemerkt das ich für createprocess den namen der datei und kein pointer auf die datei brauche <_< ... grummel
@merker soweit war ich mittlerweilen leider auch schon, hast vll. noch ne idee wie ich die datei im speicher dem system als "mini-festplatte" vorgaukeln kann ? dann könnte ich theoretisch createprocess drauf aufrufen ?!
-
Hast Du mal geprüft, ob die eingebettete EXE überhaupt ordnungsgemäß funktionieren kann wenn sie keinerlei Schreibrechte hat ?
Möglicherweise stimmt etwas am Gesamtproblem nicht.
Ansonsten GetTempFileName, CreateFile mit FILE_ATTRIBUTE_TEMPORARY, EXE reinschreiben und dann CreateProcess.
-
naja normalerweise wird die eingebettete exe-datei "einfach" über die bereits vorhandene drüberkopiert (im fale eines update, pfadermittlung durch registryeinträge) oder in das lokale verzichnis der anwendung wenn kein vorgänger existiert, aber das wollten wir hier eigentlich abschaffen, bzw. ändern wegen dem von CD starten problem .... ähm ok 2 mal lesen macht schlauer, ja sie funktioniert auch wenn sie schreibgeschützt ist ... nur verstehe ich nicht wie ich das mit
Ansonsten GetTempFileName, CreateFile mit FILE_ATTRIBUTE_TEMPORARY, EXE reinschreiben und dann CreateProcess.
machewn soll ... erst datei erzeugen, dann gettempfilename und damit dann create process ??? ... funktioniert createfile in einem "CD-ordner" mit dem attribut FILE_ATTRIBUTE_TEMPORARY denn überhaupt ??? ach weiste was ich probiers halt einfach mal, meld mich in 10min wieder
-
Ceos schrieb:
FALSCH badestrand ..
unter deiner adresse finde ich leider nur diese bescheuerten "hilfen"
http://msdn2.microsoft.com/de-de/library/default.aspxwas ich suche ist aber das hier
http://msdn2.microsoft.com/en-us/library/default.aspxNix falsch, der "Trick" ist, dass du bei den Suchergebnissen die Sprache auswählen kannst. Und wenn du deutsche<->englische Version der MSDN meinst, solltest du nicht von alter<->neuer Version reden. Sorry für OT, aber dieses Caps-Lock-"Falsch" fande ich doch recht dreist.
-
verzeih mir, das war ausversehen mit dem caps ... habs nachm edit vergessen abzuschicken ...
back to topic ...
also des mit dem gettempfilename ist mir nicht ganz klar, aber wenn ich die datei mit create "ExeApp.exe" und dem temporary flag mache, schreibt er mir dennoch die datei ... das iss jetzt nicht ganz das was ich erwartet hatte und das flag delete_on_close kann ich nicht verwenden weil ich den filehandle schliessen muss bevor ich createprocess drauf aufrufe ... was eigentlich auch irgendwie falsch ist ...
CreateFile("ExeApp.exe", FILE_ALL_ACCESS, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_TEMPORARY, NULL);
CreateProcess(NULL,"ExeApp.exe", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
schlägt fehl mit error-code 32 für
The process cannot access the file because it is being used by another process. ERROR_SHARING_VIOLATIONkann es sein das ich mal wieder den wald vor lauter bäumen net sehe
-
Evtl klappt's mit
HANDLE temp_file = CreateFile("ExeApp.exe", FILE_ALL_ACCESS, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_TEMPORARY, NULL); // Zeile unverändert HANDLE read_only = CreateFile( ..., OPEN_EXISTING, FILE_SHARE_READ, ..., OPEN_EXISTING, ... ); CloseHandle( temp_file ); CreateProcess( ... ); ... CloseHandle( read_only );?
Könnte klappen, wenn man mit CreateFile temporäre Dateien öffnen kann und die Datei nach dem CloseHandle bestehen bleibt (weil ja noch das Nur-Lesen-Handle darauf verweist).
-
Ceos schrieb:
aber wenn ich die datei mit create "ExeApp.exe" und dem temporary flag mache, schreibt er mir dennoch die datei ... das iss jetzt nicht ganz das was ich erwartet hatte
Dann habe ich wohl nicht ganz verstanden was erreicht werden soll.
Zumindest kann eine eingebette EXE nur über den "Umweg" einer Datei via CreateProcess korrekt ausgeführt werden.
Wie die Datei zustande kommt, ist relativ belanglos. Sie muß nicht mal ".exe" heißen. Einen anderen Weg gibt es nicht.
-
@badestrand, danke werd ich morgen mal ausprobieren.
@merker leider ist dieser "belanglose" anteil genau das problem, die datei soll möglichst ohne auf der festplatte zu erscheinen ausgeführt werden damit die anwendung einen server zum arbeiten hat, aber nicht immer ein "rest" übrig bleibt, wenn es mal von einer CD gestartet wird z.B.wir hatten schon manchmal das problem als wir noch mit temp verzeichnis gearbeitet hatten, das derjenige keine schreibrechte für temp hatte, das war schon reichlich nervig ...
btw. muss echt nicht exe heissen ?
hm ich hatte einen null pointer exception wenn cih den dateinamen via gettempfilename erstellt habe und als parameter für createprocess benutzt habe ... naja ich werd morgen nochmal 10min für das problem opfern dann drängeln da leider wieder wichtigere sachen
-
Ceos schrieb:
btw. muss echt nicht exe heissen ?
Die Dateiendung ist vollkommen wurst...
Siehe auch:
http://blogs.msdn.com/oldnewthing/archive/2008/03/24/8332730.aspx
-
entschuldigt die blöde frage, aber kann mir wer mal bitte einen funktionierenden aufruf für die 2 createfile geben? irgendwie begreif cih die mechanismen von windows nich ...
erster aufruf soll die datei schreiben, 2ter aufruf soll die datei offen halten bis ich create process offen gehalten habe, das ganze mit den falgs FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_DELETE_ON_CLOSE , damit die datei nach der ausführung automatisch verschwindet
ich verzweifle grad, das 2te öffnen schlägt immer fehl mit error 32 zugriffsverletzung durch anderen prozess bereits belegt ... ich glaube das hat was mit dem create always zu tun, so lowlevel hab cih noch nicht mit files gearbeitet aber an anderer stelle musste ich schonmal close und reopen machen damit das share recht greift ...
