ReadProcessMemory - Problem



  • Halbwissen schrieb:

    Du brauchst die Prozess-ID und nicht eine Thread-ID...

    Hmm, bei Testprogrammen die ich selber gemacht habe hat es mit dem oben von mir geposteten Code tadellos geklappt den Wert von Variablen zu lesen.

    Deswegen würde es mich wundern warum es jetzt anders sein sollte.

    Aber ich kann es gerne anders probieren.

    Welche Funktion würdest du mir vorschlagen?

    Grüße,
    Flo



  • kA, vielleicht hängt es mit den Thread-Basisadressen zusammen. Dein Programm hat wohl nur den Hauptthread gehabt, aber kA.

    Versuch's mal damit:

    unsigned long GetProcessIdByName(const std::string& name)
    {
    	void* snapshotHandle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    	PROCESSENTRY32 processEntry = { sizeof(PROCESSENTRY32) };
    
    	if(Process32First(snapshotHandle, &processEntry))
    	{
    		do
    		{
    			std::string tempName = processEntry.szExeFile;
    			std::transform(tempName.begin(), tempName.end(), tempName.begin(), tolower);
    
    			if(tempName == name)
    			{
    				CloseHandle(snapshotHandle);
    				return processEntry.th32ProcessID;
    			}
    		}
    		while(Process32Next(snapshotHandle, &processEntry));
    	}
    
    	return 0;
    }
    


  • Blöd von mir.
    Hab nicht bedacht dass WoW als Systemprogramm läuft. Hab eben mit dem Tool permedit mein Programm auch als Systemprogramm laufen lassen und voila - es klappt. 🙂

    Kann geclosed/gelöscht werden.



  • Oh, GetWindowThreadProcessId 😮 ich Depp...



  • Halbwissen schrieb:

    Oh, GetWindowThreadProcessId 😮 ich Depp...

    Hehe.
    Das mit dem extra zum Systemprozess ändern mit Permedit ist echt lästig.

    Wie kann man ein Programm dauerhaft als Systemprogramm definieren ?

    Grüße,
    Flo.



  • Was meinst du genau 😕



  • Halbwissen schrieb:

    Was meinst du genau 😕

    Der Grund, warum davor nichts ging.
    WoW.exe läuft als Systemprozess und lässt sich deswegen nicht den Speicher lesen. Mit dem Tool "permedit" habe ich meinem Programm diese Rechte gegeben und es hat geklappt.
    Deswegen habe ich gefragt, wie man ein Programm unter Windows standardmäßig als Systemprozess benutzen kann.



  • Such mal hier im WinAPI-Forum nach "SE_DEBUG_PRIVILEGE" und wie man es seinem Programm verpassen kann.



  • Irgendwie so zB

    void* tokenHandle;
    	OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &tokenHandle);
    	TOKEN_PRIVILEGES privilegeToken;
    	LookupPrivilegeValue(0, SE_DEBUG_NAME, &privilegeToken.Privileges[0].Luid);
    	privilegeToken.PrivilegeCount = 1;
    	privilegeToken.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    	AdjustTokenPrivileges(tokenHandle, 0, &privilegeToken, sizeof(TOKEN_PRIVILEGES), 0, 0);
    	CloseHandle(tokenHandle);
    


  • Super, danke Halbwissen.
    Klappt so genau wie ich es haben will 😉

    Grüße,
    Flo


Anmelden zum Antworten