Jump to content


This is a ready-only archive of the InstallSite Forum. You cannot post any new content here. / Dies ist ein Archiv des InstallSite Forums. Hier können keine neuen Beiträge veröffentlicht werden.
Photo

ServiceAddService


2 replies to this topic

Mõbius

Mõbius
  • Full Members
  • 26 posts

Posted 06 June 2006 - 17:59

Hi Leute,

heute habe ich ein u.a. Problem mit der Funktion ServiceAddService.

Ich habe in meinem Setup mehrere Treiber, genau drei Stück. Alle werden mit der Funktion ServiceAddService als Kernel-Treiber installiert. Die Unterschiede sind wie folgt.

1. Treiber

ServiceInitParams();
SERVICE_IS_PARAMS.dwServiceType = SERVICE_KERNEL_DRIVER;
SERVICE_IS_PARAMS.dwErrorControl = SERVICE_ERROR_NORMAL;

ServiceAddService("Treiber1","Treiber 1","Das ist Treiber 1",TARGETDIR ^ "Treiber1.sys",FALSE,SERVICE_IS_PARAMS);


2. Treiber

ServiceInitParams();
SERVICE_IS_PARAMS.dwServiceType = SERVICE_KERNEL_DRIVER;
SERVICE_IS_PARAMS.dwErrorControl = SERVICE_ERROR_NORMAL;

ServiceAddService("Treiber2","Treiber 2","Das ist Treiber 2",TARGETDIR ^ "Treiber2.sys",FALSE,SERVICE_IS_PARAMS);


3. Treiber

ServiceInitParams();
SERVICE_IS_PARAMS.dwServiceType = SERVICE_KERNEL_DRIVER;
SERVICE_IS_PARAMS.dwErrorControl = SERVICE_ERROR_NORMAL;
SERVICE_IS_PARAMS.dwStartType = SERVICE_DEMAND_START;

ServiceAddService("Treiber3","Treiber 3","Das ist Treiber 3",WINSYSDIR ^ "Drivers" ^ "Treiber3.sys",FALSE,SERVICE_IS_PARAMS);


Die Treiber 2 und 3 sind über den ServiceControlManager nicht start- oder stopbar. Man kann beispielsweise nicht auf der Kommandozeile "net stop Treiber2" eingeben. Es würde sofort folgende Meldung erscheinen:

Die angeforderte Unterbrechung, Fortsetzung oder Beendigung ist für diesen Dienst ungültig.

Bis hierhin ist ja alles noch ok. Die Installation der Dienste funktioniert auch. Probleme habe ich mit dem Wartungsmodus bzw. mit allen Wartungsmodi. Während dem Aufruf von ServiceAddService (bei Reparieren oder Ändern) wird laut Dokumentation von InstallShield versucht, den Dienst anzuhalten, wenn er bereits existiert. Leider bleibt das Setup in der Funktion ServiceAddService hängen, wenn es sich dabei um Treiber2 oder Treiber3 handelt, die nicht beendet werden können. Ich hätte jetzt angenommen, dass InstallShield genauso wie auch auf der Kommandozeile sofort bemerken würde, dass der "Dienst" nicht beendet werden kann und aus der Funktion ServiceAddService zurückkommt. Leider ist dem nicht so. Während dem Aufruf - und ich habe eine viertel Stunde gewartet - teilen sich der Setup-Prozess als auch der ServiceControlManager (services.exe) die Computerauslastung von 100% - bis zu einem erzwungenen Neustart per RESET-Taste.

Treiber3 wurde auf die gleiche Art und Weise bereits mit einem InstallShield 7 Professional-Projekt installiert - immer ohne Probleme bei der Wartung oder Deinstallation.

Weiß jemand weiter?

Danke

Edited by Mõbius, 06 June 2006 - 18:04.


Mõbius

Mõbius
  • Full Members
  • 26 posts

Posted 07 June 2006 - 22:08

Hallo Mõbius,

schade, dass bis jetzt niemand auf Deine Frage eine Antwort gefunden hat.

Standardmäßig versucht die Funktion ServiceAddService einen bereits aktiven Dienst zu beenden. Kann der Dienst nicht beendet werden, wartet die Funktion ewig - und ich meine ewig.

Vor dem Aufruf der besagten Funktion sollte mittels ServiceInitParams() die Struktur SERVICE_IS_PARAMS auf Standardwerte vorinitialisiert werden. Das hast Du ja auch schon getan. Leider werden dabei die beiden Werte SERVICE_IS_PARAMS.nStartServiceWaitCount und SERVICE_IS_PARAMS.nStopServiceWaitCount auf "unendlich" gesetzt. Das bedeutet, dass die Funktion ServiceAddService ewig wartet, bis der Dienst beendet ist. Dem kann man entgegenwirken, indem man die beiden folgenden Zeilen hinzufügt. Der angegebene Wert ist ein Sekunden-Wert, nicht Millisekunden!

SERVICE_IS_PARAMS.nStartServiceWaitCount = 1;
SERVICE_IS_PARAMS.nStopServiceWaitCount = 1;


Damit sollte der Aufruf der Funktionen ServiceAddService und ServiceRemoveService nicht mehr hängen bleiben und zu den gewünschten Resultaten führen.

Viel Erfolg.

Mõbius

Mõbius

Mõbius
  • Full Members
  • 26 posts

Posted 07 June 2006 - 22:10

Hi Mõbius,

danke für Deine Antwort. Dein Tipp hat geholfen. Nun arbeiten die Funktionen wie gewünscht.

Mõbius