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"