/* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel * FILE: base/services/shsvcs/thmsvc.c * PURPOSE: Themes service * PROGRAMMER: Giannis Adamopoulos */ /* INCLUDES *****************************************************************/ #include #include WINE_DEFAULT_DEBUG_CHANNEL(shsvcs); /* GLOBALS ******************************************************************/ static WCHAR ServiceName[] = L"Themes"; SERVICE_STATUS_HANDLE ServiceStatusHandle; SERVICE_STATUS ServiceStatus; /* FUNCTIONS *****************************************************************/ HANDLE StartEvent, StopEvent; static VOID UpdateServiceStatus(DWORD dwState) { ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS; ServiceStatus.dwCurrentState = dwState; if (dwState == SERVICE_RUNNING) ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_PAUSE_CONTINUE | SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN; else if (dwState == SERVICE_PAUSED) ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_PAUSE_CONTINUE; else ServiceStatus.dwControlsAccepted = 0; ServiceStatus.dwWin32ExitCode = 0; ServiceStatus.dwServiceSpecificExitCode = 0; ServiceStatus.dwCheckPoint = 0; if (dwState == SERVICE_START_PENDING || dwState == SERVICE_STOP_PENDING || dwState == SERVICE_PAUSE_PENDING || dwState == SERVICE_CONTINUE_PENDING) ServiceStatus.dwWaitHint = 10000; else ServiceStatus.dwWaitHint = 0; SetServiceStatus(ServiceStatusHandle, &ServiceStatus); } static DWORD WINAPI ServiceControlHandler(DWORD dwControl, DWORD dwEventType, LPVOID lpEventData, LPVOID lpContext) { TRACE("ServiceControlHandler() called\n"); switch (dwControl) { case SERVICE_CONTROL_STOP: TRACE(" SERVICE_CONTROL_STOP received\n"); /* Signal the theme server in winlogon to remove theme hooks */ ResetEvent(StartEvent); SetEvent(StopEvent); UpdateServiceStatus(SERVICE_STOPPED); return ERROR_SUCCESS; case SERVICE_CONTROL_PAUSE: TRACE(" SERVICE_CONTROL_PAUSE received\n"); UpdateServiceStatus(SERVICE_PAUSED); return ERROR_SUCCESS; case SERVICE_CONTROL_CONTINUE: TRACE(" SERVICE_CONTROL_CONTINUE received\n"); UpdateServiceStatus(SERVICE_RUNNING); return ERROR_SUCCESS; case SERVICE_CONTROL_INTERROGATE: TRACE(" SERVICE_CONTROL_INTERROGATE received\n"); SetServiceStatus(ServiceStatusHandle, &ServiceStatus); return ERROR_SUCCESS; case SERVICE_CONTROL_SHUTDOWN: TRACE(" SERVICE_CONTROL_SHUTDOWN received\n"); UpdateServiceStatus(SERVICE_STOPPED); return ERROR_SUCCESS; default : TRACE(" Control %lu received\n"); return ERROR_CALL_NOT_IMPLEMENTED; } } VOID WINAPI ThemeServiceMain(DWORD argc, LPTSTR *argv) { UNREFERENCED_PARAMETER(argc); UNREFERENCED_PARAMETER(argv); ServiceStatusHandle = RegisterServiceCtrlHandlerExW(ServiceName, ServiceControlHandler, NULL); if (!ServiceStatusHandle) { ERR("RegisterServiceCtrlHandlerExW() failed! (Error %lu)\n", GetLastError()); return; } StartEvent = CreateEventW(NULL, TRUE, FALSE, L"Global\\ThemeStartEvent"); StopEvent = CreateEventW(NULL, TRUE, FALSE, L"Global\\ThemeStopEvent"); UpdateServiceStatus(SERVICE_RUNNING); /* Signal the theme server in winlogon to install theme hooks */ ResetEvent(StopEvent); SetEvent(StartEvent); } /* EOF */