J'ai écrit un service Windows qui attrape un message UDP, crée un processus en tant qu'utilisateur, envoie le message au processus via des canaux nommés et répète. Service fonctionne très bien dans XP mais se termine de façon inattendue dans Windows 7 après une itération. L'Observateur d'événements montre qu'après avoir transmis mon message au service, il y a une erreur d'application suivie de la fin inattendue de mon service. L'erreur d'application indique que le module d'erreur est ntdll.dll. Le débogage de mon service montre où le code s'arrête.Le service Windows se termine de manière inattendue dans Windows 7
Voici ma boucle de travail.
do
{
DebugLog("Waiting For UDP message");
if(recvfrom(socketId, buffer, buffSize, 0, &clientAddrCast, &size) >= 0)
{
DebugLog("Create Named Pipe");
hPipe = CreateNamedPipe(lpszPipename, // pipe name
PIPE_ACCESS_DUPLEX, // read/write access
PIPE_TYPE_MESSAGE | // message pipe
PIPE_READMODE_MESSAGE, // message read mode
1, // maximum Instaces
buffSize, // output buffer size
buffSize, // input buffer size
5000, // client time-out
&pSecAttrib); // security attributes
if (hPipe == INVALID_HANDLE_VALUE)
ErrorLog("CreateNamedPipe");
DebugLog("Create User Process");
if(!CreateProcessAsUser(hTokenDupe, "C:\\Services\\UDPClient_UserApp.exe", NULL, NULL, NULL, false, dwCreationFlags, NULL, NULL, &si, &pi))
{
// if client app fails use SendMessage as failsafe
//WTSSendMessage(WTS_CURRENT_SERVER_HANDLE, sessionID, pTitle, sizeof(pTitle),
//buffer, sizeof(buffer), MB_OK, 30, &resp, false);
ErrorLog("CreateProcess");
}
else
{
DebugLog("Writing to User Process");
// Open pipe to client
if(cSuccess = ConnectNamedPipe(hPipe, NULL) == 0)
ErrorLog("ConnectNamedPipe");
else
{
Sleep(2000);
cbToWrite = (lstrlen(buffer)+1)*sizeof(TCHAR);
if(!WriteFile(
hPipe, // pipe handle
buffer, // message
cbToWrite, // message length
&cbWritten, // bytes written
NULL)) // not overlapped
ErrorLog("WriteFile");
}
}
}
DebugLog("Cleanup");
DestroyEnvironmentBlock(&pEnv);
DisconnectNamedPipe(hPipe);
CloseHandle(hPipe);
ErrorLog("test");
}while(gServiceStatus.dwCurrentState == SERVICE_RUNNING);
Mes journaux de débogage dans XP montrent que, après DebugLog("Cleanup")
il revient en boucle à DebugLog("Waiting For UDP message")
. Dans Windows 7, il s'arrête après DebugLog("Cleanup")
. Je suis à la recherche de problèmes que mon code pourrait créer. Toute autre suggestion serait la bienvenue.
Merci, Joseph G.
Désolé pour ça. Il échoue quelque part après que 'DebugLog (" Cleanup ")' est appelé. J'ai déjà édité mon post. –