/*++ Copyright (c) 1999 Microsoft Corporation Module Name: bind.c Abstract: Contains the RPC bind and un-bind routines. Author: abhisheV 21-September-1999 Environment: User Level: Win32 Revision History: --*/ #include "precomp.h" handle_t TRANSPORTFILTER_HANDLE_bind( TRANSPORTFILTER_HANDLE hFilter, STRING_HANDLE lpStr ) { RPC_STATUS RpcStatus = 0; LPWSTR pszStrBinding = NULL; handle_t hBinding = NULL; if (!lpStr || !*lpStr) { RpcStatus = RpcStringBindingComposeW( 0, L"ncalrpc", 0, L"ipsec", gpszStrBindingOptions, &pszStrBinding ); } else { RpcStatus = RpcStringBindingComposeW( 0, L"ncacn_np", lpStr, L"\\pipe\\ipsec", gpszStrBindingOptions, &pszStrBinding ); } if (RpcStatus != RPC_S_OK) { return NULL; } RpcStatus = RpcBindingFromStringBindingW( pszStrBinding, &hBinding ); RpcStringFreeW(&pszStrBinding); if (RpcStatus != RPC_S_OK) { return NULL; } return (hBinding); } VOID TRANSPORTFILTER_HANDLE_unbind( TRANSPORTFILTER_HANDLE hFilter, handle_t hBinding ) { RPC_STATUS RpcStatus = 0; RpcStatus = RpcBindingFree(&hBinding); ASSERT(RpcStatus == RPC_S_OK); return; } handle_t STRING_HANDLE_bind( STRING_HANDLE lpStr ) { RPC_STATUS RpcStatus = 0; LPWSTR pszStringBinding = NULL; handle_t hBinding = NULL; LPWSTR pszServerPrincipalName = NULL; if (!lpStr || !*lpStr) { RpcStatus = RpcStringBindingComposeW( 0, L"ncalrpc", 0, NULL, // Null for dynamic endpoint gpszStrBindingOptions, &pszStringBinding ); } else { RpcStatus = RpcStringBindingComposeW( 0, L"ncacn_np", lpStr, NULL, // Null for dynamic endpoint gpszStrBindingOptions, &pszStringBinding ); } if (RpcStatus != RPC_S_OK) { return NULL; } RpcStatus = RpcBindingFromStringBindingW( pszStringBinding, &hBinding ); RpcStringFreeW(&pszStringBinding); if (RpcStatus != RPC_S_OK) { return NULL; } RpcStatus = RpcEpResolveBinding( hBinding, winipsec_ClientIfHandle ); if (RpcStatus != RPC_S_OK) { return NULL; } RpcStatus = RpcBindingSetOption( hBinding, RPC_C_OPT_UNIQUE_BINDING, (ULONG_PTR) 1 ); if (RpcStatus != RPC_S_OK) { STRING_HANDLE_unbind(lpStr, hBinding); return NULL; } RpcStatus = RpcMgmtInqServerPrincName( hBinding, RPC_C_AUTHN_GSS_NEGOTIATE, &pszServerPrincipalName ); if (RpcStatus != RPC_S_OK) { STRING_HANDLE_unbind(lpStr, hBinding); RpcRaiseException(RpcStatus); } if (!lpStr || !*lpStr) { RpcStatus = RpcBindingSetAuthInfoW( hBinding, pszServerPrincipalName, RPC_C_PROTECT_LEVEL_PKT_PRIVACY, RPC_C_AUTHN_WINNT, NULL, RPC_C_AUTHZ_NONE ); } else { RpcStatus = RpcBindingSetAuthInfoW( hBinding, pszServerPrincipalName, RPC_C_PROTECT_LEVEL_PKT_PRIVACY, RPC_C_AUTHN_GSS_NEGOTIATE, NULL, RPC_C_AUTHZ_NONE ); } if (pszServerPrincipalName) { RpcStringFree(&pszServerPrincipalName); } if (RpcStatus != RPC_S_OK) { STRING_HANDLE_unbind(lpStr, hBinding); return NULL; } ASSERT(RpcStatus == RPC_S_OK); return (hBinding); } VOID STRING_HANDLE_unbind( STRING_HANDLE lpStr, handle_t hBinding ) { RPC_STATUS RpcStatus = 0; RpcStatus = RpcBindingFree(&hBinding); ASSERT(RpcStatus == RPC_S_OK); return; } handle_t MMFILTER_HANDLE_bind( MMFILTER_HANDLE hFilter, STRING_HANDLE lpStr ) { RPC_STATUS RpcStatus = 0; LPWSTR pszStrBinding = NULL; handle_t hBinding = NULL; if (!lpStr || !*lpStr) { RpcStatus = RpcStringBindingComposeW( 0, L"ncalrpc", 0, L"ipsec", gpszStrBindingOptions, &pszStrBinding ); } else { RpcStatus = RpcStringBindingComposeW( 0, L"ncacn_np", lpStr, L"\\pipe\\ipsec", gpszStrBindingOptions, &pszStrBinding ); } if (RpcStatus != RPC_S_OK) { return NULL; } RpcStatus = RpcBindingFromStringBindingW( pszStrBinding, &hBinding ); RpcStringFreeW(&pszStrBinding); if (RpcStatus != RPC_S_OK) { return NULL; } return (hBinding); } VOID MMFILTER_HANDLE_unbind( MMFILTER_HANDLE hFilter, handle_t hBinding ) { RPC_STATUS RpcStatus = 0; RpcStatus = RpcBindingFree(&hBinding); ASSERT(RpcStatus == RPC_S_OK); return; } handle_t IKENEGOTIATION_HANDLE_bind( IKENEGOTIATION_HANDLE hIKENegotiation, STRING_HANDLE lpStr ) { RPC_STATUS RpcStatus = 0; LPWSTR pszStrBinding = NULL; handle_t hBinding = NULL; if (!lpStr || !*lpStr) { RpcStatus = RpcStringBindingComposeW( 0, L"ncalrpc", 0, L"ipsec", gpszStrBindingOptions, &pszStrBinding ); } else { RpcStatus = RpcStringBindingComposeW( 0, L"ncacn_np", lpStr, L"\\pipe\\ipsec", gpszStrBindingOptions, &pszStrBinding ); } if (RpcStatus != RPC_S_OK) { return NULL; } RpcStatus = RpcBindingFromStringBindingW( pszStrBinding, &hBinding ); RpcStringFreeW(&pszStrBinding); if (RpcStatus != RPC_S_OK) { return NULL; } return (hBinding); } VOID IKENEGOTIATION_HANDLE_unbind( IKENEGOTIATION_HANDLE hIKENegotiation, handle_t hBinding ) { RPC_STATUS RpcStatus = 0; RpcStatus = RpcBindingFree(&hBinding); ASSERT(RpcStatus == RPC_S_OK); return; } handle_t IKENOTIFY_HANDLE_bind( IKENOTIFY_HANDLE hIKENegotiation, STRING_HANDLE lpStr ) { RPC_STATUS RpcStatus = 0; LPWSTR pszStrBinding = NULL; handle_t hBinding = NULL; if (!lpStr || !*lpStr) { RpcStatus = RpcStringBindingComposeW( 0, L"ncalrpc", 0, L"ipsec", gpszStrBindingOptions, &pszStrBinding ); } else { RpcStatus = RpcStringBindingComposeW( 0, L"ncacn_np", lpStr, L"\\pipe\\ipsec", gpszStrBindingOptions, &pszStrBinding ); } if (RpcStatus != RPC_S_OK) { return NULL; } RpcStatus = RpcBindingFromStringBindingW( pszStrBinding, &hBinding ); RpcStringFreeW(&pszStrBinding); if (RpcStatus != RPC_S_OK) { return NULL; } return (hBinding); } VOID IKENOTIFY_HANDLE_unbind( IKENOTIFY_HANDLE hIKENegotiation, handle_t hBinding ) { RPC_STATUS RpcStatus = 0; RpcStatus = RpcBindingFree(&hBinding); ASSERT(RpcStatus == RPC_S_OK); return; } handle_t TUNNELFILTER_HANDLE_bind( TUNNELFILTER_HANDLE hFilter, STRING_HANDLE lpStr ) { RPC_STATUS RpcStatus = 0; LPWSTR pszStrBinding = NULL; handle_t hBinding = NULL; if (!lpStr || !*lpStr) { RpcStatus = RpcStringBindingComposeW( 0, L"ncalrpc", 0, L"ipsec", gpszStrBindingOptions, &pszStrBinding ); } else { RpcStatus = RpcStringBindingComposeW( 0, L"ncacn_np", lpStr, L"\\pipe\\ipsec", gpszStrBindingOptions, &pszStrBinding ); } if (RpcStatus != RPC_S_OK) { return NULL; } RpcStatus = RpcBindingFromStringBindingW( pszStrBinding, &hBinding ); RpcStringFreeW(&pszStrBinding); if (RpcStatus != RPC_S_OK) { return NULL; } return (hBinding); } VOID TUNNELFILTER_HANDLE_unbind( TUNNELFILTER_HANDLE hFilter, handle_t hBinding ) { RPC_STATUS RpcStatus = 0; RpcStatus = RpcBindingFree(&hBinding); ASSERT(RpcStatus == RPC_S_OK); return; }