2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: base/services/thmsvc/thmserver.c
5 * PURPOSE: Themes server
6 * PROGRAMMER: Giannis Adamopoulos
11 * ThemeWaitForServiceReady and ThemeWatchForStart are called from msgina
12 * so all the functions in this file run in the context of winlogon
15 /* INCLUDES *****************************************************************/
20 #include <wine/debug.h>
22 WINE_DEFAULT_DEBUG_CHANNEL(shsvcs
);
24 /* GLOBALS ******************************************************************/
26 static WCHAR ServiceName
[] = L
"Themes";
28 HANDLE hThemeStartWaitObject
, hThemeStopWaitObject
, hThemeServiceWaitObject
;
29 HANDLE hStartEvent
, hStopEvent
, hServiceProcess
;
31 BOOL WINAPI
ThemeWatchForStart(VOID
);
33 /* FUNCTIONS *****************************************************************/
37 GetThemeServiceProcessHandle(VOID
)
39 SC_HANDLE scm
, service
;
40 SERVICE_STATUS_PROCESS status
;
44 if (!(scm
= OpenSCManagerW( NULL
, NULL
, 0 )))
46 ERR( "failed to open service manager\n" );
49 if (!(service
= OpenServiceW( scm
, ServiceName
, SERVICE_QUERY_STATUS
)))
51 ERR( "failed to open themes service\n" );
52 CloseServiceHandle( scm
);
56 if (!QueryServiceStatusEx( service
, SC_STATUS_PROCESS_INFO
,
57 (BYTE
*)&status
, sizeof(status
), &dummy
))
59 ERR("QueryServiceStatusEx failed\n");
60 CloseServiceHandle( service
);
61 CloseServiceHandle( scm
);
65 ret
= OpenProcess(SYNCHRONIZE
, FALSE
, status
.dwProcessId
);
67 CloseServiceHandle( service
);
68 CloseServiceHandle( scm
);
76 ThemeStopCallback(PVOID lpParameter
, BOOLEAN TimerOrWaitFired
)
78 CloseHandle(hServiceProcess
);
79 UnregisterWait(hThemeStopWaitObject
);
80 UnregisterWait(hThemeServiceWaitObject
);
89 ThemeServiceDiedCallback(PVOID lpParameter
, BOOLEAN TimerOrWaitFired
)
91 /* The theme service died and we don't know if it could set its events properly */
92 ResetEvent(hStartEvent
);
93 ResetEvent(hStopEvent
);
95 ThemeStopCallback(lpParameter
, TimerOrWaitFired
);
101 ThemeStartCallback(PVOID lpParameter
, BOOLEAN TimerOrWaitFired
)
103 UnregisterWait(hThemeStartWaitObject
);
105 hServiceProcess
= GetThemeServiceProcessHandle();
107 RegisterWaitForSingleObject(&hThemeStopWaitObject
, hStopEvent
, ThemeStopCallback
, NULL
, INFINITE
, WT_EXECUTEDEFAULT
);
108 RegisterWaitForSingleObject(&hThemeServiceWaitObject
, hServiceProcess
, ThemeServiceDiedCallback
, NULL
, INFINITE
, WT_EXECUTEDEFAULT
);
115 ThemeWatchForStart(VOID
)
117 hStartEvent
= CreateEventW(NULL
, TRUE
, FALSE
, L
"Global\\ThemeStartEvent");
118 hStopEvent
= CreateEventW(NULL
, TRUE
, FALSE
, L
"Global\\ThemeStopEvent");
120 RegisterWaitForSingleObject(&hThemeStartWaitObject
, hStartEvent
, ThemeStartCallback
, NULL
, INFINITE
, WT_EXECUTEDEFAULT
);
127 ThemeWaitForServiceReady(DWORD dwTimeout
)
129 SC_HANDLE scm
, service
;
130 SERVICE_STATUS_PROCESS status
;
132 DWORD start_time
= GetTickCount();
136 if (!(scm
= OpenSCManagerW( NULL
, NULL
, 0 )))
138 ERR( "failed to open service manager\n" );
141 if (!(service
= OpenServiceW( scm
, ServiceName
, SERVICE_QUERY_STATUS
)))
143 ERR( "failed to open themes service\n" );
144 CloseServiceHandle( scm
);
152 if (!QueryServiceStatusEx( service
, SC_STATUS_PROCESS_INFO
,
153 (BYTE
*)&status
, sizeof(status
), &dummy
))
155 if (status
.dwCurrentState
== SERVICE_RUNNING
)
160 if (status
.dwCurrentState
!= SERVICE_START_PENDING
)
165 if (GetTickCount() - start_time
> dwTimeout
)
172 CloseServiceHandle( service
);
173 CloseServiceHandle( scm
);