diff --git a/reactos/base/services/rpcss/rpcss.rbuild b/reactos/base/services/rpcss/rpcss.rbuild index 46fbab8cc77..62b6668af74 100644 --- a/reactos/base/services/rpcss/rpcss.rbuild +++ b/reactos/base/services/rpcss/rpcss.rbuild @@ -1,6 +1,6 @@ - + . . wine @@ -9,9 +9,10 @@ rpcrt4 kernel32 advapi32 - rpcss_main.c epmp.c irotp.c + rpcss_main.c + service_main.c epm.idl irot.idl rpcss.rc diff --git a/reactos/base/services/rpcss/rpcss_main.c b/reactos/base/services/rpcss/rpcss_main.c index 813aa07d13e..2df13c7cea1 100644 --- a/reactos/base/services/rpcss/rpcss_main.c +++ b/reactos/base/services/rpcss/rpcss_main.c @@ -62,7 +62,7 @@ static HANDLE exit_event; //extern HANDLE __wine_make_process_system(void); -static BOOL RPCSS_Initialize(void) +BOOL RPCSS_Initialize(void) { static unsigned short irot_protseq[] = IROT_PROTSEQ; static unsigned short irot_endpoint[] = IROT_ENDPOINT; @@ -116,7 +116,7 @@ fail: /* returns false if we discover at the last moment that we aren't ready to terminate */ -static BOOL RPCSS_Shutdown(void) +BOOL RPCSS_Shutdown(void) { RpcMgmtStopServerListening(NULL); RpcServerUnregisterIf(epm_v3_0_s_ifspec, NULL, TRUE); @@ -127,6 +127,7 @@ static BOOL RPCSS_Shutdown(void) return TRUE; } +#if 0 int main( int argc, char **argv ) { /* @@ -142,3 +143,4 @@ int main( int argc, char **argv ) return 0; } +#endif diff --git a/reactos/base/services/rpcss/rpcss_ros.diff b/reactos/base/services/rpcss/rpcss_ros.diff new file mode 100644 index 00000000000..7d7ad9a42c6 --- /dev/null +++ b/reactos/base/services/rpcss/rpcss_ros.diff @@ -0,0 +1,35 @@ +Index: rpcss_main.c +=================================================================== +--- rpcss_main.c (revision 37240) ++++ rpcss_main.c (working copy) +@@ -62,7 +62,7 @@ + + //extern HANDLE __wine_make_process_system(void); + +-static BOOL RPCSS_Initialize(void) ++BOOL RPCSS_Initialize(void) + { + static unsigned short irot_protseq[] = IROT_PROTSEQ; + static unsigned short irot_endpoint[] = IROT_ENDPOINT; +@@ -116,7 +116,7 @@ + + /* returns false if we discover at the last moment that we + aren't ready to terminate */ +-static BOOL RPCSS_Shutdown(void) ++BOOL RPCSS_Shutdown(void) + { + RpcMgmtStopServerListening(NULL); + RpcServerUnregisterIf(epm_v3_0_s_ifspec, NULL, TRUE); +@@ -127,6 +127,7 @@ + return TRUE; + } + ++#if 0 + int main( int argc, char **argv ) + { + /* +@@ -142,3 +143,4 @@ + + return 0; + } ++#endif diff --git a/reactos/base/services/rpcss/service_main.c b/reactos/base/services/rpcss/service_main.c new file mode 100644 index 00000000000..22f1cf1dbf3 --- /dev/null +++ b/reactos/base/services/rpcss/service_main.c @@ -0,0 +1,128 @@ +/* + * PROJECT: ReactOS Remote Procedure Call service + * LICENSE: GPL - See COPYING in the top level directory + * FILE: /base/services/rpcss/service_main.c + * PURPOSE: Service control code + * COPYRIGHT: Copyright 2008 Ged Murphy + * + */ + +#include "rpcss.h" + +BOOL RPCSS_Initialize(void); +BOOL RPCSS_Shutdown(void); + +static WCHAR ServiceName[] = L"RpcSs"; + +typedef struct _ServiceInfo +{ + SERVICE_STATUS servStatus; + SERVICE_STATUS_HANDLE hStatus; +} SERVICEINFO, *PSERVICEINFO; + + +static VOID +UpdateStatus(PSERVICEINFO pServInfo, + DWORD NewStatus, + DWORD Check) +{ + if (Check > 0) + { + pServInfo->servStatus.dwCheckPoint += Check; + } + else + { + pServInfo->servStatus.dwCheckPoint = Check; + } + + if (NewStatus > 0) + { + pServInfo->servStatus.dwCurrentState = NewStatus; + } + + SetServiceStatus(pServInfo->hStatus, &pServInfo->servStatus); +} + + +static BOOL +RunService(PSERVICEINFO pServInfo) +{ + return RPCSS_Initialize(); +} + +VOID WINAPI +ServerCtrlHandler(DWORD dwControl, + DWORD dwEventType, + LPVOID lpEventData, + LPVOID lpContext) +{ + PSERVICEINFO pServInfo = (PSERVICEINFO)lpContext; + + switch (dwControl) + { + case SERVICE_CONTROL_SHUTDOWN: + case SERVICE_CONTROL_STOP: + RPCSS_Shutdown(); + pServInfo->servStatus.dwWin32ExitCode = 0; + pServInfo->servStatus.dwWaitHint = 0; + UpdateStatus(pServInfo, SERVICE_STOP_PENDING, 1); + break; + + default: + break; + } +} + +VOID WINAPI +ServiceMain(DWORD argc, LPWSTR argv[]) +{ + SERVICEINFO servInfo; + HANDLE hThread; + DWORD dwThreadId; + + servInfo.servStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS; + servInfo.servStatus.dwCurrentState = SERVICE_STOPPED; + servInfo.servStatus.dwControlsAccepted = SERVICE_ACCEPT_SHUTDOWN; + servInfo.servStatus.dwWin32ExitCode = ERROR_SERVICE_SPECIFIC_ERROR; + servInfo.servStatus.dwServiceSpecificExitCode = 0; + servInfo.servStatus.dwCheckPoint = 0; + servInfo.servStatus.dwWaitHint = 1000; + + servInfo.hStatus = RegisterServiceCtrlHandlerExW(ServiceName, + (LPHANDLER_FUNCTION_EX)ServerCtrlHandler, + &servInfo); + if (!servInfo.hStatus) return; + + UpdateStatus(&servInfo, SERVICE_START_PENDING, 1); + + /* Create worker thread */ + hThread = CreateThread(NULL, + 0, + (LPTHREAD_START_ROUTINE)RunService, + &servInfo, + 0, + &dwThreadId); + if (!hThread) return; + + /* Set service status to running */ + UpdateStatus(&servInfo, SERVICE_RUNNING, 0); + + /* Wait until thread has terminated */ + WaitForSingleObject(hThread, INFINITE); + + CloseHandle(hThread); + + UpdateStatus(&servInfo, SERVICE_STOPPED, 0); +} + + +int wmain(int argc, LPWSTR argv []) +{ + SERVICE_TABLE_ENTRYW ServiceTable[] = + { + {ServiceName, ServiceMain}, + {NULL, NULL } + }; + + return (int)(StartServiceCtrlDispatcherW(ServiceTable) != 0); +}