+++ /dev/null
-/*
- * 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 <windows.h>
-#include <wine/debug.h>
-
-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 */