/*********************************************************************** * NDRCContextUnmarshall */ void WINAPI NDRCContextUnmarshall(NDR_CCONTEXT *pCContext, RPC_BINDING_HANDLE hBinding, void *pBuff, unsigned long DataRepresentation ) { CContextHandle *ctx = (CContextHandle*)*pCContext; ContextHandleNdr *ndr = (ContextHandleNdr*)pBuff; RPC_STATUS status; if(UuidIsNil(&ndr->uuid, &status)) { if(ctx) { RPCRT4_DestroyBinding(ctx->Binding); HeapFree(GetProcessHeap(), 0, ctx); } *pCContext = NULL; } else { ctx = HeapAlloc(GetProcessHeap(), 0, sizeof(CContextHandle)); if(!ctx) RpcRaiseException(ERROR_OUTOFMEMORY); status = RpcBindingCopy(hBinding, (RPC_BINDING_HANDLE*) &ctx->Binding); if(status != RPC_S_OK) RpcRaiseException(status); memcpy(&ctx->Ndr, ndr, sizeof(ContextHandleNdr)); *pCContext = (NDR_CCONTEXT)ctx; } }
static RpcPktHdr *RPCRT4_BuildRequestHeader(unsigned long DataRepresentation, unsigned long BufferLength, unsigned short ProcNum, UUID *ObjectUuid) { RpcPktHdr *header; BOOL has_object; RPC_STATUS status; has_object = (ObjectUuid != NULL && !UuidIsNil(ObjectUuid, &status)); header = (RpcPktHdr *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(header->request) + (has_object ? sizeof(UUID) : 0)); if (header == NULL) { return NULL; } RPCRT4_BuildCommonHeader(header, PKT_REQUEST, DataRepresentation); header->common.frag_len = sizeof(header->request); header->request.alloc_hint = BufferLength; header->request.context_id = 0; header->request.opnum = ProcNum; if (has_object) { header->common.flags |= RPC_FLG_OBJECT_UUID; header->common.frag_len += sizeof(UUID); memcpy(&header->request + 1, ObjectUuid, sizeof(UUID)); } return header; }
RTDECL(bool) RTUuidIsNull(PCRTUUID pUuid) { /* check params */ AssertPtrReturn(pUuid, true); RPC_STATUS status; return !!UuidIsNil((UUID *)pUuid, &status); }
int uuuid_is_nil(struct uuuid_t* uuuid, int* status) { RPC_STATUS st; int ret; ret = UuidIsNil(&uuuid->uuid, &st); if (st != RPC_S_OK) { *status = UUUID_ERR; return -1; } *status = UUUID_OK; return ret; }
SContextHandle* RPCRT4_SrvUnmarshallCtxHdl(ContextHandleNdr *Ndr) { SContextHandle *Hdl = NULL; RPC_STATUS status; if(!Ndr) { if((Hdl = RPCRT4_SrvAllocCtxHdl())==NULL) RpcRaiseException(ERROR_OUTOFMEMORY); UuidCreate(&Hdl->Ndr.uuid); } else if(!UuidIsNil(&Ndr->uuid, &status)) Hdl = RPCRT4_SrvFindCtxHdl(Ndr); return Hdl; }
/*********************************************************************** * NDRSContextUnmarshall2 [RPCRT4.@] */ NDR_SCONTEXT WINAPI NDRSContextUnmarshall2(RPC_BINDING_HANDLE hBinding, void *pBuff, ULONG DataRepresentation, void *CtxGuard, ULONG Flags) { RpcBinding *binding = hBinding; NDR_SCONTEXT SContext; RPC_STATUS status; const ndr_context_handle *context_ndr = pBuff; TRACE("(%p %p %08x %p %u)\n", hBinding, pBuff, DataRepresentation, CtxGuard, Flags); if (!binding->server || !binding->Assoc) RpcRaiseException(RPC_S_INVALID_BINDING); if (Flags & RPC_CONTEXT_HANDLE_FLAGS) FIXME("unimplemented flags: 0x%x\n", Flags & RPC_CONTEXT_HANDLE_FLAGS); if (!pBuff || (!context_ndr->attributes && UuidIsNil((UUID *)&context_ndr->uuid, &status))) status = RpcServerAssoc_AllocateContextHandle(binding->Assoc, CtxGuard, &SContext); else { if (context_ndr->attributes) { ERR("non-null attributes 0x%x\n", context_ndr->attributes); status = RPC_X_SS_CONTEXT_MISMATCH; } else status = RpcServerAssoc_FindContextHandle(binding->Assoc, &context_ndr->uuid, CtxGuard, Flags, &SContext); } if (status != RPC_S_OK) RpcRaiseException(status); RPCRT4_PushThreadContextHandle(SContext); return SContext; }
int uuid_is_null (const uuid_t uu) { RPC_STATUS unused; return UuidIsNil ((UUID*)uu, &unused); }
void s_context_handle_test(void) { NDR_SCONTEXT h; RPC_BINDING_HANDLE binding; RPC_STATUS status; unsigned char buf[20]; static RPC_SERVER_INTERFACE server_if = { sizeof(RPC_SERVER_INTERFACE), {{0x00000000,0x4114,0x0704,{0x23,0x01,0x00,0x00,0x00,0x00,0x00,0x00}},{1,0}}, {{0x8a885d04,0x1ceb,0x11c9,{0x9f,0xe8,0x08,0x00,0x2b,0x10,0x48,0x60}},{2,0}}, NULL, 0, 0, 0, 0, 0, }; binding = I_RpcGetCurrentCallHandle(); ok(binding != NULL, "I_RpcGetCurrentCallHandle returned NULL\n"); if (!pNDRSContextMarshall2 || !pNDRSContextUnmarshall2) { win_skip("NDRSContextMarshall2 or NDRSContextUnmarshall2 not exported from rpcrt4.dll\n"); return; } h = pNDRSContextUnmarshall2(binding, NULL, NDR_LOCAL_DATA_REPRESENTATION, NULL, 0); ok(h != NULL, "NDRSContextUnmarshall2 returned NULL\n"); /* marshal a context handle with NULL userContext */ memset(buf, 0xcc, sizeof(buf)); pNDRSContextMarshall2(binding, h, buf, NULL, NULL, 0); ok(*(ULONG *)buf == 0, "attributes should have been set to 0 instead of 0x%x\n", *(ULONG *)buf); ok(UuidIsNil((UUID *)&buf[4], &status), "uuid should have been nil\n"); h = pNDRSContextUnmarshall2(binding, NULL, NDR_LOCAL_DATA_REPRESENTATION, NULL, 0); ok(h != NULL, "NDRSContextUnmarshall2 returned NULL\n"); /* marshal a context handle with non-NULL userContext */ memset(buf, 0xcc, sizeof(buf)); h->userContext = (void *)0xdeadbeef; pNDRSContextMarshall2(binding, h, buf, NULL, NULL, 0); ok(*(ULONG *)buf == 0, "attributes should have been set to 0 instead of 0x%x\n", *(ULONG *)buf); ok(!UuidIsNil((UUID *)&buf[4], &status), "uuid should not have been nil\n"); /* raises ERROR_INVALID_HANDLE exception on Vista upwards */ if (0) { h = pNDRSContextUnmarshall2(binding, buf, NDR_LOCAL_DATA_REPRESENTATION, NULL, 0); ok(h != NULL, "NDRSContextUnmarshall2 returned NULL\n"); ok(h->userContext == (void *)0xdeadbeef, "userContext of interface didn't unmarshal properly: %p\n", h->userContext); /* marshal a context handle with an interface specified */ h = pNDRSContextUnmarshall2(binding, NULL, NDR_LOCAL_DATA_REPRESENTATION, &server_if.InterfaceId, 0); ok(h != NULL, "NDRSContextUnmarshall2 returned NULL\n"); memset(buf, 0xcc, sizeof(buf)); h->userContext = (void *)0xcafebabe; pNDRSContextMarshall2(binding, h, buf, NULL, &server_if.InterfaceId, 0); ok(*(ULONG *)buf == 0, "attributes should have been set to 0 instead of 0x%x\n", *(ULONG *)buf); ok(!UuidIsNil((UUID *)&buf[4], &status), "uuid should not have been nil\n"); h = pNDRSContextUnmarshall2(binding, buf, NDR_LOCAL_DATA_REPRESENTATION, &server_if.InterfaceId, 0); ok(h != NULL, "NDRSContextUnmarshall2 returned NULL\n"); ok(h->userContext == (void *)0xcafebabe, "userContext of interface didn't unmarshal properly: %p\n", h->userContext); } /* test same interface data, but different pointer */ /* raises ERROR_INVALID_HANDLE exception */ if (0) { RPC_SERVER_INTERFACE server_if_clone = server_if; pNDRSContextUnmarshall2(binding, buf, NDR_LOCAL_DATA_REPRESENTATION, &server_if_clone.InterfaceId, 0); } /* test different interface data, but different pointer */ /* raises ERROR_INVALID_HANDLE exception */ if (0) { static RPC_SERVER_INTERFACE server_if2 = { sizeof(RPC_SERVER_INTERFACE), {{0x00000000,0x4114,0x0704,{0x23,0x01,0x00,0x00,0x00,0x00,0x00,0x00}},{1,0}}, {{0x8a885d04,0x1ceb,0x11c9,{0x9f,0xe8,0x08,0x00,0x2b,0x10,0x48,0x60}},{2,0}}, NULL, 0, 0, 0, 0, 0, }; pNDRSContextMarshall2(binding, h, buf, NULL, &server_if.InterfaceId, 0); pNDRSContextUnmarshall2(binding, buf, NDR_LOCAL_DATA_REPRESENTATION, &server_if2.InterfaceId, 0); } }