Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178/* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel * FILE: base/services/thmsvc/thmserver.c * PURPOSE: Themes server * PROGRAMMER: Giannis Adamopoulos */
/* * NOTE: * ThemeWaitForServiceReady and ThemeWatchForStart are called from msgina * so all the functions in this file run in the context of winlogon */
/* INCLUDES *****************************************************************/
#include <windows.h>#include <uxtheme.h>#include <uxundoc.h>#include <wine/debug.h>
WINE_DEFAULT_DEBUG_CHANNEL(shsvcs);
/* GLOBALS ******************************************************************/
static WCHAR ServiceName[] = L"Themes";
HANDLE hThemeStartWaitObject, hThemeStopWaitObject, hThemeServiceWaitObject;HANDLE hStartEvent, hStopEvent, hServiceProcess;
BOOL WINAPI ThemeWatchForStart(VOID);
/* FUNCTIONS *****************************************************************/
staticHANDLEGetThemeServiceProcessHandle(VOID){ SC_HANDLE scm, service; SERVICE_STATUS_PROCESS status; DWORD dummy; HANDLE ret;
if (!(scm = OpenSCManagerW( NULL, NULL, 0 ))) { ERR( "failed to open service manager\n" ); return NULL; } if (!(service = OpenServiceW( scm, ServiceName, SERVICE_QUERY_STATUS ))) { ERR( "failed to open themes service\n" ); CloseServiceHandle( scm ); return NULL; }
if (!QueryServiceStatusEx( service, SC_STATUS_PROCESS_INFO, (BYTE *)&status, sizeof(status), &dummy )) { ERR("QueryServiceStatusEx failed\n"); CloseServiceHandle( service ); CloseServiceHandle( scm ); return NULL; }
ret = OpenProcess(SYNCHRONIZE, FALSE, status.dwProcessId);
CloseServiceHandle( service ); CloseServiceHandle( scm );
return ret;}
staticVOIDCALLBACKThemeStopCallback(PVOID lpParameter, BOOLEAN TimerOrWaitFired){ CloseHandle(hServiceProcess); UnregisterWait(hThemeServiceWaitObject);
ThemeWatchForStart(); ThemeHooksRemove();}
staticVOIDCALLBACKThemeServiceDiedCallback(PVOID lpParameter, BOOLEAN TimerOrWaitFired){ /* The theme service died and we don't know if it could set its events properly */ ResetEvent(hStartEvent); ResetEvent(hStopEvent);
CloseHandle(hServiceProcess); UnregisterWait(hThemeStopWaitObject); ThemeWatchForStart(); ThemeHooksRemove();}
staticVOIDCALLBACKThemeStartCallback(PVOID lpParameter, BOOLEAN TimerOrWaitFired){ hServiceProcess = GetThemeServiceProcessHandle();
RegisterWaitForSingleObject(&hThemeStopWaitObject, hStopEvent, ThemeStopCallback, NULL, INFINITE, WT_EXECUTEONLYONCE); RegisterWaitForSingleObject(&hThemeServiceWaitObject, hServiceProcess, ThemeServiceDiedCallback, NULL, INFINITE, WT_EXECUTEONLYONCE);
ThemeHooksInstall();}
BOOLWINAPIThemeWatchForStart(VOID){ hStartEvent = CreateEventW(NULL, TRUE, FALSE, L"Global\\ThemeStartEvent"); hStopEvent = CreateEventW(NULL, TRUE, FALSE, L"Global\\ThemeStopEvent");
RegisterWaitForSingleObject(&hThemeStartWaitObject, hStartEvent, ThemeStartCallback, NULL, INFINITE, WT_EXECUTEONLYONCE);
return TRUE;}
DWORDWINAPIThemeWaitForServiceReady(DWORD dwTimeout){ SC_HANDLE scm, service; SERVICE_STATUS_PROCESS status; BOOL ret = FALSE; DWORD start_time = GetTickCount();
TRACE("\n");
if (!(scm = OpenSCManagerW( NULL, NULL, 0 ))) { ERR( "failed to open service manager\n" ); return FALSE; } if (!(service = OpenServiceW( scm, ServiceName, SERVICE_QUERY_STATUS ))) { ERR( "failed to open themes service\n" ); CloseServiceHandle( scm ); return FALSE; }
while(TRUE) { DWORD dummy;
if (!QueryServiceStatusEx( service, SC_STATUS_PROCESS_INFO, (BYTE *)&status, sizeof(status), &dummy )) break; if (status.dwCurrentState == SERVICE_RUNNING) { ret = TRUE; break; } if (status.dwCurrentState != SERVICE_START_PENDING) { break; }
if (GetTickCount() - start_time > dwTimeout) { break; } Sleep( 100 ); };
CloseServiceHandle( service ); CloseServiceHandle( scm ); return ret;}
/* EOF */