ReactOS  0.4.12-dev-14-gd0c8636
rpcss_main.c
Go to the documentation of this file.
1 /*
2  * Copyright 2001, Ove K√•ven, TransGaming Technologies Inc.
3  * Copyright 2002 Greg Turner
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2.1 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
18  */
19 
20 #include <stdio.h>
21 #include <stdarg.h>
22 #include <limits.h>
23 #include <assert.h>
24 
25 #include "windef.h"
26 #include "winbase.h"
27 #include "winnt.h"
28 #include "winsvc.h"
29 #include "irot_s.h"
30 #include "epm_s.h"
31 
32 #include "wine/debug.h"
33 
35 
36 static WCHAR rpcssW[] = {'R','p','c','S','s',0};
39 
40 static BOOL RPCSS_Initialize(void)
41 {
42  static unsigned short irot_protseq[] = IROT_PROTSEQ;
43  static unsigned short irot_endpoint[] = IROT_ENDPOINT;
44  static unsigned short epm_protseq[] = {'n','c','a','c','n','_','n','p',0};
45  static unsigned short epm_endpoint[] = {'\\','p','i','p','e','\\','e','p','m','a','p','p','e','r',0};
46  static unsigned short epm_protseq_lrpc[] = {'n','c','a','l','r','p','c',0};
47  static unsigned short epm_endpoint_lrpc[] = {'e','p','m','a','p','p','e','r',0};
49 
50  WINE_TRACE("\n");
51 
52  status = RpcServerRegisterIf(epm_v3_0_s_ifspec, NULL, NULL);
53  if (status != RPC_S_OK)
54  return status;
55  status = RpcServerRegisterIf(Irot_v0_2_s_ifspec, NULL, NULL);
56  if (status != RPC_S_OK)
57  {
58  RpcServerUnregisterIf(epm_v3_0_s_ifspec, NULL, FALSE);
59  return FALSE;
60  }
61 
63  epm_endpoint, NULL);
64  if (status != RPC_S_OK)
65  goto fail;
66 
67  status = RpcServerUseProtseqEpW(epm_protseq_lrpc, RPC_C_PROTSEQ_MAX_REQS_DEFAULT,
68  epm_endpoint_lrpc, NULL);
69  if (status != RPC_S_OK)
70  goto fail;
71 
73  irot_endpoint, NULL);
74  if (status != RPC_S_OK)
75  goto fail;
76 
78  if (status != RPC_S_OK)
79  goto fail;
80 
81  return TRUE;
82 
83 fail:
84  RpcServerUnregisterIf(epm_v3_0_s_ifspec, NULL, FALSE);
85  RpcServerUnregisterIf(Irot_v0_2_s_ifspec, NULL, FALSE);
86  return FALSE;
87 }
88 
89 static DWORD WINAPI service_handler( DWORD ctrl, DWORD event_type, LPVOID event_data, LPVOID context )
90 {
92 
95  status.dwWin32ExitCode = 0;
96  status.dwServiceSpecificExitCode = 0;
97  status.dwCheckPoint = 0;
98  status.dwWaitHint = 0;
99 
100  switch (ctrl)
101  {
104  TRACE( "shutting down\n" );
106  RpcServerUnregisterIf( epm_v3_0_s_ifspec, NULL, TRUE );
107  RpcServerUnregisterIf( Irot_v0_2_s_ifspec, NULL, TRUE );
109  status.dwControlsAccepted = 0;
110  SetServiceStatus( service_handle, &status );
111  SetEvent( exit_event );
112  return NO_ERROR;
113  default:
114  FIXME( "got service ctrl %x\n", ctrl );
116  SetServiceStatus( service_handle, &status );
117  return NO_ERROR;
118  }
119 }
120 
121 #ifdef __REACTOS__
123 #endif
124 
126 {
128 
129  TRACE( "starting service\n" );
130 
131  if (!RPCSS_Initialize()) return;
132 
133  exit_event = CreateEventW( NULL, TRUE, FALSE, NULL );
134 
136  if (!service_handle) return;
137 
138  status.dwServiceType = SERVICE_WIN32;
141  status.dwWin32ExitCode = 0;
142  status.dwServiceSpecificExitCode = 0;
143  status.dwCheckPoint = 0;
144  status.dwWaitHint = 10000;
145  SetServiceStatus( service_handle, &status );
146 
147 #ifdef __REACTOS__
149 #endif
150 
151  WaitForSingleObject( exit_event, INFINITE );
152 
154  status.dwControlsAccepted = 0;
155  SetServiceStatus( service_handle, &status );
156  TRACE( "service stopped\n" );
157 }
158 
159 int wmain( int argc, WCHAR *argv[] )
160 {
161  static const SERVICE_TABLE_ENTRYW service_table[] =
162  {
163  { rpcssW, ServiceMain },
164  { NULL, NULL }
165  };
166 
167  StartServiceCtrlDispatcherW( service_table );
168  return 0;
169 }
static int argc
Definition: ServiceArgs.c:12
#define TRUE
Definition: types.h:120
RPC_STATUS WINAPI RpcMgmtStopServerListening(RPC_BINDING_HANDLE Binding)
Definition: rpc_server.c:1599
DWORD dwCurrentState
Definition: winsvc.h:100
Definition: http.c:6587
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define SERVICE_ACCEPT_STOP
Definition: winsvc.h:28
static WCHAR rpcssW[]
Definition: rpcss_main.c:36
#define WINE_TRACE
Definition: debug.h:358
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
Definition: synch.c:679
DWORD dwServiceSpecificExitCode
Definition: winsvc.h:103
static SERVICE_STATUS_HANDLE service_handle
Definition: rpcss_main.c:38
#define NO_ERROR
Definition: dderror.h:5
BOOL WINAPI StartServiceCtrlDispatcherW(const SERVICE_TABLE_ENTRYW *lpServiceStartTable)
Definition: sctrl.c:1094
RPC_STATUS WINAPI RpcServerUnregisterIf(RPC_IF_HANDLE IfSpec, UUID *MgrTypeUuid, UINT WaitForCallsToComplete)
Definition: rpc_server.c:1209
static char ** argv
Definition: ServiceArgs.c:11
HANDLE WINAPI DECLSPEC_HOTPATCH CreateEventW(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL, IN BOOL bManualReset, IN BOOL bInitialState, IN LPCWSTR lpName OPTIONAL)
Definition: synch.c:597
BOOL WINAPI SetServiceStatus(SERVICE_STATUS_HANDLE hServiceStatus, LPSERVICE_STATUS lpServiceStatus)
Definition: sctrl.c:957
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
Definition: synch.c:82
long RPC_STATUS
Definition: rpc.h:52
DWORD dwCheckPoint
Definition: winsvc.h:104
#define SERVICE_STOPPED
Definition: winsvc.h:21
RPC_STATUS WINAPI RpcServerListen(UINT MinimumCallThreads, UINT MaxCalls, UINT DontWait)
Definition: rpc_server.c:1527
#define SERVICE_RUNNING
Definition: winsvc.h:24
#define FIXME(fmt,...)
Definition: debug.h:110
static HANDLE exit_event
Definition: rpcss_main.c:37
#define RPC_C_LISTEN_MAX_CALLS_DEFAULT
Definition: rpcdce.h:122
static void WINAPI ServiceMain(DWORD argc, LPWSTR *argv)
Definition: rpcss_main.c:125
smooth NULL
Definition: ftsmooth.c:416
int wmain(int argc, WCHAR *argv[])
Definition: rpcss_main.c:159
#define ctrl
Definition: input.c:1669
VOID DoRpcSsSetupConfiguration(VOID)
Definition: setup.c:163
static SERVICE_STATUS_HANDLE(WINAPI *pRegisterServiceCtrlHandlerExA)(LPCSTR
#define SERVICE_ACCEPT_SHUTDOWN
Definition: winsvc.h:30
#define TRACE(s)
Definition: solgame.cpp:4
unsigned int BOOL
Definition: ntddk_ex.h:94
DWORD dwWaitHint
Definition: winsvc.h:105
DWORD dwWin32ExitCode
Definition: winsvc.h:102
unsigned long DWORD
Definition: ntddk_ex.h:95
RPC_STATUS WINAPI RpcServerRegisterIf(RPC_IF_HANDLE IfSpec, UUID *MgrTypeUuid, RPC_MGR_EPV *MgrEpv)
Definition: rpc_server.c:1123
DWORD dwServiceType
Definition: winsvc.h:99
static DWORD WINAPI service_handler(DWORD ctrl, DWORD event_type, LPVOID event_data, LPVOID context)
Definition: rpcss_main.c:89
SERVICE_STATUS_HANDLE WINAPI RegisterServiceCtrlHandlerExW(LPCWSTR lpServiceName, LPHANDLER_FUNCTION_EX lpHandlerProc, LPVOID lpContext)
Definition: sctrl.c:773
#define WINAPI
Definition: msvc.h:20
RPC_STATUS WINAPI RpcServerUseProtseqEpW(RPC_WSTR Protseq, UINT MaxCalls, RPC_WSTR Endpoint, LPVOID SecurityDescriptor)
Definition: rpc_server.c:934
DWORD dwControlsAccepted
Definition: winsvc.h:101
#define SERVICE_WIN32
Definition: cmtypes.h:962
#define RPC_C_PROTSEQ_MAX_REQS_DEFAULT
Definition: rpcdce.h:123
static BOOL RPCSS_Initialize(void)
Definition: rpcss_main.c:40
WINE_DEFAULT_DEBUG_CHANNEL(ole)
#define SERVICE_CONTROL_STOP
Definition: winsvc.h:36
WCHAR * LPWSTR
Definition: xmlstorage.h:184
#define INFINITE
Definition: serial.h:102
static SERVICE_STATUS status
Definition: service.c:31
#define SERVICE_STOP_PENDING
Definition: winsvc.h:23
#define RPC_S_OK
Definition: rpcnterr.h:22
#define SERVICE_CONTROL_SHUTDOWN
Definition: winsvc.h:40