196 lines
3.8 KiB
C
196 lines
3.8 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 2001-2001 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
bind.c
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Domain Name System (DNS) Resolver
|
||
|
|
||
|
Client RPC bind\unbind routines.
|
||
|
MIDL memory allocation routines.
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Jim Gilroy (jamesg) April 2001
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
--*/
|
||
|
|
||
|
|
||
|
#include <nt.h>
|
||
|
#include <ntrtl.h>
|
||
|
#include <nturtl.h>
|
||
|
#include <windows.h>
|
||
|
|
||
|
#include <dnsrslvr.h>
|
||
|
#include "..\..\dnslib\local.h" // for memory routines
|
||
|
|
||
|
|
||
|
//
|
||
|
// Bind to remote machine
|
||
|
//
|
||
|
// Note, there's one obvious problem with binding to a remote
|
||
|
// resolver -- you have to finding the machine and this is
|
||
|
// the resolver that finds the machine!!!
|
||
|
//
|
||
|
// That pretty much suggests this would have to be TCPIP only
|
||
|
// situation where you specify an IP address which would be
|
||
|
// resolved in process before RPC'ing to the resolver -- otherwise
|
||
|
// you're in an infinite loop.
|
||
|
// Note, that doesn't mean the RPC protocol couldn't be named
|
||
|
// pipes, only that the string sent in would have to be a TCPIP
|
||
|
// string, so no name resolution had to take place.
|
||
|
//
|
||
|
|
||
|
LPWSTR NetworkAddress = NULL;
|
||
|
|
||
|
|
||
|
handle_t
|
||
|
DNS_RPC_HANDLE_bind(
|
||
|
IN DNS_RPC_HANDLE Reserved
|
||
|
)
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
This routine is called from the Workstation service client stubs when
|
||
|
it is necessary create an RPC binding to the server end with
|
||
|
identification level of impersonation.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
Reserved - RPC string handle; will be NULL unless allow remote
|
||
|
access to network name
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
The binding handle is returned to the stub routine. If the bind is
|
||
|
unsuccessful, a NULL will be returned.
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
LPWSTR binding = NULL;
|
||
|
handle_t bindHandle = NULL;
|
||
|
RPC_STATUS status = RPC_S_INVALID_NET_ADDR;
|
||
|
|
||
|
//
|
||
|
// default is LPC binding
|
||
|
//
|
||
|
|
||
|
if ( !Reserved )
|
||
|
{
|
||
|
status = RpcStringBindingComposeW(
|
||
|
0,
|
||
|
L"ncalrpc",
|
||
|
NULL,
|
||
|
RESOLVER_RPC_LPC_ENDPOINT_W,
|
||
|
NULL, // no security
|
||
|
//L"Security=Impersonation Dynamic False",
|
||
|
//L"Security=Impersonation Static True",
|
||
|
&binding );
|
||
|
}
|
||
|
|
||
|
// LPC fails -- try named pipe
|
||
|
|
||
|
if ( status != NO_ERROR )
|
||
|
{
|
||
|
DNSDBG( ANY, ( "Binding using named pipes\n" ));
|
||
|
|
||
|
status = RpcStringBindingComposeW(
|
||
|
0,
|
||
|
L"ncacn_np",
|
||
|
(LPWSTR) NetworkAddress,
|
||
|
RESOLVER_RPC_PIPE_NAME_W,
|
||
|
NULL, // no security
|
||
|
//L"Security=Impersonation Dynamic False",
|
||
|
//L"Security=Impersonation Static True",
|
||
|
&binding );
|
||
|
}
|
||
|
|
||
|
if ( status != RPC_S_OK )
|
||
|
{
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
status = RpcBindingFromStringBindingW( binding, &bindHandle );
|
||
|
if ( status != RPC_S_OK )
|
||
|
{
|
||
|
bindHandle = NULL;
|
||
|
}
|
||
|
|
||
|
if ( binding )
|
||
|
{
|
||
|
RpcStringFreeW( &binding );
|
||
|
}
|
||
|
|
||
|
return bindHandle;
|
||
|
}
|
||
|
|
||
|
|
||
|
VOID
|
||
|
DNS_RPC_HANDLE_unbind(
|
||
|
IN DNS_RPC_HANDLE Reserved,
|
||
|
IN OUT handle_t BindHandle
|
||
|
)
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
This routine unbinds the identification generic handle.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
Reserved - RPC string handle; will be NULL unless allow remote
|
||
|
access to network name
|
||
|
|
||
|
BindingHandle - This is the binding handle that is to be closed.
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
None.
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
RpcBindingFree( &BindHandle );
|
||
|
}
|
||
|
|
||
|
|
||
|
//
|
||
|
// RPC memory routines
|
||
|
//
|
||
|
// Use dnsapi memory routines.
|
||
|
//
|
||
|
|
||
|
PVOID
|
||
|
WINAPI
|
||
|
MIDL_user_allocate(
|
||
|
IN size_t dwBytes
|
||
|
)
|
||
|
{
|
||
|
// return( ALLOCATE_HEAP( dwBytes ) );
|
||
|
|
||
|
return DnsApiAlloc( dwBytes );
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
WINAPI
|
||
|
MIDL_user_free(
|
||
|
IN OUT PVOID pMem
|
||
|
)
|
||
|
{
|
||
|
//FREE_HEAP( pMem );
|
||
|
|
||
|
DnsApiFree( pMem );
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// End bind.c
|
||
|
//
|