Author: fireball Date: Thu Nov 6 11:35:54 2008 New Revision: 37225
URL: http://svn.reactos.org/svn/reactos?rev=37225&view=rev Log: - Sync rpcrt4.dll to Wine-20081106. ros.diff and regtests aren't updated yet.
Added: trunk/reactos/dll/win32/rpcrt4/epm.idl Removed: trunk/reactos/dll/win32/rpcrt4/rpcss_np_client.c trunk/reactos/dll/win32/rpcrt4/rpcss_np_client.h Modified: trunk/reactos/dll/win32/rpcrt4/cproxy.c trunk/reactos/dll/win32/rpcrt4/cpsf.c trunk/reactos/dll/win32/rpcrt4/cpsf.h trunk/reactos/dll/win32/rpcrt4/cstub.c trunk/reactos/dll/win32/rpcrt4/epm_towers.h trunk/reactos/dll/win32/rpcrt4/ndr_clientserver.c trunk/reactos/dll/win32/rpcrt4/ndr_es.c trunk/reactos/dll/win32/rpcrt4/ndr_marshall.c trunk/reactos/dll/win32/rpcrt4/ndr_misc.h trunk/reactos/dll/win32/rpcrt4/ndr_ole.c trunk/reactos/dll/win32/rpcrt4/ndr_stubless.c trunk/reactos/dll/win32/rpcrt4/rpc_async.c trunk/reactos/dll/win32/rpcrt4/rpc_binding.c trunk/reactos/dll/win32/rpcrt4/rpc_binding.h trunk/reactos/dll/win32/rpcrt4/rpc_defs.h trunk/reactos/dll/win32/rpcrt4/rpc_epmap.c trunk/reactos/dll/win32/rpcrt4/rpc_message.c trunk/reactos/dll/win32/rpcrt4/rpc_message.h trunk/reactos/dll/win32/rpcrt4/rpc_server.c trunk/reactos/dll/win32/rpcrt4/rpc_server.h trunk/reactos/dll/win32/rpcrt4/rpc_transport.c trunk/reactos/dll/win32/rpcrt4/rpcrt4.rbuild trunk/reactos/dll/win32/rpcrt4/rpcrt4.spec trunk/reactos/dll/win32/rpcrt4/rpcrt4_main.c trunk/reactos/dll/win32/rpcrt4/unix_func.c trunk/reactos/dll/win32/rpcrt4/unix_func.h trunk/reactos/include/psdk/rpcdce.h trunk/reactos/include/psdk/rpcndr.h trunk/reactos/include/psdk/winnt.h
Modified: trunk/reactos/dll/win32/rpcrt4/cproxy.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/rpcrt4/cproxy.c?r... ============================================================================== --- trunk/reactos/dll/win32/rpcrt4/cproxy.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/rpcrt4/cproxy.c [iso-8859-1] Thu Nov 6 11:35:54 2008 @@ -1,7 +1,7 @@ /* * COM proxy implementation * - * Copyright 2001 Ove Kåven, TransGaming Technologies + * Copyright 2001 Ove KÃ¥ven, TransGaming Technologies * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -57,10 +57,6 @@ static const IRpcProxyBufferVtbl StdProxy_Vtbl;
#define ICOM_THIS_MULTI(impl,field,iface) impl* const This=(impl*)((char*)(iface) - offsetof(impl,field)) - -/* How the Windows stubless proxy thunks work is explained at - * http://msdn.microsoft.com/library/en-us/dnmsj99/html/com0199.asp, - * but I'll use a slightly different method, to make life easier */
#if defined(__i386__)
@@ -389,6 +385,8 @@ }
pStubMsg->dwStubPhase = PROXY_SENDRECEIVE; + /* avoid sending uninitialised parts of the buffer on the wire */ + pStubMsg->RpcMsg->BufferLength = pStubMsg->Buffer - (unsigned char *)pStubMsg->RpcMsg->Buffer; hr = IRpcChannelBuffer_SendReceive(pStubMsg->pRpcChannelBuffer, (RPCOLEMESSAGE*)pStubMsg->RpcMsg, &Status);
Modified: trunk/reactos/dll/win32/rpcrt4/cpsf.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/rpcrt4/cpsf.c?rev... ============================================================================== --- trunk/reactos/dll/win32/rpcrt4/cpsf.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/rpcrt4/cpsf.c [iso-8859-1] Thu Nov 6 11:35:54 2008 @@ -1,7 +1,7 @@ /* * COM proxy/stub factory (CStdPSFactory) implementation * - * Copyright 2001 Ove Kåven, TransGaming Technologies + * Copyright 2001 Ove KÃ¥ven, TransGaming Technologies * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -174,7 +174,7 @@ if(max_delegating_vtbl_size > 0) create_delegating_vtbl(max_delegating_vtbl_size); } - if (IsEqualGUID(rclsid, pclsid)) + if (pclsid && IsEqualGUID(rclsid, pclsid)) return IPSFactoryBuffer_QueryInterface((LPPSFACTORYBUFFER)pPSFactoryBuffer, iid, ppv); else { const ProxyFileInfo *info;
Modified: trunk/reactos/dll/win32/rpcrt4/cpsf.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/rpcrt4/cpsf.h?rev... ============================================================================== --- trunk/reactos/dll/win32/rpcrt4/cpsf.h [iso-8859-1] (original) +++ trunk/reactos/dll/win32/rpcrt4/cpsf.h [iso-8859-1] Thu Nov 6 11:35:54 2008 @@ -1,7 +1,7 @@ /* * COM proxy definitions * - * Copyright 2001 Ove Kåven, TransGaming Technologies + * Copyright 2001 Ove KÃ¥ven, TransGaming Technologies * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public
Modified: trunk/reactos/dll/win32/rpcrt4/cstub.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/rpcrt4/cstub.c?re... ============================================================================== --- trunk/reactos/dll/win32/rpcrt4/cstub.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/rpcrt4/cstub.c [iso-8859-1] Thu Nov 6 11:35:54 2008 @@ -1,7 +1,7 @@ /* * COM stub (CStdStubBuffer) implementation * - * Copyright 2001 Ove Kåven, TransGaming Technologies + * Copyright 2001 Ove KÃ¥ven, TransGaming Technologies * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -18,6 +18,9 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
+#include "config.h" +#include "wine/port.h" + #include <stdarg.h>
#define COBJMACROS @@ -39,9 +42,9 @@
#define STUB_HEADER(This) (((const CInterfaceStubHeader*)((This)->lpVtbl))[-1])
-static WINE_EXCEPTION_FILTER(stub_filter) -{ - if (GetExceptionInformation()->ExceptionRecord->ExceptionFlags & EXCEPTION_NONCONTINUABLE) +static LONG WINAPI stub_filter(EXCEPTION_POINTERS *eptr) +{ + if (eptr->ExceptionRecord->ExceptionFlags & EXCEPTION_NONCONTINUABLE) return EXCEPTION_CONTINUE_SEARCH; return EXCEPTION_EXECUTE_HANDLER; } @@ -194,7 +197,7 @@ #else /* __i386__ */
typedef struct {int dummy;} vtbl_method_t; -static void fill_table(IUnknownVtbl *vtbl, DWORD num) +static void fill_table(IUnknownVtbl *vtbl, void **methods, DWORD num) { ERR("delegated stubs are not supported on this architecture\n"); } @@ -218,9 +221,7 @@ if(current_vtbl.table && current_vtbl.table->ref == 0) { TRACE("freeing old table\n"); - VirtualFree(current_vtbl.table->methods, - (current_vtbl.table->size - 3) * sizeof(vtbl_method_t), - MEM_RELEASE); + VirtualFree(current_vtbl.table->methods, 0, MEM_RELEASE); HeapFree(GetProcessHeap(), 0, current_vtbl.table); } size = (num_methods - 3) * sizeof(vtbl_method_t); @@ -255,9 +256,7 @@ if(table->ref == 0 && table != current_vtbl.table) { TRACE("... and we're not current so free'ing\n"); - VirtualFree(current_vtbl.table->methods, - (current_vtbl.table->size - 3) * sizeof(vtbl_method_t), - MEM_RELEASE); + VirtualFree(current_vtbl.table->methods, 0, MEM_RELEASE); HeapFree(GetProcessHeap(), 0, table); } LeaveCriticalSection(&delegating_vtbl_section);
Added: trunk/reactos/dll/win32/rpcrt4/epm.idl URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/rpcrt4/epm.idl?re... ============================================================================== --- trunk/reactos/dll/win32/rpcrt4/epm.idl (added) +++ trunk/reactos/dll/win32/rpcrt4/epm.idl [iso-8859-1] Thu Nov 6 11:35:54 2008 @@ -1,0 +1,19 @@ +/* + * Copyright 2008 Robert Shearman + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "wine/epm.idl"
Modified: trunk/reactos/dll/win32/rpcrt4/epm_towers.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/rpcrt4/epm_towers... ============================================================================== --- trunk/reactos/dll/win32/rpcrt4/epm_towers.h [iso-8859-1] (original) +++ trunk/reactos/dll/win32/rpcrt4/epm_towers.h [iso-8859-1] Thu Nov 6 11:35:54 2008 @@ -18,6 +18,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA * */ + +#include "epm_c.h"
#define EPM_PROTOCOL_DNET_NSP 0x04 #define EPM_PROTOCOL_OSI_TP4 0x05 @@ -47,10 +49,6 @@ #define EPM_PROTOCOL_NULL 0x21
#include <pshpack1.h> - -typedef unsigned char u_int8; -typedef unsigned short u_int16; -typedef unsigned int u_int32;
typedef struct {
Modified: trunk/reactos/dll/win32/rpcrt4/ndr_clientserver.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/rpcrt4/ndr_client... ============================================================================== --- trunk/reactos/dll/win32/rpcrt4/ndr_clientserver.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/rpcrt4/ndr_clientserver.c [iso-8859-1] Thu Nov 6 11:35:54 2008 @@ -1,7 +1,7 @@ /* * MIDL proxy/stub stuff * - * Copyright 2002 Ove Kåven, TransGaming Technologies + * Copyright 2002 Ove KÃ¥ven, TransGaming Technologies * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public
Modified: trunk/reactos/dll/win32/rpcrt4/ndr_es.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/rpcrt4/ndr_es.c?r... ============================================================================== --- trunk/reactos/dll/win32/rpcrt4/ndr_es.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/rpcrt4/ndr_es.c [iso-8859-1] Thu Nov 6 11:35:54 2008 @@ -156,7 +156,18 @@
*pHandle = (handle_t)pEsMsg;
- return RPC_S_OK;} + return RPC_S_OK; +} + +/*********************************************************************** + * MesEncodeDynBufferHandleCreate [RPCRT4.@] + */ +RPC_STATUS RPC_ENTRY MesEncodeDynBufferHandleCreate(char **ppBuffer, + ULONG *pEncodedSize, handle_t *pHandle) +{ + FIXME("%p %p %p stub\n", ppBuffer, pEncodedSize, pHandle); + return RPC_S_OK; +}
/*********************************************************************** * MesDecodeBufferHandleCreate [RPCRT4.@]
Modified: trunk/reactos/dll/win32/rpcrt4/ndr_marshall.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/rpcrt4/ndr_marsha... ============================================================================== --- trunk/reactos/dll/win32/rpcrt4/ndr_marshall.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/rpcrt4/ndr_marshall.c [iso-8859-1] Thu Nov 6 11:35:54 2008 @@ -361,10 +361,10 @@ * If the function is unable to allocate memory an ERROR_OUTOFMEMORY * exception is raised. */ -void * WINAPI NdrAllocate(MIDL_STUB_MESSAGE *pStubMsg, size_t len) -{ - size_t aligned_len; - size_t adjusted_len; +void * WINAPI NdrAllocate(MIDL_STUB_MESSAGE *pStubMsg, SIZE_T len) +{ + SIZE_T aligned_len; + SIZE_T adjusted_len; void *p; NDR_MEMORY_LIST *mem_list;
@@ -373,7 +373,7 @@ /* check for overflow */ if (adjusted_len < len) { - ERR("overflow of adjusted_len %d, len %d\n", adjusted_len, len); + ERR("overflow of adjusted_len %ld, len %ld\n", adjusted_len, len); RpcRaiseException(RPC_X_BAD_STUB_DATA); }
@@ -861,7 +861,10 @@ if (pointer_id) pointer_needs_unmarshaling = 1; else + { + *pPointer = NULL; pointer_needs_unmarshaling = 0; + } break; case RPC_FC_FP: pointer_id = NDR_LOCAL_UINT32_READ(Buffer);
Modified: trunk/reactos/dll/win32/rpcrt4/ndr_misc.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/rpcrt4/ndr_misc.h... ============================================================================== --- trunk/reactos/dll/win32/rpcrt4/ndr_misc.h [iso-8859-1] (original) +++ trunk/reactos/dll/win32/rpcrt4/ndr_misc.h [iso-8859-1] Thu Nov 6 11:35:54 2008 @@ -1,7 +1,7 @@ /* * NDR definitions * - * Copyright 2001 Ove Kåven, TransGaming Technologies + * Copyright 2001 Ove KÃ¥ven, TransGaming Technologies * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public
Modified: trunk/reactos/dll/win32/rpcrt4/ndr_ole.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/rpcrt4/ndr_ole.c?... ============================================================================== --- trunk/reactos/dll/win32/rpcrt4/ndr_ole.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/rpcrt4/ndr_ole.c [iso-8859-1] Thu Nov 6 11:35:54 2008 @@ -1,7 +1,7 @@ /* * OLE32 callouts, COM interface marshalling * - * Copyright 2001 Ove Kåven, TransGaming Technologies + * Copyright 2001 Ove KÃ¥ven, TransGaming Technologies * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public
Modified: trunk/reactos/dll/win32/rpcrt4/ndr_stubless.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/rpcrt4/ndr_stuble... ============================================================================== --- trunk/reactos/dll/win32/rpcrt4/ndr_stubless.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/rpcrt4/ndr_stubless.c [iso-8859-1] Thu Nov 6 11:35:54 2008 @@ -1,7 +1,7 @@ /* * NDR -Oi,-Oif,-Oicf Interpreter * - * Copyright 2001 Ove Kåven, TransGaming Technologies + * Copyright 2001 Ove KÃ¥ven, TransGaming Technologies * Copyright 2003-5 Robert Shearman (for CodeWeavers) * * This library is free software; you can redistribute it and/or
Modified: trunk/reactos/dll/win32/rpcrt4/rpc_async.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/rpcrt4/rpc_async.... ============================================================================== --- trunk/reactos/dll/win32/rpcrt4/rpc_async.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/rpcrt4/rpc_async.c [iso-8859-1] Thu Nov 6 11:35:54 2008 @@ -64,7 +64,7 @@ pAsync->Flags = 0; pAsync->StubInfo = NULL; pAsync->RuntimeInfo = NULL; - memset(&pAsync->Reserved, 0, sizeof(*pAsync) - FIELD_OFFSET(RPC_ASYNC_STATE, Reserved)); + memset(pAsync->Reserved, 0, sizeof(*pAsync) - FIELD_OFFSET(RPC_ASYNC_STATE, Reserved));
return RPC_S_OK; }
Modified: trunk/reactos/dll/win32/rpcrt4/rpc_binding.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/rpcrt4/rpc_bindin... ============================================================================== --- trunk/reactos/dll/win32/rpcrt4/rpc_binding.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/rpcrt4/rpc_binding.c [iso-8859-1] Thu Nov 6 11:35:54 2008 @@ -1,7 +1,7 @@ /* * RPC binding API * - * Copyright 2001 Ove Kåven, TransGaming Technologies + * Copyright 2001 Ove KÃ¥ven, TransGaming Technologies * Copyright 2003 Mike Hearn * Copyright 2004 Filip Navara * Copyright 2006 CodeWeavers @@ -435,7 +435,7 @@ { RPC_WSTR component, p;
- if (len == -1) len = strlen((const char *)string_binding); + if (len == -1) len = strlenW(string_binding);
component = HeapAlloc(GetProcessHeap(), 0, (len + 1) * sizeof(*component)); if (!component) return NULL;
Modified: trunk/reactos/dll/win32/rpcrt4/rpc_binding.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/rpcrt4/rpc_bindin... ============================================================================== --- trunk/reactos/dll/win32/rpcrt4/rpc_binding.h [iso-8859-1] (original) +++ trunk/reactos/dll/win32/rpcrt4/rpc_binding.h [iso-8859-1] Thu Nov 6 11:35:54 2008 @@ -1,7 +1,7 @@ /* * RPC binding API * - * Copyright 2001 Ove Kåven, TransGaming Technologies + * Copyright 2001 Ove KÃ¥ven, TransGaming Technologies * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -21,7 +21,6 @@ #ifndef __WINE_RPC_BINDING_H #define __WINE_RPC_BINDING_H
-#include "wine/rpcss_shared.h" #include "rpcndr.h" #include "security.h" #include "wine/list.h" @@ -150,9 +149,6 @@ RPC_STATUS RPCRT4_OpenBinding(RpcBinding* Binding, RpcConnection** Connection, const RPC_SYNTAX_IDENTIFIER *TransferSyntax, const RPC_SYNTAX_IDENTIFIER *InterfaceId); RPC_STATUS RPCRT4_CloseBinding(RpcBinding* Binding, RpcConnection* Connection); -BOOL RPCRT4_RPCSSOnDemandCall(PRPCSS_NP_MESSAGE msg, char *vardata_payload, PRPCSS_NP_REPLY reply); -HANDLE RPCRT4_GetMasterMutex(void); -HANDLE RPCRT4_RpcssNPConnect(void);
static inline const char *rpcrt4_conn_get_name(const RpcConnection *Connection) {
Modified: trunk/reactos/dll/win32/rpcrt4/rpc_defs.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/rpcrt4/rpc_defs.h... ============================================================================== --- trunk/reactos/dll/win32/rpcrt4/rpc_defs.h [iso-8859-1] (original) +++ trunk/reactos/dll/win32/rpcrt4/rpc_defs.h [iso-8859-1] Thu Nov 6 11:35:54 2008 @@ -1,7 +1,7 @@ /* * RPC definitions * - * Copyright 2001-2002 Ove Kåven, TransGaming Technologies + * Copyright 2001-2002 Ove KÃ¥ven, TransGaming Technologies * Copyright 2004 Filip Navara * * This library is free software; you can redistribute it and/or
Modified: trunk/reactos/dll/win32/rpcrt4/rpc_epmap.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/rpcrt4/rpc_epmap.... ============================================================================== --- trunk/reactos/dll/win32/rpcrt4/rpc_epmap.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/rpcrt4/rpc_epmap.c [iso-8859-1] Thu Nov 6 11:35:54 2008 @@ -2,7 +2,8 @@ * RPC endpoint mapper * * Copyright 2002 Greg Turner - * Copyright 2001 Ove Kåven, TransGaming Technologies + * Copyright 2001 Ove KÃ¥ven, TransGaming Technologies + * Copyright 2008 Robert Shearman (for CodeWeavers) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -17,14 +18,9 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - * - * TODO: - * - actually do things right */
#include <stdarg.h> -#include <stdio.h> -#include <string.h>
#include "windef.h" #include "winbase.h" @@ -33,8 +29,10 @@ #include "rpc.h"
#include "wine/debug.h" +#include "wine/exception.h"
#include "rpc_binding.h" +#include "epm_c.h" #include "epm_towers.h"
WINE_DEFAULT_DEBUG_CHANNEL(ole); @@ -43,8 +41,9 @@ * * ncadg_ip_udp: 135 * ncacn_ip_tcp: 135 - * ncacn_np: \pipe\epmapper (?) + * ncacn_np: \pipe\epmapper * ncalrpc: epmapper + * ncacn_http: 593 * * If the user's machine ran a DCE RPC daemon, it would * probably be possible to connect to it, but there are many @@ -63,77 +62,222 @@ * of running a fully functional DCOM server using Wine... */
+static const struct epm_endpoints +{ + const char *protseq; + const char *endpoint; +} epm_endpoints[] = +{ + { "ncacn_np", "\pipe\epmapper" }, + { "ncacn_ip_tcp", "135" }, + { "ncacn_ip_udp", "135" }, + { "ncalrpc", "epmapper" }, + { "ncacn_http", "593" }, +}; + +static BOOL start_rpcss(void) +{ + PROCESS_INFORMATION pi; + STARTUPINFOW si; + static WCHAR cmd[6]; + static const WCHAR rpcss[] = {'r','p','c','s','s',0}; + BOOL rslt; + + TRACE("\n"); + + ZeroMemory(&pi, sizeof(PROCESS_INFORMATION)); + ZeroMemory(&si, sizeof(STARTUPINFOA)); + si.cb = sizeof(STARTUPINFOA); + + memcpy(cmd, rpcss, sizeof(rpcss)); + + rslt = CreateProcessW( + NULL, /* executable */ + cmd, /* command line */ + NULL, /* process security attributes */ + NULL, /* primary thread security attributes */ + FALSE, /* inherit handles */ + 0, /* creation flags */ + NULL, /* use parent's environment */ + NULL, /* use parent's current directory */ + &si, /* STARTUPINFO pointer */ + &pi /* PROCESS_INFORMATION */ + ); + + if (rslt) + { + CloseHandle(pi.hProcess); + CloseHandle(pi.hThread); + Sleep(100); + } + + return rslt; +} + +static inline BOOL is_epm_destination_local(RPC_BINDING_HANDLE handle) +{ + RpcBinding *bind = (RpcBinding *)handle; + const char *protseq = bind->Protseq; + const char *network_addr = bind->NetworkAddr; + + return ((!strcmp(protseq, "ncalrpc") && !network_addr) || + (!strcmp(protseq, "ncacn_np") && + (!network_addr || !strcmp(network_addr, ".")))); +} + +static RPC_STATUS get_epm_handle_client(RPC_BINDING_HANDLE handle, RPC_BINDING_HANDLE *epm_handle) +{ + RpcBinding *bind = (RpcBinding *)handle; + const char * pszEndpoint = NULL; + RPC_STATUS status; + RpcBinding* epm_bind; + unsigned int i; + + if (bind->server) + return RPC_S_INVALID_BINDING; + + for (i = 0; i < sizeof(epm_endpoints)/sizeof(epm_endpoints[0]); i++) + if (!strcmp(bind->Protseq, epm_endpoints[i].protseq)) + pszEndpoint = epm_endpoints[i].endpoint; + + if (!pszEndpoint) + { + FIXME("no endpoint for the endpoint-mapper found for protseq %s\n", debugstr_a(bind->Protseq)); + return RPC_S_PROTSEQ_NOT_SUPPORTED; + } + + status = RpcBindingCopy(handle, epm_handle); + if (status != RPC_S_OK) return status; + + epm_bind = (RpcBinding*)*epm_handle; + if (epm_bind->AuthInfo) + { + /* don't bother with authenticating against the EPM by default + * (see EnableAuthEpResolution registry value) */ + RpcAuthInfo_Release(epm_bind->AuthInfo); + epm_bind->AuthInfo = NULL; + } + RPCRT4_ResolveBinding(epm_bind, pszEndpoint); + TRACE("RPC_S_OK\n"); + return RPC_S_OK; +} + +static RPC_STATUS get_epm_handle_server(RPC_BINDING_HANDLE *epm_handle) +{ + unsigned char string_binding[] = "ncacn_np:.[\\pipe\\epmapper]"; + + return RpcBindingFromStringBindingA(string_binding, epm_handle); +} + +static LONG WINAPI rpc_filter(EXCEPTION_POINTERS *__eptr) +{ + switch (GetExceptionCode()) + { + case EXCEPTION_ACCESS_VIOLATION: + case EXCEPTION_ILLEGAL_INSTRUCTION: + return EXCEPTION_CONTINUE_SEARCH; + default: + return EXCEPTION_EXECUTE_HANDLER; + } +} + /*********************************************************************** * RpcEpRegisterA (RPCRT4.@) */ RPC_STATUS WINAPI RpcEpRegisterA( RPC_IF_HANDLE IfSpec, RPC_BINDING_VECTOR *BindingVector, UUID_VECTOR *UuidVector, RPC_CSTR Annotation ) { - RPCSS_NP_MESSAGE msg; - RPCSS_NP_REPLY reply; - char *vardata_payload, *vp; PRPC_SERVER_INTERFACE If = (PRPC_SERVER_INTERFACE)IfSpec; - unsigned long c; - RPC_STATUS rslt = RPC_S_OK; + unsigned long i; + RPC_STATUS status = RPC_S_OK; + error_status_t status2; + ept_entry_t *entries; + handle_t handle;
TRACE("(%p,%p,%p,%s)\n", IfSpec, BindingVector, UuidVector, debugstr_a((char*)Annotation)); TRACE(" ifid=%s\n", debugstr_guid(&If->InterfaceId.SyntaxGUID)); - for (c=0; c<BindingVector->Count; c++) { - RpcBinding* bind = (RpcBinding*)(BindingVector->BindingH[c]); - TRACE(" protseq[%ld]=%s\n", c, debugstr_a(bind->Protseq)); - TRACE(" endpoint[%ld]=%s\n", c, debugstr_a(bind->Endpoint)); + for (i=0; i<BindingVector->Count; i++) { + RpcBinding* bind = (RpcBinding*)(BindingVector->BindingH[i]); + TRACE(" protseq[%ld]=%s\n", i, debugstr_a(bind->Protseq)); + TRACE(" endpoint[%ld]=%s\n", i, debugstr_a(bind->Endpoint)); } if (UuidVector) { - for (c=0; c<UuidVector->Count; c++) - TRACE(" obj[%ld]=%s\n", c, debugstr_guid(UuidVector->Uuid[c])); - } - - /* FIXME: Do something with annotation. */ - - /* construct the message to rpcss */ - msg.message_type = RPCSS_NP_MESSAGE_TYPEID_REGISTEREPMSG; - msg.message.registerepmsg.iface = If->InterfaceId; - msg.message.registerepmsg.no_replace = 0; - - msg.message.registerepmsg.object_count = (UuidVector) ? UuidVector->Count : 0; - msg.message.registerepmsg.binding_count = BindingVector->Count; - - /* calculate vardata payload size */ - msg.vardata_payload_size = msg.message.registerepmsg.object_count * sizeof(UUID); - for (c=0; c < msg.message.registerepmsg.binding_count; c++) { - RpcBinding *bind = (RpcBinding *)(BindingVector->BindingH[c]); - msg.vardata_payload_size += strlen(bind->Protseq) + 1; - msg.vardata_payload_size += strlen(bind->Endpoint) + 1; - } - - /* allocate the payload buffer */ - vp = vardata_payload = LocalAlloc(LPTR, msg.vardata_payload_size); - if (!vardata_payload) - return RPC_S_OUT_OF_MEMORY; - - /* populate the payload data */ - for (c=0; c < msg.message.registerepmsg.object_count; c++) { - CopyMemory(vp, UuidVector->Uuid[c], sizeof(UUID)); - vp += sizeof(UUID); - } - - for (c=0; c < msg.message.registerepmsg.binding_count; c++) { - RpcBinding *bind = (RpcBinding*)(BindingVector->BindingH[c]); - unsigned long pslen = strlen(bind->Protseq) + 1, eplen = strlen(bind->Endpoint) + 1; - CopyMemory(vp, bind->Protseq, pslen); - vp += pslen; - CopyMemory(vp, bind->Endpoint, eplen); - vp += eplen; - } - - /* send our request */ - if (!RPCRT4_RPCSSOnDemandCall(&msg, vardata_payload, &reply)) - rslt = RPC_S_OUT_OF_MEMORY; - - /* free the payload buffer */ - LocalFree(vardata_payload); - - return rslt; + for (i=0; i<UuidVector->Count; i++) + TRACE(" obj[%ld]=%s\n", i, debugstr_guid(UuidVector->Uuid[i])); + } + + if (!BindingVector->Count) return RPC_S_OK; + + entries = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*entries) * BindingVector->Count * (UuidVector ? UuidVector->Count : 1)); + if (!entries) + return RPC_S_OUT_OF_MEMORY; + + status = get_epm_handle_server(&handle); + if (status != RPC_S_OK) + { + HeapFree(GetProcessHeap(), 0, entries); + return status; + } + + for (i = 0; i < BindingVector->Count; i++) + { + unsigned j; + RpcBinding* bind = (RpcBinding*)(BindingVector->BindingH[i]); + for (j = 0; j < (UuidVector ? UuidVector->Count : 1); j++) + { + int len = strlen((char *)Annotation); + status = TowerConstruct(&If->InterfaceId, &If->TransferSyntax, + bind->Protseq, bind->Endpoint, + bind->NetworkAddr, + &entries[i*(UuidVector ? UuidVector->Count : 1) + j].tower); + if (status != RPC_S_OK) break; + + if (UuidVector) + memcpy(&entries[i * UuidVector->Count].object, &UuidVector->Uuid[j], sizeof(GUID)); + else + memset(&entries[i].object, 0, sizeof(entries[i].object)); + memcpy(entries[i].annotation, Annotation, min(len + 1, ept_max_annotation_size)); + } + } + + if (status == RPC_S_OK) + { + while (TRUE) + { + __TRY + { + ept_insert(handle, BindingVector->Count * (UuidVector ? UuidVector->Count : 1), + entries, TRUE, &status2); + } + __EXCEPT(rpc_filter) + { + status2 = GetExceptionCode(); + } + __ENDTRY + if (status2 == RPC_S_SERVER_UNAVAILABLE && + is_epm_destination_local(handle)) + { + if (start_rpcss()) + continue; + } + if (status2 != RPC_S_OK) + ERR("ept_insert failed with error %d\n", status2); + status = status2; /* FIXME: convert status? */ + break; + } + } + RpcBindingFree(&handle); + + for (i = 0; i < BindingVector->Count; i++) + { + unsigned j; + for (j = 0; j < (UuidVector ? UuidVector->Count : 1); j++) + I_RpcFree(entries[i*(UuidVector ? UuidVector->Count : 1) + j].tower); + } + + HeapFree(GetProcessHeap(), 0, entries); + + return status; }
/*********************************************************************** @@ -142,68 +286,85 @@ RPC_STATUS WINAPI RpcEpUnregister( RPC_IF_HANDLE IfSpec, RPC_BINDING_VECTOR *BindingVector, UUID_VECTOR *UuidVector ) { - RPCSS_NP_MESSAGE msg; - RPCSS_NP_REPLY reply; - char *vardata_payload, *vp; PRPC_SERVER_INTERFACE If = (PRPC_SERVER_INTERFACE)IfSpec; - unsigned long c; - RPC_STATUS rslt = RPC_S_OK; + unsigned long i; + RPC_STATUS status = RPC_S_OK; + error_status_t status2; + ept_entry_t *entries; + handle_t handle;
TRACE("(%p,%p,%p)\n", IfSpec, BindingVector, UuidVector); TRACE(" ifid=%s\n", debugstr_guid(&If->InterfaceId.SyntaxGUID)); - for (c=0; c<BindingVector->Count; c++) { - RpcBinding* bind = (RpcBinding*)(BindingVector->BindingH[c]); - TRACE(" protseq[%ld]=%s\n", c, debugstr_a(bind->Protseq)); - TRACE(" endpoint[%ld]=%s\n", c, debugstr_a(bind->Endpoint)); + for (i=0; i<BindingVector->Count; i++) { + RpcBinding* bind = (RpcBinding*)(BindingVector->BindingH[i]); + TRACE(" protseq[%ld]=%s\n", i, debugstr_a(bind->Protseq)); + TRACE(" endpoint[%ld]=%s\n", i, debugstr_a(bind->Endpoint)); } if (UuidVector) { - for (c=0; c<UuidVector->Count; c++) - TRACE(" obj[%ld]=%s\n", c, debugstr_guid(UuidVector->Uuid[c])); - } - - /* construct the message to rpcss */ - msg.message_type = RPCSS_NP_MESSAGE_TYPEID_UNREGISTEREPMSG; - msg.message.unregisterepmsg.iface = If->InterfaceId; - - msg.message.unregisterepmsg.object_count = (UuidVector) ? UuidVector->Count : 0; - msg.message.unregisterepmsg.binding_count = BindingVector->Count; - - /* calculate vardata payload size */ - msg.vardata_payload_size = msg.message.unregisterepmsg.object_count * sizeof(UUID); - for (c=0; c < msg.message.unregisterepmsg.binding_count; c++) { - RpcBinding *bind = (RpcBinding *)(BindingVector->BindingH[c]); - msg.vardata_payload_size += strlen(bind->Protseq) + 1; - msg.vardata_payload_size += strlen(bind->Endpoint) + 1; - } - - /* allocate the payload buffer */ - vp = vardata_payload = LocalAlloc(LPTR, msg.vardata_payload_size); - if (!vardata_payload) - return RPC_S_OUT_OF_MEMORY; - - /* populate the payload data */ - for (c=0; c < msg.message.unregisterepmsg.object_count; c++) { - CopyMemory(vp, UuidVector->Uuid[c], sizeof(UUID)); - vp += sizeof(UUID); - } - - for (c=0; c < msg.message.unregisterepmsg.binding_count; c++) { - RpcBinding *bind = (RpcBinding*)(BindingVector->BindingH[c]); - unsigned long pslen = strlen(bind->Protseq) + 1, eplen = strlen(bind->Endpoint) + 1; - CopyMemory(vp, bind->Protseq, pslen); - vp += pslen; - CopyMemory(vp, bind->Endpoint, eplen); - vp += eplen; - } - - /* send our request */ - if (!RPCRT4_RPCSSOnDemandCall(&msg, vardata_payload, &reply)) - rslt = RPC_S_OUT_OF_MEMORY; - - /* free the payload buffer */ - LocalFree(vardata_payload); - - return rslt; + for (i=0; i<UuidVector->Count; i++) + TRACE(" obj[%ld]=%s\n", i, debugstr_guid(UuidVector->Uuid[i])); + } + + entries = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*entries) * BindingVector->Count * (UuidVector ? UuidVector->Count : 1)); + if (!entries) + return RPC_S_OUT_OF_MEMORY; + + status = get_epm_handle_server(&handle); + if (status != RPC_S_OK) + { + HeapFree(GetProcessHeap(), 0, entries); + return status; + } + + for (i = 0; i < BindingVector->Count; i++) + { + unsigned j; + RpcBinding* bind = (RpcBinding*)(BindingVector->BindingH[i]); + for (j = 0; j < (UuidVector ? UuidVector->Count : 1); j++) + { + status = TowerConstruct(&If->InterfaceId, &If->TransferSyntax, + bind->Protseq, bind->Endpoint, + bind->NetworkAddr, + &entries[i*(UuidVector ? UuidVector->Count : 1) + j].tower); + if (status != RPC_S_OK) break; + + if (UuidVector) + memcpy(&entries[i * UuidVector->Count + j].object, &UuidVector->Uuid[j], sizeof(GUID)); + else + memset(&entries[i].object, 0, sizeof(entries[i].object)); + } + } + + if (status == RPC_S_OK) + { + __TRY + { + ept_insert(handle, BindingVector->Count * (UuidVector ? UuidVector->Count : 1), + entries, TRUE, &status2); + } + __EXCEPT(rpc_filter) + { + status2 = GetExceptionCode(); + } + __ENDTRY + if (status2 == RPC_S_SERVER_UNAVAILABLE) + status2 = EPT_S_NOT_REGISTERED; + if (status2 != RPC_S_OK) + ERR("ept_insert failed with error %d\n", status2); + status = status2; /* FIXME: convert status? */ + } + RpcBindingFree(&handle); + + for (i = 0; i < BindingVector->Count; i++) + { + unsigned j; + for (j = 0; j < (UuidVector ? UuidVector->Count : 1); j++) + I_RpcFree(entries[i*(UuidVector ? UuidVector->Count : 1) + j].tower); + } + + HeapFree(GetProcessHeap(), 0, entries); + + return status; }
/*********************************************************************** @@ -211,50 +372,96 @@ */ RPC_STATUS WINAPI RpcEpResolveBinding( RPC_BINDING_HANDLE Binding, RPC_IF_HANDLE IfSpec ) { - RPCSS_NP_MESSAGE msg; - RPCSS_NP_REPLY reply; PRPC_CLIENT_INTERFACE If = (PRPC_CLIENT_INTERFACE)IfSpec; RpcBinding* bind = (RpcBinding*)Binding; + RPC_STATUS status; + error_status_t status2; + handle_t handle; + ept_lookup_handle_t entry_handle = NULL; + twr_t *tower; + twr_t *towers[4] = { NULL }; + unsigned32 num_towers, i; + GUID uuid = GUID_NULL; + char *resolved_endpoint = NULL;
TRACE("(%p,%p)\n", Binding, IfSpec); TRACE(" protseq=%s\n", debugstr_a(bind->Protseq)); TRACE(" obj=%s\n", debugstr_guid(&bind->ObjectUuid)); + TRACE(" networkaddr=%s\n", debugstr_a(bind->NetworkAddr)); TRACE(" ifid=%s\n", debugstr_guid(&If->InterfaceId.SyntaxGUID)); - - /* FIXME: totally untested */
/* just return for fully bound handles */ if (bind->Endpoint && (bind->Endpoint[0] != '\0')) return RPC_S_OK;
- /* construct the message to rpcss */ - msg.message_type = RPCSS_NP_MESSAGE_TYPEID_RESOLVEEPMSG; - msg.message.resolveepmsg.iface = If->InterfaceId; - msg.message.resolveepmsg.object = bind->ObjectUuid; - - msg.vardata_payload_size = strlen(bind->Protseq) + 1; - - /* send the message */ - if (!RPCRT4_RPCSSOnDemandCall(&msg, bind->Protseq, &reply)) - return RPC_S_OUT_OF_MEMORY; - - /* empty-string result means not registered */ - if (reply.as_string[0] == '\0') - return EPT_S_NOT_REGISTERED; + status = get_epm_handle_client(Binding, &handle); + if (status != RPC_S_OK) return status;
- /* otherwise we fully bind the handle & return RPC_S_OK */ - return RPCRT4_ResolveBinding(Binding, reply.as_string); -} - -typedef unsigned int unsigned32; -typedef struct twr_t - { - unsigned32 tower_length; - /* [size_is] */ BYTE tower_octet_string[ 1 ]; - } twr_t; - -/*********************************************************************** - * TowerExplode (RPCRT4.@) + status = TowerConstruct(&If->InterfaceId, &If->TransferSyntax, bind->Protseq, + ((RpcBinding *)handle)->Endpoint, + bind->NetworkAddr, &tower); + if (status != RPC_S_OK) + { + WARN("couldn't get tower\n"); + RpcBindingFree(&handle); + return status; + } + + while (TRUE) + { + __TRY + { + ept_map(handle, &uuid, tower, &entry_handle, sizeof(towers)/sizeof(towers[0]), &num_towers, towers, &status2); + /* FIXME: translate status2? */ + } + __EXCEPT(rpc_filter) + { + status2 = GetExceptionCode(); + } + __ENDTRY + if (status2 == RPC_S_SERVER_UNAVAILABLE && + is_epm_destination_local(handle)) + { + if (start_rpcss()) + continue; + } + break; + }; + + RpcBindingFree(&handle); + I_RpcFree(tower); + + if (status2 != RPC_S_OK) + { + ERR("ept_map failed for ifid %s, protseq %s, networkaddr %s\n", debugstr_guid(&If->TransferSyntax.SyntaxGUID), bind->Protseq, bind->NetworkAddr); + return status2; + } + + for (i = 0; i < num_towers; i++) + { + /* only parse the tower if we haven't already found a suitable + * endpoint, otherwise just free the tower */ + if (!resolved_endpoint) + { + status = TowerExplode(towers[i], NULL, NULL, NULL, &resolved_endpoint, NULL); + TRACE("status = %ld\n", status); + } + I_RpcFree(towers[i]); + } + + if (resolved_endpoint) + { + RPCRT4_ResolveBinding(Binding, resolved_endpoint); + I_RpcFree(resolved_endpoint); + return RPC_S_OK; + } + + WARN("couldn't find an endpoint\n"); + return EPT_S_NOT_REGISTERED; +} + +/***************************************************************************** + * TowerExplode (RPCRT4.@) */ RPC_STATUS WINAPI TowerExplode( const twr_t *tower, PRPC_SYNTAX_IDENTIFIER object, PRPC_SYNTAX_IDENTIFIER syntax, @@ -388,3 +595,13 @@ } return RPC_S_OK; } + +void __RPC_FAR * __RPC_USER MIDL_user_allocate(size_t len) +{ + return HeapAlloc(GetProcessHeap(), 0, len); +} + +void __RPC_USER MIDL_user_free(void __RPC_FAR * ptr) +{ + HeapFree(GetProcessHeap(), 0, ptr); +}
Modified: trunk/reactos/dll/win32/rpcrt4/rpc_message.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/rpcrt4/rpc_messag... ============================================================================== --- trunk/reactos/dll/win32/rpcrt4/rpc_message.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/rpcrt4/rpc_message.c [iso-8859-1] Thu Nov 6 11:35:54 2008 @@ -1,7 +1,7 @@ /* * RPC messages * - * Copyright 2001-2002 Ove Kåven, TransGaming Technologies + * Copyright 2001-2002 Ove KÃ¥ven, TransGaming Technologies * Copyright 2004 Filip Navara * Copyright 2006 CodeWeavers * @@ -1005,7 +1005,10 @@ TRACE("(%p)\n", pMsg);
if (!bind || bind->server) + { + ERR("no binding\n"); return RPC_S_INVALID_BINDING; + }
/* if we already have a connection, we don't need to negotiate again */ if (!pMsg->ReservedForRuntime) @@ -1065,7 +1068,10 @@ TRACE("(%p): BufferLength=%d\n", pMsg, pMsg->BufferLength);
if (!bind) + { + ERR("no binding\n"); return RPC_S_INVALID_BINDING; + }
pMsg->Buffer = I_RpcAllocate(pMsg->BufferLength); TRACE("Buffer=%p\n", pMsg->Buffer); @@ -1118,7 +1124,11 @@
TRACE("(%p) Buffer=%p\n", pMsg, pMsg->Buffer);
- if (!bind) return RPC_S_INVALID_BINDING; + if (!bind) + { + ERR("no binding\n"); + return RPC_S_INVALID_BINDING; + }
if (pMsg->ReservedForRuntime) {
Modified: trunk/reactos/dll/win32/rpcrt4/rpc_message.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/rpcrt4/rpc_messag... ============================================================================== --- trunk/reactos/dll/win32/rpcrt4/rpc_message.h [iso-8859-1] (original) +++ trunk/reactos/dll/win32/rpcrt4/rpc_message.h [iso-8859-1] Thu Nov 6 11:35:54 2008 @@ -21,7 +21,6 @@ #ifndef __WINE_RPC_MESSAGE_H #define __WINE_RPC_MESSAGE_H
-#include "wine/rpcss_shared.h" #include "rpc_defs.h"
typedef unsigned int NCA_STATUS;
Modified: trunk/reactos/dll/win32/rpcrt4/rpc_server.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/rpcrt4/rpc_server... ============================================================================== --- trunk/reactos/dll/win32/rpcrt4/rpc_server.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/rpcrt4/rpc_server.c [iso-8859-1] Thu Nov 6 11:35:54 2008 @@ -1,7 +1,7 @@ /* * RPC server API * - * Copyright 2001 Ove Kåven, TransGaming Technologies + * Copyright 2001 Ove KÃ¥ven, TransGaming Technologies * Copyright 2004 Filip Navara * Copyright 2006-2008 Robert Shearman (for CodeWeavers) * @@ -138,27 +138,22 @@ } LeaveCriticalSection(&server_cs); if (&cif->entry == &server_interfaces) cif = NULL; - TRACE("returning %p for %s\n", cif, debugstr_guid(object)); + TRACE("returning %p for object %s, if_id { %d.%d %s }\n", cif, + debugstr_guid(object), if_id->SyntaxVersion.MajorVersion, + if_id->SyntaxVersion.MinorVersion, debugstr_guid(&if_id->SyntaxGUID)); return cif; }
static void RPCRT4_release_server_interface(RpcServerInterface *sif) { if (!InterlockedDecrement(&sif->CurrentCalls) && - sif->CallsCompletedEvent) { + sif->Delete) { /* sif must have been removed from server_interfaces before * CallsCompletedEvent is set */ - SetEvent(sif->CallsCompletedEvent); + if (sif->CallsCompletedEvent) + SetEvent(sif->CallsCompletedEvent); HeapFree(GetProcessHeap(), 0, sif); } -} - -static WINE_EXCEPTION_FILTER(rpc_filter) -{ - WARN("exception caught with code 0x%08x = %d\n", GetExceptionCode(), GetExceptionCode()); - TRACE("returning failure packet\n"); - /* catch every exception */ - return EXCEPTION_EXECUTE_HANDLER; }
static RPC_STATUS process_bind_packet(RpcConnection *conn, RpcPktBindHdr *hdr, RPC_MESSAGE *msg) @@ -294,7 +289,8 @@ RPCRT4_SetThreadCurrentCallHandle(msg->Handle); __TRY { if (func) func(msg); - } __EXCEPT(rpc_filter) { + } __EXCEPT_ALL { + WARN("exception caught with code 0x%08x = %d\n", GetExceptionCode(), GetExceptionCode()); exception = TRUE; if (GetExceptionCode() == STATUS_ACCESS_VIOLATION) status = ERROR_NOACCESS; @@ -356,7 +352,7 @@ }
/* clean up */ - I_RpcFreeBuffer(msg); + I_RpcFree(msg->Buffer); RPCRT4_FreeHeader(hdr); HeapFree(GetProcessHeap(), 0, msg); } @@ -392,6 +388,7 @@ packet = HeapAlloc(GetProcessHeap(), 0, sizeof(RpcPacket)); if (!packet) { I_RpcFree(msg->Buffer); + RPCRT4_FreeHeader(hdr); HeapFree(GetProcessHeap(), 0, msg); break; } @@ -401,6 +398,7 @@ if (!QueueUserWorkItem(RPCRT4_worker_thread, packet, WT_EXECUTELONGFUNCTION)) { ERR("couldn't queue work item for worker thread, error was %d\n", GetLastError()); I_RpcFree(msg->Buffer); + RPCRT4_FreeHeader(hdr); HeapFree(GetProcessHeap(), 0, msg); HeapFree(GetProcessHeap(), 0, packet); break; @@ -852,7 +850,7 @@ sif = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(RpcServerInterface)); sif->If = If; if (MgrTypeUuid) { - memcpy(&sif->MgrTypeUuid, MgrTypeUuid, sizeof(UUID)); + sif->MgrTypeUuid = *MgrTypeUuid; sif->MgrEpv = MgrEpv; } else { memset(&sif->MgrTypeUuid, 0, sizeof(UUID)); @@ -893,8 +891,10 @@ if ((!IfSpec || !memcmp(&If->InterfaceId, &cif->If->InterfaceId, sizeof(RPC_SYNTAX_IDENTIFIER))) && UuidEqual(MgrTypeUuid, &cif->MgrTypeUuid, &status)) { list_remove(&cif->entry); + TRACE("unregistering cif %p\n", cif); if (cif->CurrentCalls) { completed = FALSE; + cif->Delete = TRUE; if (WaitForCallsToComplete) cif->CallsCompletedEvent = event = CreateEventW(NULL, FALSE, FALSE, NULL); } @@ -984,8 +984,8 @@ return RPC_S_ALREADY_REGISTERED; /* ... otherwise create a new one and add it in. */ map = HeapAlloc(GetProcessHeap(), 0, sizeof(RpcObjTypeMap)); - memcpy(&map->Object, ObjUuid, sizeof(UUID)); - memcpy(&map->Type, TypeUuid, sizeof(UUID)); + map->Object = *ObjUuid; + map->Type = *TypeUuid; map->next = NULL; if (prev) prev->next = map; /* prev is the last map in the linklist */ @@ -1050,13 +1050,11 @@ LeaveCriticalSection(&listen_cs); return RPC_S_NOT_LISTENING; } - - do - { - LeaveCriticalSection(&listen_cs); - + + do { + LeaveCriticalSection(&listen_cs); LIST_FOR_EACH_ENTRY(cps, &protseqs, RpcServerProtseq, entry) - WaitForSingleObject(cps->server_ready_event, INFINITE); + WaitForSingleObject(cps->server_ready_event, INFINITE);
EnterCriticalSection(&listen_cs); } while (!std_listen); @@ -1132,6 +1130,40 @@ }
/*********************************************************************** + * RpcMgmtInqStats (RPCRT4.@) + */ +RPC_STATUS WINAPI RpcMgmtInqStats(RPC_BINDING_HANDLE Binding, RPC_STATS_VECTOR **Statistics) +{ + RPC_STATS_VECTOR *stats; + + FIXME("(%p,%p)\n", Binding, Statistics); + + if ((stats = HeapAlloc(GetProcessHeap(), 0, sizeof(RPC_STATS_VECTOR)))) + { + stats->Count = 1; + stats->Stats[0] = 0; + *Statistics = stats; + return RPC_S_OK; + } + return RPC_S_OUT_OF_RESOURCES; +} + +/*********************************************************************** + * RpcMgmtStatsVectorFree (RPCRT4.@) + */ +RPC_STATUS WINAPI RpcMgmtStatsVectorFree(RPC_STATS_VECTOR **StatsVector) +{ + FIXME("(%p)\n", StatsVector); + + if (StatsVector) + { + HeapFree(GetProcessHeap(), 0, *StatsVector); + *StatsVector = NULL; + } + return RPC_S_OK; +} + +/*********************************************************************** * RpcMgmtEpEltInqBegin (RPCRT4.@) */ RPC_STATUS WINAPI RpcMgmtEpEltInqBegin(RPC_BINDING_HANDLE Binding, ULONG InquiryType,
Modified: trunk/reactos/dll/win32/rpcrt4/rpc_server.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/rpcrt4/rpc_server... ============================================================================== --- trunk/reactos/dll/win32/rpcrt4/rpc_server.h [iso-8859-1] (original) +++ trunk/reactos/dll/win32/rpcrt4/rpc_server.h [iso-8859-1] Thu Nov 6 11:35:54 2008 @@ -1,7 +1,7 @@ /* * RPC server API * - * Copyright 2001 Ove Kåven, TransGaming Technologies + * Copyright 2001 Ove KÃ¥ven, TransGaming Technologies * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -73,6 +73,7 @@ /* set when unregistering interface to let the caller of * RpcServerUnregisterIf* know that all calls have finished */ HANDLE CallsCompletedEvent; + BOOL Delete; /* delete when the last call finishes */ } RpcServerInterface;
void RPCRT4_new_client(RpcConnection* conn);
Modified: trunk/reactos/dll/win32/rpcrt4/rpc_transport.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/rpcrt4/rpc_transp... ============================================================================== --- trunk/reactos/dll/win32/rpcrt4/rpc_transport.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/rpcrt4/rpc_transport.c [iso-8859-1] Thu Nov 6 11:35:54 2008 @@ -1,7 +1,7 @@ /* * RPC transport layer * - * Copyright 2001 Ove Kåven, TransGaming Technologies + * Copyright 2001 Ove KÃ¥ven, TransGaming Technologies * Copyright 2003 Mike Hearn * Copyright 2004 Filip Navara * Copyright 2006 Mike McCormack @@ -29,32 +29,43 @@ #include <stdio.h> #include <string.h> #include <assert.h> -#include <errno.h> - -#ifdef HAVE_UNISTD_H -# include <unistd.h> -#endif -#include <fcntl.h> #include <stdlib.h> #include <sys/types.h> -#ifdef HAVE_SYS_SOCKET_H -# include <sys/socket.h> -#endif -#ifdef HAVE_NETINET_IN_H -# include <netinet/in.h> -#endif -#ifdef HAVE_NETINET_TCP_H -# include <netinet/tcp.h> -#endif -#ifdef HAVE_ARPA_INET_H -# include <arpa/inet.h> -#endif -#ifdef HAVE_NETDB_H -#include <netdb.h> -#endif -#ifdef HAVE_SYS_POLL_H -#include <sys/poll.h> -#endif + +#if defined(__MINGW32__) || defined (_MSC_VER) +# include <ws2tcpip.h> +# ifndef EADDRINUSE +# define EADDRINUSE WSAEADDRINUSE +# endif +# ifndef EAGAIN +# define EAGAIN WSAEWOULDBLOCK +# endif +#else +# include <errno.h> +# ifdef HAVE_UNISTD_H +# include <unistd.h> +# endif +# include <fcntl.h> +# ifdef HAVE_SYS_SOCKET_H +# include <sys/socket.h> +# endif +# ifdef HAVE_NETINET_IN_H +# include <netinet/in.h> +# endif +# ifdef HAVE_NETINET_TCP_H +# include <netinet/tcp.h> +# endif +# ifdef HAVE_ARPA_INET_H +# include <arpa/inet.h> +# endif +# ifdef HAVE_NETDB_H +# include <netdb.h> +# endif +# ifdef HAVE_SYS_POLL_H +# include <sys/poll.h> +# endif +# define closesocket close +#endif /* defined(__MINGW32__) || defined (_MSC_VER) */
#include <winsock2.h> #include <ws2tcpip.h> @@ -112,20 +123,29 @@ return RPC_S_OK;
npc->listening = TRUE; - if (ConnectNamedPipe(npc->pipe, &npc->ovl[0])) - return RPC_S_OK; - - if (GetLastError() == ERROR_PIPE_CONNECTED) { - SetEvent(npc->ovl[0].hEvent); - return RPC_S_OK; + for (;;) + { + if (ConnectNamedPipe(npc->pipe, &npc->ovl[0])) + return RPC_S_OK; + + switch(GetLastError()) + { + case ERROR_PIPE_CONNECTED: + SetEvent(npc->ovl[0].hEvent); + return RPC_S_OK; + case ERROR_IO_PENDING: + /* will be completed in rpcrt4_protseq_np_wait_for_new_connection */ + return RPC_S_OK; + case ERROR_NO_DATA_DETECTED: + /* client has disconnected, retry */ + DisconnectNamedPipe( npc->pipe ); + break; + default: + npc->listening = FALSE; + WARN("Couldn't ConnectNamedPipe (error was %d)\n", GetLastError()); + return RPC_S_OUT_OF_RESOURCES; + } } - if (GetLastError() == ERROR_IO_PENDING) { - /* will be completed in rpcrt4_protseq_np_wait_for_new_connection */ - return RPC_S_OK; - } - npc->listening = FALSE; - WARN("Couldn't ConnectNamedPipe (error was %d)\n", GetLastError()); - return RPC_S_OUT_OF_RESOURCES; }
static RPC_STATUS rpcrt4_conn_create_pipe(RpcConnection *Connection, LPCSTR pname) @@ -196,9 +216,7 @@ TRACE("connection failed, error=%x\n", err); return RPC_S_SERVER_TOO_BUSY; } - if (!wait) - return RPC_S_SERVER_UNAVAILABLE; - if (!WaitNamedPipeA(pname, NMPWAIT_WAIT_FOREVER)) { + if (!wait || !WaitNamedPipeA(pname, NMPWAIT_WAIT_FOREVER)) { err = GetLastError(); WARN("connection failed, error=%x\n", err); return RPC_S_SERVER_UNAVAILABLE; @@ -212,7 +230,6 @@ SetNamedPipeHandleState(pipe, &dwMode, NULL, NULL); npc->ovl[0].hEvent = CreateEventW(NULL, TRUE, FALSE, NULL); npc->ovl[1].hEvent = CreateEventW(NULL, TRUE, FALSE, NULL); - npc->pipe = pipe;
return RPC_S_OK; @@ -375,7 +392,7 @@ break;
ret = GetOverlappedResult(npc->pipe, &npc->ovl[0], &bytes_read, TRUE); - if (!ret && GetLastError() != ERROR_MORE_DATA) + if (!ret && (GetLastError() != ERROR_MORE_DATA)) break;
bytes_left -= bytes_read; @@ -395,12 +412,12 @@ while (bytes_left) { DWORD bytes_written; - ret = WriteFile(npc->pipe, buf, count, &bytes_written, &npc->ovl[1]); + ret = WriteFile(npc->pipe, buf, bytes_left, &bytes_written, &npc->ovl[1]); if ((!ret || !bytes_written) && (GetLastError() != ERROR_IO_PENDING)) break;
ret = GetOverlappedResult(npc->pipe, &npc->ovl[1], &bytes_written, TRUE); - if (!ret && GetLastError() != ERROR_MORE_DATA) + if (!ret && (GetLastError() != ERROR_MORE_DATA)) break;
bytes_left -= bytes_written; @@ -425,7 +442,6 @@ CloseHandle(npc->ovl[1].hEvent); npc->ovl[1].hEvent = 0; } - return 0; }
@@ -508,7 +524,8 @@
if ((smb_floor->count_lhs != sizeof(smb_floor->protid)) || (smb_floor->protid != EPM_PROTOCOL_SMB) || - (smb_floor->count_rhs > tower_size)) + (smb_floor->count_rhs > tower_size) || + (tower_data[smb_floor->count_rhs - 1] != '\0')) return EPT_S_NOT_REGISTERED;
if (endpoint) @@ -531,7 +548,8 @@
if ((nb_floor->count_lhs != sizeof(nb_floor->protid)) || (nb_floor->protid != EPM_PROTOCOL_NETBIOS) || - (nb_floor->count_rhs > tower_size)) + (nb_floor->count_rhs > tower_size) || + (tower_data[nb_floor->count_rhs - 1] != '\0')) return EPT_S_NOT_REGISTERED;
if (networkaddr) @@ -681,7 +699,7 @@
TRACE("(%p, %s, %s)\n", tower_data, networkaddr, endpoint);
- endpoint_size = strlen(networkaddr) + 1; + endpoint_size = strlen(endpoint) + 1; size = sizeof(*pipe_floor) + endpoint_size;
if (!tower_data) @@ -692,7 +710,7 @@ tower_data += sizeof(*pipe_floor);
pipe_floor->count_lhs = sizeof(pipe_floor->protid); - pipe_floor->protid = EPM_PROTOCOL_SMB; + pipe_floor->protid = EPM_PROTOCOL_PIPE; pipe_floor->count_rhs = endpoint_size;
memcpy(tower_data, endpoint, endpoint_size); @@ -710,9 +728,6 @@
TRACE("(%p, %d, %p, %p)\n", tower_data, (int)tower_size, networkaddr, endpoint);
- *networkaddr = NULL; - *endpoint = NULL; - if (tower_size < sizeof(*pipe_floor)) return EPT_S_NOT_REGISTERED;
@@ -720,9 +735,13 @@ tower_size -= sizeof(*pipe_floor);
if ((pipe_floor->count_lhs != sizeof(pipe_floor->protid)) || - (pipe_floor->protid != EPM_PROTOCOL_SMB) || - (pipe_floor->count_rhs > tower_size)) + (pipe_floor->protid != EPM_PROTOCOL_PIPE) || + (pipe_floor->count_rhs > tower_size) || + (tower_data[pipe_floor->count_rhs - 1] != '\0')) return EPT_S_NOT_REGISTERED; + + if (networkaddr) + *networkaddr = NULL;
if (endpoint) { @@ -751,14 +770,12 @@ if (tcpc == NULL) return NULL; tcpc->sock = -1; -#ifndef __REACTOS__ if (socketpair(PF_UNIX, SOCK_STREAM, 0, tcpc->cancel_fds) < 0) { ERR("socketpair() failed: %s\n", strerror(errno)); HeapFree(GetProcessHeap(), 0, tcpc); return NULL; } -#endif return &tcpc->common; }
@@ -817,13 +834,14 @@ if (0>connect(sock, ai_cur->ai_addr, ai_cur->ai_addrlen)) { WARN("connect() failed: %s\n", strerror(errno)); - close(sock); + closesocket(sock); continue; }
/* RPC depends on having minimal latency so disable the Nagle algorithm */ val = 1; - setsockopt(sock, SOL_TCP, TCP_NODELAY, (char *)&val, sizeof(val)); + setsockopt(sock, SOL_TCP, TCP_NODELAY, &val, sizeof(val)); + fcntl(sock, F_SETFL, O_NONBLOCK); /* make socket nonblocking */
tcpc->sock = sock;
@@ -845,7 +863,6 @@ struct addrinfo *ai; struct addrinfo *ai_cur; struct addrinfo hints; - u_long blocking; RpcConnection *first_connection = NULL;
TRACE("(%p, %s)\n", protseq, endpoint); @@ -896,8 +913,8 @@ if (ret < 0) { WARN("bind failed: %s\n", strerror(errno)); - close(sock); - if (errno == WSAEADDRINUSE) + closesocket(sock); + if (errno == EADDRINUSE) status = RPC_S_DUPLICATE_ENDPOINT; else status = RPC_S_CANT_CREATE_ENDPOINT; @@ -908,7 +925,7 @@ endpoint, NULL, NULL, NULL); if (create_status != RPC_S_OK) { - close(sock); + closesocket(sock); status = create_status; continue; } @@ -926,8 +943,7 @@ * race-condition (poll() says it is readable, connection drops, * and accept() blocks until the next connection comes...) */ - blocking = 1; - ret = ioctlsocket(sock, FIONBIO, &blocking); + ret = fcntl(sock, F_SETFL, O_NONBLOCK); if (ret < 0) { WARN("couldn't make socket non-blocking, error %d\n", ret); @@ -970,7 +986,6 @@ int ret; struct sockaddr_in address; socklen_t addrsize; - u_long blocking; RpcConnection_tcp *server = (RpcConnection_tcp*) old_conn; RpcConnection_tcp *client = (RpcConnection_tcp*) new_conn;
@@ -982,8 +997,7 @@ return RPC_S_OUT_OF_RESOURCES; } /* reset to blocking behaviour */ - blocking = 0; - ret = ioctlsocket(ret, FIONBIO, &blocking); + fcntl(ret, F_SETFL, 0); client->sock = ret; TRACE("Accepted a new TCP connection\n"); return RPC_S_OK; @@ -1065,7 +1079,7 @@ TRACE("%d\n", tcpc->sock);
if (tcpc->sock != -1) - close(tcpc->sock); + closesocket(tcpc->sock); tcpc->sock = -1; close(tcpc->cancel_fds[0]); close(tcpc->cancel_fds[1]); @@ -1256,12 +1270,10 @@ if (ps) { int fds[2]; - u_long blocking; if (!socketpair(PF_UNIX, SOCK_DGRAM, 0, fds)) { - blocking = 1; - ioctlsocket(fds[0], FIONBIO, &blocking); - ioctlsocket(fds[1], FIONBIO, &blocking); + fcntl(fds[0], F_SETFL, O_NONBLOCK); + fcntl(fds[1], F_SETFL, O_NONBLOCK); ps->mgr_event_rcv = fds[0]; ps->mgr_event_snd = fds[1]; }
Modified: trunk/reactos/dll/win32/rpcrt4/rpcrt4.rbuild URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/rpcrt4/rpcrt4.rbu... ============================================================================== --- trunk/reactos/dll/win32/rpcrt4/rpcrt4.rbuild [iso-8859-1] (original) +++ trunk/reactos/dll/win32/rpcrt4/rpcrt4.rbuild [iso-8859-1] Thu Nov 6 11:35:54 2008 @@ -9,6 +9,7 @@ <define name="MSWMSG" /> <library>wine</library> <library>uuid</library> + <library>rpcrt4_epm_client</library> <library>kernel32</library> <library>user32</library> <library>advapi32</library> @@ -33,9 +34,16 @@ <file>rpc_server.c</file> <file>rpc_transport.c</file> <file>rpcrt4_main.c</file> - <file>rpcss_np_client.c</file> <file>unix_func.c</file> <file>ndr_es.c</file> <file>rpcrt4.rc</file> + <file>epm.idl</file> + <include base="rpcrt4" root="intermediate">.</include> <file>rpcrt4.spec</file> </module> +<module name="rpcrt4_epm_server" type="rpcserver"> + <file>epm.idl</file> +</module> +<module name="rpcrt4_epm_client" type="rpcclient"> + <file>epm.idl</file> +</module>
Modified: trunk/reactos/dll/win32/rpcrt4/rpcrt4.spec URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/rpcrt4/rpcrt4.spe... ============================================================================== --- trunk/reactos/dll/win32/rpcrt4/rpcrt4.spec [iso-8859-1] (original) +++ trunk/reactos/dll/win32/rpcrt4/rpcrt4.spec [iso-8859-1] Thu Nov 6 11:35:54 2008 @@ -99,7 +99,7 @@ @ stub MesBufferHandleReset @ stdcall MesDecodeBufferHandleCreate(ptr long ptr) @ stdcall MesDecodeIncrementalHandleCreate(ptr ptr ptr) -@ stub MesEncodeDynBufferHandleCreate +@ stdcall MesEncodeDynBufferHandleCreate(ptr ptr ptr) @ stdcall MesEncodeFixedBufferHandleCreate(ptr long ptr ptr) @ stdcall MesEncodeIncrementalHandleCreate(ptr ptr ptr ptr) @ stdcall MesHandleFree(ptr) @@ -363,7 +363,7 @@ @ stdcall RpcBindingVectorFree(ptr) @ stdcall RpcCancelAsyncCall(ptr long) RpcAsyncCancelCall @ stdcall RpcCancelThread(ptr) -@ stub RpcCancelThreadEx +@ stdcall RpcCancelThreadEx(ptr long) @ stub RpcCertGeneratePrincipalNameA @ stub RpcCertGeneratePrincipalNameW @ stdcall RpcCompleteAsyncCall(ptr ptr) RpcAsyncCompleteCall @@ -399,13 +399,13 @@ @ stdcall RpcMgmtInqIfIds(ptr ptr) @ stub RpcMgmtInqServerPrincNameA @ stub RpcMgmtInqServerPrincNameW -@ stub RpcMgmtInqStats +@ stdcall RpcMgmtInqStats(ptr ptr) @ stdcall RpcMgmtIsServerListening(ptr) @ stub RpcMgmtSetAuthorizationFn @ stdcall RpcMgmtSetCancelTimeout(long) @ stdcall RpcMgmtSetComTimeout(ptr long) @ stdcall RpcMgmtSetServerStackSize(long) -@ stub RpcMgmtStatsVectorFree +@ stdcall RpcMgmtStatsVectorFree(ptr) @ stdcall RpcMgmtStopServerListening(ptr) @ stdcall RpcMgmtWaitServerListen() @ stub RpcNetworkInqProtseqsA
Modified: trunk/reactos/dll/win32/rpcrt4/rpcrt4_main.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/rpcrt4/rpcrt4_mai... ============================================================================== --- trunk/reactos/dll/win32/rpcrt4/rpcrt4_main.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/rpcrt4/rpcrt4_main.c [iso-8859-1] Thu Nov 6 11:35:54 2008 @@ -53,19 +53,12 @@ #include "rpcproxy.h"
#include "rpc_binding.h" -#include "rpcss_np_client.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(rpc);
static UUID uuid_nil; -static HANDLE master_mutex; - -HANDLE RPCRT4_GetMasterMutex(void) -{ - return master_mutex; -}
static CRITICAL_SECTION uuid_cs; static CRITICAL_SECTION_DEBUG critsect_debug = @@ -122,9 +115,6 @@
switch (fdwReason) { case DLL_PROCESS_ATTACH: - master_mutex = CreateMutexA( NULL, FALSE, RPCSS_MASTER_MUTEX_NAME); - if (!master_mutex) - ERR("Failed to create master mutex\n"); break;
case DLL_THREAD_DETACH: @@ -145,8 +135,6 @@ break;
case DLL_PROCESS_DETACH: - CloseHandle(master_mutex); - master_mutex = NULL; break; }
@@ -265,7 +253,7 @@ * * PARAMS * UUID *Uuid [I] Uuid to compare - * RPC_STATUS *Status [O] retuns RPC_S_OK + * RPC_STATUS *Status [O] returns RPC_S_OK * * RETURNS * TRUE/FALSE @@ -643,102 +631,6 @@ { FIXME( "(): stub\n" ); return S_OK; -} - -static BOOL RPCRT4_StartRPCSS(void) -{ - PROCESS_INFORMATION pi; - STARTUPINFOA si; - static char cmd[6]; - BOOL rslt; - - ZeroMemory(&pi, sizeof(PROCESS_INFORMATION)); - ZeroMemory(&si, sizeof(STARTUPINFOA)); - si.cb = sizeof(STARTUPINFOA); - - /* apparently it's not OK to use a constant string below */ - CopyMemory(cmd, "rpcss", 6); - - /* FIXME: will this do the right thing when run as a test? */ - rslt = CreateProcessA( - NULL, /* executable */ - cmd, /* command line */ - NULL, /* process security attributes */ - NULL, /* primary thread security attributes */ - FALSE, /* inherit handles */ - 0, /* creation flags */ - NULL, /* use parent's environment */ - NULL, /* use parent's current directory */ - &si, /* STARTUPINFO pointer */ - &pi /* PROCESS_INFORMATION */ - ); - - if (rslt) { - CloseHandle(pi.hProcess); - CloseHandle(pi.hThread); - } - - return rslt; -} - -/*********************************************************************** - * RPCRT4_RPCSSOnDemandCall (internal) - * - * Attempts to send a message to the RPCSS process - * on the local machine, invoking it if necessary. - * For remote RPCSS calls, use.... your imagination. - * - * PARAMS - * msg [I] pointer to the RPCSS message - * vardata_payload [I] pointer vardata portion of the RPCSS message - * reply [O] pointer to reply structure - * - * RETURNS - * TRUE if successful - * FALSE otherwise - */ -BOOL RPCRT4_RPCSSOnDemandCall(PRPCSS_NP_MESSAGE msg, char *vardata_payload, PRPCSS_NP_REPLY reply) -{ - HANDLE client_handle; - BOOL ret; - int i, j = 0; - - TRACE("(msg == %p, vardata_payload == %p, reply == %p)\n", msg, vardata_payload, reply); - - client_handle = RPCRT4_RpcssNPConnect(); - - while (INVALID_HANDLE_VALUE == client_handle) { - /* start the RPCSS process */ - if (!RPCRT4_StartRPCSS()) { - ERR("Unable to start RPCSS process.\n"); - return FALSE; - } - /* wait for a connection (w/ periodic polling) */ - for (i = 0; i < 60; i++) { - Sleep(200); - client_handle = RPCRT4_RpcssNPConnect(); - if (INVALID_HANDLE_VALUE != client_handle) break; - } - /* we are only willing to try twice */ - if (j++ >= 1) break; - } - - if (INVALID_HANDLE_VALUE == client_handle) { - /* no dice! */ - ERR("Unable to connect to RPCSS process!\n"); - SetLastError(RPC_E_SERVER_DIED_DNE); - return FALSE; - } - - /* great, we're connected. now send the message */ - ret = TRUE; - if (!RPCRT4_SendReceiveNPMsg(client_handle, msg, vardata_payload, reply)) { - ERR("Something is amiss: RPC_SendReceive failed.\n"); - ret = FALSE; - } - CloseHandle(client_handle); - - return ret; }
#define MAX_RPC_ERROR_TEXT 256 @@ -1076,19 +968,9 @@ return context_handle; }
-/****************************************************************************** - * RpcCancelThread (rpcrt4.@) - */ -RPC_STATUS RPC_ENTRY RpcCancelThread(void* ThreadHandle) -{ - DWORD target_tid; +static RPC_STATUS rpc_cancel_thread(DWORD target_tid) +{ struct threaddata *tdata; - - TRACE("(%p)\n", ThreadHandle); - - target_tid = GetThreadId(ThreadHandle); - if (!target_tid) - return RPC_S_INVALID_ARG;
EnterCriticalSection(&threaddata_cs); LIST_FOR_EACH_ENTRY(tdata, &threaddata_list, struct threaddata, entry) @@ -1103,3 +985,34 @@
return RPC_S_OK; } + +/****************************************************************************** + * RpcCancelThread (rpcrt4.@) + */ +RPC_STATUS RPC_ENTRY RpcCancelThread(void* ThreadHandle) +{ + TRACE("(%p)\n", ThreadHandle); + return RpcCancelThreadEx(ThreadHandle, 0); +} + +/****************************************************************************** + * RpcCancelThreadEx (rpcrt4.@) + */ +RPC_STATUS RPC_ENTRY RpcCancelThreadEx(void* ThreadHandle, LONG Timeout) +{ + DWORD target_tid; + + FIXME("(%p, %d)\n", ThreadHandle, Timeout); + + target_tid = GetThreadId(ThreadHandle); + if (!target_tid) + return RPC_S_INVALID_ARG; + + if (Timeout) + { + FIXME("(%p, %d)\n", ThreadHandle, Timeout); + return RPC_S_OK; + } + else + return rpc_cancel_thread(target_tid); +}
Removed: trunk/reactos/dll/win32/rpcrt4/rpcss_np_client.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/rpcrt4/rpcss_np_c... ============================================================================== --- trunk/reactos/dll/win32/rpcrt4/rpcss_np_client.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/rpcrt4/rpcss_np_client.c (removed) @@ -1,152 +1,0 @@ -/* - * RPCSS named pipe client implementation - * - * Copyright (C) 2002 Greg Turner - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#include <assert.h> -#include <stdarg.h> - -#include "windef.h" -#include "winbase.h" -#include "wine/rpcss_shared.h" -#include "wine/debug.h" - -#include "rpc_binding.h" - -WINE_DEFAULT_DEBUG_CHANNEL(ole); - -HANDLE RPCRT4_RpcssNPConnect(void) -{ - HANDLE the_pipe; - DWORD dwmode, wait_result; - HANDLE master_mutex = RPCRT4_GetMasterMutex(); - - TRACE("\n"); - - while (TRUE) { - - wait_result = WaitForSingleObject(master_mutex, MASTER_MUTEX_TIMEOUT); - switch (wait_result) { - case WAIT_ABANDONED: - case WAIT_OBJECT_0: - break; - case WAIT_FAILED: - case WAIT_TIMEOUT: - default: - ERR("This should never happen: couldn't enter mutex.\n"); - return NULL; - } - - /* try to open the client side of the named pipe. */ - the_pipe = CreateFileA( - NAME_RPCSS_NAMED_PIPE, /* pipe name */ - GENERIC_READ | GENERIC_WRITE, /* r/w access */ - 0, /* no sharing */ - NULL, /* no security attributes */ - OPEN_EXISTING, /* open an existing pipe */ - 0, /* default attributes */ - NULL /* no template file */ - ); - - if (the_pipe != INVALID_HANDLE_VALUE) - break; - - if (GetLastError() != ERROR_PIPE_BUSY) { - WARN("Unable to open named pipe %s (assuming unavailable).\n", - debugstr_a(NAME_RPCSS_NAMED_PIPE)); - break; - } - - WARN("Named pipe busy (will wait)\n"); - - if (!ReleaseMutex(master_mutex)) - ERR("Failed to release master mutex. Expect deadlock.\n"); - - /* wait for the named pipe. We are only willing to wait for 5 seconds. - It should be available /very/ soon. */ - if (! WaitNamedPipeA(NAME_RPCSS_NAMED_PIPE, MASTER_MUTEX_WAITNAMEDPIPE_TIMEOUT)) - { - ERR("Named pipe unavailable after waiting. Something is probably wrong.\n"); - break; - } - - } - - if (the_pipe != INVALID_HANDLE_VALUE) { - dwmode = PIPE_READMODE_MESSAGE; - /* SetNamedPipeHandleState not implemented ATM, but still seems to work somehow. */ - if (! SetNamedPipeHandleState(the_pipe, &dwmode, NULL, NULL)) - WARN("Failed to set pipe handle state\n"); - } - - if (!ReleaseMutex(master_mutex)) - ERR("Uh oh, failed to leave the RPC Master Mutex!\n"); - - return the_pipe; -} - -BOOL RPCRT4_SendReceiveNPMsg(HANDLE np, PRPCSS_NP_MESSAGE msg, char *vardata, PRPCSS_NP_REPLY reply) -{ - DWORD count; - UINT32 payload_offset; - RPCSS_NP_MESSAGE vardata_payload_msg; - - TRACE("(np == %p, msg == %p, vardata == %p, reply == %p)\n", - np, msg, vardata, reply); - - if (! WriteFile(np, msg, sizeof(RPCSS_NP_MESSAGE), &count, NULL)) { - ERR("write failed.\n"); - return FALSE; - } - - if (count != sizeof(RPCSS_NP_MESSAGE)) { - ERR("write count mismatch.\n"); - return FALSE; - } - - /* process the vardata payload if necessary */ - vardata_payload_msg.message_type = RPCSS_NP_MESSAGE_TYPEID_VARDATAPAYLOADMSG; - vardata_payload_msg.vardata_payload_size = 0; /* meaningless */ - for ( payload_offset = 0; payload_offset < msg->vardata_payload_size; - payload_offset += VARDATA_PAYLOAD_BYTES ) { - TRACE("sending vardata payload. vd=%p, po=%d, ps=%d\n", vardata, - payload_offset, msg->vardata_payload_size); - ZeroMemory(vardata_payload_msg.message.vardatapayloadmsg.payload, VARDATA_PAYLOAD_BYTES); - CopyMemory(vardata_payload_msg.message.vardatapayloadmsg.payload, - vardata, - min( VARDATA_PAYLOAD_BYTES, msg->vardata_payload_size - payload_offset )); - vardata += VARDATA_PAYLOAD_BYTES; - if (! WriteFile(np, &vardata_payload_msg, sizeof(RPCSS_NP_MESSAGE), &count, NULL)) { - ERR("vardata write failed at %u bytes.\n", payload_offset); - return FALSE; - } - } - - if (! ReadFile(np, reply, sizeof(RPCSS_NP_REPLY), &count, NULL)) { - ERR("read failed.\n"); - return FALSE; - } - - if (count != sizeof(RPCSS_NP_REPLY)) { - ERR("read count mismatch. got %d.\n", count); - return FALSE; - } - - /* message execution was successful */ - return TRUE; -}
Removed: trunk/reactos/dll/win32/rpcrt4/rpcss_np_client.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/rpcrt4/rpcss_np_c... ============================================================================== --- trunk/reactos/dll/win32/rpcrt4/rpcss_np_client.h [iso-8859-1] (original) +++ trunk/reactos/dll/win32/rpcrt4/rpcss_np_client.h (removed) @@ -1,26 +1,0 @@ -/* - * Copyright (C) 2002 Greg Turner - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#ifndef __WINE_RPCSS_NP_CLIENT_H -#define __WINE_RPCSS_NP_CLIENT_H - -/* rpcss_np_client.c */ -HANDLE RPC_RpcssNPConnect(void); -BOOL RPCRT4_SendReceiveNPMsg(HANDLE, PRPCSS_NP_MESSAGE, char *, PRPCSS_NP_REPLY); - -#endif /* __RPCSS_NP_CLINET_H */
Modified: trunk/reactos/dll/win32/rpcrt4/unix_func.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/rpcrt4/unix_func.... ============================================================================== --- trunk/reactos/dll/win32/rpcrt4/unix_func.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/rpcrt4/unix_func.c [iso-8859-1] Thu Nov 6 11:35:54 2008 @@ -167,3 +167,11 @@
return 0; } + +int fcntl(int fd, + int cmd, + long arg) +{ + // Stub + return 0; +}
Modified: trunk/reactos/dll/win32/rpcrt4/unix_func.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/rpcrt4/unix_func.... ============================================================================== --- trunk/reactos/dll/win32/rpcrt4/unix_func.h [iso-8859-1] (original) +++ trunk/reactos/dll/win32/rpcrt4/unix_func.h [iso-8859-1] Thu Nov 6 11:35:54 2008 @@ -14,6 +14,15 @@ short revents; /* returned events */ };
+#define F_SETFL 4 /* set file->f_flags */ + +#ifndef O_NONBLOCK +#define O_NONBLOCK 00004000 +#endif + +#define EINTR 4 /* Interrupted system call */ + int poll(struct pollfd *fds, unsigned long nfds, int timo); int socketpair (int af, int type, int protocol, SOCKET socket[2]); const char * inet_ntop (int af, const void *src, char *dst, size_t cnt); +int fcntl(int fd, int cmd, long arg);
Modified: trunk/reactos/include/psdk/rpcdce.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/include/psdk/rpcdce.h?rev=3... ============================================================================== --- trunk/reactos/include/psdk/rpcdce.h [iso-8859-1] (original) +++ trunk/reactos/include/psdk/rpcdce.h [iso-8859-1] Thu Nov 6 11:35:54 2008 @@ -79,6 +79,12 @@ RPC_IF_ID *IfId[1]; } RPC_IF_ID_VECTOR;
+typedef struct +{ + unsigned int Count; + unsigned long Stats[1]; +} RPC_STATS_VECTOR; + typedef I_RPC_HANDLE *RPC_EP_INQ_HANDLE;
#define RPC_C_EP_ALL_ELTS 0
Modified: trunk/reactos/include/psdk/rpcndr.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/include/psdk/rpcndr.h?rev=3... ============================================================================== --- trunk/reactos/include/psdk/rpcndr.h [iso-8859-1] (original) +++ trunk/reactos/include/psdk/rpcndr.h [iso-8859-1] Thu Nov 6 11:35:54 2008 @@ -114,6 +114,12 @@ #define NdrFcShort(s) (unsigned char)(s & 0xff), (unsigned char)(s >> 8) #define NdrFcLong(s) (unsigned char)(s & 0xff), (unsigned char)((s & 0x0000ff00) >> 8), \ (unsigned char)((s & 0x00ff0000) >> 16), (unsigned char)(s >> 24) + +#define RPC_BAD_STUB_DATA_EXCEPTION_FILTER \ + ((RpcExceptionCode() == STATUS_ACCESS_VIOLATION) || \ + (RpcExceptionCode() == STATUS_DATATYPE_MISALIGNMENT) || \ + (RpcExceptionCode() == RPC_X_BAD_STUB_DATA) || \ + (RpcExceptionCode() == RPC_S_INVALID_BOUND))
typedef struct { @@ -189,7 +195,7 @@ ULONG_PTR MaxCount; ULONG Offset; ULONG ActualCount; - void * (__RPC_API *pfnAllocate)(size_t); + void * (__WINE_ALLOC_SIZE(1) __RPC_API *pfnAllocate)(size_t); void (__RPC_API *pfnFree)(void *); unsigned char *StackTop; unsigned char *pPresentedType; @@ -316,7 +322,7 @@
typedef struct _MALLOC_FREE_STRUCT { - void * (__RPC_USER *pfnAllocate)(size_t); + void * (__WINE_ALLOC_SIZE(1) __RPC_USER *pfnAllocate)(size_t); void (__RPC_USER *pfnFree)(void *); } MALLOC_FREE_STRUCT;
@@ -329,7 +335,7 @@ typedef struct _MIDL_STUB_DESC { void *RpcInterfaceInformation; - void * (__RPC_API *pfnAllocate)(size_t); + void * (__WINE_ALLOC_SIZE(1) __RPC_API *pfnAllocate)(size_t); void (__RPC_API *pfnFree)(void *); union { handle_t *pAutoHandle; @@ -468,7 +474,7 @@ { void *Buffer; ULONG BufferSize; - void * (__RPC_API *pfnAllocate)(size_t); + void * (__WINE_ALLOC_SIZE(1) __RPC_API *pfnAllocate)(size_t); void (__RPC_API *pfnFree)(void *); struct IRpcChannelBuffer *pRpcChannelBuffer; ULONG_PTR Reserved[5]; @@ -652,7 +658,7 @@ NdrDcomAsyncStubCall( struct IRpcStubBuffer* pThis, struct IRpcChannelBuffer* pChannel, PRPC_MESSAGE pRpcMsg, DWORD * pdwStubPhase );
RPCRTAPI void* RPC_ENTRY - NdrAllocate( PMIDL_STUB_MESSAGE pStubMsg, size_t Len ); + NdrAllocate( PMIDL_STUB_MESSAGE pStubMsg, SIZE_T Len ) __WINE_ALLOC_SIZE(2);
RPCRTAPI void RPC_ENTRY NdrClearOutParameters( PMIDL_STUB_MESSAGE pStubMsg, PFORMAT_STRING pFormat, void *ArgAddr ); @@ -662,7 +668,7 @@ ULONG *pFaultStatus, RPC_STATUS Status_ );
RPCRTAPI void* RPC_ENTRY - NdrOleAllocate( size_t Size ); + NdrOleAllocate( size_t Size ) __WINE_ALLOC_SIZE(1); RPCRTAPI void RPC_ENTRY NdrOleFree( void* NodeToFree );
@@ -723,11 +729,11 @@ RPCRTAPI void RPC_ENTRY NdrRpcSmSetClientToOsf( PMIDL_STUB_MESSAGE pMessage ); RPCRTAPI void * RPC_ENTRY - NdrRpcSmClientAllocate( size_t Size ); + NdrRpcSmClientAllocate( size_t Size ) __WINE_ALLOC_SIZE(1); RPCRTAPI void RPC_ENTRY NdrRpcSmClientFree( void *NodeToFree ); RPCRTAPI void * RPC_ENTRY - NdrRpcSsDefaultAllocate( size_t Size ); + NdrRpcSsDefaultAllocate( size_t Size ) __WINE_ALLOC_SIZE(1); RPCRTAPI void RPC_ENTRY NdrRpcSsDefaultFree( void *NodeToFree );
Modified: trunk/reactos/include/psdk/winnt.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/include/psdk/winnt.h?rev=37... ============================================================================== --- trunk/reactos/include/psdk/winnt.h [iso-8859-1] (original) +++ trunk/reactos/include/psdk/winnt.h [iso-8859-1] Thu Nov 6 11:35:54 2008 @@ -68,6 +68,12 @@ #else #define DECLSPEC_ADDRSAFE #endif +#endif + +#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3))) +#define __WINE_ALLOC_SIZE(x) __attribute__((__alloc_size__(x))) +#else +#define __WINE_ALLOC_SIZE(x) #endif
#ifndef FORCEINLINE