mirror of
https://github.com/reactos/reactos.git
synced 2025-05-22 02:25:18 +00:00
[RPCRT4] Sync with Wine Staging 1.7.55. CORE-10536
svn path=/trunk/; revision=69906
This commit is contained in:
parent
526d3c033c
commit
ada28839e7
20 changed files with 776 additions and 326 deletions
|
@ -1,4 +1,7 @@
|
||||||
|
|
||||||
|
remove_definitions(-D_WIN32_WINNT=0x502)
|
||||||
|
add_definitions(-D_WIN32_WINNT=0x600)
|
||||||
|
|
||||||
include_directories(BEFORE ${REACTOS_SOURCE_DIR}/include/reactos/wine)
|
include_directories(BEFORE ${REACTOS_SOURCE_DIR}/include/reactos/wine)
|
||||||
spec2def(rpcrt4.dll rpcrt4.spec ADD_IMPORTLIB)
|
spec2def(rpcrt4.dll rpcrt4.spec ADD_IMPORTLIB)
|
||||||
add_rpc_files(client epm.idl)
|
add_rpc_files(client epm.idl)
|
||||||
|
@ -49,6 +52,6 @@ add_library(rpcrt4 SHARED
|
||||||
set_module_type(rpcrt4 win32dll)
|
set_module_type(rpcrt4 win32dll)
|
||||||
target_link_libraries(rpcrt4 wine uuid ${PSEH_LIB})
|
target_link_libraries(rpcrt4 wine uuid ${PSEH_LIB})
|
||||||
add_delay_importlibs(rpcrt4 iphlpapi wininet secur32 user32)
|
add_delay_importlibs(rpcrt4 iphlpapi wininet secur32 user32)
|
||||||
add_importlibs(rpcrt4 advapi32 ws2_32 shlwapi msvcrt kernel32 ntdll)
|
add_importlibs(rpcrt4 advapi32 advapi32_vista ws2_32 msvcrt kernel32 ntdll)
|
||||||
add_pch(rpcrt4 precomp.h SOURCE)
|
add_pch(rpcrt4 precomp.h SOURCE)
|
||||||
add_cd_file(TARGET rpcrt4 DESTINATION reactos/system32 FOR all)
|
add_cd_file(TARGET rpcrt4 DESTINATION reactos/system32 FOR all)
|
||||||
|
|
|
@ -314,7 +314,7 @@ HRESULT WINAPI NdrDllUnregisterProxy(HMODULE hDll,
|
||||||
|
|
||||||
strcpyW( keyname, interfaceW );
|
strcpyW( keyname, interfaceW );
|
||||||
format_clsid( keyname + strlenW(keyname), proxy->header.piid );
|
format_clsid( keyname + strlenW(keyname), proxy->header.piid );
|
||||||
SHDeleteKeyW(HKEY_CLASSES_ROOT, keyname);
|
RegDeleteTreeW(HKEY_CLASSES_ROOT, keyname);
|
||||||
}
|
}
|
||||||
pProxyFileList++;
|
pProxyFileList++;
|
||||||
}
|
}
|
||||||
|
@ -322,7 +322,7 @@ HRESULT WINAPI NdrDllUnregisterProxy(HMODULE hDll,
|
||||||
/* unregister clsid */
|
/* unregister clsid */
|
||||||
strcpyW( keyname, clsidW );
|
strcpyW( keyname, clsidW );
|
||||||
strcatW( keyname, clsid );
|
strcatW( keyname, clsid );
|
||||||
SHDeleteKeyW(HKEY_CLASSES_ROOT, keyname);
|
RegDeleteTreeW(HKEY_CLASSES_ROOT, keyname);
|
||||||
|
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,7 +41,7 @@ typedef struct
|
||||||
|
|
||||||
static inline cstdstubbuffer_delegating_t *impl_from_delegating( IRpcStubBuffer *iface )
|
static inline cstdstubbuffer_delegating_t *impl_from_delegating( IRpcStubBuffer *iface )
|
||||||
{
|
{
|
||||||
return (cstdstubbuffer_delegating_t*)((char *)iface - FIELD_OFFSET(cstdstubbuffer_delegating_t, stub_buffer));
|
return CONTAINING_RECORD(iface, cstdstubbuffer_delegating_t, stub_buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT CStdStubBuffer_Construct(REFIID riid,
|
HRESULT CStdStubBuffer_Construct(REFIID riid,
|
||||||
|
|
|
@ -105,6 +105,7 @@ unsigned char* WINAPI NdrServerInitializeNew( PRPC_MESSAGE pRpcMsg, PMIDL_STUB_M
|
||||||
pStubMsg->pPointerQueueState = NULL;
|
pStubMsg->pPointerQueueState = NULL;
|
||||||
pStubMsg->IgnoreEmbeddedPointers = 0;
|
pStubMsg->IgnoreEmbeddedPointers = 0;
|
||||||
pStubMsg->PointerBufferMark = NULL;
|
pStubMsg->PointerBufferMark = NULL;
|
||||||
|
pStubMsg->CorrDespIncrement = 0;
|
||||||
pStubMsg->uFlags = 0;
|
pStubMsg->uFlags = 0;
|
||||||
pStubMsg->UniquePtrCount = 0;
|
pStubMsg->UniquePtrCount = 0;
|
||||||
pStubMsg->pfnAllocate = pStubDesc->pfnAllocate;
|
pStubMsg->pfnAllocate = pStubDesc->pfnAllocate;
|
||||||
|
|
|
@ -84,7 +84,7 @@ RPC_BINDING_HANDLE WINAPI NDRCContextBinding(NDR_CCONTEXT CContext)
|
||||||
if (!handle)
|
if (!handle)
|
||||||
{
|
{
|
||||||
ERR("invalid handle %p\n", CContext);
|
ERR("invalid handle %p\n", CContext);
|
||||||
RpcRaiseException(ERROR_INVALID_HANDLE);
|
RpcRaiseException(RPC_X_SS_CONTEXT_MISMATCH);
|
||||||
}
|
}
|
||||||
return handle;
|
return handle;
|
||||||
}
|
}
|
||||||
|
@ -150,7 +150,15 @@ void WINAPI RpcSsDestroyClientContext(void **ContextHandle)
|
||||||
RpcRaiseException(status);
|
RpcRaiseException(status);
|
||||||
}
|
}
|
||||||
|
|
||||||
static UINT ndr_update_context_handle(NDR_CCONTEXT *CContext,
|
/***********************************************************************
|
||||||
|
* RpcSsDontSerializeContext [RPCRT4.@]
|
||||||
|
*/
|
||||||
|
void WINAPI RpcSsDontSerializeContext(void)
|
||||||
|
{
|
||||||
|
FIXME("stub\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
static RPC_STATUS ndr_update_context_handle(NDR_CCONTEXT *CContext,
|
||||||
RPC_BINDING_HANDLE hBinding,
|
RPC_BINDING_HANDLE hBinding,
|
||||||
const ndr_context_handle *chi)
|
const ndr_context_handle *chi)
|
||||||
{
|
{
|
||||||
|
@ -163,7 +171,7 @@ static UINT ndr_update_context_handle(NDR_CCONTEXT *CContext,
|
||||||
{
|
{
|
||||||
che = get_context_entry(*CContext);
|
che = get_context_entry(*CContext);
|
||||||
if (!che)
|
if (!che)
|
||||||
return ERROR_INVALID_HANDLE;
|
return RPC_X_SS_CONTEXT_MISMATCH;
|
||||||
list_remove(&che->entry);
|
list_remove(&che->entry);
|
||||||
RpcBindingFree(&che->handle);
|
RpcBindingFree(&che->handle);
|
||||||
HeapFree(GetProcessHeap(), 0, che);
|
HeapFree(GetProcessHeap(), 0, che);
|
||||||
|
@ -175,7 +183,7 @@ static UINT ndr_update_context_handle(NDR_CCONTEXT *CContext,
|
||||||
{
|
{
|
||||||
che = HeapAlloc(GetProcessHeap(), 0, sizeof *che);
|
che = HeapAlloc(GetProcessHeap(), 0, sizeof *che);
|
||||||
if (!che)
|
if (!che)
|
||||||
return ERROR_NOT_ENOUGH_MEMORY;
|
return RPC_X_NO_MEMORY;
|
||||||
che->magic = NDR_CONTEXT_HANDLE_MAGIC;
|
che->magic = NDR_CONTEXT_HANDLE_MAGIC;
|
||||||
RpcBindingCopy(hBinding, &che->handle);
|
RpcBindingCopy(hBinding, &che->handle);
|
||||||
list_add_tail(&context_handle_list, &che->entry);
|
list_add_tail(&context_handle_list, &che->entry);
|
||||||
|
@ -184,7 +192,7 @@ static UINT ndr_update_context_handle(NDR_CCONTEXT *CContext,
|
||||||
|
|
||||||
*CContext = che;
|
*CContext = che;
|
||||||
|
|
||||||
return ERROR_SUCCESS;
|
return RPC_S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
@ -194,16 +202,16 @@ void WINAPI NDRCContextUnmarshall(NDR_CCONTEXT *CContext,
|
||||||
RPC_BINDING_HANDLE hBinding,
|
RPC_BINDING_HANDLE hBinding,
|
||||||
void *pBuff, ULONG DataRepresentation)
|
void *pBuff, ULONG DataRepresentation)
|
||||||
{
|
{
|
||||||
UINT r;
|
RPC_STATUS status;
|
||||||
|
|
||||||
TRACE("*%p=(%p) %p %p %08x\n",
|
TRACE("*%p=(%p) %p %p %08x\n",
|
||||||
CContext, *CContext, hBinding, pBuff, DataRepresentation);
|
CContext, *CContext, hBinding, pBuff, DataRepresentation);
|
||||||
|
|
||||||
EnterCriticalSection(&ndr_context_cs);
|
EnterCriticalSection(&ndr_context_cs);
|
||||||
r = ndr_update_context_handle(CContext, hBinding, pBuff);
|
status = ndr_update_context_handle(CContext, hBinding, pBuff);
|
||||||
LeaveCriticalSection(&ndr_context_cs);
|
LeaveCriticalSection(&ndr_context_cs);
|
||||||
if (r)
|
if (status)
|
||||||
RpcRaiseException(r);
|
RpcRaiseException(status);
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
@ -248,7 +256,7 @@ void WINAPI NDRSContextMarshall2(RPC_BINDING_HANDLE hBinding,
|
||||||
hBinding, SContext, pBuff, userRunDownIn, CtxGuard, Flags);
|
hBinding, SContext, pBuff, userRunDownIn, CtxGuard, Flags);
|
||||||
|
|
||||||
if (!binding->server || !binding->Assoc)
|
if (!binding->server || !binding->Assoc)
|
||||||
RpcRaiseException(ERROR_INVALID_HANDLE);
|
RpcRaiseException(RPC_S_INVALID_BINDING);
|
||||||
|
|
||||||
if (Flags & RPC_CONTEXT_HANDLE_FLAGS)
|
if (Flags & RPC_CONTEXT_HANDLE_FLAGS)
|
||||||
FIXME("unimplemented flags: 0x%x\n", Flags & RPC_CONTEXT_HANDLE_FLAGS);
|
FIXME("unimplemented flags: 0x%x\n", Flags & RPC_CONTEXT_HANDLE_FLAGS);
|
||||||
|
@ -267,7 +275,7 @@ void WINAPI NDRSContextMarshall2(RPC_BINDING_HANDLE hBinding,
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!RpcContextHandle_IsGuardCorrect(SContext, CtxGuard))
|
if (!RpcContextHandle_IsGuardCorrect(SContext, CtxGuard))
|
||||||
RpcRaiseException(ERROR_INVALID_HANDLE);
|
RpcRaiseException(RPC_X_SS_CONTEXT_MISMATCH);
|
||||||
memset(ndr, 0, sizeof(*ndr));
|
memset(ndr, 0, sizeof(*ndr));
|
||||||
|
|
||||||
RPCRT4_RemoveThreadContextHandle(SContext);
|
RPCRT4_RemoveThreadContextHandle(SContext);
|
||||||
|
@ -322,7 +330,7 @@ NDR_SCONTEXT WINAPI NDRSContextUnmarshall2(RPC_BINDING_HANDLE hBinding,
|
||||||
hBinding, pBuff, DataRepresentation, CtxGuard, Flags);
|
hBinding, pBuff, DataRepresentation, CtxGuard, Flags);
|
||||||
|
|
||||||
if (!binding->server || !binding->Assoc)
|
if (!binding->server || !binding->Assoc)
|
||||||
RpcRaiseException(ERROR_INVALID_HANDLE);
|
RpcRaiseException(RPC_S_INVALID_BINDING);
|
||||||
|
|
||||||
if (Flags & RPC_CONTEXT_HANDLE_FLAGS)
|
if (Flags & RPC_CONTEXT_HANDLE_FLAGS)
|
||||||
FIXME("unimplemented flags: 0x%x\n", Flags & RPC_CONTEXT_HANDLE_FLAGS);
|
FIXME("unimplemented flags: 0x%x\n", Flags & RPC_CONTEXT_HANDLE_FLAGS);
|
||||||
|
@ -336,7 +344,7 @@ NDR_SCONTEXT WINAPI NDRSContextUnmarshall2(RPC_BINDING_HANDLE hBinding,
|
||||||
if (context_ndr->attributes)
|
if (context_ndr->attributes)
|
||||||
{
|
{
|
||||||
ERR("non-null attributes 0x%x\n", context_ndr->attributes);
|
ERR("non-null attributes 0x%x\n", context_ndr->attributes);
|
||||||
status = ERROR_INVALID_HANDLE;
|
status = RPC_X_SS_CONTEXT_MISMATCH;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
status = RpcServerAssoc_FindContextHandle(binding->Assoc,
|
status = RpcServerAssoc_FindContextHandle(binding->Assoc,
|
||||||
|
|
|
@ -30,6 +30,7 @@ static inline void init_MIDL_ES_MESSAGE(MIDL_ES_MESSAGE *pEsMsg)
|
||||||
/* even if we are unmarshalling, as we don't want pointers to be pointed
|
/* even if we are unmarshalling, as we don't want pointers to be pointed
|
||||||
* to buffer memory */
|
* to buffer memory */
|
||||||
pEsMsg->StubMsg.IsClient = TRUE;
|
pEsMsg->StubMsg.IsClient = TRUE;
|
||||||
|
pEsMsg->MesVersion = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
@ -45,7 +46,7 @@ RPC_STATUS WINAPI MesEncodeIncrementalHandleCreate(
|
||||||
|
|
||||||
pEsMsg = HeapAlloc(GetProcessHeap(), 0, sizeof(*pEsMsg));
|
pEsMsg = HeapAlloc(GetProcessHeap(), 0, sizeof(*pEsMsg));
|
||||||
if (!pEsMsg)
|
if (!pEsMsg)
|
||||||
return ERROR_OUTOFMEMORY;
|
return RPC_S_OUT_OF_MEMORY;
|
||||||
|
|
||||||
init_MIDL_ES_MESSAGE(pEsMsg);
|
init_MIDL_ES_MESSAGE(pEsMsg);
|
||||||
|
|
||||||
|
@ -72,7 +73,7 @@ RPC_STATUS WINAPI MesDecodeIncrementalHandleCreate(
|
||||||
|
|
||||||
pEsMsg = HeapAlloc(GetProcessHeap(), 0, sizeof(*pEsMsg));
|
pEsMsg = HeapAlloc(GetProcessHeap(), 0, sizeof(*pEsMsg));
|
||||||
if (!pEsMsg)
|
if (!pEsMsg)
|
||||||
return ERROR_OUTOFMEMORY;
|
return RPC_S_OUT_OF_MEMORY;
|
||||||
|
|
||||||
init_MIDL_ES_MESSAGE(pEsMsg);
|
init_MIDL_ES_MESSAGE(pEsMsg);
|
||||||
|
|
||||||
|
@ -110,6 +111,40 @@ RPC_STATUS WINAPI MesIncrementalHandleReset(
|
||||||
return RPC_S_OK;
|
return RPC_S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* MesBufferHandleReset [RPCRT4.@]
|
||||||
|
*/
|
||||||
|
RPC_STATUS WINAPI MesBufferHandleReset(handle_t Handle, ULONG HandleStyle,
|
||||||
|
MIDL_ES_CODE Operation, char **Buffer, ULONG BufferSize, ULONG *EncodedSize)
|
||||||
|
{
|
||||||
|
MIDL_ES_MESSAGE *pEsMsg = (MIDL_ES_MESSAGE *)Handle;
|
||||||
|
|
||||||
|
TRACE("(%p, %u, %d, %p, %u, %p)\n", Handle, HandleStyle, Operation, Buffer,
|
||||||
|
BufferSize, EncodedSize);
|
||||||
|
|
||||||
|
if (!Handle || !Buffer || !EncodedSize)
|
||||||
|
return RPC_S_INVALID_ARG;
|
||||||
|
|
||||||
|
if (Operation != MES_ENCODE && Operation != MES_DECODE && Operation != MES_ENCODE_NDR64)
|
||||||
|
return RPC_S_INVALID_ARG;
|
||||||
|
|
||||||
|
if (HandleStyle != MES_FIXED_BUFFER_HANDLE && HandleStyle != MES_DYNAMIC_BUFFER_HANDLE)
|
||||||
|
return RPC_S_INVALID_ARG;
|
||||||
|
|
||||||
|
init_MIDL_ES_MESSAGE(pEsMsg);
|
||||||
|
|
||||||
|
pEsMsg->Operation = Operation;
|
||||||
|
pEsMsg->HandleStyle = HandleStyle;
|
||||||
|
if (HandleStyle == MES_FIXED_BUFFER_HANDLE)
|
||||||
|
pEsMsg->Buffer = (unsigned char*)*Buffer;
|
||||||
|
else
|
||||||
|
pEsMsg->pDynBuffer = (unsigned char**)Buffer;
|
||||||
|
pEsMsg->BufferSize = BufferSize;
|
||||||
|
pEsMsg->pEncodedSize = EncodedSize;
|
||||||
|
|
||||||
|
return RPC_S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* MesHandleFree [RPCRT4.@]
|
* MesHandleFree [RPCRT4.@]
|
||||||
*/
|
*/
|
||||||
|
@ -120,6 +155,17 @@ RPC_STATUS WINAPI MesHandleFree(handle_t Handle)
|
||||||
return RPC_S_OK;
|
return RPC_S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static RPC_STATUS validate_mes_buffer_pointer(const char *Buffer)
|
||||||
|
{
|
||||||
|
if (!Buffer)
|
||||||
|
return RPC_S_INVALID_ARG;
|
||||||
|
|
||||||
|
if (((ULONG_PTR)Buffer & 7) != 0)
|
||||||
|
return RPC_X_INVALID_BUFFER;
|
||||||
|
|
||||||
|
return RPC_S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* MesEncodeFixedBufferHandleCreate [RPCRT4.@]
|
* MesEncodeFixedBufferHandleCreate [RPCRT4.@]
|
||||||
*/
|
*/
|
||||||
|
@ -127,12 +173,21 @@ RPC_STATUS RPC_ENTRY MesEncodeFixedBufferHandleCreate(
|
||||||
char *Buffer, ULONG BufferSize, ULONG *pEncodedSize, handle_t *pHandle)
|
char *Buffer, ULONG BufferSize, ULONG *pEncodedSize, handle_t *pHandle)
|
||||||
{
|
{
|
||||||
MIDL_ES_MESSAGE *pEsMsg;
|
MIDL_ES_MESSAGE *pEsMsg;
|
||||||
|
RPC_STATUS status;
|
||||||
|
|
||||||
TRACE("(%p, %d, %p, %p)\n", Buffer, BufferSize, pEncodedSize, pHandle);
|
TRACE("(%p, %d, %p, %p)\n", Buffer, BufferSize, pEncodedSize, pHandle);
|
||||||
|
|
||||||
|
if ((status = validate_mes_buffer_pointer(Buffer)))
|
||||||
|
return status;
|
||||||
|
|
||||||
|
if (!pEncodedSize)
|
||||||
|
return RPC_S_INVALID_ARG;
|
||||||
|
|
||||||
|
/* FIXME: check BufferSize too */
|
||||||
|
|
||||||
pEsMsg = HeapAlloc(GetProcessHeap(), 0, sizeof(*pEsMsg));
|
pEsMsg = HeapAlloc(GetProcessHeap(), 0, sizeof(*pEsMsg));
|
||||||
if (!pEsMsg)
|
if (!pEsMsg)
|
||||||
return ERROR_OUTOFMEMORY;
|
return RPC_S_OUT_OF_MEMORY;
|
||||||
|
|
||||||
init_MIDL_ES_MESSAGE(pEsMsg);
|
init_MIDL_ES_MESSAGE(pEsMsg);
|
||||||
|
|
||||||
|
@ -150,10 +205,29 @@ RPC_STATUS RPC_ENTRY MesEncodeFixedBufferHandleCreate(
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* MesEncodeDynBufferHandleCreate [RPCRT4.@]
|
* MesEncodeDynBufferHandleCreate [RPCRT4.@]
|
||||||
*/
|
*/
|
||||||
RPC_STATUS RPC_ENTRY MesEncodeDynBufferHandleCreate(char **ppBuffer,
|
RPC_STATUS RPC_ENTRY MesEncodeDynBufferHandleCreate(char **Buffer,
|
||||||
ULONG *pEncodedSize, handle_t *pHandle)
|
ULONG *pEncodedSize, handle_t *pHandle)
|
||||||
{
|
{
|
||||||
FIXME("%p %p %p stub\n", ppBuffer, pEncodedSize, pHandle);
|
MIDL_ES_MESSAGE *pEsMsg;
|
||||||
|
|
||||||
|
TRACE("(%p, %p, %p)\n", Buffer, pEncodedSize, pHandle);
|
||||||
|
|
||||||
|
if (!pEncodedSize)
|
||||||
|
return RPC_S_INVALID_ARG;
|
||||||
|
|
||||||
|
pEsMsg = HeapAlloc(GetProcessHeap(), 0, sizeof(*pEsMsg));
|
||||||
|
if (!pEsMsg)
|
||||||
|
return RPC_S_OUT_OF_MEMORY;
|
||||||
|
|
||||||
|
init_MIDL_ES_MESSAGE(pEsMsg);
|
||||||
|
|
||||||
|
pEsMsg->Operation = MES_ENCODE;
|
||||||
|
pEsMsg->HandleStyle = MES_DYNAMIC_BUFFER_HANDLE;
|
||||||
|
pEsMsg->pDynBuffer = (unsigned char **)Buffer;
|
||||||
|
pEsMsg->pEncodedSize = pEncodedSize;
|
||||||
|
|
||||||
|
*pHandle = (handle_t)pEsMsg;
|
||||||
|
|
||||||
return RPC_S_OK;
|
return RPC_S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -164,12 +238,16 @@ RPC_STATUS RPC_ENTRY MesDecodeBufferHandleCreate(
|
||||||
char *Buffer, ULONG BufferSize, handle_t *pHandle)
|
char *Buffer, ULONG BufferSize, handle_t *pHandle)
|
||||||
{
|
{
|
||||||
MIDL_ES_MESSAGE *pEsMsg;
|
MIDL_ES_MESSAGE *pEsMsg;
|
||||||
|
RPC_STATUS status;
|
||||||
|
|
||||||
TRACE("(%p, %d, %p)\n", Buffer, BufferSize, pHandle);
|
TRACE("(%p, %d, %p)\n", Buffer, BufferSize, pHandle);
|
||||||
|
|
||||||
|
if ((status = validate_mes_buffer_pointer(Buffer)))
|
||||||
|
return status;
|
||||||
|
|
||||||
pEsMsg = HeapAlloc(GetProcessHeap(), 0, sizeof(*pEsMsg));
|
pEsMsg = HeapAlloc(GetProcessHeap(), 0, sizeof(*pEsMsg));
|
||||||
if (!pEsMsg)
|
if (!pEsMsg)
|
||||||
return ERROR_OUTOFMEMORY;
|
return RPC_S_OUT_OF_MEMORY;
|
||||||
|
|
||||||
init_MIDL_ES_MESSAGE(pEsMsg);
|
init_MIDL_ES_MESSAGE(pEsMsg);
|
||||||
|
|
||||||
|
@ -193,7 +271,7 @@ static void es_data_alloc(MIDL_ES_MESSAGE *pEsMsg, ULONG size)
|
||||||
if (tmpsize < size)
|
if (tmpsize < size)
|
||||||
{
|
{
|
||||||
ERR("not enough bytes allocated - requested %d, got %d\n", size, tmpsize);
|
ERR("not enough bytes allocated - requested %d, got %d\n", size, tmpsize);
|
||||||
RpcRaiseException(ERROR_OUTOFMEMORY);
|
RpcRaiseException(RPC_S_OUT_OF_MEMORY);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (pEsMsg->HandleStyle == MES_FIXED_BUFFER_HANDLE)
|
else if (pEsMsg->HandleStyle == MES_FIXED_BUFFER_HANDLE)
|
||||||
|
@ -214,7 +292,7 @@ static void es_data_read(MIDL_ES_MESSAGE *pEsMsg, ULONG size)
|
||||||
if (tmpsize < size)
|
if (tmpsize < size)
|
||||||
{
|
{
|
||||||
ERR("not enough bytes read - requested %d, got %d\n", size, tmpsize);
|
ERR("not enough bytes read - requested %d, got %d\n", size, tmpsize);
|
||||||
RpcRaiseException(ERROR_OUTOFMEMORY);
|
RpcRaiseException(RPC_S_OUT_OF_MEMORY);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -183,7 +183,9 @@ const NDR_MARSHALL NdrMarshaller[NDR_TABLE_SIZE] = {
|
||||||
NdrUserMarshalMarshall,
|
NdrUserMarshalMarshall,
|
||||||
0, 0,
|
0, 0,
|
||||||
/* 0xb7 */
|
/* 0xb7 */
|
||||||
NdrRangeMarshall
|
NdrRangeMarshall,
|
||||||
|
NdrBaseTypeMarshall,
|
||||||
|
NdrBaseTypeMarshall
|
||||||
};
|
};
|
||||||
const NDR_UNMARSHALL NdrUnmarshaller[NDR_TABLE_SIZE] = {
|
const NDR_UNMARSHALL NdrUnmarshaller[NDR_TABLE_SIZE] = {
|
||||||
0,
|
0,
|
||||||
|
@ -225,7 +227,9 @@ const NDR_UNMARSHALL NdrUnmarshaller[NDR_TABLE_SIZE] = {
|
||||||
NdrUserMarshalUnmarshall,
|
NdrUserMarshalUnmarshall,
|
||||||
0, 0,
|
0, 0,
|
||||||
/* 0xb7 */
|
/* 0xb7 */
|
||||||
NdrRangeUnmarshall
|
NdrRangeUnmarshall,
|
||||||
|
NdrBaseTypeUnmarshall,
|
||||||
|
NdrBaseTypeUnmarshall
|
||||||
};
|
};
|
||||||
const NDR_BUFFERSIZE NdrBufferSizer[NDR_TABLE_SIZE] = {
|
const NDR_BUFFERSIZE NdrBufferSizer[NDR_TABLE_SIZE] = {
|
||||||
0,
|
0,
|
||||||
|
@ -267,7 +271,9 @@ const NDR_BUFFERSIZE NdrBufferSizer[NDR_TABLE_SIZE] = {
|
||||||
NdrUserMarshalBufferSize,
|
NdrUserMarshalBufferSize,
|
||||||
0, 0,
|
0, 0,
|
||||||
/* 0xb7 */
|
/* 0xb7 */
|
||||||
NdrRangeBufferSize
|
NdrRangeBufferSize,
|
||||||
|
NdrBaseTypeBufferSize,
|
||||||
|
NdrBaseTypeBufferSize
|
||||||
};
|
};
|
||||||
const NDR_MEMORYSIZE NdrMemorySizer[NDR_TABLE_SIZE] = {
|
const NDR_MEMORYSIZE NdrMemorySizer[NDR_TABLE_SIZE] = {
|
||||||
0,
|
0,
|
||||||
|
@ -309,7 +315,9 @@ const NDR_MEMORYSIZE NdrMemorySizer[NDR_TABLE_SIZE] = {
|
||||||
NdrUserMarshalMemorySize,
|
NdrUserMarshalMemorySize,
|
||||||
0, 0,
|
0, 0,
|
||||||
/* 0xb7 */
|
/* 0xb7 */
|
||||||
NdrRangeMemorySize
|
NdrRangeMemorySize,
|
||||||
|
NdrBaseTypeMemorySize,
|
||||||
|
NdrBaseTypeMemorySize
|
||||||
};
|
};
|
||||||
const NDR_FREE NdrFreer[NDR_TABLE_SIZE] = {
|
const NDR_FREE NdrFreer[NDR_TABLE_SIZE] = {
|
||||||
0,
|
0,
|
||||||
|
@ -350,7 +358,9 @@ const NDR_FREE NdrFreer[NDR_TABLE_SIZE] = {
|
||||||
NdrUserMarshalFree,
|
NdrUserMarshalFree,
|
||||||
0, 0,
|
0, 0,
|
||||||
/* 0xb7 */
|
/* 0xb7 */
|
||||||
NdrRangeFree
|
NdrRangeFree,
|
||||||
|
NdrBaseTypeFree,
|
||||||
|
NdrBaseTypeFree
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct _NDR_MEMORY_LIST
|
typedef struct _NDR_MEMORY_LIST
|
||||||
|
@ -377,7 +387,7 @@ typedef struct _NDR_MEMORY_LIST
|
||||||
*
|
*
|
||||||
* NOTES
|
* NOTES
|
||||||
* The memory block is always 8-byte aligned.
|
* The memory block is always 8-byte aligned.
|
||||||
* If the function is unable to allocate memory an ERROR_OUTOFMEMORY
|
* If the function is unable to allocate memory an RPC_X_NO_MEMORY
|
||||||
* exception is raised.
|
* exception is raised.
|
||||||
*/
|
*/
|
||||||
void * WINAPI NdrAllocate(MIDL_STUB_MESSAGE *pStubMsg, SIZE_T len)
|
void * WINAPI NdrAllocate(MIDL_STUB_MESSAGE *pStubMsg, SIZE_T len)
|
||||||
|
@ -397,7 +407,7 @@ void * WINAPI NdrAllocate(MIDL_STUB_MESSAGE *pStubMsg, SIZE_T len)
|
||||||
}
|
}
|
||||||
|
|
||||||
p = pStubMsg->pfnAllocate(adjusted_len);
|
p = pStubMsg->pfnAllocate(adjusted_len);
|
||||||
if (!p) RpcRaiseException(ERROR_OUTOFMEMORY);
|
if (!p) RpcRaiseException(RPC_X_NO_MEMORY);
|
||||||
|
|
||||||
mem_list = (NDR_MEMORY_LIST *)((char *)p + aligned_len);
|
mem_list = (NDR_MEMORY_LIST *)((char *)p + aligned_len);
|
||||||
mem_list->magic = MEML_MAGIC;
|
mem_list->magic = MEML_MAGIC;
|
||||||
|
@ -422,6 +432,11 @@ static inline BOOL IsConformanceOrVariancePresent(PFORMAT_STRING pFormat)
|
||||||
return (*(const ULONG *)pFormat != -1);
|
return (*(const ULONG *)pFormat != -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline PFORMAT_STRING SkipConformance(const PMIDL_STUB_MESSAGE pStubMsg, const PFORMAT_STRING pFormat)
|
||||||
|
{
|
||||||
|
return pFormat + 4 + pStubMsg->CorrDespIncrement;
|
||||||
|
}
|
||||||
|
|
||||||
static PFORMAT_STRING ReadConformance(MIDL_STUB_MESSAGE *pStubMsg, PFORMAT_STRING pFormat)
|
static PFORMAT_STRING ReadConformance(MIDL_STUB_MESSAGE *pStubMsg, PFORMAT_STRING pFormat)
|
||||||
{
|
{
|
||||||
align_pointer(&pStubMsg->Buffer, 4);
|
align_pointer(&pStubMsg->Buffer, 4);
|
||||||
|
@ -430,10 +445,7 @@ static PFORMAT_STRING ReadConformance(MIDL_STUB_MESSAGE *pStubMsg, PFORMAT_STRIN
|
||||||
pStubMsg->MaxCount = NDR_LOCAL_UINT32_READ(pStubMsg->Buffer);
|
pStubMsg->MaxCount = NDR_LOCAL_UINT32_READ(pStubMsg->Buffer);
|
||||||
pStubMsg->Buffer += 4;
|
pStubMsg->Buffer += 4;
|
||||||
TRACE("unmarshalled conformance is %ld\n", pStubMsg->MaxCount);
|
TRACE("unmarshalled conformance is %ld\n", pStubMsg->MaxCount);
|
||||||
if (pStubMsg->fHasNewCorrDesc)
|
return SkipConformance(pStubMsg, pFormat);
|
||||||
return pFormat+6;
|
|
||||||
else
|
|
||||||
return pFormat+4;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline PFORMAT_STRING ReadVariance(MIDL_STUB_MESSAGE *pStubMsg, PFORMAT_STRING pFormat, ULONG MaxValue)
|
static inline PFORMAT_STRING ReadVariance(MIDL_STUB_MESSAGE *pStubMsg, PFORMAT_STRING pFormat, ULONG MaxValue)
|
||||||
|
@ -465,10 +477,7 @@ static inline PFORMAT_STRING ReadVariance(MIDL_STUB_MESSAGE *pStubMsg, PFORMAT_S
|
||||||
}
|
}
|
||||||
|
|
||||||
done:
|
done:
|
||||||
if (pStubMsg->fHasNewCorrDesc)
|
return SkipConformance(pStubMsg, pFormat);
|
||||||
return pFormat+6;
|
|
||||||
else
|
|
||||||
return pFormat+4;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* writes the conformance value to the buffer */
|
/* writes the conformance value to the buffer */
|
||||||
|
@ -646,20 +655,8 @@ done_conf_grab:
|
||||||
|
|
||||||
finish_conf:
|
finish_conf:
|
||||||
TRACE("resulting conformance is %ld\n", *pCount);
|
TRACE("resulting conformance is %ld\n", *pCount);
|
||||||
if (pStubMsg->fHasNewCorrDesc)
|
|
||||||
return pFormat+6;
|
|
||||||
else
|
|
||||||
return pFormat+4;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline PFORMAT_STRING SkipConformance(PMIDL_STUB_MESSAGE pStubMsg,
|
return SkipConformance(pStubMsg, pFormat);
|
||||||
PFORMAT_STRING pFormat)
|
|
||||||
{
|
|
||||||
if (pStubMsg->fHasNewCorrDesc)
|
|
||||||
pFormat += 6;
|
|
||||||
else
|
|
||||||
pFormat += 4;
|
|
||||||
return pFormat;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline PFORMAT_STRING SkipVariance(PMIDL_STUB_MESSAGE pStubMsg, PFORMAT_STRING pFormat)
|
static inline PFORMAT_STRING SkipVariance(PMIDL_STUB_MESSAGE pStubMsg, PFORMAT_STRING pFormat)
|
||||||
|
@ -2767,11 +2764,7 @@ static ULONG EmbeddedComplexSize(MIDL_STUB_MESSAGE *pStubMsg,
|
||||||
}
|
}
|
||||||
case RPC_FC_NON_ENCAPSULATED_UNION:
|
case RPC_FC_NON_ENCAPSULATED_UNION:
|
||||||
pFormat += 2;
|
pFormat += 2;
|
||||||
if (pStubMsg->fHasNewCorrDesc)
|
pFormat = SkipConformance(pStubMsg, pFormat);
|
||||||
pFormat += 6;
|
|
||||||
else
|
|
||||||
pFormat += 4;
|
|
||||||
|
|
||||||
pFormat += *(const SHORT*)pFormat;
|
pFormat += *(const SHORT*)pFormat;
|
||||||
return *(const SHORT*)pFormat;
|
return *(const SHORT*)pFormat;
|
||||||
case RPC_FC_IP:
|
case RPC_FC_IP:
|
||||||
|
@ -4596,7 +4589,7 @@ RPC_STATUS RPC_ENTRY NdrGetUserMarshalInfo(ULONG *flags, ULONG level, NDR_USER_M
|
||||||
|
|
||||||
if (umcb->pStubMsg->Buffer < buffer_start ||
|
if (umcb->pStubMsg->Buffer < buffer_start ||
|
||||||
umcb->pStubMsg->Buffer > buffer_end)
|
umcb->pStubMsg->Buffer > buffer_end)
|
||||||
return ERROR_INVALID_USER_BUFFER;
|
return RPC_X_INVALID_BUFFER;
|
||||||
|
|
||||||
umi->u1.Level1.Buffer = umcb->pStubMsg->Buffer;
|
umi->u1.Level1.Buffer = umcb->pStubMsg->Buffer;
|
||||||
umi->u1.Level1.BufferSize = buffer_end - umcb->pStubMsg->Buffer;
|
umi->u1.Level1.BufferSize = buffer_end - umcb->pStubMsg->Buffer;
|
||||||
|
@ -6168,10 +6161,7 @@ static LONG unmarshall_discriminant(PMIDL_STUB_MESSAGE pStubMsg,
|
||||||
}
|
}
|
||||||
(*ppFormat)++;
|
(*ppFormat)++;
|
||||||
|
|
||||||
if (pStubMsg->fHasNewCorrDesc)
|
*ppFormat = SkipConformance(pStubMsg, *ppFormat);
|
||||||
*ppFormat += 6;
|
|
||||||
else
|
|
||||||
*ppFormat += 4;
|
|
||||||
return discriminant;
|
return discriminant;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7198,7 +7188,11 @@ NDR_SCONTEXT WINAPI NdrServerContextNewUnmarshall(PMIDL_STUB_MESSAGE pStubMsg,
|
||||||
*/
|
*/
|
||||||
void WINAPI NdrCorrelationInitialize(PMIDL_STUB_MESSAGE pStubMsg, void *pMemory, ULONG CacheSize, ULONG Flags)
|
void WINAPI NdrCorrelationInitialize(PMIDL_STUB_MESSAGE pStubMsg, void *pMemory, ULONG CacheSize, ULONG Flags)
|
||||||
{
|
{
|
||||||
FIXME("(%p, %p, %d, 0x%x): stub\n", pStubMsg, pMemory, CacheSize, Flags);
|
FIXME("(%p, %p, %d, 0x%x): semi-stub\n", pStubMsg, pMemory, CacheSize, Flags);
|
||||||
|
|
||||||
|
if (pStubMsg->CorrDespIncrement == 0)
|
||||||
|
pStubMsg->CorrDespIncrement = 2; /* size of the normal (non-range) /robust payload */
|
||||||
|
|
||||||
pStubMsg->fHasNewCorrDesc = TRUE;
|
pStubMsg->fHasNewCorrDesc = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -75,14 +75,15 @@ static HRESULT WINAPI RpcStream_QueryInterface(LPSTREAM iface,
|
||||||
REFIID riid,
|
REFIID riid,
|
||||||
LPVOID *obj)
|
LPVOID *obj)
|
||||||
{
|
{
|
||||||
RpcStreamImpl *This = impl_from_IStream(iface);
|
|
||||||
if (IsEqualGUID(&IID_IUnknown, riid) ||
|
if (IsEqualGUID(&IID_IUnknown, riid) ||
|
||||||
IsEqualGUID(&IID_ISequentialStream, riid) ||
|
IsEqualGUID(&IID_ISequentialStream, riid) ||
|
||||||
IsEqualGUID(&IID_IStream, riid)) {
|
IsEqualGUID(&IID_IStream, riid)) {
|
||||||
*obj = This;
|
*obj = iface;
|
||||||
InterlockedIncrement( &This->RefCount );
|
IStream_AddRef(iface);
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
*obj = NULL;
|
||||||
return E_NOINTERFACE;
|
return E_NOINTERFACE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -100,7 +101,6 @@ static ULONG WINAPI RpcStream_Release(LPSTREAM iface)
|
||||||
TRACE("size=%d\n", *This->size);
|
TRACE("size=%d\n", *This->size);
|
||||||
This->pMsg->Buffer = This->data + *This->size;
|
This->pMsg->Buffer = This->data + *This->size;
|
||||||
HeapFree(GetProcessHeap(),0,This);
|
HeapFree(GetProcessHeap(),0,This);
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
return ref;
|
return ref;
|
||||||
}
|
}
|
||||||
|
@ -174,6 +174,58 @@ static HRESULT WINAPI RpcStream_SetSize(LPSTREAM iface,
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI RpcStream_CopyTo(IStream *iface, IStream *dest,
|
||||||
|
ULARGE_INTEGER len, ULARGE_INTEGER *read, ULARGE_INTEGER *written)
|
||||||
|
{
|
||||||
|
RpcStreamImpl *This = impl_from_IStream(iface);
|
||||||
|
FIXME("(%p): stub\n", This);
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI RpcStream_Commit(IStream *iface, DWORD flags)
|
||||||
|
{
|
||||||
|
RpcStreamImpl *This = impl_from_IStream(iface);
|
||||||
|
FIXME("(%p)->(0x%08x): stub\n", This, flags);
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI RpcStream_Revert(IStream *iface)
|
||||||
|
{
|
||||||
|
RpcStreamImpl *This = impl_from_IStream(iface);
|
||||||
|
FIXME("(%p): stub\n", This);
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI RpcStream_LockRegion(IStream *iface,
|
||||||
|
ULARGE_INTEGER offset, ULARGE_INTEGER len, DWORD locktype)
|
||||||
|
{
|
||||||
|
RpcStreamImpl *This = impl_from_IStream(iface);
|
||||||
|
FIXME("(%p): stub\n", This);
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI RpcStream_UnlockRegion(IStream *iface,
|
||||||
|
ULARGE_INTEGER offset, ULARGE_INTEGER len, DWORD locktype)
|
||||||
|
{
|
||||||
|
RpcStreamImpl *This = impl_from_IStream(iface);
|
||||||
|
FIXME("(%p): stub\n", This);
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI RpcStream_Stat(IStream *iface, STATSTG *stat, DWORD flag)
|
||||||
|
{
|
||||||
|
RpcStreamImpl *This = impl_from_IStream(iface);
|
||||||
|
FIXME("(%p): stub\n", This);
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI RpcStream_Clone(IStream *iface, IStream **cloned)
|
||||||
|
{
|
||||||
|
RpcStreamImpl *This = impl_from_IStream(iface);
|
||||||
|
FIXME("(%p): stub\n", This);
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
static const IStreamVtbl RpcStream_Vtbl =
|
static const IStreamVtbl RpcStream_Vtbl =
|
||||||
{
|
{
|
||||||
RpcStream_QueryInterface,
|
RpcStream_QueryInterface,
|
||||||
|
@ -183,29 +235,34 @@ static const IStreamVtbl RpcStream_Vtbl =
|
||||||
RpcStream_Write,
|
RpcStream_Write,
|
||||||
RpcStream_Seek,
|
RpcStream_Seek,
|
||||||
RpcStream_SetSize,
|
RpcStream_SetSize,
|
||||||
NULL, /* CopyTo */
|
RpcStream_CopyTo,
|
||||||
NULL, /* Commit */
|
RpcStream_Commit,
|
||||||
NULL, /* Revert */
|
RpcStream_Revert,
|
||||||
NULL, /* LockRegion */
|
RpcStream_LockRegion,
|
||||||
NULL, /* UnlockRegion */
|
RpcStream_UnlockRegion,
|
||||||
NULL, /* Stat */
|
RpcStream_Stat,
|
||||||
NULL /* Clone */
|
RpcStream_Clone
|
||||||
};
|
};
|
||||||
|
|
||||||
static LPSTREAM RpcStream_Create(PMIDL_STUB_MESSAGE pStubMsg, BOOL init)
|
static HRESULT RpcStream_Create(PMIDL_STUB_MESSAGE pStubMsg, BOOL init, ULONG *size, IStream **stream)
|
||||||
{
|
{
|
||||||
RpcStreamImpl *This;
|
RpcStreamImpl *This;
|
||||||
This = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(RpcStreamImpl));
|
|
||||||
if (!This) return NULL;
|
*stream = NULL;
|
||||||
|
This = HeapAlloc(GetProcessHeap(), 0, sizeof(RpcStreamImpl));
|
||||||
|
if (!This) return E_OUTOFMEMORY;
|
||||||
This->IStream_iface.lpVtbl = &RpcStream_Vtbl;
|
This->IStream_iface.lpVtbl = &RpcStream_Vtbl;
|
||||||
This->RefCount = 1;
|
This->RefCount = 1;
|
||||||
This->pMsg = pStubMsg;
|
This->pMsg = pStubMsg;
|
||||||
This->size = (LPDWORD)pStubMsg->Buffer;
|
This->size = (LPDWORD)pStubMsg->Buffer;
|
||||||
This->data = (unsigned char*)(This->size + 1);
|
This->data = pStubMsg->Buffer + sizeof(DWORD);
|
||||||
This->pos = 0;
|
This->pos = 0;
|
||||||
if (init) *This->size = 0;
|
if (init) *This->size = 0;
|
||||||
TRACE("init size=%d\n", *This->size);
|
TRACE("init size=%d\n", *This->size);
|
||||||
return (LPSTREAM)This;
|
|
||||||
|
if (size) *size = *This->size;
|
||||||
|
*stream = &This->IStream_iface;
|
||||||
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const IID* get_ip_iid(PMIDL_STUB_MESSAGE pStubMsg, unsigned char *pMemory, PFORMAT_STRING pFormat)
|
static const IID* get_ip_iid(PMIDL_STUB_MESSAGE pStubMsg, unsigned char *pMemory, PFORMAT_STRING pFormat)
|
||||||
|
@ -240,19 +297,17 @@ unsigned char * WINAPI NdrInterfacePointerMarshall(PMIDL_STUB_MESSAGE pStubMsg,
|
||||||
pStubMsg->MaxCount = 0;
|
pStubMsg->MaxCount = 0;
|
||||||
if (!LoadCOM()) return NULL;
|
if (!LoadCOM()) return NULL;
|
||||||
if (pStubMsg->Buffer + sizeof(DWORD) <= (unsigned char *)pStubMsg->RpcMsg->Buffer + pStubMsg->BufferLength) {
|
if (pStubMsg->Buffer + sizeof(DWORD) <= (unsigned char *)pStubMsg->RpcMsg->Buffer + pStubMsg->BufferLength) {
|
||||||
stream = RpcStream_Create(pStubMsg, TRUE);
|
hr = RpcStream_Create(pStubMsg, TRUE, NULL, &stream);
|
||||||
if (stream) {
|
if (hr == S_OK) {
|
||||||
if (pMemory)
|
if (pMemory)
|
||||||
hr = COM_MarshalInterface(stream, riid, (LPUNKNOWN)pMemory,
|
hr = COM_MarshalInterface(stream, riid, (LPUNKNOWN)pMemory,
|
||||||
pStubMsg->dwDestContext, pStubMsg->pvDestContext,
|
pStubMsg->dwDestContext, pStubMsg->pvDestContext,
|
||||||
MSHLFLAGS_NORMAL);
|
MSHLFLAGS_NORMAL);
|
||||||
else
|
|
||||||
hr = S_OK;
|
|
||||||
|
|
||||||
IStream_Release(stream);
|
IStream_Release(stream);
|
||||||
if (FAILED(hr))
|
|
||||||
RpcRaiseException(hr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (FAILED(hr))
|
||||||
|
RpcRaiseException(hr);
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -272,13 +327,16 @@ unsigned char * WINAPI NdrInterfacePointerUnmarshall(PMIDL_STUB_MESSAGE pStubMsg
|
||||||
if (!LoadCOM()) return NULL;
|
if (!LoadCOM()) return NULL;
|
||||||
*(LPVOID*)ppMemory = NULL;
|
*(LPVOID*)ppMemory = NULL;
|
||||||
if (pStubMsg->Buffer + sizeof(DWORD) < (unsigned char *)pStubMsg->RpcMsg->Buffer + pStubMsg->BufferLength) {
|
if (pStubMsg->Buffer + sizeof(DWORD) < (unsigned char *)pStubMsg->RpcMsg->Buffer + pStubMsg->BufferLength) {
|
||||||
stream = RpcStream_Create(pStubMsg, FALSE);
|
ULONG size;
|
||||||
if (!stream) RpcRaiseException(E_OUTOFMEMORY);
|
|
||||||
if (*((RpcStreamImpl *)stream)->size != 0)
|
hr = RpcStream_Create(pStubMsg, FALSE, &size, &stream);
|
||||||
hr = COM_UnmarshalInterface(stream, &IID_NULL, (LPVOID*)ppMemory);
|
if (hr == S_OK) {
|
||||||
else
|
if (size != 0)
|
||||||
hr = S_OK;
|
hr = COM_UnmarshalInterface(stream, &IID_NULL, (LPVOID*)ppMemory);
|
||||||
IStream_Release(stream);
|
|
||||||
|
IStream_Release(stream);
|
||||||
|
}
|
||||||
|
|
||||||
if (FAILED(hr))
|
if (FAILED(hr))
|
||||||
RpcRaiseException(hr);
|
RpcRaiseException(hr);
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,6 +29,11 @@ WINE_DEFAULT_DEBUG_CHANNEL(rpc);
|
||||||
|
|
||||||
#define NDR_TABLE_MASK 127
|
#define NDR_TABLE_MASK 127
|
||||||
|
|
||||||
|
static inline BOOL is_oicf_stubdesc(const PMIDL_STUB_DESC pStubDesc)
|
||||||
|
{
|
||||||
|
return pStubDesc->Version >= 0x20000;
|
||||||
|
}
|
||||||
|
|
||||||
static inline void call_buffer_sizer(PMIDL_STUB_MESSAGE pStubMsg, unsigned char *pMemory,
|
static inline void call_buffer_sizer(PMIDL_STUB_MESSAGE pStubMsg, unsigned char *pMemory,
|
||||||
const NDR_PARAM_OIF *param)
|
const NDR_PARAM_OIF *param)
|
||||||
{
|
{
|
||||||
|
@ -323,7 +328,11 @@ static PFORMAT_STRING client_get_handle(
|
||||||
*phBinding = *pStubMsg->StubDesc->IMPLICIT_HANDLE_INFO.pPrimitiveHandle;
|
*phBinding = *pStubMsg->StubDesc->IMPLICIT_HANDLE_INFO.pPrimitiveHandle;
|
||||||
break;
|
break;
|
||||||
case RPC_FC_CALLBACK_HANDLE: /* implicit callback */
|
case RPC_FC_CALLBACK_HANDLE: /* implicit callback */
|
||||||
FIXME("RPC_FC_CALLBACK_HANDLE\n");
|
TRACE("RPC_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;
|
break;
|
||||||
case RPC_FC_AUTO_HANDLE: /* implicit auto handle */
|
case RPC_FC_AUTO_HANDLE: /* implicit auto handle */
|
||||||
/* strictly speaking, it isn't necessary to set hBinding here
|
/* strictly speaking, it isn't necessary to set hBinding here
|
||||||
|
@ -645,7 +654,7 @@ LONG_PTR CDECL ndr_client_call( PMIDL_STUB_DESC pStubDesc, PFORMAT_STRING pForma
|
||||||
if (!pFormat) goto done;
|
if (!pFormat) goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pStubDesc->Version >= 0x20000) /* -Oicf format */
|
if (is_oicf_stubdesc(pStubDesc)) /* -Oicf format */
|
||||||
{
|
{
|
||||||
const NDR_PROC_PARTIAL_OIF_HEADER *pOIFHeader =
|
const NDR_PROC_PARTIAL_OIF_HEADER *pOIFHeader =
|
||||||
(const NDR_PROC_PARTIAL_OIF_HEADER *)pFormat;
|
(const NDR_PROC_PARTIAL_OIF_HEADER *)pFormat;
|
||||||
|
@ -706,6 +715,8 @@ LONG_PTR CDECL ndr_client_call( PMIDL_STUB_DESC pStubDesc, PFORMAT_STRING pForma
|
||||||
{
|
{
|
||||||
/* initialize extra correlation package */
|
/* initialize extra correlation package */
|
||||||
NdrCorrelationInitialize(&stubMsg, NdrCorrCache, sizeof(NdrCorrCache), 0);
|
NdrCorrelationInitialize(&stubMsg, NdrCorrCache, sizeof(NdrCorrCache), 0);
|
||||||
|
if (ext_flags.Unused & 0x2) /* has range on conformance */
|
||||||
|
stubMsg.CorrDespIncrement = 12;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* order of phases:
|
/* order of phases:
|
||||||
|
@ -1047,10 +1058,10 @@ __ASM_GLOBAL_FUNC( call_server_func,
|
||||||
"movq 8(%rsp),%rdx\n\t"
|
"movq 8(%rsp),%rdx\n\t"
|
||||||
"movq 16(%rsp),%r8\n\t"
|
"movq 16(%rsp),%r8\n\t"
|
||||||
"movq 24(%rsp),%r9\n\t"
|
"movq 24(%rsp),%r9\n\t"
|
||||||
"movq %rcx,%xmm0\n\t"
|
"movq 0(%rsp),%xmm0\n\t"
|
||||||
"movq %rdx,%xmm1\n\t"
|
"movq 8(%rsp),%xmm1\n\t"
|
||||||
"movq %r8,%xmm2\n\t"
|
"movq 16(%rsp),%xmm2\n\t"
|
||||||
"movq %r9,%xmm3\n\t"
|
"movq 24(%rsp),%xmm3\n\t"
|
||||||
"callq *%rax\n\t"
|
"callq *%rax\n\t"
|
||||||
"leaq -16(%rbp),%rsp\n\t" /* restore stack */
|
"leaq -16(%rbp),%rsp\n\t" /* restore stack */
|
||||||
"popq %rdi\n\t"
|
"popq %rdi\n\t"
|
||||||
|
@ -1062,13 +1073,40 @@ __ASM_GLOBAL_FUNC( call_server_func,
|
||||||
__ASM_CFI(".cfi_adjust_cfa_offset -8\n\t")
|
__ASM_CFI(".cfi_adjust_cfa_offset -8\n\t")
|
||||||
__ASM_CFI(".cfi_same_value %rbp\n\t")
|
__ASM_CFI(".cfi_same_value %rbp\n\t")
|
||||||
"ret")
|
"ret")
|
||||||
#elif defined(__arm__)
|
#elif defined __arm__
|
||||||
LONG_PTR __cdecl call_server_func(SERVER_ROUTINE func, unsigned char * args, unsigned short stack_size)
|
LONG_PTR __cdecl call_server_func(SERVER_ROUTINE func, unsigned char *args, unsigned int stack_size);
|
||||||
{
|
__ASM_GLOBAL_FUNC( call_server_func,
|
||||||
FIXME("Not implemented for ARM\n");
|
".arm\n\t"
|
||||||
assert(FALSE);
|
"push {r4, r5, LR}\n\t"
|
||||||
return 0;
|
"mov r4, r0\n\t"
|
||||||
}
|
"mov r5, SP\n\t"
|
||||||
|
"lsr r3, r2, #2\n\t"
|
||||||
|
"cmp r3, #0\n\t"
|
||||||
|
"beq 5f\n\t"
|
||||||
|
"sub SP, SP, r2\n\t"
|
||||||
|
"tst r3, #1\n\t"
|
||||||
|
"subeq SP, SP, #4\n\t"
|
||||||
|
"1:\tsub r2, r2, #4\n\t"
|
||||||
|
"ldr r0, [r1, r2]\n\t"
|
||||||
|
"str r0, [SP, r2]\n\t"
|
||||||
|
"cmp r2, #0\n\t"
|
||||||
|
"bgt 1b\n\t"
|
||||||
|
"cmp r3, #1\n\t"
|
||||||
|
"bgt 2f\n\t"
|
||||||
|
"pop {r0}\n\t"
|
||||||
|
"b 5f\n\t"
|
||||||
|
"2:\tcmp r3, #2\n\t"
|
||||||
|
"bgt 3f\n\t"
|
||||||
|
"pop {r0-r1}\n\t"
|
||||||
|
"b 5f\n\t"
|
||||||
|
"3:\tcmp r3, #3\n\t"
|
||||||
|
"bgt 4f\n\t"
|
||||||
|
"pop {r0-r2}\n\t"
|
||||||
|
"b 5f\n\t"
|
||||||
|
"4:\tpop {r0-r3}\n\t"
|
||||||
|
"5:\tblx r4\n\t"
|
||||||
|
"mov SP, r5\n\t"
|
||||||
|
"pop {r4, r5, PC}" )
|
||||||
#else
|
#else
|
||||||
#warning call_server_func not implemented for your architecture
|
#warning call_server_func not implemented for your architecture
|
||||||
LONG_PTR __cdecl call_server_func(SERVER_ROUTINE func, unsigned char * args, unsigned short stack_size)
|
LONG_PTR __cdecl call_server_func(SERVER_ROUTINE func, unsigned char * args, unsigned short stack_size)
|
||||||
|
@ -1086,19 +1124,6 @@ static LONG_PTR *stub_do_args(MIDL_STUB_MESSAGE *pStubMsg,
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
LONG_PTR *retval_ptr = NULL;
|
LONG_PTR *retval_ptr = NULL;
|
||||||
|
|
||||||
if (phase == STUBLESS_FREE)
|
|
||||||
{
|
|
||||||
/* Process the params allocated by the application first */
|
|
||||||
for (i = 0; i < number_of_params; i++)
|
|
||||||
{
|
|
||||||
unsigned char *pArg = pStubMsg->StackTop + params[i].stack_offset;
|
|
||||||
if (params[i].attr.MustFree)
|
|
||||||
{
|
|
||||||
call_freer(pStubMsg, pArg, ¶ms[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < number_of_params; i++)
|
for (i = 0; i < number_of_params; i++)
|
||||||
{
|
{
|
||||||
unsigned char *pArg = pStubMsg->StackTop + params[i].stack_offset;
|
unsigned char *pArg = pStubMsg->StackTop + params[i].stack_offset;
|
||||||
|
@ -1115,10 +1140,14 @@ static LONG_PTR *stub_do_args(MIDL_STUB_MESSAGE *pStubMsg,
|
||||||
if (params[i].attr.IsOut || params[i].attr.IsReturn)
|
if (params[i].attr.IsOut || params[i].attr.IsReturn)
|
||||||
call_marshaller(pStubMsg, pArg, ¶ms[i]);
|
call_marshaller(pStubMsg, pArg, ¶ms[i]);
|
||||||
break;
|
break;
|
||||||
case STUBLESS_FREE:
|
case STUBLESS_MUSTFREE:
|
||||||
if (params[i].attr.MustFree)
|
if (params[i].attr.MustFree)
|
||||||
break;
|
{
|
||||||
else if (params[i].attr.ServerAllocSize)
|
call_freer(pStubMsg, pArg, ¶ms[i]);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case STUBLESS_FREE:
|
||||||
|
if (params[i].attr.ServerAllocSize)
|
||||||
{
|
{
|
||||||
HeapFree(GetProcessHeap(), 0, *(void **)pArg);
|
HeapFree(GetProcessHeap(), 0, *(void **)pArg);
|
||||||
}
|
}
|
||||||
|
@ -1304,7 +1333,7 @@ LONG WINAPI NdrStubCall2(
|
||||||
if (pThis)
|
if (pThis)
|
||||||
*(void **)args = ((CStdStubBuffer *)pThis)->pvServerObject;
|
*(void **)args = ((CStdStubBuffer *)pThis)->pvServerObject;
|
||||||
|
|
||||||
if (pStubDesc->Version >= 0x20000) /* -Oicf format */
|
if (is_oicf_stubdesc(pStubDesc))
|
||||||
{
|
{
|
||||||
const NDR_PROC_PARTIAL_OIF_HEADER *pOIFHeader = (const NDR_PROC_PARTIAL_OIF_HEADER *)pFormat;
|
const NDR_PROC_PARTIAL_OIF_HEADER *pOIFHeader = (const NDR_PROC_PARTIAL_OIF_HEADER *)pFormat;
|
||||||
|
|
||||||
|
@ -1332,8 +1361,9 @@ LONG WINAPI NdrStubCall2(
|
||||||
if (ext_flags.HasNewCorrDesc)
|
if (ext_flags.HasNewCorrDesc)
|
||||||
{
|
{
|
||||||
/* initialize extra correlation package */
|
/* initialize extra correlation package */
|
||||||
FIXME("new correlation description not implemented\n");
|
NdrCorrelationInitialize(&stubMsg, NdrCorrCache, sizeof(NdrCorrCache), 0);
|
||||||
stubMsg.fHasNewCorrDesc = TRUE;
|
if (ext_flags.Unused & 0x2) /* has range on conformance */
|
||||||
|
stubMsg.CorrDespIncrement = 12;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -1396,7 +1426,7 @@ LONG WINAPI NdrStubCall2(
|
||||||
|
|
||||||
pRpcMsg->BufferLength = stubMsg.BufferLength;
|
pRpcMsg->BufferLength = stubMsg.BufferLength;
|
||||||
/* allocate buffer for [out] and [ret] params */
|
/* allocate buffer for [out] and [ret] params */
|
||||||
Status = I_RpcGetBuffer(pRpcMsg);
|
Status = I_RpcGetBuffer(pRpcMsg);
|
||||||
if (Status)
|
if (Status)
|
||||||
RpcRaiseException(Status);
|
RpcRaiseException(Status);
|
||||||
stubMsg.Buffer = pRpcMsg->Buffer;
|
stubMsg.Buffer = pRpcMsg->Buffer;
|
||||||
|
@ -1406,6 +1436,7 @@ LONG WINAPI NdrStubCall2(
|
||||||
case STUBLESS_INITOUT:
|
case STUBLESS_INITOUT:
|
||||||
case STUBLESS_CALCSIZE:
|
case STUBLESS_CALCSIZE:
|
||||||
case STUBLESS_MARSHAL:
|
case STUBLESS_MARSHAL:
|
||||||
|
case STUBLESS_MUSTFREE:
|
||||||
case STUBLESS_FREE:
|
case STUBLESS_FREE:
|
||||||
retval_ptr = stub_do_args(&stubMsg, pFormat, phase, number_of_params);
|
retval_ptr = stub_do_args(&stubMsg, pFormat, phase, number_of_params);
|
||||||
break;
|
break;
|
||||||
|
@ -1420,7 +1451,7 @@ LONG WINAPI NdrStubCall2(
|
||||||
if (ext_flags.HasNewCorrDesc)
|
if (ext_flags.HasNewCorrDesc)
|
||||||
{
|
{
|
||||||
/* free extra correlation package */
|
/* free extra correlation package */
|
||||||
/* NdrCorrelationFree(&stubMsg); */
|
NdrCorrelationFree(&stubMsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Oif_flags.HasPipes)
|
if (Oif_flags.HasPipes)
|
||||||
|
@ -1495,8 +1526,6 @@ LONG_PTR CDECL ndr_async_client_call( PMIDL_STUB_DESC pStubDesc, PFORMAT_STRING
|
||||||
INTERPRETER_OPT_FLAGS2 ext_flags = { 0 };
|
INTERPRETER_OPT_FLAGS2 ext_flags = { 0 };
|
||||||
/* header for procedure string */
|
/* header for procedure string */
|
||||||
const NDR_PROC_HEADER * pProcHeader = (const NDR_PROC_HEADER *)&pFormat[0];
|
const NDR_PROC_HEADER * pProcHeader = (const NDR_PROC_HEADER *)&pFormat[0];
|
||||||
/* -Oif or -Oicf generated format */
|
|
||||||
BOOL bV2Format = FALSE;
|
|
||||||
RPC_STATUS status;
|
RPC_STATUS status;
|
||||||
|
|
||||||
TRACE("pStubDesc %p, pFormat %p, ...\n", pStubDesc, pFormat);
|
TRACE("pStubDesc %p, pFormat %p, ...\n", pStubDesc, pFormat);
|
||||||
|
@ -1509,7 +1538,7 @@ LONG_PTR CDECL ndr_async_client_call( PMIDL_STUB_DESC pStubDesc, PFORMAT_STRING
|
||||||
}
|
}
|
||||||
|
|
||||||
async_call_data = I_RpcAllocate(sizeof(*async_call_data) + sizeof(MIDL_STUB_MESSAGE) + sizeof(RPC_MESSAGE));
|
async_call_data = I_RpcAllocate(sizeof(*async_call_data) + sizeof(MIDL_STUB_MESSAGE) + sizeof(RPC_MESSAGE));
|
||||||
if (!async_call_data) RpcRaiseException(ERROR_OUTOFMEMORY);
|
if (!async_call_data) RpcRaiseException(RPC_X_NO_MEMORY);
|
||||||
async_call_data->pProcHeader = pProcHeader;
|
async_call_data->pProcHeader = pProcHeader;
|
||||||
|
|
||||||
async_call_data->pStubMsg = pStubMsg = (PMIDL_STUB_MESSAGE)(async_call_data + 1);
|
async_call_data->pStubMsg = pStubMsg = (PMIDL_STUB_MESSAGE)(async_call_data + 1);
|
||||||
|
@ -1558,9 +1587,7 @@ LONG_PTR CDECL ndr_async_client_call( PMIDL_STUB_DESC pStubDesc, PFORMAT_STRING
|
||||||
pFormat = client_get_handle(pStubMsg, pProcHeader, async_call_data->pHandleFormat, &async_call_data->hBinding);
|
pFormat = client_get_handle(pStubMsg, pProcHeader, async_call_data->pHandleFormat, &async_call_data->hBinding);
|
||||||
if (!pFormat) goto done;
|
if (!pFormat) goto done;
|
||||||
|
|
||||||
bV2Format = (pStubDesc->Version >= 0x20000);
|
if (is_oicf_stubdesc(pStubDesc))
|
||||||
|
|
||||||
if (bV2Format)
|
|
||||||
{
|
{
|
||||||
const NDR_PROC_PARTIAL_OIF_HEADER *pOIFHeader =
|
const NDR_PROC_PARTIAL_OIF_HEADER *pOIFHeader =
|
||||||
(const NDR_PROC_PARTIAL_OIF_HEADER *)pFormat;
|
(const NDR_PROC_PARTIAL_OIF_HEADER *)pFormat;
|
||||||
|
@ -1611,6 +1638,8 @@ LONG_PTR CDECL ndr_async_client_call( PMIDL_STUB_DESC pStubDesc, PFORMAT_STRING
|
||||||
{
|
{
|
||||||
/* initialize extra correlation package */
|
/* initialize extra correlation package */
|
||||||
NdrCorrelationInitialize(pStubMsg, async_call_data->NdrCorrCache, sizeof(async_call_data->NdrCorrCache), 0);
|
NdrCorrelationInitialize(pStubMsg, async_call_data->NdrCorrCache, sizeof(async_call_data->NdrCorrCache), 0);
|
||||||
|
if (ext_flags.Unused & 0x2) /* has range on conformance */
|
||||||
|
pStubMsg->CorrDespIncrement = 12;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* order of phases:
|
/* order of phases:
|
||||||
|
|
|
@ -37,7 +37,8 @@ typedef struct _NDR_PROC_HEADER
|
||||||
* RPC_FC_BIND_PRIMITIVE = 32 - Implicit handle using handle_t created by
|
* RPC_FC_BIND_PRIMITIVE = 32 - Implicit handle using handle_t created by
|
||||||
* calling application
|
* calling application
|
||||||
* RPC_FC_AUTO_HANDLE = 33 - Automatic handle
|
* RPC_FC_AUTO_HANDLE = 33 - Automatic handle
|
||||||
* RPC_FC_CALLBACK_HANDLE = 34 - undocumented
|
* RPC_FC_CALLBACK_HANDLE = 34 - Implicit handle used for a callback: current handle
|
||||||
|
* from last remote call
|
||||||
*/
|
*/
|
||||||
unsigned char handle_type;
|
unsigned char handle_type;
|
||||||
|
|
||||||
|
@ -235,6 +236,7 @@ enum stubless_phase
|
||||||
STUBLESS_CALCSIZE,
|
STUBLESS_CALCSIZE,
|
||||||
STUBLESS_GETBUFFER,
|
STUBLESS_GETBUFFER,
|
||||||
STUBLESS_MARSHAL,
|
STUBLESS_MARSHAL,
|
||||||
|
STUBLESS_MUSTFREE,
|
||||||
STUBLESS_FREE
|
STUBLESS_FREE
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -68,6 +68,7 @@ static RPC_STATUS RpcAssoc_Alloc(LPCSTR Protseq, LPCSTR NetworkAddr,
|
||||||
assoc->Endpoint = RPCRT4_strdupA(Endpoint);
|
assoc->Endpoint = RPCRT4_strdupA(Endpoint);
|
||||||
assoc->NetworkOptions = NetworkOptions ? RPCRT4_strdupW(NetworkOptions) : NULL;
|
assoc->NetworkOptions = NetworkOptions ? RPCRT4_strdupW(NetworkOptions) : NULL;
|
||||||
assoc->assoc_group_id = 0;
|
assoc->assoc_group_id = 0;
|
||||||
|
UuidCreate(&assoc->http_uuid);
|
||||||
list_init(&assoc->entry);
|
list_init(&assoc->entry);
|
||||||
*assoc_out = assoc;
|
*assoc_out = assoc;
|
||||||
return RPC_S_OK;
|
return RPC_S_OK;
|
||||||
|
@ -329,7 +330,7 @@ static RPC_STATUS RpcAssoc_BindConnection(const RpcAssoc *assoc, RpcConnection *
|
||||||
break;
|
break;
|
||||||
case REJECT_INVALID_CHECKSUM:
|
case REJECT_INVALID_CHECKSUM:
|
||||||
ERR("invalid checksum\n");
|
ERR("invalid checksum\n");
|
||||||
status = ERROR_ACCESS_DENIED;
|
status = RPC_S_ACCESS_DENIED;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
ERR("rejected bind for reason %d\n", response_hdr->bind_nack.reject_reason);
|
ERR("rejected bind for reason %d\n", response_hdr->bind_nack.reject_reason);
|
||||||
|
@ -431,7 +432,7 @@ RPC_STATUS RpcServerAssoc_AllocateContextHandle(RpcAssoc *assoc, void *CtxGuard,
|
||||||
|
|
||||||
context_handle = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*context_handle));
|
context_handle = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*context_handle));
|
||||||
if (!context_handle)
|
if (!context_handle)
|
||||||
return ERROR_OUTOFMEMORY;
|
return RPC_S_OUT_OF_MEMORY;
|
||||||
|
|
||||||
context_handle->ctx_guard = CtxGuard;
|
context_handle->ctx_guard = CtxGuard;
|
||||||
RtlInitializeResource(&context_handle->rw_lock);
|
RtlInitializeResource(&context_handle->rw_lock);
|
||||||
|
|
|
@ -1102,7 +1102,7 @@ RPC_STATUS RpcAuthInfo_Create(ULONG AuthnLevel, ULONG AuthnSvc,
|
||||||
{
|
{
|
||||||
RpcAuthInfo *AuthInfo = HeapAlloc(GetProcessHeap(), 0, sizeof(*AuthInfo));
|
RpcAuthInfo *AuthInfo = HeapAlloc(GetProcessHeap(), 0, sizeof(*AuthInfo));
|
||||||
if (!AuthInfo)
|
if (!AuthInfo)
|
||||||
return ERROR_OUTOFMEMORY;
|
return RPC_S_OUT_OF_MEMORY;
|
||||||
|
|
||||||
AuthInfo->refs = 1;
|
AuthInfo->refs = 1;
|
||||||
AuthInfo->AuthnLevel = AuthnLevel;
|
AuthInfo->AuthnLevel = AuthnLevel;
|
||||||
|
@ -1122,7 +1122,7 @@ RPC_STATUS RpcAuthInfo_Create(ULONG AuthnLevel, ULONG AuthnSvc,
|
||||||
if (!AuthInfo->nt_identity)
|
if (!AuthInfo->nt_identity)
|
||||||
{
|
{
|
||||||
HeapFree(GetProcessHeap(), 0, AuthInfo);
|
HeapFree(GetProcessHeap(), 0, AuthInfo);
|
||||||
return ERROR_OUTOFMEMORY;
|
return RPC_S_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
AuthInfo->nt_identity->Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE;
|
AuthInfo->nt_identity->Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE;
|
||||||
|
@ -1151,7 +1151,7 @@ RPC_STATUS RpcAuthInfo_Create(ULONG AuthnLevel, ULONG AuthnSvc,
|
||||||
HeapFree(GetProcessHeap(), 0, AuthInfo->nt_identity->Password);
|
HeapFree(GetProcessHeap(), 0, AuthInfo->nt_identity->Password);
|
||||||
HeapFree(GetProcessHeap(), 0, AuthInfo->nt_identity);
|
HeapFree(GetProcessHeap(), 0, AuthInfo->nt_identity);
|
||||||
HeapFree(GetProcessHeap(), 0, AuthInfo);
|
HeapFree(GetProcessHeap(), 0, AuthInfo);
|
||||||
return ERROR_OUTOFMEMORY;
|
return RPC_S_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -1475,7 +1475,7 @@ RpcBindingInqAuthInfoExA( RPC_BINDING_HANDLE Binding, RPC_CSTR *ServerPrincName,
|
||||||
{
|
{
|
||||||
*ServerPrincName = (RPC_CSTR)RPCRT4_strdupWtoA(principal);
|
*ServerPrincName = (RPC_CSTR)RPCRT4_strdupWtoA(principal);
|
||||||
RpcStringFreeW(&principal);
|
RpcStringFreeW(&principal);
|
||||||
if (!*ServerPrincName) return ERROR_OUTOFMEMORY;
|
if (!*ServerPrincName) return RPC_S_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
|
@ -1507,7 +1507,7 @@ RpcBindingInqAuthInfoExW( RPC_BINDING_HANDLE Binding, RPC_WSTR *ServerPrincName,
|
||||||
if (bind->AuthInfo->server_principal_name)
|
if (bind->AuthInfo->server_principal_name)
|
||||||
{
|
{
|
||||||
*ServerPrincName = RPCRT4_strdupW(bind->AuthInfo->server_principal_name);
|
*ServerPrincName = RPCRT4_strdupW(bind->AuthInfo->server_principal_name);
|
||||||
if (!*ServerPrincName) return ERROR_OUTOFMEMORY;
|
if (!*ServerPrincName) return RPC_S_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
else *ServerPrincName = NULL;
|
else *ServerPrincName = NULL;
|
||||||
}
|
}
|
||||||
|
@ -1588,7 +1588,7 @@ RpcBindingInqAuthClientExA( RPC_BINDING_HANDLE ClientBinding, RPC_AUTHZ_HANDLE *
|
||||||
if (status == RPC_S_OK && ServerPrincName)
|
if (status == RPC_S_OK && ServerPrincName)
|
||||||
{
|
{
|
||||||
*ServerPrincName = (RPC_CSTR)RPCRT4_strdupWtoA(principal);
|
*ServerPrincName = (RPC_CSTR)RPCRT4_strdupWtoA(principal);
|
||||||
if (!*ServerPrincName && principal) status = ERROR_OUTOFMEMORY;
|
if (!*ServerPrincName && principal) status = RPC_S_OUT_OF_MEMORY;
|
||||||
RpcStringFreeW(&principal);
|
RpcStringFreeW(&principal);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1733,7 +1733,7 @@ RpcBindingSetAuthInfoExA( RPC_BINDING_HANDLE Binding, RPC_CSTR ServerPrincName,
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
RpcAuthInfo_Release(new_auth_info);
|
RpcAuthInfo_Release(new_auth_info);
|
||||||
r = ERROR_OUTOFMEMORY;
|
r = RPC_S_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -1864,7 +1864,7 @@ RpcBindingSetAuthInfoExW( RPC_BINDING_HANDLE Binding, RPC_WSTR ServerPrincName,
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
RpcAuthInfo_Release(new_auth_info);
|
RpcAuthInfo_Release(new_auth_info);
|
||||||
r = ERROR_OUTOFMEMORY;
|
r = RPC_S_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -1918,7 +1918,7 @@ RPC_STATUS WINAPI RpcBindingSetOption(RPC_BINDING_HANDLE BindingHandle, ULONG Op
|
||||||
int len = MultiByteToWideChar(CP_ACP, 0, cookie->Buffer, cookie->BufferSize, NULL, 0);
|
int len = MultiByteToWideChar(CP_ACP, 0, cookie->Buffer, cookie->BufferSize, NULL, 0);
|
||||||
WCHAR *str;
|
WCHAR *str;
|
||||||
|
|
||||||
if (!(str = HeapAlloc(GetProcessHeap(), 0, (len + 1) * sizeof(WCHAR)))) return ERROR_OUTOFMEMORY;
|
if (!(str = HeapAlloc(GetProcessHeap(), 0, (len + 1) * sizeof(WCHAR)))) return RPC_S_OUT_OF_MEMORY;
|
||||||
MultiByteToWideChar(CP_ACP, 0, cookie->Buffer, cookie->BufferSize, str, len);
|
MultiByteToWideChar(CP_ACP, 0, cookie->Buffer, cookie->BufferSize, str, len);
|
||||||
str[len] = 0;
|
str[len] = 0;
|
||||||
HeapFree(GetProcessHeap(), 0, binding->CookieAuth);
|
HeapFree(GetProcessHeap(), 0, binding->CookieAuth);
|
||||||
|
@ -1931,3 +1931,13 @@ RPC_STATUS WINAPI RpcBindingSetOption(RPC_BINDING_HANDLE BindingHandle, ULONG Op
|
||||||
}
|
}
|
||||||
return RPC_S_OK;
|
return RPC_S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* I_RpcBindingInqLocalClientPID (RPCRT4.@)
|
||||||
|
*/
|
||||||
|
|
||||||
|
RPC_STATUS WINAPI I_RpcBindingInqLocalClientPID(RPC_BINDING_HANDLE ClientBinding, ULONG *ClientPID)
|
||||||
|
{
|
||||||
|
FIXME("%p %p: stub\n", ClientBinding, ClientPID);
|
||||||
|
return RPC_S_INVALID_BINDING;
|
||||||
|
}
|
||||||
|
|
|
@ -100,6 +100,7 @@ struct connection_ops {
|
||||||
int (*write)(RpcConnection *conn, const void *buffer, unsigned int len);
|
int (*write)(RpcConnection *conn, const void *buffer, unsigned int len);
|
||||||
int (*close)(RpcConnection *conn);
|
int (*close)(RpcConnection *conn);
|
||||||
void (*cancel_call)(RpcConnection *conn);
|
void (*cancel_call)(RpcConnection *conn);
|
||||||
|
RPC_STATUS (*is_server_listening)(const char *endpoint);
|
||||||
int (*wait_for_incoming_data)(RpcConnection *conn);
|
int (*wait_for_incoming_data)(RpcConnection *conn);
|
||||||
size_t (*get_top_of_tower)(unsigned char *tower_data, const char *networkaddr, const char *endpoint);
|
size_t (*get_top_of_tower)(unsigned char *tower_data, const char *networkaddr, const char *endpoint);
|
||||||
RPC_STATUS (*parse_top_of_tower)(const unsigned char *tower_data, size_t tower_size, char **networkaddr, char **endpoint);
|
RPC_STATUS (*parse_top_of_tower)(const unsigned char *tower_data, size_t tower_size, char **networkaddr, char **endpoint);
|
||||||
|
@ -158,6 +159,7 @@ RpcConnection *RPCRT4_GrabConnection( RpcConnection *conn ) DECLSPEC_HIDDEN;
|
||||||
RPC_STATUS RPCRT4_ReleaseConnection(RpcConnection* Connection) DECLSPEC_HIDDEN;
|
RPC_STATUS RPCRT4_ReleaseConnection(RpcConnection* Connection) DECLSPEC_HIDDEN;
|
||||||
RPC_STATUS RPCRT4_OpenClientConnection(RpcConnection* Connection) DECLSPEC_HIDDEN;
|
RPC_STATUS RPCRT4_OpenClientConnection(RpcConnection* Connection) DECLSPEC_HIDDEN;
|
||||||
RPC_STATUS RPCRT4_CloseConnection(RpcConnection* Connection) DECLSPEC_HIDDEN;
|
RPC_STATUS RPCRT4_CloseConnection(RpcConnection* Connection) DECLSPEC_HIDDEN;
|
||||||
|
RPC_STATUS RPCRT4_IsServerListening(const char *protseq, const char *endpoint) DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
RPC_STATUS RPCRT4_ResolveBinding(RpcBinding* Binding, LPCSTR Endpoint) DECLSPEC_HIDDEN;
|
RPC_STATUS RPCRT4_ResolveBinding(RpcBinding* Binding, LPCSTR Endpoint) DECLSPEC_HIDDEN;
|
||||||
RPC_STATUS RPCRT4_SetBindingObject(RpcBinding* Binding, const UUID* ObjectUuid) DECLSPEC_HIDDEN;
|
RPC_STATUS RPCRT4_SetBindingObject(RpcBinding* Binding, const UUID* ObjectUuid) DECLSPEC_HIDDEN;
|
||||||
|
|
|
@ -80,7 +80,7 @@ static BOOL start_rpcss(void)
|
||||||
lstrcatW( cmd, rpcss );
|
lstrcatW( cmd, rpcss );
|
||||||
|
|
||||||
Wow64DisableWow64FsRedirection( &redir );
|
Wow64DisableWow64FsRedirection( &redir );
|
||||||
rslt = CreateProcessW( cmd, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi );
|
rslt = CreateProcessW( cmd, cmd, NULL, NULL, FALSE, DETACHED_PROCESS, NULL, NULL, &si, &pi );
|
||||||
Wow64RevertWow64FsRedirection( redir );
|
Wow64RevertWow64FsRedirection( redir );
|
||||||
|
|
||||||
if (rslt)
|
if (rslt)
|
||||||
|
|
|
@ -740,9 +740,18 @@ static RPC_STATUS RPCRT4_start_listen(BOOL auto_listen)
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void RPCRT4_stop_listen(BOOL auto_listen)
|
static RPC_STATUS RPCRT4_stop_listen(BOOL auto_listen)
|
||||||
{
|
{
|
||||||
|
RPC_STATUS status = RPC_S_OK;
|
||||||
|
|
||||||
EnterCriticalSection(&listen_cs);
|
EnterCriticalSection(&listen_cs);
|
||||||
|
|
||||||
|
if (!std_listen)
|
||||||
|
{
|
||||||
|
status = RPC_S_NOT_LISTENING;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
if (auto_listen || (--manual_listen_count == 0))
|
if (auto_listen || (--manual_listen_count == 0))
|
||||||
{
|
{
|
||||||
if (listen_count != 0 && --listen_count == 0) {
|
if (listen_count != 0 && --listen_count == 0) {
|
||||||
|
@ -757,12 +766,14 @@ static void RPCRT4_stop_listen(BOOL auto_listen)
|
||||||
EnterCriticalSection(&listen_cs);
|
EnterCriticalSection(&listen_cs);
|
||||||
if (listen_done_event) SetEvent( listen_done_event );
|
if (listen_done_event) SetEvent( listen_done_event );
|
||||||
listen_done_event = 0;
|
listen_done_event = 0;
|
||||||
LeaveCriticalSection(&listen_cs);
|
goto done;
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
assert(listen_count >= 0);
|
assert(listen_count >= 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
done:
|
||||||
LeaveCriticalSection(&listen_cs);
|
LeaveCriticalSection(&listen_cs);
|
||||||
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
static BOOL RPCRT4_protseq_is_endpoint_registered(RpcServerProtseq *protseq, const char *endpoint)
|
static BOOL RPCRT4_protseq_is_endpoint_registered(RpcServerProtseq *protseq, const char *endpoint)
|
||||||
|
@ -1053,10 +1064,8 @@ void RPCRT4_destroy_all_protseqs(void)
|
||||||
EnterCriticalSection(&server_cs);
|
EnterCriticalSection(&server_cs);
|
||||||
LIST_FOR_EACH_ENTRY_SAFE(cps, cursor2, &protseqs, RpcServerProtseq, entry)
|
LIST_FOR_EACH_ENTRY_SAFE(cps, cursor2, &protseqs, RpcServerProtseq, entry)
|
||||||
{
|
{
|
||||||
#ifndef __REACTOS__
|
|
||||||
if (listen_count != 0)
|
if (listen_count != 0)
|
||||||
RPCRT4_sync_with_server_thread(cps);
|
RPCRT4_sync_with_server_thread(cps);
|
||||||
#endif
|
|
||||||
destroy_serverprotoseq(cps);
|
destroy_serverprotoseq(cps);
|
||||||
}
|
}
|
||||||
LeaveCriticalSection(&server_cs);
|
LeaveCriticalSection(&server_cs);
|
||||||
|
@ -1540,9 +1549,7 @@ RPC_STATUS WINAPI RpcMgmtStopServerListening ( RPC_BINDING_HANDLE Binding )
|
||||||
return RPC_S_WRONG_KIND_OF_BINDING;
|
return RPC_S_WRONG_KIND_OF_BINDING;
|
||||||
}
|
}
|
||||||
|
|
||||||
RPCRT4_stop_listen(FALSE);
|
return RPCRT4_stop_listen(FALSE);
|
||||||
|
|
||||||
return RPC_S_OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
@ -1647,9 +1654,15 @@ RPC_STATUS WINAPI RpcMgmtIsServerListening(RPC_BINDING_HANDLE Binding)
|
||||||
|
|
||||||
TRACE("(%p)\n", Binding);
|
TRACE("(%p)\n", Binding);
|
||||||
|
|
||||||
EnterCriticalSection(&listen_cs);
|
if (Binding) {
|
||||||
if (manual_listen_count > 0) status = RPC_S_OK;
|
RpcBinding *rpc_binding = (RpcBinding*)Binding;
|
||||||
LeaveCriticalSection(&listen_cs);
|
status = RPCRT4_IsServerListening(rpc_binding->Protseq, rpc_binding->Endpoint);
|
||||||
|
}else {
|
||||||
|
EnterCriticalSection(&listen_cs);
|
||||||
|
if (manual_listen_count > 0) status = RPC_S_OK;
|
||||||
|
LeaveCriticalSection(&listen_cs);
|
||||||
|
}
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -245,6 +245,18 @@ static RPC_STATUS rpcrt4_conn_open_pipe(RpcConnection *Connection, LPCSTR pname,
|
||||||
return RPC_S_OK;
|
return RPC_S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static char *ncalrpc_pipe_name(const char *endpoint)
|
||||||
|
{
|
||||||
|
static const char prefix[] = "\\\\.\\pipe\\lrpc\\";
|
||||||
|
char *pipe_name;
|
||||||
|
|
||||||
|
/* protseq=ncalrpc: supposed to use NT LPC ports,
|
||||||
|
* but we'll implement it with named pipes for now */
|
||||||
|
pipe_name = I_RpcAllocate(sizeof(prefix) + strlen(endpoint));
|
||||||
|
strcat(strcpy(pipe_name, prefix), endpoint);
|
||||||
|
return pipe_name;
|
||||||
|
}
|
||||||
|
|
||||||
static RPC_STATUS rpcrt4_ncalrpc_open(RpcConnection* Connection)
|
static RPC_STATUS rpcrt4_ncalrpc_open(RpcConnection* Connection)
|
||||||
{
|
{
|
||||||
RpcConnection_np *npc = (RpcConnection_np *) Connection;
|
RpcConnection_np *npc = (RpcConnection_np *) Connection;
|
||||||
|
@ -304,6 +316,17 @@ static RPC_STATUS rpcrt4_protseq_ncalrpc_open_endpoint(RpcServerProtseq* protseq
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static char *ncacn_pipe_name(const char *endpoint)
|
||||||
|
{
|
||||||
|
static const char prefix[] = "\\\\.";
|
||||||
|
char *pipe_name;
|
||||||
|
|
||||||
|
/* protseq=ncacn_np: named pipes */
|
||||||
|
pipe_name = I_RpcAllocate(sizeof(prefix) + strlen(endpoint));
|
||||||
|
strcat(strcpy(pipe_name, prefix), endpoint);
|
||||||
|
return pipe_name;
|
||||||
|
}
|
||||||
|
|
||||||
static RPC_STATUS rpcrt4_ncacn_np_open(RpcConnection* Connection)
|
static RPC_STATUS rpcrt4_ncacn_np_open(RpcConnection* Connection)
|
||||||
{
|
{
|
||||||
RpcConnection_np *npc = (RpcConnection_np *) Connection;
|
RpcConnection_np *npc = (RpcConnection_np *) Connection;
|
||||||
|
@ -408,7 +431,7 @@ static RPC_STATUS rpcrt4_protseq_ncacn_np_open_endpoint(RpcServerProtseq *protse
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rpcrt4_conn_np_handoff(RpcConnection_np *old_npc, RpcConnection_np *new_npc)
|
static void rpcrt4_conn_np_handoff(RpcConnection_np *old_npc, RpcConnection_np *new_npc)
|
||||||
{
|
{
|
||||||
/* because of the way named pipes work, we'll transfer the connected pipe
|
/* because of the way named pipes work, we'll transfer the connected pipe
|
||||||
* to the child, then reopen the server binding to continue listening */
|
* to the child, then reopen the server binding to continue listening */
|
||||||
|
|
||||||
|
@ -435,6 +458,33 @@ static RPC_STATUS rpcrt4_ncacn_np_handoff(RpcConnection *old_conn, RpcConnection
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static RPC_STATUS is_pipe_listening(const char *pipe_name)
|
||||||
|
{
|
||||||
|
return WaitNamedPipeA(pipe_name, 1) ? RPC_S_OK : RPC_S_NOT_LISTENING;
|
||||||
|
}
|
||||||
|
|
||||||
|
static RPC_STATUS rpcrt4_ncacn_np_is_server_listening(const char *endpoint)
|
||||||
|
{
|
||||||
|
char *pipe_name;
|
||||||
|
RPC_STATUS status;
|
||||||
|
|
||||||
|
pipe_name = ncacn_pipe_name(endpoint);
|
||||||
|
status = is_pipe_listening(pipe_name);
|
||||||
|
I_RpcFree(pipe_name);
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
static RPC_STATUS rpcrt4_ncalrpc_np_is_server_listening(const char *endpoint)
|
||||||
|
{
|
||||||
|
char *pipe_name;
|
||||||
|
RPC_STATUS status;
|
||||||
|
|
||||||
|
pipe_name = ncalrpc_pipe_name(endpoint);
|
||||||
|
status = is_pipe_listening(pipe_name);
|
||||||
|
I_RpcFree(pipe_name);
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
static RPC_STATUS rpcrt4_ncalrpc_handoff(RpcConnection *old_conn, RpcConnection *new_conn)
|
static RPC_STATUS rpcrt4_ncalrpc_handoff(RpcConnection *old_conn, RpcConnection *new_conn)
|
||||||
{
|
{
|
||||||
RPC_STATUS status;
|
RPC_STATUS status;
|
||||||
|
@ -449,7 +499,7 @@ static RPC_STATUS rpcrt4_ncalrpc_handoff(RpcConnection *old_conn, RpcConnection
|
||||||
strcat(strcpy(pname, prefix), old_conn->Endpoint);
|
strcat(strcpy(pname, prefix), old_conn->Endpoint);
|
||||||
status = rpcrt4_conn_create_pipe(old_conn, pname);
|
status = rpcrt4_conn_create_pipe(old_conn, pname);
|
||||||
I_RpcFree(pname);
|
I_RpcFree(pname);
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -715,9 +765,9 @@ static void *rpcrt4_protseq_np_get_wait_array(RpcServerProtseq *protseq, void *p
|
||||||
HANDLE *objs = prev_array;
|
HANDLE *objs = prev_array;
|
||||||
RpcConnection_np *conn;
|
RpcConnection_np *conn;
|
||||||
RpcServerProtseq_np *npps = CONTAINING_RECORD(protseq, RpcServerProtseq_np, common);
|
RpcServerProtseq_np *npps = CONTAINING_RECORD(protseq, RpcServerProtseq_np, common);
|
||||||
|
|
||||||
EnterCriticalSection(&protseq->cs);
|
EnterCriticalSection(&protseq->cs);
|
||||||
|
|
||||||
/* open and count connections */
|
/* open and count connections */
|
||||||
*count = 1;
|
*count = 1;
|
||||||
conn = CONTAINING_RECORD(protseq->conn, RpcConnection_np, common);
|
conn = CONTAINING_RECORD(protseq->conn, RpcConnection_np, common);
|
||||||
|
@ -727,7 +777,7 @@ static void *rpcrt4_protseq_np_get_wait_array(RpcServerProtseq *protseq, void *p
|
||||||
(*count)++;
|
(*count)++;
|
||||||
conn = CONTAINING_RECORD(conn->common.Next, RpcConnection_np, common);
|
conn = CONTAINING_RECORD(conn->common.Next, RpcConnection_np, common);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* make array of connections */
|
/* make array of connections */
|
||||||
if (objs)
|
if (objs)
|
||||||
objs = HeapReAlloc(GetProcessHeap(), 0, objs, *count*sizeof(HANDLE));
|
objs = HeapReAlloc(GetProcessHeap(), 0, objs, *count*sizeof(HANDLE));
|
||||||
|
@ -739,7 +789,7 @@ static void *rpcrt4_protseq_np_get_wait_array(RpcServerProtseq *protseq, void *p
|
||||||
LeaveCriticalSection(&protseq->cs);
|
LeaveCriticalSection(&protseq->cs);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
objs[0] = npps->mgr_event;
|
objs[0] = npps->mgr_event;
|
||||||
*count = 1;
|
*count = 1;
|
||||||
conn = CONTAINING_RECORD(protseq->conn, RpcConnection_np, common);
|
conn = CONTAINING_RECORD(protseq->conn, RpcConnection_np, common);
|
||||||
|
@ -764,7 +814,7 @@ static int rpcrt4_protseq_np_wait_for_new_connection(RpcServerProtseq *protseq,
|
||||||
DWORD res;
|
DWORD res;
|
||||||
RpcConnection *cconn;
|
RpcConnection *cconn;
|
||||||
RpcConnection_np *conn;
|
RpcConnection_np *conn;
|
||||||
|
|
||||||
if (!objs)
|
if (!objs)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
@ -994,6 +1044,7 @@ static size_t rpcrt4_ip_tcp_get_top_of_tower(unsigned char *tower_data,
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ERR("unexpected protocol family %d\n", ai->ai_family);
|
ERR("unexpected protocol family %d\n", ai->ai_family);
|
||||||
|
freeaddrinfo(ai);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1473,7 +1524,7 @@ static RPC_STATUS rpcrt4_protseq_ncacn_ip_tcp_open_endpoint(RpcServerProtseq *pr
|
||||||
conn->Next = protseq->conn;
|
conn->Next = protseq->conn;
|
||||||
protseq->conn = first_connection;
|
protseq->conn = first_connection;
|
||||||
LeaveCriticalSection(&protseq->cs);
|
LeaveCriticalSection(&protseq->cs);
|
||||||
|
|
||||||
TRACE("listening on %s\n", endpoint);
|
TRACE("listening on %s\n", endpoint);
|
||||||
return RPC_S_OK;
|
return RPC_S_OK;
|
||||||
}
|
}
|
||||||
|
@ -1517,6 +1568,8 @@ static int rpcrt4_conn_tcp_read(RpcConnection *Connection,
|
||||||
return -1;
|
return -1;
|
||||||
else if (r > 0)
|
else if (r > 0)
|
||||||
bytes_read += r;
|
bytes_read += r;
|
||||||
|
else if (errno == EINTR)
|
||||||
|
continue;
|
||||||
else if (errno != EAGAIN)
|
else if (errno != EAGAIN)
|
||||||
{
|
{
|
||||||
WARN("recv() failed: %s\n", strerror(errno));
|
WARN("recv() failed: %s\n", strerror(errno));
|
||||||
|
@ -1542,6 +1595,8 @@ static int rpcrt4_conn_tcp_write(RpcConnection *Connection,
|
||||||
int r = send(tcpc->sock, (const char *)buffer + bytes_written, count - bytes_written, 0);
|
int r = send(tcpc->sock, (const char *)buffer + bytes_written, count - bytes_written, 0);
|
||||||
if (r >= 0)
|
if (r >= 0)
|
||||||
bytes_written += r;
|
bytes_written += r;
|
||||||
|
else if (errno == EINTR)
|
||||||
|
continue;
|
||||||
else if (errno != EAGAIN)
|
else if (errno != EAGAIN)
|
||||||
return -1;
|
return -1;
|
||||||
else
|
else
|
||||||
|
@ -1574,6 +1629,12 @@ static void rpcrt4_conn_tcp_cancel_call(RpcConnection *Connection)
|
||||||
rpcrt4_sock_wait_cancel(tcpc);
|
rpcrt4_sock_wait_cancel(tcpc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static RPC_STATUS rpcrt4_conn_tcp_is_server_listening(const char *endpoint)
|
||||||
|
{
|
||||||
|
FIXME("\n");
|
||||||
|
return RPC_S_ACCESS_DENIED;
|
||||||
|
}
|
||||||
|
|
||||||
static int rpcrt4_conn_tcp_wait_for_incoming_data(RpcConnection *Connection)
|
static int rpcrt4_conn_tcp_wait_for_incoming_data(RpcConnection *Connection)
|
||||||
{
|
{
|
||||||
RpcConnection_tcp *tcpc = (RpcConnection_tcp *) Connection;
|
RpcConnection_tcp *tcpc = (RpcConnection_tcp *) Connection;
|
||||||
|
@ -1639,7 +1700,7 @@ static void *rpcrt4_protseq_sock_get_wait_array(RpcServerProtseq *protseq, void
|
||||||
RpcServerProtseq_sock *sockps = CONTAINING_RECORD(protseq, RpcServerProtseq_sock, common);
|
RpcServerProtseq_sock *sockps = CONTAINING_RECORD(protseq, RpcServerProtseq_sock, common);
|
||||||
|
|
||||||
EnterCriticalSection(&protseq->cs);
|
EnterCriticalSection(&protseq->cs);
|
||||||
|
|
||||||
/* open and count connections */
|
/* open and count connections */
|
||||||
*count = 1;
|
*count = 1;
|
||||||
conn = (RpcConnection_tcp *)protseq->conn;
|
conn = (RpcConnection_tcp *)protseq->conn;
|
||||||
|
@ -1648,7 +1709,7 @@ static void *rpcrt4_protseq_sock_get_wait_array(RpcServerProtseq *protseq, void
|
||||||
(*count)++;
|
(*count)++;
|
||||||
conn = (RpcConnection_tcp *)conn->common.Next;
|
conn = (RpcConnection_tcp *)conn->common.Next;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* make array of connections */
|
/* make array of connections */
|
||||||
if (poll_info)
|
if (poll_info)
|
||||||
poll_info = HeapReAlloc(GetProcessHeap(), 0, poll_info, *count*sizeof(*poll_info));
|
poll_info = HeapReAlloc(GetProcessHeap(), 0, poll_info, *count*sizeof(*poll_info));
|
||||||
|
@ -1690,10 +1751,10 @@ static int rpcrt4_protseq_sock_wait_for_new_connection(RpcServerProtseq *protseq
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
RpcConnection *cconn;
|
RpcConnection *cconn;
|
||||||
RpcConnection_tcp *conn;
|
RpcConnection_tcp *conn;
|
||||||
|
|
||||||
if (!poll_info)
|
if (!poll_info)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
ret = poll(poll_info, count, -1);
|
ret = poll(poll_info, count, -1);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
|
@ -1902,7 +1963,7 @@ typedef struct _RpcHttpAsyncData
|
||||||
LONG refs;
|
LONG refs;
|
||||||
HANDLE completion_event;
|
HANDLE completion_event;
|
||||||
WORD async_result;
|
WORD async_result;
|
||||||
INTERNET_BUFFERSA inet_buffers;
|
INTERNET_BUFFERSW inet_buffers;
|
||||||
CRITICAL_SECTION cs;
|
CRITICAL_SECTION cs;
|
||||||
} RpcHttpAsyncData;
|
} RpcHttpAsyncData;
|
||||||
|
|
||||||
|
@ -2009,7 +2070,7 @@ static RpcConnection *rpcrt4_ncacn_http_alloc(void)
|
||||||
TRACE("async data = %p\n", httpc->async_data);
|
TRACE("async data = %p\n", httpc->async_data);
|
||||||
httpc->cancel_event = CreateEventW(NULL, FALSE, FALSE, NULL);
|
httpc->cancel_event = CreateEventW(NULL, FALSE, FALSE, NULL);
|
||||||
httpc->async_data->refs = 1;
|
httpc->async_data->refs = 1;
|
||||||
httpc->async_data->inet_buffers.dwStructSize = sizeof(INTERNET_BUFFERSA);
|
httpc->async_data->inet_buffers.dwStructSize = sizeof(INTERNET_BUFFERSW);
|
||||||
httpc->async_data->inet_buffers.lpvBuffer = NULL;
|
httpc->async_data->inet_buffers.lpvBuffer = NULL;
|
||||||
InitializeCriticalSection(&httpc->async_data->cs);
|
InitializeCriticalSection(&httpc->async_data->cs);
|
||||||
httpc->async_data->cs.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": RpcHttpAsyncData.cs");
|
httpc->async_data->cs.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": RpcHttpAsyncData.cs");
|
||||||
|
@ -2254,9 +2315,47 @@ static RPC_STATUS rpcrt4_http_internet_connect(RpcConnection_http *httpc)
|
||||||
return RPC_S_OK;
|
return RPC_S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int rpcrt4_http_async_read(HINTERNET req, RpcHttpAsyncData *async_data, HANDLE cancel_event,
|
||||||
|
void *buffer, unsigned int count)
|
||||||
|
{
|
||||||
|
char *buf = buffer;
|
||||||
|
BOOL ret;
|
||||||
|
unsigned int bytes_left = count;
|
||||||
|
RPC_STATUS status = RPC_S_OK;
|
||||||
|
|
||||||
|
async_data->inet_buffers.lpvBuffer = HeapAlloc(GetProcessHeap(), 0, count);
|
||||||
|
|
||||||
|
while (bytes_left)
|
||||||
|
{
|
||||||
|
async_data->inet_buffers.dwBufferLength = bytes_left;
|
||||||
|
prepare_async_request(async_data);
|
||||||
|
ret = InternetReadFileExW(req, &async_data->inet_buffers, IRF_ASYNC, 0);
|
||||||
|
status = wait_async_request(async_data, ret, cancel_event);
|
||||||
|
if (status != RPC_S_OK)
|
||||||
|
{
|
||||||
|
if (status == RPC_S_CALL_CANCELLED)
|
||||||
|
TRACE("call cancelled\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!async_data->inet_buffers.dwBufferLength)
|
||||||
|
break;
|
||||||
|
memcpy(buf, async_data->inet_buffers.lpvBuffer,
|
||||||
|
async_data->inet_buffers.dwBufferLength);
|
||||||
|
|
||||||
|
bytes_left -= async_data->inet_buffers.dwBufferLength;
|
||||||
|
buf += async_data->inet_buffers.dwBufferLength;
|
||||||
|
}
|
||||||
|
|
||||||
|
HeapFree(GetProcessHeap(), 0, async_data->inet_buffers.lpvBuffer);
|
||||||
|
async_data->inet_buffers.lpvBuffer = NULL;
|
||||||
|
|
||||||
|
TRACE("%p %p %u -> %u\n", req, buffer, count, status);
|
||||||
|
return status == RPC_S_OK ? count : -1;
|
||||||
|
}
|
||||||
|
|
||||||
static RPC_STATUS send_echo_request(HINTERNET req, RpcHttpAsyncData *async_data, HANDLE cancel_event)
|
static RPC_STATUS send_echo_request(HINTERNET req, RpcHttpAsyncData *async_data, HANDLE cancel_event)
|
||||||
{
|
{
|
||||||
DWORD bytes_read;
|
|
||||||
BYTE buf[20];
|
BYTE buf[20];
|
||||||
BOOL ret;
|
BOOL ret;
|
||||||
RPC_STATUS status;
|
RPC_STATUS status;
|
||||||
|
@ -2271,12 +2370,23 @@ static RPC_STATUS send_echo_request(HINTERNET req, RpcHttpAsyncData *async_data,
|
||||||
status = rpcrt4_http_check_response(req);
|
status = rpcrt4_http_check_response(req);
|
||||||
if (status != RPC_S_OK) return status;
|
if (status != RPC_S_OK) return status;
|
||||||
|
|
||||||
InternetReadFile(req, buf, sizeof(buf), &bytes_read);
|
rpcrt4_http_async_read(req, async_data, cancel_event, buf, sizeof(buf));
|
||||||
/* FIXME: do something with retrieved data */
|
/* FIXME: do something with retrieved data */
|
||||||
|
|
||||||
return RPC_S_OK;
|
return RPC_S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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];
|
||||||
|
|
||||||
|
sprintfW(header, fmtW, len);
|
||||||
|
if ((HttpAddRequestHeadersW(request, header, -1, HTTP_ADDREQ_FLAG_REPLACE | HTTP_ADDREQ_FLAG_ADD))) return RPC_S_OK;
|
||||||
|
return RPC_S_SERVER_UNAVAILABLE;
|
||||||
|
}
|
||||||
|
|
||||||
/* prepare the in pipe for use by RPC packets */
|
/* prepare the in pipe for use by RPC packets */
|
||||||
static RPC_STATUS rpcrt4_http_prepare_in_pipe(HINTERNET in_request, RpcHttpAsyncData *async_data, HANDLE cancel_event,
|
static RPC_STATUS rpcrt4_http_prepare_in_pipe(HINTERNET in_request, RpcHttpAsyncData *async_data, HANDLE cancel_event,
|
||||||
const UUID *connection_uuid, const UUID *in_pipe_uuid,
|
const UUID *connection_uuid, const UUID *in_pipe_uuid,
|
||||||
|
@ -2298,6 +2408,9 @@ static RPC_STATUS rpcrt4_http_prepare_in_pipe(HINTERNET in_request, RpcHttpAsync
|
||||||
buffers_in.dwStructSize = sizeof(buffers_in);
|
buffers_in.dwStructSize = sizeof(buffers_in);
|
||||||
/* FIXME: get this from the registry */
|
/* FIXME: get this from the registry */
|
||||||
buffers_in.dwBufferTotal = 1024 * 1024 * 1024; /* 1Gb */
|
buffers_in.dwBufferTotal = 1024 * 1024 * 1024; /* 1Gb */
|
||||||
|
status = insert_content_length_header(in_request, buffers_in.dwBufferTotal);
|
||||||
|
if (status != RPC_S_OK) return status;
|
||||||
|
|
||||||
prepare_async_request(async_data);
|
prepare_async_request(async_data);
|
||||||
ret = HttpSendRequestExW(in_request, &buffers_in, NULL, 0, 0);
|
ret = HttpSendRequestExW(in_request, &buffers_in, NULL, 0, 0);
|
||||||
status = wait_async_request(async_data, ret, cancel_event);
|
status = wait_async_request(async_data, ret, cancel_event);
|
||||||
|
@ -2317,14 +2430,13 @@ static RPC_STATUS rpcrt4_http_prepare_in_pipe(HINTERNET in_request, RpcHttpAsync
|
||||||
return RPC_S_OK;
|
return RPC_S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static RPC_STATUS rpcrt4_http_read_http_packet(HINTERNET request, RpcPktHdr *hdr, BYTE **data)
|
static RPC_STATUS rpcrt4_http_read_http_packet(HINTERNET request, RpcHttpAsyncData *async_data,
|
||||||
|
HANDLE cancel_event, RpcPktHdr *hdr, BYTE **data)
|
||||||
{
|
{
|
||||||
BOOL ret;
|
|
||||||
DWORD bytes_read;
|
|
||||||
unsigned short data_len;
|
unsigned short data_len;
|
||||||
|
unsigned int size;
|
||||||
|
|
||||||
ret = InternetReadFile(request, hdr, sizeof(hdr->common), &bytes_read);
|
if (rpcrt4_http_async_read(request, async_data, cancel_event, hdr, sizeof(hdr->common)) < 0)
|
||||||
if (!ret)
|
|
||||||
return RPC_S_SERVER_UNAVAILABLE;
|
return RPC_S_SERVER_UNAVAILABLE;
|
||||||
if (hdr->common.ptype != PKT_HTTP || hdr->common.frag_len < sizeof(hdr->http))
|
if (hdr->common.ptype != PKT_HTTP || hdr->common.frag_len < sizeof(hdr->http))
|
||||||
{
|
{
|
||||||
|
@ -2333,8 +2445,8 @@ static RPC_STATUS rpcrt4_http_read_http_packet(HINTERNET request, RpcPktHdr *hdr
|
||||||
return RPC_S_PROTOCOL_ERROR;
|
return RPC_S_PROTOCOL_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = InternetReadFile(request, &hdr->common + 1, sizeof(hdr->http) - sizeof(hdr->common), &bytes_read);
|
size = sizeof(hdr->http) - sizeof(hdr->common);
|
||||||
if (!ret)
|
if (rpcrt4_http_async_read(request, async_data, cancel_event, &hdr->common + 1, size) < 0)
|
||||||
return RPC_S_SERVER_UNAVAILABLE;
|
return RPC_S_SERVER_UNAVAILABLE;
|
||||||
|
|
||||||
data_len = hdr->common.frag_len - sizeof(hdr->http);
|
data_len = hdr->common.frag_len - sizeof(hdr->http);
|
||||||
|
@ -2343,8 +2455,7 @@ static RPC_STATUS rpcrt4_http_read_http_packet(HINTERNET request, RpcPktHdr *hdr
|
||||||
*data = HeapAlloc(GetProcessHeap(), 0, data_len);
|
*data = HeapAlloc(GetProcessHeap(), 0, data_len);
|
||||||
if (!*data)
|
if (!*data)
|
||||||
return RPC_S_OUT_OF_RESOURCES;
|
return RPC_S_OUT_OF_RESOURCES;
|
||||||
ret = InternetReadFile(request, *data, data_len, &bytes_read);
|
if (rpcrt4_http_async_read(request, async_data, cancel_event, *data, data_len) < 0)
|
||||||
if (!ret)
|
|
||||||
{
|
{
|
||||||
HeapFree(GetProcessHeap(), 0, *data);
|
HeapFree(GetProcessHeap(), 0, *data);
|
||||||
return RPC_S_SERVER_UNAVAILABLE;
|
return RPC_S_SERVER_UNAVAILABLE;
|
||||||
|
@ -2356,6 +2467,7 @@ static RPC_STATUS rpcrt4_http_read_http_packet(HINTERNET request, RpcPktHdr *hdr
|
||||||
if (!RPCRT4_IsValidHttpPacket(hdr, *data, data_len))
|
if (!RPCRT4_IsValidHttpPacket(hdr, *data, data_len))
|
||||||
{
|
{
|
||||||
ERR("invalid http packet\n");
|
ERR("invalid http packet\n");
|
||||||
|
HeapFree(GetProcessHeap(), 0, *data);
|
||||||
return RPC_S_PROTOCOL_ERROR;
|
return RPC_S_PROTOCOL_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2374,7 +2486,6 @@ static RPC_STATUS rpcrt4_http_prepare_out_pipe(HINTERNET out_request, RpcHttpAsy
|
||||||
BYTE *data_from_server;
|
BYTE *data_from_server;
|
||||||
RpcPktHdr pkt_from_server;
|
RpcPktHdr pkt_from_server;
|
||||||
ULONG field1, field3;
|
ULONG field1, field3;
|
||||||
DWORD bytes_read;
|
|
||||||
BYTE buf[20];
|
BYTE buf[20];
|
||||||
|
|
||||||
if (!authorized)
|
if (!authorized)
|
||||||
|
@ -2384,11 +2495,18 @@ static RPC_STATUS rpcrt4_http_prepare_out_pipe(HINTERNET out_request, RpcHttpAsy
|
||||||
if (status != RPC_S_OK) return status;
|
if (status != RPC_S_OK) return status;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
InternetReadFile(out_request, buf, sizeof(buf), &bytes_read);
|
rpcrt4_http_async_read(out_request, async_data, cancel_event, buf, sizeof(buf));
|
||||||
|
|
||||||
hdr = RPCRT4_BuildHttpConnectHeader(TRUE, connection_uuid, out_pipe_uuid, NULL);
|
hdr = RPCRT4_BuildHttpConnectHeader(TRUE, connection_uuid, out_pipe_uuid, NULL);
|
||||||
if (!hdr) return RPC_S_OUT_OF_RESOURCES;
|
if (!hdr) return RPC_S_OUT_OF_RESOURCES;
|
||||||
|
|
||||||
|
status = insert_content_length_header(out_request, hdr->common.frag_len);
|
||||||
|
if (status != RPC_S_OK)
|
||||||
|
{
|
||||||
|
RPCRT4_FreeHeader(hdr);
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
TRACE("sending HTTP connect header to server\n");
|
TRACE("sending HTTP connect header to server\n");
|
||||||
prepare_async_request(async_data);
|
prepare_async_request(async_data);
|
||||||
ret = HttpSendRequestW(out_request, NULL, 0, hdr, hdr->common.frag_len);
|
ret = HttpSendRequestW(out_request, NULL, 0, hdr, hdr->common.frag_len);
|
||||||
|
@ -2399,8 +2517,8 @@ static RPC_STATUS rpcrt4_http_prepare_out_pipe(HINTERNET out_request, RpcHttpAsy
|
||||||
status = rpcrt4_http_check_response(out_request);
|
status = rpcrt4_http_check_response(out_request);
|
||||||
if (status != RPC_S_OK) return status;
|
if (status != RPC_S_OK) return status;
|
||||||
|
|
||||||
status = rpcrt4_http_read_http_packet(out_request, &pkt_from_server,
|
status = rpcrt4_http_read_http_packet(out_request, async_data, cancel_event,
|
||||||
&data_from_server);
|
&pkt_from_server, &data_from_server);
|
||||||
if (status != RPC_S_OK) return status;
|
if (status != RPC_S_OK) return status;
|
||||||
status = RPCRT4_ParseHttpPrepareHeader1(&pkt_from_server, data_from_server,
|
status = RPCRT4_ParseHttpPrepareHeader1(&pkt_from_server, data_from_server,
|
||||||
&field1);
|
&field1);
|
||||||
|
@ -2410,8 +2528,8 @@ static RPC_STATUS rpcrt4_http_prepare_out_pipe(HINTERNET out_request, RpcHttpAsy
|
||||||
|
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
status = rpcrt4_http_read_http_packet(out_request, &pkt_from_server,
|
status = rpcrt4_http_read_http_packet(out_request, async_data, cancel_event,
|
||||||
&data_from_server);
|
&pkt_from_server, &data_from_server);
|
||||||
if (status != RPC_S_OK) return status;
|
if (status != RPC_S_OK) return status;
|
||||||
if (pkt_from_server.http.flags != 0x0001) break;
|
if (pkt_from_server.http.flags != 0x0001) break;
|
||||||
|
|
||||||
|
@ -2816,7 +2934,7 @@ static RPC_STATUS insert_authorization_header(HINTERNET request, ULONG scheme, c
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void drain_content(HINTERNET request)
|
static void drain_content(HINTERNET request, RpcHttpAsyncData *async_data, HANDLE cancel_event)
|
||||||
{
|
{
|
||||||
DWORD count, len = 0, size = sizeof(len);
|
DWORD count, len = 0, size = sizeof(len);
|
||||||
char buf[2048];
|
char buf[2048];
|
||||||
|
@ -2826,7 +2944,7 @@ static void drain_content(HINTERNET request)
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
count = min(sizeof(buf), len);
|
count = min(sizeof(buf), len);
|
||||||
if (!InternetReadFile(request, buf, count, &count) || !count) return;
|
if (rpcrt4_http_async_read(request, async_data, cancel_event, buf, count) <= 0) return;
|
||||||
len -= count;
|
len -= count;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2853,40 +2971,16 @@ static RPC_STATUS authorize_request(RpcConnection_http *httpc, HINTERNET request
|
||||||
|
|
||||||
status = rpcrt4_http_check_response(request);
|
status = rpcrt4_http_check_response(request);
|
||||||
if (status != RPC_S_OK && status != ERROR_ACCESS_DENIED) break;
|
if (status != RPC_S_OK && status != ERROR_ACCESS_DENIED) break;
|
||||||
drain_content(request);
|
drain_content(request, httpc->async_data, httpc->cancel_event);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (info->scheme != RPC_C_HTTP_AUTHN_SCHEME_BASIC)
|
if (info->scheme != RPC_C_HTTP_AUTHN_SCHEME_BASIC)
|
||||||
HttpAddRequestHeadersW(request, authW, -1, HTTP_ADDREQ_FLAG_REPLACE);
|
HttpAddRequestHeadersW(request, authW, -1, HTTP_ADDREQ_FLAG_REPLACE | HTTP_ADDREQ_FLAG_ADD);
|
||||||
|
|
||||||
destroy_authinfo(info);
|
destroy_authinfo(info);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
static RPC_STATUS insert_cookie_header(HINTERNET request, const WCHAR *value)
|
|
||||||
{
|
|
||||||
static const WCHAR cookieW[] = {'C','o','o','k','i','e',':',' '};
|
|
||||||
WCHAR *header, *ptr;
|
|
||||||
int len;
|
|
||||||
RPC_STATUS status = RPC_S_SERVER_UNAVAILABLE;
|
|
||||||
|
|
||||||
if (!value) return RPC_S_OK;
|
|
||||||
|
|
||||||
len = strlenW(value);
|
|
||||||
if ((header = HeapAlloc(GetProcessHeap(), 0, sizeof(cookieW) + (len + 3) * sizeof(WCHAR))))
|
|
||||||
{
|
|
||||||
memcpy(header, cookieW, sizeof(cookieW));
|
|
||||||
ptr = header + sizeof(cookieW) / sizeof(cookieW[0]);
|
|
||||||
memcpy(ptr, value, len * sizeof(WCHAR));
|
|
||||||
ptr[len++] = '\r';
|
|
||||||
ptr[len++] = '\n';
|
|
||||||
ptr[len] = 0;
|
|
||||||
if ((HttpAddRequestHeadersW(request, header, -1, HTTP_ADDREQ_FLAG_ADD_IF_NEW))) status = RPC_S_OK;
|
|
||||||
HeapFree(GetProcessHeap(), 0, header);
|
|
||||||
}
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
static BOOL has_credentials(RpcConnection_http *httpc)
|
static BOOL has_credentials(RpcConnection_http *httpc)
|
||||||
{
|
{
|
||||||
RPC_HTTP_TRANSPORT_CREDENTIALS_W *creds;
|
RPC_HTTP_TRANSPORT_CREDENTIALS_W *creds;
|
||||||
|
@ -2912,6 +3006,51 @@ static BOOL is_secure(RpcConnection_http *httpc)
|
||||||
(httpc->common.QOS->qos->u.HttpCredentials->Flags & RPC_C_HTTP_FLAG_USE_SSL);
|
(httpc->common.QOS->qos->u.HttpCredentials->Flags & RPC_C_HTTP_FLAG_USE_SSL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static RPC_STATUS set_auth_cookie(RpcConnection_http *httpc, const WCHAR *value)
|
||||||
|
{
|
||||||
|
static WCHAR httpW[] = {'h','t','t','p',0};
|
||||||
|
static WCHAR httpsW[] = {'h','t','t','p','s',0};
|
||||||
|
URL_COMPONENTSW uc;
|
||||||
|
DWORD len;
|
||||||
|
WCHAR *url;
|
||||||
|
BOOL ret;
|
||||||
|
|
||||||
|
if (!value) return RPC_S_OK;
|
||||||
|
|
||||||
|
uc.dwStructSize = sizeof(uc);
|
||||||
|
uc.lpszScheme = is_secure(httpc) ? httpsW : httpW;
|
||||||
|
uc.dwSchemeLength = 0;
|
||||||
|
uc.lpszHostName = httpc->servername;
|
||||||
|
uc.dwHostNameLength = 0;
|
||||||
|
uc.nPort = 0;
|
||||||
|
uc.lpszUserName = NULL;
|
||||||
|
uc.dwUserNameLength = 0;
|
||||||
|
uc.lpszPassword = NULL;
|
||||||
|
uc.dwPasswordLength = 0;
|
||||||
|
uc.lpszUrlPath = NULL;
|
||||||
|
uc.dwUrlPathLength = 0;
|
||||||
|
uc.lpszExtraInfo = NULL;
|
||||||
|
uc.dwExtraInfoLength = 0;
|
||||||
|
|
||||||
|
if (!InternetCreateUrlW(&uc, 0, NULL, &len) && (GetLastError() != ERROR_INSUFFICIENT_BUFFER))
|
||||||
|
return RPC_S_SERVER_UNAVAILABLE;
|
||||||
|
|
||||||
|
if (!(url = HeapAlloc(GetProcessHeap(), 0, len))) return RPC_S_OUT_OF_MEMORY;
|
||||||
|
|
||||||
|
len = len / sizeof(WCHAR) - 1;
|
||||||
|
if (!InternetCreateUrlW(&uc, 0, url, &len))
|
||||||
|
{
|
||||||
|
HeapFree(GetProcessHeap(), 0, url);
|
||||||
|
return RPC_S_SERVER_UNAVAILABLE;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = InternetSetCookieW(url, NULL, value);
|
||||||
|
HeapFree(GetProcessHeap(), 0, url);
|
||||||
|
if (!ret) return RPC_S_SERVER_UNAVAILABLE;
|
||||||
|
|
||||||
|
return RPC_S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
static RPC_STATUS rpcrt4_ncacn_http_open(RpcConnection* Connection)
|
static RPC_STATUS rpcrt4_ncacn_http_open(RpcConnection* Connection)
|
||||||
{
|
{
|
||||||
RpcConnection_http *httpc = (RpcConnection_http *)Connection;
|
RpcConnection_http *httpc = (RpcConnection_http *)Connection;
|
||||||
|
@ -2941,9 +3080,9 @@ static RPC_STATUS rpcrt4_ncacn_http_open(RpcConnection* Connection)
|
||||||
|
|
||||||
httpc->async_data->completion_event = CreateEventW(NULL, FALSE, FALSE, NULL);
|
httpc->async_data->completion_event = CreateEventW(NULL, FALSE, FALSE, NULL);
|
||||||
|
|
||||||
status = UuidCreate(&httpc->connection_uuid);
|
UuidCreate(&httpc->connection_uuid);
|
||||||
status = UuidCreate(&httpc->in_pipe_uuid);
|
UuidCreate(&httpc->in_pipe_uuid);
|
||||||
status = UuidCreate(&httpc->out_pipe_uuid);
|
UuidCreate(&httpc->out_pipe_uuid);
|
||||||
|
|
||||||
status = rpcrt4_http_internet_connect(httpc);
|
status = rpcrt4_http_internet_connect(httpc);
|
||||||
if (status != RPC_S_OK)
|
if (status != RPC_S_OK)
|
||||||
|
@ -2965,6 +3104,12 @@ static RPC_STATUS rpcrt4_ncacn_http_open(RpcConnection* Connection)
|
||||||
if (secure) flags |= INTERNET_FLAG_SECURE;
|
if (secure) flags |= INTERNET_FLAG_SECURE;
|
||||||
if (credentials) flags |= INTERNET_FLAG_NO_AUTH;
|
if (credentials) flags |= INTERNET_FLAG_NO_AUTH;
|
||||||
|
|
||||||
|
status = set_auth_cookie(httpc, Connection->CookieAuth);
|
||||||
|
if (status != RPC_S_OK)
|
||||||
|
{
|
||||||
|
HeapFree(GetProcessHeap(), 0, url);
|
||||||
|
return status;
|
||||||
|
}
|
||||||
httpc->in_request = HttpOpenRequestW(httpc->session, wszVerbIn, url, NULL, NULL, wszAcceptTypes,
|
httpc->in_request = HttpOpenRequestW(httpc->session, wszVerbIn, url, NULL, NULL, wszAcceptTypes,
|
||||||
flags, (DWORD_PTR)httpc->async_data);
|
flags, (DWORD_PTR)httpc->async_data);
|
||||||
if (!httpc->in_request)
|
if (!httpc->in_request)
|
||||||
|
@ -2973,12 +3118,7 @@ static RPC_STATUS rpcrt4_ncacn_http_open(RpcConnection* Connection)
|
||||||
HeapFree(GetProcessHeap(), 0, url);
|
HeapFree(GetProcessHeap(), 0, url);
|
||||||
return RPC_S_SERVER_UNAVAILABLE;
|
return RPC_S_SERVER_UNAVAILABLE;
|
||||||
}
|
}
|
||||||
status = insert_cookie_header(httpc->in_request, Connection->CookieAuth);
|
|
||||||
if (status != RPC_S_OK)
|
|
||||||
{
|
|
||||||
HeapFree(GetProcessHeap(), 0, url);
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
if (credentials)
|
if (credentials)
|
||||||
{
|
{
|
||||||
status = authorize_request(httpc, httpc->in_request);
|
status = authorize_request(httpc, httpc->in_request);
|
||||||
|
@ -2993,7 +3133,7 @@ static RPC_STATUS rpcrt4_ncacn_http_open(RpcConnection* Connection)
|
||||||
HeapFree(GetProcessHeap(), 0, url);
|
HeapFree(GetProcessHeap(), 0, url);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
drain_content(httpc->in_request);
|
drain_content(httpc->in_request, httpc->async_data, httpc->cancel_event);
|
||||||
}
|
}
|
||||||
|
|
||||||
httpc->out_request = HttpOpenRequestW(httpc->session, wszVerbOut, url, NULL, NULL, wszAcceptTypes,
|
httpc->out_request = HttpOpenRequestW(httpc->session, wszVerbOut, url, NULL, NULL, wszAcceptTypes,
|
||||||
|
@ -3004,9 +3144,6 @@ static RPC_STATUS rpcrt4_ncacn_http_open(RpcConnection* Connection)
|
||||||
ERR("HttpOpenRequestW failed with error %d\n", GetLastError());
|
ERR("HttpOpenRequestW failed with error %d\n", GetLastError());
|
||||||
return RPC_S_SERVER_UNAVAILABLE;
|
return RPC_S_SERVER_UNAVAILABLE;
|
||||||
}
|
}
|
||||||
status = insert_cookie_header(httpc->out_request, Connection->CookieAuth);
|
|
||||||
if (status != RPC_S_OK)
|
|
||||||
return status;
|
|
||||||
|
|
||||||
if (credentials)
|
if (credentials)
|
||||||
{
|
{
|
||||||
|
@ -3059,39 +3196,7 @@ static int rpcrt4_ncacn_http_read(RpcConnection *Connection,
|
||||||
void *buffer, unsigned int count)
|
void *buffer, unsigned int count)
|
||||||
{
|
{
|
||||||
RpcConnection_http *httpc = (RpcConnection_http *) Connection;
|
RpcConnection_http *httpc = (RpcConnection_http *) Connection;
|
||||||
char *buf = buffer;
|
return rpcrt4_http_async_read(httpc->out_request, httpc->async_data, httpc->cancel_event, buffer, count);
|
||||||
BOOL ret;
|
|
||||||
unsigned int bytes_left = count;
|
|
||||||
RPC_STATUS status = RPC_S_OK;
|
|
||||||
|
|
||||||
httpc->async_data->inet_buffers.lpvBuffer = HeapAlloc(GetProcessHeap(), 0, count);
|
|
||||||
|
|
||||||
while (bytes_left)
|
|
||||||
{
|
|
||||||
httpc->async_data->inet_buffers.dwBufferLength = bytes_left;
|
|
||||||
prepare_async_request(httpc->async_data);
|
|
||||||
ret = InternetReadFileExA(httpc->out_request, &httpc->async_data->inet_buffers, IRF_ASYNC, 0);
|
|
||||||
status = wait_async_request(httpc->async_data, ret, httpc->cancel_event);
|
|
||||||
if(status != RPC_S_OK) {
|
|
||||||
if(status == RPC_S_CALL_CANCELLED)
|
|
||||||
TRACE("call cancelled\n");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!httpc->async_data->inet_buffers.dwBufferLength)
|
|
||||||
break;
|
|
||||||
memcpy(buf, httpc->async_data->inet_buffers.lpvBuffer,
|
|
||||||
httpc->async_data->inet_buffers.dwBufferLength);
|
|
||||||
|
|
||||||
bytes_left -= httpc->async_data->inet_buffers.dwBufferLength;
|
|
||||||
buf += httpc->async_data->inet_buffers.dwBufferLength;
|
|
||||||
}
|
|
||||||
|
|
||||||
HeapFree(GetProcessHeap(), 0, httpc->async_data->inet_buffers.lpvBuffer);
|
|
||||||
httpc->async_data->inet_buffers.lpvBuffer = NULL;
|
|
||||||
|
|
||||||
TRACE("%p %p %u -> %u\n", httpc->out_request, buffer, count, status);
|
|
||||||
return status == RPC_S_OK ? count : -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static RPC_STATUS rpcrt4_ncacn_http_receive_fragment(RpcConnection *Connection, RpcPktHdr **Header, void **Payload)
|
static RPC_STATUS rpcrt4_ncacn_http_receive_fragment(RpcConnection *Connection, RpcPktHdr **Header, void **Payload)
|
||||||
|
@ -3299,6 +3404,12 @@ static void rpcrt4_ncacn_http_cancel_call(RpcConnection *Connection)
|
||||||
SetEvent(httpc->cancel_event);
|
SetEvent(httpc->cancel_event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static RPC_STATUS rpcrt4_ncacn_http_is_server_listening(const char *endpoint)
|
||||||
|
{
|
||||||
|
FIXME("\n");
|
||||||
|
return RPC_S_ACCESS_DENIED;
|
||||||
|
}
|
||||||
|
|
||||||
static int rpcrt4_ncacn_http_wait_for_incoming_data(RpcConnection *Connection)
|
static int rpcrt4_ncacn_http_wait_for_incoming_data(RpcConnection *Connection)
|
||||||
{
|
{
|
||||||
RpcConnection_http *httpc = (RpcConnection_http *) Connection;
|
RpcConnection_http *httpc = (RpcConnection_http *) Connection;
|
||||||
|
@ -3340,6 +3451,7 @@ static const struct connection_ops conn_protseq_list[] = {
|
||||||
rpcrt4_conn_np_write,
|
rpcrt4_conn_np_write,
|
||||||
rpcrt4_conn_np_close,
|
rpcrt4_conn_np_close,
|
||||||
rpcrt4_conn_np_cancel_call,
|
rpcrt4_conn_np_cancel_call,
|
||||||
|
rpcrt4_ncacn_np_is_server_listening,
|
||||||
rpcrt4_conn_np_wait_for_incoming_data,
|
rpcrt4_conn_np_wait_for_incoming_data,
|
||||||
rpcrt4_ncacn_np_get_top_of_tower,
|
rpcrt4_ncacn_np_get_top_of_tower,
|
||||||
rpcrt4_ncacn_np_parse_top_of_tower,
|
rpcrt4_ncacn_np_parse_top_of_tower,
|
||||||
|
@ -3360,6 +3472,7 @@ static const struct connection_ops conn_protseq_list[] = {
|
||||||
rpcrt4_conn_np_write,
|
rpcrt4_conn_np_write,
|
||||||
rpcrt4_conn_np_close,
|
rpcrt4_conn_np_close,
|
||||||
rpcrt4_conn_np_cancel_call,
|
rpcrt4_conn_np_cancel_call,
|
||||||
|
rpcrt4_ncalrpc_np_is_server_listening,
|
||||||
rpcrt4_conn_np_wait_for_incoming_data,
|
rpcrt4_conn_np_wait_for_incoming_data,
|
||||||
rpcrt4_ncalrpc_get_top_of_tower,
|
rpcrt4_ncalrpc_get_top_of_tower,
|
||||||
rpcrt4_ncalrpc_parse_top_of_tower,
|
rpcrt4_ncalrpc_parse_top_of_tower,
|
||||||
|
@ -3380,6 +3493,7 @@ static const struct connection_ops conn_protseq_list[] = {
|
||||||
rpcrt4_conn_tcp_write,
|
rpcrt4_conn_tcp_write,
|
||||||
rpcrt4_conn_tcp_close,
|
rpcrt4_conn_tcp_close,
|
||||||
rpcrt4_conn_tcp_cancel_call,
|
rpcrt4_conn_tcp_cancel_call,
|
||||||
|
rpcrt4_conn_tcp_is_server_listening,
|
||||||
rpcrt4_conn_tcp_wait_for_incoming_data,
|
rpcrt4_conn_tcp_wait_for_incoming_data,
|
||||||
rpcrt4_ncacn_ip_tcp_get_top_of_tower,
|
rpcrt4_ncacn_ip_tcp_get_top_of_tower,
|
||||||
rpcrt4_ncacn_ip_tcp_parse_top_of_tower,
|
rpcrt4_ncacn_ip_tcp_parse_top_of_tower,
|
||||||
|
@ -3400,6 +3514,7 @@ static const struct connection_ops conn_protseq_list[] = {
|
||||||
rpcrt4_ncacn_http_write,
|
rpcrt4_ncacn_http_write,
|
||||||
rpcrt4_ncacn_http_close,
|
rpcrt4_ncacn_http_close,
|
||||||
rpcrt4_ncacn_http_cancel_call,
|
rpcrt4_ncacn_http_cancel_call,
|
||||||
|
rpcrt4_ncacn_http_is_server_listening,
|
||||||
rpcrt4_ncacn_http_wait_for_incoming_data,
|
rpcrt4_ncacn_http_wait_for_incoming_data,
|
||||||
rpcrt4_ncacn_http_get_top_of_tower,
|
rpcrt4_ncacn_http_get_top_of_tower,
|
||||||
rpcrt4_ncacn_http_parse_top_of_tower,
|
rpcrt4_ncacn_http_parse_top_of_tower,
|
||||||
|
@ -3573,6 +3688,20 @@ RPC_STATUS RPCRT4_ReleaseConnection(RpcConnection* Connection)
|
||||||
return RPC_S_OK;
|
return RPC_S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RPC_STATUS RPCRT4_IsServerListening(const char *protseq, const char *endpoint)
|
||||||
|
{
|
||||||
|
const struct connection_ops *ops;
|
||||||
|
|
||||||
|
ops = rpcrt4_get_conn_protseq_ops(protseq);
|
||||||
|
if (!ops)
|
||||||
|
{
|
||||||
|
FIXME("not supported for protseq %s\n", protseq);
|
||||||
|
return RPC_S_INVALID_BINDING;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ops->is_server_listening(endpoint);
|
||||||
|
}
|
||||||
|
|
||||||
RPC_STATUS RpcTransport_GetTopOfTower(unsigned char *tower_data,
|
RPC_STATUS RpcTransport_GetTopOfTower(unsigned char *tower_data,
|
||||||
size_t *tower_size,
|
size_t *tower_size,
|
||||||
const char *protseq,
|
const char *protseq,
|
||||||
|
|
|
@ -32,7 +32,7 @@
|
||||||
32 stub I_RpcBindingInqDynamicEndPoint
|
32 stub I_RpcBindingInqDynamicEndPoint
|
||||||
33 stub I_RpcBindingInqDynamicEndPointA
|
33 stub I_RpcBindingInqDynamicEndPointA
|
||||||
34 stub I_RpcBindingInqDynamicEndPointW
|
34 stub I_RpcBindingInqDynamicEndPointW
|
||||||
35 stub I_RpcBindingInqLocalClientPID
|
35 stdcall I_RpcBindingInqLocalClientPID(ptr ptr)
|
||||||
# I_RpcBindingInqMarshalledTargetInfo
|
# I_RpcBindingInqMarshalledTargetInfo
|
||||||
37 stub I_RpcBindingInqSecurityContext
|
37 stub I_RpcBindingInqSecurityContext
|
||||||
38 stdcall I_RpcBindingInqTransportType(ptr ptr)
|
38 stdcall I_RpcBindingInqTransportType(ptr ptr)
|
||||||
|
@ -100,10 +100,10 @@
|
||||||
100 stub I_RpcTransIoCancelled
|
100 stub I_RpcTransIoCancelled
|
||||||
101 stub I_RpcTransServerNewConnection
|
101 stub I_RpcTransServerNewConnection
|
||||||
102 stub I_RpcTurnOnEEInfoPropagation
|
102 stub I_RpcTurnOnEEInfoPropagation
|
||||||
103 stub I_UuidCreate
|
103 stdcall I_UuidCreate(ptr)
|
||||||
104 stub MIDL_wchar_strcpy
|
104 stub MIDL_wchar_strcpy
|
||||||
105 stub MIDL_wchar_strlen
|
105 stub MIDL_wchar_strlen
|
||||||
106 stub MesBufferHandleReset
|
106 stdcall MesBufferHandleReset(ptr long long ptr long ptr)
|
||||||
107 stdcall MesDecodeBufferHandleCreate(ptr long ptr)
|
107 stdcall MesDecodeBufferHandleCreate(ptr long ptr)
|
||||||
108 stdcall MesDecodeIncrementalHandleCreate(ptr ptr ptr)
|
108 stdcall MesDecodeIncrementalHandleCreate(ptr ptr ptr)
|
||||||
109 stdcall MesEncodeDynBufferHandleCreate(ptr ptr ptr)
|
109 stdcall MesEncodeDynBufferHandleCreate(ptr ptr ptr)
|
||||||
|
@ -465,7 +465,7 @@
|
||||||
465 stub RpcSsContextLockShared
|
465 stub RpcSsContextLockShared
|
||||||
466 stdcall RpcSsDestroyClientContext(ptr)
|
466 stdcall RpcSsDestroyClientContext(ptr)
|
||||||
467 stub RpcSsDisableAllocate
|
467 stub RpcSsDisableAllocate
|
||||||
468 stub RpcSsDontSerializeContext
|
468 stdcall RpcSsDontSerializeContext()
|
||||||
469 stub RpcSsEnableAllocate
|
469 stub RpcSsEnableAllocate
|
||||||
470 stub RpcSsFree
|
470 stub RpcSsFree
|
||||||
471 stub RpcSsGetContextBinding
|
471 stub RpcSsGetContextBinding
|
||||||
|
|
|
@ -431,6 +431,15 @@ RPC_STATUS WINAPI UuidCreateSequential(UUID *Uuid)
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
* I_UuidCreate [RPCRT4.@]
|
||||||
|
*
|
||||||
|
* See UuidCreateSequential()
|
||||||
|
*/
|
||||||
|
RPC_STATUS WINAPI I_UuidCreate(UUID *Uuid)
|
||||||
|
{
|
||||||
|
return UuidCreateSequential(Uuid);
|
||||||
|
}
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* UuidHash [RPCRT4.@]
|
* UuidHash [RPCRT4.@]
|
||||||
|
|
|
@ -1,15 +1,57 @@
|
||||||
diff -prudN .\wine\dlls\rpcrt4/rpc_epmap.c .\reactos\dll\win32\rpcrt4/rpc_epmap.c
|
diff -pudN --strip-trailing-cr e:\wine\dlls\rpcrt4/cproxy.c e:\reactos\dll\win32\rpcrt4/cproxy.c
|
||||||
--- .\wine\dlls\rpcrt4/rpc_epmap.c 2014-05-09 03:43:55.965035900 +0200
|
--- e:\wine\dlls\rpcrt4/cproxy.c 2015-02-21 17:13:10 +0100
|
||||||
+++ .\reactos\dll\win32\rpcrt4/rpc_epmap.c 2013-12-27 18:11:56.421567500 +0100
|
+++ e:\reactos\dll\win32\rpcrt4/cproxy.c 2015-08-27 22:03:34 +0100
|
||||||
@@ -92,7 +80,7 @@ static BOOL start_rpcss(void)
|
@@ -167,6 +150,30 @@ static inline void init_thunk( struct th
|
||||||
lstrcatW( cmd, rpcss );
|
thunk->call_stubless = call_stubless_func;
|
||||||
|
}
|
||||||
|
|
||||||
Wow64DisableWow64FsRedirection( &redir );
|
+#elif defined(__arm__)
|
||||||
- rslt = CreateProcessW( cmd, cmd, NULL, NULL, FALSE, DETACHED_PROCESS, NULL, NULL, &si, &pi );
|
+
|
||||||
+ rslt = CreateProcessW( cmd, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi );
|
+extern void call_stubless_func(void);
|
||||||
Wow64RevertWow64FsRedirection( redir );
|
+__ASM_GLOBAL_FUNC(call_stubless_func,
|
||||||
|
+ "DCD 0xDEFC\n\t" // _assertfail
|
||||||
|
+ "" );
|
||||||
|
+
|
||||||
|
+#include "pshpack1.h"
|
||||||
|
+struct thunk
|
||||||
|
+{
|
||||||
|
+ DWORD assertfail;
|
||||||
|
+};
|
||||||
|
+#include "poppack.h"
|
||||||
|
+
|
||||||
|
+static const struct thunk thunk_template =
|
||||||
|
+{
|
||||||
|
+ { 0xDEFC } /* _assertfail */
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static inline void init_thunk( struct thunk *thunk, unsigned int index )
|
||||||
|
+{
|
||||||
|
+ *thunk = thunk_template;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
#else /* __i386__ */
|
||||||
|
|
||||||
if (rslt)
|
#warning You must implement stubless proxies for your CPU
|
||||||
|
diff -pudN --strip-trailing-cr e:\wine\dlls\rpcrt4/cstub.c e:\reactos\dll\win32\rpcrt4/cstub.c
|
||||||
|
--- e:\wine\dlls\rpcrt4/cstub.c 2015-10-30 18:41:53 +0100
|
||||||
|
+++ e:\reactos\dll\win32\rpcrt4/cstub.c 2015-11-16 22:55:49 +0100
|
||||||
|
@@ -174,6 +156,13 @@ 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__)
|
||||||
|
+typedef struct
|
||||||
|
+{
|
||||||
|
+ DWORD offset;
|
||||||
|
+} vtbl_method_t;
|
||||||
|
+static const BYTE opcodes[1];
|
||||||
|
+
|
||||||
|
#else
|
||||||
|
|
||||||
|
#warning You must implement delegated proxies/stubs for your CPU
|
||||||
|
diff -pudN --strip-trailing-cr e:\wine\dlls\rpcrt4/rpc_epmap.c e:\reactos\dll\win32\rpcrt4/rpc_epmap.c
|
||||||
|
--- e:\wine\dlls\rpcrt4/rpc_epmap.c 2015-02-21 17:13:10 +0100
|
||||||
|
+++ e:\reactos\dll\win32\rpcrt4/rpc_epmap.c 2015-11-16 22:55:50 +0100
|
||||||
@@ -162,7 +150,7 @@ static RPC_STATUS get_epm_handle_server(
|
@@ -162,7 +150,7 @@ static RPC_STATUS get_epm_handle_server(
|
||||||
|
|
||||||
static LONG WINAPI rpc_filter(EXCEPTION_POINTERS *__eptr)
|
static LONG WINAPI rpc_filter(EXCEPTION_POINTERS *__eptr)
|
||||||
|
@ -19,24 +61,18 @@ diff -prudN .\wine\dlls\rpcrt4/rpc_epmap.c .\reactos\dll\win32\rpcrt4/rpc_epmap.
|
||||||
{
|
{
|
||||||
case EXCEPTION_ACCESS_VIOLATION:
|
case EXCEPTION_ACCESS_VIOLATION:
|
||||||
case EXCEPTION_ILLEGAL_INSTRUCTION:
|
case EXCEPTION_ILLEGAL_INSTRUCTION:
|
||||||
diff -prudN .\wine\dlls\rpcrt4/rpc_server.c .\reactos\dll\win32\rpcrt4/rpc_server.c
|
diff -pudN --strip-trailing-cr e:\wine\dlls\rpcrt4/rpc_transport.c e:\reactos\dll\win32\rpcrt4/rpc_transport.c
|
||||||
--- .\wine\dlls\rpcrt4/rpc_server.c 2014-05-09 03:43:55.973036400 +0200
|
--- e:\wine\dlls\rpcrt4/rpc_transport.c 2015-11-01 09:49:28 +0100
|
||||||
+++ .\reactos\dll\win32\rpcrt4/rpc_server.c 2013-12-27 18:11:56.780368100 +0100
|
+++ e:\reactos\dll\win32\rpcrt4/rpc_transport.c 2015-11-16 22:55:50 +0100
|
||||||
@@ -1075,8 +1053,10 @@ void RPCRT4_destroy_all_protseqs(void)
|
@@ -102,6 +79,7 @@
|
||||||
EnterCriticalSection(&server_cs);
|
|
||||||
LIST_FOR_EACH_ENTRY_SAFE(cps, cursor2, &protseqs, RpcServerProtseq, entry)
|
#define DEFAULT_NCACN_HTTP_TIMEOUT (60 * 1000)
|
||||||
{
|
|
||||||
+#ifndef __REACTOS__
|
+#undef ARRAYSIZE
|
||||||
if (listen_count != 0)
|
#define ARRAYSIZE(a) (sizeof((a)) / sizeof((a)[0]))
|
||||||
RPCRT4_sync_with_server_thread(cps);
|
|
||||||
+#endif
|
WINE_DEFAULT_DEBUG_CHANNEL(rpc);
|
||||||
destroy_serverprotoseq(cps);
|
@@ -114,31 +92,41 @@ typedef struct _RpcConnection_np
|
||||||
}
|
|
||||||
LeaveCriticalSection(&server_cs);
|
|
||||||
diff -prudN .\wine\dlls\rpcrt4/rpc_transport.c .\reactos\dll\win32\rpcrt4/rpc_transport.c
|
|
||||||
--- .\wine\dlls\rpcrt4/rpc_transport.c 2014-05-09 03:43:55.977036600 +0200
|
|
||||||
+++ .\reactos\dll\win32\rpcrt4/rpc_transport.c 2014-05-09 03:10:59.250551600 +0200
|
|
||||||
@@ -113,31 +91,41 @@ typedef struct _RpcConnection_np
|
|
||||||
{
|
{
|
||||||
RpcConnection common;
|
RpcConnection common;
|
||||||
HANDLE pipe;
|
HANDLE pipe;
|
||||||
|
@ -85,7 +121,7 @@ diff -prudN .\wine\dlls\rpcrt4/rpc_transport.c .\reactos\dll\win32\rpcrt4/rpc_tr
|
||||||
case ERROR_NO_DATA_DETECTED:
|
case ERROR_NO_DATA_DETECTED:
|
||||||
/* client has disconnected, retry */
|
/* client has disconnected, retry */
|
||||||
DisconnectNamedPipe( npc->pipe );
|
DisconnectNamedPipe( npc->pipe );
|
||||||
@@ -150,6 +138,7 @@ static DWORD CALLBACK listen_thread(void
|
@@ -151,6 +139,7 @@ static DWORD CALLBACK listen_thread(void
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -93,7 +129,7 @@ diff -prudN .\wine\dlls\rpcrt4/rpc_transport.c .\reactos\dll\win32\rpcrt4/rpc_tr
|
||||||
static RPC_STATUS rpcrt4_conn_listen_pipe(RpcConnection_np *npc)
|
static RPC_STATUS rpcrt4_conn_listen_pipe(RpcConnection_np *npc)
|
||||||
{
|
{
|
||||||
if (npc->listening)
|
if (npc->listening)
|
||||||
@@ -165,13 +154,14 @@ static RPC_STATUS rpcrt4_conn_listen_pip
|
@@ -166,13 +155,14 @@ static RPC_STATUS rpcrt4_conn_listen_pip
|
||||||
}
|
}
|
||||||
return RPC_S_OK;
|
return RPC_S_OK;
|
||||||
}
|
}
|
||||||
|
@ -109,7 +145,7 @@ diff -prudN .\wine\dlls\rpcrt4/rpc_transport.c .\reactos\dll\win32\rpcrt4/rpc_tr
|
||||||
PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE,
|
PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE,
|
||||||
PIPE_UNLIMITED_INSTANCES,
|
PIPE_UNLIMITED_INSTANCES,
|
||||||
RPC_MAX_PACKET_SIZE, RPC_MAX_PACKET_SIZE, 5000, NULL);
|
RPC_MAX_PACKET_SIZE, RPC_MAX_PACKET_SIZE, 5000, NULL);
|
||||||
@@ -183,6 +173,9 @@ static RPC_STATUS rpcrt4_conn_create_pip
|
@@ -184,6 +174,9 @@ static RPC_STATUS rpcrt4_conn_create_pip
|
||||||
return RPC_S_CANT_CREATE_ENDPOINT;
|
return RPC_S_CANT_CREATE_ENDPOINT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -119,7 +155,7 @@ diff -prudN .\wine\dlls\rpcrt4/rpc_transport.c .\reactos\dll\win32\rpcrt4/rpc_tr
|
||||||
/* Note: we don't call ConnectNamedPipe here because it must be done in the
|
/* Note: we don't call ConnectNamedPipe here because it must be done in the
|
||||||
* server thread as the thread must be alertable */
|
* server thread as the thread must be alertable */
|
||||||
return RPC_S_OK;
|
return RPC_S_OK;
|
||||||
@@ -229,6 +222,9 @@ static RPC_STATUS rpcrt4_conn_open_pipe(
|
@@ -230,6 +223,9 @@ static RPC_STATUS rpcrt4_conn_open_pipe(
|
||||||
if (err == ERROR_PIPE_BUSY) {
|
if (err == ERROR_PIPE_BUSY) {
|
||||||
TRACE("connection failed, error=%x\n", err);
|
TRACE("connection failed, error=%x\n", err);
|
||||||
return RPC_S_SERVER_TOO_BUSY;
|
return RPC_S_SERVER_TOO_BUSY;
|
||||||
|
@ -129,7 +165,7 @@ diff -prudN .\wine\dlls\rpcrt4/rpc_transport.c .\reactos\dll\win32\rpcrt4/rpc_tr
|
||||||
}
|
}
|
||||||
if (!wait || !WaitNamedPipeA(pname, NMPWAIT_WAIT_FOREVER)) {
|
if (!wait || !WaitNamedPipeA(pname, NMPWAIT_WAIT_FOREVER)) {
|
||||||
err = GetLastError();
|
err = GetLastError();
|
||||||
@@ -238,9 +234,11 @@ static RPC_STATUS rpcrt4_conn_open_pipe(
|
@@ -239,9 +235,11 @@ static RPC_STATUS rpcrt4_conn_open_pipe(
|
||||||
}
|
}
|
||||||
|
|
||||||
/* success */
|
/* success */
|
||||||
|
@ -141,11 +177,50 @@ diff -prudN .\wine\dlls\rpcrt4/rpc_transport.c .\reactos\dll\win32\rpcrt4/rpc_tr
|
||||||
npc->pipe = pipe;
|
npc->pipe = pipe;
|
||||||
|
|
||||||
return RPC_S_OK;
|
return RPC_S_OK;
|
||||||
@@ -308,18 +306,64 @@ static RPC_STATUS rpcrt4_protseq_ncalrpc
|
@@ -262,6 +260,7 @@ static char *ncalrpc_pipe_name(const cha
|
||||||
|
static RPC_STATUS rpcrt4_ncalrpc_open(RpcConnection* Connection)
|
||||||
|
{
|
||||||
|
RpcConnection_np *npc = (RpcConnection_np *) Connection;
|
||||||
|
+ static const char prefix[] = "\\\\.\\pipe\\lrpc\\";
|
||||||
|
RPC_STATUS r;
|
||||||
|
LPSTR pname;
|
||||||
|
|
||||||
|
@@ -269,7 +268,10 @@ static RPC_STATUS rpcrt4_ncalrpc_open(Rp
|
||||||
|
if (npc->pipe)
|
||||||
|
return RPC_S_OK;
|
||||||
|
|
||||||
|
- pname = ncalrpc_pipe_name(Connection->Endpoint);
|
||||||
|
+ /* protseq=ncalrpc: supposed to use NT LPC ports,
|
||||||
|
+ * but we'll implement it with named pipes for now */
|
||||||
|
+ pname = I_RpcAllocate(strlen(prefix) + strlen(Connection->Endpoint) + 1);
|
||||||
|
+ strcat(strcpy(pname, prefix), Connection->Endpoint);
|
||||||
|
r = rpcrt4_conn_open_pipe(Connection, pname, TRUE);
|
||||||
|
I_RpcFree(pname);
|
||||||
|
|
||||||
|
@@ -278,6 +280,7 @@ static RPC_STATUS rpcrt4_ncalrpc_open(Rp
|
||||||
|
|
||||||
|
static RPC_STATUS rpcrt4_protseq_ncalrpc_open_endpoint(RpcServerProtseq* protseq, const char *endpoint)
|
||||||
|
{
|
||||||
|
+ static const char prefix[] = "\\\\.\\pipe\\lrpc\\";
|
||||||
|
RPC_STATUS r;
|
||||||
|
LPSTR pname;
|
||||||
|
RpcConnection *Connection;
|
||||||
|
@@ -298,7 +301,10 @@ static RPC_STATUS rpcrt4_protseq_ncalrpc
|
||||||
|
if (r != RPC_S_OK)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
- pname = ncalrpc_pipe_name(Connection->Endpoint);
|
||||||
|
+ /* protseq=ncalrpc: supposed to use NT LPC ports,
|
||||||
|
+ * but we'll implement it with named pipes for now */
|
||||||
|
+ pname = I_RpcAllocate(strlen(prefix) + strlen(Connection->Endpoint) + 1);
|
||||||
|
+ strcat(strcpy(pname, prefix), Connection->Endpoint);
|
||||||
|
r = rpcrt4_conn_create_pipe(Connection, pname);
|
||||||
|
I_RpcFree(pname);
|
||||||
|
|
||||||
|
@@ -324,15 +330,64 @@ static char *ncacn_pipe_name(const char
|
||||||
static RPC_STATUS rpcrt4_ncacn_np_open(RpcConnection* Connection)
|
static RPC_STATUS rpcrt4_ncacn_np_open(RpcConnection* Connection)
|
||||||
{
|
{
|
||||||
RpcConnection_np *npc = (RpcConnection_np *) Connection;
|
RpcConnection_np *npc = (RpcConnection_np *) Connection;
|
||||||
- static const char prefix[] = "\\\\.";
|
|
||||||
+ static const char prefix[] = "\\\\";
|
+ static const char prefix[] = "\\\\";
|
||||||
+ static const char local[] = ".";
|
+ static const char local[] = ".";
|
||||||
+ BOOL bUseLocalName = TRUE;
|
+ BOOL bUseLocalName = TRUE;
|
||||||
|
@ -160,10 +235,9 @@ diff -prudN .\wine\dlls\rpcrt4/rpc_transport.c .\reactos\dll\win32\rpcrt4/rpc_tr
|
||||||
if (npc->pipe)
|
if (npc->pipe)
|
||||||
return RPC_S_OK;
|
return RPC_S_OK;
|
||||||
|
|
||||||
/* protseq=ncacn_np: named pipes */
|
- pname = ncacn_pipe_name(Connection->Endpoint);
|
||||||
- pname = I_RpcAllocate(strlen(prefix) + strlen(Connection->Endpoint) + 1);
|
|
||||||
- strcat(strcpy(pname, prefix), Connection->Endpoint);
|
|
||||||
- r = rpcrt4_conn_open_pipe(Connection, pname, FALSE);
|
- r = rpcrt4_conn_open_pipe(Connection, pname, FALSE);
|
||||||
|
+ /* protseq=ncacn_np: named pipes */
|
||||||
+ size = strlen(prefix);
|
+ size = strlen(prefix);
|
||||||
+
|
+
|
||||||
+ if (Connection->NetworkAddr == NULL || strlen(Connection->NetworkAddr) == 0)
|
+ if (Connection->NetworkAddr == NULL || strlen(Connection->NetworkAddr) == 0)
|
||||||
|
@ -210,7 +284,26 @@ diff -prudN .\wine\dlls\rpcrt4/rpc_transport.c .\reactos\dll\win32\rpcrt4/rpc_tr
|
||||||
I_RpcFree(pname);
|
I_RpcFree(pname);
|
||||||
|
|
||||||
return r;
|
return r;
|
||||||
@@ -368,9 +412,9 @@ static void rpcrt4_conn_np_handoff(RpcCo
|
@@ -340,6 +395,7 @@ static RPC_STATUS rpcrt4_ncacn_np_open(R
|
||||||
|
|
||||||
|
static RPC_STATUS rpcrt4_protseq_ncacn_np_open_endpoint(RpcServerProtseq *protseq, const char *endpoint)
|
||||||
|
{
|
||||||
|
+ static const char prefix[] = "\\\\.";
|
||||||
|
RPC_STATUS r;
|
||||||
|
LPSTR pname;
|
||||||
|
RpcConnection *Connection;
|
||||||
|
@@ -360,7 +416,9 @@ static RPC_STATUS rpcrt4_protseq_ncacn_n
|
||||||
|
if (r != RPC_S_OK)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
- pname = ncacn_pipe_name(Connection->Endpoint);
|
||||||
|
+ /* protseq=ncacn_np: named pipes */
|
||||||
|
+ pname = I_RpcAllocate(strlen(prefix) + strlen(Connection->Endpoint) + 1);
|
||||||
|
+ strcat(strcpy(pname, prefix), Connection->Endpoint);
|
||||||
|
r = rpcrt4_conn_create_pipe(Connection, pname);
|
||||||
|
I_RpcFree(pname);
|
||||||
|
|
||||||
|
@@ -378,9 +436,9 @@ static void rpcrt4_conn_np_handoff(RpcCo
|
||||||
* to the child, then reopen the server binding to continue listening */
|
* to the child, then reopen the server binding to continue listening */
|
||||||
|
|
||||||
new_npc->pipe = old_npc->pipe;
|
new_npc->pipe = old_npc->pipe;
|
||||||
|
@ -222,10 +315,41 @@ diff -prudN .\wine\dlls\rpcrt4/rpc_transport.c .\reactos\dll\win32\rpcrt4/rpc_tr
|
||||||
old_npc->listening = FALSE;
|
old_npc->listening = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -415,11 +459,17 @@ static int rpcrt4_conn_np_read(RpcConnec
|
@@ -388,10 +446,12 @@ static RPC_STATUS rpcrt4_ncacn_np_handof
|
||||||
|
{
|
||||||
|
RPC_STATUS status;
|
||||||
|
LPSTR pname;
|
||||||
|
+ static const char prefix[] = "\\\\.";
|
||||||
|
|
||||||
|
rpcrt4_conn_np_handoff((RpcConnection_np *)old_conn, (RpcConnection_np *)new_conn);
|
||||||
|
|
||||||
|
- pname = ncacn_pipe_name(old_conn->Endpoint);
|
||||||
|
+ pname = I_RpcAllocate(strlen(prefix) + strlen(old_conn->Endpoint) + 1);
|
||||||
|
+ strcat(strcpy(pname, prefix), old_conn->Endpoint);
|
||||||
|
status = rpcrt4_conn_create_pipe(old_conn, pname);
|
||||||
|
I_RpcFree(pname);
|
||||||
|
|
||||||
|
@@ -429,12 +489,14 @@ static RPC_STATUS rpcrt4_ncalrpc_handoff
|
||||||
|
{
|
||||||
|
RPC_STATUS status;
|
||||||
|
LPSTR pname;
|
||||||
|
+ static const char prefix[] = "\\\\.\\pipe\\lrpc\\";
|
||||||
|
|
||||||
|
TRACE("%s\n", old_conn->Endpoint);
|
||||||
|
|
||||||
|
rpcrt4_conn_np_handoff((RpcConnection_np *)old_conn, (RpcConnection_np *)new_conn);
|
||||||
|
|
||||||
|
- pname = ncalrpc_pipe_name(old_conn->Endpoint);
|
||||||
|
+ pname = I_RpcAllocate(strlen(prefix) + strlen(old_conn->Endpoint) + 1);
|
||||||
|
+ strcat(strcpy(pname, prefix), old_conn->Endpoint);
|
||||||
|
status = rpcrt4_conn_create_pipe(old_conn, pname);
|
||||||
|
I_RpcFree(pname);
|
||||||
|
|
||||||
|
@@ -448,12 +510,17 @@ static int rpcrt4_conn_np_read(RpcConnec
|
||||||
char *buf = buffer;
|
char *buf = buffer;
|
||||||
BOOL ret = TRUE;
|
BOOL ret = TRUE;
|
||||||
unsigned int bytes_left = count;
|
unsigned int bytes_left = count;
|
||||||
|
- DWORD err = GetLastError();
|
||||||
+ OVERLAPPED ovl;
|
+ OVERLAPPED ovl;
|
||||||
+
|
+
|
||||||
+ ZeroMemory(&ovl, sizeof(ovl));
|
+ ZeroMemory(&ovl, sizeof(ovl));
|
||||||
|
@ -241,15 +365,16 @@ diff -prudN .\wine\dlls\rpcrt4/rpc_transport.c .\reactos\dll\win32\rpcrt4/rpc_tr
|
||||||
if (!ret && GetLastError() == ERROR_MORE_DATA)
|
if (!ret && GetLastError() == ERROR_MORE_DATA)
|
||||||
ret = TRUE;
|
ret = TRUE;
|
||||||
if (!ret || !bytes_read)
|
if (!ret || !bytes_read)
|
||||||
@@ -427,6 +472,7 @@ static int rpcrt4_conn_np_read(RpcConnec
|
@@ -461,7 +528,7 @@ static int rpcrt4_conn_np_read(RpcConnec
|
||||||
bytes_left -= bytes_read;
|
bytes_left -= bytes_read;
|
||||||
buf += bytes_read;
|
buf += bytes_read;
|
||||||
}
|
}
|
||||||
|
- if (ret) SetLastError(err);
|
||||||
+ CloseHandle(ovl.hEvent);
|
+ CloseHandle(ovl.hEvent);
|
||||||
return ret ? count : -1;
|
return ret ? count : -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -437,16 +488,23 @@ static int rpcrt4_conn_np_write(RpcConne
|
@@ -472,16 +539,23 @@ static int rpcrt4_conn_np_write(RpcConne
|
||||||
const char *buf = buffer;
|
const char *buf = buffer;
|
||||||
BOOL ret = TRUE;
|
BOOL ret = TRUE;
|
||||||
unsigned int bytes_left = count;
|
unsigned int bytes_left = count;
|
||||||
|
@ -274,7 +399,7 @@ diff -prudN .\wine\dlls\rpcrt4/rpc_transport.c .\reactos\dll\win32\rpcrt4/rpc_tr
|
||||||
return ret ? count : -1;
|
return ret ? count : -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -458,9 +516,9 @@ static int rpcrt4_conn_np_close(RpcConne
|
@@ -493,9 +567,9 @@ static int rpcrt4_conn_np_close(RpcConne
|
||||||
CloseHandle(npc->pipe);
|
CloseHandle(npc->pipe);
|
||||||
npc->pipe = 0;
|
npc->pipe = 0;
|
||||||
}
|
}
|
||||||
|
@ -287,7 +412,7 @@ diff -prudN .\wine\dlls\rpcrt4/rpc_transport.c .\reactos\dll\win32\rpcrt4/rpc_tr
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -664,7 +722,7 @@ static void *rpcrt4_protseq_np_get_wait_
|
@@ -699,7 +773,7 @@ static void *rpcrt4_protseq_np_get_wait_
|
||||||
conn = CONTAINING_RECORD(protseq->conn, RpcConnection_np, common);
|
conn = CONTAINING_RECORD(protseq->conn, RpcConnection_np, common);
|
||||||
while (conn) {
|
while (conn) {
|
||||||
rpcrt4_conn_listen_pipe(conn);
|
rpcrt4_conn_listen_pipe(conn);
|
||||||
|
@ -296,7 +421,7 @@ diff -prudN .\wine\dlls\rpcrt4/rpc_transport.c .\reactos\dll\win32\rpcrt4/rpc_tr
|
||||||
(*count)++;
|
(*count)++;
|
||||||
conn = CONTAINING_RECORD(conn->common.Next, RpcConnection_np, common);
|
conn = CONTAINING_RECORD(conn->common.Next, RpcConnection_np, common);
|
||||||
}
|
}
|
||||||
@@ -685,7 +743,7 @@ static void *rpcrt4_protseq_np_get_wait_
|
@@ -720,7 +794,7 @@ static void *rpcrt4_protseq_np_get_wait_
|
||||||
*count = 1;
|
*count = 1;
|
||||||
conn = CONTAINING_RECORD(protseq->conn, RpcConnection_np, common);
|
conn = CONTAINING_RECORD(protseq->conn, RpcConnection_np, common);
|
||||||
while (conn) {
|
while (conn) {
|
||||||
|
@ -305,7 +430,7 @@ diff -prudN .\wine\dlls\rpcrt4/rpc_transport.c .\reactos\dll\win32\rpcrt4/rpc_tr
|
||||||
(*count)++;
|
(*count)++;
|
||||||
conn = CONTAINING_RECORD(conn->common.Next, RpcConnection_np, common);
|
conn = CONTAINING_RECORD(conn->common.Next, RpcConnection_np, common);
|
||||||
}
|
}
|
||||||
@@ -732,18 +790,12 @@ static int rpcrt4_protseq_np_wait_for_ne
|
@@ -767,18 +841,12 @@ static int rpcrt4_protseq_np_wait_for_ne
|
||||||
EnterCriticalSection(&protseq->cs);
|
EnterCriticalSection(&protseq->cs);
|
||||||
conn = CONTAINING_RECORD(protseq->conn, RpcConnection_np, common);
|
conn = CONTAINING_RECORD(protseq->conn, RpcConnection_np, common);
|
||||||
while (conn) {
|
while (conn) {
|
||||||
|
@ -326,15 +451,3 @@ diff -prudN .\wine\dlls\rpcrt4/rpc_transport.c .\reactos\dll\win32\rpcrt4/rpc_tr
|
||||||
else
|
else
|
||||||
ERR("failed to locate connection for handle %p\n", b_handle);
|
ERR("failed to locate connection for handle %p\n", b_handle);
|
||||||
LeaveCriticalSection(&protseq->cs);
|
LeaveCriticalSection(&protseq->cs);
|
||||||
diff -prudN .\wine\dlls\rpcrt4/rpcrt4.spec .\reactos\dll\win32\rpcrt4/rpcrt4.spec
|
|
||||||
--- .\wine\dlls\rpcrt4/rpcrt4.spec 2014-05-09 03:43:55.911032800 +0200
|
|
||||||
+++ .\reactos\dll\win32\rpcrt4/rpcrt4.spec 2013-12-07 15:35:15.331527800 +0100
|
|
||||||
@@ -266,7 +266,7 @@
|
|
||||||
@ stdcall NdrRangeUnmarshall(ptr ptr ptr long)
|
|
||||||
@ stub NdrRpcSmClientAllocate
|
|
||||||
@ stub NdrRpcSmClientFree
|
|
||||||
-@ stub NdrRpcSmSetClientToOsf
|
|
||||||
+@ stdcall NdrRpcSmSetClientToOsf(ptr)
|
|
||||||
@ stub NdrRpcSsDefaultAllocate
|
|
||||||
@ stub NdrRpcSsDefaultFree
|
|
||||||
@ stub NdrRpcSsDisableAllocate
|
|
||||||
|
|
|
@ -165,7 +165,7 @@ reactos/dll/win32/rasapi32 # Synced to WineStaging-1.7.47
|
||||||
reactos/dll/win32/resutils # Synced to WineStaging-1.7.47
|
reactos/dll/win32/resutils # Synced to WineStaging-1.7.47
|
||||||
reactos/dll/win32/riched20 # Synced to WineStaging-1.7.47
|
reactos/dll/win32/riched20 # Synced to WineStaging-1.7.47
|
||||||
reactos/dll/win32/riched32 # Synced to WineStaging-1.7.47
|
reactos/dll/win32/riched32 # Synced to WineStaging-1.7.47
|
||||||
reactos/dll/win32/rpcrt4 # Synced to Wine-1.7.17
|
reactos/dll/win32/rpcrt4 # Synced to WineStaging-1.7.55
|
||||||
reactos/dll/win32/rsabase # Synced to WineStaging-1.7.47
|
reactos/dll/win32/rsabase # Synced to WineStaging-1.7.47
|
||||||
reactos/dll/win32/rsaenh # Synced to WineStaging-1.7.47
|
reactos/dll/win32/rsaenh # Synced to WineStaging-1.7.47
|
||||||
reactos/dll/win32/sccbase # Synced to WineStaging-1.7.47
|
reactos/dll/win32/sccbase # Synced to WineStaging-1.7.47
|
||||||
|
|
Loading…
Reference in a new issue