ReactOS 0.4.16-dev-2354-g16de117
rpcss_main.c File Reference
#include <stdio.h>
#include <stdarg.h>
#include <limits.h>
#include <assert.h>
#include "windef.h"
#include "winbase.h"
#include "winnt.h"
#include "winsvc.h"
#include "irot.h"
#include "epm.h"
#include "irpcss.h"
#include "wine/debug.h"
#include "wine/list.h"
Include dependency graph for rpcss_main.c:

Go to the source code of this file.

Classes

struct  registered_class
 

Macros

#define COBJMACROS
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (ole)
 
HRESULT __cdecl irpcss_server_register (handle_t h, const GUID *clsid, unsigned int flags, PMInterfacePointer object, unsigned int *cookie)
 
static void scm_revoke_class (struct registered_class *_class)
 
HRESULT __cdecl irpcss_server_revoke (handle_t h, unsigned int cookie)
 
HRESULT __cdecl irpcss_get_class_object (handle_t h, const GUID *clsid, PMInterfacePointer *object)
 
HRESULT __cdecl irpcss_get_thread_seq_id (handle_t h, DWORD *id)
 
static RPC_STATUS RPCSS_Initialize (void)
 
static DWORD WINAPI service_handler (DWORD ctrl, DWORD event_type, LPVOID event_data, LPVOID context)
 
static void WINAPI ServiceMain (DWORD argc, LPWSTR *argv)
 
int __cdecl wmain (int argc, WCHAR *argv[])
 

Variables

static WCHAR rpcssW [] = L"RpcSs"
 
static HANDLE exit_event
 
static SERVICE_STATUS_HANDLE service_handle
 
static CRITICAL_SECTION registered_classes_cs = { NULL, -1, 0, 0, 0, 0 }
 
static struct list registered_classes = LIST_INIT(registered_classes)
 

Macro Definition Documentation

◆ COBJMACROS

#define COBJMACROS

Definition at line 24 of file rpcss_main.c.

Function Documentation

◆ irpcss_get_class_object()

HRESULT __cdecl irpcss_get_class_object ( handle_t  h,
const GUID clsid,
PMInterfacePointer *  object 
)

Definition at line 112 of file rpcss_main.c.

114{
115 struct registered_class *cur;
116
117 *object = NULL;
118
120
122 {
123 if (!memcmp(clsid, &cur->clsid, sizeof(*clsid)))
124 {
125 *object = MIDL_user_allocate(FIELD_OFFSET(MInterfacePointer, abData[cur->object->ulCntData]));
126 if (*object)
127 {
128 (*object)->ulCntData = cur->object->ulCntData;
129 memcpy((*object)->abData, cur->object->abData, cur->object->ulCntData);
130 }
131
132 if (cur->single_use)
134
135 break;
136 }
137 }
138
140
141 return *object ? S_OK : E_NOINTERFACE;
142}
void __RPC_FAR *__RPC_USER MIDL_user_allocate(SIZE_T len)
Definition: dhcpcsvc.c:26
#define NULL
Definition: types.h:112
_ACRTIMP int __cdecl memcmp(const void *, const void *, size_t)
Definition: string.c:2802
FxCollectionEntry * cur
#define S_OK
Definition: intsafe.h:52
uint32_t entry
Definition: isohybrid.c:63
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
const CLSID * clsid
Definition: msctf.cpp:50
static CRITICAL_SECTION registered_classes_cs
Definition: rpcss_main.c:55
static void scm_revoke_class(struct registered_class *_class)
Definition: rpcss_main.c:85
static struct list registered_classes
Definition: rpcss_main.c:56
#define LIST_FOR_EACH_ENTRY(elem, list, type, field)
Definition: list.h:198
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
#define E_NOINTERFACE
Definition: winerror.h:3479

Referenced by rpcss_get_class_object().

◆ irpcss_get_thread_seq_id()

HRESULT __cdecl irpcss_get_thread_seq_id ( handle_t  h,
DWORD id 
)

Definition at line 144 of file rpcss_main.c.

145{
146 static LONG thread_seq_id;
147 *id = InterlockedIncrement(&thread_seq_id);
148 return S_OK;
149}
#define InterlockedIncrement
Definition: armddk.h:53
long LONG
Definition: pedump.c:60

