[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
This commit is contained in:
Giannis Adamopoulos 2017-04-07 13:01:42 +00:00
parent 3fb8c7bc13
commit afd47c09cf
11 changed files with 300 additions and 51 deletions

View file

@ -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)

View file

@ -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)

View file

@ -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 <windows.h>
#include <wine/debug.h>
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;
}

View file

@ -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 <reactos/version.rc>

View file

@ -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

View file

@ -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 <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();
/* 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 */

View file

@ -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 <windows.h>
#include <uxtheme.h>
#include <uxundoc.h>
#include <wine/debug.h>
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 */

View file

@ -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)

View file

@ -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 <reactos/version.rc>

View file

@ -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

View file

@ -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"