Служба Windows неожиданно завершает работу в Windows 7 - PullRequest
0 голосов
/ 23 июня 2011

Я написал службу 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").Я смотрю на проблемы, которые может создать мой код.Любые другие предложения будут с благодарностью.

Спасибо, Джозеф Г.

1 Ответ

0 голосов
/ 24 июня 2011

Полагаю, ужесточение мер безопасности в Win7 вас достало.

Здесь отсутствует код, например, что в pSecAttrib? Повысьте обработку ошибок, чтобы (например) вы не выполняли оставшуюся часть тела цикла, если создание канала завершилось неудачно, и вы точно знаете, какой API вышел из строя и почему.

CreateProcessAsUser - каким пользователем вы пользуетесь сервисом? Обладает ли этот пользователь правами доступа - они могут отличаться на Win7 и WinXP.

Журнал GetLastError() значение после всех Win32 сбоев. Сделайте свою жизнь проще, это может когда-нибудь произойти на удаленном сайте в Production, и как вы будете тогда устранять неполадки?

Для чего это Sleep(2000);? Подозрительно. Если канал открыт, почему бы просто не отправить данные и избежать этой задержки. Является ли код сервера Named Pipe такой медленной для отправки запроса на чтение по каналу?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...