Я написал службу Windows, которая ловит UDP-сообщение, создает процесс как пользователь, отправляет сообщение процессу через именованные каналы и повторяет.Сервис отлично работает в XP, но неожиданно завершает работу в Windows 7 после одной итерации.Просмотр событий показывает, что после того, как я передаю свое сообщение службе, возникает ошибка приложения, за которой следует неожиданное завершение работы моей службы.Ошибка приложения говорит, что неисправный модуль - это ntdll.dll.Отладка моей службы показывает, где код останавливается.
Вот мой рабочий цикл.
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);
Мои журналы отладки в XP показывают, что после DebugLog("Cleanup")
он возвращается к DebugLog("Waiting For UDP message")
.В windows 7 он останавливается после DebugLog("Cleanup")
.Я смотрю на проблемы, которые может создать мой код.Любые другие предложения будут с благодарностью.
Спасибо, Джозеф Г.