ReactOS 0.4.16-dev-2354-g16de117
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#define COBJMACROS
25#include "windef.h"
26#include "winbase.h"
27#include "winnt.h"
28#include "winsvc.h"
29#include "irot.h"
30#include "epm.h"
31#include "irpcss.h"
32#ifdef __REACTOS__
33#include <objbase.h>
34#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
35#endif
36
37#include "wine/debug.h"
38#include "wine/list.h"
39
41
42static WCHAR rpcssW[] = L"RpcSs";
45
47{
48 struct list entry;
50 unsigned int cookie;
51 PMInterfacePointer object;
52 unsigned int single_use : 1;
53};
54
55static CRITICAL_SECTION registered_classes_cs = { NULL, -1, 0, 0, 0, 0 };
57
59 PMInterfacePointer object, unsigned int *cookie)
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}
84
85static void scm_revoke_class(struct registered_class *_class)
86{
87 list_remove(&_class->entry);
88 free(_class->object);
89 free(_class);
90}
91
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}
111
113 PMInterfacePointer *object)
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}
143
145{
146 static LONG thread_seq_id;
147 *id = InterlockedIncrement(&thread_seq_id);
148 return S_OK;
149}
150
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}
210
211static DWORD WINAPI service_handler( DWORD ctrl, DWORD event_type, LPVOID event_data, LPVOID context )
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}
246
247#ifdef __REACTOS__
249#endif
250
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}
297
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 SERVICE_STATUS_HANDLE(WINAPI *pRegisterServiceCtrlHandlerExA)(LPCSTR
#define InterlockedIncrement
Definition: armddk.h:53
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define ARRAY_SIZE(A)
Definition: main.h:20
static void list_remove(struct list_entry *entry)
Definition: list.h:90
static void list_add_tail(struct list_entry *head, struct list_entry *entry)
Definition: list.h:83
VOID DoRpcSsSetupConfiguration(VOID)
Definition: setup.c:163
#define FIXME(fmt,...)
Definition: precomp.h:53
#define WARN(fmt,...)
Definition: precomp.h:61
Definition: list.h:37
#define NO_ERROR
Definition: dderror.h:5
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
void __RPC_FAR *__RPC_USER MIDL_user_allocate(SIZE_T len)
Definition: dhcpcsvc.c:26
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
MonoAssembly int argc
Definition: metahost.c:107
#define __cdecl
Definition: corecrt.h:121
_ACRTIMP int __cdecl memcmp(const void *, const void *, size_t)
Definition: string.c:2802
return ret
Definition: mutex.c:146
#define L(x)
Definition: resources.c:13
#define INFINITE
Definition: serial.h:102
unsigned long DWORD
Definition: ntddk_ex.h:95
FxCollectionEntry * cur
GLbitfield flags
Definition: glext.h:7161
GLfloat GLfloat GLfloat GLfloat h
Definition: glext.h:7723
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
#define S_OK
Definition: intsafe.h:52
uint32_t entry
Definition: isohybrid.c:63
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define ctrl
Definition: input.c:1756
#define argv
Definition: mplay32.c:18
const CLSID * clsid
Definition: msctf.cpp:50
@ REGCLS_MULTI_SEPARATE
Definition: objbase.h:397
@ REGCLS_MULTIPLEUSE
Definition: objbase.h:396
long LONG
Definition: pedump.c:60
#define SERVICE_STOPPED
Definition: winsvc.h:21
#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
int wmain()
#define calloc
Definition: rosglue.h:14
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
RPC_STATUS WINAPI RpcMgmtStopServerListening(RPC_BINDING_HANDLE Binding)
Definition: rpc_server.c:1596
#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
static DWORD WINAPI service_handler(DWORD ctrl, DWORD event_type, LPVOID event_data, LPVOID context)
Definition: rpcss_main.c:211
static CRITICAL_SECTION registered_classes_cs
Definition: rpcss_main.c:55
static RPC_STATUS RPCSS_Initialize(void)
Definition: rpcss_main.c:151
static void scm_revoke_class(struct registered_class *_class)
Definition: rpcss_main.c:85
static void WINAPI ServiceMain(DWORD argc, LPWSTR *argv)
Definition: rpcss_main.c:251
static WCHAR rpcssW[]
Definition: rpcss_main.c:42
static SERVICE_STATUS_HANDLE service_handle
Definition: rpcss_main.c:44
HRESULT __cdecl irpcss_get_thread_seq_id(handle_t h, DWORD *id)
Definition: rpcss_main.c:144
HRESULT __cdecl irpcss_get_class_object(handle_t h, const GUID *clsid, PMInterfacePointer *object)
Definition: rpcss_main.c:112
HRESULT __cdecl irpcss_server_register(handle_t h, const GUID *clsid, unsigned int flags, PMInterfacePointer object, unsigned int *cookie)
Definition: rpcss_main.c:58
static HANDLE exit_event
Definition: rpcss_main.c:43
HRESULT __cdecl irpcss_server_revoke(handle_t h, unsigned int cookie)
Definition: rpcss_main.c:92
static struct list registered_classes
Definition: rpcss_main.c:56
SERVICE_STATUS_HANDLE WINAPI RegisterServiceCtrlHandlerExW(LPCWSTR lpServiceName, LPHANDLER_FUNCTION_EX lpHandlerProc, LPVOID lpContext)
Definition: sctrl.c:831
BOOL WINAPI StartServiceCtrlDispatcherW(const SERVICE_TABLE_ENTRYW *lpServiceStartTable)
Definition: sctrl.c:1153
BOOL WINAPI SetServiceStatus(SERVICE_STATUS_HANDLE hServiceStatus, LPSERVICE_STATUS lpServiceStatus)
Definition: sctrl.c:1016
long RPC_STATUS
Definition: rpc.h:48
#define WINE_TRACE
Definition: debug.h:363
#define LIST_FOR_EACH_ENTRY(elem, list, type, field)
Definition: list.h:198
#define TRACE(s)
Definition: solgame.cpp:4
Definition: http.c:7252
Definition: cookie.c:34
Definition: nis.h:10
unsigned int single_use
Definition: rpcss_main.c:52
struct list entry
Definition: rpcss_main.c:48
PMInterfacePointer object
Definition: rpcss_main.c:51
unsigned int cookie
Definition: rpcss_main.c:50
Definition: ps.c:97
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
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
Definition: synch.c:669
#define LIST_INIT(head)
Definition: queue.h:197
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
#define WINAPI
Definition: msvc.h:6
#define E_NOINTERFACE
Definition: winerror.h:3479
#define SERVICE_WIN32
Definition: cmtypes.h:964
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184