From afd47c09cfa7b77c101653c196cfef3836d24745 Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Fri, 7 Apr 2017 13:01:42 +0000 Subject: [PATCH] [SHSVCS] -Add the module that should host the theme service. Implement ThemeWaitForServiceReady and ThemeWatchForStart. These are already called by our msgina and are responsible for starting themes in the session. svn path=/trunk/; revision=74279 --- reactos/base/services/CMakeLists.txt | 2 +- reactos/base/services/shsvcs/CMakeLists.txt | 15 ++ reactos/base/services/shsvcs/shsvcs.c | 60 ++++++ reactos/base/services/shsvcs/shsvcs.rc | 5 + reactos/base/services/shsvcs/shsvcs.spec | 16 ++ reactos/base/services/shsvcs/thmserver.c | 177 ++++++++++++++++++ .../base/services/{thmsvc => shsvcs}/thmsvc.c | 60 +++--- reactos/base/services/thmsvc/CMakeLists.txt | 6 - reactos/base/services/thmsvc/thmsvc.rc | 4 - reactos/boot/bootdata/hivesft.inf | 2 +- reactos/boot/bootdata/hivesys.inf | 4 +- 11 files changed, 300 insertions(+), 51 deletions(-) create mode 100644 reactos/base/services/shsvcs/CMakeLists.txt create mode 100644 reactos/base/services/shsvcs/shsvcs.c create mode 100644 reactos/base/services/shsvcs/shsvcs.rc create mode 100644 reactos/base/services/shsvcs/shsvcs.spec create mode 100644 reactos/base/services/shsvcs/thmserver.c rename reactos/base/services/{thmsvc => shsvcs}/thmsvc.c (79%) delete mode 100644 reactos/base/services/thmsvc/CMakeLists.txt delete mode 100644 reactos/base/services/thmsvc/thmsvc.rc diff --git a/reactos/base/services/CMakeLists.txt b/reactos/base/services/CMakeLists.txt index fa0c0171c9c..41557e9ad63 100644 --- a/reactos/base/services/CMakeLists.txt +++ b/reactos/base/services/CMakeLists.txt @@ -4,12 +4,12 @@ add_subdirectory(dhcpcsvc) add_subdirectory(eventlog) add_subdirectory(rpcss) add_subdirectory(schedsvc) +add_subdirectory(shsvcs) add_subdirectory(srvsvc) add_subdirectory(svchost) add_subdirectory(tcpsvcs) add_subdirectory(telnetd) #add_subdirectory(tftpd) -add_subdirectory(thmsvc) add_subdirectory(umpnpmgr) add_subdirectory(wkssvc) add_subdirectory(wlansvc) diff --git a/reactos/base/services/shsvcs/CMakeLists.txt b/reactos/base/services/shsvcs/CMakeLists.txt new file mode 100644 index 00000000000..1de1b2637e8 --- /dev/null +++ b/reactos/base/services/shsvcs/CMakeLists.txt @@ -0,0 +1,15 @@ + +spec2def(shsvcs.dll shsvcs.spec ADD_IMPORTLIB) + +add_library(shsvcs SHARED + shsvcs.c + thmsvc.c + thmserver.c + shsvcs.rc + ${CMAKE_CURRENT_BINARY_DIR}/shsvcs_stubs.c + ${CMAKE_CURRENT_BINARY_DIR}/shsvcs.def) + +set_module_type(shsvcs win32dll UNICODE) +target_link_libraries(shsvcs wine) +add_importlibs(shsvcs uxtheme advapi32 msvcrt kernel32 ntdll) +add_cd_file(TARGET shsvcs DESTINATION reactos/system32 FOR all) diff --git a/reactos/base/services/shsvcs/shsvcs.c b/reactos/base/services/shsvcs/shsvcs.c new file mode 100644 index 00000000000..74078a5e648 --- /dev/null +++ b/reactos/base/services/shsvcs/shsvcs.c @@ -0,0 +1,60 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS Shell + * FILE: base/services/shsvcs/shsvcs.c + * PURPOSE: ReactOS Shell Services + * PROGRAMMER: Giannis Adamopoulos + */ + +/* INCLUDES *****************************************************************/ + +#include +#include + +WINE_DEFAULT_DEBUG_CHANNEL(shsvcs); + +/* FUNCTIONS *****************************************************************/ + +HRESULT WINAPI DllInstall(BOOL bInstall, LPCWSTR cmdline) +{ + return S_OK; +} + +HRESULT WINAPI DllRegisterServer() +{ + return S_OK; +} + +HRESULT WINAPI DllUnregisterServer() +{ + return S_OK; +} + +HRESULT WINAPI DllCanUnloadNow() +{ + return S_OK; +} + +HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv) +{ + TRACE("%s %s %p\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv); + return CLASS_E_CLASSNOTAVAILABLE; +} + +BOOL WINAPI +DllMain(HINSTANCE hinstDLL, + DWORD fdwReason, + LPVOID lpvReserved) +{ + switch (fdwReason) + { + case DLL_PROCESS_ATTACH: + DisableThreadLibraryCalls(hinstDLL); + break; + + case DLL_PROCESS_DETACH: + break; + } + + return TRUE; +} diff --git a/reactos/base/services/shsvcs/shsvcs.rc b/reactos/base/services/shsvcs/shsvcs.rc new file mode 100644 index 00000000000..16bb9e3f285 --- /dev/null +++ b/reactos/base/services/shsvcs/shsvcs.rc @@ -0,0 +1,5 @@ +#define REACTOS_VERSION_DLL +#define REACTOS_STR_FILE_DESCRIPTION "Shell Services Dll" +#define REACTOS_STR_INTERNAL_NAME "shsvcs" +#define REACTOS_STR_ORIGINAL_FILENAME "shsvcs.dll" +#include diff --git a/reactos/base/services/shsvcs/shsvcs.spec b/reactos/base/services/shsvcs/shsvcs.spec new file mode 100644 index 00000000000..e3ef5261f80 --- /dev/null +++ b/reactos/base/services/shsvcs/shsvcs.spec @@ -0,0 +1,16 @@ +1 stdcall ThemeWatchForStart() +2 stdcall ThemeWaitForServiceReady(long) +#3 stub Stub3 +#4 stub Stub4 +#5 stub Stub5 +#6 stub Stub6 +#7 stub BadApplicationServiceMain +8 stdcall DllInstall(long wstr) +9 stdcall DllRegisterServer() +10 stdcall DllUnregisterServer() +#11 stub HardwareDetectionServiceMain +12 stdcall ThemeServiceMain(long ptr) +#13 stub CreateHardwareEventMoniker +14 stdcall DllCanUnloadNow() +15 stdcall DllGetClassObject(ptr ptr ptr) +#16 stub FUSCompatibilityEntryW diff --git a/reactos/base/services/shsvcs/thmserver.c b/reactos/base/services/shsvcs/thmserver.c new file mode 100644 index 00000000000..b40f02dccb8 --- /dev/null +++ b/reactos/base/services/shsvcs/thmserver.c @@ -0,0 +1,177 @@ +/* + * 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 +#include +#include +#include + +WINE_DEFAULT_DEBUG_CHANNEL(shsvcs); + +/* GLOBALS ******************************************************************/ + +static WCHAR ServiceName[] = L"Themes"; + +HANDLE hThemeStartWaitObject, hThemeStopWaitObject, hThemeServiceWaitObject; +HANDLE hStartEvent, hStopEvent, hServiceProcess; + +BOOL WINAPI ThemeWatchForStart(); + +/* FUNCTIONS *****************************************************************/ + +static +HANDLE +GetThemeServiceProcessHandle() +{ + 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; +} + +static +VOID +CALLBACK +ThemeStopCallback(PVOID lpParameter, BOOLEAN TimerOrWaitFired) +{ + CloseHandle(hServiceProcess); + UnregisterWait(hThemeStopWaitObject); + UnregisterWait(hThemeServiceWaitObject); + + ThemeWatchForStart(); + ThemeHooksRemove(); +} + +static +VOID +CALLBACK +ThemeServiceDiedCallback(PVOID lpParameter, BOOLEAN TimerOrWaitFired) +{ + /* The theme service died and we don't know if it could set its events properly */ + ResetEvent(hStartEvent); + ResetEvent(hStopEvent); + + ThemeStopCallback(lpParameter, TimerOrWaitFired); +} + +static +VOID +CALLBACK +ThemeStartCallback(PVOID lpParameter, BOOLEAN TimerOrWaitFired) +{ + UnregisterWait(hThemeStartWaitObject); + + hServiceProcess = GetThemeServiceProcessHandle(); + + RegisterWaitForSingleObject(&hThemeStopWaitObject, hStopEvent, ThemeStopCallback, NULL, INFINITE, WT_EXECUTEDEFAULT); + RegisterWaitForSingleObject(&hThemeServiceWaitObject, hServiceProcess, ThemeServiceDiedCallback, NULL, INFINITE, WT_EXECUTEDEFAULT); + + ThemeHooksInstall(); +} + +BOOL +WINAPI +ThemeWatchForStart() +{ + hStartEvent = CreateEventW(NULL, TRUE, FALSE, L"Global\\ThemeStartEvent"); + hStopEvent = CreateEventW(NULL, TRUE, FALSE, L"Global\\ThemeStopEvent"); + + RegisterWaitForSingleObject(&hThemeStartWaitObject, hStartEvent, ThemeStartCallback, NULL, INFINITE, WT_EXECUTEDEFAULT); + + return TRUE; +} + +DWORD +WINAPI +ThemeWaitForServiceReady(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 */ diff --git a/reactos/base/services/thmsvc/thmsvc.c b/reactos/base/services/shsvcs/thmsvc.c similarity index 79% rename from reactos/base/services/thmsvc/thmsvc.c rename to reactos/base/services/shsvcs/thmsvc.c index 66a8ec6c8d2..ff71ee32e86 100644 --- a/reactos/base/services/thmsvc/thmsvc.c +++ b/reactos/base/services/shsvcs/thmsvc.c @@ -1,7 +1,7 @@ /* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel - * FILE: base/services/thmsvc/thmsvc.c + * FILE: base/services/shsvcs/thmsvc.c * PURPOSE: Themes service * PROGRAMMER: Giannis Adamopoulos */ @@ -9,22 +9,13 @@ /* INCLUDES *****************************************************************/ #include -#include -#include #include -WINE_DEFAULT_DEBUG_CHANNEL(thmsvc); - +WINE_DEFAULT_DEBUG_CHANNEL(shsvcs); /* GLOBALS ******************************************************************/ -static VOID CALLBACK ServiceMain(DWORD argc, LPWSTR *argv); static WCHAR ServiceName[] = L"Themes"; -static SERVICE_TABLE_ENTRYW ServiceTable[] = -{ - {ServiceName, ServiceMain}, - {NULL, NULL} -}; SERVICE_STATUS_HANDLE ServiceStatusHandle; SERVICE_STATUS ServiceStatus; @@ -32,6 +23,8 @@ SERVICE_STATUS ServiceStatus; /* FUNCTIONS *****************************************************************/ +HANDLE StartEvent, StopEvent; + static VOID UpdateServiceStatus(DWORD dwState) { @@ -74,7 +67,10 @@ ServiceControlHandler(DWORD dwControl, { case SERVICE_CONTROL_STOP: TRACE(" SERVICE_CONTROL_STOP received\n"); - ThemeHooksRemove(); + + /* Signal the theme server in winlogon to remove theme hooks */ + ResetEvent(StartEvent); + SetEvent(StopEvent); UpdateServiceStatus(SERVICE_STOPPED); return ERROR_SUCCESS; @@ -105,42 +101,30 @@ ServiceControlHandler(DWORD dwControl, } } - -static VOID CALLBACK -ServiceMain(DWORD argc, LPWSTR *argv) +VOID +WINAPI +ThemeServiceMain(DWORD argc, LPTSTR *argv) { UNREFERENCED_PARAMETER(argc); UNREFERENCED_PARAMETER(argv); - TRACE("ServiceMain() called\n"); - 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"); - TRACE("Calling SetServiceStatus()\n"); UpdateServiceStatus(SERVICE_RUNNING); - TRACE("SetServiceStatus() called\n"); - ThemeHooksInstall(); - - TRACE("ServiceMain() done\n"); -} - - -int -wmain(int argc, WCHAR *argv[]) -{ - UNREFERENCED_PARAMETER(argc); - UNREFERENCED_PARAMETER(argv); - - TRACE("thmsvc: main() started\n"); - - StartServiceCtrlDispatcher(ServiceTable); - - TRACE("thmsvc: main() done\n"); - - return 0; + /* Signal the theme server in winlogon to install theme hooks */ + ResetEvent(StopEvent); + SetEvent(StartEvent); } /* EOF */ diff --git a/reactos/base/services/thmsvc/CMakeLists.txt b/reactos/base/services/thmsvc/CMakeLists.txt deleted file mode 100644 index 6b6360405bc..00000000000 --- a/reactos/base/services/thmsvc/CMakeLists.txt +++ /dev/null @@ -1,6 +0,0 @@ - -add_executable(thmsvc thmsvc.c thmsvc.rc) -target_link_libraries(thmsvc wine) -set_module_type(thmsvc win32cui UNICODE) -add_importlibs(thmsvc uxtheme advapi32 msvcrt kernel32 ntdll) -add_cd_file(TARGET thmsvc DESTINATION reactos/system32 FOR all) diff --git a/reactos/base/services/thmsvc/thmsvc.rc b/reactos/base/services/thmsvc/thmsvc.rc deleted file mode 100644 index 49d935115b2..00000000000 --- a/reactos/base/services/thmsvc/thmsvc.rc +++ /dev/null @@ -1,4 +0,0 @@ -#define REACTOS_STR_FILE_DESCRIPTION "Themes-Service" -#define REACTOS_STR_INTERNAL_NAME "thmsvc" -#define REACTOS_STR_ORIGINAL_FILENAME "thmsvc.exe" -#include diff --git a/reactos/boot/bootdata/hivesft.inf b/reactos/boot/bootdata/hivesft.inf index 85f1a6e65ff..a2f770c0719 100644 --- a/reactos/boot/bootdata/hivesft.inf +++ b/reactos/boot/bootdata/hivesft.inf @@ -1651,7 +1651,7 @@ HKLM,"SOFTWARE\Microsoft\Ole","EnableRemoteConnect",0x00000000,"N" ; SvcHost services HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\SvcHost",,0x00000012 HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\SvcHost","DcomLaunch",0x00010000,"PlugPlay" -HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\SvcHost","netsvcs",0x00010000,"DHCP","BITS","lanmanserver","lanmanworkstation","Schedule","winmgmt" +HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\SvcHost","netsvcs",0x00010000,"DHCP","BITS","lanmanserver","lanmanworkstation","Schedule","Themes","winmgmt" ; Win32 config HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows",,0x00000012 diff --git a/reactos/boot/bootdata/hivesys.inf b/reactos/boot/bootdata/hivesys.inf index 9c198fe5c33..5fd95fbd6df 100644 --- a/reactos/boot/bootdata/hivesys.inf +++ b/reactos/boot/bootdata/hivesys.inf @@ -1982,10 +1982,12 @@ HKLM,"SYSTEM\CurrentControlSet\Services\Themes","FailureActions",0x00000003, \ 80,51,01,00,00,00,00,00,00,00,00,00,03,00,00,00,00,00,00,00, \ 01,00,00,00,60,ea,00,00,01,00,00,00,60,ea,00,00,00,00,00,00,00,00,00,00 HKLM,"SYSTEM\CurrentControlSet\Services\Themes","Group",0x00000000,"UIGroup" -HKLM,"SYSTEM\CurrentControlSet\Services\Themes","ImagePath",0x00020000,"%SystemRoot%\system32\thmsvc.exe" +HKLM,"SYSTEM\CurrentControlSet\Services\Themes","ImagePath",0x00020000,"%SystemRoot%\system32\svchost.exe -k netsvcs" HKLM,"SYSTEM\CurrentControlSet\Services\Themes","ObjectName",0x00000000,"LocalSystem" HKLM,"SYSTEM\CurrentControlSet\Services\Themes","Start",0x00010001,0x00000002 HKLM,"SYSTEM\CurrentControlSet\Services\Themes","Type",0x00010001,0x00000020 +HKLM,"SYSTEM\CurrentControlSet\Services\Themes\Parameters","ServiceDll",0x00020000,"%SystemRoot%\system32\shsvcs.dll" +HKLM,"SYSTEM\CurrentControlSet\Services\Themes\Parameters","ServiceMain",0x00000000,"ThemeServiceMain" ; ReactOS Installer Service HKLM,"SYSTEM\CurrentControlSet\Services\MSIServer","DependOnService",0x00010000,"RPCSS"