Referenced by rpcss_get_next_seqid().

◆ irpcss_server_register()

HRESULT __cdecl irpcss_server_register ( handle_t  h,
const GUID clsid,
unsigned int  flags,
PMInterfacePointer  object,
unsigned int cookie 
)

Definition at line 58 of file rpcss_main.c.

60{
61 struct registered_class *entry;
62 static LONG next_cookie;
63
64 if (!(entry = calloc(1, sizeof(*entry))))
65 return E_OUTOFMEMORY;
66
67 entry->clsid = *clsid;
69 if (!(entry->object = malloc(FIELD_OFFSET(MInterfacePointer, abData[object->ulCntData]))))
70 {
71 free(entry);
72 return E_OUTOFMEMORY;
73 }
74 entry->object->ulCntData = object->ulCntData;
75 memcpy(&entry->object->abData, object->abData, object->ulCntData);
76 *cookie = entry->cookie = InterlockedIncrement(&next_cookie);
77
81
82 return S_OK;
83}
static void list_add_tail(struct list_entry *head, struct list_entry *entry)
Definition: list.h:83
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
GLbitfield flags
Definition: glext.h:7161
@ REGCLS_MULTI_SEPARATE
Definition: objbase.h:397
@ REGCLS_MULTIPLEUSE
Definition: objbase.h:396
#define calloc
Definition: rosglue.h:14
Definition: cookie.c:34

Referenced by rpcss_server_register().

◆ irpcss_server_revoke()

HRESULT __cdecl irpcss_server_revoke ( handle_t  h,
unsigned int  cookie 
)

Definition at line 92 of file rpcss_main.c.

93{
94 struct registered_class *cur;
95
97
99 {
100 if (cur->cookie == cookie)
101 {
103 break;
104 }
105 }
106
108
109 return S_OK;
110}

Referenced by rpc_revoke_local_server().

◆ RPCSS_Initialize()

static RPC_STATUS RPCSS_Initialize ( void  )
static

Definition at line 151 of file rpcss_main.c.

152{
153 static unsigned short irot_protseq[] = IROT_PROTSEQ;
154 static unsigned short irot_endpoint[] = IROT_ENDPOINT;
155 static unsigned short epm_protseq[] = L"ncacn_np";
156 static unsigned short epm_endpoint[] = L"\\pipe\\epmapper";
157 static unsigned short epm_protseq_lrpc[] = L"ncalrpc";
158 static unsigned short epm_endpoint_lrpc[] = L"epmapper";
159 static unsigned short irpcss_protseq[] = IRPCSS_PROTSEQ;
160 static unsigned short irpcss_endpoint[] = IRPCSS_ENDPOINT;
161 static const struct protseq_map
162 {
163 unsigned short *protseq;
164 unsigned short *endpoint;
165 } protseqs[] =
166 {
167 { epm_protseq, epm_endpoint },
168 { epm_protseq_lrpc, epm_endpoint_lrpc },
169 { irot_protseq, irot_endpoint },
170 { irpcss_protseq, irpcss_endpoint },
171 };
172 RPC_IF_HANDLE ifspecs[] =
173 {
174 epm_v3_0_s_ifspec,
175 Irot_v0_2_s_ifspec,
176 Irpcss_v0_0_s_ifspec,
177 };
179 int i, j;
180
181 WINE_TRACE("\n");
182
183 for (i = 0, j = 0; i < ARRAY_SIZE(ifspecs); ++i, j = i)
184 {
185 status = RpcServerRegisterIf(ifspecs[i], NULL, NULL);
186 if (status != RPC_S_OK)
187 goto fail;
188 }
189
190 for (i = 0; i < ARRAY_SIZE(protseqs); ++i)
191 {
194 if (status != RPC_S_OK)
195 goto fail;
196 }
197
199 if (status != RPC_S_OK)
200 goto fail;
201
202 return RPC_S_OK;
203
204fail:
205 for (i = 0; i < j; ++i)
206 RpcServerUnregisterIf(ifspecs[i], NULL, FALSE);
207
208 return status;
209}
#define ARRAY_SIZE(A)
Definition: main.h:20
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define L(x)
Definition: resources.c:13
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
RPC_STATUS WINAPI RpcServerListen(UINT MinimumCallThreads, UINT MaxCalls, UINT DontWait)
Definition: rpc_server.c:1520
RPC_STATUS WINAPI RpcServerRegisterIf(RPC_IF_HANDLE IfSpec, UUID *MgrTypeUuid, RPC_MGR_EPV *MgrEpv)
Definition: rpc_server.c:1116
RPC_STATUS WINAPI RpcServerUseProtseqEpW(RPC_WSTR Protseq, UINT MaxCalls, RPC_WSTR Endpoint, LPVOID SecurityDescriptor)
Definition: rpc_server.c:927
static struct list protseqs
Definition: rpc_server.c:69
RPC_STATUS WINAPI RpcServerUnregisterIf(RPC_IF_HANDLE IfSpec, UUID *MgrTypeUuid, UINT WaitForCallsToComplete)
Definition: rpc_server.c:1202
#define RPC_C_LISTEN_MAX_CALLS_DEFAULT
Definition: rpcdce.h:122
#define RPC_C_PROTSEQ_MAX_REQS_DEFAULT
Definition: rpcdce.h:123
#define RPC_S_OK
Definition: rpcnterr.h:22
long RPC_STATUS
Definition: rpc.h:48
#define WINE_TRACE
Definition: debug.h:363
Definition: nis.h:10
Definition: ps.c:97

