/*++ Copyright (c) 1992 Microsoft Corporation Module Name: dhcbind.c Abstract: Routines which use RPC to bind and unbind the client to the WINS server service. Author: Pradeep Bahl (pradeepb) April-1993 Environment: User Mode - Win32 Revision History: --*/ #include "wins.h" #include "winsif.h" handle_t WinsCommonBind( PWINSINTF_BIND_DATA_T pBindData ) /*++ Routine Description: This routine is called from the WINS server service client stubs when it is necessary create an RPC binding to the server end. Arguments: ServerIpAddress - The IP address of the server to bind to. Return Value: The binding handle is returned to the stub routine. If the bind is unsuccessful, a NULL will be returned. --*/ { RPC_STATUS rpcStatus; LPTSTR binding; LPTSTR pProtSeq; LPTSTR pOptions = (TCHAR *)NULL; LPTSTR pServerAdd = (LPTSTR)pBindData->pServerAdd; handle_t bhandle; if (pBindData->fTcpIp) { if (lstrcmp((LPCTSTR)pBindData->pServerAdd, TEXT("127.0.0.1")) == 0) { pProtSeq = TEXT("ncalrpc"); pOptions = TEXT("Security=Impersonation Dynamic False"); pServerAdd = (TCHAR *)NULL; } else { pProtSeq = TEXT("ncacn_ip_tcp"); pServerAdd = (LPTSTR)pBindData->pServerAdd; } pBindData->pPipeName = NULL; } else { pProtSeq = TEXT("ncacn_np"); } // // Enter the critical section. This will be freed WINSIF_HANDLE_unbind(). // //EnterCriticalSection(&WinsRpcCrtSec); rpcStatus = RpcStringBindingCompose( 0, pProtSeq, pServerAdd, pBindData->fTcpIp ? TEXT("") : (LPWSTR)pBindData->pPipeName, pOptions, &binding); if ( rpcStatus != RPC_S_OK ) { return( NULL ); } rpcStatus = RpcBindingFromStringBinding( binding, &bhandle ); RpcStringFree(&binding); if ( rpcStatus != RPC_S_OK ) { return( NULL ); } #if SECURITY > 0 rpcStatus = RpcBindingSetAuthInfo( bhandle, WINS_SERVER, RPC_C_AUTHN_LEVEL_CONNECT, RPC_C_AUTHN_WINNT, NULL, RPC_C_AUTHZ_NAME ); if ( rpcStatus != RPC_S_OK ) { return( NULL ); } #endif return bhandle; } handle_t WinsABind( PWINSINTF_BIND_DATA_T pBindData ) { WCHAR WcharString1[WINSINTF_MAX_NAME_SIZE]; WCHAR WcharString2[WINSINTF_MAX_NAME_SIZE]; DWORD NoOfChars; WINSINTF_BIND_DATA_T BindData; if (pBindData->pServerAdd != NULL) { NoOfChars = MultiByteToWideChar(CP_ACP, 0, pBindData->pServerAdd, -1, WcharString1, WINSINTF_MAX_NAME_SIZE); if (NoOfChars > 0) { BindData.pServerAdd = (LPSTR)WcharString1; } } else { BindData.pServerAdd = (LPSTR)((TCHAR *)NULL); } if (!pBindData->fTcpIp) { BindData.fTcpIp = 0; NoOfChars = MultiByteToWideChar(CP_ACP, 0, pBindData->pPipeName, -1, WcharString2, WINSINTF_MAX_NAME_SIZE); if (NoOfChars > 0) { BindData.pPipeName = (LPSTR)WcharString2; } } else { BindData.fTcpIp = 1; } return(WinsCommonBind(&BindData)); } handle_t WinsUBind( PWINSINTF_BIND_DATA_T pBindData ) { return(WinsCommonBind(pBindData)); } VOID WinsUnbind( PWINSINTF_BIND_DATA_T pBindData, handle_t BindHandle ) { (VOID)RpcBindingFree(&BindHandle); return; } handle_t WINSIF_HANDLE_bind( WINSIF_HANDLE ServerHdl ) /*++ Routine Description: This routine is called from the WINS server service client stubs when it is necessary create an RPC binding to the server end. Arguments: ServerIpAddress - The IP address of the server to bind to. Return Value: The binding handle is returned to the stub routine. If the bind is unsuccessful, a NULL will be returned. --*/ { return WinsCommonBind( ServerHdl ); } void WINSIF_HANDLE_unbind( WINSIF_HANDLE ServerHdl, handle_t BindHandle ) /*++ Routine Description: This routine is called from the DHCP server service client stubs when it is necessary to unbind from the server end. Arguments: ServerIpAddress - This is the IP address of the server from which to unbind. BindingHandle - This is the binding handle that is to be closed. Return Value: None. --*/ { WinsUnbind( ServerHdl, BindHandle ); } handle_t WINSIF2_HANDLE_bind( WINSIF2_HANDLE ServerHdl ) /*++ Routine Description: This routine is called from the WINS server service client stubs when it is necessary create an RPC binding to the server end. Arguments: ServerIpAddress - The IP address of the server to bind to. Return Value: The binding handle is returned to the stub routine. If the bind is unsuccessful, a NULL will be returned. --*/ { return ((handle_t)ServerHdl); } void WINSIF2_HANDLE_unbind( WINSIF2_HANDLE ServerHdl, handle_t BindHandle ) /*++ Routine Description: This routine is called from the DHCP server service client stubs when it is necessary to unbind from the server end. Arguments: ServerIpAddress - This is the IP address of the server from which to unbind. BindingHandle - This is the binding handle that is to be closed. Return Value: None. --*/ { UNREFERENCED_PARAMETER( ServerHdl ); UNREFERENCED_PARAMETER( BindHandle ); return; } //void __RPC_FAR * __RPC_API LPVOID midl_user_allocate(size_t cBytes) { LPVOID pMem; pMem = (LPVOID)LocalAlloc(LMEM_FIXED, cBytes); return(pMem); } //void __RPC_API VOID //midl_user_free(void __RPC_FAR *pMem) midl_user_free(void *pMem) { if (pMem != NULL) { LocalFree((HLOCAL)pMem); } return; } LPVOID WinsAllocMem(size_t cBytes) { return(midl_user_allocate(cBytes)); } VOID WinsFreeMem(LPVOID pMem) { midl_user_free(pMem); } DWORD WinsGetBrowserNames_Old( WINSIF2_HANDLE ServerHdl, PWINSINTF_BROWSER_NAMES_T pNames ) { DWORD status; RpcTryExcept { status = R_WinsGetBrowserNames_Old( ServerHdl, pNames ); } RpcExcept( I_RpcExceptionFilter(RpcExceptionCode()) ) { status = RpcExceptionCode(); } RpcEndExcept return status; } DWORD WinsGetBrowserNames( WINSIF_HANDLE ServerHdl, PWINSINTF_BROWSER_NAMES_T pNames ) { DWORD status; RpcTryExcept { status = R_WinsGetBrowserNames( ServerHdl, pNames ); } RpcExcept( I_RpcExceptionFilter(RpcExceptionCode()) ) { status = RpcExceptionCode(); } RpcEndExcept return status; }