Problem: Mit NamedPipe, Help!



  • Jojo ich schon wieder,
    Ich hab hier gerade irgendwie ein Problem mit named pipes.

    Ich hab hier einen parent process, der lädt eine DLL in einen anderen Process, anschließend startet der parent process noch einen Thraed der eine Server-Pipe erstellen soll:

    DWORD WINAPI Starter( LPVOID pParam ) {
    
    	SendMessage( hList, LB_ADDSTRING, 0, (long)"Create Server-Pipi ..." );
    
    	hPipe = CreateNamedPipe( szPipename, PIPE_ACCESS_INBOUND, PIPE_TYPE_MESSAGE | PIPE_WAIT, PIPE_UNLIMITED_INSTANCES, 0, 0, 200, 0 );
    	if( hPipe ) {
    
    		SendMessage( hList, LB_ADDSTRING, 0, (long)"Create Server-Pipi success!" );
    
    		// ***** Wait of client *****
    		SendMessage( hList, LB_ADDSTRING, 0, (long)"Waiting for client connection ..." );
    		if( ConnectNamedPipe( hPipe, 0 ) ) {
    
    			SendMessage( hList, LB_ADDSTRING, 0, (long)"Client-Pipi-Connection success!" );
    
    			SendMessage( hList, LB_ADDSTRING, 0, (long)"Start server thread ..." );
    			hThread = CreateThread( 0, 0, ThreadProc, (LPVOID)hPipe, 0, &dwThreadId ); 
    			if( hThread == 0 ) {
    
    				SendMessage( hList, LB_ADDSTRING, 0, (long)"Start server thread fails!" );
    			}
    			else {
    
    				SendMessage( hList, LB_ADDSTRING, 0, (long)"Start server thread success!" );
    			}
    		}
    		else {
    
    			SendMessage( hList, LB_ADDSTRING, 0, (long)"Client-Pipi-Connection failed!" );
    		}
    	}
    	else {
    
    		SendMessage( hList, LB_ADDSTRING, 0, (long)"Create Server-Pipi failed!" );
    	}
    
    	return( (DWORD)pParam );
    }
    

    Nach dem der Thread gestartet wurde soll die DLL in den fremden Prozess geladen werden und dort werden geheime Dinge getan 😃 unteranderem soll dort auch aus der DLL heraus eine Verbindung mit der vom parent process erstellten pipe aufgenommen werden:

    bool ConnectToPipe( ) {
    
    	hPipe = CreateFile( szPipename, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );         
    
    	if( hPipe == INVALID_HANDLE_VALUE )
    		return false;
    
    	return true;
    }
    

    Hm, allerding bleibt der parent process immer bei:

    SendMessage( hList, LB_ADDSTRING, 0, (long)"Waiting for client connection ..." );
    

    hängen, wasmir sagt das es anscheint nicht geklappt hat, was mir auch ein false von der ConnectToPipe( ) bestätigt.

    Was läuft hier schief?

    Gruß Tobi.



  • Reine Vermutung : PIPE_WAIT -> "Blocking mode is enabled"

    Ruf mal ConnectNamedPipe nach CreateThread auf.



  • Wieso, das Createthreade dort, ist ein Thread der auf Nachrichten vom Client wartet.



  • Aber der Server wartet erst einmal bis ein Client "angebissen" hat.

    Danach erst soll ein Thread erzeugt werden, der auf Clienten wartet ?



  • merker schrieb:

    Aber der Server wartet erst einmal bis ein Client "angebissen" hat.

    Danach erst soll ein Thread erzeugt werden, der auf Clienten wartet ?

    Hö? ConnectNamedPipe ist doch die stelle wo gewartet wird das ein Client die Verbindung auf nimmt oder?



  • Ja, schon. Aber das kann der Server auch im Thread machen. Nur CreateNamedPipe und CreateThread müssten reichen.



  • Pass auf hier mal die stelle im Code wo das alles so passieren soll:

    // Parent process
    case WM_CREATE: {
    
    			EnableDebugPrivilege( );
    
    			// ***** Log list *****
    			hList = CreateWindowEx( WS_EX_CLIENTEDGE, "LISTBOX", 0, WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL, 0, 0, 0, 0, hWnd, (HMENU)5000, GetModuleHandle( 0 ), 0 );		
    
    			// ***** Initial pipe connection *****
    			hStarter = CreateThread( 0, 0, Starter, 0, 0, &dwStarterID );
    
    // ***** Inject DLL *****
    		InjectDLL( "KickIT.dll", GetWc3PID( ) );			
                return 0;
    }
    

    Ich hab auch mal die InjectDLL hinter CreateNamedPipe aufgerufen, dann bekomm ich ich aber nur ein false zurueck.



  • ich hab mir jetzt noch nen extra client pipe Konsolenprogramm geschrieben, die die Connect-Funktion aus der DLL ausführt und hier funktioniert es. Kann es sein das man gar keine named pipe connection aus einer DLL herraus aufbauen kann?

    EDIT:
    Die connect-Funktion aus der DLL gibt jedenfalls schon mal true zurück.



  • Oweh, das was in der "case WM_CREATE" alles gemacht wird, sieht eher nach einem Synchronisationsproblem aus.

    Die Pipe muß funktionsfähig sein bevor "InjectDLL" aufgerufen wird. Das ist aber nach CreateThread noch lange nicht der Fall.

    Probier mal "InjectDLL" gesondert, also in einem anderen "case WM_xxxx" aufzurufen.



  • ne das wird auch nichts, ich hab die DLLInject mal in die WM_SIZE gesteckt, dann bekomm ich aber wieder ein false von der Connect-Funktion aus der dll.



  • WM_SIZE ist ungeeignet. U.U. kommt der sogar noch vor WM_CREATE. Probier mal irgendein Button-Klick oder so.



  • in der tat es ist ein Syncronisationsproblem, denn ich habs auch mal andersherum probiert, sprich einen Server application geschrieben und dann mit der DLL connected und das ging. Und ja es geht jetzt auch mit dem Button, aber ich find das doof, gibts nicht doch nen Weg das es alle sautomatisch geht?



  • Vielleicht reicht es schon wenn "Starter" direkt, d.h. nicht via CreateThread in der "case WM_CREATE" aufgerufen wird.

    Dann würde die Pipe auch schon sicher vorhanden sein bevor "InjectDLL" aufgerufen wird.

    Aber dann darf ConnectNamedPipe in "Starter" nicht aufgeruufen werden sondern erst im dem Thread, der in "Starter" erzeugt wird.

    Zumindest ist das Hauptproblem erkannt. Viel Glück noch bei den "geheimen Dingen". 😋


Anmelden zum Antworten