Referenced by ServiceMain().

◆ scm_revoke_class()

static void scm_revoke_class ( struct registered_class _class)
static

Definition at line 85 of file rpcss_main.c.

86{
87 list_remove(&_class->entry);
88 free(_class->object);
89 free(_class);
90}
static void list_remove(struct list_entry *entry)
Definition: list.h:90
struct list entry
Definition: rpcss_main.c:48
PMInterfacePointer object
Definition: rpcss_main.c:51

Referenced by irpcss_get_class_object(), and irpcss_server_revoke().

◆ service_handler()

static DWORD WINAPI service_handler ( DWORD  ctrl,
DWORD  event_type,
LPVOID  event_data,
LPVOID  context 
)
static

Definition at line 211 of file rpcss_main.c.

212{
214
215 status.dwServiceType = SERVICE_WIN32;
216#ifdef __REACTOS__
217 status.dwControlsAccepted = 0;
218#else
219 status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
220#endif
221 status.dwWin32ExitCode = 0;
222 status.dwServiceSpecificExitCode = 0;
223 status.dwCheckPoint = 0;
224 status.dwWaitHint = 0;
225
226 switch (ctrl)
227 {
230 TRACE( "shutting down\n" );
232 RpcServerUnregisterIf( epm_v3_0_s_ifspec, NULL, TRUE );
233 RpcServerUnregisterIf( Irot_v0_2_s_ifspec, NULL, TRUE );
234 status.dwCurrentState = SERVICE_STOP_PENDING;
235 status.dwControlsAccepted = 0;
238 return NO_ERROR;
239 default:
240 FIXME( "got service ctrl %lx\n", ctrl );
241 status.dwCurrentState = SERVICE_RUNNING;
243 return NO_ERROR;
244 }
245}
#define FIXME(fmt,...)
Definition: precomp.h:53
#define NO_ERROR
Definition: dderror.h:5
#define ctrl
Definition: input.c:1756
#define SERVICE_ACCEPT_STOP
Definition: winsvc.h:28
#define SERVICE_STOP_PENDING
Definition: winsvc.h:23
#define SERVICE_CONTROL_SHUTDOWN
Definition: winsvc.h:46
#define SERVICE_RUNNING
Definition: winsvc.h:24
#define SERVICE_CONTROL_STOP
Definition: winsvc.h:42
RPC_STATUS WINAPI RpcMgmtStopServerListening(RPC_BINDING_HANDLE Binding)
Definition: rpc_server.c:1596
static SERVICE_STATUS_HANDLE service_handle
Definition: rpcss_main.c:44
static HANDLE exit_event
Definition: rpcss_main.c:43
BOOL WINAPI SetServiceStatus(SERVICE_STATUS_HANDLE hServiceStatus, LPSERVICE_STATUS lpServiceStatus)
Definition: sctrl.c:1016
#define TRACE(s)
Definition: solgame.cpp:4
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
Definition: synch.c:669
#define SERVICE_WIN32
Definition: cmtypes.h:964

