OVH Cloud OVH Cloud

Rendez-moi un Service Windows XP !!

3 réponses
Avatar
minso
Bonjour tous !

Je développe un petit service Windows (comme ceux que l'on voit
gaiement se débattre dans Outils d'administration / Services.

Pour l'instant, mon service :
* s'installe (bravo) - merci à CreateService
* se lance (trop fort) - merci à StartServiceCtrlDispatcher
* il gère même les messages qui lui disent de se mettre en pause
(ouaah) - merci à RegisterServiceCtrlHandlerEx
* se met en boucle infinie :

while( bosseFeignasse == TRUE )
{
Sleep( 2000 );

if( serviceStatus.dwCurrentState == SERVICE_RUNNING )
OutputDebugString( "Je cours...\n" );

else if( serviceStatus.dwCurrentState == SERVICE_PAUSED )
OutputDebugString( "Je dors...\n" );

else
OutputDebugString( "Que fais-je ?...\n" );
}

* la condition bosseFeignasse passe à FALSE quand un code
SERVICE_CONTROL_PAUSE est reçu. Puis, la fin, l'apothéose :

OutputDebugString( "Au revoir les copains !!\n" );
serviceStatus.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus( handleService, &statutService );

Et fin du ServiceMain. Sauf que voilà, en suivant l'activité de mon
petit dans un débogueur, (WinDbg 6.0.0017.0 pour être précis), il me
dit qu'une exception est survenue quelque part après le
OutputDebugString( "Au revoir les copains !!\n" );

Alors.....

Y a-t-il quelqu'un parmi vous qui ait la moindre idée de soupçon de la
cause de l'exception ? Ai-je oublié l'ajout d'une ou deux fonction
secrète Windows ?

Win_abrutiLeServiceVaSeFermer( handleService );
Win_je RigolePasCloseMoiCaSinonCaVaChier( handleService );

Plizz Help !!!

3 réponses

Avatar
Arnaud Debaene
Eric Minso wrote:


Il y a pas mal de code, ça va être chaud.
Tu es sûr ?



Postes un code minimal compilable. Il est probalbe que tu trouveras le
problème en le préparant à partir de ton existant.

Arnaud
Avatar
minso
"Arnaud Debaene" wrote in message news:<3f2163b9$0$5222$...
Eric Minso wrote:

>
> Il y a pas mal de code, ça va être chaud.
> Tu es sûr ?

Postes un code minimal compilable. Il est probalbe que tu trouveras le
problème en le préparant à partir de ton existant.

Arnaud






int main( int argc, char **argv )
{
SERVICE_TABLE_ENTRY serviceTableEntry[] =
{
{SERVICE_NAME, (LPSERVICE_MAIN_FUNCTION) ServiceMain },
{NULL, NULL }
};

if( !StartServiceCtrlDispatcher( serviceTableEntry ) )
{
installService();
}

return 0;
}



void ServiceMain( DWORD dwArgc, LPTSTR* lpszArgv )
{
HANDLE hHidService = RegisterServiceCtrlHandlerEx(
SERVICE_NAME,
(LPHANDLER_FUNCTION_EX) HandleFunction,
NULL
);

serviceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
serviceStatus.dwCurrentState SERVICE_START_PENDING; serviceStatus.dwControlsAccepted SERVICE_ACCEPT_PAUSE_CONTINUE | SERVICE_ACCEPT_STOP |
SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_SESSIONCHANGE;
serviceStatus.dwWin32ExitCode = NO_ERROR;
serviceStatus.dwServiceSpecificExitCode = NO_ERROR;
serviceStatus.dwCheckPoint = 0;
serviceStatus.dwWaitHint = 0;
SetServiceStatus( hService, &serviceStatus );


serviceStatus.dwCurrentState = SERVICE_RUNNING;
SetServiceStatus( hHidService, &serviceStatus );

Sleep( 10000 );

serviceStatus.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus( hHidService, &serviceStatus );
}
Avatar
minso
Donc, voilà le code minimal (pas de message d'erreur, mais j'attache
le débogeur WinDbg, et lorsque ce service s'arrête, WinDbg m'affiche
le message suivant :


SuspendThread failed, Win32 error 5
eax000000 ebx1460dc ecx000000 edx000000 esi000079
edi000000
eipfe0304 esp70f808 ebp70f86c iopl=0 nv up ei pl nz
na pe nc
cs1b ss23 ds23 es23 fs3b gs00
efl000202
SharedUserData!SystemCallStub+4:
7ffe0304 c3 ret