Handle aus anderem Prozess ohne DuplicateHandle verwenden
-
Hallo Leute!
Mein Programm geht mittels NtQuerySystemInformation systemweit die Handles durch, bis es das richtige gefunden hat.
Die Frage ist jetzt, ob es eine Möglichkeit gibt, dieses Handle so zu nutzen als würde es das Programm selbst nutzen, aus dem das Handle stammt. Ich möchte damit einen Aufruf von DuplicateHandle umgehen, weil es damit zu Problemen gekommen ist - das Programm, das das Handle erstellt hatte, funktionierte nicht mehr richtig, nachdem ich das Handle über DuplicateHandle in meinem eigenen verwendet hatte.Eine Möglichkeit wäre doch, dass man mit WriteProcessMemory und CreateRemoteThread etwas zusammenwürfelt, oder? Ich hoffe aber, dass es noch elegantere Möglichkeiten gibt.
MfG
-
Mein Problem genau ist, dass ich ein Socket öffne und dann getsockname darauf verwende. Danach ist es im Client-Programm zwar immernoch möglich, Daten zu versenden, es werden aber keine mehr empfangen oder zumindest verarbeitet. Dieses Verhalten ist mir jetzt bereits bei mehreren Programmen aufgefallen, lediglich ein DirectX-Spiel ändert sein Verhalten nicht.
Ich hätte mein Problem wohl gleich direkt nennen sollen, sry.
-
Wenn du den Handle (HWND) des anderen Programmes hast, kannst Du damit Nachrichten an das andere Programm direkt schicken mit SendMessage(hwndFremd, ID_XXX,wParam,lParam). DuplicateHandle() ist nicht erforderlich !
-
berniebutt schrieb:
Wenn du den Handle (HWND) des anderen Programmes hast, kannst Du damit Nachrichten an das andere Programm direkt schicken mit SendMessage(hwndFremd, ID_XXX,wParam,lParam). DuplicateHandle() ist nicht erforderlich !
@berniebutt :
Anhand der Anmerkung bzgl. NtQuerySystemInformation hätte Dir klar sein müssen, dass es sich um OS-Handles und nicht Fenster-Handles handelt.@JohnLe:
1. OS-Handles haben nur innerhalb enes Prozesses gültigkeit. Man beötigt also DuplicateHandle, wie sonst willst Du garantieren, dass dieses Handle nicht ungülig wird?
2. Nicht alle Handles lassen sich außerhalb eines anderen Prozessesnutzen. Siehe Doku to DuplicateHandle:
http://msdn.microsoft.com/en-us/library/ms724251(VS.85).aspx
3. Sockets sind ein ganz gesondertes Spiel, siehe WSADuplicateSocket!
4. Verstehe ich nicht was Dein erstes Posting mit Deinem zweiten zu tun hat.
-
@ Martin Richter: Sorry, kann nicht alles wissen! War nur ein Vorschlag, der vielleicht hätte helfen können.
-
Danke für die Antworten!
@ Martin Richter
Zu 1: Ja, stimmt. Ich hätte mir nur erhofft, dass es eine andere Funktion gibt, die vielleicht besser/anders arbeitet.Zu 2: Danke, hätte mir die Doku vorher schon durchlesen sollen.
Aber so als kleine Anmerkung, falls später nochmal jemand nachliest - Sockets lassen sich durchaus mit DuplicateHandle weiterverwenden. Das Problem dabei ist nur, dass der Prozess, der das Socket erstellt hat, dann normalerweise keine Daten mehr auf dem Socket empfängt.Zu 3: WSADuplicateSocket scheint perfekt zu sein. Ich muss das aus dem Prozess heraus aufrufen, der das Socket erstellt hat. Dazu muss ich dann WriteProcessMemory und CreateRemoteThread verwenden, oder?
Zu 4: Mit meinem zweiten Posting wollte ich noch sagen, dass es um Sockets geht und dass das Programm, das das Socket erstellt hat, keine Daten mehr auf dem Socket empfängt, nachdem ich das Socket in meinem Programm in einer Funktion verwendet habe. Das ist bisher bei jedem Programm, außer einem DirectX-Spiel, passiert.