Referenced by ServiceMain().

◆ ServiceMain()

static void WINAPI ServiceMain ( DWORD  argc,
LPWSTR argv 
)
static

Definition at line 251 of file rpcss_main.c.

252{
255
256 TRACE( "starting service\n" );
257
258 if ((ret = RPCSS_Initialize()))
259 {
260 WARN("Failed to initialize rpc interfaces, status %ld.\n", ret);
261 return;
262 }
263
265
267 if (!service_handle) return;
268
269 status.dwServiceType = SERVICE_WIN32;
270 status.dwCurrentState = SERVICE_RUNNING;
271#ifdef __REACTOS__
272 status.dwControlsAccepted = 0;
273#else
274 status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
275#endif
276 status.dwWin32ExitCode = 0;
277 status.dwServiceSpecificExitCode = 0;
278 status.dwCheckPoint = 0;
279#ifdef __REACTOS__
280 status.dwWaitHint = 0;
281#else
282 status.dwWaitHint = 10000;
283#endif
285
286#ifdef __REACTOS__
288#endif
289
291
292 status.dwCurrentState = SERVICE_STOPPED;
293 status.dwControlsAccepted = 0;
295 TRACE( "service stopped\n" );
296}
VOID DoRpcSsSetupConfiguration(VOID)
Definition: setup.c:163
#define WARN(fmt,...)
Definition: precomp.h:61
return ret
Definition: mutex.c:146
#define INFINITE
Definition: serial.h:102
#define SERVICE_STOPPED
Definition: winsvc.h:21
static DWORD WINAPI service_handler(DWORD ctrl, DWORD event_type, LPVOID event_data, LPVOID context)
Definition: rpcss_main.c:211
static RPC_STATUS RPCSS_Initialize(void)
Definition: rpcss_main.c:151
static WCHAR rpcssW[]
Definition: rpcss_main.c:42
SERVICE_STATUS_HANDLE WINAPI RegisterServiceCtrlHandlerExW(LPCWSTR lpServiceName, LPHANDLER_FUNCTION_EX lpHandlerProc, LPVOID lpContext)
Definition: sctrl.c:831
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
Definition: synch.c:82
HANDLE WINAPI DECLSPEC_HOTPATCH CreateEventW(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL, IN BOOL bManualReset, IN BOOL bInitialState, IN LPCWSTR lpName OPTIONAL)
Definition: synch.c:587

Referenced by wmain().

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( ole  )

◆ wmain()

int __cdecl wmain ( int  argc,
WCHAR argv[] 
)

Definition at line 298 of file rpcss_main.c.

299{
300 static const SERVICE_TABLE_ENTRYW service_table[] =
301 {
302 { rpcssW, ServiceMain },
303 { NULL, NULL }
304 };
305
306 StartServiceCtrlDispatcherW( service_table );
307 return 0;
308}
static void WINAPI ServiceMain(DWORD argc, LPWSTR *argv)
Definition: rpcss_main.c:251
BOOL WINAPI StartServiceCtrlDispatcherW(const SERVICE_TABLE_ENTRYW *lpServiceStartTable)
Definition: sctrl.c:1153

Variable Documentation

◆ exit_event

HANDLE exit_event
static

Definition at line 43 of file rpcss_main.c.

Referenced by at_exit_func1(), service_handler(), ServiceMain(), test_exit(), and test_quick_exit().

◆ registered_classes

struct list registered_classes = LIST_INIT(registered_classes)
static

◆ registered_classes_cs

CRITICAL_SECTION registered_classes_cs = { NULL, -1, 0, 0, 0, 0 }
static

◆ rpcssW

WCHAR rpcssW[] = L"RpcSs"
static

Definition at line 42 of file rpcss_main.c.

Referenced by ServiceMain(), and wmain().

◆ service_handle