386 lines
6.6 KiB
C
386 lines
6.6 KiB
C
/*++
|
||
|
||
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;
|
||
}
|
||
|