mirror of
https://github.com/ApfelTeeSaft/reactos.git
synced 2026-09-03 04:13:31 +00:00
Convert rpcss back to a service
svn path=/trunk/; revision=37241
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0"?>
|
||||
<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
|
||||
<module name="rpcss" type="win32cui" installbase="system32" installname="rpcss.exe">
|
||||
<module name="rpcss" type="win32cui" installbase="system32" installname="rpcss.exe" unicode="yes">
|
||||
<include base="rpcss">.</include>
|
||||
<include base="rpcss" root="intermediate">.</include>
|
||||
<library>wine</library>
|
||||
@@ -9,9 +9,10 @@
|
||||
<library>rpcrt4</library>
|
||||
<library>kernel32</library>
|
||||
<library>advapi32</library>
|
||||
<file>rpcss_main.c</file>
|
||||
<file>epmp.c</file>
|
||||
<file>irotp.c</file>
|
||||
<file>rpcss_main.c</file>
|
||||
<file>service_main.c</file>
|
||||
<file>epm.idl</file>
|
||||
<file>irot.idl</file>
|
||||
<file>rpcss.rc</file>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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 <[email protected]>
|
||||
*
|
||||
*/
|
||||
|
||||
#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);
|
||||
}
|
||||
Reference in New Issue
Block a user