[RPCRT4] Sync with Wine Staging 4.0. CORE-15682
authorAmine Khaldi <amine.khaldi@reactos.org>
Wed, 30 Jan 2019 11:31:33 +0000 (12:31 +0100)
committerAmine Khaldi <amine.khaldi@reactos.org>
Wed, 30 Jan 2019 11:31:33 +0000 (12:31 +0100)
23 files changed:
dll/win32/rpcrt4/CMakeLists.txt
dll/win32/rpcrt4/cproxy.c
dll/win32/rpcrt4/cpsf.c
dll/win32/rpcrt4/cpsf.h
dll/win32/rpcrt4/cstub.c
dll/win32/rpcrt4/ndr_contexthandle.c
dll/win32/rpcrt4/ndr_es.c
dll/win32/rpcrt4/ndr_marshall.c
dll/win32/rpcrt4/ndr_ole.c
dll/win32/rpcrt4/ndr_stubless.c
dll/win32/rpcrt4/ndr_stubless.h
dll/win32/rpcrt4/ndr_typelib.c [new file with mode: 0644]
dll/win32/rpcrt4/ndr_types.idl [new file with mode: 0644]
dll/win32/rpcrt4/rpc_assoc.c
dll/win32/rpcrt4/rpc_assoc.h
dll/win32/rpcrt4/rpc_binding.c
dll/win32/rpcrt4/rpc_binding.h
dll/win32/rpcrt4/rpc_epmap.c
dll/win32/rpcrt4/rpc_message.c
dll/win32/rpcrt4/rpc_transport.c
dll/win32/rpcrt4/rpcrt4.spec
dll/win32/rpcrt4/rpcrt4_main.c
media/doc/README.WINE

index 9d64269..212231a 100644 (file)
@@ -2,9 +2,21 @@
 remove_definitions(-D_WIN32_WINNT=0x502)
 add_definitions(-D_WIN32_WINNT=0x600)
 
+add_definitions(
+    -D__WINESRC__
+    -D_RPCRT4_
+    -DCOM_NO_WINDOWS_H
+    -DMSWMSG)
+
 include_directories(BEFORE ${REACTOS_SOURCE_DIR}/sdk/include/reactos/wine)
 spec2def(rpcrt4.dll rpcrt4.spec ADD_IMPORTLIB)
+
 add_rpc_files(client epm.idl)
+add_idl_headers(ndr_types_header ndr_types.idl)
+
+set(IDL_FLAGS ${IDL_FLAGS} -Oicf)
+add_rpcproxy_files(ndr_types.idl)
+unset(IDL_FLAGS)
 
 list(APPEND SOURCE
     cproxy.c
@@ -29,21 +41,15 @@ list(APPEND SOURCE
     precomp.h
     ${CMAKE_CURRENT_BINARY_DIR}/epm_c.c)
 
-remove_definitions(-D_WIN32_WINNT=0x502)
-add_definitions(-D_WIN32_WINNT=0x600)
-
-add_definitions(
-    -D__WINESRC__
-    -D_RPCRT4_
-    -DCOM_NO_WINDOWS_H
-    -DMSWMSG)
-
 if(MSVC AND NOT ARCH STREQUAL "arm")
     add_asm_files(rpcrt4_asm msvc.S)
 endif()
 
 add_library(rpcrt4 SHARED
     ${SOURCE}
+    ndr_typelib.c
+    ${CMAKE_CURRENT_BINARY_DIR}/ndr_types_p.c
+    ${CMAKE_CURRENT_BINARY_DIR}/proxy.dlldata.c
     ${rpcrt4_asm}
     rpcrt4.rc
     ${CMAKE_CURRENT_BINARY_DIR}/rpcrt4_stubs.c
@@ -51,7 +57,8 @@ add_library(rpcrt4 SHARED
 
 set_module_type(rpcrt4 win32dll)
 target_link_libraries(rpcrt4 wine uuid ${PSEH_LIB})
-add_delay_importlibs(rpcrt4 iphlpapi wininet secur32 user32)
+add_delay_importlibs(rpcrt4 iphlpapi wininet secur32 user32 oleaut32)
 add_importlibs(rpcrt4 advapi32 advapi32_vista kernel32_vista ws2_32 msvcrt kernel32 ntdll)
+add_dependencies(rpcrt4 ndr_types_header)
 add_pch(rpcrt4 precomp.h SOURCE)
 add_cd_file(TARGET rpcrt4 DESTINATION reactos/system32 FOR all)
index 4f5b4f2..56ef84d 100644 (file)
@@ -17,8 +17,6 @@
  * 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: Handle non-i386 architectures
  */
 
 #include "config.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(ole);
 
-/* I don't know what MS's std proxy structure looks like,
-   so this probably doesn't match, but that shouldn't matter */
-typedef struct {
-  IRpcProxyBuffer IRpcProxyBuffer_iface;
-  LPVOID *PVtbl;
-  LONG RefCount;
-  const IID* piid;
-  LPUNKNOWN pUnkOuter;
-  IUnknown *base_object;  /* must be at offset 0x10 from PVtbl */
-  IRpcProxyBuffer *base_proxy;
-  PCInterfaceName name;
-  LPPSFACTORYBUFFER pPSFactory;
-  LPRPCCHANNELBUFFER pChannel;
-} StdProxyImpl;
-
 static const IRpcProxyBufferVtbl StdProxy_Vtbl;
 
 static inline StdProxyImpl *impl_from_IRpcProxyBuffer(IRpcProxyBuffer *iface)
@@ -79,7 +62,10 @@ __ASM_GLOBAL_FUNC(call_stubless_func,
                   "movl 8(%ecx),%edx\n\t"         /* info->FormatStringOffset */
                   "movzwl (%edx,%eax,2),%edx\n\t" /* FormatStringOffset[index] */
                   "addl 4(%ecx),%edx\n\t"         /* info->ProcFormatString + offset */
-                  "movzwl 8(%edx),%eax\n\t"       /* arguments size */
+                  "movzbl 1(%edx),%eax\n\t"       /* Oi_flags */
+                  "andl $0x08,%eax\n\t"           /* Oi_HAS_RPCFLAGS */
+                  "shrl $1,%eax\n\t"
+                  "movzwl 4(%edx,%eax),%eax\n\t"  /* arguments size */
                   "pushl %eax\n\t"
                   __ASM_CFI(".cfi_adjust_cfa_offset 4\n\t")
                   "leal 8(%esp),%eax\n\t"         /* &This */
@@ -171,24 +157,43 @@ static inline void init_thunk( struct thunk *thunk, unsigned int index )
 
 extern void call_stubless_func(void);
 __ASM_GLOBAL_FUNC(call_stubless_func,
-                  "DCD 0xDEFC\n\t" // _assertfail
-                  "" );
+                  "push {r0-r3}\n\t"
+                  "mov r2, sp\n\t"              /* stack_top */
+                  "push {fp,lr}\n\t"
+                  "mov fp, sp\n\t"
+                  "ldr r0, [r0]\n\t"            /* This->lpVtbl */
+                  "ldr r0, [r0,#-8]\n\t"        /* MIDL_STUBLESS_PROXY_INFO */
+                  "ldr r1, [r0,#8]\n\t"         /* info->FormatStringOffset */
+                  "ldrh r1, [r1,ip]\n\t"        /* info->FormatStringOffset[index] */
+                  "ldr ip, [r0,#4]\n\t"         /* info->ProcFormatString */
+                  "add r1, ip\n\t"              /* info->ProcFormatString + offset */
+                  "ldr r0, [r0]\n\t"            /* info->pStubDesc */
+#ifdef __SOFTFP__
+                  "mov r3, #0\n\t"
+#else
+                  "vpush {s0-s15}\n\t"          /* store the s0-s15/d0-d7 arguments */
+                  "mov r3, sp\n\t"              /* fpu_stack */
+#endif
+                  "bl " __ASM_NAME("ndr_client_call") "\n\t"
+                  "mov sp, fp\n\t"
+                  "pop {fp,lr}\n\t"
+                  "add sp, #16\n\t"
+                  "bx lr" );
 
-#include "pshpack1.h"
 struct thunk
 {
-    DWORD assertfail;
-};
-#include "poppack.h"
-
-static const struct thunk thunk_template =
-{
-    { 0xDEFC }            /* _assertfail */
+    DWORD ldr_ip;         /* ldr ip,[pc] */
+    DWORD ldr_pc;         /* ldr pc,[pc] */
+    DWORD index;
+    void *func;
 };
 
 static inline void init_thunk( struct thunk *thunk, unsigned int index )
 {
-    *thunk = thunk_template;
+    thunk->ldr_ip = 0xe59fc000; /* ldr ip,[pc] */
+    thunk->ldr_pc = 0xe59ff000; /* ldr pc,[pc] */
+    thunk->index  = index * sizeof(unsigned short);
+    thunk->func   = call_stubless_func;
 }
 
 #else  /* __i386__ */
@@ -233,7 +238,7 @@ static const struct thunk *allocate_block( unsigned int num )
     return block;
 }
 
-static BOOL fill_stubless_table( IUnknownVtbl *vtbl, DWORD num )
+BOOL fill_stubless_table( IUnknownVtbl *vtbl, DWORD num )
 {
     const void **entry = (const void **)(vtbl + 1);
     DWORD i, j;
@@ -317,9 +322,7 @@ HRESULT StdProxy_Construct(REFIID riid,
   return S_OK;
 }
 
-static HRESULT WINAPI StdProxy_QueryInterface(LPRPCPROXYBUFFER iface,
-                                             REFIID riid,
-                                             LPVOID *obj)
+HRESULT WINAPI StdProxy_QueryInterface(IRpcProxyBuffer *iface, REFIID riid, void **obj)
 {
   StdProxyImpl *This = impl_from_IRpcProxyBuffer(iface);
   TRACE("(%p)->QueryInterface(%s,%p)\n",This,debugstr_guid(riid),obj);
@@ -340,7 +343,7 @@ static HRESULT WINAPI StdProxy_QueryInterface(LPRPCPROXYBUFFER iface,
   return E_NOINTERFACE;
 }
 
-static ULONG WINAPI StdProxy_AddRef(LPRPCPROXYBUFFER iface)
+ULONG WINAPI StdProxy_AddRef(IRpcProxyBuffer *iface)
 {
   StdProxyImpl *This = impl_from_IRpcProxyBuffer(iface);
   TRACE("(%p)->AddRef()\n",This);
@@ -370,8 +373,7 @@ static ULONG WINAPI StdProxy_Release(LPRPCPROXYBUFFER iface)
   return refs;
 }
 
-static HRESULT WINAPI StdProxy_Connect(LPRPCPROXYBUFFER iface,
-                                      LPRPCCHANNELBUFFER pChannel)
+HRESULT WINAPI StdProxy_Connect(IRpcProxyBuffer *iface, IRpcChannelBuffer *pChannel)
 {
   StdProxyImpl *This = impl_from_IRpcProxyBuffer(iface);
   TRACE("(%p)->Connect(%p)\n",This,pChannel);
@@ -382,7 +384,7 @@ static HRESULT WINAPI StdProxy_Connect(LPRPCPROXYBUFFER iface,
   return S_OK;
 }
 
-static VOID WINAPI StdProxy_Disconnect(LPRPCPROXYBUFFER iface)
+void WINAPI StdProxy_Disconnect(IRpcProxyBuffer *iface)
 {
   StdProxyImpl *This = impl_from_IRpcProxyBuffer(iface);
   TRACE("(%p)->Disconnect()\n",This);
@@ -551,45 +553,3 @@ HRESULT WINAPI NdrProxyErrorHandler(DWORD dwExceptionCode)
   else
     return HRESULT_FROM_WIN32(dwExceptionCode);
 }
-
-HRESULT WINAPI
-CreateProxyFromTypeInfo( LPTYPEINFO pTypeInfo, LPUNKNOWN pUnkOuter, REFIID riid,
-                         LPRPCPROXYBUFFER *ppProxy, LPVOID *ppv )
-{
-    typedef INT (WINAPI *MessageBoxA)(HWND,LPCSTR,LPCSTR,UINT);
-    HMODULE hUser32 = LoadLibraryA("user32");
-    MessageBoxA pMessageBoxA = (void *)GetProcAddress(hUser32, "MessageBoxA");
-
-    FIXME("%p %p %s %p %p\n", pTypeInfo, pUnkOuter, debugstr_guid(riid), ppProxy, ppv);
-    if (pMessageBoxA)
-    {
-        pMessageBoxA(NULL,
-            "The native implementation of OLEAUT32.DLL cannot be used "
-            "with Wine's RPCRT4.DLL. Remove OLEAUT32.DLL and try again.\n",
-            "Wine: Unimplemented CreateProxyFromTypeInfo",
-            0x10);
-        ExitProcess(1);
-    }
-    return E_NOTIMPL;
-}
-
-HRESULT WINAPI
-CreateStubFromTypeInfo(ITypeInfo *pTypeInfo, REFIID riid, IUnknown *pUnkServer,
-                       IRpcStubBuffer **ppStub )
-{
-    typedef INT (WINAPI *MessageBoxA)(HWND,LPCSTR,LPCSTR,UINT);
-    HMODULE hUser32 = LoadLibraryA("user32");
-    MessageBoxA pMessageBoxA = (void *)GetProcAddress(hUser32, "MessageBoxA");
-
-    FIXME("%p %s %p %p\n", pTypeInfo, debugstr_guid(riid), pUnkServer, ppStub);
-    if (pMessageBoxA)
-    {
-        pMessageBoxA(NULL,
-            "The native implementation of OLEAUT32.DLL cannot be used "
-            "with Wine's RPCRT4.DLL. Remove OLEAUT32.DLL and try again.\n",
-            "Wine: Unimplemented CreateProxyFromTypeInfo",
-            0x10);
-        ExitProcess(1);
-    }
-    return E_NOTIMPL;
-}
index 9375c40..e92d226 100644 (file)
@@ -279,7 +279,7 @@ HRESULT WINAPI NdrDllRegisterProxy(HMODULE hDll,
   /* register clsid to point to module */
   strcpyW( keyname, clsidW );
   strcatW( keyname, clsid );
-  len = GetModuleFileNameW(hDll, module, sizeof(module)/sizeof(WCHAR));
+  len = GetModuleFileNameW(hDll, module, ARRAY_SIZE(module));
   if (len && len < sizeof(module)) {
       TRACE("registering CLSID %s => %s\n", debugstr_w(clsid), debugstr_w(module));
       if (RegCreateKeyW(HKEY_CLASSES_ROOT, keyname, &key) == ERROR_SUCCESS) {
index 964fb45..3cfbf77 100644 (file)
 #ifndef __WINE_CPSF_H
 #define __WINE_CPSF_H
 
+typedef struct
+{
+    IRpcProxyBuffer IRpcProxyBuffer_iface;
+    void **PVtbl;
+    LONG RefCount;
+    const IID *piid;
+    IUnknown *pUnkOuter;
+    /* offset of base_object from PVtbl must match assembly thunks; see
+     * fill_delegated_proxy_table() */
+    IUnknown *base_object;
+    IRpcProxyBuffer *base_proxy;
+    PCInterfaceName name;
+    IPSFactoryBuffer *pPSFactory;
+    IRpcChannelBuffer *pChannel;
+} StdProxyImpl;
+
+typedef struct
+{
+    IUnknownVtbl *base_obj;
+    IRpcStubBuffer *base_stub;
+    CStdStubBuffer stub_buffer;
+} cstdstubbuffer_delegating_t;
+
 HRESULT StdProxy_Construct(REFIID riid, LPUNKNOWN pUnkOuter, const ProxyFileInfo *ProxyInfo,
                            int Index, LPPSFACTORYBUFFER pPSFactory, LPRPCPROXYBUFFER *ppProxy,
                            LPVOID *ppvObj) DECLSPEC_HIDDEN;
+HRESULT WINAPI StdProxy_QueryInterface(IRpcProxyBuffer *iface, REFIID iid, void **obj) DECLSPEC_HIDDEN;
+ULONG WINAPI StdProxy_AddRef(IRpcProxyBuffer *iface) DECLSPEC_HIDDEN;
+HRESULT WINAPI StdProxy_Connect(IRpcProxyBuffer *iface, IRpcChannelBuffer *channel) DECLSPEC_HIDDEN;
+void WINAPI StdProxy_Disconnect(IRpcProxyBuffer *iface) DECLSPEC_HIDDEN;
 
 HRESULT CStdStubBuffer_Construct(REFIID riid, LPUNKNOWN pUnkServer, PCInterfaceName name,
                                  CInterfaceStubVtbl *vtbl, LPPSFACTORYBUFFER pPSFactory,
@@ -41,5 +68,8 @@ extern const IRpcStubBufferVtbl CStdStubBuffer_Delegating_Vtbl DECLSPEC_HIDDEN;
 BOOL fill_delegated_proxy_table(IUnknownVtbl *vtbl, DWORD num) DECLSPEC_HIDDEN;
 HRESULT create_proxy(REFIID iid, IUnknown *pUnkOuter, IRpcProxyBuffer **pproxy, void **ppv) DECLSPEC_HIDDEN;
 HRESULT create_stub(REFIID iid, IUnknown *pUnk, IRpcStubBuffer **ppstub) DECLSPEC_HIDDEN;
+BOOL fill_stubless_table(IUnknownVtbl *vtbl, DWORD num) DECLSPEC_HIDDEN;
+IUnknownVtbl *get_delegating_vtbl(DWORD num_methods) DECLSPEC_HIDDEN;
+void release_delegating_vtbl(IUnknownVtbl *vtbl) DECLSPEC_HIDDEN;
 
 #endif  /* __WINE_CPSF_H */
index dc279b7..e33d499 100644 (file)
@@ -50,13 +50,6 @@ static LONG WINAPI stub_filter(EXCEPTION_POINTERS *eptr)
     return EXCEPTION_EXECUTE_HANDLER;
 }
 
-typedef struct
-{
-    IUnknownVtbl *base_obj;
-    IRpcStubBuffer *base_stub;
-    CStdStubBuffer stub_buffer;
-} cstdstubbuffer_delegating_t;
-
 static inline cstdstubbuffer_delegating_t *impl_from_delegating( IRpcStubBuffer *iface )
 {
     return CONTAINING_RECORD((void *)iface, cstdstubbuffer_delegating_t, stub_buffer);
@@ -175,11 +168,23 @@ typedef struct
 static const BYTE opcodes[16] = { 0x48, 0x8b, 0x49, 0x20, 0x48, 0x8b, 0x01,
                                   0xff, 0xa0, 0, 0, 0, 0, 0x48, 0x8d, 0x36 };
 #elif defined(__arm__)
+
+static const DWORD opcodes[] =
+{
+    0xe52d4004,    /* push {r4} */
+    0xe5900010,    /* ldr r0, [r0, #16] */
+    0xe5904000,    /* ldr r4, [r0] */
+    0xe59fc008,    /* ldr ip, [pc, #8] */
+    0xe08cc004,    /* add ip, ip, r4 */
+    0xe49d4004,    /* pop {r4} */
+    0xe59cf000     /* ldr pc, [ip] */
+};
+
 typedef struct
 {
+    DWORD opcodes[ARRAY_SIZE(opcodes)];
     DWORD offset;
 } vtbl_method_t;
-static const BYTE opcodes[1];
 
 #else
 
@@ -267,7 +272,7 @@ BOOL fill_delegated_proxy_table(IUnknownVtbl *vtbl, DWORD num)
     return TRUE;
 }
 
-static IUnknownVtbl *get_delegating_vtbl(DWORD num_methods)
+IUnknownVtbl *get_delegating_vtbl(DWORD num_methods)
 {
     IUnknownVtbl *ret;
 
@@ -303,7 +308,7 @@ static IUnknownVtbl *get_delegating_vtbl(DWORD num_methods)
     return ret;
 }
 
-static void release_delegating_vtbl(IUnknownVtbl *vtbl)
+void release_delegating_vtbl(IUnknownVtbl *vtbl)
 {
     ref_counted_vtbl *table = (ref_counted_vtbl*)((DWORD *)vtbl - 1);
 
index 3b26285..a5e1ffc 100644 (file)
@@ -23,8 +23,6 @@
 #include "rpc_assoc.h"
 #include "rpcndr.h"
 
-#include "wine/rpcfc.h"
-
 #include "wine/debug.h"
 #include "wine/list.h"
 
index 59ea816..158bc7c 100644 (file)
@@ -32,7 +32,6 @@
 #include "ndr_stubless.h"
 
 #include "wine/debug.h"
-#include "wine/rpcfc.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(ole);
 
@@ -424,7 +423,7 @@ void WINAPIV NdrMesProcEncodeDecode(handle_t Handle, const MIDL_STUB_DESC * pStu
     client_interface = pStubDesc->RpcInterfaceInformation;
     pEsMsg->InterfaceId = client_interface->InterfaceId;
 
-    if (pProcHeader->Oi_flags & RPC_FC_PROC_OIF_RPCFLAGS)
+    if (pProcHeader->Oi_flags & Oi_HAS_RPCFLAGS)
     {
         const NDR_PROC_HEADER_RPC *header_rpc = (const NDR_PROC_HEADER_RPC *)&pFormat[0];
         stack_size = header_rpc->stack_size;
@@ -438,17 +437,17 @@ void WINAPIV NdrMesProcEncodeDecode(handle_t Handle, const MIDL_STUB_DESC * pStu
         pFormat += sizeof(NDR_PROC_HEADER);
     }
 
-    if (pProcHeader->handle_type == RPC_FC_BIND_EXPLICIT)
+    if (pProcHeader->handle_type == 0)
     {
         switch (*pFormat) /* handle_type */
         {
-        case RPC_FC_BIND_PRIMITIVE: /* explicit primitive */
+        case FC_BIND_PRIMITIVE: /* explicit primitive */
             pFormat += sizeof(NDR_EHD_PRIMITIVE);
             break;
-        case RPC_FC_BIND_GENERIC: /* explicit generic */
+        case FC_BIND_GENERIC: /* explicit generic */
             pFormat += sizeof(NDR_EHD_GENERIC);
             break;
-        case RPC_FC_BIND_CONTEXT: /* explicit context */
+        case FC_BIND_CONTEXT: /* explicit context */
             pFormat += sizeof(NDR_EHD_CONTEXT);
             break;
         default:
@@ -467,7 +466,7 @@ void WINAPIV NdrMesProcEncodeDecode(handle_t Handle, const MIDL_STUB_DESC * pStu
     pEsMsg->StubMsg.pfnFree = pStubDesc->pfnFree;
 
     /* create the full pointer translation tables, if requested */
-    if (pProcHeader->Oi_flags & RPC_FC_PROC_OIF_FULLPTR)
+    if (pProcHeader->Oi_flags & Oi_FULL_PTR_USED)
         pEsMsg->StubMsg.FullPtrXlatTables = NdrFullPointerXlatInit(0,XLAT_CLIENT);
 
     TRACE("Oi_flags = 0x%02x\n", pProcHeader->Oi_flags);
@@ -510,7 +509,7 @@ void WINAPIV NdrMesProcEncodeDecode(handle_t Handle, const MIDL_STUB_DESC * pStu
         return;
     }
     /* free the full pointer translation tables */
-    if (pProcHeader->Oi_flags & RPC_FC_PROC_OIF_FULLPTR)
+    if (pProcHeader->Oi_flags & Oi_FULL_PTR_USED)
         NdrFullPointerXlatFree(pEsMsg->StubMsg.FullPtrXlatTables);
 }
 
index 6356fb9..77bbf98 100644 (file)
@@ -43,8 +43,6 @@
 #include "ndrtypes.h"
 
 #include "wine/unicode.h"
-#include "wine/rpcfc.h"
-
 #include "wine/debug.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(ole);
@@ -110,6 +108,19 @@ static inline void align_pointer_clear( unsigned char **ptr, unsigned int align
     *ptr = (unsigned char *)(((ULONG_PTR)*ptr + mask) & ~mask);
 }
 
+static inline void align_pointer_offset( unsigned char **ptr, unsigned char *base, unsigned int align )
+{
+    ULONG_PTR mask = align - 1;
+    *ptr = base + (((ULONG_PTR)(*ptr - base) + mask) & ~mask);
+}
+
+static inline void align_pointer_offset_clear( unsigned char **ptr, unsigned char *base, unsigned int align )
+{
+    ULONG_PTR mask = align - 1;
+    memset( *ptr, 0, (align - (ULONG_PTR)(*ptr - base)) & mask );
+    *ptr = base + (((ULONG_PTR)(*ptr - base) + mask) & ~mask);
+}
+
 #define STD_OVERFLOW_CHECK(_Msg) do { \
     TRACE("buffer=%d/%d\n", (ULONG)(_Msg->Buffer - (unsigned char *)_Msg->RpcMsg->Buffer), _Msg->BufferLength); \
     if (_Msg->Buffer > (unsigned char *)_Msg->RpcMsg->Buffer + _Msg->BufferLength) \
@@ -438,6 +449,13 @@ void * WINAPI NdrAllocate(MIDL_STUB_MESSAGE *pStubMsg, SIZE_T len)
     return p;
 }
 
+static void *NdrAllocateZero(MIDL_STUB_MESSAGE *stubmsg, SIZE_T len)
+{
+    void *mem = NdrAllocate(stubmsg, len);
+    memset(mem, 0, len);
+    return mem;
+}
+
 static void NdrFree(MIDL_STUB_MESSAGE *pStubMsg, unsigned char *Pointer)
 {
     TRACE("(%p, %p)\n", pStubMsg, Pointer);
@@ -554,15 +572,15 @@ PFORMAT_STRING ComputeConformanceOrVariance(
   }
 
   switch (pFormat[0] & 0xf0) {
-  case RPC_FC_NORMAL_CONFORMANCE:
+  case FC_NORMAL_CONFORMANCE:
     TRACE("normal conformance, ofs=%d\n", ofs);
     ptr = pMemory;
     break;
-  case RPC_FC_POINTER_CONFORMANCE:
+  case FC_POINTER_CONFORMANCE:
     TRACE("pointer conformance, ofs=%d\n", ofs);
     ptr = pStubMsg->Memory;
     break;
-  case RPC_FC_TOP_LEVEL_CONFORMANCE:
+  case FC_TOP_LEVEL_CONFORMANCE:
     TRACE("toplevel conformance, ofs=%d\n", ofs);
     if (pStubMsg->StackTop) {
       ptr = pStubMsg->StackTop;
@@ -572,12 +590,12 @@ PFORMAT_STRING ComputeConformanceOrVariance(
       goto finish_conf;
     }
     break;
-  case RPC_FC_CONSTANT_CONFORMANCE:
+  case FC_CONSTANT_CONFORMANCE:
     data = ofs | ((DWORD)pFormat[1] << 16);
     TRACE("constant conformance, val=%ld\n", data);
     *pCount = data;
     goto finish_conf;
-  case RPC_FC_TOP_LEVEL_MULTID_CONFORMANCE:
+  case FC_TOP_LEVEL_MULTID_CONFORMANCE:
     FIXME("toplevel multidimensional conformance, ofs=%d\n", ofs);
     if (pStubMsg->StackTop) {
       ptr = pStubMsg->StackTop;
@@ -593,10 +611,10 @@ PFORMAT_STRING ComputeConformanceOrVariance(
   }
 
   switch (pFormat[1]) {
-  case RPC_FC_DEREFERENCE:
+  case FC_DEREFERENCE:
     ptr = *(LPVOID*)((char *)ptr + ofs);
     break;
-  case RPC_FC_CALLBACK:
+  case FC_CALLBACK:
   {
     unsigned char *old_stack_top = pStubMsg->StackTop;
     ULONG_PTR max_count, old_max_count = pStubMsg->MaxCount;
@@ -621,25 +639,25 @@ PFORMAT_STRING ComputeConformanceOrVariance(
   }
 
   switch (dtype) {
-  case RPC_FC_LONG:
-  case RPC_FC_ULONG:
+  case FC_LONG:
+  case FC_ULONG:
     data = *(DWORD*)ptr;
     break;
-  case RPC_FC_SHORT:
+  case FC_SHORT:
     data = *(SHORT*)ptr;
     break;
-  case RPC_FC_USHORT:
+  case FC_USHORT:
     data = *(USHORT*)ptr;
     break;
-  case RPC_FC_CHAR:
-  case RPC_FC_SMALL:
+  case FC_CHAR:
+  case FC_SMALL:
     data = *(CHAR*)ptr;
     break;
-  case RPC_FC_BYTE:
-  case RPC_FC_USMALL:
+  case FC_BYTE:
+  case FC_USMALL:
     data = *(UCHAR*)ptr;
     break;
-  case RPC_FC_HYPER:
+  case FC_HYPER:
     data = *(ULONGLONG *)ptr;
     break;
   default:
@@ -650,20 +668,20 @@ PFORMAT_STRING ComputeConformanceOrVariance(
 
 done_conf_grab:
   switch (pFormat[1]) {
-  case RPC_FC_DEREFERENCE: /* already handled */
+  case FC_DEREFERENCE: /* already handled */
   case 0: /* no op */
     *pCount = data;
     break;
-  case RPC_FC_ADD_1:
+  case FC_ADD_1:
     *pCount = data + 1;
     break;
-  case RPC_FC_SUB_1:
+  case FC_SUB_1:
     *pCount = data - 1;
     break;
-  case RPC_FC_MULT_2:
+  case FC_MULT_2:
     *pCount = data * 2;
     break;
-  case RPC_FC_DIV_2:
+  case FC_DIV_2:
     *pCount = data / 2;
     break;
   default:
@@ -779,16 +797,16 @@ static void validate_string_data(MIDL_STUB_MESSAGE *pStubMsg, ULONG bufsize, ULO
 
 static inline void dump_pointer_attr(unsigned char attr)
 {
-    if (attr & RPC_FC_P_ALLOCALLNODES)
-        TRACE(" RPC_FC_P_ALLOCALLNODES");
-    if (attr & RPC_FC_P_DONTFREE)
-        TRACE(" RPC_FC_P_DONTFREE");
-    if (attr & RPC_FC_P_ONSTACK)
-        TRACE(" RPC_FC_P_ONSTACK");
-    if (attr & RPC_FC_P_SIMPLEPOINTER)
-        TRACE(" RPC_FC_P_SIMPLEPOINTER");
-    if (attr & RPC_FC_P_DEREF)
-        TRACE(" RPC_FC_P_DEREF");
+    if (attr & FC_ALLOCATE_ALL_NODES)
+        TRACE(" FC_ALLOCATE_ALL_NODES");
+    if (attr & FC_DONT_FREE)
+        TRACE(" FC_DONT_FREE");
+    if (attr & FC_ALLOCED_ON_STACK)
+        TRACE(" FC_ALLOCED_ON_STACK");
+    if (attr & FC_SIMPLE_POINTER)
+        TRACE(" FC_SIMPLE_POINTER");
+    if (attr & FC_POINTER_DEREF)
+        TRACE(" FC_POINTER_DEREF");
     TRACE("\n");
 }
 
@@ -809,11 +827,11 @@ static void PointerMarshall(PMIDL_STUB_MESSAGE pStubMsg,
   TRACE("(%p,%p,%p,%p)\n", pStubMsg, Buffer, Pointer, pFormat);
   TRACE("type=0x%x, attr=", type); dump_pointer_attr(attr);
   pFormat += 2;
-  if (attr & RPC_FC_P_SIMPLEPOINTER) desc = pFormat;
+  if (attr & FC_SIMPLE_POINTER) desc = pFormat;
   else desc = pFormat + *(const SHORT*)pFormat;
 
   switch (type) {
-  case RPC_FC_RP: /* ref pointer (always non-null) */
+  case FC_RP: /* ref pointer (always non-null) */
     if (!Pointer)
     {
       ERR("NULL ref pointer is not allowed\n");
@@ -821,8 +839,8 @@ static void PointerMarshall(PMIDL_STUB_MESSAGE pStubMsg,
     }
     pointer_needs_marshaling = TRUE;
     break;
-  case RPC_FC_UP: /* unique pointer */
-  case RPC_FC_OP: /* object pointer - same as unique here */
+  case FC_UP: /* unique pointer */
+  case FC_OP: /* object pointer - same as unique here */
     if (Pointer)
       pointer_needs_marshaling = TRUE;
     else
@@ -831,7 +849,7 @@ static void PointerMarshall(PMIDL_STUB_MESSAGE pStubMsg,
     TRACE("writing 0x%08x to buffer\n", pointer_id);
     NDR_LOCAL_UINT32_WRITE(Buffer, pointer_id);
     break;
-  case RPC_FC_FP:
+  case FC_FP:
     pointer_needs_marshaling = !NdrFullPointerQueryPointer(
       pStubMsg->FullPtrXlatTables, Pointer, 1, &pointer_id);
     TRACE("writing 0x%08x to buffer\n", pointer_id);
@@ -846,7 +864,7 @@ static void PointerMarshall(PMIDL_STUB_MESSAGE pStubMsg,
   TRACE("calling marshaller for type 0x%x\n", (int)*desc);
 
   if (pointer_needs_marshaling) {
-    if (attr & RPC_FC_P_DEREF) {
+    if (attr & FC_POINTER_DEREF) {
       Pointer = *(unsigned char**)Pointer;
       TRACE("deref => %p\n", Pointer);
     }
@@ -858,9 +876,13 @@ static void PointerMarshall(PMIDL_STUB_MESSAGE pStubMsg,
   STD_OVERFLOW_CHECK(pStubMsg);
 }
 
-/***********************************************************************
- *           PointerUnmarshall [internal]
- */
+/* pPointer is the pointer that we will unmarshal into; pSrcPointer is the
+ * pointer to memory which we may attempt to reuse if non-NULL. Usually these
+ * are the same; for the case when they aren't, see EmbeddedPointerUnmarshall().
+ *
+ * fMustAlloc seems to determine whether we can allocate from the buffer (if we
+ * are on the server side). It's ignored here, since we can't allocate a pointer
+ * from the buffer. */
 static void PointerUnmarshall(PMIDL_STUB_MESSAGE pStubMsg,
                               unsigned char *Buffer,
                               unsigned char **pPointer,
@@ -872,19 +894,19 @@ static void PointerUnmarshall(PMIDL_STUB_MESSAGE pStubMsg,
   PFORMAT_STRING desc;
   NDR_UNMARSHALL m;
   DWORD pointer_id = 0;
-  BOOL pointer_needs_unmarshaling;
+  BOOL pointer_needs_unmarshaling, need_alloc = FALSE, inner_must_alloc = FALSE;
 
   TRACE("(%p,%p,%p,%p,%p,%d)\n", pStubMsg, Buffer, pPointer, pSrcPointer, pFormat, fMustAlloc);
   TRACE("type=0x%x, attr=", type); dump_pointer_attr(attr);
   pFormat += 2;
-  if (attr & RPC_FC_P_SIMPLEPOINTER) desc = pFormat;
+  if (attr & FC_SIMPLE_POINTER) desc = pFormat;
   else desc = pFormat + *(const SHORT*)pFormat;
 
   switch (type) {
-  case RPC_FC_RP: /* ref pointer (always non-null) */
+  case FC_RP: /* ref pointer (always non-null) */
     pointer_needs_unmarshaling = TRUE;
     break;
-  case RPC_FC_UP: /* unique pointer */
+  case FC_UP: /* unique pointer */
     pointer_id = NDR_LOCAL_UINT32_READ(Buffer);
     TRACE("pointer_id is 0x%08x\n", pointer_id);
     if (pointer_id)
@@ -894,14 +916,16 @@ static void PointerUnmarshall(PMIDL_STUB_MESSAGE pStubMsg,
       pointer_needs_unmarshaling = FALSE;
     }
     break;
-  case RPC_FC_OP: /* object pointer - we must free data before overwriting it */
+  case FC_OP: /* object pointer - we must free data before overwriting it */
     pointer_id = NDR_LOCAL_UINT32_READ(Buffer);
     TRACE("pointer_id is 0x%08x\n", pointer_id);
-    if (!fMustAlloc && pSrcPointer)
-    {
+
+    /* An object pointer always allocates new memory (it cannot point to the
+     * buffer). */
+    inner_must_alloc = TRUE;
+
+    if (pSrcPointer)
         FIXME("free object pointer %p\n", pSrcPointer);
-        fMustAlloc = TRUE;
-    }
     if (pointer_id)
       pointer_needs_unmarshaling = TRUE;
     else
@@ -910,7 +934,7 @@ static void PointerUnmarshall(PMIDL_STUB_MESSAGE pStubMsg,
       pointer_needs_unmarshaling = FALSE;
     }
     break;
-  case RPC_FC_FP:
+  case FC_FP:
     pointer_id = NDR_LOCAL_UINT32_READ(Buffer);
     TRACE("pointer_id is 0x%08x\n", pointer_id);
     pointer_needs_unmarshaling = !NdrFullPointerQueryRefId(
@@ -926,50 +950,51 @@ static void PointerUnmarshall(PMIDL_STUB_MESSAGE pStubMsg,
     unsigned char **current_ptr = pPointer;
     if (pStubMsg->IsClient) {
       TRACE("client\n");
-      /* if we aren't forcing allocation of memory then try to use the existing
-       * (source) pointer to unmarshall the data into so that [in,out]
-       * parameters behave correctly. it doesn't matter if the parameter is
-       * [out] only since in that case the pointer will be NULL. we force
-       * allocation when the source pointer is NULL here instead of in the type
-       * unmarshalling routine for the benefit of the deref code below */
-      if (!fMustAlloc) {
-        if (pSrcPointer) {
-          TRACE("setting *pPointer to %p\n", pSrcPointer);
-          *pPointer = pSrcPointer;
-        } else
-          fMustAlloc = TRUE;
+      /* Try to use the existing (source) pointer to unmarshall the data into
+       * so that [in, out] or [out, ref] parameters behave correctly. If the
+       * source pointer is NULL and we are not dereferencing, we must force the
+       * inner marshalling routine to allocate, since otherwise it will crash. */
+      if (pSrcPointer)
+      {
+        TRACE("setting *pPointer to %p\n", pSrcPointer);
+        *pPointer = pSrcPointer;
       }
+      else
+        need_alloc = inner_must_alloc = TRUE;
     } else {
       TRACE("server\n");
-      /* the memory in a stub is never initialised, so we have to work out here
-       * whether we have to initialise it so we can use the optimisation of
-       * setting the pointer to the buffer, if possible, or set fMustAlloc to
-       * TRUE. */
-      if (attr & RPC_FC_P_DEREF) {
-        fMustAlloc = TRUE;
-      } else {
-        *current_ptr = NULL;
+      /* We can use an existing source pointer here only if it is on-stack,
+       * probably since otherwise NdrPointerFree() might later try to free a
+       * pointer we don't know the provenance of. Otherwise we must always
+       * allocate if we are dereferencing. We never need to force the inner
+       * routine to allocate here, since it will either write into an existing
+       * pointer, or use a pointer to the buffer. */
+      if (attr & FC_POINTER_DEREF)
+      {
+        if (pSrcPointer && (attr & FC_ALLOCED_ON_STACK))
+          *pPointer = pSrcPointer;
+        else
+          need_alloc = TRUE;
       }
+      else
+        *pPointer = NULL;
     }
 
-    if (attr & RPC_FC_P_ALLOCALLNODES)
-        FIXME("RPC_FC_P_ALLOCALLNODES not implemented\n");
+    if (attr & FC_ALLOCATE_ALL_NODES)
+        FIXME("FC_ALLOCATE_ALL_NODES not implemented\n");
+
+    if (attr & FC_POINTER_DEREF) {
+      if (need_alloc)
+        *pPointer = NdrAllocateZero(pStubMsg, sizeof(void *));
 
-    if (attr & RPC_FC_P_DEREF) {
-      if (fMustAlloc) {
-        unsigned char *base_ptr_val = NdrAllocate(pStubMsg, sizeof(void *));
-        *pPointer = base_ptr_val;
-        current_ptr = (unsigned char **)base_ptr_val;
-      } else
-        current_ptr = *(unsigned char***)current_ptr;
+      current_ptr = *(unsigned char***)current_ptr;
       TRACE("deref => %p\n", current_ptr);
-      if (!fMustAlloc && !*current_ptr) fMustAlloc = TRUE;
     }
     m = NdrUnmarshaller[*desc & NDR_TABLE_MASK];
-    if (m) m(pStubMsg, current_ptr, desc, fMustAlloc);
+    if (m) m(pStubMsg, current_ptr, desc, inner_must_alloc);
     else FIXME("no unmarshaller for data type=%02x\n", *desc);
 
-    if (type == RPC_FC_FP)
+    if (type == FC_FP)
       NdrFullPointerInsertRefId(pStubMsg->FullPtrXlatTables, pointer_id,
                                 *pPointer);
   }
@@ -993,24 +1018,24 @@ static void PointerBufferSize(PMIDL_STUB_MESSAGE pStubMsg,
   TRACE("(%p,%p,%p)\n", pStubMsg, Pointer, pFormat);
   TRACE("type=0x%x, attr=", type); dump_pointer_attr(attr);
   pFormat += 2;
-  if (attr & RPC_FC_P_SIMPLEPOINTER) desc = pFormat;
+  if (attr & FC_SIMPLE_POINTER) desc = pFormat;
   else desc = pFormat + *(const SHORT*)pFormat;
 
   switch (type) {
-  case RPC_FC_RP: /* ref pointer (always non-null) */
+  case FC_RP: /* ref pointer (always non-null) */
     if (!Pointer)
     {
       ERR("NULL ref pointer is not allowed\n");
       RpcRaiseException(RPC_X_NULL_REF_POINTER);
     }
     break;
-  case RPC_FC_OP:
-  case RPC_FC_UP:
+  case FC_OP:
+  case FC_UP:
     /* NULL pointer has no further representation */
     if (!Pointer)
         return;
     break;
-  case RPC_FC_FP:
+  case FC_FP:
     pointer_needs_sizing = !NdrFullPointerQueryPointer(
       pStubMsg->FullPtrXlatTables, Pointer, 0, &pointer_id);
     if (!pointer_needs_sizing)
@@ -1022,7 +1047,7 @@ static void PointerBufferSize(PMIDL_STUB_MESSAGE pStubMsg,
     return;
   }
 
-  if (attr & RPC_FC_P_DEREF) {
+  if (attr & FC_POINTER_DEREF) {
     Pointer = *(unsigned char**)Pointer;
     TRACE("deref => %p\n", Pointer);
   }
@@ -1047,15 +1072,15 @@ static ULONG PointerMemorySize(PMIDL_STUB_MESSAGE pStubMsg,
   TRACE("(%p,%p,%p)\n", pStubMsg, Buffer, pFormat);
   TRACE("type=0x%x, attr=", type); dump_pointer_attr(attr);
   pFormat += 2;
-  if (attr & RPC_FC_P_SIMPLEPOINTER) desc = pFormat;
+  if (attr & FC_SIMPLE_POINTER) desc = pFormat;
   else desc = pFormat + *(const SHORT*)pFormat;
 
   switch (type) {
-  case RPC_FC_RP: /* ref pointer (always non-null) */
+  case FC_RP: /* ref pointer (always non-null) */
     pointer_needs_sizing = TRUE;
     break;
-  case RPC_FC_UP: /* unique pointer */
-  case RPC_FC_OP: /* object pointer - we must free data before overwriting it */
+  case FC_UP: /* unique pointer */
+  case FC_OP: /* object pointer - we must free data before overwriting it */
     pointer_id = NDR_LOCAL_UINT32_READ(Buffer);
     TRACE("pointer_id is 0x%08x\n", pointer_id);
     if (pointer_id)
@@ -1063,7 +1088,7 @@ static ULONG PointerMemorySize(PMIDL_STUB_MESSAGE pStubMsg,
     else
       pointer_needs_sizing = FALSE;
     break;
-  case RPC_FC_FP:
+  case FC_FP:
   {
     void *pointer;
     pointer_id = NDR_LOCAL_UINT32_READ(Buffer);
@@ -1078,7 +1103,7 @@ static ULONG PointerMemorySize(PMIDL_STUB_MESSAGE pStubMsg,
     return 0;
   }
 
-  if (attr & RPC_FC_P_DEREF) {
+  if (attr & FC_POINTER_DEREF) {
     align_length(&pStubMsg->MemorySize, sizeof(void*));
     pStubMsg->MemorySize += sizeof(void*);
     TRACE("deref\n");
@@ -1107,21 +1132,21 @@ static void PointerFree(PMIDL_STUB_MESSAGE pStubMsg,
 
   TRACE("(%p,%p,%p)\n", pStubMsg, Pointer, pFormat);
   TRACE("type=0x%x, attr=", type); dump_pointer_attr(attr);
-  if (attr & RPC_FC_P_DONTFREE) return;
+  if (attr & FC_DONT_FREE) return;
   pFormat += 2;
-  if (attr & RPC_FC_P_SIMPLEPOINTER) desc = pFormat;
+  if (attr & FC_SIMPLE_POINTER) desc = pFormat;
   else desc = pFormat + *(const SHORT*)pFormat;
 
   if (!Pointer) return;
 
-  if (type == RPC_FC_FP) {
+  if (type == FC_FP) {
     int pointer_needs_freeing = NdrFullPointerFree(
       pStubMsg->FullPtrXlatTables, Pointer);
     if (!pointer_needs_freeing)
       return;
   }
 
-  if (attr & RPC_FC_P_DEREF) {
+  if (attr & FC_POINTER_DEREF) {
     current_pointer = *(unsigned char**)Pointer;
     TRACE("deref => %p\n", current_pointer);
   }
@@ -1138,7 +1163,7 @@ static void PointerFree(PMIDL_STUB_MESSAGE pStubMsg,
   if (Pointer >= pStubMsg->BufferStart && Pointer <= pStubMsg->BufferEnd)
       goto notfree;
 
-  if (attr & RPC_FC_P_ONSTACK) {
+  if (attr & FC_ALLOCED_ON_STACK) {
     TRACE("not freeing stack ptr %p\n", Pointer);
     return;
   }
@@ -1163,7 +1188,7 @@ static unsigned char * EmbeddedPointerMarshall(PMIDL_STUB_MESSAGE pStubMsg,
 
   TRACE("(%p,%p,%p)\n", pStubMsg, pMemory, pFormat);
 
-  if (*pFormat != RPC_FC_PP) return NULL;
+  if (*pFormat != FC_PP) return NULL;
   pFormat += 2;
 
   if (pStubMsg->PointerBufferMark)
@@ -1173,25 +1198,25 @@ static unsigned char * EmbeddedPointerMarshall(PMIDL_STUB_MESSAGE pStubMsg,
     pStubMsg->PointerBufferMark = NULL;
   }
 
-  while (pFormat[0] != RPC_FC_END) {
+  while (pFormat[0] != FC_END) {
     switch (pFormat[0]) {
     default:
       FIXME("unknown repeat type %d; assuming no repeat\n", pFormat[0]);
       /* fallthrough */
-    case RPC_FC_NO_REPEAT:
+    case FC_NO_REPEAT:
       rep = 1;
       stride = 0;
       count = 1;
       pFormat += 2;
       break;
-    case RPC_FC_FIXED_REPEAT:
+    case FC_FIXED_REPEAT:
       rep = *(const WORD*)&pFormat[2];
       stride = *(const WORD*)&pFormat[4];
       count = *(const WORD*)&pFormat[8];
       pFormat += 10;
       break;
-    case RPC_FC_VARIABLE_REPEAT:
-      rep = (pFormat[1] == RPC_FC_VARIABLE_OFFSET) ? pStubMsg->ActualCount : pStubMsg->MaxCount;
+    case FC_VARIABLE_REPEAT:
+      rep = (pFormat[1] == FC_VARIABLE_OFFSET) ? pStubMsg->ActualCount : pStubMsg->MaxCount;
       stride = *(const WORD*)&pFormat[2];
       count = *(const WORD*)&pFormat[6];
       pFormat += 8;
@@ -1227,9 +1252,14 @@ static unsigned char * EmbeddedPointerMarshall(PMIDL_STUB_MESSAGE pStubMsg,
   return NULL;
 }
 
-/***********************************************************************
- *           EmbeddedPointerUnmarshall
- */
+/* rpcrt4 does something bizarre with embedded pointers: instead of copying the
+ * struct/array/union from the buffer to memory and then unmarshalling pointers
+ * into it, it unmarshals pointers into the buffer itself and then copies it to
+ * memory. However, it will still attempt to use a user-supplied pointer where
+ * appropriate (i.e. one on stack). Therefore we need to pass both pointers to
+ * this function and to PointerUnmarshall: the pointer (to the buffer) that we
+ * will actually unmarshal into (pDstBuffer), and the pointer (to memory) that
+ * we will attempt to use for storage if possible (pSrcMemoryPtrs). */
 static unsigned char * EmbeddedPointerUnmarshall(PMIDL_STUB_MESSAGE pStubMsg,
                                                  unsigned char *pDstBuffer,
                                                  unsigned char *pSrcMemoryPtrs,
@@ -1243,7 +1273,7 @@ static unsigned char * EmbeddedPointerUnmarshall(PMIDL_STUB_MESSAGE pStubMsg,
 
   TRACE("(%p,%p,%p,%p,%d)\n", pStubMsg, pDstBuffer, pSrcMemoryPtrs, pFormat, fMustAlloc);
 
-  if (*pFormat != RPC_FC_PP) return NULL;
+  if (*pFormat != FC_PP) return NULL;
   pFormat += 2;
 
   if (pStubMsg->PointerBufferMark)
@@ -1253,26 +1283,26 @@ static unsigned char * EmbeddedPointerUnmarshall(PMIDL_STUB_MESSAGE pStubMsg,
     pStubMsg->PointerBufferMark = NULL;
   }
 
-  while (pFormat[0] != RPC_FC_END) {
+  while (pFormat[0] != FC_END) {
     TRACE("pFormat[0] = 0x%x\n", pFormat[0]);
     switch (pFormat[0]) {
     default:
       FIXME("unknown repeat type %d; assuming no repeat\n", pFormat[0]);
       /* fallthrough */
-    case RPC_FC_NO_REPEAT:
+    case FC_NO_REPEAT:
       rep = 1;
       stride = 0;
       count = 1;
       pFormat += 2;
       break;
-    case RPC_FC_FIXED_REPEAT:
+    case FC_FIXED_REPEAT:
       rep = *(const WORD*)&pFormat[2];
       stride = *(const WORD*)&pFormat[4];
       count = *(const WORD*)&pFormat[8];
       pFormat += 10;
       break;
-    case RPC_FC_VARIABLE_REPEAT:
-      rep = (pFormat[1] == RPC_FC_VARIABLE_OFFSET) ? pStubMsg->ActualCount : pStubMsg->MaxCount;
+    case FC_VARIABLE_REPEAT:
+      rep = (pFormat[1] == FC_VARIABLE_OFFSET) ? pStubMsg->ActualCount : pStubMsg->MaxCount;
       stride = *(const WORD*)&pFormat[2];
       count = *(const WORD*)&pFormat[6];
       pFormat += 8;
@@ -1319,7 +1349,7 @@ static void EmbeddedPointerBufferSize(PMIDL_STUB_MESSAGE pStubMsg,
 
   if (pStubMsg->IgnoreEmbeddedPointers) return;
 
-  if (*pFormat != RPC_FC_PP) return;
+  if (*pFormat != FC_PP) return;
   pFormat += 2;
 
   if (pStubMsg->PointerLength)
@@ -1329,25 +1359,25 @@ static void EmbeddedPointerBufferSize(PMIDL_STUB_MESSAGE pStubMsg,
     pStubMsg->PointerLength = 0;
   }
 
-  while (pFormat[0] != RPC_FC_END) {
+  while (pFormat[0] != FC_END) {
     switch (pFormat[0]) {
     default:
       FIXME("unknown repeat type %d; assuming no repeat\n", pFormat[0]);
       /* fallthrough */
-    case RPC_FC_NO_REPEAT:
+    case FC_NO_REPEAT:
       rep = 1;
       stride = 0;
       count = 1;
       pFormat += 2;
       break;
-    case RPC_FC_FIXED_REPEAT:
+    case FC_FIXED_REPEAT:
       rep = *(const WORD*)&pFormat[2];
       stride = *(const WORD*)&pFormat[4];
       count = *(const WORD*)&pFormat[8];
       pFormat += 10;
       break;
-    case RPC_FC_VARIABLE_REPEAT:
-      rep = (pFormat[1] == RPC_FC_VARIABLE_OFFSET) ? pStubMsg->ActualCount : pStubMsg->MaxCount;
+    case FC_VARIABLE_REPEAT:
+      rep = (pFormat[1] == FC_VARIABLE_OFFSET) ? pStubMsg->ActualCount : pStubMsg->MaxCount;
       stride = *(const WORD*)&pFormat[2];
       count = *(const WORD*)&pFormat[6];
       pFormat += 8;
@@ -1399,28 +1429,28 @@ static ULONG EmbeddedPointerMemorySize(PMIDL_STUB_MESSAGE pStubMsg,
     pStubMsg->PointerBufferMark = NULL;
   }
 
-  if (*pFormat != RPC_FC_PP) return 0;
+  if (*pFormat != FC_PP) return 0;
   pFormat += 2;
 
-  while (pFormat[0] != RPC_FC_END) {
+  while (pFormat[0] != FC_END) {
     switch (pFormat[0]) {
     default:
       FIXME("unknown repeat type %d; assuming no repeat\n", pFormat[0]);
       /* fallthrough */
-    case RPC_FC_NO_REPEAT:
+    case FC_NO_REPEAT:
       rep = 1;
       stride = 0;
       count = 1;
       pFormat += 2;
       break;
-    case RPC_FC_FIXED_REPEAT:
+    case FC_FIXED_REPEAT:
       rep = *(const WORD*)&pFormat[2];
       stride = *(const WORD*)&pFormat[4];
       count = *(const WORD*)&pFormat[8];
       pFormat += 10;
       break;
-    case RPC_FC_VARIABLE_REPEAT:
-      rep = (pFormat[1] == RPC_FC_VARIABLE_OFFSET) ? pStubMsg->ActualCount : pStubMsg->MaxCount;
+    case FC_VARIABLE_REPEAT:
+      rep = (pFormat[1] == FC_VARIABLE_OFFSET) ? pStubMsg->ActualCount : pStubMsg->MaxCount;
       stride = *(const WORD*)&pFormat[2];
       count = *(const WORD*)&pFormat[6];
       pFormat += 8;
@@ -1458,28 +1488,28 @@ static void EmbeddedPointerFree(PMIDL_STUB_MESSAGE pStubMsg,
   unsigned i;
 
   TRACE("(%p,%p,%p)\n", pStubMsg, pMemory, pFormat);
-  if (*pFormat != RPC_FC_PP) return;
+  if (*pFormat != FC_PP) return;
   pFormat += 2;
 
-  while (pFormat[0] != RPC_FC_END) {
+  while (pFormat[0] != FC_END) {
     switch (pFormat[0]) {
     default:
       FIXME("unknown repeat type %d; assuming no repeat\n", pFormat[0]);
       /* fallthrough */
-    case RPC_FC_NO_REPEAT:
+    case FC_NO_REPEAT:
       rep = 1;
       stride = 0;
       count = 1;
       pFormat += 2;
       break;
-    case RPC_FC_FIXED_REPEAT:
+    case FC_FIXED_REPEAT:
       rep = *(const WORD*)&pFormat[2];
       stride = *(const WORD*)&pFormat[4];
       count = *(const WORD*)&pFormat[8];
       pFormat += 10;
       break;
-    case RPC_FC_VARIABLE_REPEAT:
-      rep = (pFormat[1] == RPC_FC_VARIABLE_OFFSET) ? pStubMsg->ActualCount : pStubMsg->MaxCount;
+    case FC_VARIABLE_REPEAT:
+      rep = (pFormat[1] == FC_VARIABLE_OFFSET) ? pStubMsg->ActualCount : pStubMsg->MaxCount;
       stride = *(const WORD*)&pFormat[2];
       count = *(const WORD*)&pFormat[6];
       pFormat += 8;
@@ -1517,7 +1547,7 @@ unsigned char * WINAPI NdrPointerMarshall(PMIDL_STUB_MESSAGE pStubMsg,
   /* Increment the buffer here instead of in PointerMarshall,
    * as that is used by embedded pointers which already handle the incrementing
    * the buffer, and shouldn't write any additional pointer data to the wire */
-  if (*pFormat != RPC_FC_RP)
+  if (*pFormat != FC_RP)
   {
     align_pointer_clear(&pStubMsg->Buffer, 4);
     Buffer = pStubMsg->Buffer;
@@ -1543,7 +1573,7 @@ unsigned char * WINAPI NdrPointerUnmarshall(PMIDL_STUB_MESSAGE pStubMsg,
 
   TRACE("(%p,%p,%p,%d)\n", pStubMsg, ppMemory, pFormat, fMustAlloc);
 
-  if (*pFormat == RPC_FC_RP)
+  if (*pFormat == FC_RP)
   {
     Buffer = pStubMsg->Buffer;
     /* Do the NULL ref pointer check here because embedded pointers can be
@@ -1583,7 +1613,7 @@ void WINAPI NdrPointerBufferSize(PMIDL_STUB_MESSAGE pStubMsg,
   /* Increment the buffer length here instead of in PointerBufferSize,
    * as that is used by embedded pointers which already handle the buffer
    * length, and shouldn't write anything more to the wire */
-  if (*pFormat != RPC_FC_RP)
+  if (*pFormat != FC_RP)
   {
     align_length(&pStubMsg->BufferLength, 4);
     safe_buffer_length_increment(pStubMsg, 4);
@@ -1599,7 +1629,7 @@ ULONG WINAPI NdrPointerMemorySize(PMIDL_STUB_MESSAGE pStubMsg,
                                   PFORMAT_STRING pFormat)
 {
     unsigned char *Buffer = pStubMsg->Buffer;
-    if (*pFormat != RPC_FC_RP)
+    if (*pFormat != FC_RP)
     {
         align_pointer(&pStubMsg->Buffer, 4);
         safe_buffer_increment(pStubMsg, 4);
@@ -1648,39 +1678,39 @@ void WINAPI NdrSimpleTypeUnmarshall( PMIDL_STUB_MESSAGE pStubMsg, unsigned char*
 
     switch(FormatChar)
     {
-    case RPC_FC_BYTE:
-    case RPC_FC_CHAR:
-    case RPC_FC_SMALL:
-    case RPC_FC_USMALL:
+    case FC_BYTE:
+    case FC_CHAR:
+    case FC_SMALL:
+    case FC_USMALL:
         BASE_TYPE_UNMARSHALL(UCHAR);
         TRACE("value: 0x%02x\n", *pMemory);
         break;
-    case RPC_FC_WCHAR:
-    case RPC_FC_SHORT:
-    case RPC_FC_USHORT:
+    case FC_WCHAR:
+    case FC_SHORT:
+    case FC_USHORT:
         BASE_TYPE_UNMARSHALL(USHORT);
         TRACE("value: 0x%04x\n", *(USHORT *)pMemory);
         break;
-    case RPC_FC_LONG:
-    case RPC_FC_ULONG:
-    case RPC_FC_ERROR_STATUS_T:
-    case RPC_FC_ENUM32:
+    case FC_LONG:
+    case FC_ULONG:
+    case FC_ERROR_STATUS_T:
+    case FC_ENUM32:
         BASE_TYPE_UNMARSHALL(ULONG);
         TRACE("value: 0x%08x\n", *(ULONG *)pMemory);
         break;
-   case RPC_FC_FLOAT:
+   case FC_FLOAT:
         BASE_TYPE_UNMARSHALL(float);
         TRACE("value: %f\n", *(float *)pMemory);
         break;
-    case RPC_FC_DOUBLE:
+    case FC_DOUBLE:
         BASE_TYPE_UNMARSHALL(double);
         TRACE("value: %f\n", *(double *)pMemory);
         break;
-    case RPC_FC_HYPER:
+    case FC_HYPER:
         BASE_TYPE_UNMARSHALL(ULONGLONG);
         TRACE("value: %s\n", wine_dbgstr_longlong(*(ULONGLONG *)pMemory));
         break;
-    case RPC_FC_ENUM16:
+    case FC_ENUM16:
         align_pointer(&pStubMsg->Buffer, sizeof(USHORT));
         TRACE("pMemory: %p\n", pMemory);
         /* 16-bits on the wire, but int in memory */
@@ -1688,21 +1718,21 @@ void WINAPI NdrSimpleTypeUnmarshall( PMIDL_STUB_MESSAGE pStubMsg, unsigned char*
         pStubMsg->Buffer += sizeof(USHORT);
         TRACE("value: 0x%08x\n", *(UINT *)pMemory);
         break;
-    case RPC_FC_INT3264:
+    case FC_INT3264:
         align_pointer(&pStubMsg->Buffer, sizeof(INT));
         /* 32-bits on the wire, but int_ptr in memory */
         *(INT_PTR *)pMemory = *(INT *)pStubMsg->Buffer;
         pStubMsg->Buffer += sizeof(INT);
         TRACE("value: 0x%08lx\n", *(INT_PTR *)pMemory);
         break;
-    case RPC_FC_UINT3264:
+    case FC_UINT3264:
         align_pointer(&pStubMsg->Buffer, sizeof(UINT));
         /* 32-bits on the wire, but int_ptr in memory */
         *(UINT_PTR *)pMemory = *(UINT *)pStubMsg->Buffer;
         pStubMsg->Buffer += sizeof(UINT);
         TRACE("value: 0x%08lx\n", *(UINT_PTR *)pMemory);
         break;
-    case RPC_FC_IGNORE:
+    case FC_IGNORE:
         break;
     default:
         FIXME("Unhandled base type: 0x%02x\n", FormatChar);
@@ -1725,7 +1755,7 @@ unsigned char * WINAPI NdrSimpleStructMarshall(PMIDL_STUB_MESSAGE pStubMsg,
   pStubMsg->BufferMark = pStubMsg->Buffer;
   safe_copy_to_buffer(pStubMsg, pMemory, size);
 
-  if (pFormat[0] != RPC_FC_STRUCT)
+  if (pFormat[0] != FC_STRUCT)
     EmbeddedPointerMarshall(pStubMsg, pMemory, pFormat+4);
 
   return NULL;
@@ -1746,7 +1776,7 @@ unsigned char * WINAPI NdrSimpleStructUnmarshall(PMIDL_STUB_MESSAGE pStubMsg,
   align_pointer(&pStubMsg->Buffer, pFormat[1] + 1);
 
   if (fMustAlloc)
-    *ppMemory = NdrAllocate(pStubMsg, size);
+    *ppMemory = NdrAllocateZero(pStubMsg, size);
   else
   {
     if (!pStubMsg->IsClient && !*ppMemory)
@@ -1756,7 +1786,7 @@ unsigned char * WINAPI NdrSimpleStructUnmarshall(PMIDL_STUB_MESSAGE pStubMsg,
 
   saved_buffer = pStubMsg->BufferMark = pStubMsg->Buffer;
   safe_buffer_increment(pStubMsg, size);
-  if (pFormat[0] == RPC_FC_PSTRUCT)
+  if (pFormat[0] == FC_PSTRUCT)
       EmbeddedPointerUnmarshall(pStubMsg, saved_buffer, *ppMemory, pFormat+4, fMustAlloc);
 
   TRACE("copying %p to %p\n", saved_buffer, *ppMemory);
@@ -1779,7 +1809,7 @@ void WINAPI NdrSimpleStructBufferSize(PMIDL_STUB_MESSAGE pStubMsg,
   align_length(&pStubMsg->BufferLength, pFormat[1] + 1);
 
   safe_buffer_length_increment(pStubMsg, size);
-  if (pFormat[0] != RPC_FC_STRUCT)
+  if (pFormat[0] != FC_STRUCT)
     EmbeddedPointerBufferSize(pStubMsg, pMemory, pFormat+4);
 }
 
@@ -1797,7 +1827,7 @@ ULONG WINAPI NdrSimpleStructMemorySize(PMIDL_STUB_MESSAGE pStubMsg,
   pStubMsg->MemorySize += size;
   safe_buffer_increment(pStubMsg, size);
 
-  if (pFormat[0] != RPC_FC_STRUCT)
+  if (pFormat[0] != FC_STRUCT)
     EmbeddedPointerMemorySize(pStubMsg, pFormat+4);
   return pStubMsg->MemorySize;
 }
@@ -1810,7 +1840,7 @@ void WINAPI NdrSimpleStructFree(PMIDL_STUB_MESSAGE pStubMsg,
                                 PFORMAT_STRING pFormat)
 {
   TRACE("(%p,%p,%p)\n", pStubMsg, pMemory, pFormat);
-  if (pFormat[0] != RPC_FC_STRUCT)
+  if (pFormat[0] != FC_STRUCT)
     EmbeddedPointerFree(pStubMsg, pMemory, pFormat+4);
 }
 
@@ -1824,18 +1854,18 @@ static inline void array_compute_and_size_conformance(
 
   switch (fc)
   {
-  case RPC_FC_CARRAY:
+  case FC_CARRAY:
     ComputeConformance(pStubMsg, pMemory, pFormat+4, 0);
     SizeConformance(pStubMsg);
     break;
-  case RPC_FC_CVARRAY:
+  case FC_CVARRAY:
     pFormat = ComputeConformance(pStubMsg, pMemory, pFormat + 4, 0);
     pFormat = ComputeVariance(pStubMsg, pMemory, pFormat, 0);
     SizeConformance(pStubMsg);
     break;
-  case RPC_FC_C_CSTRING:
-  case RPC_FC_C_WSTRING:
-    if (fc == RPC_FC_C_CSTRING)
+  case FC_C_CSTRING:
+  case FC_C_WSTRING:
+    if (fc == FC_C_CSTRING)
     {
       TRACE("string=%s\n", debugstr_a((const char *)pMemory));
       pStubMsg->ActualCount = strlen((const char *)pMemory)+1;
@@ -1846,14 +1876,14 @@ static inline void array_compute_and_size_conformance(
       pStubMsg->ActualCount = strlenW((LPCWSTR)pMemory)+1;
     }
 
-    if (pFormat[1] == RPC_FC_STRING_SIZED)
+    if (pFormat[1] == FC_STRING_SIZED)
       pFormat = ComputeConformance(pStubMsg, pMemory, pFormat + 2, 0);
     else
       pStubMsg->MaxCount = pStubMsg->ActualCount;
 
     SizeConformance(pStubMsg);
     break;
-  case RPC_FC_BOGUS_ARRAY:
+  case FC_BOGUS_ARRAY:
     count = *(const WORD *)(pFormat + 2);
     pFormat += 4;
     if (IsConformanceOrVariancePresent(pFormat)) SizeConformance(pStubMsg);
@@ -1876,7 +1906,7 @@ static inline void array_buffer_size(
 
   switch (fc)
   {
-  case RPC_FC_CARRAY:
+  case FC_CARRAY:
     esize = *(const WORD*)(pFormat+2);
     alignment = pFormat[1] + 1;
 
@@ -1891,7 +1921,7 @@ static inline void array_buffer_size(
     if (fHasPointers)
       EmbeddedPointerBufferSize(pStubMsg, pMemory, pFormat);
     break;
-  case RPC_FC_CVARRAY:
+  case FC_CVARRAY:
     esize = *(const WORD*)(pFormat+2);
     alignment = pFormat[1] + 1;
 
@@ -1908,9 +1938,9 @@ static inline void array_buffer_size(
     if (fHasPointers)
       EmbeddedPointerBufferSize(pStubMsg, pMemory, pFormat);
     break;
-  case RPC_FC_C_CSTRING:
-  case RPC_FC_C_WSTRING:
-    if (fc == RPC_FC_C_CSTRING)
+  case FC_C_CSTRING:
+  case FC_C_WSTRING:
+    if (fc == FC_C_CSTRING)
       esize = 1;
     else
       esize = 2;
@@ -1920,7 +1950,7 @@ static inline void array_buffer_size(
     size = safe_multiply(esize, pStubMsg->ActualCount);
     safe_buffer_length_increment(pStubMsg, size);
     break;
-  case RPC_FC_BOGUS_ARRAY:
+  case FC_BOGUS_ARRAY:
     alignment = pFormat[1] + 1;
     pFormat = SkipConformance(pStubMsg, pFormat + 4);
     if (IsConformanceOrVariancePresent(pFormat)) SizeVariance(pStubMsg);
@@ -1947,18 +1977,18 @@ static inline void array_compute_and_write_conformance(
 
   switch (fc)
   {
-  case RPC_FC_CARRAY:
+  case FC_CARRAY:
     ComputeConformance(pStubMsg, pMemory, pFormat+4, 0);
     WriteConformance(pStubMsg);
     break;
-  case RPC_FC_CVARRAY:
+  case FC_CVARRAY:
     pFormat = ComputeConformance(pStubMsg, pMemory, pFormat + 4, 0);
     pFormat = ComputeVariance(pStubMsg, pMemory, pFormat, 0);
     WriteConformance(pStubMsg);
     break;
-  case RPC_FC_C_CSTRING:
-  case RPC_FC_C_WSTRING:
-    if (fc == RPC_FC_C_CSTRING)
+  case FC_C_CSTRING:
+  case FC_C_WSTRING:
+    if (fc == FC_C_CSTRING)
     {
       TRACE("string=%s\n", debugstr_a((const char *)pMemory));
       pStubMsg->ActualCount = strlen((const char *)pMemory)+1;
@@ -1968,14 +1998,14 @@ static inline void array_compute_and_write_conformance(
       TRACE("string=%s\n", debugstr_w((LPCWSTR)pMemory));
       pStubMsg->ActualCount = strlenW((LPCWSTR)pMemory)+1;
     }
-    if (pFormat[1] == RPC_FC_STRING_SIZED)
+    if (pFormat[1] == FC_STRING_SIZED)
       pFormat = ComputeConformance(pStubMsg, pMemory, pFormat + 2, 0);
     else
       pStubMsg->MaxCount = pStubMsg->ActualCount;
     pStubMsg->Offset = 0;
     WriteConformance(pStubMsg);
     break;
-  case RPC_FC_BOGUS_ARRAY:
+  case FC_BOGUS_ARRAY:
     def = *(const WORD *)(pFormat + 2);
     pFormat += 4;
     conformance_present = IsConformanceOrVariancePresent(pFormat);
@@ -1999,7 +2029,7 @@ static inline void array_write_variance_and_marshall(
 
   switch (fc)
   {
-  case RPC_FC_CARRAY:
+  case FC_CARRAY:
     esize = *(const WORD*)(pFormat+2);
     alignment = pFormat[1] + 1;
 
@@ -2015,7 +2045,7 @@ static inline void array_write_variance_and_marshall(
     if (fHasPointers)
       EmbeddedPointerMarshall(pStubMsg, pMemory, pFormat);
     break;
-  case RPC_FC_CVARRAY:
+  case FC_CVARRAY:
     esize = *(const WORD*)(pFormat+2);
     alignment = pFormat[1] + 1;
 
@@ -2035,9 +2065,9 @@ static inline void array_write_variance_and_marshall(
     if (fHasPointers)
       EmbeddedPointerMarshall(pStubMsg, pMemory, pFormat);
     break;
-  case RPC_FC_C_CSTRING:
-  case RPC_FC_C_WSTRING:
-    if (fc == RPC_FC_C_CSTRING)
+  case FC_C_CSTRING:
+  case FC_C_WSTRING:
+    if (fc == FC_C_CSTRING)
       esize = 1;
     else
       esize = 2;
@@ -2047,7 +2077,7 @@ static inline void array_write_variance_and_marshall(
     size = safe_multiply(esize, pStubMsg->ActualCount);
     safe_copy_to_buffer(pStubMsg, pMemory, size); /* the string itself */
     break;
-  case RPC_FC_BOGUS_ARRAY:
+  case FC_BOGUS_ARRAY:
     alignment = pFormat[1] + 1;
     pFormat = SkipConformance(pStubMsg, pFormat + 4);
     if (IsConformanceOrVariancePresent(pFormat)) WriteVariance(pStubMsg);
@@ -2072,27 +2102,27 @@ static inline ULONG array_read_conformance(
 
   switch (fc)
   {
-  case RPC_FC_CARRAY:
+  case FC_CARRAY:
     esize = *(const WORD*)(pFormat+2);
     pFormat = ReadConformance(pStubMsg, pFormat+4);
     return safe_multiply(esize, pStubMsg->MaxCount);
-  case RPC_FC_CVARRAY:
+  case FC_CVARRAY:
     esize = *(const WORD*)(pFormat+2);
     pFormat = ReadConformance(pStubMsg, pFormat+4);
     return safe_multiply(esize, pStubMsg->MaxCount);
-  case RPC_FC_C_CSTRING:
-  case RPC_FC_C_WSTRING:
-    if (fc == RPC_FC_C_CSTRING)
+  case FC_C_CSTRING:
+  case FC_C_WSTRING:
+    if (fc == FC_C_CSTRING)
       esize = 1;
     else
       esize = 2;
 
-    if (pFormat[1] == RPC_FC_STRING_SIZED)
+    if (pFormat[1] == FC_STRING_SIZED)
       ReadConformance(pStubMsg, pFormat + 2);
     else
       ReadConformance(pStubMsg, NULL);
     return safe_multiply(esize, pStubMsg->MaxCount);
-  case RPC_FC_BOGUS_ARRAY:
+  case FC_BOGUS_ARRAY:
     def = *(const WORD *)(pFormat + 2);
     pFormat += 4;
     if (IsConformanceOrVariancePresent(pFormat)) pFormat = ReadConformance(pStubMsg, pFormat);
@@ -2124,7 +2154,7 @@ static inline ULONG array_read_variance_and_unmarshall(
 
   switch (fc)
   {
-  case RPC_FC_CARRAY:
+  case FC_CARRAY:
     esize = *(const WORD*)(pFormat+2);
     alignment = pFormat[1] + 1;
 
@@ -2137,7 +2167,7 @@ static inline ULONG array_read_variance_and_unmarshall(
     if (fUnmarshall)
     {
       if (fMustAlloc)
-        *ppMemory = NdrAllocate(pStubMsg, memsize);
+        *ppMemory = NdrAllocateZero(pStubMsg, memsize);
       else
       {
         if (fUseBufferMemoryServer && !pStubMsg->IsClient && !*ppMemory)
@@ -2156,7 +2186,7 @@ static inline ULONG array_read_variance_and_unmarshall(
         memcpy(*ppMemory, saved_buffer, bufsize);
     }
     return bufsize;
-  case RPC_FC_CVARRAY:
+  case FC_CVARRAY:
     esize = *(const WORD*)(pFormat+2);
     alignment = pFormat[1] + 1;
 
@@ -2176,7 +2206,7 @@ static inline ULONG array_read_variance_and_unmarshall(
       if (!fMustAlloc && !*ppMemory)
         fMustAlloc = TRUE;
       if (fMustAlloc)
-        *ppMemory = NdrAllocate(pStubMsg, memsize);
+        *ppMemory = NdrAllocateZero(pStubMsg, memsize);
       saved_buffer = pStubMsg->Buffer;
       safe_buffer_increment(pStubMsg, bufsize);
 
@@ -2187,16 +2217,16 @@ static inline ULONG array_read_variance_and_unmarshall(
       memcpy(*ppMemory + offset, saved_buffer, bufsize);
     }
     return bufsize;
-  case RPC_FC_C_CSTRING:
-  case RPC_FC_C_WSTRING:
-    if (fc == RPC_FC_C_CSTRING)
+  case FC_C_CSTRING:
+  case FC_C_WSTRING:
+    if (fc == FC_C_CSTRING)
       esize = 1;
     else
       esize = 2;
 
     ReadVariance(pStubMsg, NULL, pStubMsg->MaxCount);
 
-    if (pFormat[1] != RPC_FC_STRING_SIZED && (pStubMsg->MaxCount != pStubMsg->ActualCount))
+    if (pFormat[1] != FC_STRING_SIZED && (pStubMsg->MaxCount != pStubMsg->ActualCount))
     {
       ERR("buffer size %d must equal memory size %ld for non-sized conformant strings\n",
           pStubMsg->ActualCount, pStubMsg->MaxCount);
@@ -2233,14 +2263,14 @@ static inline ULONG array_read_variance_and_unmarshall(
       else
         safe_copy_from_buffer(pStubMsg, *ppMemory, bufsize);
 
-      if (*pFormat == RPC_FC_C_CSTRING)
+      if (*pFormat == FC_C_CSTRING)
         TRACE("string=%s\n", debugstr_a((char*)*ppMemory));
       else
         TRACE("string=%s\n", debugstr_w((LPWSTR)*ppMemory));
     }
     return bufsize;
 
-  case RPC_FC_BOGUS_ARRAY:
+  case FC_BOGUS_ARRAY:
     alignment = pFormat[1] + 1;
     pFormat = SkipConformance(pStubMsg, pFormat + 4);
     pFormat = ReadVariance(pStubMsg, pFormat, pStubMsg->MaxCount);
@@ -2253,7 +2283,7 @@ static inline ULONG array_read_variance_and_unmarshall(
     if (!fMustAlloc && !*ppMemory)
       fMustAlloc = TRUE;
     if (fMustAlloc)
-      *ppMemory = NdrAllocate(pStubMsg, memsize);
+      *ppMemory = NdrAllocateZero(pStubMsg, memsize);
 
     align_pointer(&pStubMsg->Buffer, alignment);
     saved_buffer = pStubMsg->Buffer;
@@ -2281,7 +2311,7 @@ static inline void array_memory_size(
 
   switch (fc)
   {
-  case RPC_FC_CARRAY:
+  case FC_CARRAY:
     esize = *(const WORD*)(pFormat+2);
     alignment = pFormat[1] + 1;
 
@@ -2298,7 +2328,7 @@ static inline void array_memory_size(
     if (fHasPointers)
       EmbeddedPointerMemorySize(pStubMsg, pFormat);
     break;
-  case RPC_FC_CVARRAY:
+  case FC_CVARRAY:
     esize = *(const WORD*)(pFormat+2);
     alignment = pFormat[1] + 1;
 
@@ -2318,16 +2348,16 @@ static inline void array_memory_size(
     if (fHasPointers)
       EmbeddedPointerMemorySize(pStubMsg, pFormat);
     break;
-  case RPC_FC_C_CSTRING:
-  case RPC_FC_C_WSTRING:
-    if (fc == RPC_FC_C_CSTRING)
+  case FC_C_CSTRING:
+  case FC_C_WSTRING:
+    if (fc == FC_C_CSTRING)
       esize = 1;
     else
       esize = 2;
 
     ReadVariance(pStubMsg, NULL, pStubMsg->MaxCount);
 
-    if (pFormat[1] != RPC_FC_STRING_SIZED && (pStubMsg->MaxCount != pStubMsg->ActualCount))
+    if (pFormat[1] != FC_STRING_SIZED && (pStubMsg->MaxCount != pStubMsg->ActualCount))
     {
       ERR("buffer size %d must equal memory size %ld for non-sized conformant strings\n",
           pStubMsg->ActualCount, pStubMsg->MaxCount);
@@ -2347,7 +2377,7 @@ static inline void array_memory_size(
     safe_buffer_increment(pStubMsg, bufsize);
     pStubMsg->MemorySize += memsize;
     break;
-  case RPC_FC_BOGUS_ARRAY:
+  case FC_BOGUS_ARRAY:
     alignment = pFormat[1] + 1;
     pFormat = SkipConformance(pStubMsg, pFormat + 4);
     pFormat = ReadVariance(pStubMsg, pFormat, pStubMsg->MaxCount);
@@ -2379,22 +2409,22 @@ static inline void array_free(
 
   switch (fc)
   {
-  case RPC_FC_CARRAY:
+  case FC_CARRAY:
     pFormat = ComputeConformance(pStubMsg, pMemory, pFormat+4, 0);
     if (fHasPointers)
       EmbeddedPointerFree(pStubMsg, pMemory, pFormat);
     break;
-  case RPC_FC_CVARRAY:
+  case FC_CVARRAY:
     pFormat = ComputeConformance(pStubMsg, pMemory, pFormat+4, 0);
     pFormat = ComputeVariance(pStubMsg, pMemory, pFormat, 0);
     if (fHasPointers)
       EmbeddedPointerFree(pStubMsg, pMemory, pFormat);
     break;
-  case RPC_FC_C_CSTRING:
-  case RPC_FC_C_WSTRING:
+  case FC_C_CSTRING:
+  case FC_C_WSTRING:
     /* No embedded pointers so nothing to do */
     break;
-  case RPC_FC_BOGUS_ARRAY:
+  case FC_BOGUS_ARRAY:
       count = *(const WORD *)(pFormat + 2);
       pFormat = ComputeConformance(pStubMsg, pMemory, pFormat + 4, count);
       pFormat = ComputeVariance(pStubMsg, pMemory, pFormat, pStubMsg->MaxCount);
@@ -2434,22 +2464,22 @@ unsigned char *WINAPI NdrConformantStringMarshall(MIDL_STUB_MESSAGE *pStubMsg,
 {
   TRACE("(pStubMsg == ^%p, pszMessage == ^%p, pFormat == ^%p)\n", pStubMsg, pszMessage, pFormat);
 
-  if (pFormat[0] != RPC_FC_C_CSTRING && pFormat[0] != RPC_FC_C_WSTRING) {
+  if (pFormat[0] != FC_C_CSTRING && pFormat[0] != FC_C_WSTRING) {
     ERR("Unhandled string type: %#x\n", pFormat[0]);
     RpcRaiseException(RPC_X_BAD_STUB_DATA);
   }
 
   /* allow compiler to optimise inline function by passing constant into
    * these functions */
-  if (pFormat[0] == RPC_FC_C_CSTRING) {
-    array_compute_and_write_conformance(RPC_FC_C_CSTRING, pStubMsg, pszMessage,
+  if (pFormat[0] == FC_C_CSTRING) {
+    array_compute_and_write_conformance(FC_C_CSTRING, pStubMsg, pszMessage,
                                         pFormat);
-    array_write_variance_and_marshall(RPC_FC_C_CSTRING, pStubMsg, pszMessage,
+    array_write_variance_and_marshall(FC_C_CSTRING, pStubMsg, pszMessage,
                                       pFormat, TRUE /* fHasPointers */);
   } else {
-    array_compute_and_write_conformance(RPC_FC_C_WSTRING, pStubMsg, pszMessage,
+    array_compute_and_write_conformance(FC_C_WSTRING, pStubMsg, pszMessage,
                                         pFormat);
-    array_write_variance_and_marshall(RPC_FC_C_WSTRING, pStubMsg, pszMessage,
+    array_write_variance_and_marshall(FC_C_WSTRING, pStubMsg, pszMessage,
                                       pFormat, TRUE /* fHasPointers */);
   }
 
@@ -2464,22 +2494,22 @@ void WINAPI NdrConformantStringBufferSize(PMIDL_STUB_MESSAGE pStubMsg,
 {
   TRACE("(pStubMsg == ^%p, pMemory == ^%p, pFormat == ^%p)\n", pStubMsg, pMemory, pFormat);
 
-  if (pFormat[0] != RPC_FC_C_CSTRING && pFormat[0] != RPC_FC_C_WSTRING) {
+  if (pFormat[0] != FC_C_CSTRING && pFormat[0] != FC_C_WSTRING) {
     ERR("Unhandled string type: %#x\n", pFormat[0]);
     RpcRaiseException(RPC_X_BAD_STUB_DATA);
   }
 
   /* allow compiler to optimise inline function by passing constant into
    * these functions */
-  if (pFormat[0] == RPC_FC_C_CSTRING) {
-    array_compute_and_size_conformance(RPC_FC_C_CSTRING, pStubMsg, pMemory,
+  if (pFormat[0] == FC_C_CSTRING) {
+    array_compute_and_size_conformance(FC_C_CSTRING, pStubMsg, pMemory,
                                        pFormat);
-    array_buffer_size(RPC_FC_C_CSTRING, pStubMsg, pMemory, pFormat,
+    array_buffer_size(FC_C_CSTRING, pStubMsg, pMemory, pFormat,
                       TRUE /* fHasPointers */);
   } else {
-    array_compute_and_size_conformance(RPC_FC_C_WSTRING, pStubMsg, pMemory,
+    array_compute_and_size_conformance(FC_C_WSTRING, pStubMsg, pMemory,
                                        pFormat);
-    array_buffer_size(RPC_FC_C_WSTRING, pStubMsg, pMemory, pFormat,
+    array_buffer_size(FC_C_WSTRING, pStubMsg, pMemory, pFormat,
                       TRUE /* fHasPointers */);
   }
 }
@@ -2492,20 +2522,20 @@ ULONG WINAPI NdrConformantStringMemorySize( PMIDL_STUB_MESSAGE pStubMsg,
 {
   TRACE("(pStubMsg == ^%p, pFormat == ^%p)\n", pStubMsg, pFormat);
 
-  if (pFormat[0] != RPC_FC_C_CSTRING && pFormat[0] != RPC_FC_C_WSTRING) {
+  if (pFormat[0] != FC_C_CSTRING && pFormat[0] != FC_C_WSTRING) {
     ERR("Unhandled string type: %#x\n", pFormat[0]);
     RpcRaiseException(RPC_X_BAD_STUB_DATA);
   }
 
   /* allow compiler to optimise inline function by passing constant into
    * these functions */
-  if (pFormat[0] == RPC_FC_C_CSTRING) {
-    array_read_conformance(RPC_FC_C_CSTRING, pStubMsg, pFormat);
-    array_memory_size(RPC_FC_C_CSTRING, pStubMsg, pFormat,
+  if (pFormat[0] == FC_C_CSTRING) {
+    array_read_conformance(FC_C_CSTRING, pStubMsg, pFormat);
+    array_memory_size(FC_C_CSTRING, pStubMsg, pFormat,
                       TRUE /* fHasPointers */);
   } else {
-    array_read_conformance(RPC_FC_C_WSTRING, pStubMsg, pFormat);
-    array_memory_size(RPC_FC_C_WSTRING, pStubMsg, pFormat,
+    array_read_conformance(FC_C_WSTRING, pStubMsg, pFormat);
+    array_memory_size(FC_C_WSTRING, pStubMsg, pFormat,
                       TRUE /* fHasPointers */);
   }
 
@@ -2521,22 +2551,22 @@ unsigned char *WINAPI NdrConformantStringUnmarshall( PMIDL_STUB_MESSAGE pStubMsg
   TRACE("(pStubMsg == ^%p, *pMemory == ^%p, pFormat == ^%p, fMustAlloc == %u)\n",
     pStubMsg, *ppMemory, pFormat, fMustAlloc);
 
-  if (pFormat[0] != RPC_FC_C_CSTRING && pFormat[0] != RPC_FC_C_WSTRING) {
+  if (pFormat[0] != FC_C_CSTRING && pFormat[0] != FC_C_WSTRING) {
     ERR("Unhandled string type: %#x\n", *pFormat);
     RpcRaiseException(RPC_X_BAD_STUB_DATA);
   }
 
   /* allow compiler to optimise inline function by passing constant into
    * these functions */
-  if (pFormat[0] == RPC_FC_C_CSTRING) {
-    array_read_conformance(RPC_FC_C_CSTRING, pStubMsg, pFormat);
-    array_read_variance_and_unmarshall(RPC_FC_C_CSTRING, pStubMsg, ppMemory,
+  if (pFormat[0] == FC_C_CSTRING) {
+    array_read_conformance(FC_C_CSTRING, pStubMsg, pFormat);
+    array_read_variance_and_unmarshall(FC_C_CSTRING, pStubMsg, ppMemory,
                                        pFormat, fMustAlloc,
                                        TRUE /* fUseBufferMemoryServer */,
                                        TRUE /* fUnmarshall */);
   } else {
-    array_read_conformance(RPC_FC_C_WSTRING, pStubMsg, pFormat);
-    array_read_variance_and_unmarshall(RPC_FC_C_WSTRING, pStubMsg, ppMemory,
+    array_read_conformance(FC_C_WSTRING, pStubMsg, pFormat);
+    array_read_variance_and_unmarshall(FC_C_WSTRING, pStubMsg, ppMemory,
                                        pFormat, fMustAlloc,
                                        TRUE /* fUseBufferMemoryServer */,
                                        TRUE /* fUnmarshall */);
@@ -2558,7 +2588,7 @@ unsigned char *  WINAPI NdrNonConformantStringMarshall(PMIDL_STUB_MESSAGE pStubM
 
   maxsize = *(const USHORT *)&pFormat[2];
 
-  if (*pFormat == RPC_FC_CSTRING)
+  if (*pFormat == FC_CSTRING)
   {
     ULONG i = 0;
     const char *str = (const char *)pMemory;
@@ -2567,7 +2597,7 @@ unsigned char *  WINAPI NdrNonConformantStringMarshall(PMIDL_STUB_MESSAGE pStubM
     pStubMsg->ActualCount = i + 1;
     esize = 1;
   }
-  else if (*pFormat == RPC_FC_WSTRING)
+  else if (*pFormat == FC_WSTRING)
   {
     ULONG i = 0;
     const WCHAR *str = (const WCHAR *)pMemory;
@@ -2613,8 +2643,8 @@ unsigned char *  WINAPI NdrNonConformantStringUnmarshall(PMIDL_STUB_MESSAGE pStu
     RpcRaiseException(RPC_S_INVALID_BOUND);
   }
 
-  if (*pFormat == RPC_FC_CSTRING) esize = 1;
-  else if (*pFormat == RPC_FC_WSTRING) esize = 2;
+  if (*pFormat == FC_CSTRING) esize = 1;
+  else if (*pFormat == FC_WSTRING) esize = 2;
   else
   {
     ERR("Unhandled string type: %#x\n", *pFormat);
@@ -2633,10 +2663,10 @@ unsigned char *  WINAPI NdrNonConformantStringUnmarshall(PMIDL_STUB_MESSAGE pStu
 
   safe_copy_from_buffer(pStubMsg, *ppMemory, bufsize);
 
-  if (*pFormat == RPC_FC_CSTRING) {
+  if (*pFormat == FC_CSTRING) {
     TRACE("string=%s\n", debugstr_an((char*)*ppMemory, pStubMsg->ActualCount));
   }
-  else if (*pFormat == RPC_FC_WSTRING) {
+  else if (*pFormat == FC_WSTRING) {
     TRACE("string=%s\n", debugstr_wn((LPWSTR)*ppMemory, pStubMsg->ActualCount));
   }
 
@@ -2658,7 +2688,7 @@ void WINAPI NdrNonConformantStringBufferSize(PMIDL_STUB_MESSAGE pStubMsg,
 
   SizeVariance(pStubMsg);
 
-  if (*pFormat == RPC_FC_CSTRING)
+  if (*pFormat == FC_CSTRING)
   {
     ULONG i = 0;
     const char *str = (const char *)pMemory;
@@ -2667,7 +2697,7 @@ void WINAPI NdrNonConformantStringBufferSize(PMIDL_STUB_MESSAGE pStubMsg,
     pStubMsg->ActualCount = i + 1;
     esize = 1;
   }
-  else if (*pFormat == RPC_FC_WSTRING)
+  else if (*pFormat == FC_WSTRING)
   {
     ULONG i = 0;
     const WCHAR *str = (const WCHAR *)pMemory;
@@ -2705,8 +2735,8 @@ ULONG WINAPI NdrNonConformantStringMemorySize(PMIDL_STUB_MESSAGE pStubMsg,
     RpcRaiseException(RPC_S_INVALID_BOUND);
   }
 
-  if (*pFormat == RPC_FC_CSTRING) esize = 1;
-  else if (*pFormat == RPC_FC_WSTRING) esize = 2;
+  if (*pFormat == FC_CSTRING) esize = 1;
+  else if (*pFormat == FC_WSTRING) esize = 2;
   else
   {
     ERR("Unhandled string type: %#x\n", *pFormat);
@@ -2740,54 +2770,55 @@ static ULONG EmbeddedComplexSize(MIDL_STUB_MESSAGE *pStubMsg,
                                  PFORMAT_STRING pFormat)
 {
   switch (*pFormat) {
-  case RPC_FC_STRUCT:
-  case RPC_FC_PSTRUCT:
-  case RPC_FC_CSTRUCT:
-  case RPC_FC_BOGUS_STRUCT:
-  case RPC_FC_SMFARRAY:
-  case RPC_FC_SMVARRAY:
-  case RPC_FC_CSTRING:
+  case FC_STRUCT:
+  case FC_PSTRUCT:
+  case FC_CSTRUCT:
+  case FC_BOGUS_STRUCT:
+  case FC_SMFARRAY:
+  case FC_SMVARRAY:
+  case FC_CSTRING:
     return *(const WORD*)&pFormat[2];
-  case RPC_FC_USER_MARSHAL:
+  case FC_LGFARRAY:
+  case FC_LGVARRAY:
+    return *(const ULONG*)&pFormat[2];
+  case FC_USER_MARSHAL:
     return *(const WORD*)&pFormat[4];
-  case RPC_FC_RANGE: {
+  case FC_RANGE: {
     switch (((const NDR_RANGE *)pFormat)->flags_type & 0xf) {
-    case RPC_FC_BYTE:
-    case RPC_FC_CHAR:
-    case RPC_FC_SMALL:
-    case RPC_FC_USMALL:
+    case FC_BYTE:
+    case FC_CHAR:
+    case FC_SMALL:
+    case FC_USMALL:
         return sizeof(UCHAR);
-    case RPC_FC_WCHAR:
-    case RPC_FC_SHORT:
-    case RPC_FC_USHORT:
+    case FC_WCHAR:
+    case FC_SHORT:
+    case FC_USHORT:
         return sizeof(USHORT);
-    case RPC_FC_LONG:
-    case RPC_FC_ULONG:
-    case RPC_FC_ENUM32:
-    case RPC_FC_INT3264:
-    case RPC_FC_UINT3264:
+    case FC_LONG:
+    case FC_ULONG:
+    case FC_ENUM32:
         return sizeof(ULONG);
-    case RPC_FC_FLOAT:
+    case FC_FLOAT:
         return sizeof(float);
-    case RPC_FC_DOUBLE:
+    case FC_DOUBLE:
         return sizeof(double);
-    case RPC_FC_HYPER:
+    case FC_HYPER:
         return sizeof(ULONGLONG);
-    case RPC_FC_ENUM16:
+    case FC_ENUM16:
         return sizeof(UINT);
     default:
         ERR("unknown type 0x%x\n", ((const NDR_RANGE *)pFormat)->flags_type & 0xf);
         RpcRaiseException(RPC_X_BAD_STUB_DATA);
     }
   }
-  case RPC_FC_NON_ENCAPSULATED_UNION:
+  case FC_NON_ENCAPSULATED_UNION:
     pFormat += 2;
     pFormat = SkipConformance(pStubMsg, pFormat);
     pFormat += *(const SHORT*)pFormat;
     return *(const SHORT*)pFormat;
-  case RPC_FC_IP:
+  case FC_IP:
     return sizeof(void *);
-  case RPC_FC_WSTRING:
+  case FC_WSTRING:
     return *(const WORD*)&pFormat[2] * 2;
   default:
     FIXME("unhandled embedded type %02x\n", *pFormat);
@@ -2816,28 +2847,29 @@ static unsigned char * ComplexMarshall(PMIDL_STUB_MESSAGE pStubMsg,
                                        PFORMAT_STRING pFormat,
                                        PFORMAT_STRING pPointer)
 {
+  unsigned char *mem_base = pMemory;
   PFORMAT_STRING desc;
   NDR_MARSHALL m;
   ULONG size;
 
-  while (*pFormat != RPC_FC_END) {
+  while (*pFormat != FC_END) {
     switch (*pFormat) {
-    case RPC_FC_BYTE:
-    case RPC_FC_CHAR:
-    case RPC_FC_SMALL:
-    case RPC_FC_USMALL:
+    case FC_BYTE:
+    case FC_CHAR:
+    case FC_SMALL:
+    case FC_USMALL:
       TRACE("byte=%d <= %p\n", *(WORD*)pMemory, pMemory);
       safe_copy_to_buffer(pStubMsg, pMemory, 1);
       pMemory += 1;
       break;
-    case RPC_FC_WCHAR:
-    case RPC_FC_SHORT:
-    case RPC_FC_USHORT:
+    case FC_WCHAR:
+    case FC_SHORT:
+    case FC_USHORT:
       TRACE("short=%d <= %p\n", *(WORD*)pMemory, pMemory);
       safe_copy_to_buffer(pStubMsg, pMemory, 2);
       pMemory += 2;
       break;
-    case RPC_FC_ENUM16:
+    case FC_ENUM16:
     {
       USHORT val = *(DWORD *)pMemory;
       TRACE("enum16=%d <= %p\n", *(DWORD*)pMemory, pMemory);
@@ -2847,15 +2879,15 @@ static unsigned char * ComplexMarshall(PMIDL_STUB_MESSAGE pStubMsg,
       pMemory += 4;
       break;
     }
-    case RPC_FC_LONG:
-    case RPC_FC_ULONG:
-    case RPC_FC_ENUM32:
+    case FC_LONG:
+    case FC_ULONG:
+    case FC_ENUM32:
       TRACE("long=%d <= %p\n", *(DWORD*)pMemory, pMemory);
       safe_copy_to_buffer(pStubMsg, pMemory, 4);
       pMemory += 4;
       break;
-    case RPC_FC_INT3264:
-    case RPC_FC_UINT3264:
+    case FC_INT3264:
+    case FC_UINT3264:
     {
       UINT val = *(UINT_PTR *)pMemory;
       TRACE("int3264=%ld <= %p\n", *(UINT_PTR *)pMemory, pMemory);
@@ -2863,34 +2895,34 @@ static unsigned char * ComplexMarshall(PMIDL_STUB_MESSAGE pStubMsg,
       pMemory += sizeof(UINT_PTR);
       break;
     }
-    case RPC_FC_FLOAT:
+    case FC_FLOAT:
       TRACE("float=%f <= %p\n", *(float*)pMemory, pMemory);
       safe_copy_to_buffer(pStubMsg, pMemory, sizeof(float));
       pMemory += sizeof(float);
       break;
-    case RPC_FC_HYPER:
+    case FC_HYPER:
       TRACE("longlong=%s <= %p\n", wine_dbgstr_longlong(*(ULONGLONG*)pMemory), pMemory);
       safe_copy_to_buffer(pStubMsg, pMemory, 8);
       pMemory += 8;
       break;
-    case RPC_FC_DOUBLE:
+    case FC_DOUBLE:
       TRACE("double=%f <= %p\n", *(double*)pMemory, pMemory);
       safe_copy_to_buffer(pStubMsg, pMemory, sizeof(double));
       pMemory += sizeof(double);
       break;
-    case RPC_FC_RP:
-    case RPC_FC_UP:
-    case RPC_FC_OP:
-    case RPC_FC_FP:
-    case RPC_FC_POINTER:
+    case FC_RP:
+    case FC_UP:
+    case FC_OP:
+    case FC_FP:
+    case FC_POINTER:
     {
       unsigned char *saved_buffer;
       BOOL pointer_buffer_mark_set = FALSE;
       TRACE("pointer=%p <= %p\n", *(unsigned char**)pMemory, pMemory);
       TRACE("pStubMsg->Buffer before %p\n", pStubMsg->Buffer);
-      if (*pFormat != RPC_FC_POINTER)
+      if (*pFormat != FC_POINTER)
         pPointer = pFormat;
-      if (*pPointer != RPC_FC_RP)
+      if (*pPointer != FC_RP)
         align_pointer_clear(&pStubMsg->Buffer, 4);
       saved_buffer = pStubMsg->Buffer;
       if (pStubMsg->PointerBufferMark)
@@ -2899,7 +2931,7 @@ static unsigned char * ComplexMarshall(PMIDL_STUB_MESSAGE pStubMsg,
         pStubMsg->PointerBufferMark = NULL;
         pointer_buffer_mark_set = TRUE;
       }
-      else if (*pPointer != RPC_FC_RP)
+      else if (*pPointer != FC_RP)
         safe_buffer_increment(pStubMsg, 4); /* for pointer ID */
       PointerMarshall(pStubMsg, saved_buffer, *(unsigned char**)pMemory, pPointer);
       if (pointer_buffer_mark_set)
@@ -2907,36 +2939,36 @@ static unsigned char * ComplexMarshall(PMIDL_STUB_MESSAGE pStubMsg,
         STD_OVERFLOW_CHECK(pStubMsg);
         pStubMsg->PointerBufferMark = pStubMsg->Buffer;
         pStubMsg->Buffer = saved_buffer;
-        if (*pPointer != RPC_FC_RP)
+        if (*pPointer != FC_RP)
           safe_buffer_increment(pStubMsg, 4); /* for pointer ID */
       }
       TRACE("pStubMsg->Buffer after %p\n", pStubMsg->Buffer);
-      if (*pFormat == RPC_FC_POINTER)
+      if (*pFormat == FC_POINTER)
         pPointer += 4;
       else
         pFormat += 4;
       pMemory += sizeof(void *);
       break;
     }
-    case RPC_FC_ALIGNM2:
-      align_pointer(&pMemory, 2);
+    case FC_ALIGNM2:
+      align_pointer_offset(&pMemory, mem_base, 2);
       break;
-    case RPC_FC_ALIGNM4:
-      align_pointer(&pMemory, 4);
+    case FC_ALIGNM4:
+      align_pointer_offset(&pMemory, mem_base, 4);
       break;
-    case RPC_FC_ALIGNM8:
-      align_pointer(&pMemory, 8);
+    case FC_ALIGNM8:
+      align_pointer_offset(&pMemory, mem_base, 8);
       break;
-    case RPC_FC_STRUCTPAD1:
-    case RPC_FC_STRUCTPAD2:
-    case RPC_FC_STRUCTPAD3:
-    case RPC_FC_STRUCTPAD4:
-    case RPC_FC_STRUCTPAD5:
-    case RPC_FC_STRUCTPAD6:
-    case RPC_FC_STRUCTPAD7:
-      pMemory += *pFormat - RPC_FC_STRUCTPAD1 + 1;
+    case FC_STRUCTPAD1:
+    case FC_STRUCTPAD2:
+    case FC_STRUCTPAD3:
+    case FC_STRUCTPAD4:
+    case FC_STRUCTPAD5:
+    case FC_STRUCTPAD6:
+    case FC_STRUCTPAD7:
+      pMemory += *pFormat - FC_STRUCTPAD1 + 1;
       break;
-    case RPC_FC_EMBEDDED_COMPLEX:
+    case FC_EMBEDDED_COMPLEX:
       pMemory += pFormat[1];
       pFormat += 2;
       desc = pFormat + *(const SHORT*)pFormat;
@@ -2946,10 +2978,10 @@ static unsigned char * ComplexMarshall(PMIDL_STUB_MESSAGE pStubMsg,
       if (m)
       {
         /* for some reason interface pointers aren't generated as
-         * RPC_FC_POINTER, but instead as RPC_FC_EMBEDDED_COMPLEX, yet
+         * FC_POINTER, but instead as FC_EMBEDDED_COMPLEX, yet
          * they still need the dereferencing treatment that pointers are
          * given */
-        if (*desc == RPC_FC_IP)
+        if (*desc == FC_IP)
           m(pStubMsg, *(unsigned char **)pMemory, desc);
         else
           m(pStubMsg, pMemory, desc);
@@ -2958,7 +2990,7 @@ static unsigned char * ComplexMarshall(PMIDL_STUB_MESSAGE pStubMsg,
       pMemory += size;
       pFormat += 2;
       continue;
-    case RPC_FC_PAD:
+    case FC_PAD:
       break;
     default:
       FIXME("unhandled format 0x%02x\n", *pFormat);
@@ -2975,28 +3007,29 @@ static unsigned char * ComplexUnmarshall(PMIDL_STUB_MESSAGE pStubMsg,
                                          PFORMAT_STRING pPointer,
                                          unsigned char fMustAlloc)
 {
+  unsigned char *mem_base = pMemory;
   PFORMAT_STRING desc;
   NDR_UNMARSHALL m;
   ULONG size;
 
-  while (*pFormat != RPC_FC_END) {
+  while (*pFormat != FC_END) {
     switch (*pFormat) {
-    case RPC_FC_BYTE:
-    case RPC_FC_CHAR:
-    case RPC_FC_SMALL:
-    case RPC_FC_USMALL:
+    case FC_BYTE:
+    case FC_CHAR:
+    case FC_SMALL:
+    case FC_USMALL:
       safe_copy_from_buffer(pStubMsg, pMemory, 1);
       TRACE("byte=%d => %p\n", *(WORD*)pMemory, pMemory);
       pMemory += 1;
       break;
-    case RPC_FC_WCHAR:
-    case RPC_FC_SHORT:
-    case RPC_FC_USHORT:
+    case FC_WCHAR:
+    case FC_SHORT:
+    case FC_USHORT:
       safe_copy_from_buffer(pStubMsg, pMemory, 2);
       TRACE("short=%d => %p\n", *(WORD*)pMemory, pMemory);
       pMemory += 2;
       break;
-    case RPC_FC_ENUM16:
+    case FC_ENUM16:
     {
       WORD val;
       safe_copy_from_buffer(pStubMsg, &val, 2);
@@ -3007,14 +3040,14 @@ static unsigned char * ComplexUnmarshall(PMIDL_STUB_MESSAGE pStubMsg,
       pMemory += 4;
       break;
     }
-    case RPC_FC_LONG:
-    case RPC_FC_ULONG:
-    case RPC_FC_ENUM32:
+    case FC_LONG:
+    case FC_ULONG:
+    case FC_ENUM32:
       safe_copy_from_buffer(pStubMsg, pMemory, 4);
       TRACE("long=%d => %p\n", *(DWORD*)pMemory, pMemory);
       pMemory += 4;
       break;
-    case RPC_FC_INT3264:
+    case FC_INT3264:
     {
       INT val;
       safe_copy_from_buffer(pStubMsg, &val, 4);
@@ -3023,7 +3056,7 @@ static unsigned char * ComplexUnmarshall(PMIDL_STUB_MESSAGE pStubMsg,
       pMemory += sizeof(INT_PTR);
       break;
     }
-    case RPC_FC_UINT3264:
+    case FC_UINT3264:
     {
       UINT val;
       safe_copy_from_buffer(pStubMsg, &val, 4);
@@ -3032,33 +3065,33 @@ static unsigned char * ComplexUnmarshall(PMIDL_STUB_MESSAGE pStubMsg,
       pMemory += sizeof(UINT_PTR);
       break;
     }
-    case RPC_FC_FLOAT:
+    case FC_FLOAT:
       safe_copy_from_buffer(pStubMsg, pMemory, sizeof(float));
       TRACE("float=%f => %p\n", *(float*)pMemory, pMemory);
       pMemory += sizeof(float);
       break;
-    case RPC_FC_HYPER:
+    case FC_HYPER:
       safe_copy_from_buffer(pStubMsg, pMemory, 8);
       TRACE("longlong=%s => %p\n", wine_dbgstr_longlong(*(ULONGLONG*)pMemory), pMemory);
       pMemory += 8;
       break;
-    case RPC_FC_DOUBLE:
+    case FC_DOUBLE:
       safe_copy_from_buffer(pStubMsg, pMemory, sizeof(double));
       TRACE("double=%f => %p\n", *(double*)pMemory, pMemory);
       pMemory += sizeof(double);
       break;
-    case RPC_FC_RP:
-    case RPC_FC_UP:
-    case RPC_FC_OP:
-    case RPC_FC_FP:
-    case RPC_FC_POINTER:
+    case FC_RP:
+    case FC_UP:
+    case FC_OP:
+    case FC_FP:
+    case FC_POINTER:
     {
       unsigned char *saved_buffer;
       BOOL pointer_buffer_mark_set = FALSE;
       TRACE("pointer => %p\n", pMemory);
-      if (*pFormat != RPC_FC_POINTER)
+      if (*pFormat != FC_POINTER)
         pPointer = pFormat;
-      if (*pPointer != RPC_FC_RP)
+      if (*pPointer != FC_RP)
         align_pointer(&pStubMsg->Buffer, 4);
       saved_buffer = pStubMsg->Buffer;
       if (pStubMsg->PointerBufferMark)
@@ -3067,7 +3100,7 @@ static unsigned char * ComplexUnmarshall(PMIDL_STUB_MESSAGE pStubMsg,
         pStubMsg->PointerBufferMark = NULL;
         pointer_buffer_mark_set = TRUE;
       }
-      else if (*pPointer != RPC_FC_RP)
+      else if (*pPointer != FC_RP)
         safe_buffer_increment(pStubMsg, 4); /* for pointer ID */
 
       PointerUnmarshall(pStubMsg, saved_buffer, (unsigned char**)pMemory, *(unsigned char**)pMemory, pPointer, fMustAlloc);
@@ -3076,36 +3109,36 @@ static unsigned char * ComplexUnmarshall(PMIDL_STUB_MESSAGE pStubMsg,
         STD_OVERFLOW_CHECK(pStubMsg);
         pStubMsg->PointerBufferMark = pStubMsg->Buffer;
         pStubMsg->Buffer = saved_buffer;
-        if (*pPointer != RPC_FC_RP)
+        if (*pPointer != FC_RP)
           safe_buffer_increment(pStubMsg, 4); /* for pointer ID */
       }
-      if (*pFormat == RPC_FC_POINTER)
+      if (*pFormat == FC_POINTER)
         pPointer += 4;
       else
         pFormat += 4;
       pMemory += sizeof(void *);
       break;
     }
-    case RPC_FC_ALIGNM2:
-      align_pointer_clear(&pMemory, 2);
+    case FC_ALIGNM2:
+      align_pointer_offset_clear(&pMemory, mem_base, 2);
       break;
-    case RPC_FC_ALIGNM4:
-      align_pointer_clear(&pMemory, 4);
+    case FC_ALIGNM4:
+      align_pointer_offset_clear(&pMemory, mem_base, 4);
       break;
-    case RPC_FC_ALIGNM8:
-      align_pointer_clear(&pMemory, 8);
+    case FC_ALIGNM8:
+      align_pointer_offset_clear(&pMemory, mem_base, 8);
       break;
-    case RPC_FC_STRUCTPAD1:
-    case RPC_FC_STRUCTPAD2:
-    case RPC_FC_STRUCTPAD3:
-    case RPC_FC_STRUCTPAD4:
-    case RPC_FC_STRUCTPAD5:
-    case RPC_FC_STRUCTPAD6:
-    case RPC_FC_STRUCTPAD7:
-      memset(pMemory, 0, *pFormat - RPC_FC_STRUCTPAD1 + 1);
-      pMemory += *pFormat - RPC_FC_STRUCTPAD1 + 1;
+    case FC_STRUCTPAD1:
+    case FC_STRUCTPAD2:
+    case FC_STRUCTPAD3:
+    case FC_STRUCTPAD4:
+    case FC_STRUCTPAD5:
+    case FC_STRUCTPAD6:
+    case FC_STRUCTPAD7:
+      memset(pMemory, 0, *pFormat - FC_STRUCTPAD1 + 1);
+      pMemory += *pFormat - FC_STRUCTPAD1 + 1;
       break;
-    case RPC_FC_EMBEDDED_COMPLEX:
+    case FC_EMBEDDED_COMPLEX:
       pMemory += pFormat[1];
       pFormat += 2;
       desc = pFormat + *(const SHORT*)pFormat;
@@ -3122,10 +3155,10 @@ static unsigned char * ComplexUnmarshall(PMIDL_STUB_MESSAGE pStubMsg,
       if (m)
       {
         /* for some reason interface pointers aren't generated as
-         * RPC_FC_POINTER, but instead as RPC_FC_EMBEDDED_COMPLEX, yet
+         * FC_POINTER, but instead as FC_EMBEDDED_COMPLEX, yet
          * they still need the dereferencing treatment that pointers are
          * given */
-        if (*desc == RPC_FC_IP)
+        if (*desc == FC_IP)
           m(pStubMsg, (unsigned char **)pMemory, desc, FALSE);
         else
           m(pStubMsg, &pMemory, desc, FALSE);
@@ -3134,7 +3167,7 @@ static unsigned char * ComplexUnmarshall(PMIDL_STUB_MESSAGE pStubMsg,
       pMemory += size;
       pFormat += 2;
       continue;
-    case RPC_FC_PAD:
+    case FC_PAD:
       break;
     default:
       FIXME("unhandled format %d\n", *pFormat);
@@ -3150,52 +3183,53 @@ static unsigned char * ComplexBufferSize(PMIDL_STUB_MESSAGE pStubMsg,
                                          PFORMAT_STRING pFormat,
                                          PFORMAT_STRING pPointer)
 {
+  unsigned char *mem_base = pMemory;
   PFORMAT_STRING desc;
   NDR_BUFFERSIZE m;
   ULONG size;
 
-  while (*pFormat != RPC_FC_END) {
+  while (*pFormat != FC_END) {
     switch (*pFormat) {
-    case RPC_FC_BYTE:
-    case RPC_FC_CHAR:
-    case RPC_FC_SMALL:
-    case RPC_FC_USMALL:
+    case FC_BYTE:
+    case FC_CHAR:
+    case FC_SMALL:
+    case FC_USMALL:
       safe_buffer_length_increment(pStubMsg, 1);
       pMemory += 1;
       break;
-    case RPC_FC_WCHAR:
-    case RPC_FC_SHORT:
-    case RPC_FC_USHORT:
+    case FC_WCHAR:
+    case FC_SHORT:
+    case FC_USHORT:
       safe_buffer_length_increment(pStubMsg, 2);
       pMemory += 2;
       break;
-    case RPC_FC_ENUM16:
+    case FC_ENUM16:
       safe_buffer_length_increment(pStubMsg, 2);
       pMemory += 4;
       break;
-    case RPC_FC_LONG:
-    case RPC_FC_ULONG:
-    case RPC_FC_ENUM32:
-    case RPC_FC_FLOAT:
+    case FC_LONG:
+    case FC_ULONG:
+    case FC_ENUM32:
+    case FC_FLOAT:
       safe_buffer_length_increment(pStubMsg, 4);
       pMemory += 4;
       break;
-    case RPC_FC_INT3264:
-    case RPC_FC_UINT3264:
+    case FC_INT3264:
+    case FC_UINT3264:
       safe_buffer_length_increment(pStubMsg, 4);
       pMemory += sizeof(INT_PTR);
       break;
-    case RPC_FC_HYPER:
-    case RPC_FC_DOUBLE:
+    case FC_HYPER:
+    case FC_DOUBLE:
       safe_buffer_length_increment(pStubMsg, 8);
       pMemory += 8;
       break;
-    case RPC_FC_RP:
-    case RPC_FC_UP:
-    case RPC_FC_OP:
-    case RPC_FC_FP:
-    case RPC_FC_POINTER:
-      if (*pFormat != RPC_FC_POINTER)
+    case FC_RP:
+    case FC_UP:
+    case FC_OP:
+    case FC_FP:
+    case FC_POINTER:
+      if (*pFormat != FC_POINTER)
         pPointer = pFormat;
       if (!pStubMsg->IgnoreEmbeddedPointers)
       {
@@ -3208,36 +3242,36 @@ static unsigned char * ComplexBufferSize(PMIDL_STUB_MESSAGE pStubMsg,
         pStubMsg->PointerLength = pStubMsg->BufferLength;
         pStubMsg->BufferLength = saved_buffer_length;
       }
-      if (*pPointer != RPC_FC_RP)
+      if (*pPointer != FC_RP)
       {
         align_length(&pStubMsg->BufferLength, 4);
         safe_buffer_length_increment(pStubMsg, 4);
       }
-      if (*pFormat == RPC_FC_POINTER)
+      if (*pFormat == FC_POINTER)
         pPointer += 4;
       else
         pFormat += 4;
       pMemory += sizeof(void*);
       break;
-    case RPC_FC_ALIGNM2:
-      align_pointer(&pMemory, 2);
+    case FC_ALIGNM2:
+      align_pointer_offset(&pMemory, mem_base, 2);
       break;
-    case RPC_FC_ALIGNM4:
-      align_pointer(&pMemory, 4);
+    case FC_ALIGNM4:
+      align_pointer_offset(&pMemory, mem_base, 4);
       break;
-    case RPC_FC_ALIGNM8:
-      align_pointer(&pMemory, 8);
+    case FC_ALIGNM8:
+      align_pointer_offset(&pMemory, mem_base, 8);
       break;
-    case RPC_FC_STRUCTPAD1:
-    case RPC_FC_STRUCTPAD2:
-    case RPC_FC_STRUCTPAD3:
-    case RPC_FC_STRUCTPAD4:
-    case RPC_FC_STRUCTPAD5:
-    case RPC_FC_STRUCTPAD6:
-    case RPC_FC_STRUCTPAD7:
-      pMemory += *pFormat - RPC_FC_STRUCTPAD1 + 1;
+    case FC_STRUCTPAD1:
+    case FC_STRUCTPAD2:
+    case FC_STRUCTPAD3:
+    case FC_STRUCTPAD4:
+    case FC_STRUCTPAD5:
+    case FC_STRUCTPAD6:
+    case FC_STRUCTPAD7:
+      pMemory += *pFormat - FC_STRUCTPAD1 + 1;
       break;
-    case RPC_FC_EMBEDDED_COMPLEX:
+    case FC_EMBEDDED_COMPLEX:
       pMemory += pFormat[1];
       pFormat += 2;
       desc = pFormat + *(const SHORT*)pFormat;
@@ -3246,10 +3280,10 @@ static unsigned char * ComplexBufferSize(PMIDL_STUB_MESSAGE pStubMsg,
       if (m)
       {
         /* for some reason interface pointers aren't generated as
-         * RPC_FC_POINTER, but instead as RPC_FC_EMBEDDED_COMPLEX, yet
+         * FC_POINTER, but instead as FC_EMBEDDED_COMPLEX, yet
          * they still need the dereferencing treatment that pointers are
          * given */
-        if (*desc == RPC_FC_IP)
+        if (*desc == FC_IP)
           m(pStubMsg, *(unsigned char **)pMemory, desc);
         else
           m(pStubMsg, pMemory, desc);
@@ -3258,7 +3292,7 @@ static unsigned char * ComplexBufferSize(PMIDL_STUB_MESSAGE pStubMsg,
       pMemory += size;
       pFormat += 2;
       continue;
-    case RPC_FC_PAD:
+    case FC_PAD:
       break;
     default:
       FIXME("unhandled format 0x%02x\n", *pFormat);
@@ -3274,71 +3308,72 @@ static unsigned char * ComplexFree(PMIDL_STUB_MESSAGE pStubMsg,
                                    PFORMAT_STRING pFormat,
                                    PFORMAT_STRING pPointer)
 {
+  unsigned char *mem_base = pMemory;
   PFORMAT_STRING desc;
   NDR_FREE m;
   ULONG size;
 
-  while (*pFormat != RPC_FC_END) {
+  while (*pFormat != FC_END) {
     switch (*pFormat) {
-    case RPC_FC_BYTE:
-    case RPC_FC_CHAR:
-    case RPC_FC_SMALL:
-    case RPC_FC_USMALL:
+    case FC_BYTE:
+    case FC_CHAR:
+    case FC_SMALL:
+    case FC_USMALL:
       pMemory += 1;
       break;
-    case RPC_FC_WCHAR:
-    case RPC_FC_SHORT:
-    case RPC_FC_USHORT:
+    case FC_WCHAR:
+    case FC_SHORT:
+    case FC_USHORT:
       pMemory += 2;
       break;
-    case RPC_FC_LONG:
-    case RPC_FC_ULONG:
-    case RPC_FC_ENUM16:
-    case RPC_FC_ENUM32:
-    case RPC_FC_FLOAT:
+    case FC_LONG:
+    case FC_ULONG:
+    case FC_ENUM16:
+    case FC_ENUM32:
+    case FC_FLOAT:
       pMemory += 4;
       break;
-    case RPC_FC_INT3264:
-    case RPC_FC_UINT3264:
+    case FC_INT3264:
+    case FC_UINT3264:
       pMemory += sizeof(INT_PTR);
       break;
-    case RPC_FC_HYPER:
-    case RPC_FC_DOUBLE:
+    case FC_HYPER:
+    case FC_DOUBLE:
       pMemory += 8;
       break;
-    case RPC_FC_RP:
-    case RPC_FC_UP:
-    case RPC_FC_OP:
-    case RPC_FC_FP:
-    case RPC_FC_POINTER:
-      if (*pFormat != RPC_FC_POINTER)
+    case FC_RP:
+    case FC_UP:
+    case FC_OP:
+    case FC_FP:
+    case FC_POINTER:
+      if (*pFormat != FC_POINTER)
         pPointer = pFormat;
       NdrPointerFree(pStubMsg, *(unsigned char**)pMemory, pPointer);
-      if (*pFormat == RPC_FC_POINTER)
+      if (*pFormat == FC_POINTER)
         pPointer += 4;
       else
         pFormat += 4;
       pMemory += sizeof(void *);
       break;
-    case RPC_FC_ALIGNM2:
-      align_pointer(&pMemory, 2);
+    case FC_ALIGNM2:
+      align_pointer_offset(&pMemory, mem_base, 2);
       break;
-    case RPC_FC_ALIGNM4:
-      align_pointer(&pMemory, 4);
+    case FC_ALIGNM4:
+      align_pointer_offset(&pMemory, mem_base, 4);
       break;
-    case RPC_FC_ALIGNM8:
-      align_pointer(&pMemory, 8);
+    case FC_ALIGNM8:
+      align_pointer_offset(&pMemory, mem_base, 8);
       break;
-    case RPC_FC_STRUCTPAD1:
-    case RPC_FC_STRUCTPAD2:
-    case RPC_FC_STRUCTPAD3:
-    case RPC_FC_STRUCTPAD4:
-    case RPC_FC_STRUCTPAD5:
-    case RPC_FC_STRUCTPAD6:
-    case RPC_FC_STRUCTPAD7:
-      pMemory += *pFormat - RPC_FC_STRUCTPAD1 + 1;
+    case FC_STRUCTPAD1:
+    case FC_STRUCTPAD2:
+    case FC_STRUCTPAD3:
+    case FC_STRUCTPAD4:
+    case FC_STRUCTPAD5:
+    case FC_STRUCTPAD6:
+    case FC_STRUCTPAD7:
+      pMemory += *pFormat - FC_STRUCTPAD1 + 1;
       break;
-    case RPC_FC_EMBEDDED_COMPLEX:
+    case FC_EMBEDDED_COMPLEX:
       pMemory += pFormat[1];
       pFormat += 2;
       desc = pFormat + *(const SHORT*)pFormat;
@@ -3347,10 +3382,10 @@ static unsigned char * ComplexFree(PMIDL_STUB_MESSAGE pStubMsg,
       if (m)
       {
         /* for some reason interface pointers aren't generated as
-         * RPC_FC_POINTER, but instead as RPC_FC_EMBEDDED_COMPLEX, yet
+         * FC_POINTER, but instead as FC_EMBEDDED_COMPLEX, yet
          * they still need the dereferencing treatment that pointers are
          * given */
-        if (*desc == RPC_FC_IP)
+        if (*desc == FC_IP)
           m(pStubMsg, *(unsigned char **)pMemory, desc);
         else
           m(pStubMsg, pMemory, desc);
@@ -3358,7 +3393,7 @@ static unsigned char * ComplexFree(PMIDL_STUB_MESSAGE pStubMsg,
       pMemory += size;
       pFormat += 2;
       continue;
-    case RPC_FC_PAD:
+    case FC_PAD:
       break;
     default:
       FIXME("unhandled format 0x%02x\n", *pFormat);
@@ -3376,53 +3411,53 @@ static ULONG ComplexStructMemorySize(PMIDL_STUB_MESSAGE pStubMsg,
   PFORMAT_STRING desc;
   ULONG size = 0;
 
-  while (*pFormat != RPC_FC_END) {
+  while (*pFormat != FC_END) {
     switch (*pFormat) {
-    case RPC_FC_BYTE:
-    case RPC_FC_CHAR:
-    case RPC_FC_SMALL:
-    case RPC_FC_USMALL:
+    case FC_BYTE:
+    case FC_CHAR:
+    case FC_SMALL:
+    case FC_USMALL:
       size += 1;
       safe_buffer_increment(pStubMsg, 1);
       break;
-    case RPC_FC_WCHAR:
-    case RPC_FC_SHORT:
-    case RPC_FC_USHORT:
+    case FC_WCHAR:
+    case FC_SHORT:
+    case FC_USHORT:
       size += 2;
       safe_buffer_increment(pStubMsg, 2);
       break;
-    case RPC_FC_ENUM16:
+    case FC_ENUM16:
       size += 4;
       safe_buffer_increment(pStubMsg, 2);
       break;
-    case RPC_FC_LONG:
-    case RPC_FC_ULONG:
-    case RPC_FC_ENUM32:
-    case RPC_FC_FLOAT:
+    case FC_LONG:
+    case FC_ULONG:
+    case FC_ENUM32:
+    case FC_FLOAT:
       size += 4;
       safe_buffer_increment(pStubMsg, 4);
       break;
-    case RPC_FC_INT3264:
-    case RPC_FC_UINT3264:
+    case FC_INT3264:
+    case FC_UINT3264:
       size += sizeof(INT_PTR);
       safe_buffer_increment(pStubMsg, 4);
       break;
-    case RPC_FC_HYPER:
-    case RPC_FC_DOUBLE:
+    case FC_HYPER:
+    case FC_DOUBLE:
       size += 8;
       safe_buffer_increment(pStubMsg, 8);
       break;
-    case RPC_FC_RP:
-    case RPC_FC_UP:
-    case RPC_FC_OP:
-    case RPC_FC_FP:
-    case RPC_FC_POINTER:
+    case FC_RP:
+    case FC_UP:
+    case FC_OP:
+    case FC_FP:
+    case FC_POINTER:
     {
       unsigned char *saved_buffer;
       BOOL pointer_buffer_mark_set = FALSE;
-      if (*pFormat != RPC_FC_POINTER)
+      if (*pFormat != FC_POINTER)
         pPointer = pFormat;
-      if (*pPointer != RPC_FC_RP)
+      if (*pPointer != FC_RP)
         align_pointer(&pStubMsg->Buffer, 4);
       saved_buffer = pStubMsg->Buffer;
       if (pStubMsg->PointerBufferMark)
@@ -3431,7 +3466,7 @@ static ULONG ComplexStructMemorySize(PMIDL_STUB_MESSAGE pStubMsg,
         pStubMsg->PointerBufferMark = NULL;
         pointer_buffer_mark_set = TRUE;
       }
-      else if (*pPointer != RPC_FC_RP)
+      else if (*pPointer != FC_RP)
         safe_buffer_increment(pStubMsg, 4); /* for pointer ID */
 
       if (!pStubMsg->IgnoreEmbeddedPointers)
@@ -3441,42 +3476,42 @@ static ULONG ComplexStructMemorySize(PMIDL_STUB_MESSAGE pStubMsg,
         STD_OVERFLOW_CHECK(pStubMsg);
         pStubMsg->PointerBufferMark = pStubMsg->Buffer;
         pStubMsg->Buffer = saved_buffer;
-        if (*pPointer != RPC_FC_RP)
+        if (*pPointer != FC_RP)
           safe_buffer_increment(pStubMsg, 4); /* for pointer ID */
       }
-      if (*pFormat == RPC_FC_POINTER)
+      if (*pFormat == FC_POINTER)
         pPointer += 4;
       else
         pFormat += 4;
       size += sizeof(void *);
       break;
     }
-    case RPC_FC_ALIGNM2:
+    case FC_ALIGNM2:
       align_length(&size, 2);
       break;
-    case RPC_FC_ALIGNM4:
+    case FC_ALIGNM4:
       align_length(&size, 4);
       break;
-    case RPC_FC_ALIGNM8:
+    case FC_ALIGNM8:
       align_length(&size, 8);
       break;
-    case RPC_FC_STRUCTPAD1:
-    case RPC_FC_STRUCTPAD2:
-    case RPC_FC_STRUCTPAD3:
-    case RPC_FC_STRUCTPAD4:
-    case RPC_FC_STRUCTPAD5:
-    case RPC_FC_STRUCTPAD6:
-    case RPC_FC_STRUCTPAD7:
-      size += *pFormat - RPC_FC_STRUCTPAD1 + 1;
+    case FC_STRUCTPAD1:
+    case FC_STRUCTPAD2:
+    case FC_STRUCTPAD3:
+    case FC_STRUCTPAD4:
+    case FC_STRUCTPAD5:
+    case FC_STRUCTPAD6:
+    case FC_STRUCTPAD7:
+      size += *pFormat - FC_STRUCTPAD1 + 1;
       break;
-    case RPC_FC_EMBEDDED_COMPLEX:
+    case FC_EMBEDDED_COMPLEX:
       size += pFormat[1];
       pFormat += 2;
       desc = pFormat + *(const SHORT*)pFormat;
       size += EmbeddedComplexMemorySize(pStubMsg, desc);
       pFormat += 2;
       continue;
-    case RPC_FC_PAD:
+    case FC_PAD:
       break;
     default:
       FIXME("unhandled format 0x%02x\n", *pFormat);
@@ -3492,69 +3527,69 @@ ULONG ComplexStructSize(PMIDL_STUB_MESSAGE pStubMsg, PFORMAT_STRING pFormat)
   PFORMAT_STRING desc;
   ULONG size = 0;
 
-  while (*pFormat != RPC_FC_END) {
+  while (*pFormat != FC_END) {
     switch (*pFormat) {
-    case RPC_FC_BYTE:
-    case RPC_FC_CHAR:
-    case RPC_FC_SMALL:
-    case RPC_FC_USMALL:
+    case FC_BYTE:
+    case FC_CHAR:
+    case FC_SMALL:
+    case FC_USMALL:
       size += 1;
       break;
-    case RPC_FC_WCHAR:
-    case RPC_FC_SHORT:
-    case RPC_FC_USHORT:
+    case FC_WCHAR:
+    case FC_SHORT:
+    case FC_USHORT:
       size += 2;
       break;
-    case RPC_FC_LONG:
-    case RPC_FC_ULONG:
-    case RPC_FC_ENUM16:
-    case RPC_FC_ENUM32:
-    case RPC_FC_FLOAT:
+    case FC_LONG:
+    case FC_ULONG:
+    case FC_ENUM16:
+    case FC_ENUM32:
+    case FC_FLOAT:
       size += 4;
       break;
-    case RPC_FC_INT3264:
-    case RPC_FC_UINT3264:
+    case FC_INT3264:
+    case FC_UINT3264:
       size += sizeof(INT_PTR);
       break;
-    case RPC_FC_HYPER:
-    case RPC_FC_DOUBLE:
+    case FC_HYPER:
+    case FC_DOUBLE:
       size += 8;
       break;
-    case RPC_FC_RP:
-    case RPC_FC_UP:
-    case RPC_FC_OP:
-    case RPC_FC_FP:
-    case RPC_FC_POINTER:
+    case FC_RP:
+    case FC_UP:
+    case FC_OP:
+    case FC_FP:
+    case FC_POINTER:
       size += sizeof(void *);
-      if (*pFormat != RPC_FC_POINTER)
+      if (*pFormat != FC_POINTER)
         pFormat += 4;
       break;
-    case RPC_FC_ALIGNM2:
+    case FC_ALIGNM2:
       align_length(&size, 2);
       break;
-    case RPC_FC_ALIGNM4:
+    case FC_ALIGNM4:
       align_length(&size, 4);
       break;
-    case RPC_FC_ALIGNM8:
+    case FC_ALIGNM8:
       align_length(&size, 8);
       break;
-    case RPC_FC_STRUCTPAD1:
-    case RPC_FC_STRUCTPAD2:
-    case RPC_FC_STRUCTPAD3:
-    case RPC_FC_STRUCTPAD4:
-    case RPC_FC_STRUCTPAD5:
-    case RPC_FC_STRUCTPAD6:
-    case RPC_FC_STRUCTPAD7:
-      size += *pFormat - RPC_FC_STRUCTPAD1 + 1;
+    case FC_STRUCTPAD1:
+    case FC_STRUCTPAD2:
+    case FC_STRUCTPAD3:
+    case FC_STRUCTPAD4:
+    case FC_STRUCTPAD5:
+    case FC_STRUCTPAD6:
+    case FC_STRUCTPAD7:
+      size += *pFormat - FC_STRUCTPAD1 + 1;
       break;
-    case RPC_FC_EMBEDDED_COMPLEX:
+    case FC_EMBEDDED_COMPLEX:
       size += pFormat[1];
       pFormat += 2;
       desc = pFormat + *(const SHORT*)pFormat;
       size += EmbeddedComplexSize(pStubMsg, desc);
       pFormat += 2;
       continue;
-    case RPC_FC_PAD:
+    case FC_PAD:
       break;
     default:
       FIXME("unhandled format 0x%02x\n", *pFormat);
@@ -3712,7 +3747,7 @@ unsigned char * WINAPI NdrComplexStructUnmarshall(PMIDL_STUB_MESSAGE pStubMsg,
   if (!fMustAlloc && !*ppMemory)
     fMustAlloc = TRUE;
   if (fMustAlloc)
-    *ppMemory = NdrAllocate(pStubMsg, size);
+    *ppMemory = NdrAllocateZero(pStubMsg, size);
 
   pMemory = ComplexUnmarshall(pStubMsg, *ppMemory, pFormat, pointer_desc, fMustAlloc);
 
@@ -3904,15 +3939,15 @@ unsigned char * WINAPI NdrConformantArrayMarshall(PMIDL_STUB_MESSAGE pStubMsg,
                                                   PFORMAT_STRING pFormat)
 {
   TRACE("(%p,%p,%p)\n", pStubMsg, pMemory, pFormat);
-  if (pFormat[0] != RPC_FC_CARRAY)
+  if (pFormat[0] != FC_CARRAY)
   {
     ERR("invalid format = 0x%x\n", pFormat[0]);
     RpcRaiseException(RPC_X_BAD_STUB_DATA);
   }
 
-  array_compute_and_write_conformance(RPC_FC_CARRAY, pStubMsg, pMemory,
+  array_compute_and_write_conformance(FC_CARRAY, pStubMsg, pMemory,
                                       pFormat);
-  array_write_variance_and_marshall(RPC_FC_CARRAY, pStubMsg, pMemory, pFormat,
+  array_write_variance_and_marshall(FC_CARRAY, pStubMsg, pMemory, pFormat,
                                     TRUE /* fHasPointers */);
 
   return NULL;
@@ -3927,14 +3962,14 @@ unsigned char * WINAPI NdrConformantArrayUnmarshall(PMIDL_STUB_MESSAGE pStubMsg,
                                                     unsigned char fMustAlloc)
 {
   TRACE("(%p,%p,%p,%d)\n", pStubMsg, ppMemory, pFormat, fMustAlloc);
-  if (pFormat[0] != RPC_FC_CARRAY)
+  if (pFormat[0] != FC_CARRAY)
   {
     ERR("invalid format = 0x%x\n", pFormat[0]);
     RpcRaiseException(RPC_X_BAD_STUB_DATA);
   }
 
-  array_read_conformance(RPC_FC_CARRAY, pStubMsg, pFormat);
-  array_read_variance_and_unmarshall(RPC_FC_CARRAY, pStubMsg, ppMemory, pFormat,
+  array_read_conformance(FC_CARRAY, pStubMsg, pFormat);
+  array_read_variance_and_unmarshall(FC_CARRAY, pStubMsg, ppMemory, pFormat,
                                      fMustAlloc,
                                      TRUE /* fUseBufferMemoryServer */,
                                      TRUE /* fUnmarshall */);
@@ -3950,14 +3985,14 @@ void WINAPI NdrConformantArrayBufferSize(PMIDL_STUB_MESSAGE pStubMsg,
                                          PFORMAT_STRING pFormat)
 {
   TRACE("(%p,%p,%p)\n", pStubMsg, pMemory, pFormat);
-  if (pFormat[0] != RPC_FC_CARRAY)
+  if (pFormat[0] != FC_CARRAY)
   {
     ERR("invalid format = 0x%x\n", pFormat[0]);
     RpcRaiseException(RPC_X_BAD_STUB_DATA);
   }
 
-  array_compute_and_size_conformance(RPC_FC_CARRAY, pStubMsg, pMemory, pFormat);
-  array_buffer_size(RPC_FC_CARRAY, pStubMsg, pMemory, pFormat,
+  array_compute_and_size_conformance(FC_CARRAY, pStubMsg, pMemory, pFormat);
+  array_buffer_size(FC_CARRAY, pStubMsg, pMemory, pFormat,
                     TRUE /* fHasPointers */);
 }
 
@@ -3968,14 +4003,14 @@ ULONG WINAPI NdrConformantArrayMemorySize(PMIDL_STUB_MESSAGE pStubMsg,
                                           PFORMAT_STRING pFormat)
 {
   TRACE("(%p,%p)\n", pStubMsg, pFormat);
-  if (pFormat[0] != RPC_FC_CARRAY)
+  if (pFormat[0] != FC_CARRAY)
   {
     ERR("invalid format = 0x%x\n", pFormat[0]);
     RpcRaiseException(RPC_X_BAD_STUB_DATA);
   }
 
-  array_read_conformance(RPC_FC_CARRAY, pStubMsg, pFormat);
-  array_memory_size(RPC_FC_CARRAY, pStubMsg, pFormat, TRUE /* fHasPointers */);
+  array_read_conformance(FC_CARRAY, pStubMsg, pFormat);
+  array_memory_size(FC_CARRAY, pStubMsg, pFormat, TRUE /* fHasPointers */);
 
   return pStubMsg->MemorySize;
 }
@@ -3988,13 +4023,13 @@ void WINAPI NdrConformantArrayFree(PMIDL_STUB_MESSAGE pStubMsg,
                                    PFORMAT_STRING pFormat)
 {
   TRACE("(%p,%p,%p)\n", pStubMsg, pMemory, pFormat);
-  if (pFormat[0] != RPC_FC_CARRAY)
+  if (pFormat[0] != FC_CARRAY)
   {
     ERR("invalid format = 0x%x\n", pFormat[0]);
     RpcRaiseException(RPC_X_BAD_STUB_DATA);
   }
 
-  array_free(RPC_FC_CARRAY, pStubMsg, pMemory, pFormat,
+  array_free(FC_CARRAY, pStubMsg, pMemory, pFormat,
              TRUE /* fHasPointers */);
 }
 
@@ -4008,16 +4043,16 @@ unsigned char* WINAPI NdrConformantVaryingArrayMarshall( PMIDL_STUB_MESSAGE pStu
 {
     TRACE("(%p, %p, %p)\n", pStubMsg, pMemory, pFormat);
 
-    if (pFormat[0] != RPC_FC_CVARRAY)
+    if (pFormat[0] != FC_CVARRAY)
     {
         ERR("invalid format type %x\n", pFormat[0]);
         RpcRaiseException(RPC_S_INTERNAL_ERROR);
         return NULL;
     }
 
-    array_compute_and_write_conformance(RPC_FC_CVARRAY, pStubMsg, pMemory,
+    array_compute_and_write_conformance(FC_CVARRAY, pStubMsg, pMemory,
                                         pFormat);
-    array_write_variance_and_marshall(RPC_FC_CVARRAY, pStubMsg, pMemory,
+    array_write_variance_and_marshall(FC_CVARRAY, pStubMsg, pMemory,
                                       pFormat, TRUE /* fHasPointers */);
 
     return NULL;
@@ -4034,15 +4069,15 @@ unsigned char* WINAPI NdrConformantVaryingArrayUnmarshall( PMIDL_STUB_MESSAGE pS
 {
     TRACE("(%p, %p, %p, %d)\n", pStubMsg, ppMemory, pFormat, fMustAlloc);
 
-    if (pFormat[0] != RPC_FC_CVARRAY)
+    if (pFormat[0] != FC_CVARRAY)
     {
         ERR("invalid format type %x\n", pFormat[0]);
         RpcRaiseException(RPC_S_INTERNAL_ERROR);
         return NULL;
     }
 
-    array_read_conformance(RPC_FC_CVARRAY, pStubMsg, pFormat);
-    array_read_variance_and_unmarshall(RPC_FC_CVARRAY, pStubMsg, ppMemory,
+    array_read_conformance(FC_CVARRAY, pStubMsg, pFormat);
+    array_read_variance_and_unmarshall(FC_CVARRAY, pStubMsg, ppMemory,
                                        pFormat, fMustAlloc,
                                        TRUE /* fUseBufferMemoryServer */,
                                        TRUE /* fUnmarshall */);
@@ -4060,14 +4095,14 @@ void WINAPI NdrConformantVaryingArrayFree( PMIDL_STUB_MESSAGE pStubMsg,
 {
     TRACE("(%p,%p,%p)\n", pStubMsg, pMemory, pFormat);
 
-    if (pFormat[0] != RPC_FC_CVARRAY)
+    if (pFormat[0] != FC_CVARRAY)
     {
         ERR("invalid format type %x\n", pFormat[0]);
         RpcRaiseException(RPC_S_INTERNAL_ERROR);
         return;
     }
 
-    array_free(RPC_FC_CVARRAY, pStubMsg, pMemory, pFormat,
+    array_free(FC_CVARRAY, pStubMsg, pMemory, pFormat,
                TRUE /* fHasPointers */);
 }
 
@@ -4080,16 +4115,16 @@ void WINAPI NdrConformantVaryingArrayBufferSize( PMIDL_STUB_MESSAGE pStubMsg,
 {
     TRACE("(%p, %p, %p)\n", pStubMsg, pMemory, pFormat);
 
-    if (pFormat[0] != RPC_FC_CVARRAY)
+    if (pFormat[0] != FC_CVARRAY)
     {
         ERR("invalid format type %x\n", pFormat[0]);
         RpcRaiseException(RPC_S_INTERNAL_ERROR);
         return;
     }
 
-    array_compute_and_size_conformance(RPC_FC_CVARRAY, pStubMsg, pMemory,
+    array_compute_and_size_conformance(FC_CVARRAY, pStubMsg, pMemory,
                                        pFormat);
-    array_buffer_size(RPC_FC_CVARRAY, pStubMsg, pMemory, pFormat,
+    array_buffer_size(FC_CVARRAY, pStubMsg, pMemory, pFormat,
                       TRUE /* fHasPointers */);
 }
 
@@ -4102,15 +4137,15 @@ ULONG WINAPI NdrConformantVaryingArrayMemorySize( PMIDL_STUB_MESSAGE pStubMsg,
 {
     TRACE("(%p, %p)\n", pStubMsg, pFormat);
 
-    if (pFormat[0] != RPC_FC_CVARRAY)
+    if (pFormat[0] != FC_CVARRAY)
     {
         ERR("invalid format type %x\n", pFormat[0]);
         RpcRaiseException(RPC_S_INTERNAL_ERROR);
         return pStubMsg->MemorySize;
     }
 
-    array_read_conformance(RPC_FC_CVARRAY, pStubMsg, pFormat);
-    array_memory_size(RPC_FC_CVARRAY, pStubMsg, pFormat,
+    array_read_conformance(FC_CVARRAY, pStubMsg, pFormat);
+    array_memory_size(FC_CVARRAY, pStubMsg, pFormat,
                       TRUE /* fHasPointers */);
 
     return pStubMsg->MemorySize;
@@ -4128,7 +4163,7 @@ unsigned char * WINAPI NdrComplexArrayMarshall(PMIDL_STUB_MESSAGE pStubMsg,
 
   TRACE("(%p,%p,%p)\n", pStubMsg, pMemory, pFormat);
 
-  if (pFormat[0] != RPC_FC_BOGUS_ARRAY)
+  if (pFormat[0] != FC_BOGUS_ARRAY)
   {
       ERR("invalid format type %x\n", pFormat[0]);
       RpcRaiseException(RPC_S_INTERNAL_ERROR);
@@ -4164,8 +4199,8 @@ unsigned char * WINAPI NdrComplexArrayMarshall(PMIDL_STUB_MESSAGE pStubMsg,
     pStubMsg->BufferLength = saved_buffer_length;
   }
 
-  array_compute_and_write_conformance(RPC_FC_BOGUS_ARRAY, pStubMsg, pMemory, pFormat);
-  array_write_variance_and_marshall(RPC_FC_BOGUS_ARRAY, pStubMsg,
+  array_compute_and_write_conformance(FC_BOGUS_ARRAY, pStubMsg, pMemory, pFormat);
+  array_write_variance_and_marshall(FC_BOGUS_ARRAY, pStubMsg,
                                     pMemory, pFormat, TRUE /* fHasPointers */);
 
   STD_OVERFLOW_CHECK(pStubMsg);
@@ -4193,7 +4228,7 @@ unsigned char * WINAPI NdrComplexArrayUnmarshall(PMIDL_STUB_MESSAGE pStubMsg,
 
   TRACE("(%p,%p,%p,%d)\n", pStubMsg, ppMemory, pFormat, fMustAlloc);
 
-  if (pFormat[0] != RPC_FC_BOGUS_ARRAY)
+  if (pFormat[0] != FC_BOGUS_ARRAY)
   {
       ERR("invalid format type %x\n", pFormat[0]);
       RpcRaiseException(RPC_S_INTERNAL_ERROR);
@@ -4220,8 +4255,8 @@ unsigned char * WINAPI NdrComplexArrayUnmarshall(PMIDL_STUB_MESSAGE pStubMsg,
   /* restore the original buffer */
   pStubMsg->Buffer = saved_buffer;
 
-  array_read_conformance(RPC_FC_BOGUS_ARRAY, pStubMsg, pFormat);
-  array_read_variance_and_unmarshall(RPC_FC_BOGUS_ARRAY, pStubMsg, ppMemory, pFormat, fMustAlloc,
+  array_read_conformance(FC_BOGUS_ARRAY, pStubMsg, pFormat);
+  array_read_variance_and_unmarshall(FC_BOGUS_ARRAY, pStubMsg, ppMemory, pFormat, fMustAlloc,
                                      TRUE /* fUseBufferMemoryServer */, TRUE /* fUnmarshall */);
 
   if (pointer_buffer_mark_set)
@@ -4244,7 +4279,7 @@ void WINAPI NdrComplexArrayBufferSize(PMIDL_STUB_MESSAGE pStubMsg,
 
   TRACE("(%p,%p,%p)\n", pStubMsg, pMemory, pFormat);
 
-  if (pFormat[0] != RPC_FC_BOGUS_ARRAY)
+  if (pFormat[0] != FC_BOGUS_ARRAY)
   {
       ERR("invalid format type %x\n", pFormat[0]);
       RpcRaiseException(RPC_S_INTERNAL_ERROR);
@@ -4278,8 +4313,8 @@ void WINAPI NdrComplexArrayBufferSize(PMIDL_STUB_MESSAGE pStubMsg,
     pStubMsg->BufferLength = saved_buffer_length;
   }
 
-  array_compute_and_size_conformance(RPC_FC_BOGUS_ARRAY, pStubMsg, pMemory, pFormat);
-  array_buffer_size(RPC_FC_BOGUS_ARRAY, pStubMsg, pMemory, pFormat, TRUE /* fHasPointers */);
+  array_compute_and_size_conformance(FC_BOGUS_ARRAY, pStubMsg, pMemory, pFormat);
+  array_buffer_size(FC_BOGUS_ARRAY, pStubMsg, pMemory, pFormat, TRUE /* fHasPointers */);
 
   if(pointer_length_set)
   {
@@ -4296,15 +4331,15 @@ ULONG WINAPI NdrComplexArrayMemorySize(PMIDL_STUB_MESSAGE pStubMsg,
 {
   TRACE("(%p,%p)\n", pStubMsg, pFormat);
 
-  if (pFormat[0] != RPC_FC_BOGUS_ARRAY)
+  if (pFormat[0] != FC_BOGUS_ARRAY)
   {
       ERR("invalid format type %x\n", pFormat[0]);
       RpcRaiseException(RPC_S_INTERNAL_ERROR);
       return 0;
   }
 
-  array_read_conformance(RPC_FC_BOGUS_ARRAY, pStubMsg, pFormat);
-  array_memory_size(RPC_FC_BOGUS_ARRAY, pStubMsg, pFormat, TRUE /* fHasPointers */);
+  array_read_conformance(FC_BOGUS_ARRAY, pStubMsg, pFormat);
+  array_memory_size(FC_BOGUS_ARRAY, pStubMsg, pFormat, TRUE /* fHasPointers */);
   return pStubMsg->MemorySize;
 }
 
@@ -4319,7 +4354,7 @@ void WINAPI NdrComplexArrayFree(PMIDL_STUB_MESSAGE pStubMsg,
 
   TRACE("(%p,%p,%p)\n", pStubMsg, pMemory, pFormat);
 
-  if (pFormat[0] != RPC_FC_BOGUS_ARRAY)
+  if (pFormat[0] != FC_BOGUS_ARRAY)
   {
       ERR("invalid format type %x\n", pFormat[0]);
       RpcRaiseException(RPC_S_INTERNAL_ERROR);
@@ -4678,7 +4713,7 @@ unsigned char *  WINAPI NdrConformantStructMarshall(PMIDL_STUB_MESSAGE pStubMsg,
     TRACE("(%p, %p, %p)\n", pStubMsg, pMemory, pFormat);
 
     pFormat += sizeof(NDR_CSTRUCT_FORMAT);
-    if ((pCStructFormat->type != RPC_FC_CPSTRUCT) && (pCStructFormat->type != RPC_FC_CSTRUCT))
+    if ((pCStructFormat->type != FC_CPSTRUCT) && (pCStructFormat->type != FC_CSTRUCT))
     {
         ERR("invalid format type %x\n", pCStructFormat->type);
         RpcRaiseException(RPC_S_INTERNAL_ERROR);
@@ -4687,7 +4722,7 @@ unsigned char *  WINAPI NdrConformantStructMarshall(PMIDL_STUB_MESSAGE pStubMsg,
 
     pCArrayFormat = (const unsigned char *)&pCStructFormat->offset_to_array_description +
         pCStructFormat->offset_to_array_description;
-    if (*pCArrayFormat != RPC_FC_CARRAY)
+    if (*pCArrayFormat != FC_CARRAY)
     {
         ERR("invalid array format type %x\n", pCStructFormat->type);
         RpcRaiseException(RPC_S_INTERNAL_ERROR);
@@ -4715,7 +4750,7 @@ unsigned char *  WINAPI NdrConformantStructMarshall(PMIDL_STUB_MESSAGE pStubMsg,
     pStubMsg->BufferMark = pStubMsg->Buffer;
     safe_copy_to_buffer(pStubMsg, pMemory, pCStructFormat->memory_size + bufsize);
 
-    if (pCStructFormat->type == RPC_FC_CPSTRUCT)
+    if (pCStructFormat->type == FC_CPSTRUCT)
         EmbeddedPointerMarshall(pStubMsg, pMemory, pFormat);
 
     return NULL;
@@ -4737,7 +4772,7 @@ unsigned char *  WINAPI NdrConformantStructUnmarshall(PMIDL_STUB_MESSAGE pStubMs
     TRACE("(%p, %p, %p, %d)\n", pStubMsg, ppMemory, pFormat, fMustAlloc);
 
     pFormat += sizeof(NDR_CSTRUCT_FORMAT);
-    if ((pCStructFormat->type != RPC_FC_CPSTRUCT) && (pCStructFormat->type != RPC_FC_CSTRUCT))
+    if ((pCStructFormat->type != FC_CPSTRUCT) && (pCStructFormat->type != FC_CSTRUCT))
     {
         ERR("invalid format type %x\n", pCStructFormat->type);
         RpcRaiseException(RPC_S_INTERNAL_ERROR);
@@ -4745,7 +4780,7 @@ unsigned char *  WINAPI NdrConformantStructUnmarshall(PMIDL_STUB_MESSAGE pStubMs
     }
     pCArrayFormat = (const unsigned char *)&pCStructFormat->offset_to_array_description +
         pCStructFormat->offset_to_array_description;
-    if (*pCArrayFormat != RPC_FC_CARRAY)
+    if (*pCArrayFormat != FC_CARRAY)
     {
         ERR("invalid array format type %x\n", pCStructFormat->type);
         RpcRaiseException(RPC_S_INTERNAL_ERROR);
@@ -4770,7 +4805,7 @@ unsigned char *  WINAPI NdrConformantStructUnmarshall(PMIDL_STUB_MESSAGE pStubMs
     if (fMustAlloc)
     {
         SIZE_T size = pCStructFormat->memory_size + bufsize;
-        *ppMemory = NdrAllocate(pStubMsg, size);
+        *ppMemory = NdrAllocateZero(pStubMsg, size);
     }
     else
     {
@@ -4781,7 +4816,7 @@ unsigned char *  WINAPI NdrConformantStructUnmarshall(PMIDL_STUB_MESSAGE pStubMs
 
     saved_buffer = pStubMsg->BufferMark = pStubMsg->Buffer;
     safe_buffer_increment(pStubMsg, pCStructFormat->memory_size + bufsize);
-    if (pCStructFormat->type == RPC_FC_CPSTRUCT)
+    if (pCStructFormat->type == FC_CPSTRUCT)
         EmbeddedPointerUnmarshall(pStubMsg, saved_buffer, *ppMemory, pFormat, fMustAlloc);
 
     TRACE("copying %p to %p\n", saved_buffer, *ppMemory);
@@ -4805,7 +4840,7 @@ void WINAPI NdrConformantStructBufferSize(PMIDL_STUB_MESSAGE pStubMsg,
     TRACE("(%p, %p, %p)\n", pStubMsg, pMemory, pFormat);
 
     pFormat += sizeof(NDR_CSTRUCT_FORMAT);
-    if ((pCStructFormat->type != RPC_FC_CPSTRUCT) && (pCStructFormat->type != RPC_FC_CSTRUCT))
+    if ((pCStructFormat->type != FC_CPSTRUCT) && (pCStructFormat->type != FC_CSTRUCT))
     {
         ERR("invalid format type %x\n", pCStructFormat->type);
         RpcRaiseException(RPC_S_INTERNAL_ERROR);
@@ -4813,7 +4848,7 @@ void WINAPI NdrConformantStructBufferSize(PMIDL_STUB_MESSAGE pStubMsg,
     }
     pCArrayFormat = (const unsigned char *)&pCStructFormat->offset_to_array_description +
         pCStructFormat->offset_to_array_description;
-    if (*pCArrayFormat != RPC_FC_CARRAY)
+    if (*pCArrayFormat != FC_CARRAY)
     {
         ERR("invalid array format type %x\n", pCStructFormat->type);
         RpcRaiseException(RPC_S_INTERNAL_ERROR);
@@ -4831,7 +4866,7 @@ void WINAPI NdrConformantStructBufferSize(PMIDL_STUB_MESSAGE pStubMsg,
     safe_buffer_length_increment(pStubMsg, pCStructFormat->memory_size);
     safe_buffer_length_increment(pStubMsg, safe_multiply(pStubMsg->MaxCount, esize));
 
-    if (pCStructFormat->type == RPC_FC_CPSTRUCT)
+    if (pCStructFormat->type == FC_CPSTRUCT)
         EmbeddedPointerBufferSize(pStubMsg, pMemory, pFormat);
 }
 
@@ -4858,7 +4893,7 @@ void WINAPI NdrConformantStructFree(PMIDL_STUB_MESSAGE pStubMsg,
     TRACE("(%p, %p, %p)\n", pStubMsg, pMemory, pFormat);
 
     pFormat += sizeof(NDR_CSTRUCT_FORMAT);
-    if ((pCStructFormat->type != RPC_FC_CPSTRUCT) && (pCStructFormat->type != RPC_FC_CSTRUCT))
+    if ((pCStructFormat->type != FC_CPSTRUCT) && (pCStructFormat->type != FC_CSTRUCT))
     {
         ERR("invalid format type %x\n", pCStructFormat->type);
         RpcRaiseException(RPC_S_INTERNAL_ERROR);
@@ -4867,7 +4902,7 @@ void WINAPI NdrConformantStructFree(PMIDL_STUB_MESSAGE pStubMsg,
 
     pCArrayFormat = (const unsigned char *)&pCStructFormat->offset_to_array_description +
         pCStructFormat->offset_to_array_description;
-    if (*pCArrayFormat != RPC_FC_CARRAY)
+    if (*pCArrayFormat != FC_CARRAY)
     {
         ERR("invalid array format type %x\n", pCStructFormat->type);
         RpcRaiseException(RPC_S_INTERNAL_ERROR);
@@ -4882,7 +4917,7 @@ void WINAPI NdrConformantStructFree(PMIDL_STUB_MESSAGE pStubMsg,
     /* copy constant sized part of struct */
     pStubMsg->BufferMark = pStubMsg->Buffer;
 
-    if (pCStructFormat->type == RPC_FC_CPSTRUCT)
+    if (pCStructFormat->type == FC_CPSTRUCT)
         EmbeddedPointerFree(pStubMsg, pMemory, pFormat);
 }
 
@@ -4899,7 +4934,7 @@ unsigned char *  WINAPI NdrConformantVaryingStructMarshall(PMIDL_STUB_MESSAGE pS
     TRACE("(%p, %p, %p)\n", pStubMsg, pMemory, pFormat);
 
     pFormat += sizeof(NDR_CVSTRUCT_FORMAT);
-    if (pCVStructFormat->type != RPC_FC_CVSTRUCT)
+    if (pCVStructFormat->type != FC_CVSTRUCT)
     {
         ERR("invalid format type %x\n", pCVStructFormat->type);
         RpcRaiseException(RPC_S_INTERNAL_ERROR);
@@ -4948,7 +4983,7 @@ unsigned char *  WINAPI NdrConformantVaryingStructUnmarshall(PMIDL_STUB_MESSAGE
     TRACE("(%p, %p, %p, %d)\n", pStubMsg, ppMemory, pFormat, fMustAlloc);
 
     pFormat += sizeof(NDR_CVSTRUCT_FORMAT);
-    if (pCVStructFormat->type != RPC_FC_CVSTRUCT)
+    if (pCVStructFormat->type != FC_CVSTRUCT)
     {
         ERR("invalid format type %x\n", pCVStructFormat->type);
         RpcRaiseException(RPC_S_INTERNAL_ERROR);
@@ -4971,7 +5006,7 @@ unsigned char *  WINAPI NdrConformantVaryingStructUnmarshall(PMIDL_STUB_MESSAGE
     if (fMustAlloc)
     {
         SIZE_T size = pCVStructFormat->memory_size + memsize;
-        *ppMemory = NdrAllocate(pStubMsg, size);
+        *ppMemory = NdrAllocateZero(pStubMsg, size);
     }
 
     /* mark the start of the constant data */
@@ -5001,9 +5036,9 @@ unsigned char *  WINAPI NdrConformantVaryingStructUnmarshall(PMIDL_STUB_MESSAGE
     memcpy(*ppMemory + pCVStructFormat->memory_size + offset,
            saved_array_buffer, bufsize);
 
-    if (*pCVArrayFormat == RPC_FC_C_CSTRING)
+    if (*pCVArrayFormat == FC_C_CSTRING)
         TRACE("string=%s\n", debugstr_a((char *)(*ppMemory + pCVStructFormat->memory_size)));
-    else if (*pCVArrayFormat == RPC_FC_C_WSTRING)
+    else if (*pCVArrayFormat == FC_C_WSTRING)
         TRACE("string=%s\n", debugstr_w((WCHAR *)(*ppMemory + pCVStructFormat->memory_size)));
 
     return NULL;
@@ -5022,7 +5057,7 @@ void WINAPI NdrConformantVaryingStructBufferSize(PMIDL_STUB_MESSAGE pStubMsg,
     TRACE("(%p, %p, %p)\n", pStubMsg, pMemory, pFormat);
 
     pFormat += sizeof(NDR_CVSTRUCT_FORMAT);
-    if (pCVStructFormat->type != RPC_FC_CVSTRUCT)
+    if (pCVStructFormat->type != FC_CVSTRUCT)
     {
         ERR("invalid format type %x\n", pCVStructFormat->type);
         RpcRaiseException(RPC_S_INTERNAL_ERROR);
@@ -5060,7 +5095,7 @@ ULONG WINAPI NdrConformantVaryingStructMemorySize(PMIDL_STUB_MESSAGE pStubMsg,
     TRACE("(%p, %p)\n", pStubMsg, pFormat);
 
     pFormat += sizeof(NDR_CVSTRUCT_FORMAT);
-    if (pCVStructFormat->type != RPC_FC_CVSTRUCT)
+    if (pCVStructFormat->type != FC_CVSTRUCT)
     {
         ERR("invalid format type %x\n", pCVStructFormat->type);
         RpcRaiseException(RPC_S_INTERNAL_ERROR);
@@ -5099,7 +5134,7 @@ void WINAPI NdrConformantVaryingStructFree(PMIDL_STUB_MESSAGE pStubMsg,
     TRACE("(%p, %p, %p)\n", pStubMsg, pMemory, pFormat);
 
     pFormat += sizeof(NDR_CVSTRUCT_FORMAT);
-    if (pCVStructFormat->type != RPC_FC_CVSTRUCT)
+    if (pCVStructFormat->type != FC_CVSTRUCT)
     {
         ERR("invalid format type %x\n", pCVStructFormat->type);
         RpcRaiseException(RPC_S_INTERNAL_ERROR);
@@ -5145,8 +5180,8 @@ unsigned char *  WINAPI NdrFixedArrayMarshall(PMIDL_STUB_MESSAGE pStubMsg,
 
     TRACE("(%p, %p, %p)\n", pStubMsg, pMemory, pFormat);
 
-    if ((pSmFArrayFormat->type != RPC_FC_SMFARRAY) &&
-        (pSmFArrayFormat->type != RPC_FC_LGFARRAY))
+    if ((pSmFArrayFormat->type != FC_SMFARRAY) &&
+        (pSmFArrayFormat->type != FC_LGFARRAY))
     {
         ERR("invalid format type %x\n", pSmFArrayFormat->type);
         RpcRaiseException(RPC_S_INTERNAL_ERROR);
@@ -5155,7 +5190,7 @@ unsigned char *  WINAPI NdrFixedArrayMarshall(PMIDL_STUB_MESSAGE pStubMsg,
 
     align_pointer_clear(&pStubMsg->Buffer, pSmFArrayFormat->alignment + 1);
 
-    if (pSmFArrayFormat->type == RPC_FC_SMFARRAY)
+    if (pSmFArrayFormat->type == FC_SMFARRAY)
     {
         total_size = pSmFArrayFormat->total_size;
         pFormat = (const unsigned char *)(pSmFArrayFormat + 1);
@@ -5189,8 +5224,8 @@ unsigned char *  WINAPI NdrFixedArrayUnmarshall(PMIDL_STUB_MESSAGE pStubMsg,
 
     TRACE("(%p, %p, %p, %d)\n", pStubMsg, ppMemory, pFormat, fMustAlloc);
 
-    if ((pSmFArrayFormat->type != RPC_FC_SMFARRAY) &&
-        (pSmFArrayFormat->type != RPC_FC_LGFARRAY))
+    if ((pSmFArrayFormat->type != FC_SMFARRAY) &&
+        (pSmFArrayFormat->type != FC_LGFARRAY))
     {
         ERR("invalid format type %x\n", pSmFArrayFormat->type);
         RpcRaiseException(RPC_S_INTERNAL_ERROR);
@@ -5199,7 +5234,7 @@ unsigned char *  WINAPI NdrFixedArrayUnmarshall(PMIDL_STUB_MESSAGE pStubMsg,
 
     align_pointer(&pStubMsg->Buffer, pSmFArrayFormat->alignment + 1);
 
-    if (pSmFArrayFormat->type == RPC_FC_SMFARRAY)
+    if (pSmFArrayFormat->type == FC_SMFARRAY)
     {
         total_size = pSmFArrayFormat->total_size;
         pFormat = (const unsigned char *)(pSmFArrayFormat + 1);
@@ -5212,7 +5247,7 @@ unsigned char *  WINAPI NdrFixedArrayUnmarshall(PMIDL_STUB_MESSAGE pStubMsg,
     }
 
     if (fMustAlloc)
-        *ppMemory = NdrAllocate(pStubMsg, total_size);
+        *ppMemory = NdrAllocateZero(pStubMsg, total_size);
     else
     {
         if (!pStubMsg->IsClient && !*ppMemory)
@@ -5243,8 +5278,8 @@ void WINAPI NdrFixedArrayBufferSize(PMIDL_STUB_MESSAGE pStubMsg,
 
     TRACE("(%p, %p, %p)\n", pStubMsg, pMemory, pFormat);
 
-    if ((pSmFArrayFormat->type != RPC_FC_SMFARRAY) &&
-        (pSmFArrayFormat->type != RPC_FC_LGFARRAY))
+    if ((pSmFArrayFormat->type != FC_SMFARRAY) &&
+        (pSmFArrayFormat->type != FC_LGFARRAY))
     {
         ERR("invalid format type %x\n", pSmFArrayFormat->type);
         RpcRaiseException(RPC_S_INTERNAL_ERROR);
@@ -5253,7 +5288,7 @@ void WINAPI NdrFixedArrayBufferSize(PMIDL_STUB_MESSAGE pStubMsg,
 
     align_length(&pStubMsg->BufferLength, pSmFArrayFormat->alignment + 1);
 
-    if (pSmFArrayFormat->type == RPC_FC_SMFARRAY)
+    if (pSmFArrayFormat->type == FC_SMFARRAY)
     {
         total_size = pSmFArrayFormat->total_size;
         pFormat = (const unsigned char *)(pSmFArrayFormat + 1);
@@ -5280,8 +5315,8 @@ ULONG WINAPI NdrFixedArrayMemorySize(PMIDL_STUB_MESSAGE pStubMsg,
 
     TRACE("(%p, %p)\n", pStubMsg, pFormat);
 
-    if ((pSmFArrayFormat->type != RPC_FC_SMFARRAY) &&
-        (pSmFArrayFormat->type != RPC_FC_LGFARRAY))
+    if ((pSmFArrayFormat->type != FC_SMFARRAY) &&
+        (pSmFArrayFormat->type != FC_LGFARRAY))
     {
         ERR("invalid format type %x\n", pSmFArrayFormat->type);
         RpcRaiseException(RPC_S_INTERNAL_ERROR);
@@ -5290,7 +5325,7 @@ ULONG WINAPI NdrFixedArrayMemorySize(PMIDL_STUB_MESSAGE pStubMsg,
 
     align_pointer(&pStubMsg->Buffer, pSmFArrayFormat->alignment + 1);
 
-    if (pSmFArrayFormat->type == RPC_FC_SMFARRAY)
+    if (pSmFArrayFormat->type == FC_SMFARRAY)
     {
         total_size = pSmFArrayFormat->total_size;
         pFormat = (const unsigned char *)(pSmFArrayFormat + 1);
@@ -5321,15 +5356,15 @@ void WINAPI NdrFixedArrayFree(PMIDL_STUB_MESSAGE pStubMsg,
 
     TRACE("(%p, %p, %p)\n", pStubMsg, pMemory, pFormat);
 
-    if ((pSmFArrayFormat->type != RPC_FC_SMFARRAY) &&
-        (pSmFArrayFormat->type != RPC_FC_LGFARRAY))
+    if ((pSmFArrayFormat->type != FC_SMFARRAY) &&
+        (pSmFArrayFormat->type != FC_LGFARRAY))
     {
         ERR("invalid format type %x\n", pSmFArrayFormat->type);
         RpcRaiseException(RPC_S_INTERNAL_ERROR);
         return;
     }
 
-    if (pSmFArrayFormat->type == RPC_FC_SMFARRAY)
+    if (pSmFArrayFormat->type == FC_SMFARRAY)
         pFormat = (const unsigned char *)(pSmFArrayFormat + 1);
     else
     {
@@ -5353,8 +5388,8 @@ unsigned char *  WINAPI NdrVaryingArrayMarshall(PMIDL_STUB_MESSAGE pStubMsg,
 
     TRACE("(%p, %p, %p)\n", pStubMsg, pMemory, pFormat);
 
-    if ((pFormat[0] != RPC_FC_SMVARRAY) &&
-        (pFormat[0] != RPC_FC_LGVARRAY))
+    if ((pFormat[0] != FC_SMVARRAY) &&
+        (pFormat[0] != FC_LGVARRAY))
     {
         ERR("invalid format type %x\n", pFormat[0]);
         RpcRaiseException(RPC_S_INTERNAL_ERROR);
@@ -5363,7 +5398,7 @@ unsigned char *  WINAPI NdrVaryingArrayMarshall(PMIDL_STUB_MESSAGE pStubMsg,
 
     alignment = pFormat[1] + 1;
 
-    if (pFormat[0] == RPC_FC_SMVARRAY)
+    if (pFormat[0] == FC_SMVARRAY)
     {
         pFormat += 2;
         pFormat += sizeof(WORD);
@@ -5418,8 +5453,8 @@ unsigned char *  WINAPI NdrVaryingArrayUnmarshall(PMIDL_STUB_MESSAGE pStubMsg,
 
     TRACE("(%p, %p, %p, %d)\n", pStubMsg, ppMemory, pFormat, fMustAlloc);
 
-    if ((pFormat[0] != RPC_FC_SMVARRAY) &&
-        (pFormat[0] != RPC_FC_LGVARRAY))
+    if ((pFormat[0] != FC_SMVARRAY) &&
+        (pFormat[0] != FC_LGVARRAY))
     {
         ERR("invalid format type %x\n", pFormat[0]);
         RpcRaiseException(RPC_S_INTERNAL_ERROR);
@@ -5428,7 +5463,7 @@ unsigned char *  WINAPI NdrVaryingArrayUnmarshall(PMIDL_STUB_MESSAGE pStubMsg,
 
     alignment = pFormat[1] + 1;
 
-    if (pFormat[0] == RPC_FC_SMVARRAY)
+    if (pFormat[0] == FC_SMVARRAY)
     {
         pFormat += 2;
         size = *(const WORD*)pFormat;
@@ -5458,7 +5493,7 @@ unsigned char *  WINAPI NdrVaryingArrayUnmarshall(PMIDL_STUB_MESSAGE pStubMsg,
     if (!fMustAlloc && !*ppMemory)
         fMustAlloc = TRUE;
     if (fMustAlloc)
-        *ppMemory = NdrAllocate(pStubMsg, size);
+        *ppMemory = NdrAllocateZero(pStubMsg, size);
     saved_buffer = pStubMsg->BufferMark = pStubMsg->Buffer;
     safe_buffer_increment(pStubMsg, bufsize);
 
@@ -5481,8 +5516,8 @@ void WINAPI NdrVaryingArrayBufferSize(PMIDL_STUB_MESSAGE pStubMsg,
 
     TRACE("(%p, %p, %p)\n", pStubMsg, pMemory, pFormat);
 
-    if ((pFormat[0] != RPC_FC_SMVARRAY) &&
-        (pFormat[0] != RPC_FC_LGVARRAY))
+    if ((pFormat[0] != FC_SMVARRAY) &&
+        (pFormat[0] != FC_LGVARRAY))
     {
         ERR("invalid format type %x\n", pFormat[0]);
         RpcRaiseException(RPC_S_INTERNAL_ERROR);
@@ -5491,7 +5526,7 @@ void WINAPI NdrVaryingArrayBufferSize(PMIDL_STUB_MESSAGE pStubMsg,
 
     alignment = pFormat[1] + 1;
 
-    if (pFormat[0] == RPC_FC_SMVARRAY)
+    if (pFormat[0] == FC_SMVARRAY)
     {
         pFormat += 2;
         pFormat += sizeof(WORD);
@@ -5537,8 +5572,8 @@ ULONG WINAPI NdrVaryingArrayMemorySize(PMIDL_STUB_MESSAGE pStubMsg,
 
     TRACE("(%p, %p)\n", pStubMsg, pFormat);
 
-    if ((pFormat[0] != RPC_FC_SMVARRAY) &&
-        (pFormat[0] != RPC_FC_LGVARRAY))
+    if ((pFormat[0] != FC_SMVARRAY) &&
+        (pFormat[0] != FC_LGVARRAY))
     {
         ERR("invalid format type %x\n", pFormat[0]);
         RpcRaiseException(RPC_S_INTERNAL_ERROR);
@@ -5547,7 +5582,7 @@ ULONG WINAPI NdrVaryingArrayMemorySize(PMIDL_STUB_MESSAGE pStubMsg,
 
     alignment = pFormat[1] + 1;
 
-    if (pFormat[0] == RPC_FC_SMVARRAY)
+    if (pFormat[0] == FC_SMVARRAY)
     {
         pFormat += 2;
         size = *(const WORD*)pFormat;
@@ -5590,15 +5625,15 @@ void WINAPI NdrVaryingArrayFree(PMIDL_STUB_MESSAGE pStubMsg,
 
     TRACE("(%p, %p, %p)\n", pStubMsg, pMemory, pFormat);
 
-    if ((pFormat[0] != RPC_FC_SMVARRAY) &&
-        (pFormat[0] != RPC_FC_LGVARRAY))
+    if ((pFormat[0] != FC_SMVARRAY) &&
+        (pFormat[0] != FC_LGVARRAY))
     {
         ERR("invalid format type %x\n", pFormat[0]);
         RpcRaiseException(RPC_S_INTERNAL_ERROR);
         return;
     }
 
-    if (pFormat[0] == RPC_FC_SMVARRAY)
+    if (pFormat[0] == FC_SMVARRAY)
     {
         pFormat += 2;
         pFormat += sizeof(WORD);
@@ -5630,23 +5665,20 @@ static ULONG get_discriminant(unsigned char fc, const unsigned char *pMemory)
 {
     switch (fc)
     {
-    case RPC_FC_BYTE:
-    case RPC_FC_CHAR:
-    case RPC_FC_SMALL:
-    case RPC_FC_USMALL:
+    case FC_BYTE:
+    case FC_CHAR:
+    case FC_SMALL:
+    case FC_USMALL:
         return *pMemory;
-    case RPC_FC_WCHAR:
-    case RPC_FC_SHORT:
-    case RPC_FC_USHORT:
-    case RPC_FC_ENUM16:
+    case FC_WCHAR:
+    case FC_SHORT:
+    case FC_USHORT:
+    case FC_ENUM16:
         return *(const USHORT *)pMemory;
-    case RPC_FC_LONG:
-    case RPC_FC_ULONG:
-    case RPC_FC_ENUM32:
+    case FC_LONG:
+    case FC_ULONG:
+    case FC_ENUM32:
         return *(const ULONG *)pMemory;
-    case RPC_FC_INT3264:
-    case RPC_FC_UINT3264:
-        return *(const ULONG_PTR *)pMemory;
     default:
         FIXME("Unhandled base type: 0x%02x\n", fc);
         return 0;
@@ -5716,10 +5748,10 @@ static unsigned char *union_arm_marshall(PMIDL_STUB_MESSAGE pStubMsg, unsigned c
             BOOL pointer_buffer_mark_set = FALSE;
             switch(*desc)
             {
-            case RPC_FC_RP:
-            case RPC_FC_UP:
-            case RPC_FC_OP:
-            case RPC_FC_FP:
+            case FC_RP:
+            case FC_UP:
+            case FC_OP:
+            case FC_FP:
                 align_pointer_clear(&pStubMsg->Buffer, 4);
                 saved_buffer = pStubMsg->Buffer;
                 if (pStubMsg->PointerBufferMark)
@@ -5745,7 +5777,7 @@ static unsigned char *union_arm_marshall(PMIDL_STUB_MESSAGE pStubMsg, unsigned c
                   pStubMsg->Buffer = saved_buffer + 4;
                 }
                 break;
-            case RPC_FC_IP:
+            case FC_IP:
                 /* must be dereferenced first */
                 m(pStubMsg, *(unsigned char **)pMemory, desc);
                 break;
@@ -5789,10 +5821,10 @@ static unsigned char *union_arm_unmarshall(PMIDL_STUB_MESSAGE pStubMsg,
             BOOL pointer_buffer_mark_set = FALSE;
             switch(*desc)
             {
-            case RPC_FC_RP:
-            case RPC_FC_UP:
-            case RPC_FC_OP:
-            case RPC_FC_FP:
+            case FC_RP:
+            case FC_UP:
+            case FC_OP:
+            case FC_FP:
                 align_pointer(&pStubMsg->Buffer, 4);
                 saved_buffer = pStubMsg->Buffer;
                 if (pStubMsg->PointerBufferMark)
@@ -5819,7 +5851,7 @@ static unsigned char *union_arm_unmarshall(PMIDL_STUB_MESSAGE pStubMsg,
                   pStubMsg->Buffer = saved_buffer + 4;
                 }
                 break;
-            case RPC_FC_IP:
+            case FC_IP:
                 /* must be dereferenced first */
                 m(pStubMsg, *(unsigned char ***)ppMemory, desc, fMustAlloc);
                 break;
@@ -5860,10 +5892,10 @@ static void union_arm_buffer_size(PMIDL_STUB_MESSAGE pStubMsg,
         {
             switch(*desc)
             {
-            case RPC_FC_RP:
-            case RPC_FC_UP:
-            case RPC_FC_OP:
-            case RPC_FC_FP:
+            case FC_RP:
+            case FC_UP:
+            case FC_OP:
+            case FC_FP:
                 align_length(&pStubMsg->BufferLength, 4);
                 safe_buffer_length_increment(pStubMsg, 4); /* for pointer ID */
                 if (!pStubMsg->IgnoreEmbeddedPointers)
@@ -5878,7 +5910,7 @@ static void union_arm_buffer_size(PMIDL_STUB_MESSAGE pStubMsg,
                     pStubMsg->BufferLength = saved_buffer_length;
                 }
                 break;
-            case RPC_FC_IP:
+            case FC_IP:
                 /* must be dereferenced first */
                 m(pStubMsg, *(unsigned char **)pMemory, desc);
                 break;
@@ -5919,10 +5951,10 @@ static ULONG union_arm_memory_size(PMIDL_STUB_MESSAGE pStubMsg,
         {
             switch(*desc)
             {
-            case RPC_FC_RP:
-            case RPC_FC_UP:
-            case RPC_FC_OP:
-            case RPC_FC_FP:
+            case FC_RP:
+            case FC_UP:
+            case FC_OP:
+            case FC_FP:
                 align_pointer(&pStubMsg->Buffer, 4);
                 saved_buffer = pStubMsg->Buffer;
                 safe_buffer_increment(pStubMsg, 4);
@@ -5965,13 +5997,13 @@ static void union_arm_free(PMIDL_STUB_MESSAGE pStubMsg,
         {
             switch(*desc)
             {
-            case RPC_FC_RP:
-            case RPC_FC_UP:
-            case RPC_FC_OP:
-            case RPC_FC_FP:
+            case FC_RP:
+            case FC_UP:
+            case FC_OP:
+            case FC_FP:
                 PointerFree(pStubMsg, *(unsigned char **)pMemory, desc);
                 break;
-            case RPC_FC_IP:
+            case FC_IP:
                 /* must be dereferenced first */
                 m(pStubMsg, *(unsigned char **)pMemory, desc);
                 break;
@@ -6164,20 +6196,20 @@ static LONG unmarshall_discriminant(PMIDL_STUB_MESSAGE pStubMsg,
 
     switch(**ppFormat)
     {
-    case RPC_FC_BYTE:
-    case RPC_FC_CHAR:
-    case RPC_FC_SMALL:
-    case RPC_FC_USMALL:
+    case FC_BYTE:
+    case FC_CHAR:
+    case FC_SMALL:
+    case FC_USMALL:
     {
         UCHAR d;
         safe_copy_from_buffer(pStubMsg, &d, sizeof(d));
         discriminant = d;
         break;
     }
-    case RPC_FC_WCHAR:
-    case RPC_FC_SHORT:
-    case RPC_FC_USHORT:
-    case RPC_FC_ENUM16:
+    case FC_WCHAR:
+    case FC_SHORT:
+    case FC_USHORT:
+    case FC_ENUM16:
     {
         USHORT d;
         align_pointer(&pStubMsg->Buffer, sizeof(USHORT));
@@ -6185,8 +6217,8 @@ static LONG unmarshall_discriminant(PMIDL_STUB_MESSAGE pStubMsg,
         discriminant = d;
         break;
     }
-    case RPC_FC_LONG:
-    case RPC_FC_ULONG:
+    case FC_LONG:
+    case FC_ULONG:
     {
         ULONG d;
         align_pointer(&pStubMsg->Buffer, sizeof(ULONG));
@@ -6416,7 +6448,7 @@ static unsigned char *WINAPI NdrRangeMarshall(
 
     TRACE("pStubMsg %p, pMemory %p, type 0x%02x\n", pStubMsg, pMemory, *pFormat);
 
-    if (pRange->type != RPC_FC_RANGE)
+    if (pRange->type != FC_RANGE)
     {
         ERR("invalid format type %x\n", pRange->type);
         RpcRaiseException(RPC_S_INTERNAL_ERROR);
@@ -6442,7 +6474,7 @@ unsigned char *WINAPI NdrRangeUnmarshall(
 
     TRACE("pStubMsg: %p, ppMemory: %p, type: 0x%02x, fMustAlloc: %s\n", pStubMsg, ppMemory, *pFormat, fMustAlloc ? "true" : "false");
 
-    if (pRange->type != RPC_FC_RANGE)
+    if (pRange->type != FC_RANGE)
     {
         ERR("invalid format type %x\n", pRange->type);
         RpcRaiseException(RPC_S_INTERNAL_ERROR);
@@ -6483,41 +6515,41 @@ unsigned char *WINAPI NdrRangeUnmarshall(
 
     switch(base_type)
     {
-    case RPC_FC_CHAR:
-    case RPC_FC_SMALL:
+    case FC_CHAR:
+    case FC_SMALL:
         RANGE_UNMARSHALL(UCHAR, UCHAR, "%d");
         TRACE("value: 0x%02x\n", **ppMemory);
         break;
-    case RPC_FC_BYTE:
-    case RPC_FC_USMALL:
+    case FC_BYTE:
+    case FC_USMALL:
         RANGE_UNMARSHALL(CHAR, CHAR, "%u");
         TRACE("value: 0x%02x\n", **ppMemory);
         break;
-    case RPC_FC_WCHAR: /* FIXME: valid? */
-    case RPC_FC_USHORT:
+    case FC_WCHAR: /* FIXME: valid? */
+    case FC_USHORT:
         RANGE_UNMARSHALL(USHORT, USHORT, "%u");
         TRACE("value: 0x%04x\n", **(USHORT **)ppMemory);
         break;
-    case RPC_FC_SHORT:
+    case FC_SHORT:
         RANGE_UNMARSHALL(SHORT, SHORT, "%d");
         TRACE("value: 0x%04x\n", **(USHORT **)ppMemory);
         break;
-    case RPC_FC_LONG:
-    case RPC_FC_ENUM32:
+    case FC_LONG:
+    case FC_ENUM32:
         RANGE_UNMARSHALL(LONG, LONG, "%d");
         TRACE("value: 0x%08x\n", **(ULONG **)ppMemory);
         break;
-    case RPC_FC_ULONG:
+    case FC_ULONG:
         RANGE_UNMARSHALL(ULONG, ULONG, "%u");
         TRACE("value: 0x%08x\n", **(ULONG **)ppMemory);
         break;
-    case RPC_FC_ENUM16:
+    case FC_ENUM16:
         RANGE_UNMARSHALL(UINT, USHORT, "%u");
         TRACE("value: 0x%08x\n", **(UINT **)ppMemory);
         break;
-    case RPC_FC_FLOAT:
-    case RPC_FC_DOUBLE:
-    case RPC_FC_HYPER:
+    case FC_FLOAT:
+    case FC_DOUBLE:
+    case FC_HYPER:
     default:
         ERR("invalid range base type: 0x%02x\n", base_type);
         RpcRaiseException(RPC_S_INTERNAL_ERROR);
@@ -6539,7 +6571,7 @@ static void WINAPI NdrRangeBufferSize(
 
     TRACE("pStubMsg %p, pMemory %p, type 0x%02x\n", pStubMsg, pMemory, *pFormat);
 
-    if (pRange->type != RPC_FC_RANGE)
+    if (pRange->type != FC_RANGE)
     {
         ERR("invalid format type %x\n", pRange->type);
         RpcRaiseException(RPC_S_INTERNAL_ERROR);
@@ -6559,7 +6591,7 @@ static ULONG WINAPI NdrRangeMemorySize(
     const NDR_RANGE *pRange = (const NDR_RANGE *)pFormat;
     unsigned char base_type;
 
-    if (pRange->type != RPC_FC_RANGE)
+    if (pRange->type != FC_RANGE)
     {
         ERR("invalid format type %x\n", pRange->type);
         RpcRaiseException(RPC_S_INTERNAL_ERROR);
@@ -6594,42 +6626,42 @@ static unsigned char *WINAPI NdrBaseTypeMarshall(
 
     switch(*pFormat)
     {
-    case RPC_FC_BYTE:
-    case RPC_FC_CHAR:
-    case RPC_FC_SMALL:
-    case RPC_FC_USMALL:
+    case FC_BYTE:
+    case FC_CHAR:
+    case FC_SMALL:
+    case FC_USMALL:
         safe_copy_to_buffer(pStubMsg, pMemory, sizeof(UCHAR));
         TRACE("value: 0x%02x\n", *pMemory);
         break;
-    case RPC_FC_WCHAR:
-    case RPC_FC_SHORT:
-    case RPC_FC_USHORT:
+    case FC_WCHAR:
+    case FC_SHORT:
+    case FC_USHORT:
         align_pointer_clear(&pStubMsg->Buffer, sizeof(USHORT));
         safe_copy_to_buffer(pStubMsg, pMemory, sizeof(USHORT));
         TRACE("value: 0x%04x\n", *(USHORT *)pMemory);
         break;
-    case RPC_FC_LONG:
-    case RPC_FC_ULONG:
-    case RPC_FC_ERROR_STATUS_T:
-    case RPC_FC_ENUM32:
+    case FC_LONG:
+    case FC_ULONG:
+    case FC_ERROR_STATUS_T:
+    case FC_ENUM32:
         align_pointer_clear(&pStubMsg->Buffer, sizeof(ULONG));
         safe_copy_to_buffer(pStubMsg, pMemory, sizeof(ULONG));
         TRACE("value: 0x%08x\n", *(ULONG *)pMemory);
         break;
-    case RPC_FC_FLOAT:
+    case FC_FLOAT:
         align_pointer_clear(&pStubMsg->Buffer, sizeof(float));
         safe_copy_to_buffer(pStubMsg, pMemory, sizeof(float));
         break;
-    case RPC_FC_DOUBLE:
+    case FC_DOUBLE:
         align_pointer_clear(&pStubMsg->Buffer, sizeof(double));
         safe_copy_to_buffer(pStubMsg, pMemory, sizeof(double));
         break;
-    case RPC_FC_HYPER:
+    case FC_HYPER:
         align_pointer_clear(&pStubMsg->Buffer, sizeof(ULONGLONG));
         safe_copy_to_buffer(pStubMsg, pMemory, sizeof(ULONGLONG));
         TRACE("value: %s\n", wine_dbgstr_longlong(*(ULONGLONG*)pMemory));
         break;
-    case RPC_FC_ENUM16:
+    case FC_ENUM16:
     {
         USHORT val = *(UINT *)pMemory;
         /* only 16-bits on the wire, so do a sanity check */
@@ -6640,15 +6672,15 @@ static unsigned char *WINAPI NdrBaseTypeMarshall(
         TRACE("value: 0x%04x\n", *(UINT *)pMemory);
         break;
     }
-    case RPC_FC_INT3264:
-    case RPC_FC_UINT3264:
+    case FC_INT3264:
+    case FC_UINT3264:
     {
         UINT val = *(UINT_PTR *)pMemory;
         align_pointer_clear(&pStubMsg->Buffer, sizeof(UINT));
         safe_copy_to_buffer(pStubMsg, &val, sizeof(val));
         break;
     }
-    case RPC_FC_IGNORE:
+    case FC_IGNORE:
         break;
     default:
         FIXME("Unhandled base type: 0x%02x\n", *pFormat);
@@ -6688,39 +6720,39 @@ static unsigned char *WINAPI NdrBaseTypeUnmarshall(
 
     switch(*pFormat)
     {
-    case RPC_FC_BYTE:
-    case RPC_FC_CHAR:
-    case RPC_FC_SMALL:
-    case RPC_FC_USMALL:
+    case FC_BYTE:
+    case FC_CHAR:
+    case FC_SMALL:
+    case FC_USMALL:
         BASE_TYPE_UNMARSHALL(UCHAR);
         TRACE("value: 0x%02x\n", **ppMemory);
         break;
-    case RPC_FC_WCHAR:
-    case RPC_FC_SHORT:
-    case RPC_FC_USHORT:
+    case FC_WCHAR:
+    case FC_SHORT:
+    case FC_USHORT:
         BASE_TYPE_UNMARSHALL(USHORT);
         TRACE("value: 0x%04x\n", **(USHORT **)ppMemory);
         break;
-    case RPC_FC_LONG:
-    case RPC_FC_ULONG:
-    case RPC_FC_ERROR_STATUS_T:
-    case RPC_FC_ENUM32:
+    case FC_LONG:
+    case FC_ULONG:
+    case FC_ERROR_STATUS_T:
+    case FC_ENUM32:
         BASE_TYPE_UNMARSHALL(ULONG);
         TRACE("value: 0x%08x\n", **(ULONG **)ppMemory);
         break;
-   case RPC_FC_FLOAT:
+   case FC_FLOAT:
         BASE_TYPE_UNMARSHALL(float);
         TRACE("value: %f\n", **(float **)ppMemory);
         break;
-    case RPC_FC_DOUBLE:
+    case FC_DOUBLE:
         BASE_TYPE_UNMARSHALL(double);
         TRACE("value: %f\n", **(double **)ppMemory);
         break;
-    case RPC_FC_HYPER:
+    case FC_HYPER:
         BASE_TYPE_UNMARSHALL(ULONGLONG);
         TRACE("value: %s\n", wine_dbgstr_longlong(**(ULONGLONG **)ppMemory));
         break;
-    case RPC_FC_ENUM16:
+    case FC_ENUM16:
     {
         USHORT val;
         align_pointer(&pStubMsg->Buffer, sizeof(USHORT));
@@ -6734,7 +6766,7 @@ static unsigned char *WINAPI NdrBaseTypeUnmarshall(
         TRACE("value: 0x%08x\n", **(UINT **)ppMemory);
         break;
     }
-    case RPC_FC_INT3264:
+    case FC_INT3264:
         if (sizeof(INT_PTR) == sizeof(INT)) BASE_TYPE_UNMARSHALL(INT);
         else
         {
@@ -6749,7 +6781,7 @@ static unsigned char *WINAPI NdrBaseTypeUnmarshall(
             TRACE("value: 0x%08lx\n", **(INT_PTR **)ppMemory);
         }
         break;
-    case RPC_FC_UINT3264:
+    case FC_UINT3264:
         if (sizeof(UINT_PTR) == sizeof(UINT)) BASE_TYPE_UNMARSHALL(UINT);
         else
         {
@@ -6764,7 +6796,7 @@ static unsigned char *WINAPI NdrBaseTypeUnmarshall(
             TRACE("value: 0x%08lx\n", **(UINT_PTR **)ppMemory);
         }
         break;
-    case RPC_FC_IGNORE:
+    case FC_IGNORE:
         break;
     default:
         FIXME("Unhandled base type: 0x%02x\n", *pFormat);
@@ -6788,44 +6820,44 @@ static void WINAPI NdrBaseTypeBufferSize(
 
     switch(*pFormat)
     {
-    case RPC_FC_BYTE:
-    case RPC_FC_CHAR:
-    case RPC_FC_SMALL:
-    case RPC_FC_USMALL:
+    case FC_BYTE:
+    case FC_CHAR:
+    case FC_SMALL:
+    case FC_USMALL:
         safe_buffer_length_increment(pStubMsg, sizeof(UCHAR));
         break;
-    case RPC_FC_WCHAR:
-    case RPC_FC_SHORT:
-    case RPC_FC_USHORT:
-    case RPC_FC_ENUM16:
+    case FC_WCHAR:
+    case FC_SHORT:
+    case FC_USHORT:
+    case FC_ENUM16:
         align_length(&pStubMsg->BufferLength, sizeof(USHORT));
         safe_buffer_length_increment(pStubMsg, sizeof(USHORT));
         break;
-    case RPC_FC_LONG:
-    case RPC_FC_ULONG:
-    case RPC_FC_ENUM32:
-    case RPC_FC_INT3264:
-    case RPC_FC_UINT3264:
+    case FC_LONG:
+    case FC_ULONG:
+    case FC_ENUM32:
+    case FC_INT3264:
+    case FC_UINT3264:
         align_length(&pStubMsg->BufferLength, sizeof(ULONG));
         safe_buffer_length_increment(pStubMsg, sizeof(ULONG));
         break;
-    case RPC_FC_FLOAT:
+    case FC_FLOAT:
         align_length(&pStubMsg->BufferLength, sizeof(float));
         safe_buffer_length_increment(pStubMsg, sizeof(float));
         break;
-    case RPC_FC_DOUBLE:
+    case FC_DOUBLE:
         align_length(&pStubMsg->BufferLength, sizeof(double));
         safe_buffer_length_increment(pStubMsg, sizeof(double));
         break;
-    case RPC_FC_HYPER:
+    case FC_HYPER:
         align_length(&pStubMsg->BufferLength, sizeof(ULONGLONG));
         safe_buffer_length_increment(pStubMsg, sizeof(ULONGLONG));
         break;
-    case RPC_FC_ERROR_STATUS_T:
+    case FC_ERROR_STATUS_T:
         align_length(&pStubMsg->BufferLength, sizeof(error_status_t));
         safe_buffer_length_increment(pStubMsg, sizeof(error_status_t));
         break;
-    case RPC_FC_IGNORE:
+    case FC_IGNORE:
         break;
     default:
         FIXME("Unhandled base type: 0x%02x\n", *pFormat);
@@ -6843,67 +6875,67 @@ static ULONG WINAPI NdrBaseTypeMemorySize(
 
     switch(*pFormat)
     {
-    case RPC_FC_BYTE:
-    case RPC_FC_CHAR:
-    case RPC_FC_SMALL:
-    case RPC_FC_USMALL:
+    case FC_BYTE:
+    case FC_CHAR:
+    case FC_SMALL:
+    case FC_USMALL:
         safe_buffer_increment(pStubMsg, sizeof(UCHAR));
         pStubMsg->MemorySize += sizeof(UCHAR);
         return sizeof(UCHAR);
-    case RPC_FC_WCHAR:
-    case RPC_FC_SHORT:
-    case RPC_FC_USHORT:
+    case FC_WCHAR:
+    case FC_SHORT:
+    case FC_USHORT:
         align_pointer(&pStubMsg->Buffer, sizeof(USHORT));
         safe_buffer_increment(pStubMsg, sizeof(USHORT));
         align_length(&pStubMsg->MemorySize, sizeof(USHORT));
         pStubMsg->MemorySize += sizeof(USHORT);
         return sizeof(USHORT);
-    case RPC_FC_LONG:
-    case RPC_FC_ULONG:
-    case RPC_FC_ENUM32:
+    case FC_LONG:
+    case FC_ULONG:
+    case FC_ENUM32:
         align_pointer(&pStubMsg->Buffer, sizeof(ULONG));
         safe_buffer_increment(pStubMsg, sizeof(ULONG));
         align_length(&pStubMsg->MemorySize, sizeof(ULONG));
         pStubMsg->MemorySize += sizeof(ULONG);
         return sizeof(ULONG);
-    case RPC_FC_FLOAT:
+    case FC_FLOAT:
         align_pointer(&pStubMsg->Buffer, sizeof(float));
         safe_buffer_increment(pStubMsg, sizeof(float));
         align_length(&pStubMsg->MemorySize, sizeof(float));
         pStubMsg->MemorySize += sizeof(float);
         return sizeof(float);
-    case RPC_FC_DOUBLE:
+    case FC_DOUBLE:
         align_pointer(&pStubMsg->Buffer, sizeof(double));
         safe_buffer_increment(pStubMsg, sizeof(double));
         align_length(&pStubMsg->MemorySize, sizeof(double));
         pStubMsg->MemorySize += sizeof(double);
         return sizeof(double);
-    case RPC_FC_HYPER:
+    case FC_HYPER:
         align_pointer(&pStubMsg->Buffer, sizeof(ULONGLONG));
         safe_buffer_increment(pStubMsg, sizeof(ULONGLONG));
         align_length(&pStubMsg->MemorySize, sizeof(ULONGLONG));
         pStubMsg->MemorySize += sizeof(ULONGLONG);
         return sizeof(ULONGLONG);
-    case RPC_FC_ERROR_STATUS_T:
+    case FC_ERROR_STATUS_T:
         align_pointer(&pStubMsg->Buffer, sizeof(error_status_t));
         safe_buffer_increment(pStubMsg, sizeof(error_status_t));
         align_length(&pStubMsg->MemorySize, sizeof(error_status_t));
         pStubMsg->MemorySize += sizeof(error_status_t);
         return sizeof(error_status_t);
-    case RPC_FC_ENUM16:
+    case FC_ENUM16:
         align_pointer(&pStubMsg->Buffer, sizeof(USHORT));
         safe_buffer_increment(pStubMsg, sizeof(USHORT));
         align_length(&pStubMsg->MemorySize, sizeof(UINT));
         pStubMsg->MemorySize += sizeof(UINT);
         return sizeof(UINT);
-    case RPC_FC_INT3264:
-    case RPC_FC_UINT3264:
+    case FC_INT3264:
+    case FC_UINT3264:
         align_pointer(&pStubMsg->Buffer, sizeof(UINT));
         safe_buffer_increment(pStubMsg, sizeof(UINT));
         align_length(&pStubMsg->MemorySize, sizeof(UINT_PTR));
         pStubMsg->MemorySize += sizeof(UINT_PTR);
         return sizeof(UINT_PTR);
-    case RPC_FC_IGNORE:
+    case FC_IGNORE:
         align_length(&pStubMsg->MemorySize, sizeof(void *));
         pStubMsg->MemorySize += sizeof(void *);
         return sizeof(void *);
@@ -6935,7 +6967,7 @@ static void WINAPI NdrContextHandleBufferSize(
 {
     TRACE("pStubMsg %p, pMemory %p, type 0x%02x\n", pStubMsg, pMemory, *pFormat);
 
-    if (*pFormat != RPC_FC_BIND_CONTEXT)
+    if (*pFormat != FC_BIND_CONTEXT)
     {
         ERR("invalid format type %x\n", *pFormat);
         RpcRaiseException(RPC_S_INTERNAL_ERROR);
@@ -6954,7 +6986,7 @@ static unsigned char *WINAPI NdrContextHandleMarshall(
 {
     TRACE("pStubMsg %p, pMemory %p, type 0x%02x\n", pStubMsg, pMemory, *pFormat);
 
-    if (*pFormat != RPC_FC_BIND_CONTEXT)
+    if (*pFormat != FC_BIND_CONTEXT)
     {
         ERR("invalid format type %x\n", *pFormat);
         RpcRaiseException(RPC_S_INTERNAL_ERROR);
@@ -6990,7 +7022,7 @@ static unsigned char *WINAPI NdrContextHandleUnmarshall(
     TRACE("pStubMsg %p, ppMemory %p, pFormat %p, fMustAlloc %s\n", pStubMsg,
         ppMemory, pFormat, fMustAlloc ? "TRUE": "FALSE");
 
-    if (*pFormat != RPC_FC_BIND_CONTEXT)
+    if (*pFormat != FC_BIND_CONTEXT)
     {
         ERR("invalid format type %x\n", *pFormat);
         RpcRaiseException(RPC_S_INTERNAL_ERROR);
@@ -7126,7 +7158,7 @@ NDR_SCONTEXT WINAPI NdrContextHandleInitialize(PMIDL_STUB_MESSAGE pStubMsg,
 
     if (pFormat[1] & NDR_CONTEXT_HANDLE_SERIALIZE)
         flags |= RPC_CONTEXT_HANDLE_SERIALIZE;
-    if (pFormat[1] & NDR_CONTEXT_HANDLE_NO_SERIALIZE)
+    if (pFormat[1] & NDR_CONTEXT_HANDLE_NOSERIALIZE)
         flags |= RPC_CONTEXT_HANDLE_DONT_SERIALIZE;
     if (pFormat[1] & NDR_STRICT_CONTEXT_HANDLE)
     {
@@ -7160,7 +7192,7 @@ void WINAPI NdrServerContextNewMarshall(PMIDL_STUB_MESSAGE pStubMsg,
 
     if (pFormat[1] & NDR_CONTEXT_HANDLE_SERIALIZE)
         flags |= RPC_CONTEXT_HANDLE_SERIALIZE;
-    if (pFormat[1] & NDR_CONTEXT_HANDLE_NO_SERIALIZE)
+    if (pFormat[1] & NDR_CONTEXT_HANDLE_NOSERIALIZE)
         flags |= RPC_CONTEXT_HANDLE_DONT_SERIALIZE;
     if (pFormat[1] & NDR_STRICT_CONTEXT_HANDLE)
     {
@@ -7193,7 +7225,7 @@ NDR_SCONTEXT WINAPI NdrServerContextNewUnmarshall(PMIDL_STUB_MESSAGE pStubMsg,
 
     if (pFormat[1] & NDR_CONTEXT_HANDLE_SERIALIZE)
         flags |= RPC_CONTEXT_HANDLE_SERIALIZE;
-    if (pFormat[1] & NDR_CONTEXT_HANDLE_NO_SERIALIZE)
+    if (pFormat[1] & NDR_CONTEXT_HANDLE_NOSERIALIZE)
         flags |= RPC_CONTEXT_HANDLE_DONT_SERIALIZE;
     if (pFormat[1] & NDR_STRICT_CONTEXT_HANDLE)
     {
index 0f0b7e7..c8026c0 100644 (file)
@@ -36,8 +36,8 @@
 
 #include "ndr_misc.h"
 #include "rpcndr.h"
+#include "ndrtypes.h"
 #include "rpcproxy.h"
-#include "wine/rpcfc.h"
 #include "cpsf.h"
 
 #include "wine/debug.h"
@@ -288,8 +288,8 @@ static const IID* get_ip_iid(PMIDL_STUB_MESSAGE pStubMsg, unsigned char *pMemory
   const IID *riid;
   if (!pFormat) return &IID_IUnknown;
   TRACE("format=%02x %02x\n", pFormat[0], pFormat[1]);
-  if (pFormat[0] != RPC_FC_IP) FIXME("format=%d\n", pFormat[0]);
-  if (pFormat[1] == RPC_FC_CONSTANT_IID) {
+  if (pFormat[0] != FC_IP) FIXME("format=%d\n", pFormat[0]);
+  if (pFormat[1] == FC_CONSTANT_IID) {
     riid = (const IID *)&pFormat[2];
   } else {
     ComputeConformance(pStubMsg, pMemory, pFormat+2, 0);
@@ -338,19 +338,25 @@ unsigned char * WINAPI NdrInterfacePointerUnmarshall(PMIDL_STUB_MESSAGE pStubMsg
                                                     PFORMAT_STRING pFormat,
                                                     unsigned char fMustAlloc)
 {
+  IUnknown **unk = (IUnknown **)ppMemory;
   LPSTREAM stream;
   HRESULT hr;
 
   TRACE("(%p,%p,%p,%d)\n", pStubMsg, ppMemory, pFormat, fMustAlloc);
   if (!LoadCOM()) return NULL;
-  *(LPVOID*)ppMemory = NULL;
+
+  /* Avoid reference leaks for [in, out] pointers. */
+  if (pStubMsg->IsClient && *unk)
+    IUnknown_Release(*unk);
+
+  *unk = NULL;
   if (pStubMsg->Buffer + sizeof(DWORD) < (unsigned char *)pStubMsg->RpcMsg->Buffer + pStubMsg->BufferLength) {
     ULONG size;
 
     hr = RpcStream_Create(pStubMsg, FALSE, &size, &stream);
     if (hr == S_OK) {
       if (size != 0)
-        hr = COM_UnmarshalInterface(stream, &IID_NULL, (LPVOID*)ppMemory);
+        hr = COM_UnmarshalInterface(stream, &IID_NULL, (void **)unk);
 
       IStream_Release(stream);
     }
index f84c617..c2f260c 100644 (file)
@@ -40,7 +40,6 @@
 
 #include "wine/exception.h"
 #include "wine/debug.h"
-#include "wine/rpcfc.h"
 
 #include "cpsf.h"
 #include "ndr_misc.h"
@@ -154,61 +153,60 @@ static DWORD calc_arg_size(MIDL_STUB_MESSAGE *pStubMsg, PFORMAT_STRING pFormat)
     DWORD size;
     switch(*pFormat)
     {
-    case RPC_FC_RP:
-        if (pFormat[1] & RPC_FC_P_SIMPLEPOINTER)
+    case FC_RP:
+        if (pFormat[1] & FC_SIMPLE_POINTER)
         {
-            FIXME("Simple reference pointer (type %#x).\n", pFormat[2]);
-            size = sizeof(void *);
+            size = 0;
             break;
         }
         size = calc_arg_size(pStubMsg, &pFormat[2] + *(const SHORT*)&pFormat[2]);
         break;
-    case RPC_FC_STRUCT:
-    case RPC_FC_PSTRUCT:
+    case FC_STRUCT:
+    case FC_PSTRUCT:
         size = *(const WORD*)(pFormat + 2);
         break;
-    case RPC_FC_BOGUS_STRUCT:
+    case FC_BOGUS_STRUCT:
         size = *(const WORD*)(pFormat + 2);
         if(*(const WORD*)(pFormat + 4))
             FIXME("Unhandled conformant description\n");
         break;
-    case RPC_FC_CARRAY:
-    case RPC_FC_CVARRAY:
+    case FC_CARRAY:
+    case FC_CVARRAY:
         size = *(const WORD*)(pFormat + 2);
         ComputeConformance(pStubMsg, NULL, pFormat + 4, 0);
         size *= pStubMsg->MaxCount;
         break;
-    case RPC_FC_SMFARRAY:
-    case RPC_FC_SMVARRAY:
+    case FC_SMFARRAY:
+    case FC_SMVARRAY:
         size = *(const WORD*)(pFormat + 2);
         break;
-    case RPC_FC_LGFARRAY:
-    case RPC_FC_LGVARRAY:
+    case FC_LGFARRAY:
+    case FC_LGVARRAY:
         size = *(const DWORD*)(pFormat + 2);
         break;
-    case RPC_FC_BOGUS_ARRAY:
+    case FC_BOGUS_ARRAY:
         pFormat = ComputeConformance(pStubMsg, NULL, pFormat + 4, *(const WORD*)&pFormat[2]);
         TRACE("conformance = %ld\n", pStubMsg->MaxCount);
         pFormat = ComputeVariance(pStubMsg, NULL, pFormat, pStubMsg->MaxCount);
         size = ComplexStructSize(pStubMsg, pFormat);
         size *= pStubMsg->MaxCount;
         break;
-    case RPC_FC_USER_MARSHAL:
+    case FC_USER_MARSHAL:
         size = *(const WORD*)(pFormat + 4);
         break;
-    case RPC_FC_CSTRING:
+    case FC_CSTRING:
         size = *(const WORD*)(pFormat + 2);
         break;
-    case RPC_FC_WSTRING:
+    case FC_WSTRING:
         size = *(const WORD*)(pFormat + 2) * sizeof(WCHAR);
         break;
-    case RPC_FC_C_CSTRING:
-    case RPC_FC_C_WSTRING:
-        if (*pFormat == RPC_FC_C_CSTRING)
+    case FC_C_CSTRING:
+    case FC_C_WSTRING:
+        if (*pFormat == FC_C_CSTRING)
             size = sizeof(CHAR);
         else
             size = sizeof(WCHAR);
-        if (pFormat[1] == RPC_FC_STRING_SIZED)
+        if (pFormat[1] == FC_STRING_SIZED)
             ComputeConformance(pStubMsg, NULL, pFormat + 2, 0);
         else
             pStubMsg->MaxCount = 0;
@@ -217,7 +215,10 @@ static DWORD calc_arg_size(MIDL_STUB_MESSAGE *pStubMsg, PFORMAT_STRING pFormat)
     default:
         FIXME("Unhandled type %02x\n", *pFormat);
         /* fallthrough */
-    case RPC_FC_IP:
+    case FC_UP:
+    case FC_OP:
+    case FC_FP:
+    case FC_IP:
         size = sizeof(void *);
         break;
     }
@@ -279,10 +280,10 @@ static PFORMAT_STRING client_get_handle(
     switch (pProcHeader->handle_type)
     {
     /* explicit binding: parse additional section */
-    case RPC_FC_BIND_EXPLICIT:
+    case 0:
         switch (*pFormat) /* handle_type */
         {
-        case RPC_FC_BIND_PRIMITIVE: /* explicit primitive */
+        case FC_BIND_PRIMITIVE: /* explicit primitive */
             {
                 const NDR_EHD_PRIMITIVE *pDesc = (const NDR_EHD_PRIMITIVE *)pFormat;
 
@@ -294,7 +295,7 @@ static PFORMAT_STRING client_get_handle(
                     *phBinding = *(handle_t *)ARG_FROM_OFFSET(pStubMsg->StackTop, pDesc->offset);
                 return pFormat + sizeof(NDR_EHD_PRIMITIVE);
             }
-        case RPC_FC_BIND_GENERIC: /* explicit generic */
+        case FC_BIND_GENERIC: /* explicit generic */
             {
                 const NDR_EHD_GENERIC *pDesc = (const NDR_EHD_GENERIC *)pFormat;
                 void *pObject = NULL;
@@ -312,7 +313,7 @@ static PFORMAT_STRING client_get_handle(
                 *phBinding = pGenPair->pfnBind(pObject);
                 return pFormat + sizeof(NDR_EHD_GENERIC);
             }
-        case RPC_FC_BIND_CONTEXT: /* explicit context */
+        case FC_BIND_CONTEXT: /* explicit context */
             {
                 const NDR_EHD_CONTEXT *pDesc = (const NDR_EHD_CONTEXT *)pFormat;
                 NDR_CCONTEXT context_handle;
@@ -340,22 +341,22 @@ static PFORMAT_STRING client_get_handle(
             RpcRaiseException(RPC_X_BAD_STUB_DATA);
         }
         break;
-    case RPC_FC_BIND_GENERIC: /* implicit generic */
-        FIXME("RPC_FC_BIND_GENERIC\n");
+    case FC_BIND_GENERIC: /* implicit generic */
+        FIXME("FC_BIND_GENERIC\n");
         RpcRaiseException(RPC_X_BAD_STUB_DATA); /* FIXME: remove when implemented */
         break;
-    case RPC_FC_BIND_PRIMITIVE: /* implicit primitive */
+    case FC_BIND_PRIMITIVE: /* implicit primitive */
         TRACE("Implicit primitive handle\n");
         *phBinding = *pStubMsg->StubDesc->IMPLICIT_HANDLE_INFO.pPrimitiveHandle;
         break;
-    case RPC_FC_CALLBACK_HANDLE: /* implicit callback */
-        TRACE("RPC_FC_CALLBACK_HANDLE\n");
+    case FC_CALLBACK_HANDLE: /* implicit callback */
+        TRACE("FC_CALLBACK_HANDLE\n");
         /* server calls callback procedures only in response to remote call, and most recent
            binding handle is used. Calling back to a client can potentially result in another
            callback with different current handle. */
         *phBinding = I_RpcGetCurrentCallHandle();
         break;
-    case RPC_FC_AUTO_HANDLE: /* implicit auto handle */
+    case FC_AUTO_HANDLE: /* implicit auto handle */
         /* strictly speaking, it isn't necessary to set hBinding here
          * since it isn't actually used (hence the automatic in its name),
          * but then why does MIDL generate a valid entry in the
@@ -378,10 +379,10 @@ static void client_free_handle(
     switch (pProcHeader->handle_type)
     {
     /* explicit binding: parse additional section */
-    case RPC_FC_BIND_EXPLICIT:
+    case 0:
         switch (*pFormat) /* handle_type */
         {
-        case RPC_FC_BIND_GENERIC: /* explicit generic */
+        case FC_BIND_GENERIC: /* explicit generic */
             {
                 const NDR_EHD_GENERIC *pDesc = (const NDR_EHD_GENERIC *)pFormat;
                 void *pObject = NULL;
@@ -399,21 +400,21 @@ static void client_free_handle(
                 pGenPair->pfnUnbind(pObject, hBinding);
                 break;
             }
-        case RPC_FC_BIND_CONTEXT: /* explicit context */
-        case RPC_FC_BIND_PRIMITIVE: /* explicit primitive */
+        case FC_BIND_CONTEXT: /* explicit context */
+        case FC_BIND_PRIMITIVE: /* explicit primitive */
             break;
         default:
             ERR("bad explicit binding handle type (0x%02x)\n", pProcHeader->handle_type);
             RpcRaiseException(RPC_X_BAD_STUB_DATA);
         }
         break;
-    case RPC_FC_BIND_GENERIC: /* implicit generic */
-        FIXME("RPC_FC_BIND_GENERIC\n");
+    case FC_BIND_GENERIC: /* implicit generic */
+        FIXME("FC_BIND_GENERIC\n");
         RpcRaiseException(RPC_X_BAD_STUB_DATA); /* FIXME: remove when implemented */
         break;
-    case RPC_FC_CALLBACK_HANDLE: /* implicit callback */
-    case RPC_FC_BIND_PRIMITIVE: /* implicit primitive */
-    case RPC_FC_AUTO_HANDLE: /* implicit auto handle */
+    case FC_CALLBACK_HANDLE: /* implicit callback */
+    case FC_BIND_PRIMITIVE: /* implicit primitive */
+    case FC_AUTO_HANDLE: /* implicit auto handle */
         break;
     default:
         ERR("bad implicit binding handle type (0x%02x)\n", pProcHeader->handle_type);
@@ -421,6 +422,50 @@ static void client_free_handle(
     }
 }
 
+static inline BOOL param_needs_alloc( PARAM_ATTRIBUTES attr )
+{
+    return attr.IsOut && !attr.IsIn && !attr.IsBasetype && !attr.IsByValue;
+}
+
+static inline BOOL param_is_out_basetype( PARAM_ATTRIBUTES attr )
+{
+    return attr.IsOut && !attr.IsIn && attr.IsBasetype && attr.IsSimpleRef;
+}
+
+static size_t basetype_arg_size( unsigned char fc )
+{
+    switch (fc)
+    {
+    case FC_BYTE:
+    case FC_CHAR:
+    case FC_SMALL:
+    case FC_USMALL:
+        return sizeof(char);
+    case FC_WCHAR:
+    case FC_SHORT:
+    case FC_USHORT:
+        return sizeof(short);
+    case FC_LONG:
+    case FC_ULONG:
+    case FC_ENUM16:
+    case FC_ENUM32:
+    case FC_ERROR_STATUS_T:
+        return sizeof(int);
+    case FC_FLOAT:
+        return sizeof(float);
+    case FC_HYPER:
+        return sizeof(LONGLONG);
+    case FC_DOUBLE:
+        return sizeof(double);
+    case FC_INT3264:
+    case FC_UINT3264:
+        return sizeof(INT_PTR);
+    default:
+        FIXME("Unhandled basetype %#x.\n", fc);
+        return 0;
+    }
+}
+
 void client_do_args( PMIDL_STUB_MESSAGE pStubMsg, PFORMAT_STRING pFormat, enum stubless_phase phase,
                      void **fpu_args, unsigned short number_of_params, unsigned char *pRetVal )
 {
@@ -436,7 +481,7 @@ void client_do_args( PMIDL_STUB_MESSAGE pStubMsg, PFORMAT_STRING pFormat, enum s
         float f;
 
         if (params[i].attr.IsBasetype &&
-            params[i].u.type_format_char == RPC_FC_FLOAT &&
+            params[i].u.type_format_char == FC_FLOAT &&
             !params[i].attr.IsSimpleRef &&
             !fpu_args)
         {
@@ -452,10 +497,12 @@ void client_do_args( PMIDL_STUB_MESSAGE pStubMsg, PFORMAT_STRING pFormat, enum s
         switch (phase)
         {
         case STUBLESS_INITOUT:
-            if (!params[i].attr.IsBasetype && params[i].attr.IsOut &&
-                !params[i].attr.IsIn && !params[i].attr.IsByValue)
+            if (*(unsigned char **)pArg)
             {
-                memset( *(unsigned char **)pArg, 0, calc_arg_size( pStubMsg, pTypeFormat ));
+                if (param_needs_alloc(params[i].attr))
+                    memset( *(unsigned char **)pArg, 0, calc_arg_size( pStubMsg, pTypeFormat ));
+                else if (param_is_out_basetype(params[i].attr))
+                    memset( *(unsigned char **)pArg, 0, basetype_arg_size( params[i].u.type_format_char ));
             }
             break;
         case STUBLESS_CALCSIZE:
@@ -487,26 +534,26 @@ static unsigned int type_stack_size(unsigned char fc)
 {
     switch (fc)
     {
-    case RPC_FC_BYTE:
-    case RPC_FC_CHAR:
-    case RPC_FC_SMALL:
-    case RPC_FC_USMALL:
-    case RPC_FC_WCHAR:
-    case RPC_FC_SHORT:
-    case RPC_FC_USHORT:
-    case RPC_FC_LONG:
-    case RPC_FC_ULONG:
-    case RPC_FC_INT3264:
-    case RPC_FC_UINT3264:
-    case RPC_FC_ENUM16:
-    case RPC_FC_ENUM32:
-    case RPC_FC_FLOAT:
-    case RPC_FC_ERROR_STATUS_T:
-    case RPC_FC_IGNORE:
+    case FC_BYTE:
+    case FC_CHAR:
+    case FC_SMALL:
+    case FC_USMALL:
+    case FC_WCHAR:
+    case FC_SHORT:
+    case FC_USHORT:
+    case FC_LONG:
+    case FC_ULONG:
+    case FC_INT3264:
+    case FC_UINT3264:
+    case FC_ENUM16:
+    case FC_ENUM32:
+    case FC_FLOAT:
+    case FC_ERROR_STATUS_T:
+    case FC_IGNORE:
         return sizeof(void *);
-    case RPC_FC_DOUBLE:
+    case FC_DOUBLE:
         return sizeof(double);
-    case RPC_FC_HYPER:
+    case FC_HYPER:
         return sizeof(ULONGLONG);
     default:
         ERR("invalid base type 0x%x\n", fc);
@@ -518,13 +565,13 @@ static BOOL is_by_value( PFORMAT_STRING format )
 {
     switch (*format)
     {
-    case RPC_FC_USER_MARSHAL:
-    case RPC_FC_STRUCT:
-    case RPC_FC_PSTRUCT:
-    case RPC_FC_CSTRUCT:
-    case RPC_FC_CPSTRUCT:
-    case RPC_FC_CVSTRUCT:
-    case RPC_FC_BOGUS_STRUCT:
+    case FC_USER_MARSHAL:
+    case FC_STRUCT:
+    case FC_PSTRUCT:
+    case FC_CSTRUCT:
+    case FC_CPSTRUCT:
+    case FC_CVSTRUCT:
+    case FC_BOGUS_STRUCT:
         return TRUE;
     default:
         return FALSE;
@@ -554,32 +601,32 @@ PFORMAT_STRING convert_old_args( PMIDL_STUB_MESSAGE pStubMsg, PFORMAT_STRING pFo
 
         switch (param->param_direction)
         {
-        case RPC_FC_IN_PARAM_BASETYPE:
+        case FC_IN_PARAM_BASETYPE:
             args[i].attr.IsIn = 1;
             args[i].attr.IsBasetype = 1;
             break;
-        case RPC_FC_RETURN_PARAM_BASETYPE:
+        case FC_RETURN_PARAM_BASETYPE:
             args[i].attr.IsOut = 1;
             args[i].attr.IsReturn = 1;
             args[i].attr.IsBasetype = 1;
             break;
-        case RPC_FC_IN_PARAM:
+        case FC_IN_PARAM:
             args[i].attr.IsIn = 1;
             args[i].attr.MustFree = 1;
             break;
-        case RPC_FC_IN_PARAM_NO_FREE_INST:
+        case FC_IN_PARAM_NO_FREE_INST:
             args[i].attr.IsIn = 1;
             args[i].attr.IsDontCallFreeInst = 1;
             break;
-        case RPC_FC_IN_OUT_PARAM:
+        case FC_IN_OUT_PARAM:
             args[i].attr.IsIn = 1;
             args[i].attr.IsOut = 1;
             args[i].attr.MustFree = 1;
             break;
-        case RPC_FC_OUT_PARAM:
+        case FC_OUT_PARAM:
             args[i].attr.IsOut = 1;
             break;
-        case RPC_FC_RETURN_PARAM:
+        case FC_RETURN_PARAM:
             args[i].attr.IsOut = 1;
             args[i].attr.IsReturn = 1;
             break;
@@ -633,7 +680,7 @@ LONG_PTR CDECL DECLSPEC_HIDDEN ndr_client_call( PMIDL_STUB_DESC pStubDesc, PFORM
 
     TRACE("NDR Version: 0x%x\n", pStubDesc->Version);
 
-    if (pProcHeader->Oi_flags & RPC_FC_PROC_OIF_RPCFLAGS)
+    if (pProcHeader->Oi_flags & Oi_HAS_RPCFLAGS)
     {
         const NDR_PROC_HEADER_RPC *header_rpc = (const NDR_PROC_HEADER_RPC *)&pFormat[0];
         stack_size = header_rpc->stack_size;
@@ -650,10 +697,10 @@ LONG_PTR CDECL DECLSPEC_HIDDEN ndr_client_call( PMIDL_STUB_DESC pStubDesc, PFORM
     TRACE("proc num: %d\n", procedure_number);
 
     /* create the full pointer translation tables, if requested */
-    if (pProcHeader->Oi_flags & RPC_FC_PROC_OIF_FULLPTR)
+    if (pProcHeader->Oi_flags & Oi_FULL_PTR_USED)
         stubMsg.FullPtrXlatTables = NdrFullPointerXlatInit(0,XLAT_CLIENT);
 
-    if (pProcHeader->Oi_flags & RPC_FC_PROC_OIF_OBJECT)
+    if (pProcHeader->Oi_flags & Oi_OBJECT_PROC)
     {
         /* object is always the first argument */
         This = stack_top[0];
@@ -669,7 +716,7 @@ LONG_PTR CDECL DECLSPEC_HIDDEN ndr_client_call( PMIDL_STUB_DESC pStubDesc, PFORM
     pHandleFormat = pFormat;
 
     /* we only need a handle if this isn't an object method */
-    if (!(pProcHeader->Oi_flags & RPC_FC_PROC_OIF_OBJECT))
+    if (!(pProcHeader->Oi_flags & Oi_OBJECT_PROC))
     {
         pFormat = client_get_handle(&stubMsg, pProcHeader, pHandleFormat, &hBinding);
         if (!pFormat) goto done;
@@ -710,7 +757,7 @@ LONG_PTR CDECL DECLSPEC_HIDDEN ndr_client_call( PMIDL_STUB_DESC pStubDesc, PFORM
     else
     {
         pFormat = convert_old_args( &stubMsg, pFormat, stack_size,
-                                    pProcHeader->Oi_flags & RPC_FC_PROC_OIF_OBJECT,
+                                    pProcHeader->Oi_flags & Oi_OBJECT_PROC,
                                     /* reuse the correlation cache, it's not needed for v1 format */
                                     NdrCorrCache, sizeof(NdrCorrCache), &number_of_params );
     }
@@ -718,11 +765,11 @@ LONG_PTR CDECL DECLSPEC_HIDDEN ndr_client_call( PMIDL_STUB_DESC pStubDesc, PFORM
     stubMsg.BufferLength = 0;
 
     /* store the RPC flags away */
-    if (pProcHeader->Oi_flags & RPC_FC_PROC_OIF_RPCFLAGS)
+    if (pProcHeader->Oi_flags & Oi_HAS_RPCFLAGS)
         rpcMsg.RpcFlags = ((const NDR_PROC_HEADER_RPC *)pProcHeader)->rpc_flags;
 
     /* use alternate memory allocation routines */
-    if (pProcHeader->Oi_flags & RPC_FC_PROC_OIF_RPCSSALLOC)
+    if (pProcHeader->Oi_flags & Oi_RPCSS_ALLOC_USED)
         NdrRpcSmSetClientToOsf(&stubMsg);
 
     if (Oif_flags.HasPipes)
@@ -749,11 +796,11 @@ LONG_PTR CDECL DECLSPEC_HIDDEN ndr_client_call( PMIDL_STUB_DESC pStubDesc, PFORM
      * 6. UNMARSHAL - unmarshal [out] params from buffer
      * 7. FREE - clear [out] parameters (for proxies, and only on error)
      */
-    if ((pProcHeader->Oi_flags & RPC_FC_PROC_OIF_OBJECT) ||
-        (pProcHeader->Oi_flags & RPC_FC_PROC_OIF_HAS_COMM_OR_FAULT))
+    if ((pProcHeader->Oi_flags & Oi_OBJECT_PROC) ||
+        (pProcHeader->Oi_flags & Oi_HAS_COMM_OR_FAULT))
     {
         /* 1. INITOUT */
-        if (pProcHeader->Oi_flags & RPC_FC_PROC_OIF_OBJECT)
+        if (pProcHeader->Oi_flags & Oi_OBJECT_PROC)
         {
             TRACE( "INITOUT\n" );
             client_do_args(&stubMsg, pFormat, STUBLESS_INITOUT, fpu_stack,
@@ -769,7 +816,7 @@ LONG_PTR CDECL DECLSPEC_HIDDEN ndr_client_call( PMIDL_STUB_DESC pStubDesc, PFORM
 
             /* 3. GETBUFFER */
             TRACE( "GETBUFFER\n" );
-            if (pProcHeader->Oi_flags & RPC_FC_PROC_OIF_OBJECT)
+            if (pProcHeader->Oi_flags & Oi_OBJECT_PROC)
             {
                 /* allocate the buffer */
                 NdrProxyGetBuffer(This, &stubMsg);
@@ -782,7 +829,7 @@ LONG_PTR CDECL DECLSPEC_HIDDEN ndr_client_call( PMIDL_STUB_DESC pStubDesc, PFORM
                     FIXME("pipes not supported yet\n");
                 else
                 {
-                    if (pProcHeader->handle_type == RPC_FC_AUTO_HANDLE)
+                    if (pProcHeader->handle_type == FC_AUTO_HANDLE)
 #if 0
                         NdrNsGetBuffer(&stubMsg, stubMsg.BufferLength, hBinding);
 #else
@@ -800,7 +847,7 @@ LONG_PTR CDECL DECLSPEC_HIDDEN ndr_client_call( PMIDL_STUB_DESC pStubDesc, PFORM
 
             /* 5. SENDRECEIVE */
             TRACE( "SENDRECEIVE\n" );
-            if (pProcHeader->Oi_flags & RPC_FC_PROC_OIF_OBJECT)
+            if (pProcHeader->Oi_flags & Oi_OBJECT_PROC)
             {
                 /* send the [in] params and receive the [out] and [retval]
                  * params */
@@ -815,7 +862,7 @@ LONG_PTR CDECL DECLSPEC_HIDDEN ndr_client_call( PMIDL_STUB_DESC pStubDesc, PFORM
                     FIXME("pipes not supported yet\n");
                 else
                 {
-                    if (pProcHeader->handle_type == RPC_FC_AUTO_HANDLE)
+                    if (pProcHeader->handle_type == FC_AUTO_HANDLE)
 #if 0
                         NdrNsSendReceive(&stubMsg, stubMsg.Buffer, pStubDesc->IMPLICIT_HANDLE_INFO.pAutoHandle);
 #else
@@ -838,7 +885,7 @@ LONG_PTR CDECL DECLSPEC_HIDDEN ndr_client_call( PMIDL_STUB_DESC pStubDesc, PFORM
         }
         __EXCEPT_ALL
         {
-            if (pProcHeader->Oi_flags & RPC_FC_PROC_OIF_OBJECT)
+            if (pProcHeader->Oi_flags & Oi_OBJECT_PROC)
             {
                 /* 7. FREE */
                 TRACE( "FREE\n" );
@@ -888,7 +935,7 @@ LONG_PTR CDECL DECLSPEC_HIDDEN ndr_client_call( PMIDL_STUB_DESC pStubDesc, PFORM
             FIXME("pipes not supported yet\n");
         else
         {
-            if (pProcHeader->handle_type == RPC_FC_AUTO_HANDLE)
+            if (pProcHeader->handle_type == FC_AUTO_HANDLE)
 #if 0
                 NdrNsGetBuffer(&stubMsg, stubMsg.BufferLength, hBinding);
 #else
@@ -910,7 +957,7 @@ LONG_PTR CDECL DECLSPEC_HIDDEN ndr_client_call( PMIDL_STUB_DESC pStubDesc, PFORM
             FIXME("pipes not supported yet\n");
         else
         {
-            if (pProcHeader->handle_type == RPC_FC_AUTO_HANDLE)
+            if (pProcHeader->handle_type == FC_AUTO_HANDLE)
 #if 0
                 NdrNsSendReceive(&stubMsg, stubMsg.Buffer, pStubDesc->IMPLICIT_HANDLE_INFO.pAutoHandle);
 #else
@@ -943,11 +990,11 @@ LONG_PTR CDECL DECLSPEC_HIDDEN ndr_client_call( PMIDL_STUB_DESC pStubDesc, PFORM
     }
 
     /* free the full pointer translation tables */
-    if (pProcHeader->Oi_flags & RPC_FC_PROC_OIF_FULLPTR)
+    if (pProcHeader->Oi_flags & Oi_FULL_PTR_USED)
         NdrFullPointerXlatFree(stubMsg.FullPtrXlatTables);
 
     /* free marshalling buffer */
-    if (pProcHeader->Oi_flags & RPC_FC_PROC_OIF_OBJECT)
+    if (pProcHeader->Oi_flags & Oi_OBJECT_PROC)
         NdrProxyFreeBuffer(This, &stubMsg);
     else
     {
@@ -1137,11 +1184,6 @@ LONG_PTR __cdecl call_server_func(SERVER_ROUTINE func, unsigned char * args, uns
 }
 #endif
 
-static inline BOOL param_needs_alloc( PARAM_ATTRIBUTES attr )
-{
-    return attr.IsOut && !attr.IsIn && !attr.IsBasetype && !attr.IsByValue;
-}
-
 static LONG_PTR *stub_do_args(MIDL_STUB_MESSAGE *pStubMsg,
                               PFORMAT_STRING pFormat, enum stubless_phase phase,
                               unsigned short number_of_params)
@@ -1180,13 +1222,13 @@ static LONG_PTR *stub_do_args(MIDL_STUB_MESSAGE *pStubMsg,
             else if (param_needs_alloc(params[i].attr) &&
                      (!params[i].attr.MustFree || params[i].attr.IsSimpleRef))
             {
-                if (*pTypeFormat != RPC_FC_BIND_CONTEXT) pStubMsg->pfnFree(*(void **)pArg);
+                if (*pTypeFormat != FC_BIND_CONTEXT) pStubMsg->pfnFree(*(void **)pArg);
             }
             break;
         case STUBLESS_INITOUT:
             if (param_needs_alloc(params[i].attr) && !params[i].attr.ServerAllocSize)
             {
-                if (*pTypeFormat == RPC_FC_BIND_CONTEXT)
+                if (*pTypeFormat == FC_BIND_CONTEXT)
                 {
                     NDR_SCONTEXT ctxt = NdrContextHandleInitialize(pStubMsg, pTypeFormat);
                     *(void **)pArg = NDRSContextValue(ctxt);
@@ -1276,7 +1318,7 @@ LONG WINAPI NdrStubCall2(
 
     TRACE("NDR Version: 0x%x\n", pStubDesc->Version);
 
-    if (pProcHeader->Oi_flags & RPC_FC_PROC_OIF_RPCFLAGS)
+    if (pProcHeader->Oi_flags & Oi_HAS_RPCFLAGS)
     {
         const NDR_PROC_HEADER_RPC *header_rpc = (const NDR_PROC_HEADER_RPC *)&pFormat[0];
         stack_size = header_rpc->stack_size;
@@ -1295,16 +1337,16 @@ LONG WINAPI NdrStubCall2(
     switch (pProcHeader->handle_type)
     {
     /* explicit binding: parse additional section */
-    case RPC_FC_BIND_EXPLICIT:
+    case 0:
         switch (*pFormat) /* handle_type */
         {
-        case RPC_FC_BIND_PRIMITIVE: /* explicit primitive */
+        case FC_BIND_PRIMITIVE: /* explicit primitive */
             pFormat += sizeof(NDR_EHD_PRIMITIVE);
             break;
-        case RPC_FC_BIND_GENERIC: /* explicit generic */
+        case FC_BIND_GENERIC: /* explicit generic */
             pFormat += sizeof(NDR_EHD_GENERIC);
             break;
-        case RPC_FC_BIND_CONTEXT: /* explicit context */
+        case FC_BIND_CONTEXT: /* explicit context */
             pFormat += sizeof(NDR_EHD_CONTEXT);
             break;
         default:
@@ -1312,31 +1354,31 @@ LONG WINAPI NdrStubCall2(
             RpcRaiseException(RPC_X_BAD_STUB_DATA);
         }
         break;
-    case RPC_FC_BIND_GENERIC: /* implicit generic */
-    case RPC_FC_BIND_PRIMITIVE: /* implicit primitive */
-    case RPC_FC_CALLBACK_HANDLE: /* implicit callback */
-    case RPC_FC_AUTO_HANDLE: /* implicit auto handle */
+    case FC_BIND_GENERIC: /* implicit generic */
+    case FC_BIND_PRIMITIVE: /* implicit primitive */
+    case FC_CALLBACK_HANDLE: /* implicit callback */
+    case FC_AUTO_HANDLE: /* implicit auto handle */
         break;
     default:
         ERR("bad implicit binding handle type (0x%02x)\n", pProcHeader->handle_type);
         RpcRaiseException(RPC_X_BAD_STUB_DATA);
     }
 
-    if (pProcHeader->Oi_flags & RPC_FC_PROC_OIF_OBJECT)
+    if (pProcHeader->Oi_flags & Oi_OBJECT_PROC)
         NdrStubInitialize(pRpcMsg, &stubMsg, pStubDesc, pChannel);
     else
         NdrServerInitializeNew(pRpcMsg, &stubMsg, pStubDesc);
 
     /* create the full pointer translation tables, if requested */
-    if (pProcHeader->Oi_flags & RPC_FC_PROC_OIF_FULLPTR)
+    if (pProcHeader->Oi_flags & Oi_FULL_PTR_USED)
         stubMsg.FullPtrXlatTables = NdrFullPointerXlatInit(0,XLAT_SERVER);
 
     /* store the RPC flags away */
-    if (pProcHeader->Oi_flags & RPC_FC_PROC_OIF_RPCFLAGS)
+    if (pProcHeader->Oi_flags & Oi_HAS_RPCFLAGS)
         pRpcMsg->RpcFlags = ((const NDR_PROC_HEADER_RPC *)pProcHeader)->rpc_flags;
 
     /* use alternate memory allocation routines */
-    if (pProcHeader->Oi_flags & RPC_FC_PROC_OIF_RPCSSALLOC)
+    if (pProcHeader->Oi_flags & Oi_RPCSS_ALLOC_USED)
 #if 0
           NdrRpcSsEnableAllocate(&stubMsg);
 #else
@@ -1389,7 +1431,7 @@ LONG WINAPI NdrStubCall2(
     else
     {
         pFormat = convert_old_args( &stubMsg, pFormat, stack_size,
-                                    pProcHeader->Oi_flags & RPC_FC_PROC_OIF_OBJECT,
+                                    pProcHeader->Oi_flags & Oi_OBJECT_PROC,
                                     /* reuse the correlation cache, it's not needed for v1 format */
                                     NdrCorrCache, sizeof(NdrCorrCache), &number_of_params );
     }
@@ -1413,7 +1455,7 @@ LONG WINAPI NdrStubCall2(
                 SERVER_ROUTINE func;
                 LONG_PTR retval;
 
-                if (pProcHeader->Oi_flags & RPC_FC_PROC_OIF_OBJECT)
+                if (pProcHeader->Oi_flags & Oi_OBJECT_PROC)
                 {
                     SERVER_ROUTINE *vtbl = *(SERVER_ROUTINE **)((CStdStubBuffer *)pThis)->pvServerObject;
                     func = vtbl[pRpcMsg->ProcNum];
@@ -1438,7 +1480,7 @@ LONG WINAPI NdrStubCall2(
 
             break;
         case STUBLESS_GETBUFFER:
-            if (pProcHeader->Oi_flags & RPC_FC_PROC_OIF_OBJECT)
+            if (pProcHeader->Oi_flags & Oi_OBJECT_PROC)
                 NdrStubGetBuffer(pThis, pChannel, &stubMsg);
             else
             {
@@ -1480,7 +1522,7 @@ LONG WINAPI NdrStubCall2(
     }
 
     /* free the full pointer translation tables */
-    if (pProcHeader->Oi_flags & RPC_FC_PROC_OIF_FULLPTR)
+    if (pProcHeader->Oi_flags & Oi_FULL_PTR_USED)
         NdrFullPointerXlatFree(stubMsg.FullPtrXlatTables);
 
     /* free server function stack */
@@ -1565,7 +1607,7 @@ LONG_PTR CDECL DECLSPEC_HIDDEN ndr_async_client_call( PMIDL_STUB_DESC pStubDesc,
     async_call_data->pStubMsg = pStubMsg = (PMIDL_STUB_MESSAGE)(async_call_data + 1);
     pRpcMsg = (PRPC_MESSAGE)(pStubMsg + 1);
 
-    if (pProcHeader->Oi_flags & RPC_FC_PROC_OIF_RPCFLAGS)
+    if (pProcHeader->Oi_flags & Oi_HAS_RPCFLAGS)
     {
         const NDR_PROC_HEADER_RPC *header_rpc = (const NDR_PROC_HEADER_RPC *)&pFormat[0];
         async_call_data->stack_size = header_rpc->stack_size;
@@ -1582,10 +1624,10 @@ LONG_PTR CDECL DECLSPEC_HIDDEN ndr_async_client_call( PMIDL_STUB_DESC pStubDesc,
     TRACE("proc num: %d\n", procedure_number);
 
     /* create the full pointer translation tables, if requested */
-    if (pProcHeader->Oi_flags & RPC_FC_PROC_OIF_FULLPTR)
+    if (pProcHeader->Oi_flags & Oi_FULL_PTR_USED)
         pStubMsg->FullPtrXlatTables = NdrFullPointerXlatInit(0,XLAT_CLIENT);
 
-    if (pProcHeader->Oi_flags & RPC_FC_PROC_OIF_OBJECT)
+    if (pProcHeader->Oi_flags & Oi_OBJECT_PROC)
     {
         ERR("objects not supported\n");
         I_RpcFree(async_call_data);
@@ -1631,7 +1673,7 @@ LONG_PTR CDECL DECLSPEC_HIDDEN ndr_async_client_call( PMIDL_STUB_DESC pStubDesc,
     else
     {
         pFormat = convert_old_args( pStubMsg, pFormat, async_call_data->stack_size,
-                                    pProcHeader->Oi_flags & RPC_FC_PROC_OIF_OBJECT,
+                                    pProcHeader->Oi_flags & Oi_OBJECT_PROC,
                                     async_call_data->NdrCorrCache, sizeof(async_call_data->NdrCorrCache),
                                     &async_call_data->number_of_params );
     }
@@ -1641,11 +1683,11 @@ LONG_PTR CDECL DECLSPEC_HIDDEN ndr_async_client_call( PMIDL_STUB_DESC pStubDesc,
     pStubMsg->BufferLength = 0;
 
     /* store the RPC flags away */
-    if (pProcHeader->Oi_flags & RPC_FC_PROC_OIF_RPCFLAGS)
+    if (pProcHeader->Oi_flags & Oi_HAS_RPCFLAGS)
         pRpcMsg->RpcFlags = ((const NDR_PROC_HEADER_RPC *)pProcHeader)->rpc_flags;
 
     /* use alternate memory allocation routines */
-    if (pProcHeader->Oi_flags & RPC_FC_PROC_OIF_RPCSSALLOC)
+    if (pProcHeader->Oi_flags & Oi_RPCSS_ALLOC_USED)
         NdrRpcSmSetClientToOsf(pStubMsg);
 
     if (Oif_flags.HasPipes)
@@ -1684,7 +1726,7 @@ LONG_PTR CDECL DECLSPEC_HIDDEN ndr_async_client_call( PMIDL_STUB_DESC pStubDesc,
         FIXME("pipes not supported yet\n");
     else
     {
-        if (pProcHeader->handle_type == RPC_FC_AUTO_HANDLE)
+        if (pProcHeader->handle_type == FC_AUTO_HANDLE)
 #if 0
             NdrNsGetBuffer(pStubMsg, pStubMsg->BufferLength, async_call_data->hBinding);
 #else
@@ -1711,7 +1753,7 @@ LONG_PTR CDECL DECLSPEC_HIDDEN ndr_async_client_call( PMIDL_STUB_DESC pStubDesc,
         FIXME("pipes not supported yet\n");
     else
     {
-        if (pProcHeader->handle_type == RPC_FC_AUTO_HANDLE)
+        if (pProcHeader->handle_type == FC_AUTO_HANDLE)
 #if 0
             NdrNsSend(&stubMsg, stubMsg.Buffer, pStubDesc->IMPLICIT_HANDLE_INFO.pAutoHandle);
 #else
@@ -1761,7 +1803,7 @@ RPC_STATUS NdrpCompleteAsyncClientCall(RPC_ASYNC_STATE *pAsync, void *Reply)
     TRACE( "RECEIVE\n" );
     pStubMsg->RpcMsg->RpcFlags |= RPC_BUFFER_ASYNC;
     /* receive the [out] params */
-    if (pProcHeader->handle_type == RPC_FC_AUTO_HANDLE)
+    if (pProcHeader->handle_type == FC_AUTO_HANDLE)
 #if 0
         NdrNsReceive(&stubMsg, stubMsg.Buffer, pStubDesc->IMPLICIT_HANDLE_INFO.pAutoHandle);
 #else
@@ -1798,7 +1840,7 @@ cleanup:
     }
 
     /* free the full pointer translation tables */
-    if (pProcHeader->Oi_flags & RPC_FC_PROC_OIF_FULLPTR)
+    if (pProcHeader->Oi_flags & Oi_FULL_PTR_USED)
         NdrFullPointerXlatFree(pStubMsg->FullPtrXlatTables);
 
     /* free marshalling buffer */
index f8c3c5a..5212d9c 100644 (file)
 typedef struct _NDR_PROC_HEADER
 {
     /* type of handle to use:
-     * RPC_FC_BIND_EXPLICIT = 0 - Explicit handle.
+     * 0 - Explicit handle.
      *   Handle is passed as a parameter to the function.
      *   Indicates that explicit handle information follows the header,
      *   which actually describes the handle.
-     * RPC_FC_BIND_GENERIC = 31 - Implicit handle with custom binding routines
+     * FC_BIND_GENERIC = 31 - Implicit handle with custom binding routines
      *   (MIDL_STUB_DESC::IMPLICIT_HANDLE_INFO::pGenericBindingInfo)
-     * RPC_FC_BIND_PRIMITIVE = 32 - Implicit handle using handle_t created by
+     * FC_BIND_PRIMITIVE = 32 - Implicit handle using handle_t created by
      *   calling application
-     * RPC_FC_AUTO_HANDLE = 33 - Automatic handle
-     * RPC_FC_CALLBACK_HANDLE = 34 - Implicit handle used for a callback: current handle
+     * FC_AUTO_HANDLE = 33 - Automatic handle
+     * FC_CALLBACK_HANDLE = 34 - Implicit handle used for a callback: current handle
      *   from last remote call
      */
     unsigned char handle_type;
@@ -97,13 +97,11 @@ typedef struct _NDR_PROC_HEADER_RPC
 typedef struct _NDR_PROC_PARTIAL_OIF_HEADER
 {
     /* the pre-computed client buffer size so that interpreter can skip all
-     * or some (if the flag RPC_FC_PROC_OI2F_CLTMUSTSIZE is specified) of the
-     * sizing pass */
+     * or some (if the flag ClientMustSize is specified) of the sizing pass */
     unsigned short constant_client_buffer_size;
 
     /* the pre-computed server buffer size so that interpreter can skip all
-     * or some (if the flag RPC_FC_PROC_OI2F_SRVMUSTSIZE is specified) of the
-     * sizing pass */
+     * or some (if the flag ServerMustSize is specified) of the sizing pass */
     unsigned short constant_server_buffer_size;
 
     INTERPRETER_OPT_FLAGS Oi2Flags;
diff --git a/dll/win32/rpcrt4/ndr_typelib.c b/dll/win32/rpcrt4/ndr_typelib.c
new file mode 100644 (file)
index 0000000..a0855a5
--- /dev/null
@@ -0,0 +1,1207 @@
+/*
+ * Type library proxy/stub implementation
+ *
+ * Copyright 2018 Zebediah Figura
+ *
+ * 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>
+
+#define COBJMACROS
+#ifdef __REACTOS__
+#include "objbase.h"
+#endif
+#include "oaidl.h"
+#define USE_STUBLESS_PROXY
+#include "rpcproxy.h"
+#include "ndrtypes.h"
+#include "wine/debug.h"
+#include "wine/heap.h"
+
+#include "cpsf.h"
+#include "initguid.h"
+#include "ndr_types.h"
+#include "ndr_stubless.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(ole);
+
+static size_t write_type_tfs(ITypeInfo *typeinfo, unsigned char *str,
+    size_t *len, TYPEDESC *desc, BOOL toplevel, BOOL onstack);
+
+#define WRITE_CHAR(str, len, val) \
+    do { if ((str)) (str)[(len)] = (val); (len)++; } while (0)
+#define WRITE_SHORT(str, len, val) \
+    do { if ((str)) *((short *)((str) + (len))) = (val); (len) += 2; } while (0)
+#define WRITE_INT(str, len, val) \
+    do { if ((str)) *((int *)((str) + (len))) = (val); (len) += 4; } while (0)
+
+extern const ExtendedProxyFileInfo ndr_types_ProxyFileInfo;
+
+static const MIDL_STUBLESS_PROXY_INFO *get_ndr_types_proxy_info(void)
+{
+    return ndr_types_ProxyFileInfo.pProxyVtblList[0]->header.pStublessProxyInfo;
+}
+
+static const NDR_PARAM_OIF *get_ndr_types_params( unsigned int *nb_params )
+{
+    const MIDL_STUBLESS_PROXY_INFO *proxy = get_ndr_types_proxy_info();
+    const unsigned char *format = proxy->ProcFormatString + proxy->FormatStringOffset[3];
+    const NDR_PROC_HEADER *proc = (const NDR_PROC_HEADER *)format;
+    const NDR_PROC_PARTIAL_OIF_HEADER *header;
+
+    if (proc->Oi_flags & Oi_HAS_RPCFLAGS)
+        format += sizeof(NDR_PROC_HEADER_RPC);
+    else
+        format += sizeof(NDR_PROC_HEADER);
+
+    header = (const NDR_PROC_PARTIAL_OIF_HEADER *)format;
+    format += sizeof(*header);
+    if (header->Oi2Flags.HasExtensions)
+    {
+        const NDR_PROC_HEADER_EXTS *ext = (const NDR_PROC_HEADER_EXTS *)format;
+        format += ext->Size;
+    }
+    *nb_params = header->number_of_params;
+    return (const NDR_PARAM_OIF *)format;
+}
+
+static unsigned short get_tfs_offset( int param )
+{
+    unsigned int nb_params;
+    const NDR_PARAM_OIF *params = get_ndr_types_params( &nb_params );
+
+    assert( param < nb_params );
+    return params[param].u.type_offset;
+}
+
+static const unsigned char *get_type_format_string( size_t *size )
+{
+    unsigned int nb_params;
+    const NDR_PARAM_OIF *params = get_ndr_types_params( &nb_params );
+
+    *size = params[nb_params - 1].u.type_offset;
+    return get_ndr_types_proxy_info()->pStubDesc->pFormatTypes;
+}
+
+static unsigned short write_oleaut_tfs(VARTYPE vt)
+{
+    switch (vt)
+    {
+    case VT_BSTR:       return get_tfs_offset( 0 );
+    case VT_UNKNOWN:    return get_tfs_offset( 1 );
+    case VT_DISPATCH:   return get_tfs_offset( 2 );
+    case VT_VARIANT:    return get_tfs_offset( 3 );
+    case VT_SAFEARRAY:  return get_tfs_offset( 4 );
+    }
+    return 0;
+}
+
+static unsigned char get_base_type(VARTYPE vt)
+{
+    switch (vt)
+    {
+    case VT_I1:     return FC_SMALL;
+    case VT_BOOL:
+    case VT_I2:     return FC_SHORT;
+    case VT_INT:
+    case VT_ERROR:
+    case VT_HRESULT:
+    case VT_I4:     return FC_LONG;
+    case VT_I8:
+    case VT_UI8:    return FC_HYPER;
+    case VT_UI1:    return FC_USMALL;
+    case VT_UI2:    return FC_USHORT;
+    case VT_UINT:
+    case VT_UI4:    return FC_ULONG;
+    case VT_R4:     return FC_FLOAT;
+    case VT_DATE:
+    case VT_R8:     return FC_DOUBLE;
+    default:        return 0;
+    }
+}
+
+static unsigned int type_memsize(ITypeInfo *typeinfo, TYPEDESC *desc)
+{
+    switch (desc->vt)
+    {
+    case VT_I1:
+    case VT_UI1:
+        return 1;
+    case VT_I2:
+    case VT_UI2:
+    case VT_BOOL:
+        return 2;
+    case VT_I4:
+    case VT_UI4:
+    case VT_R4:
+    case VT_INT:
+    case VT_UINT:
+    case VT_ERROR:
+    case VT_HRESULT:
+        return 4;
+    case VT_I8:
+    case VT_UI8:
+    case VT_R8:
+    case VT_DATE:
+        return 8;
+    case VT_BSTR:
+    case VT_SAFEARRAY:
+    case VT_PTR:
+    case VT_UNKNOWN:
+    case VT_DISPATCH:
+        return sizeof(void *);
+    case VT_VARIANT:
+        return sizeof(VARIANT);
+    case VT_CARRAY:
+    {
+        unsigned int size = type_memsize(typeinfo, &desc->lpadesc->tdescElem);
+        unsigned int i;
+        for (i = 0; i < desc->lpadesc->cDims; i++)
+            size *= desc->lpadesc->rgbounds[i].cElements;
+        return size;
+    }
+    case VT_USERDEFINED:
+    {
+        unsigned int size = 0;
+        ITypeInfo *refinfo;
+        TYPEATTR *attr;
+
+        ITypeInfo_GetRefTypeInfo(typeinfo, desc->hreftype, &refinfo);
+        ITypeInfo_GetTypeAttr(refinfo, &attr);
+        size = attr->cbSizeInstance;
+        ITypeInfo_ReleaseTypeAttr(refinfo, attr);
+        ITypeInfo_Release(refinfo);
+        return size;
+    }
+    default:
+        FIXME("unhandled type %u\n", desc->vt);
+        return 0;
+    }
+}
+
+static unsigned char get_array_fc(ITypeInfo *typeinfo, TYPEDESC *desc);
+
+static unsigned char get_struct_fc(ITypeInfo *typeinfo, TYPEATTR *attr)
+{
+    unsigned char fc = FC_STRUCT;
+    VARDESC *desc;
+    VARTYPE vt;
+    WORD i;
+
+    for (i = 0; i < attr->cVars; i++)
+    {
+        ITypeInfo_GetVarDesc(typeinfo, i, &desc);
+        vt = desc->elemdescVar.tdesc.vt;
+
+        switch (vt)
+        {
+        case VT_CARRAY:
+            if (get_array_fc(typeinfo, &desc->elemdescVar.tdesc.lpadesc->tdescElem) == FC_BOGUS_ARRAY)
+                fc = FC_BOGUS_STRUCT;
+            break;
+        default:
+            if (!get_base_type(vt))
+            {
+                FIXME("unhandled type %u\n", vt);
+                fc = FC_BOGUS_STRUCT;
+            }
+            break;
+        }
+
+        ITypeInfo_ReleaseVarDesc(typeinfo, desc);
+    }
+
+    return fc;
+}
+
+static unsigned char get_array_fc(ITypeInfo *typeinfo, TYPEDESC *desc)
+{
+    if (get_base_type(desc->vt))
+        return FC_LGFARRAY;
+    else if (desc->vt == VT_USERDEFINED)
+    {
+        ITypeInfo *refinfo;
+        TYPEATTR *attr;
+        unsigned char fc;
+
+        ITypeInfo_GetRefTypeInfo(typeinfo, desc->hreftype, &refinfo);
+        ITypeInfo_GetTypeAttr(refinfo, &attr);
+
+        if (attr->typekind == TKIND_ENUM)
+            fc = FC_LGFARRAY;
+        else if (attr->typekind == TKIND_RECORD && get_struct_fc(refinfo, attr) == FC_STRUCT)
+            fc = FC_LGFARRAY;
+        else
+            fc = FC_BOGUS_ARRAY;
+
+        ITypeInfo_ReleaseTypeAttr(refinfo, attr);
+        ITypeInfo_Release(refinfo);
+
+        return fc;
+    }
+    else
+        return FC_BOGUS_ARRAY;
+}
+
+static size_t write_struct_tfs(ITypeInfo *typeinfo, unsigned char *str,
+        size_t *len, TYPEATTR *attr)
+{
+    unsigned char fc = get_struct_fc(typeinfo, attr);
+    size_t off = *len;
+
+    if (fc != FC_STRUCT)
+        FIXME("fc %02x not implemented\n", fc);
+
+    WRITE_CHAR (str, *len, FC_STRUCT);
+    WRITE_CHAR (str, *len, attr->cbAlignment - 1);
+    WRITE_SHORT(str, *len, attr->cbSizeInstance);
+    WRITE_CHAR (str, *len, FC_PAD);
+    WRITE_CHAR (str, *len, FC_END);
+
+    return off;
+}
+
+static size_t write_array_tfs(ITypeInfo *typeinfo, unsigned char *str,
+    size_t *len, ARRAYDESC *desc)
+{
+    unsigned char fc = get_array_fc(typeinfo, &desc->tdescElem);
+    ULONG size = type_memsize(typeinfo, &desc->tdescElem);
+    unsigned char basetype;
+    size_t ref = 0, off;
+    USHORT i;
+
+    if (fc != FC_LGFARRAY)
+        FIXME("complex arrays not implemented\n");
+
+    if (!(basetype = get_base_type(desc->tdescElem.vt)))
+        ref = write_type_tfs(typeinfo, str, len, &desc->tdescElem, FALSE, FALSE);
+
+    /* In theory arrays should be nested, but there's no reason not to marshal
+     * [x][y] as [x*y]. */
+    for (i = 0; i < desc->cDims; i++) size *= desc->rgbounds[i].cElements;
+
+    off = *len;
+
+    WRITE_CHAR(str, *len, FC_LGFARRAY);
+    WRITE_CHAR(str, *len, 0);
+    WRITE_INT (str, *len, size);
+    if (basetype)
+        WRITE_CHAR(str, *len, basetype);
+    else
+    {
+        WRITE_CHAR (str, *len, FC_EMBEDDED_COMPLEX);
+        WRITE_CHAR (str, *len, 0);
+        WRITE_SHORT(str, *len, ref - *len);
+        WRITE_CHAR (str, *len, FC_PAD);
+    }
+    WRITE_CHAR(str, *len, FC_END);
+
+    return off;
+}
+
+static size_t write_ip_tfs(unsigned char *str, size_t *len, const GUID *iid)
+{
+    size_t off = *len;
+
+    if (str)
+    {
+        str[*len] = FC_IP;
+        str[*len+1] = FC_CONSTANT_IID;
+        memcpy(str + *len + 2, iid, sizeof(*iid));
+    }
+    *len += 2 + sizeof(*iid);
+
+    return off;
+}
+
+static void get_default_iface(ITypeInfo *typeinfo, WORD count, GUID *iid)
+{
+    ITypeInfo *refinfo;
+    HREFTYPE reftype;
+    TYPEATTR *attr;
+    int flags, i;
+
+    for (i = 0; i < count; ++i)
+    {
+        ITypeInfo_GetImplTypeFlags(typeinfo, i, &flags);
+        if (flags & IMPLTYPEFLAG_FDEFAULT)
+            break;
+    }
+
+    /* If no interface was explicitly marked default, choose the first one. */
+    if (i == count)
+        i = 0;
+
+    ITypeInfo_GetRefTypeOfImplType(typeinfo, i, &reftype);
+    ITypeInfo_GetRefTypeInfo(typeinfo, reftype, &refinfo);
+    ITypeInfo_GetTypeAttr(refinfo, &attr);
+    *iid = attr->guid;
+    ITypeInfo_ReleaseTypeAttr(refinfo, attr);
+    ITypeInfo_Release(refinfo);
+}
+
+static size_t write_pointer_tfs(ITypeInfo *typeinfo, unsigned char *str,
+        size_t *len, TYPEDESC *desc, BOOL toplevel, BOOL onstack)
+{
+    unsigned char basetype, flags = 0;
+    size_t ref, off = *len;
+    ITypeInfo *refinfo;
+    TYPEATTR *attr;
+    GUID guid;
+
+    if (desc->vt == VT_USERDEFINED)
+    {
+        ITypeInfo_GetRefTypeInfo(typeinfo, desc->hreftype, &refinfo);
+        ITypeInfo_GetTypeAttr(refinfo, &attr);
+
+        switch (attr->typekind)
+        {
+        case TKIND_ENUM:
+            assert(!toplevel);  /* toplevel base-type pointers should use IsSimpleRef */
+            WRITE_CHAR(str, *len, FC_UP);
+            WRITE_CHAR(str, *len, FC_SIMPLE_POINTER);
+            WRITE_CHAR(str, *len, FC_ENUM32);
+            WRITE_CHAR(str, *len, FC_PAD);
+            break;
+        case TKIND_RECORD:
+            assert(!toplevel);  /* toplevel struct pointers should use IsSimpleRef */
+            ref = write_struct_tfs(refinfo, str, len, attr);
+            off = *len;
+            WRITE_CHAR (str, *len, FC_UP);
+            WRITE_CHAR (str, *len, 0);
+            WRITE_SHORT(str, *len, ref - *len);
+            break;
+        case TKIND_INTERFACE:
+        case TKIND_DISPATCH:
+            write_ip_tfs(str, len, &attr->guid);
+            break;
+        case TKIND_COCLASS:
+            get_default_iface(refinfo, attr->cImplTypes, &guid);
+            write_ip_tfs(str, len, &guid);
+            break;
+        case TKIND_ALIAS:
+            off = write_pointer_tfs(refinfo, str, len, &attr->tdescAlias, toplevel, onstack);
+            break;
+        default:
+            FIXME("unhandled kind %#x\n", attr->typekind);
+            WRITE_SHORT(str, *len, 0);
+            break;
+        }
+
+        ITypeInfo_ReleaseTypeAttr(refinfo, attr);
+        ITypeInfo_Release(refinfo);
+    }
+    else if ((basetype = get_base_type(desc->vt)))
+    {
+        assert(!toplevel); /* toplevel base-type pointers should use IsSimpleRef */
+        WRITE_CHAR(str, *len, FC_UP);
+        WRITE_CHAR(str, *len, FC_SIMPLE_POINTER);
+        WRITE_CHAR(str, *len, basetype);
+        WRITE_CHAR(str, *len, FC_PAD);
+    }
+    else
+    {
+        ref = write_type_tfs(typeinfo, str, len, desc, FALSE, FALSE);
+
+        if (onstack) flags |= FC_ALLOCED_ON_STACK;
+        if (desc->vt == VT_PTR || desc->vt == VT_UNKNOWN || desc->vt == VT_DISPATCH)
+            flags |= FC_POINTER_DEREF;
+
+        off = *len;
+
+        WRITE_CHAR (str, *len, toplevel ? FC_RP : FC_UP);
+        WRITE_CHAR (str, *len, flags);
+        WRITE_SHORT(str, *len, ref - *len);
+    }
+
+    return off;
+}
+
+static size_t write_type_tfs(ITypeInfo *typeinfo, unsigned char *str,
+        size_t *len, TYPEDESC *desc, BOOL toplevel, BOOL onstack)
+{
+    ITypeInfo *refinfo;
+    TYPEATTR *attr;
+    size_t off;
+
+    TRACE("vt %d%s\n", desc->vt, toplevel ? " (toplevel)" : "");
+
+    if ((off = write_oleaut_tfs(desc->vt)))
+        return off;
+
+    switch (desc->vt)
+    {
+    case VT_PTR:
+        return write_pointer_tfs(typeinfo, str, len, desc->lptdesc, toplevel, onstack);
+    case VT_CARRAY:
+        return write_array_tfs(typeinfo, str, len, desc->lpadesc);
+    case VT_USERDEFINED:
+        ITypeInfo_GetRefTypeInfo(typeinfo, desc->hreftype, &refinfo);
+        ITypeInfo_GetTypeAttr(refinfo, &attr);
+
+        switch (attr->typekind)
+        {
+        case TKIND_RECORD:
+            off = write_struct_tfs(refinfo, str, len, attr);
+            break;
+        default:
+            FIXME("unhandled kind %u\n", attr->typekind);
+            off = *len;
+            WRITE_SHORT(str, *len, 0);
+            break;
+        }
+
+        ITypeInfo_ReleaseTypeAttr(refinfo, attr);
+        ITypeInfo_Release(refinfo);
+        break;
+    default:
+        /* base types are always embedded directly */
+        assert(!get_base_type(desc->vt));
+        FIXME("unhandled type %u\n", desc->vt);
+        off = *len;
+        WRITE_SHORT(str, *len, 0);
+        break;
+    }
+
+    return off;
+}
+
+static unsigned short get_stack_size(ITypeInfo *typeinfo, TYPEDESC *desc)
+{
+#if defined(__i386__) || defined(__arm__)
+    if (desc->vt == VT_CARRAY)
+        return sizeof(void *);
+    return (type_memsize(typeinfo, desc) + 3) & ~3;
+#else
+    return sizeof(void *);
+#endif
+}
+
+static const unsigned short MustSize    = 0x0001;
+static const unsigned short MustFree    = 0x0002;
+static const unsigned short IsIn        = 0x0008;
+static const unsigned short IsOut       = 0x0010;
+static const unsigned short IsReturn    = 0x0020;
+static const unsigned short IsBasetype  = 0x0040;
+static const unsigned short IsByValue   = 0x0080;
+static const unsigned short IsSimpleRef = 0x0100;
+
+static HRESULT get_param_pointer_info(ITypeInfo *typeinfo, TYPEDESC *tdesc, int is_in,
+        int is_out, unsigned short *server_size, unsigned short *flags,
+        unsigned char *basetype, TYPEDESC **tfs_tdesc)
+{
+    ITypeInfo *refinfo;
+    HRESULT hr = S_OK;
+    TYPEATTR *attr;
+
+    switch (tdesc->vt)
+    {
+    case VT_UNKNOWN:
+    case VT_DISPATCH:
+        *flags |= MustFree;
+        if (is_in && is_out)
+            *server_size = sizeof(void *);
+        break;
+    case VT_PTR:
+        *flags |= MustFree;
+
+        if (tdesc->lptdesc->vt == VT_USERDEFINED)
+        {
+            ITypeInfo_GetRefTypeInfo(typeinfo, tdesc->lptdesc->hreftype, &refinfo);
+            ITypeInfo_GetTypeAttr(refinfo, &attr);
+
+            switch (attr->typekind)
+            {
+            case TKIND_INTERFACE:
+            case TKIND_DISPATCH:
+            case TKIND_COCLASS:
+                if (is_in && is_out)
+                    *server_size = sizeof(void *);
+                break;
+            default:
+                *server_size = sizeof(void *);
+            }
+
+            ITypeInfo_ReleaseTypeAttr(refinfo, attr);
+            ITypeInfo_Release(refinfo);
+        }
+        else
+            *server_size = sizeof(void *);
+        break;
+    case VT_CARRAY:
+        *flags |= IsSimpleRef | MustFree;
+        *server_size = type_memsize(typeinfo, tdesc);
+        *tfs_tdesc = tdesc;
+        break;
+    case VT_USERDEFINED:
+        ITypeInfo_GetRefTypeInfo(typeinfo, tdesc->hreftype, &refinfo);
+        ITypeInfo_GetTypeAttr(refinfo, &attr);
+
+        switch (attr->typekind)
+        {
+        case TKIND_ENUM:
+            *flags |= IsSimpleRef | IsBasetype;
+            if (!is_in && is_out)
+                *server_size = sizeof(void *);
+            *basetype = FC_ENUM32;
+            break;
+        case TKIND_RECORD:
+            *flags |= IsSimpleRef | MustFree;
+            if (!is_in && is_out)
+                *server_size = attr->cbSizeInstance;
+            *tfs_tdesc = tdesc;
+            break;
+        case TKIND_INTERFACE:
+        case TKIND_DISPATCH:
+        case TKIND_COCLASS:
+            *flags |= MustFree;
+            break;
+        case TKIND_ALIAS:
+            hr = get_param_pointer_info(refinfo, &attr->tdescAlias, is_in,
+                    is_out, server_size, flags, basetype, tfs_tdesc);
+            break;
+        default:
+            FIXME("unhandled kind %#x\n", attr->typekind);
+            hr = E_NOTIMPL;
+            break;
+        }
+
+        ITypeInfo_ReleaseTypeAttr(refinfo, attr);
+        ITypeInfo_Release(refinfo);
+        break;
+    default:
+        *flags |= IsSimpleRef;
+        *tfs_tdesc = tdesc;
+        if (!is_in && is_out)
+            *server_size = type_memsize(typeinfo, tdesc);
+        if ((*basetype = get_base_type(tdesc->vt)))
+            *flags |= IsBasetype;
+        break;
+    }
+
+    return hr;
+}
+
+static HRESULT get_param_info(ITypeInfo *typeinfo, TYPEDESC *tdesc, int is_in,
+        int is_out, unsigned short *server_size, unsigned short *flags,
+        unsigned char *basetype, TYPEDESC **tfs_tdesc)
+{
+    ITypeInfo *refinfo;
+    HRESULT hr = S_OK;
+    TYPEATTR *attr;
+
+    *server_size = 0;
+    *flags = MustSize;
+    *basetype = 0;
+    *tfs_tdesc = tdesc;
+
+    TRACE("vt %u\n", tdesc->vt);
+
+    switch (tdesc->vt)
+    {
+    case VT_VARIANT:
+#if !defined(__i386__) && !defined(__arm__)
+        *flags |= IsSimpleRef | MustFree;
+        break;
+#endif
+        /* otherwise fall through */
+    case VT_BSTR:
+    case VT_SAFEARRAY:
+    case VT_CY:
+        *flags |= IsByValue | MustFree;
+        break;
+    case VT_UNKNOWN:
+    case VT_DISPATCH:
+    case VT_CARRAY:
+        *flags |= MustFree;
+        break;
+    case VT_PTR:
+        return get_param_pointer_info(typeinfo, tdesc->lptdesc, is_in, is_out,
+                server_size, flags, basetype, tfs_tdesc);
+    case VT_USERDEFINED:
+        ITypeInfo_GetRefTypeInfo(typeinfo, tdesc->hreftype, &refinfo);
+        ITypeInfo_GetTypeAttr(refinfo, &attr);
+
+        switch (attr->typekind)
+        {
+        case TKIND_ENUM:
+            *flags |= IsBasetype;
+            *basetype = FC_ENUM32;
+            break;
+        case TKIND_RECORD:
+#if defined(__i386__) || defined(__arm__)
+            *flags |= IsByValue | MustFree;
+#else
+            if (attr->cbSizeInstance <= 8)
+                *flags |= IsByValue | MustFree;
+            else
+                *flags |= IsSimpleRef | MustFree;
+#endif
+            break;
+        case TKIND_ALIAS:
+            hr = get_param_info(refinfo, &attr->tdescAlias, is_in, is_out,
+                    server_size, flags, basetype, tfs_tdesc);
+            break;
+        default:
+            FIXME("unhandled kind %#x\n", attr->typekind);
+            hr = E_NOTIMPL;
+            break;
+        }
+
+        ITypeInfo_ReleaseTypeAttr(refinfo, attr);
+        ITypeInfo_Release(refinfo);
+        break;
+    default:
+        if ((*basetype = get_base_type(tdesc->vt)))
+            *flags |= IsBasetype;
+        else
+        {
+            FIXME("unhandled type %u\n", tdesc->vt);
+            return E_NOTIMPL;
+        }
+        break;
+    }
+
+    return hr;
+}
+
+static HRESULT write_param_fs(ITypeInfo *typeinfo, unsigned char *type,
+        size_t *typelen, unsigned char *proc, size_t *proclen, ELEMDESC *desc,
+        BOOL is_return, unsigned short *stack_offset)
+{
+    USHORT param_flags = desc->paramdesc.wParamFlags;
+    int is_in  = param_flags & PARAMFLAG_FIN;
+    int is_out = param_flags & PARAMFLAG_FOUT;
+    TYPEDESC *tdesc = &desc->tdesc, *tfs_tdesc;
+    unsigned short server_size;
+    unsigned short stack_size = get_stack_size(typeinfo, tdesc);
+    unsigned char basetype;
+    unsigned short flags;
+    size_t off = 0;
+    HRESULT hr;
+
+    hr = get_param_info(typeinfo, tdesc, is_in, is_out, &server_size, &flags,
+            &basetype, &tfs_tdesc);
+
+    if (is_in)      flags |= IsIn;
+    if (is_out)     flags |= IsOut;
+    if (is_return)  flags |= IsOut | IsReturn;
+
+    server_size = (server_size + 7) / 8;
+    if (server_size >= 8) server_size = 0;
+    flags |= server_size << 13;
+
+    if (!basetype)
+        off = write_type_tfs(typeinfo, type, typelen, tfs_tdesc, TRUE, server_size != 0);
+
+    if (SUCCEEDED(hr))
+    {
+        WRITE_SHORT(proc, *proclen, flags);
+        WRITE_SHORT(proc, *proclen, *stack_offset);
+        WRITE_SHORT(proc, *proclen, basetype ? basetype : off);
+
+        *stack_offset += stack_size;
+    }
+
+    return hr;
+}
+
+static void write_proc_func_header(ITypeInfo *typeinfo, FUNCDESC *desc,
+        WORD proc_idx, unsigned char *proc, size_t *proclen)
+{
+    unsigned short stack_size = 2 * sizeof(void *); /* This + return */
+#ifdef __x86_64__
+    unsigned short float_mask = 0;
+    unsigned char basetype;
+#endif
+    WORD param_idx;
+
+    WRITE_CHAR (proc, *proclen, FC_AUTO_HANDLE);
+    WRITE_CHAR (proc, *proclen, Oi_OBJECT_PROC | Oi_OBJ_USE_V2_INTERPRETER);
+    WRITE_SHORT(proc, *proclen, proc_idx);
+    for (param_idx = 0; param_idx < desc->cParams; param_idx++)
+        stack_size += get_stack_size(typeinfo, &desc->lprgelemdescParam[param_idx].tdesc);
+    WRITE_SHORT(proc, *proclen, stack_size);
+
+    WRITE_SHORT(proc, *proclen, 0); /* constant_client_buffer_size */
+    WRITE_SHORT(proc, *proclen, 0); /* constant_server_buffer_size */
+#ifdef __x86_64__
+    WRITE_CHAR (proc, *proclen, 0x47);  /* HasExtensions | HasReturn | ClientMustSize | ServerMustSize */
+#else
+    WRITE_CHAR (proc, *proclen, 0x07);  /* HasReturn | ClientMustSize | ServerMustSize */
+#endif
+    WRITE_CHAR (proc, *proclen, desc->cParams + 1); /* incl. return value */
+#ifdef __x86_64__
+    WRITE_CHAR (proc, *proclen, 10); /* extension size */
+    WRITE_CHAR (proc, *proclen, 0);  /* INTERPRETER_OPT_FLAGS2 */
+    WRITE_SHORT(proc, *proclen, 0);  /* ClientCorrHint */
+    WRITE_SHORT(proc, *proclen, 0);  /* ServerCorrHint */
+    WRITE_SHORT(proc, *proclen, 0);  /* NotifyIndex */
+    for (param_idx = 0; param_idx < desc->cParams && param_idx < 3; param_idx++)
+    {
+        basetype = get_base_type(desc->lprgelemdescParam[param_idx].tdesc.vt);
+        if (basetype == FC_FLOAT)
+            float_mask |= (1 << ((param_idx + 1) * 2));
+        else if (basetype == FC_DOUBLE)
+            float_mask |= (2 << ((param_idx + 1) * 2));
+    }
+    WRITE_SHORT(proc, *proclen, float_mask);
+#endif
+}
+
+static HRESULT write_iface_fs(ITypeInfo *typeinfo, WORD funcs, WORD parentfuncs,
+        unsigned char *type, size_t *typelen, unsigned char *proc,
+        size_t *proclen, unsigned short *offset)
+{
+    unsigned short stack_offset;
+    WORD proc_idx, param_idx;
+    FUNCDESC *desc;
+    HRESULT hr;
+
+    for (proc_idx = 3; proc_idx < parentfuncs; proc_idx++)
+    {
+        if (offset)
+            offset[proc_idx - 3] = -1;
+    }
+
+    for (proc_idx = 0; proc_idx < funcs; proc_idx++)
+    {
+        TRACE("Writing procedure %d.\n", proc_idx);
+
+        hr = ITypeInfo_GetFuncDesc(typeinfo, proc_idx, &desc);
+        if (FAILED(hr)) return hr;
+
+        if (offset)
+            offset[proc_idx + parentfuncs - 3] = *proclen;
+
+        write_proc_func_header(typeinfo, desc, proc_idx + parentfuncs, proc, proclen);
+
+        stack_offset = sizeof(void *);  /* This */
+        for (param_idx = 0; param_idx < desc->cParams; param_idx++)
+        {
+            TRACE("Writing parameter %d.\n", param_idx);
+            hr = write_param_fs(typeinfo, type, typelen, proc, proclen,
+                    &desc->lprgelemdescParam[param_idx], FALSE, &stack_offset);
+            if (FAILED(hr))
+            {
+                ITypeInfo_ReleaseFuncDesc(typeinfo, desc);
+                return hr;
+            }
+        }
+
+        hr = write_param_fs(typeinfo, type, typelen, proc, proclen,
+                &desc->elemdescFunc, TRUE, &stack_offset);
+        ITypeInfo_ReleaseFuncDesc(typeinfo, desc);
+        if (FAILED(hr)) return hr;
+    }
+
+    return S_OK;
+}
+
+static HRESULT build_format_strings(ITypeInfo *typeinfo, WORD funcs,
+        WORD parentfuncs, const unsigned char **type_ret,
+        const unsigned char **proc_ret, unsigned short **offset_ret)
+{
+    size_t tfs_size;
+    const unsigned char *tfs = get_type_format_string( &tfs_size );
+    size_t typelen = tfs_size, proclen = 0;
+    unsigned char *type, *proc;
+    unsigned short *offset;
+    HRESULT hr;
+
+    hr = write_iface_fs(typeinfo, funcs, parentfuncs, NULL, &typelen, NULL, &proclen, NULL);
+    if (FAILED(hr)) return hr;
+
+    type = heap_alloc(typelen);
+    proc = heap_alloc(proclen);
+    offset = heap_alloc((parentfuncs + funcs - 3) * sizeof(*offset));
+    if (!type || !proc || !offset)
+    {
+        ERR("Failed to allocate format strings.\n");
+        hr = E_OUTOFMEMORY;
+        goto err;
+    }
+
+    memcpy(type, tfs, tfs_size);
+    typelen = tfs_size;
+    proclen = 0;
+
+    hr = write_iface_fs(typeinfo, funcs, parentfuncs, type, &typelen, proc, &proclen, offset);
+    if (SUCCEEDED(hr))
+    {
+        *type_ret = type;
+        *proc_ret = proc;
+        *offset_ret = offset;
+        return S_OK;
+    }
+
+err:
+    heap_free(type);
+    heap_free(proc);
+    heap_free(offset);
+    return hr;
+}
+
+/* Common helper for Create{Proxy,Stub}FromTypeInfo(). */
+static HRESULT get_iface_info(ITypeInfo **typeinfo, WORD *funcs, WORD *parentfuncs,
+        GUID *parentiid)
+{
+    ITypeInfo *real_typeinfo, *parentinfo;
+    TYPEATTR *typeattr;
+    ITypeLib *typelib;
+    TLIBATTR *libattr;
+    TYPEKIND typekind;
+    HREFTYPE reftype;
+    SYSKIND syskind;
+    HRESULT hr;
+
+    /* Dual interfaces report their size to be sizeof(IDispatchVtbl) and their
+     * implemented type to be IDispatch. We need to retrieve the underlying
+     * interface to get that information. */
+    hr = ITypeInfo_GetTypeAttr(*typeinfo, &typeattr);
+    if (FAILED(hr))
+        return hr;
+    typekind = typeattr->typekind;
+    ITypeInfo_ReleaseTypeAttr(*typeinfo, typeattr);
+    if (typekind == TKIND_DISPATCH)
+    {
+        hr = ITypeInfo_GetRefTypeOfImplType(*typeinfo, -1, &reftype);
+        if (FAILED(hr))
+            return hr;
+
+        hr = ITypeInfo_GetRefTypeInfo(*typeinfo, reftype, &real_typeinfo);
+        if (FAILED(hr))
+            return hr;
+
+        ITypeInfo_Release(*typeinfo);
+        *typeinfo = real_typeinfo;
+    }
+
+    hr = ITypeInfo_GetContainingTypeLib(*typeinfo, &typelib, NULL);
+    if (FAILED(hr))
+        return hr;
+
+    hr = ITypeLib_GetLibAttr(typelib, &libattr);
+    if (FAILED(hr))
+    {
+        ITypeLib_Release(typelib);
+        return hr;
+    }
+    syskind = libattr->syskind;
+    ITypeLib_ReleaseTLibAttr(typelib, libattr);
+    ITypeLib_Release(typelib);
+
+    hr = ITypeInfo_GetTypeAttr(*typeinfo, &typeattr);
+    if (FAILED(hr))
+        return hr;
+    *funcs = typeattr->cFuncs;
+    *parentfuncs = typeattr->cbSizeVft / (syskind == SYS_WIN64 ? 8 : 4) - *funcs;
+    ITypeInfo_ReleaseTypeAttr(*typeinfo, typeattr);
+
+    hr = ITypeInfo_GetRefTypeOfImplType(*typeinfo, 0, &reftype);
+    if (FAILED(hr))
+        return hr;
+    hr = ITypeInfo_GetRefTypeInfo(*typeinfo, reftype, &parentinfo);
+    if (FAILED(hr))
+        return hr;
+    hr = ITypeInfo_GetTypeAttr(parentinfo, &typeattr);
+    if (FAILED(hr))
+        return hr;
+    *parentiid = typeattr->guid;
+    ITypeInfo_ReleaseTypeAttr(parentinfo, typeattr);
+    ITypeInfo_Release(parentinfo);
+
+    return hr;
+}
+
+static void init_stub_desc(MIDL_STUB_DESC *desc)
+{
+    desc->pfnAllocate = NdrOleAllocate;
+    desc->pfnFree = NdrOleFree;
+    desc->Version = 0x50002;
+    desc->aUserMarshalQuadruple = get_ndr_types_proxy_info()->pStubDesc->aUserMarshalQuadruple;
+    /* type format string is initialized with proc format string and offset table */
+}
+
+struct typelib_proxy
+{
+    StdProxyImpl proxy;
+    IID iid;
+    MIDL_STUB_DESC stub_desc;
+    MIDL_STUBLESS_PROXY_INFO proxy_info;
+    CInterfaceProxyVtbl *proxy_vtbl;
+    unsigned short *offset_table;
+};
+
+static ULONG WINAPI typelib_proxy_Release(IRpcProxyBuffer *iface)
+{
+    struct typelib_proxy *proxy = CONTAINING_RECORD(iface, struct typelib_proxy, proxy.IRpcProxyBuffer_iface);
+    ULONG refcount = InterlockedDecrement(&proxy->proxy.RefCount);
+
+    TRACE("(%p) decreasing refs to %d\n", proxy, refcount);
+
+    if (!refcount)
+    {
+        if (proxy->proxy.pChannel)
+            IRpcProxyBuffer_Disconnect(&proxy->proxy.IRpcProxyBuffer_iface);
+        if (proxy->proxy.base_object)
+            IUnknown_Release(proxy->proxy.base_object);
+        if (proxy->proxy.base_proxy)
+            IRpcProxyBuffer_Release(proxy->proxy.base_proxy);
+        heap_free((void *)proxy->stub_desc.pFormatTypes);
+        heap_free((void *)proxy->proxy_info.ProcFormatString);
+        heap_free(proxy->offset_table);
+        heap_free(proxy->proxy_vtbl);
+        heap_free(proxy);
+    }
+    return refcount;
+}
+
+static const IRpcProxyBufferVtbl typelib_proxy_vtbl =
+{
+    StdProxy_QueryInterface,
+    StdProxy_AddRef,
+    typelib_proxy_Release,
+    StdProxy_Connect,
+    StdProxy_Disconnect,
+};
+
+static HRESULT typelib_proxy_init(struct typelib_proxy *proxy, IUnknown *outer,
+        ULONG count, const GUID *parentiid, IRpcProxyBuffer **proxy_buffer, void **out)
+{
+    if (!fill_stubless_table((IUnknownVtbl *)proxy->proxy_vtbl->Vtbl, count))
+        return E_OUTOFMEMORY;
+
+    if (!outer) outer = (IUnknown *)&proxy->proxy;
+
+    proxy->proxy.IRpcProxyBuffer_iface.lpVtbl = &typelib_proxy_vtbl;
+    proxy->proxy.PVtbl = proxy->proxy_vtbl->Vtbl;
+    proxy->proxy.RefCount = 1;
+    proxy->proxy.piid = proxy->proxy_vtbl->header.piid;
+    proxy->proxy.pUnkOuter = outer;
+
+    if (!IsEqualGUID(parentiid, &IID_IUnknown))
+    {
+        HRESULT hr = create_proxy(parentiid, NULL, &proxy->proxy.base_proxy,
+                (void **)&proxy->proxy.base_object);
+        if (FAILED(hr)) return hr;
+    }
+
+    *proxy_buffer = &proxy->proxy.IRpcProxyBuffer_iface;
+    *out = &proxy->proxy.PVtbl;
+    IUnknown_AddRef((IUnknown *)*out);
+
+    return S_OK;
+}
+
+HRESULT WINAPI CreateProxyFromTypeInfo(ITypeInfo *typeinfo, IUnknown *outer,
+        REFIID iid, IRpcProxyBuffer **proxy_buffer, void **out)
+{
+    struct typelib_proxy *proxy;
+    WORD funcs, parentfuncs, i;
+    GUID parentiid;
+    HRESULT hr;
+
+    TRACE("typeinfo %p, outer %p, iid %s, proxy_buffer %p, out %p.\n",
+            typeinfo, outer, debugstr_guid(iid), proxy_buffer, out);
+
+    hr = get_iface_info(&typeinfo, &funcs, &parentfuncs, &parentiid);
+    if (FAILED(hr))
+        return hr;
+
+    if (!(proxy = heap_alloc_zero(sizeof(*proxy))))
+    {
+        ERR("Failed to allocate proxy object.\n");
+        return E_OUTOFMEMORY;
+    }
+
+    init_stub_desc(&proxy->stub_desc);
+    proxy->proxy_info.pStubDesc = &proxy->stub_desc;
+
+    proxy->proxy_vtbl = heap_alloc_zero(sizeof(proxy->proxy_vtbl->header) + (funcs + parentfuncs) * sizeof(void *));
+    if (!proxy->proxy_vtbl)
+    {
+        ERR("Failed to allocate proxy vtbl.\n");
+        heap_free(proxy);
+        return E_OUTOFMEMORY;
+    }
+    proxy->proxy_vtbl->header.pStublessProxyInfo = &proxy->proxy_info;
+    proxy->iid = *iid;
+    proxy->proxy_vtbl->header.piid = &proxy->iid;
+    fill_delegated_proxy_table((IUnknownVtbl *)proxy->proxy_vtbl->Vtbl, parentfuncs);
+    for (i = 0; i < funcs; i++)
+        proxy->proxy_vtbl->Vtbl[parentfuncs + i] = (void *)-1;
+
+    hr = build_format_strings(typeinfo, funcs, parentfuncs, &proxy->stub_desc.pFormatTypes,
+            &proxy->proxy_info.ProcFormatString, &proxy->offset_table);
+    if (FAILED(hr))
+    {
+        heap_free(proxy->proxy_vtbl);
+        heap_free(proxy);
+        return hr;
+    }
+    proxy->proxy_info.FormatStringOffset = &proxy->offset_table[-3];
+
+    hr = typelib_proxy_init(proxy, outer, funcs + parentfuncs, &parentiid, proxy_buffer, out);
+    if (FAILED(hr))
+    {
+        heap_free((void *)proxy->stub_desc.pFormatTypes);
+        heap_free((void *)proxy->proxy_info.ProcFormatString);
+        heap_free((void *)proxy->offset_table);
+        heap_free(proxy->proxy_vtbl);
+        heap_free(proxy);
+    }
+
+    return hr;
+}
+
+struct typelib_stub
+{
+    cstdstubbuffer_delegating_t stub;
+    IID iid;
+    MIDL_STUB_DESC stub_desc;
+    MIDL_SERVER_INFO server_info;
+    CInterfaceStubVtbl stub_vtbl;
+    unsigned short *offset_table;
+    PRPC_STUB_FUNCTION *dispatch_table;
+};
+
+static ULONG WINAPI typelib_stub_Release(IRpcStubBuffer *iface)
+{
+    struct typelib_stub *stub = CONTAINING_RECORD(iface, struct typelib_stub, stub.stub_buffer);
+    ULONG refcount = InterlockedDecrement(&stub->stub.stub_buffer.RefCount);
+
+    TRACE("(%p) decreasing refs to %d\n", stub, refcount);
+
+    if (!refcount)
+    {
+        /* test_Release shows that native doesn't call Disconnect here.
+           We'll leave it in for the time being. */
+        IRpcStubBuffer_Disconnect(iface);
+
+        if (stub->stub.base_stub)
+        {
+            IRpcStubBuffer_Release(stub->stub.base_stub);
+            release_delegating_vtbl(stub->stub.base_obj);
+            heap_free(stub->dispatch_table);
+        }
+
+        heap_free((void *)stub->stub_desc.pFormatTypes);
+        heap_free((void *)stub->server_info.ProcString);
+        heap_free(stub->offset_table);
+        heap_free(stub);
+    }
+
+    return refcount;
+}
+
+static HRESULT typelib_stub_init(struct typelib_stub *stub, IUnknown *server,
+        const GUID *parentiid, IRpcStubBuffer **stub_buffer)
+{
+    HRESULT hr;
+
+    hr = IUnknown_QueryInterface(server, stub->stub_vtbl.header.piid,
+            (void **)&stub->stub.stub_buffer.pvServerObject);
+    if (FAILED(hr))
+    {
+        WARN("Failed to get interface %s, hr %#x.\n",
+                debugstr_guid(stub->stub_vtbl.header.piid), hr);
+        stub->stub.stub_buffer.pvServerObject = server;
+        IUnknown_AddRef(server);
+    }
+
+    if (!IsEqualGUID(parentiid, &IID_IUnknown))
+    {
+        stub->stub.base_obj = get_delegating_vtbl(stub->stub_vtbl.header.DispatchTableCount);
+        hr = create_stub(parentiid, (IUnknown *)&stub->stub.base_obj, &stub->stub.base_stub);
+        if (FAILED(hr))
+        {
+            release_delegating_vtbl(stub->stub.base_obj);
+            IUnknown_Release(stub->stub.stub_buffer.pvServerObject);
+            return hr;
+        }
+    }
+
+    stub->stub.stub_buffer.lpVtbl = &stub->stub_vtbl.Vtbl;
+    stub->stub.stub_buffer.RefCount = 1;
+
+    *stub_buffer = (IRpcStubBuffer *)&stub->stub.stub_buffer;
+    return S_OK;
+}
+
+HRESULT WINAPI CreateStubFromTypeInfo(ITypeInfo *typeinfo, REFIID iid,
+        IUnknown *server, IRpcStubBuffer **stub_buffer)
+{
+    WORD funcs, parentfuncs, i;
+    struct typelib_stub *stub;
+    GUID parentiid;
+    HRESULT hr;
+
+    TRACE("typeinfo %p, iid %s, server %p, stub_buffer %p.\n",
+            typeinfo, debugstr_guid(iid), server, stub_buffer);
+
+    hr = get_iface_info(&typeinfo, &funcs, &parentfuncs, &parentiid);
+    if (FAILED(hr))
+        return hr;
+
+    if (!(stub = heap_alloc_zero(sizeof(*stub))))
+    {
+        ERR("Failed to allocate stub object.\n");
+        return E_OUTOFMEMORY;
+    }
+
+    init_stub_desc(&stub->stub_desc);
+    stub->server_info.pStubDesc = &stub->stub_desc;
+
+    hr = build_format_strings(typeinfo, funcs, parentfuncs, &stub->stub_desc.pFormatTypes,
+            &stub->server_info.ProcString, &stub->offset_table);
+    if (FAILED(hr))
+    {
+        heap_free(stub);
+        return hr;
+    }
+    stub->server_info.FmtStringOffset = &stub->offset_table[-3];
+
+    stub->iid = *iid;
+    stub->stub_vtbl.header.piid = &stub->iid;
+    stub->stub_vtbl.header.pServerInfo = &stub->server_info;
+    stub->stub_vtbl.header.DispatchTableCount = funcs + parentfuncs;
+
+    if (!IsEqualGUID(&parentiid, &IID_IUnknown))
+    {
+        stub->dispatch_table = heap_alloc((funcs + parentfuncs) * sizeof(void *));
+        for (i = 3; i < parentfuncs; i++)
+            stub->dispatch_table[i - 3] = NdrStubForwardingFunction;
+        for (; i < funcs + parentfuncs; i++)
+            stub->dispatch_table[i - 3] = (PRPC_STUB_FUNCTION)NdrStubCall2;
+        stub->stub_vtbl.header.pDispatchTable = &stub->dispatch_table[-3];
+        stub->stub_vtbl.Vtbl = CStdStubBuffer_Delegating_Vtbl;
+    }
+    else
+        stub->stub_vtbl.Vtbl = CStdStubBuffer_Vtbl;
+    stub->stub_vtbl.Vtbl.Release = typelib_stub_Release;
+
+    hr = typelib_stub_init(stub, server, &parentiid, stub_buffer);
+    if (FAILED(hr))
+    {
+        heap_free((void *)stub->stub_desc.pFormatTypes);
+        heap_free((void *)stub->server_info.ProcString);
+        heap_free(stub->offset_table);
+        heap_free(stub);
+    }
+
+    return hr;
+}
diff --git a/dll/win32/rpcrt4/ndr_types.idl b/dll/win32/rpcrt4/ndr_types.idl
new file mode 100644 (file)
index 0000000..ff34ae4
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2018 Alexandre Julliard
+ *
+ * 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
+ */
+
+#pragma makedep proxy
+
+import "oaidl.idl";
+
+[
+    object,
+    uuid(bfc61495-76bb-4855-8c2f-3764fd42523a)
+]
+interface dummy : IUnknown
+{
+    void dummy( BSTR a, IUnknown *b, IDispatch *c, VARIANT d, LPSAFEARRAY e, BSTR *last );
+}
index ccf17b9..1230aed 100644 (file)
@@ -80,6 +80,7 @@ static RPC_STATUS RpcAssoc_Alloc(LPCSTR Protseq, LPCSTR NetworkAddr,
     assoc->Endpoint = RPCRT4_strdupA(Endpoint);
     assoc->NetworkOptions = NetworkOptions ? RPCRT4_strdupW(NetworkOptions) : NULL;
     assoc->assoc_group_id = 0;
+    assoc->connection_cnt = 0;
     UuidCreate(&assoc->http_uuid);
     list_init(&assoc->entry);
     *assoc_out = assoc;
@@ -390,14 +391,18 @@ static RpcConnection *RpcAssoc_GetIdleConnection(RpcAssoc *assoc,
 RPC_STATUS RpcAssoc_GetClientConnection(RpcAssoc *assoc,
                                         const RPC_SYNTAX_IDENTIFIER *InterfaceId,
                                         const RPC_SYNTAX_IDENTIFIER *TransferSyntax, RpcAuthInfo *AuthInfo,
-                                        RpcQualityOfService *QOS, LPCWSTR CookieAuth, RpcConnection **Connection)
+                                        RpcQualityOfService *QOS, LPCWSTR CookieAuth,
+                                        RpcConnection **Connection, BOOL *from_cache)
 {
     RpcConnection *NewConnection;
     RPC_STATUS status;
 
     *Connection = RpcAssoc_GetIdleConnection(assoc, InterfaceId, TransferSyntax, AuthInfo, QOS);
-    if (*Connection)
+    if (*Connection) {
+        TRACE("return idle connection %p for association %p\n", *Connection, assoc);
+        if (from_cache) *from_cache = TRUE;
         return RPC_S_OK;
+    }
 
     /* create a new connection */
     status = RPCRT4_CreateConnection(&NewConnection, FALSE /* is this a server connection? */,
@@ -422,8 +427,11 @@ RPC_STATUS RpcAssoc_GetClientConnection(RpcAssoc *assoc,
         return status;
     }
 
-    *Connection = NewConnection;
+    InterlockedIncrement(&assoc->connection_cnt);
 
+    TRACE("return new connection %p for association %p\n", *Connection, assoc);
+    *Connection = NewConnection;
+    if (from_cache) *from_cache = FALSE;
     return RPC_S_OK;
 }
 
@@ -437,6 +445,15 @@ void RpcAssoc_ReleaseIdleConnection(RpcAssoc *assoc, RpcConnection *Connection)
     LeaveCriticalSection(&assoc->cs);
 }
 
+void RpcAssoc_ConnectionReleased(RpcAssoc *assoc)
+{
+    if (InterlockedDecrement(&assoc->connection_cnt))
+        return;
+
+    TRACE("Last %p connection released\n", assoc);
+    assoc->assoc_group_id = 0;
+}
+
 RPC_STATUS RpcServerAssoc_AllocateContextHandle(RpcAssoc *assoc, void *CtxGuard,
                                                 NDR_SCONTEXT *SContext)
 {
index 31cbd8b..b83d549 100644 (file)
@@ -43,6 +43,7 @@ typedef struct _RpcAssoc
     /* client-only */
     /* connections available to be used (protected by cs) */
     struct list free_connection_pool;
+    LONG connection_cnt;
 
     /* server-only */
     struct list context_handle_list; /* protected by cs */
@@ -51,7 +52,7 @@ typedef struct _RpcAssoc
 RPC_STATUS RPCRT4_GetAssociation(LPCSTR Protseq, LPCSTR NetworkAddr, LPCSTR Endpoint, LPCWSTR NetworkOptions, RpcAssoc **assoc) DECLSPEC_HIDDEN;
 RPC_STATUS RpcAssoc_GetClientConnection(RpcAssoc *assoc, const RPC_SYNTAX_IDENTIFIER *InterfaceId,
     const RPC_SYNTAX_IDENTIFIER *TransferSyntax, RpcAuthInfo *AuthInfo, RpcQualityOfService *QOS,
-    LPCWSTR CookieAuth, RpcConnection **Connection) DECLSPEC_HIDDEN;
+    LPCWSTR CookieAuth, RpcConnection **Connection, BOOL *from_cache) DECLSPEC_HIDDEN;
 void RpcAssoc_ReleaseIdleConnection(RpcAssoc *assoc, RpcConnection *Connection) DECLSPEC_HIDDEN;
 ULONG RpcAssoc_Release(RpcAssoc *assoc) DECLSPEC_HIDDEN;
 RPC_STATUS RpcServerAssoc_GetAssociation(LPCSTR Protseq, LPCSTR NetworkAddr, LPCSTR Endpoint, LPCWSTR NetworkOptions, ULONG assoc_gid, RpcAssoc **assoc_out) DECLSPEC_HIDDEN;
@@ -61,3 +62,4 @@ RPC_STATUS RpcServerAssoc_UpdateContextHandle(RpcAssoc *assoc, NDR_SCONTEXT SCon
 unsigned int RpcServerAssoc_ReleaseContextHandle(RpcAssoc *assoc, NDR_SCONTEXT SContext, BOOL release_lock) DECLSPEC_HIDDEN;
 void RpcContextHandle_GetUuid(NDR_SCONTEXT SContext, UUID *uuid) DECLSPEC_HIDDEN;
 BOOL RpcContextHandle_IsGuardCorrect(NDR_SCONTEXT SContext, void *CtxGuard) DECLSPEC_HIDDEN;
+void RpcAssoc_ConnectionReleased(RpcAssoc *assoc) DECLSPEC_HIDDEN;
index 829110f..51bfb97 100644 (file)
@@ -272,13 +272,13 @@ RPC_STATUS RPCRT4_ReleaseBinding(RpcBinding* Binding)
 
 RPC_STATUS RPCRT4_OpenBinding(RpcBinding* Binding, RpcConnection** Connection,
                               const RPC_SYNTAX_IDENTIFIER *TransferSyntax,
-                              const RPC_SYNTAX_IDENTIFIER *InterfaceId)
+                              const RPC_SYNTAX_IDENTIFIER *InterfaceId, BOOL *from_cache)
 {
   TRACE("(Binding == ^%p)\n", Binding);
 
   if (!Binding->server) {
      return RpcAssoc_GetClientConnection(Binding->Assoc, InterfaceId,
-         TransferSyntax, Binding->AuthInfo, Binding->QOS, Binding->CookieAuth, Connection);
+         TransferSyntax, Binding->AuthInfo, Binding->QOS, Binding->CookieAuth, Connection, from_cache);
   } else {
     /* we already have a connection with acceptable binding, so use it */
     if (Binding->FromConn) {
index ca53887..8faacbd 100644 (file)
@@ -174,7 +174,8 @@ RPC_STATUS RPCRT4_MakeBinding(RpcBinding** Binding, RpcConnection* Connection) D
 void       RPCRT4_AddRefBinding(RpcBinding* Binding) DECLSPEC_HIDDEN;
 RPC_STATUS RPCRT4_ReleaseBinding(RpcBinding* Binding) DECLSPEC_HIDDEN;
 RPC_STATUS RPCRT4_OpenBinding(RpcBinding* Binding, RpcConnection** Connection,
-                              const RPC_SYNTAX_IDENTIFIER *TransferSyntax, const RPC_SYNTAX_IDENTIFIER *InterfaceId) DECLSPEC_HIDDEN;
+                              const RPC_SYNTAX_IDENTIFIER *TransferSyntax, const RPC_SYNTAX_IDENTIFIER *InterfaceId,
+                              BOOL *from_cache) DECLSPEC_HIDDEN;
 RPC_STATUS RPCRT4_CloseBinding(RpcBinding* Binding, RpcConnection* Connection) DECLSPEC_HIDDEN;
 
 void rpcrt4_conn_release_and_wait(RpcConnection *connection) DECLSPEC_HIDDEN;
index c2ba446..f5f866e 100644 (file)
@@ -148,7 +148,7 @@ static RPC_STATUS get_epm_handle_client(RPC_BINDING_HANDLE handle, RPC_BINDING_H
     if (bind->server)
         return RPC_S_INVALID_BINDING;
 
-    for (i = 0; i < sizeof(epm_endpoints)/sizeof(epm_endpoints[0]); i++)
+    for (i = 0; i < ARRAY_SIZE(epm_endpoints); i++)
         if (!strcmp(bind->Protseq, epm_endpoints[i].protseq))
             pszEndpoint = epm_endpoints[i].endpoint;
 
@@ -469,7 +469,7 @@ RPC_STATUS WINAPI RpcEpResolveBinding( RPC_BINDING_HANDLE Binding, RPC_IF_HANDLE
   {
     __TRY
     {
-      ept_map(handle, &uuid, tower, &entry_handle, sizeof(towers)/sizeof(towers[0]), &num_towers, towers, &status2);
+      ept_map(handle, &uuid, tower, &entry_handle, ARRAY_SIZE(towers), &num_towers, towers, &status2);
       /* FIXME: translate status2? */
     }
     __EXCEPT(rpc_filter)
index 9642213..59cd438 100644 (file)
@@ -38,6 +38,7 @@
 #include "rpc_binding.h"
 #include "rpc_defs.h"
 #include "rpc_message.h"
+#include "rpc_assoc.h"
 #include "ncastatus.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(rpc);
@@ -62,8 +63,8 @@ DWORD RPCRT4_GetHeaderSize(const RpcPktHdr *Header)
     0, 0, sizeof(Header->auth3), 0, 0, 0, sizeof(Header->http)
   };
   ULONG ret = 0;
-  
-  if (Header->common.ptype < sizeof(header_sizes) / sizeof(header_sizes[0])) {
+
+  if (Header->common.ptype < ARRAY_SIZE(header_sizes)) {
     ret = header_sizes[Header->common.ptype];
     if (ret == 0)
       FIXME("unhandled packet type %u\n", Header->common.ptype);
@@ -690,7 +691,7 @@ RPC_STATUS RPCRT4_default_secure_packet(RpcConnection *Connection,
     SECURITY_STATUS sec_status;
 
     message.ulVersion = SECBUFFER_VERSION;
-    message.cBuffers = sizeof(buffers)/sizeof(buffers[0]);
+    message.cBuffers = ARRAY_SIZE(buffers);
     message.pBuffers = buffers;
 
     buffers[0].cbBuffer = hdr_size;
@@ -1598,7 +1599,7 @@ RPC_STATUS WINAPI I_RpcNegotiateTransferSyntax(PRPC_MESSAGE pMsg)
     }
 
     status = RPCRT4_OpenBinding(bind, &conn, &cif->TransferSyntax,
-                                &cif->InterfaceId);
+                                &cif->InterfaceId, NULL);
 
     if (status == RPC_S_OK)
     {
@@ -1789,26 +1790,39 @@ static DWORD WINAPI async_notifier_proc(LPVOID p)
 RPC_STATUS WINAPI I_RpcSend(PRPC_MESSAGE pMsg)
 {
   RpcBinding* bind = pMsg->Handle;
+  RPC_CLIENT_INTERFACE *cif;
   RpcConnection* conn;
   RPC_STATUS status;
   RpcPktHdr *hdr;
+  BOOL from_cache = TRUE;
 
   TRACE("(%p)\n", pMsg);
   if (!bind || bind->server || !pMsg->ReservedForRuntime) return RPC_S_INVALID_BINDING;
 
-  conn = pMsg->ReservedForRuntime;
-
-  hdr = RPCRT4_BuildRequestHeader(pMsg->DataRepresentation,
-                                  pMsg->BufferLength,
-                                  pMsg->ProcNum & ~RPC_FLAGS_VALID_BIT,
-                                  &bind->ObjectUuid);
-  if (!hdr)
-    return ERROR_OUTOFMEMORY;
-  hdr->common.call_id = conn->NextCallId++;
-
-  status = RPCRT4_Send(conn, hdr, pMsg->Buffer, pMsg->BufferLength);
-
-  RPCRT4_FreeHeader(hdr);
+  for (;;)
+  {
+      conn = pMsg->ReservedForRuntime;
+      hdr = RPCRT4_BuildRequestHeader(pMsg->DataRepresentation,
+                                      pMsg->BufferLength,
+                                      pMsg->ProcNum & ~RPC_FLAGS_VALID_BIT,
+                                      &bind->ObjectUuid);
+      if (!hdr)
+          return ERROR_OUTOFMEMORY;
+
+      hdr->common.call_id = conn->NextCallId++;
+      status = RPCRT4_Send(conn, hdr, pMsg->Buffer, pMsg->BufferLength);
+      RPCRT4_FreeHeader(hdr);
+      if (status == RPC_S_OK || conn->server || !from_cache)
+          break;
+
+      WARN("Send failed, trying to reconnect\n");
+      cif = pMsg->RpcInterfaceInformation;
+      RPCRT4_ReleaseConnection(conn);
+      pMsg->ReservedForRuntime = NULL;
+      status = RPCRT4_OpenBinding(bind, &conn, &cif->TransferSyntax, &cif->InterfaceId, &from_cache);
+      if (status != RPC_S_OK) break;
+      pMsg->ReservedForRuntime = conn;
+  }
 
   if (status == RPC_S_OK && pMsg->RpcFlags & RPC_BUFFER_ASYNC)
   {
index 7672ce3..f4a53ff 100644 (file)
@@ -35,8 +35,6 @@
 #include <string.h>
 #include <assert.h>
 
-
-
 #include "windef.h"
 #include "winbase.h"
 #include "winnls.h"
@@ -59,9 +57,6 @@
 
 #define DEFAULT_NCACN_HTTP_TIMEOUT (60 * 1000)
 
-#undef ARRAYSIZE
-#define ARRAYSIZE(a) (sizeof((a)) / sizeof((a)[0]))
-
 WINE_DEFAULT_DEBUG_CHANNEL(rpc);
 
 #ifdef __REACTOS__ /* FIXME: Inspect */
@@ -258,24 +253,40 @@ static RPC_STATUS rpcrt4_protseq_ncalrpc_open_endpoint(RpcServerProtseq* protseq
   return r;
 }
 
+#ifdef __REACTOS__
 static char *ncacn_pipe_name(const char *server, const char *endpoint)
+#else
+static char *ncacn_pipe_name(const char *endpoint)
+#endif
 {
+#ifdef __REACTOS__
   static const char prefix[] = "\\\\";
   static const char local[] = ".";
   char ComputerName[MAX_COMPUTERNAME_LENGTH + 1];
+#else
+  static const char prefix[] = "\\\\.";
+#endif
   char *pipe_name;
+
+#ifdef __REACTOS__
   DWORD bufLen = ARRAYSIZE(ComputerName);
 
   GetComputerNameA(ComputerName, &bufLen);
 
   if (server == NULL || *server == 0 || stricmp(ComputerName, server) == 0)
       server = local;
+#endif
 
   /* protseq=ncacn_np: named pipes */
+#ifdef __REACTOS__
   pipe_name = I_RpcAllocate(sizeof(prefix) + strlen(server) + strlen(endpoint));
   strcpy(pipe_name, prefix);
   strcat(pipe_name, server);
   strcat(pipe_name, endpoint);
+#else
+  pipe_name = I_RpcAllocate(sizeof(prefix) + strlen(endpoint));
+  strcat(strcpy(pipe_name, prefix), endpoint);
+#endif
   return pipe_name;
 }
 
@@ -289,7 +300,11 @@ static RPC_STATUS rpcrt4_ncacn_np_open(RpcConnection* Connection)
   if (npc->pipe)
     return RPC_S_OK;
 
+#ifdef __REACTOS__
   pname = ncacn_pipe_name(Connection->NetworkAddr, Connection->Endpoint);
+#else
+  pname = ncacn_pipe_name(Connection->Endpoint);
+#endif
   r = rpcrt4_conn_open_pipe(Connection, pname, FALSE);
   I_RpcFree(pname);
 
@@ -317,7 +332,11 @@ static RPC_STATUS rpcrt4_protseq_ncacn_np_open_endpoint(RpcServerProtseq *protse
   if (r != RPC_S_OK)
     return r;
 
+#ifdef __REACTOS__
   ((RpcConnection_np*)Connection)->listen_pipe = ncacn_pipe_name(NULL, Connection->Endpoint);
+#else
+  ((RpcConnection_np*)Connection)->listen_pipe = ncacn_pipe_name(Connection->Endpoint);
+#endif
   r = rpcrt4_conn_create_pipe(Connection);
 
   EnterCriticalSection(&protseq->cs);
@@ -368,7 +387,11 @@ static RPC_STATUS rpcrt4_ncacn_np_is_server_listening(const char *endpoint)
   char *pipe_name;
   RPC_STATUS status;
 
+#ifdef __REACTOS__
   pipe_name = ncacn_pipe_name(NULL, endpoint);
+#else
+  pipe_name = ncacn_pipe_name(endpoint);
+#endif
   status = is_pipe_listening(pipe_name);
   I_RpcFree(pipe_name);
   return status;
@@ -1958,9 +1981,9 @@ static RPC_STATUS rpcrt4_http_internet_connect(RpcConnection_http *httpc)
         static const WCHAR wszRpcProxy[] = {'R','p','c','P','r','o','x','y','=',0};
         static const WCHAR wszHttpProxy[] = {'H','t','t','p','P','r','o','x','y','=',0};
 
-        if (!strncmpiW(option, wszRpcProxy, sizeof(wszRpcProxy)/sizeof(wszRpcProxy[0])-1))
+        if (!strncmpiW(option, wszRpcProxy, ARRAY_SIZE(wszRpcProxy)-1))
         {
-            const WCHAR *value_start = option + sizeof(wszRpcProxy)/sizeof(wszRpcProxy[0])-1;
+            const WCHAR *value_start = option + ARRAY_SIZE(wszRpcProxy)-1;
             const WCHAR *value_end;
             const WCHAR *p;
 
@@ -1977,9 +2000,9 @@ static RPC_STATUS rpcrt4_http_internet_connect(RpcConnection_http *httpc)
             TRACE("RpcProxy value is %s\n", debugstr_wn(value_start, value_end-value_start));
             servername = RPCRT4_strndupW(value_start, value_end-value_start);
         }
-        else if (!strncmpiW(option, wszHttpProxy, sizeof(wszHttpProxy)/sizeof(wszHttpProxy[0])-1))
+        else if (!strncmpiW(option, wszHttpProxy, ARRAY_SIZE(wszHttpProxy)-1))
         {
-            const WCHAR *value_start = option + sizeof(wszHttpProxy)/sizeof(wszHttpProxy[0])-1;
+            const WCHAR *value_start = option + ARRAY_SIZE(wszHttpProxy)-1;
             const WCHAR *value_end;
 
             value_end = strchrW(option, ',');
@@ -2107,7 +2130,7 @@ static RPC_STATUS insert_content_length_header(HINTERNET request, DWORD len)
 {
     static const WCHAR fmtW[] =
         {'C','o','n','t','e','n','t','-','L','e','n','g','t','h',':',' ','%','u','\r','\n',0};
-    WCHAR header[sizeof(fmtW) / sizeof(fmtW[0]) + 10];
+    WCHAR header[ARRAY_SIZE(fmtW) + 10];
 
     sprintfW(header, fmtW, len);
     if ((HttpAddRequestHeadersW(request, header, -1, HTTP_ADDREQ_FLAG_REPLACE | HTTP_ADDREQ_FLAG_ADD))) return RPC_S_OK;
@@ -2436,18 +2459,17 @@ static const struct
 }
 auth_schemes[] =
 {
-    { basicW,     ARRAYSIZE(basicW) - 1,     RPC_C_HTTP_AUTHN_SCHEME_BASIC },
-    { ntlmW,      ARRAYSIZE(ntlmW) - 1,      RPC_C_HTTP_AUTHN_SCHEME_NTLM },
-    { passportW,  ARRAYSIZE(passportW) - 1,  RPC_C_HTTP_AUTHN_SCHEME_PASSPORT },
-    { digestW,    ARRAYSIZE(digestW) - 1,    RPC_C_HTTP_AUTHN_SCHEME_DIGEST },
-    { negotiateW, ARRAYSIZE(negotiateW) - 1, RPC_C_HTTP_AUTHN_SCHEME_NEGOTIATE }
+    { basicW,     ARRAY_SIZE(basicW) - 1,     RPC_C_HTTP_AUTHN_SCHEME_BASIC },
+    { ntlmW,      ARRAY_SIZE(ntlmW) - 1,      RPC_C_HTTP_AUTHN_SCHEME_NTLM },
+    { passportW,  ARRAY_SIZE(passportW) - 1,  RPC_C_HTTP_AUTHN_SCHEME_PASSPORT },
+    { digestW,    ARRAY_SIZE(digestW) - 1,    RPC_C_HTTP_AUTHN_SCHEME_DIGEST },
+    { negotiateW, ARRAY_SIZE(negotiateW) - 1, RPC_C_HTTP_AUTHN_SCHEME_NEGOTIATE }
 };
-static const unsigned int num_auth_schemes = sizeof(auth_schemes)/sizeof(auth_schemes[0]);
 
 static DWORD auth_scheme_from_header( const WCHAR *header )
 {
     unsigned int i;
-    for (i = 0; i < num_auth_schemes; i++)
+    for (i = 0; i < ARRAY_SIZE(auth_schemes); i++)
     {
         if (!strncmpiW( header, auth_schemes[i].str, auth_schemes[i].len ) &&
             (header[auth_schemes[i].len] == ' ' || !header[auth_schemes[i].len])) return auth_schemes[i].scheme;
@@ -2621,7 +2643,7 @@ static RPC_STATUS insert_authorization_header(HINTERNET request, ULONG scheme, c
     static const WCHAR basicW[] = {'B','a','s','i','c',' '};
     static const WCHAR negotiateW[] = {'N','e','g','o','t','i','a','t','e',' '};
     static const WCHAR ntlmW[] = {'N','T','L','M',' '};
-    int scheme_len, auth_len = sizeof(authW) / sizeof(authW[0]), len = ((data_len + 2) * 4) / 3;
+    int scheme_len, auth_len = ARRAY_SIZE(authW), len = ((data_len + 2) * 4) / 3;
     const WCHAR *scheme_str;
     WCHAR *header, *ptr;
     RPC_STATUS status = RPC_S_SERVER_UNAVAILABLE;
@@ -2630,15 +2652,15 @@ static RPC_STATUS insert_authorization_header(HINTERNET request, ULONG scheme, c
     {
     case RPC_C_HTTP_AUTHN_SCHEME_BASIC:
         scheme_str = basicW;
-        scheme_len = sizeof(basicW) / sizeof(basicW[0]);
+        scheme_len = ARRAY_SIZE(basicW);
         break;
     case RPC_C_HTTP_AUTHN_SCHEME_NEGOTIATE:
         scheme_str = negotiateW;
-        scheme_len = sizeof(negotiateW) / sizeof(negotiateW[0]);
+        scheme_len = ARRAY_SIZE(negotiateW);
         break;
     case RPC_C_HTTP_AUTHN_SCHEME_NTLM:
         scheme_str = ntlmW;
-        scheme_len = sizeof(ntlmW) / sizeof(ntlmW[0]);
+        scheme_len = ARRAY_SIZE(ntlmW);
         break;
     default:
         ERR("unknown scheme %u\n", scheme);
@@ -2819,7 +2841,8 @@ static RPC_STATUS rpcrt4_ncacn_http_open(RpcConnection* Connection)
     if (!url)
         return RPC_S_OUT_OF_MEMORY;
     memcpy(url, wszRpcProxyPrefix, sizeof(wszRpcProxyPrefix));
-    MultiByteToWideChar(CP_ACP, 0, Connection->NetworkAddr, -1, url+sizeof(wszRpcProxyPrefix)/sizeof(wszRpcProxyPrefix[0])-1, strlen(Connection->NetworkAddr)+1);
+    MultiByteToWideChar(CP_ACP, 0, Connection->NetworkAddr, -1, url+ARRAY_SIZE(wszRpcProxyPrefix)-1,
+                        strlen(Connection->NetworkAddr)+1);
     strcatW(url, wszColon);
     MultiByteToWideChar(CP_ACP, 0, Connection->Endpoint, -1, url+strlenW(url), strlen(Connection->Endpoint)+1);
 
@@ -3299,7 +3322,7 @@ static const struct protseq_ops protseq_list[] =
 const struct protseq_ops *rpcrt4_get_protseq_ops(const char *protseq)
 {
   unsigned int i;
-  for(i=0; i<ARRAYSIZE(protseq_list); i++)
+  for(i = 0; i < ARRAY_SIZE(protseq_list); i++)
     if (!strcmp(protseq_list[i].name, protseq))
       return &protseq_list[i];
   return NULL;
@@ -3308,7 +3331,7 @@ const struct protseq_ops *rpcrt4_get_protseq_ops(const char *protseq)
 static const struct connection_ops *rpcrt4_get_conn_protseq_ops(const char *protseq)
 {
     unsigned int i;
-    for(i=0; i<ARRAYSIZE(conn_protseq_list); i++)
+    for(i = 0; i < ARRAY_SIZE(conn_protseq_list); i++)
         if (!strcmp(conn_protseq_list[i].name, protseq))
             return &conn_protseq_list[i];
     return NULL;
@@ -3458,6 +3481,7 @@ void RPCRT4_ReleaseConnection(RpcConnection *connection)
 
         /* server-only */
         if (connection->server_binding) RPCRT4_ReleaseBinding(connection->server_binding);
+        else if (connection->assoc) RpcAssoc_ConnectionReleased(connection->assoc);
 
         if (connection->wait_release) SetEvent(connection->wait_release);
 
@@ -3545,7 +3569,7 @@ RPC_STATUS RpcTransport_ParseTopOfTower(const unsigned char *tower_data,
         (floor4->count_lhs != sizeof(floor4->protid)))
         return EPT_S_NOT_REGISTERED;
 
-    for(i = 0; i < ARRAYSIZE(conn_protseq_list); i++)
+    for(i = 0; i < ARRAY_SIZE(conn_protseq_list); i++)
         if ((protocol_floor->protid == conn_protseq_list[i].epm_protocols[0]) &&
             (floor4->protid == conn_protseq_list[i].epm_protocols[1]))
         {
@@ -3651,12 +3675,12 @@ RPC_STATUS WINAPI RpcNetworkInqProtseqsW( RPC_PROTSEQ_VECTORW** protseqs )
 
   TRACE("(%p)\n", protseqs);
 
-  *protseqs = HeapAlloc(GetProcessHeap(), 0, sizeof(RPC_PROTSEQ_VECTORW)+(sizeof(unsigned short*)*ARRAYSIZE(protseq_list)));
+  *protseqs = HeapAlloc(GetProcessHeap(), 0, sizeof(RPC_PROTSEQ_VECTORW)+(sizeof(unsigned short*)*ARRAY_SIZE(protseq_list)));
   if (!*protseqs)
     goto end;
   pvector = *protseqs;
   pvector->Count = 0;
-  for (i = 0; i < ARRAYSIZE(protseq_list); i++)
+  for (i = 0; i < ARRAY_SIZE(protseq_list); i++)
   {
     pvector->Protseq[i] = HeapAlloc(GetProcessHeap(), 0, (strlen(protseq_list[i].name)+1)*sizeof(unsigned short));
     if (pvector->Protseq[i] == NULL)
@@ -3684,12 +3708,12 @@ RPC_STATUS WINAPI RpcNetworkInqProtseqsA(RPC_PROTSEQ_VECTORA** protseqs)
 
   TRACE("(%p)\n", protseqs);
 
-  *protseqs = HeapAlloc(GetProcessHeap(), 0, sizeof(RPC_PROTSEQ_VECTORW)+(sizeof(unsigned char*)*ARRAYSIZE(protseq_list)));
+  *protseqs = HeapAlloc(GetProcessHeap(), 0, sizeof(RPC_PROTSEQ_VECTORW)+(sizeof(unsigned char*)*ARRAY_SIZE(protseq_list)));
   if (!*protseqs)
     goto end;
   pvector = *protseqs;
   pvector->Count = 0;
-  for (i = 0; i < ARRAYSIZE(protseq_list); i++)
+  for (i = 0; i < ARRAY_SIZE(protseq_list); i++)
   {
     pvector->Protseq[i] = HeapAlloc(GetProcessHeap(), 0, strlen(protseq_list[i].name)+1);
     if (pvector->Protseq[i] == NULL)
index dc4fb2e..7bc8f6f 100644 (file)
@@ -44,7 +44,7 @@
 44 stub I_RpcConnectionSetSockBuffSize
 45 stub I_RpcDeleteMutex
 46 stub I_RpcEnableWmiTrace
-47 stdcall I_RpcExceptionFilter(long)
+47 stdcall I_RpcExceptionFilter(long) RpcExceptionFilter
 48 stdcall I_RpcFree(ptr)
 49 stdcall I_RpcFreeBuffer(ptr)
 50 stub I_RpcFreePipeBuffer
index 15bba49..a900201 100644 (file)
@@ -854,9 +854,10 @@ LONG WINAPI I_RpcMapWin32Status(RPC_STATUS status)
 }
 
 /******************************************************************************
+ * RpcExceptionFilter     (rpcrt4.@)
  * I_RpcExceptionFilter   (rpcrt4.@)
  */
-int WINAPI I_RpcExceptionFilter(ULONG ExceptionCode)
+int WINAPI RpcExceptionFilter(ULONG ExceptionCode)
 {
     TRACE("0x%x\n", ExceptionCode);
     switch (ExceptionCode)
index 27033f2..3ebbe55 100644 (file)
@@ -160,7 +160,7 @@ reactos/dll/win32/rasapi32            # Synced to WineStaging-3.3
 reactos/dll/win32/resutils            # Synced to WineStaging-3.3
 reactos/dll/win32/riched20            # Synced to WineStaging-3.9
 reactos/dll/win32/riched32            # Synced to WineStaging-3.3
-reactos/dll/win32/rpcrt4              # Synced to WineStaging-3.9
+reactos/dll/win32/rpcrt4              # Synced to WineStaging-4.0
 reactos/dll/win32/rsabase             # Synced to WineStaging-3.3
 reactos/dll/win32/rsaenh              # Synced to WineStaging-2.9
 reactos/dll/win32/sccbase             # Synced to WineStaging-3.3