24 #include "wine/port.h" 30 #define NONAMELESSUNION 42 #include "wine/unicode.h" 63 0, 0, { (
DWORD_PTR)(__FILE__
": dcom registered server interfaces") }
73 0, 0, { (
DWORD_PTR)(__FILE__
": channel hooks") }
91 static const WCHAR wszEndpointFormat[] = {
'\\',
'p',
'i',
'p',
'e',
'\\',
'O',
'L',
'E',
'_',
'%',
'0',
'8',
'l',
'x',
'%',
'0',
'8',
'l',
'x',0};
162 unsigned char extensions[1];
168 unsigned char extensions[1];
186 ORPC_EXTENT_ARRAY *orpc_ext_array,
WIRE_ORPC_EXTENT **first_wire_orpc_extent);
192 ULONG *extension_count)
195 ULONG total_size = 0;
196 unsigned int hook_index = 0;
199 *extension_count = 0;
213 ULONG extension_size = 0;
215 IChannelHook_ClientGetSize(
entry->hook, &
entry->id, &
info->iid, &extension_size);
219 extension_size = (extension_size+7)&~7;
220 (*data)[hook_index].id =
entry->id;
221 (*data)[hook_index].extension_size = extension_size;
227 (*extension_count)++;
240 unsigned int hook_count)
249 ULONG extension_size = 0;
252 for (
i = 0;
i < hook_count;
i++)
254 extension_size =
data[
i].extension_size;
260 IChannelHook_ClientFillBuffer(
entry->hook, &
entry->id, &
info->iid,
267 wire_orpc_extent->
conformance = (extension_size+7)&~7;
268 wire_orpc_extent->
size = extension_size;
269 wire_orpc_extent->
id =
entry->id;
280 ULONG extension_count)
290 for (
i = 0, wire_orpc_extent = first_wire_orpc_extent;
297 if (
i == extension_count) wire_orpc_extent =
NULL;
300 wire_orpc_extent ? wire_orpc_extent->size : 0,
301 wire_orpc_extent ? wire_orpc_extent->data :
NULL,
310 ULONG *extension_count)
313 ULONG total_size = 0;
314 unsigned int hook_index = 0;
317 *extension_count = 0;
331 ULONG extension_size = 0;
338 extension_size = (extension_size+7)&~7;
339 (*data)[hook_index].id =
entry->id;
340 (*data)[hook_index].extension_size = extension_size;
346 (*extension_count)++;
359 unsigned int hook_count)
368 ULONG extension_size = 0;
371 for (
i = 0;
i < hook_count;
i++)
373 extension_size =
data[
i].extension_size;
379 IChannelHook_ServerFillBuffer(
entry->hook, &
entry->id, &
info->iid,
387 wire_orpc_extent->
conformance = (extension_size+7)&~7;
388 wire_orpc_extent->
size = extension_size;
389 wire_orpc_extent->
id =
entry->id;
410 for (
i = 0, wire_orpc_extent = first_wire_orpc_extent;
417 if (
i == extension_count) wire_orpc_extent =
NULL;
420 wire_orpc_extent ? wire_orpc_extent->size : 0,
421 wire_orpc_extent ? wire_orpc_extent->data :
NULL,
440 IChannelHook_AddRef(
hook);
470 IRpcChannelBuffer_AddRef(iface);
517 ULONG extensions_size;
519 unsigned int channel_hook_count;
520 ULONG extension_count;
530 &channel_hook_data, &channel_hook_count, &extension_count);
536 if (extension_count & 1)
554 orpcthat =
msg->Buffer;
557 orpcthat->flags = ORPCF_NULL ;
560 *(
DWORD *)
msg->Buffer = extensions_size ? 1 : 0;
566 orpc_extent_array->
size = extension_count;
573 *(
DWORD *)
msg->Buffer = (extension_count + 1) & ~1;
577 msg->Buffer, channel_hook_data, channel_hook_count);
581 if (extension_count & 1)
586 wire_orpc_extent->
size = 0;
631 ULONG extensions_size;
633 unsigned int channel_hook_count;
634 ULONG extension_count;
659 msg->RpcInterfaceInformation = cif;
675 &channel_hook_data, &channel_hook_count, &extension_count);
681 if (extension_count & 1)
734 orpcthis =
msg->Buffer;
737 orpcthis->version.MajorVersion = COM_MAJOR_VERSION;
738 orpcthis->version.MinorVersion = COM_MINOR_VERSION;
740 orpcthis->reserved1 = 0;
744 *(
DWORD *)
msg->Buffer = extensions_size ? 1 : 0;
749 ORPC_EXTENT_ARRAY *orpc_extent_array =
msg->Buffer;
750 orpc_extent_array->size = extension_count;
751 orpc_extent_array->reserved = 0;
757 *(
DWORD *)
msg->Buffer = (extension_count + 1) & ~1;
761 msg->Buffer, channel_hook_data, channel_hook_count);
765 if (extension_count & 1)
770 wire_orpc_extent->
size = 0;
803 TRACE(
"completed with status 0x%x\n",
data->status);
817 if (
This->oxid != oxid)
831 ORPC_EXTENT_ARRAY orpc_ext_array;
836 TRACE(
"(%p) iMethod=%d\n", olemsg, olemsg->iMethod);
841 ERR(
"called from wrong apartment, should have been 0x%s\n",
855 ERR(
"can't make an outgoing COM call in response to a sent message\n");
925 orpcthat.flags = ORPCF_NULL;
926 orpcthat.extensions =
NULL;
932 TRACE(
"hrFault = 0x%08x\n", hrFault);
941 char *original_buffer =
msg->Buffer;
958 msg->DataRepresentation,
959 first_wire_orpc_extent,
960 orpcthat.extensions && first_wire_orpc_extent ? orpcthat.extensions->
size : 0,
967 if (pstatus) *pstatus =
status;
1031 msg->RpcInterfaceInformation =
NULL;
1048 TRACE(
"(%p,%p)\n", pdwDestContext, ppvDestContext);
1050 *pdwDestContext =
This->super.dest_context;
1051 *ppvDestContext =
This->super.dest_context_data;
1060 TRACE(
"(%p,%p)\n", dest_context, dest_context_data);
1062 *dest_context =
This->dest_context;
1063 *dest_context_data =
This->dest_context_data;
1100 const OXID_INFO *oxid_info,
const IID *iid,
1101 DWORD dest_context,
void *dest_context_data,
1152 This->super.refs = 1;
1153 This->super.dest_context = dest_context;
1154 This->super.dest_context_data = dest_context_data;
1157 This->server_pid = oxid_info->dwPid;
1161 *chan = &
This->super.IRpcChannelBuffer_iface;
1174 This->dest_context = dest_context;
1175 This->dest_context_data = dest_context_data;
1177 *chan = &
This->IRpcChannelBuffer_iface;
1185 ORPC_EXTENT_ARRAY *extensions,
1194 if ((
const char *)
msg->Buffer + 2 *
sizeof(
DWORD) >
end)
1197 pointer_id = *(
DWORD *)
msg->Buffer;
1198 msg->Buffer = (
char *)
msg->Buffer +
sizeof(
DWORD);
1199 extensions->extent =
NULL;
1206 if (*(
DWORD *)
msg->Buffer != ((extensions->size+1)&~1))
1209 msg->Buffer = (
char *)
msg->Buffer +
sizeof(
DWORD);
1212 if (extensions->size > 256)
1214 ERR(
"too many extensions: %d\n", extensions->size);
1218 *first_wire_orpc_extent = wire_orpc_extent =
msg->Buffer;
1219 for (
i = 0;
i < ((extensions->size+1)&~1);
i++)
1221 if ((
const char *)&wire_orpc_extent->
data[0] >
end)
1230 msg->Buffer = wire_orpc_extent;
1238 ORPC_EXTENT_ARRAY *orpc_ext_array,
WIRE_ORPC_EXTENT **first_wire_orpc_extent)
1240 const char *
end = (
char *)
msg->Buffer +
msg->BufferLength;
1242 *first_wire_orpc_extent =
NULL;
1246 ERR(
"invalid buffer length\n");
1253 if ((
const char *)
msg->Buffer +
sizeof(
DWORD) >
end)
1257 orpcthis->extensions = orpc_ext_array;
1259 orpcthis->extensions =
NULL;
1261 msg->Buffer = (
char *)
msg->Buffer +
sizeof(
DWORD);
1263 if (orpcthis->extensions)
1266 first_wire_orpc_extent);
1271 if ((orpcthis->version.MajorVersion != COM_MAJOR_VERSION) ||
1272 (orpcthis->version.MinorVersion > COM_MINOR_VERSION))
1274 ERR(
"COM version {%d, %d} not supported\n",
1275 orpcthis->version.MajorVersion, orpcthis->version.MinorVersion);
1279 if (orpcthis->flags & ~(ORPCF_LOCAL|ORPCF_RESERVED1|ORPCF_RESERVED2|ORPCF_RESERVED3|ORPCF_RESERVED4))
1281 ERR(
"invalid flags 0x%x\n", orpcthis->flags & ~(ORPCF_LOCAL|ORPCF_RESERVED1|ORPCF_RESERVED2|ORPCF_RESERVED3|ORPCF_RESERVED4));
1289 ORPC_EXTENT_ARRAY *orpc_ext_array,
WIRE_ORPC_EXTENT **first_wire_orpc_extent)
1291 const char *
end = (
char *)
msg->Buffer +
msg->BufferLength;
1293 *first_wire_orpc_extent =
NULL;
1297 ERR(
"invalid buffer length\n");
1304 if ((
const char *)
msg->Buffer +
sizeof(
DWORD) >
end)
1308 orpcthat->extensions = orpc_ext_array;
1310 orpcthat->extensions =
NULL;
1312 msg->Buffer = (
char *)
msg->Buffer +
sizeof(
DWORD);
1314 if (orpcthat->extensions)
1317 first_wire_orpc_extent);
1322 if (orpcthat->flags & ~(ORPCF_LOCAL|ORPCF_RESERVED1|ORPCF_RESERVED2|ORPCF_RESERVED3|ORPCF_RESERVED4))
1324 ERR(
"invalid flags 0x%x\n", orpcthat->flags & ~(ORPCF_LOCAL|ORPCF_RESERVED1|ORPCF_RESERVED2|ORPCF_RESERVED3|ORPCF_RESERVED4));
1337 ORPC_EXTENT_ARRAY orpc_ext_array;
1339 GUID old_causality_id;
1346 msg->Buffer = original_buffer;
1354 msg->Buffer = original_buffer;
1369 if (orpcthis.extensions && first_wire_orpc_extent &&
1370 orpcthis.extensions->size)
1389 calltype = CALLTYPE_NESTED;
1391 calltype = CALLTYPE_TOPLEVEL;
1393 calltype = CALLTYPE_TOPLEVEL_CALLPENDING;
1400 TRACE(
"IMessageFilter_HandleInComingCall returned %d\n", handlecall);
1403 case SERVERCALL_REJECTED:
1405 goto exit_reset_state;
1406 case SERVERCALL_RETRYLATER:
1409 goto exit_reset_state;
1411 FIXME(
"retry call later not implemented\n");
1414 case SERVERCALL_ISHANDLED:
1489 TRACE(
"Calling apartment thread 0x%08x...\n",
apt->
tid);
1496 IRpcChannelBuffer_Release(
params->chan);
1497 IRpcStubBuffer_Release(
params->stub);
1520 IRpcChannelBuffer_Release(
params->chan);
1522 IRpcStubBuffer_Release(
params->stub);
1554 TRACE(
"Creating new interface\n");
1578 ERR(
"RpcServerRegisterIfEx failed with error %d\n",
status);
1617 oxid_info->dwTid = 0;
1618 oxid_info->dwPid = 0;
1623 oxid_info->ipidRemUnknown.Data1 = 0xffffffff;
1624 oxid_info->ipidRemUnknown.Data2 = 0xffff;
1625 oxid_info->ipidRemUnknown.Data3 = 0xffff;
1626 memcpy(oxid_info->ipidRemUnknown.Data4, &oxid,
sizeof(
OXID));
1627 oxid_info->psa =
NULL ;
1659 static const WCHAR wszLocalServer32[] = {
'L',
'o',
'c',
'a',
'l',
'S',
'e',
'r',
'v',
'e',
'r',
'3',
'2',0 };
1660 static const WCHAR embedding[] = {
' ',
'-',
'E',
'm',
'b',
'e',
'd',
'd',
'i',
'n',
'g',0 };
1678 WARN(
"No default value for LocalServer32 key\n");
1749 static const WCHAR szLocalService[] = {
'L',
'o',
'c',
'a',
'l',
'S',
'e',
'r',
'v',
'i',
'c',
'e',0 };
1750 static const WCHAR szServiceParams[] = {
'S',
'e',
'r',
'v',
'i',
'c',
'e',
'P',
'a',
'r',
'a',
'm',
's',0};
1791 WARN(
"No LocalService value\n");
1802 static const WCHAR wszPipeRef[] = {
'\\',
'\\',
'.',
'\\',
'p',
'i',
'p',
'e',
'\\',0};
1814 char marshalbuffer[200];
1821 static const int MAXTRIES = 30;
1827 while (tries++ < MAXTRIES) {
1865 TRACE(
"read marshal id from pipe\n");
1870 if (tries >= MAXTRIES)
1878 hres = IStream_Seek(pStm,
seekto,STREAM_SEEK_SET,&newpos);
1880 TRACE(
"unmarshalling local server\n");
1886 IStream_Release(pStm);
1916 HANDLE pipe_event, hPipe = lsp->
pipe, new_pipe;
1921 memset(&ovl, 0,
sizeof(ovl));
1945 TRACE(
"marshalling LocalServer to client\n");
1947 hres = IStream_Stat(pStm,&ststg,STATFLAG_NONAME);
1953 hres = IStream_Seek(pStm,
seekto,STREAM_SEEK_SET,&newpos);
1955 FIXME(
"IStream_Seek failed, %x\n",
hres);
1959 buflen = ststg.cbSize.u.LowPart;
1975 TRACE(
"done marshalling LocalServer\n");
1979 TRACE(
"single use object, shutting down pipe %s\n",
debugstr_w(pipefn));
1984 4096, 4096, 500 ,
NULL );
2024 4096, 4096, 500 ,
NULL);
2043 *registration = lsp;
2057 IStream_Release(lsp->
stream);
int WINAPIV wsprintfW(_Out_ LPWSTR, _In_ _Printf_format_string_ LPCWSTR,...)
RPC_STATUS WINAPI RpcBindingFromStringBindingW(RPC_WSTR StringBinding, RPC_BINDING_HANDLE *Binding)
static HANDLE ClientRpcChannelBuffer_GetEventHandle(ClientRpcChannelBuffer *This)
void RPC_StopLocalServer(void *registration)
BOOL WINAPI WriteFile(IN HANDLE hFile, IN LPCVOID lpBuffer, IN DWORD nNumberOfBytesToWrite OPTIONAL, OUT LPDWORD lpNumberOfBytesWritten, IN LPOVERLAPPED lpOverlapped OPTIONAL)
HRESULT WINAPI CoUnmarshalInterface(IStream *pStream, REFIID riid, LPVOID *ppv)
#define PIPE_UNLIMITED_INSTANCES
void RPC_UnregisterAllChannelHooks(void)
RPC_STATUS WINAPI RpcBindingFree(RPC_BINDING_HANDLE *Binding)
namespace GUID const ADDRINFOEXW ADDRINFOEXW struct timeval OVERLAPPED LPLOOKUPSERVICE_COMPLETION_ROUTINE HANDLE * handle
VOID WINAPI DECLSPEC_HOTPATCH Sleep(IN DWORD dwMilliseconds)
#define HRESULT_FROM_WIN32(x)
PRPC_DISPATCH_TABLE DispatchTable
static void ChannelHooks_ClientNotify(SChannelHookCallInfo *info, DWORD lDataRep, WIRE_ORPC_EXTENT *first_wire_orpc_extent, ULONG extension_count, HRESULT hrFault)
#define RPC_S_INVALID_BOUND
static HRESULT WINAPI ClientRpcChannelBuffer_GetBuffer(LPRPCCHANNELBUFFER iface, RPCOLEMESSAGE *olemsg, REFIID riid)
#define SC_MANAGER_CONNECT
static HRESULT apartment_getoxid(const struct apartment *apt, OXID *oxid)
unsigned short MajorVersion
RPC_STATUS WINAPI RpcStringFreeW(RPC_WSTR *String)
static HRESULT WINAPI ClientRpcChannelBuffer_FreeBuffer(LPRPCCHANNELBUFFER iface, RPCOLEMESSAGE *olemsg)
static ULONG ChannelHooks_ClientGetSize(SChannelHookCallInfo *info, struct channel_hook_buffer_data **data, unsigned int *hook_count, ULONG *extension_count)
struct dispatch_params params
BOOL WINAPI GetOverlappedResult(IN HANDLE hFile, IN LPOVERLAPPED lpOverlapped, OUT LPDWORD lpNumberOfBytesTransferred, IN BOOL bWait)
GLenum GLuint GLenum GLsizei const GLchar * buf
INT WSAAPI bind(IN SOCKET s, IN CONST struct sockaddr *name, IN INT namelen)
GLdouble GLdouble GLdouble r
static void ChannelHooks_ServerNotify(SChannelHookCallInfo *info, DWORD lDataRep, WIRE_ORPC_EXTENT *first_wire_orpc_extent, ULONG extension_count)
DWORD apartment_release(struct apartment *apt)
static unsigned char * ChannelHooks_ServerFillBuffer(SChannelHookCallInfo *info, unsigned char *buffer, struct channel_hook_buffer_data *data, unsigned int hook_count)
static HRESULT WINAPI ServerRpcChannelBuffer_SendReceive(LPRPCCHANNELBUFFER iface, RPCOLEMESSAGE *olemsg, ULONG *pstatus)
void(__RPC_STUB * RPC_DISPATCH_FUNCTION)(PRPC_MESSAGE Message)
RPC_BINDING_HANDLE binding_handle
void DECLSPEC_NORETURN WINAPI RpcRaiseException(RPC_STATUS exception)
ULONG stub_manager_int_release(struct stub_manager *This) DECLSPEC_HIDDEN
BOOL WINAPI WaitNamedPipeW(LPCWSTR lpNamedPipeName, DWORD nTimeOut)
static void ClientRpcChannelBuffer_ReleaseEventHandle(ClientRpcChannelBuffer *This, HANDLE event)
static HRESULT WINAPI ClientRpcChannelBuffer_GetDestCtx(LPRPCCHANNELBUFFER iface, DWORD *pdwDestContext, void **ppvDestContext)
#define RPC_E_WRONG_THREAD
SChannelHookCallInfo channel_hook_info
DWORD WINAPI GetTickCount(VOID)
static CRITICAL_SECTION csChannelHook
void RPC_UnregisterInterface(REFIID riid, BOOL wait)
BOOL WINAPI InSendMessage(void)
GLuint GLuint GLsizei GLenum type
#define INVALID_HANDLE_VALUE
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
DWORD WINAPI GetLastError(VOID)
static HRESULT WINAPI ServerRpcChannelBuffer_GetDestCtx(LPRPCCHANNELBUFFER iface, DWORD *dest_context, void **dest_context_data)
#define RPC_E_CANTCALLOUT_ININPUTSYNCCALL
static CRITICAL_SECTION_DEBUG csRegIf_debug
RPC_STATUS WINAPI I_RpcGetBuffer(PRPC_MESSAGE pMsg)
HRESULT WINAPI CreateStreamOnHGlobal(HGLOBAL hGlobal, BOOL fDeleteOnRelease, LPSTREAM *ppstm)
#define RPC_E_INVALID_HEADER
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
static struct list channel_hooks
DWORD WINAPI WaitForMultipleObjects(IN DWORD nCount, IN CONST HANDLE *lpHandles, IN BOOL bWaitAll, IN DWORD dwMilliseconds)
#define RPC_IF_AUTOLISTEN
static struct oletls * COM_CurrentInfo(void)
RPC_STATUS WINAPI RpcServerUnregisterIf(RPC_IF_HANDLE IfSpec, UUID *MgrTypeUuid, UINT WaitForCallsToComplete)
static DWORD WINAPI rpc_sendreceive_thread(LPVOID param)
static ULONG WINAPI ClientRpcChannelBuffer_Release(LPRPCCHANNELBUFFER iface)
RPC_STATUS WINAPI RpcStringBindingComposeW(RPC_WSTR ObjUuid, RPC_WSTR Protseq, RPC_WSTR NetworkAddr, RPC_WSTR Endpoint, RPC_WSTR Options, RPC_WSTR *StringBinding)
static HRESULT create_server(REFCLSID rclsid, HANDLE *process)
HANDLE WINAPI DECLSPEC_HOTPATCH CreateEventW(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL, IN BOOL bManualReset, IN BOOL bInitialState, IN LPCWSTR lpName OPTIONAL)
static CRITICAL_SECTION csRegIf
static APARTMENT * COM_CurrentApt(void)
static HRESULT ClientRpcChannelBuffer_IsCorrectApartment(ClientRpcChannelBuffer *This, APARTMENT *apt)
static DWORD start_local_service(LPCWSTR name, DWORD num, LPCWSTR *params)
IRpcChannelBuffer IRpcChannelBuffer_iface
static ULONG WINAPI RpcChannelBuffer_AddRef(LPRPCCHANNELBUFFER iface)
RPC_STATUS WINAPI RpcServerRegisterIfEx(RPC_IF_HANDLE IfSpec, UUID *MgrTypeUuid, RPC_MGR_EPV *MgrEpv, UINT Flags, UINT MaxCalls, RPC_IF_CALLBACK_FN *IfCallbackFn)
__WINE_SERVER_LIST_INLINE void list_add_tail(struct list *list, struct list *elem)
HRESULT RPC_StartLocalServer(REFCLSID clsid, IStream *stream, BOOL multi_use, void **registration)
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
RPC_SYNTAX_IDENTIFIER InterfaceId
#define LIST_FOR_EACH_ENTRY(elem, list, type, field)
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
RPC_STATUS WINAPI I_RpcSendReceive(PRPC_MESSAGE pMsg)
static unsigned char * ChannelHooks_ClientFillBuffer(SChannelHookCallInfo *info, unsigned char *buffer, struct channel_hook_buffer_data *data, unsigned int hook_count)
#define ERROR_FUNCTION_FAILED
LONG WINAPI RegCloseKey(HKEY hKey)
static void get_rpc_endpoint(LPWSTR endpoint, const OXID *oxid)
static unsigned char bytes[4]
GLenum const GLfloat * params
static LPSTR local_server
#define NMPWAIT_WAIT_FOREVER
#define InterlockedCompareExchangePointer
static RPC_DISPATCH_FUNCTION rpc_dispatch_table[1]
static GUID COM_CurrentCausalityId(void)
SC_HANDLE WINAPI OpenServiceW(SC_HANDLE hSCManager, LPCWSTR lpServiceName, DWORD dwDesiredAccess)
#define RPC_C_LISTEN_MAX_CALLS_DEFAULT
BOOL WINAPI CloseServiceHandle(SC_HANDLE hSCObject)
HANDLE WINAPI DECLSPEC_HOTPATCH CreateThread(IN LPSECURITY_ATTRIBUTES lpThreadAttributes, IN DWORD dwStackSize, IN LPTHREAD_START_ROUTINE lpStartAddress, IN LPVOID lpParameter, IN DWORD dwCreationFlags, OUT LPDWORD lpThreadId)
RPC_VERSION SyntaxVersion
RPC_STATUS WINAPI I_RpcFreeBuffer(PRPC_MESSAGE pMsg)
struct _RPC_CLIENT_INTERFACE RPC_CLIENT_INTERFACE
HRESULT COM_OpenKeyForCLSID(REFCLSID clsid, LPCWSTR keyname, REGSAM access, HKEY *subkey)
BOOL WINAPI DECLSPEC_HOTPATCH CreateProcessW(LPCWSTR lpApplicationName, LPWSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCWSTR lpCurrentDirectory, LPSTARTUPINFOW lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation)
void leave_apartment(struct oletls *info)
static HRESULT WINAPI RpcChannelBuffer_IsConnected(LPRPCCHANNELBUFFER iface)
static RPC_DISPATCH_TABLE rpc_dispatch
HRESULT WINAPI CoWaitForMultipleHandles(DWORD dwFlags, DWORD dwTimeout, ULONG cHandles, LPHANDLE pHandles, LPDWORD lpdwindex)
HRESULT RPC_CreateServerChannel(DWORD dest_context, void *dest_context_data, IRpcChannelBuffer **chan)
static ULONG ChannelHooks_ServerGetSize(SChannelHookCallInfo *info, struct channel_hook_buffer_data **data, unsigned int *hook_count, ULONG *extension_count)
__WINE_SERVER_LIST_INLINE void list_remove(struct list *elem)
BOOL WINAPI StartServiceW(SC_HANDLE hService, DWORD dwNumServiceArgs, LPCWSTR *lpServiceArgVectors)
#define InterlockedExchangePointer(Target, Value)
BOOL WINAPI FlushFileBuffers(IN HANDLE hFile)
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
static object_header_t ** handles
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
void WINAPI DeleteCriticalSection(PCRITICAL_SECTION)
#define UlongToHandle(ul)
#define PIPE_ACCESS_DUPLEX
HRESULT RPC_RegisterChannelHook(REFGUID rguid, IChannelHook *hook)
INT WINAPI StringFromGUID2(REFGUID id, LPOLESTR str, INT cmax)
HRESULT RPC_GetLocalClassObject(REFCLSID rclsid, REFIID iid, LPVOID *ppv)
static HRESULT unmarshal_ORPC_EXTENT_ARRAY(RPC_MESSAGE *msg, const char *end, ORPC_EXTENT_ARRAY *extensions, WIRE_ORPC_EXTENT **first_wire_orpc_extent)
struct _RPC_SERVER_INTERFACE RPC_SERVER_INTERFACE
HWND apartment_getwindow(const struct apartment *apt)
HRESULT start_apartment_remote_unknown(APARTMENT *apt) DECLSPEC_HIDDEN
HRESULT COM_OpenKeyForAppIdFromCLSID(REFCLSID clsid, REGSAM access, HKEY *subkey)
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
void RPC_ExecuteCall(struct dispatch_params *params)
BOOL WINAPI QueueUserWorkItem(IN LPTHREAD_START_ROUTINE Function, IN PVOID Context, IN ULONG Flags)
#define seekto(pos, errstr)
#define InterlockedDecrement
#define ERROR_PIPE_CONNECTED
SC_HANDLE WINAPI OpenSCManagerW(LPCWSTR lpMachineName, LPCWSTR lpDatabaseName, DWORD dwDesiredAccess)
HRESULT enter_apartment(struct oletls *info, DWORD model)
unsigned short MinorVersion
BOOL WINAPI DisconnectNamedPipe(HANDLE hNamedPipe)
APARTMENT * apartment_get_current_or_mta(void)
static void __RPC_STUB dispatch_rpc(RPC_MESSAGE *msg)
#define memcpy(s1, s2, n)
static struct list registered_interfaces
static DWORD WINAPI local_server_thread(LPVOID param)
RPC_STATUS WINAPI RpcBindingInqObject(RPC_BINDING_HANDLE Binding, UUID *ObjectUuid)
LIST_ENTRY ProcessLocksList
#define RPC_E_CALL_REJECTED
RPC_STATUS WINAPI RpcBindingSetObject(RPC_BINDING_HANDLE Binding, UUID *ObjectUuid)
#define InterlockedExchange
static HRESULT WINAPI ServerRpcChannelBuffer_GetBuffer(LPRPCCHANNELBUFFER iface, RPCOLEMESSAGE *olemsg, REFIID riid)
static HRESULT unmarshal_ORPCTHAT(RPC_MESSAGE *msg, ORPCTHAT *orpcthat, ORPC_EXTENT_ARRAY *orpc_ext_array, WIRE_ORPC_EXTENT **first_wire_orpc_extent)
RPC_STATUS WINAPI RpcServerUseProtseqEpW(RPC_WSTR Protseq, UINT MaxCalls, RPC_WSTR Endpoint, LPVOID SecurityDescriptor)
HRESULT ipid_get_dispatch_params(const IPID *ipid, APARTMENT **stub_apt, struct stub_manager **manager, IRpcStubBuffer **stub, IRpcChannelBuffer **chan, IID *iid, IUnknown **iface) DECLSPEC_HIDDEN
WINE_UNICODE_INLINE WCHAR * strcpyW(WCHAR *dst, const WCHAR *src)
static HRESULT create_local_service(REFCLSID rclsid)
#define REGDB_E_CLASSNOTREG
WINE_DEFAULT_DEBUG_CHANNEL(ole)
#define LIST_FOR_EACH_ENTRY_SAFE(cursor, cursor2, list, type, field)
#define InterlockedIncrement
static HRESULT unmarshal_ORPCTHIS(RPC_MESSAGE *msg, ORPCTHIS *orpcthis, ORPC_EXTENT_ARRAY *orpc_ext_array, WIRE_ORPC_EXTENT **first_wire_orpc_extent)
static const IRpcChannelBufferVtbl ClientRpcChannelBufferVtbl
WINE_UNICODE_INLINE WCHAR * strcatW(WCHAR *dst, const WCHAR *src)
HRESULT RPC_RegisterInterface(REFIID riid)
#define FIELD_OFFSET(t, f)
#define RPC_FLAGS_VALID_BIT
#define RPC_C_PROTSEQ_MAX_REQS_DEFAULT
BOOL WINAPI IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
static const IRpcChannelBufferVtbl ServerRpcChannelBufferVtbl
#define RPC_E_VERSION_MISMATCH
BOOL WINAPI PostMessageW(_In_opt_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
static HRESULT WINAPI ClientRpcChannelBuffer_SendReceive(LPRPCCHANNELBUFFER iface, RPCOLEMESSAGE *olemsg, ULONG *pstatus)
HRESULT RPC_ResolveOxid(OXID oxid, OXID_INFO *oxid_info)
static HRESULT WINAPI ServerRpcChannelBuffer_FreeBuffer(LPRPCCHANNELBUFFER iface, RPCOLEMESSAGE *olemsg)
static __inline const char * wine_dbgstr_longlong(ULONGLONG ll)
static CRITICAL_SECTION_DEBUG csChannelHook_debug
interface IRpcChannelBuffer * LPRPCCHANNELBUFFER
static HRESULT WINAPI RpcChannelBuffer_QueryInterface(IRpcChannelBuffer *iface, REFIID riid, LPVOID *ppv)
HRESULT RPC_CreateClientChannel(const OXID *oxid, const IPID *ipid, const OXID_INFO *oxid_info, const IID *iid, DWORD dest_context, void *dest_context_data, IRpcChannelBuffer **chan, APARTMENT *apt)
static ULONG WINAPI ServerRpcChannelBuffer_Release(LPRPCCHANNELBUFFER iface)
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
void RPC_StartRemoting(struct apartment *apt)
HANDLE WINAPI CreateNamedPipeW(LPCWSTR lpName, DWORD dwOpenMode, DWORD dwPipeMode, DWORD nMaxInstances, DWORD nOutBufferSize, DWORD nInBufferSize, DWORD nDefaultTimeOut, LPSECURITY_ATTRIBUTES lpSecurityAttributes)
#define FILE_FLAG_OVERLAPPED
#define ERROR_SERVICE_ALREADY_RUNNING
BOOL WINAPI ReadFile(IN HANDLE hFile, IN LPVOID lpBuffer, IN DWORD nNumberOfBytesToRead, OUT LPDWORD lpNumberOfBytesRead OPTIONAL, IN LPOVERLAPPED lpOverlapped OPTIONAL)
RPC_SYNTAX_IDENTIFIER InterfaceId
static SERVICE_STATUS status
BOOL WINAPI ConnectNamedPipe(IN HANDLE hNamedPipe, IN LPOVERLAPPED lpOverlapped)
#define RPC_C_AUTHN_LEVEL_NONE
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
#define HeapFree(x, y, z)
#define IsEqualIID(riid1, riid2)
#define WT_EXECUTEDEFAULT
DWORD WINAPI GetCurrentProcessId(VOID)
static WCHAR wszRpcTransport[]
static void get_localserver_pipe_name(WCHAR *pipefn, REFCLSID rclsid)