/*********************************************************************** * NDRSContextUnmarshall [RPCRT4.@] */ NDR_SCONTEXT WINAPI NDRSContextUnmarshall(void *pBuff, ULONG DataRepresentation) { TRACE("(%p %08x)\n", pBuff, DataRepresentation); return NDRSContextUnmarshall2(I_RpcGetCurrentCallHandle(), pBuff, DataRepresentation, NULL, RPC_CONTEXT_HANDLE_DEFAULT_FLAGS); }
/*********************************************************************** * NDRSContextMarshall [RPCRT4.@] */ void WINAPI NDRSContextMarshall(NDR_SCONTEXT SContext, void *pBuff, NDR_RUNDOWN userRunDownIn) { TRACE("(%p %p %p)\n", SContext, pBuff, userRunDownIn); NDRSContextMarshall2(I_RpcGetCurrentCallHandle(), SContext, pBuff, userRunDownIn, NULL, RPC_CONTEXT_HANDLE_DEFAULT_FLAGS); }
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); } }
void s_authinfo_test(unsigned int protseq, int secure) { RPC_BINDING_HANDLE binding; RPC_STATUS status; ULONG level, authnsvc; RPC_AUTHZ_HANDLE privs; unsigned char *principal; binding = I_RpcGetCurrentCallHandle(); ok(binding != NULL, "I_RpcGetCurrentCallHandle returned NULL\n"); level = authnsvc = 0xdeadbeef; privs = (RPC_AUTHZ_HANDLE)0xdeadbeef; principal = (unsigned char *)0xdeadbeef; if (secure || protseq == RPC_PROTSEQ_LRPC) { status = RpcBindingInqAuthClientA(binding, &privs, &principal, &level, &authnsvc, NULL); if (status == RPC_S_CANNOT_SUPPORT) { win_skip("RpcBindingInqAuthClientA not supported\n"); return; } ok(status == RPC_S_OK, "expected RPC_S_OK got %u\n", status); ok(privs != (RPC_AUTHZ_HANDLE)0xdeadbeef, "privs unchanged\n"); ok(principal != (unsigned char *)0xdeadbeef, "principal unchanged\n"); if (protseq != RPC_PROTSEQ_LRPC) { todo_wine ok(principal != NULL, "NULL principal\n"); } if (protseq == RPC_PROTSEQ_LRPC && principal && pGetUserNameExA) { int len; char *spn; len = WideCharToMultiByte(CP_ACP, 0, (const WCHAR *)privs, -1, NULL, 0, NULL, NULL); spn = HeapAlloc( GetProcessHeap(), 0, len ); WideCharToMultiByte(CP_ACP, 0, (const WCHAR *)privs, -1, spn, len, NULL, NULL); ok(!strcmp(domain_and_user, spn), "expected %s got %s\n", domain_and_user, spn); HeapFree( GetProcessHeap(), 0, spn ); } ok(level == RPC_C_AUTHN_LEVEL_PKT_PRIVACY, "level unchanged\n"); ok(authnsvc == RPC_C_AUTHN_WINNT, "authnsvc unchanged\n"); status = RpcImpersonateClient(NULL); ok(status == RPC_S_OK, "expected RPC_S_OK got %u\n", status); status = RpcRevertToSelf(); ok(status == RPC_S_OK, "expected RPC_S_OK got %u\n", status); } else { status = RpcBindingInqAuthClientA(binding, &privs, &principal, &level, &authnsvc, NULL); ok(status == RPC_S_BINDING_HAS_NO_AUTH, "expected RPC_S_BINDING_HAS_NO_AUTH got %u\n", status); ok(privs == (RPC_AUTHZ_HANDLE)0xdeadbeef, "got %p\n", privs); ok(principal == (unsigned char *)0xdeadbeef, "got %s\n", principal); ok(level == 0xdeadbeef, "got %u\n", level); ok(authnsvc == 0xdeadbeef, "got %u\n", authnsvc); } }