187 lines
4.4 KiB
C
187 lines
4.4 KiB
C
/*++
|
||
|
||
Copyright (c) 1991-1992 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
RpcBind.c
|
||
|
||
Abstract:
|
||
|
||
This file contains RPC Bind caching functions:
|
||
|
||
(public functions)
|
||
NetpBindRpc
|
||
NetpUnbindRpc
|
||
|
||
NOTE: Initialization is done via a dllinit routine for netapi.dll.
|
||
|
||
Author:
|
||
|
||
Dan Lafferty danl 25-Oct-1991
|
||
|
||
Environment:
|
||
|
||
User Mode - Win32
|
||
|
||
Revision History:
|
||
|
||
12-Oct-1993 Danl
|
||
#IFDEF out the caching code when we are not building with the
|
||
cache. (Make it smaller).
|
||
|
||
15-Jan-1992 Danl
|
||
Make sure LocalComputerName is not NULL prior to doing the
|
||
string compare. Make the string compare case insensitive.
|
||
|
||
10-Jun-1992 JohnRo
|
||
Tons of debug output changes.
|
||
|
||
25-Oct-1991 danl
|
||
Created
|
||
|
||
--*/
|
||
|
||
// These must be included first:
|
||
|
||
#include <nt.h> // NTSTATUS, etc.
|
||
#include <ntrtl.h> // needed for nturtl.h
|
||
#include <nturtl.h> // needed for windows.h when I have nt.h
|
||
#include <windows.h> // win32 typedefs
|
||
#include <lmcons.h> // NET_API_STATUS
|
||
#include <rpc.h> // rpc prototypes
|
||
|
||
#include <netlib.h>
|
||
#include <netlibnt.h> // NetpNtStatusToApiStatus
|
||
#include <tstring.h> // STRSIZE, STRLEN, STRCPY, etc.
|
||
#include <rpcutil.h>
|
||
#include <ntrpcp.h> // RpcpBindRpc
|
||
|
||
// These may be included in any order:
|
||
|
||
#include <lmerr.h> // NetError codes
|
||
#include <string.h> // for strcpy strcat strlen memcmp
|
||
#include <debuglib.h> // IF_DEBUG
|
||
#include <netdebug.h> // FORMAT_ equates, NetpKdPrint(()), NetpAssert(), etc.
|
||
#include <prefix.h> // PREFIX_ equates.
|
||
|
||
//
|
||
// CONSTANTS & MACROS
|
||
//
|
||
|
||
#ifndef FORMAT_HANDLE
|
||
#define FORMAT_HANDLE "0x%lX"
|
||
#endif
|
||
|
||
|
||
RPC_STATUS
|
||
NetpBindRpc(
|
||
IN LPTSTR ServerName,
|
||
IN LPTSTR ServiceName,
|
||
IN LPTSTR NetworkOptions,
|
||
OUT RPC_BINDING_HANDLE *BindingHandlePtr
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Binds to the RPC server if possible.
|
||
|
||
Arguments:
|
||
|
||
ServerName - Name of server to bind with. This may be NULL if it is to
|
||
bind with the local server.
|
||
|
||
ServiceName - Name of service to bind with. This is typically the
|
||
name of the interface as specified in the .idl file. Although
|
||
it doesn't HAVE to be, it would be consistant to use that name.
|
||
|
||
NetworkOptions - Supplies network options which describe the
|
||
security to be used for named pipe instances created for
|
||
this binding handle.
|
||
|
||
BindingHandlePtr - Location where binding handle is to be placed.
|
||
|
||
Return Value:
|
||
|
||
NERR_Success if the binding was successful. An error value if it
|
||
was not.
|
||
|
||
|
||
--*/
|
||
|
||
{
|
||
|
||
NTSTATUS ntStatus;
|
||
NET_API_STATUS status = NERR_Success;
|
||
|
||
//
|
||
// Create a New binding
|
||
//
|
||
ntStatus = RpcpBindRpc(
|
||
(LPWSTR) ServerName,
|
||
(LPWSTR) ServiceName,
|
||
(LPWSTR) NetworkOptions,
|
||
BindingHandlePtr);
|
||
|
||
if ( ntStatus != RPC_S_OK ) {
|
||
IF_DEBUG(RPC) {
|
||
NetpKdPrint((PREFIX_NETLIB "[NetpBindRpc]RpcpBindRpc Failed "
|
||
"(impersonating) "FORMAT_NTSTATUS "\n",ntStatus));
|
||
}
|
||
}
|
||
|
||
return(NetpNtStatusToApiStatus(ntStatus));
|
||
}
|
||
|
||
|
||
RPC_STATUS
|
||
NetpUnbindRpc(
|
||
IN RPC_BINDING_HANDLE BindingHandle
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This function is called when the application desired to unbind an
|
||
RPC handle. If the handle is cached, the handle is not actually unbound.
|
||
Instead the entry for this handle has its UseCount decremented.
|
||
If the handle is not in the cache, the RpcUnbind routine is called and
|
||
the win32 mapped status is returned.
|
||
|
||
Arguments:
|
||
|
||
BindingHandle - This points to the binding handle that is to
|
||
have its UseCount decremented.
|
||
|
||
|
||
Return Value:
|
||
|
||
NERR_Success - If the handle was successfully unbound, or if the
|
||
cache entry UseCount was decremented.
|
||
|
||
|
||
--*/
|
||
{
|
||
RPC_STATUS status = NERR_Success;
|
||
|
||
IF_DEBUG(RPC) {
|
||
NetpKdPrint((PREFIX_NETLIB "[NetpUnbindRpc] UnBinding Handle "
|
||
FORMAT_HANDLE "\n", BindingHandle));
|
||
}
|
||
|
||
status = RpcpUnbindRpc( BindingHandle );
|
||
|
||
IF_DEBUG(RPC) {
|
||
if (status) {
|
||
NetpKdPrint((PREFIX_NETLIB "Unbind Failure! RpcUnbind = "
|
||
FORMAT_NTSTATUS "\n",status));
|
||
}
|
||
}
|
||
|
||
status = NetpNtStatusToApiStatus(status);
|
||
|
||
return(status);
|
||
}
|