VirtualAllocEx Problem



  • Hallo,

    Ich habe ein Problem mit VirtualAllocEx. Ich starte zuerst mit CreateProcess einen Prozess (zum Testen habe ich einfach mal Word.exe genommen) und möchte mir mit VirtualAllocEx in dem neuen Prozess dann Speicher sichern. Bei CreateProcess bekomme ich noch ein gültiges Handle zurück, aber bei VirtualAllocEx erhalte ich dann über GetLastError() die Fehlermeldung Access Denied. Hier ist der Code-Schnipsel:

    DWORD* BytesWritten;
            int ThreadID;
            AnsiString ProcessName = Standartbrowser();
            STARTUPINFO stInfo;
            ZeroMemory( &stInfo, sizeof(STARTUPINFO));
            stInfo.cb = sizeof(STARTUPINFO);
            stInfo.wShowWindow = SW_SHOWDEFAULT;
            stInfo.dwFlags = STARTF_USESHOWWINDOW;
            PROCESS_INFORMATION prInfo;
            ZeroMemory( &prInfo, sizeof(PROCESS_INFORMATION) );
            bool ok = CreateProcess( NULL, "C:\\Microsoft Office\\Office11\\Winword.exe",
                               NULL, NULL, true,
                               PROCESS_VM_OPERATION, NULL, "C:\\" , &stInfo, &prInfo );
            ResumeThread(prInfo.hThread);
            WaitForSingleObject( prInfo.hProcess , INFINITE);
            HANDLE hDLLProcess;
    
            hDLLProcess = VirtualAllocEx ( prInfo.hProcess, NULL, sizeof(dllName), MEM_COMMIT , PAGE_EXECUTE_READWRITE ); 
    // Hier tritt der Fehler Access Denied auf, dllName ist ein AnsiString, der der Funktion übergeben wird.
    

    Kann mir jemand sagen wo der fehler liegt?



  • Ich verstehe zwar nicht ganz, was du machen willst, aber mir sind einige Dinge aufgefallen, die mir merkwürdig vorkamen.

    PROCESS_VM_OPERATION ist meines Wissens nach kein CreationFlag sondern ein Rechteflag. http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/process_creation_flags.asp Du hast demnach DETACHED_PROCESS übergeben, da es den gleichen Zahlwert hat, wie PROCESS_VM_OPERATION

    Wieso rufst du ResumeThread auf? Aus welchem Grund sollte der Thread des Prozesses suspendet sein?

    HANDLE entspricht zwar einem void-Pointer, du solltest jedoch lieber PVOID nehmen, um Verwechslungen vorzubeugen.

    Der Hauptgrund für deinen Fehler ist jedoch, dass du mit WaitForSingleObject wartest, bis der Prozess beendet wird und danach versuchst du Speicher im beendeten Prozess zu allokieren.



  • @masterofx32

    Danke für die Hilfe 🙂 Ich habe jetzt WaitForSingleObject rausgenommen. PROCESS_VM_OPERATION hatte ich nur drin, weil in der msnd steht das man PROCESS_VM_OPERATION-Rechte braucht um VirtualAllocEx zu benutzen. Ich hab jetzt die Creation-Flags mal durchprobiert, bekomme aber bei allen Flags immer noch den Fehler 5 (ERROR_ACCESS_DENIED). Nur wenn ich DEBUG_PROCESS als Creation Flag nehme klappt auch VirtualAllocEx, allerdings wird dann das Word-Fenster nach dem Aufrufen von CreateProcess nicht mehr geöffnet. Muss ich dem Process vielleicht noch die entsprechenden Rechte geben (PROCESS_VM_OPERATION) oder was ist diesmal falsch?



  • DWORD dwBytesWritten = 0; 
    
    	STARTUPINFO stInfo; 
    	ZeroMemory( &stInfo, sizeof(STARTUPINFO)); 
    	stInfo.cb = sizeof(STARTUPINFO); 
    	stInfo.wShowWindow = SW_SHOWDEFAULT; 
    	stInfo.dwFlags = STARTF_USESHOWWINDOW; 
    
    	PROCESS_INFORMATION prInfo; 	
    	ZeroMemory( &prInfo, sizeof(PROCESS_INFORMATION) ); 
    
    	BOOL bRet = CreateProcess( NULL, "C:\\Programme\\Office\\Microsoft Office\\OFFICE11\\WINWORD.EXE", NULL, NULL, true,0, NULL, NULL , &stInfo, &prInfo ); 
    
    	PVOID pMemory = VirtualAllocEx ( prInfo.hProcess, NULL, 15, MEM_COMMIT , PAGE_EXECUTE_READWRITE );
    

    Bei mir funktioniert dieser Code. Welchen Datentyp hat eigentlich dllName?
    Und mich würde sehr interessieren, was du eigentlich vorhast 😉



  • Dieser Thread wurde von Moderator/in Jansen aus dem Forum Borland C++ Builder (VCL/CLX) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Log in to reply