Windows Service Installieren - Programm schließt sich nicht!?



  • Falls du Windows 7 verwendest starte dein Programm mal als Admin ich meine ich hatte mal ein Problem das ich einen Kernel Treiber mit meinem Programm nicht starten konnte weil ich mein Programm nicht als Admin gestartet habe.

    Bin mir aber gerade nicht sicher ob es so war ich meine mich dunkel an so etwas ähnliches zu erinnern ist schon ewig her. 🙄



  • Den Returncode hab ich natürlich geprüft, alles in Ordnung bzw. in diesem Fall "1".
    Admin bin ich sowieso, aber auch explizit als Admin starten hilft nicht.
    Also ich hab ja schon einige seltsame Dinge erlebt, aber so langsam...

    Achja, hab ich noch nicht erwähnt, falls es relevant sein sollte:
    - Win7 Ultimate x64
    - Visual Studio 11 (BETA)
    - Service ist x64 Executable

    BTW: Könnte es evtl an einer Compilereinstellung liegen? Wie gesagt habe ich mich vorher noch nie mit Services beschäftigt, deshalb habe ich ein "rohes" Win32 Projekt als Vorlage genommen...



  • Ist der Treiber den Signiert?



  • Ist ja eigentlich nur ein Usermode-Service, der brauch doch nicht signiert sein, oder? 😮
    Installieren/Deinstallieren kann ich den Service ja, alles okay, nur dass er nach dem Installieren weiter läuft, anstatt sich zu beenden, wie er sollte, das stört 😉



  • __username schrieb:

    Ist ja eigentlich nur ein Usermode-Service, der brauch doch nicht signiert sein, oder? 😮
    Installieren/Deinstallieren kann ich den Service ja, alles okay, nur dass er nach dem Installieren weiter läuft, anstatt sich zu beenden, wie er sollte, das stört 😉

    Zeig mal Dein ganzer Code bitte.



  • Aber gerne

    void main(void)
    {
    	int i;
    	LPWSTR* c = CommandLineToArgvW(GetCommandLine(), &i);
    	if(i > 1)
    	{
    		if(wcscmp(c[1], L"install") == 0) // <- Debug Commandline
    		{
    			i(L"install");
    			InstallService();
    			return;
    		}
    ...
    void InstallService()
    {
    	SC_HANDLE serviceControlManager = OpenSCManager( 0, 0, SC_MANAGER_ALL_ACCESS ); // Kein Fehler
    	GetLastError(); // 0
    	CloseServiceHandle( serviceControlManager ); // 1 bzw TRUE
    	GetLastError(); // o
    	return;
    ...
    


  • So installiert man auch kein Service! Da fehlt ne menge an Code!



  • Und was soll das in Zeile 9?
    😕



  • Mir ist klar, dass da noch Code fehlt, dieser ist aber für mein Problem nicht relevant.

    Zeile 9 ist ne Debug ausgabe...



  • Du kannst den Service Manager mit vollen Rechten nur über Admin bekommen!



  • __username schrieb:

    Admin bin ich sowieso, aber auch explizit als Admin starten hilft nicht.



  • Dann hast Du ein anderes Problem! Zeig mal den ganzen Code.. denn an dem kann es nicht liegen!


  • Mod

    Also wenn Dein Programm hängt, dann klick auf "Break All" und schau den Callstack an.

    Wo steht Deine Software. Was macht sie in dem Moment?



  • Gute Idee, jetzt steckt der Code im sichtbare Bereich fest, vorher konnte ich den Debugger nicht sehen, seltsam, egal!

    Debugger

    NtWaitForMultipleObjects:
    0000000076DC18C0 4C 8B D1             mov         r10,rcx  
    0000000076DC18C3 B8 58 00 00 00       mov         eax,58h  
    0000000076DC18C8 0F 05                syscall  
    0000000076DC18CA C3                   ret  // hier hängen wir...
    0000000076DC18CB 0F 1F 44 00 00       nop         dword ptr [rax+rax]
    

    Callstack

    ntdll.dll!NtWaitForMultipleObjects() // hier hängen wir... 
    ntdll.dll!TppWaiterpThread()
    kernel32.dll!BaseThreadInitThunk()
    ntdll.dll!RtlUserThreadStart()
    

    Das sieht ja so aus, als wäre das ServiceManager-Object noch in Verwendung...
    MSDN sagt:

    CloseServiceHandle:
    hSCObject [in]
    A handle to the service control manager object or the service object to close. Handles to service control manager objects are returned by the OpenSCManager function, and handles to service objects are returned by either the OpenService or CreateService function.

    Edit:
    Kann es sein, dass CloseServiceHandle einen Thread erstellt, der auf das Object "wartet" und der Prozess somit nicht beendet werden kann?



  • So hab´s endlich, man sucht doch immer tiefer als das Problem eigentlich liegt...
    Lag daran, dass ich als EntryPoint

    void __stdcall main(void)
    

    festgelegt habe. Regulär müsste es ja

    int __stdcall wWinMain(HINSTANCE, HINSTANCE, LPWSTR, int)
    

    heißen, aber ich dachte, das würde auch so funktionieren...das tut es aber anscheinend nicht 🙂



  • Wie bitte? Also bei mir funktioniert es auch mit int main(void).
    Dein Problem ist wohl ein anderes. Hatte auch mal so ein Problem, bei dem ich einfach mal ein Kompletes clean und danach ein rebuild durchgefûhrt habe... dannach hatte ich diesen komischen effekt nicht mehr! Bei mir blieb er auch immer an bestimmter Stelle hängen....



  • Hatte ich alles gemacht, half aber nichts 😉


Anmelden zum Antworten