290 lines
4.8 KiB
C
290 lines
4.8 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1996-1997 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
intrface.c
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
Server side support for Cluster APIs dealing with network interfaces
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
John Vert (jvert) 7-Mar-1996
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
--*/
|
|||
|
#include "apip.h"
|
|||
|
|
|||
|
HNETINTERFACE_RPC
|
|||
|
s_ApiOpenNetInterface(
|
|||
|
IN handle_t IDL_handle,
|
|||
|
IN LPCWSTR lpszNetInterfaceName,
|
|||
|
OUT error_status_t *Status
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Opens a handle to an existing network interface object.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
IDL_handle - RPC binding handle, not used.
|
|||
|
|
|||
|
lpszNetInterfaceName - Supplies the name of the netinterface to open.
|
|||
|
|
|||
|
Status - Returns any error that may occur.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
A context handle to a network interface object if successful
|
|||
|
|
|||
|
NULL otherwise.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
PAPI_HANDLE Handle;
|
|||
|
HNETINTERFACE_RPC NetInterface;
|
|||
|
|
|||
|
if (ApiState != ApiStateOnline) {
|
|||
|
*Status = ERROR_SHARING_PAUSED;
|
|||
|
return(NULL);
|
|||
|
}
|
|||
|
|
|||
|
Handle = LocalAlloc(LMEM_FIXED, sizeof(API_HANDLE));
|
|||
|
|
|||
|
if (Handle == NULL) {
|
|||
|
*Status = ERROR_NOT_ENOUGH_MEMORY;
|
|||
|
return(NULL);
|
|||
|
}
|
|||
|
|
|||
|
NetInterface = OmReferenceObjectByName(ObjectTypeNetInterface,
|
|||
|
lpszNetInterfaceName);
|
|||
|
|
|||
|
if (NetInterface == NULL) {
|
|||
|
LocalFree(Handle);
|
|||
|
*Status = ERROR_CLUSTER_NETINTERFACE_NOT_FOUND;
|
|||
|
return(NULL);
|
|||
|
}
|
|||
|
|
|||
|
Handle->Type = API_NETINTERFACE_HANDLE;
|
|||
|
Handle->Flags = 0;
|
|||
|
Handle->NetInterface = NetInterface;
|
|||
|
InitializeListHead(&Handle->NotifyList);
|
|||
|
|
|||
|
*Status = ERROR_SUCCESS;
|
|||
|
|
|||
|
return(Handle);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
error_status_t
|
|||
|
s_ApiCloseNetInterface(
|
|||
|
IN OUT HNETINTERFACE_RPC *phNetInterface
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Closes an open network interface context handle.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
NetInterface - Supplies a pointer to the HNETINTERFACE_RPC to be closed.
|
|||
|
Returns NULL
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
PNM_INTERFACE NetInterface;
|
|||
|
PAPI_HANDLE Handle;
|
|||
|
|
|||
|
API_ASSERT_INIT();
|
|||
|
|
|||
|
VALIDATE_NETINTERFACE(NetInterface, *phNetInterface);
|
|||
|
|
|||
|
Handle = (PAPI_HANDLE)*phNetInterface;
|
|||
|
ApipRundownNotify(Handle);
|
|||
|
|
|||
|
OmDereferenceObject(NetInterface);
|
|||
|
|
|||
|
LocalFree(Handle);
|
|||
|
*phNetInterface = NULL;
|
|||
|
|
|||
|
return(ERROR_SUCCESS);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
HNETINTERFACE_RPC_rundown(
|
|||
|
IN HNETINTERFACE_RPC NetInterface
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
RPC rundown procedure for a HNETINTERFACE_RPC. Just closes the handle.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
NetInterface - Supplies the HNETINTERFACE_RPC that is to be rundown.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
API_ASSERT_INIT();
|
|||
|
|
|||
|
s_ApiCloseNetInterface(&NetInterface);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
error_status_t
|
|||
|
s_ApiGetNetInterfaceState(
|
|||
|
IN HNETINTERFACE_RPC hNetInterface,
|
|||
|
OUT DWORD *lpState
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Returns the current state of the specified network interface.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
hNetInterface - Supplies the network interface whose state is to be returned
|
|||
|
|
|||
|
lpState - Returns the current state of the network interface
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
ERROR_SUCCESS if successful
|
|||
|
|
|||
|
Win32 error code otherwise
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
PNM_INTERFACE NetInterface;
|
|||
|
|
|||
|
|
|||
|
API_ASSERT_INIT();
|
|||
|
|
|||
|
VALIDATE_NETINTERFACE_EXISTS(NetInterface, hNetInterface);
|
|||
|
|
|||
|
*lpState = NmGetInterfaceState( NetInterface );
|
|||
|
|
|||
|
return( ERROR_SUCCESS );
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
error_status_t
|
|||
|
s_ApiGetNetInterface(
|
|||
|
IN handle_t IDL_handle,
|
|||
|
IN LPCWSTR lpszNodeName,
|
|||
|
IN LPCWSTR lpszNetworkName,
|
|||
|
OUT LPWSTR *lppszInterfaceName
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Gets the network interface for the given node and network.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
IDL_handle - RPC binding handle, not used.
|
|||
|
|
|||
|
lpszNodeName - Supplies the node name
|
|||
|
|
|||
|
lpszNetworkName - Supplies the network name
|
|||
|
|
|||
|
lppszInterfaceName - Returns the interface name
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
ERROR_SUCCESS if successful
|
|||
|
|
|||
|
Win32 error code otherwise
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
API_ASSERT_INIT();
|
|||
|
|
|||
|
return(NmGetInterfaceForNodeAndNetwork(
|
|||
|
lpszNodeName,
|
|||
|
lpszNetworkName,
|
|||
|
lppszInterfaceName
|
|||
|
));
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
error_status_t
|
|||
|
s_ApiGetNetInterfaceId(
|
|||
|
IN HNETINTERFACE_RPC hNetInterface,
|
|||
|
OUT LPWSTR *pGuid
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Returns the unique identifier (GUID) for a network interface.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
hNetInterface - Supplies the network interface whose identifer is to be
|
|||
|
returned
|
|||
|
|
|||
|
pGuid - Returns the unique identifier. This memory must be freed on the
|
|||
|
client side.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
ERROR_SUCCESS if successful
|
|||
|
|
|||
|
Win32 error code otherwise.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
PNM_INTERFACE NetInterface;
|
|||
|
DWORD NameLen;
|
|||
|
LPCWSTR Name;
|
|||
|
|
|||
|
|
|||
|
VALIDATE_NETINTERFACE_EXISTS(NetInterface, hNetInterface);
|
|||
|
|
|||
|
Name = OmObjectId(NetInterface);
|
|||
|
|
|||
|
NameLen = (lstrlenW(Name)+1)*sizeof(WCHAR);
|
|||
|
|
|||
|
*pGuid = MIDL_user_allocate(NameLen);
|
|||
|
|
|||
|
if (*pGuid == NULL) {
|
|||
|
return(ERROR_NOT_ENOUGH_MEMORY);
|
|||
|
}
|
|||
|
|
|||
|
CopyMemory(*pGuid, Name, NameLen);
|
|||
|
|
|||
|
return(ERROR_SUCCESS);
|
|||
|
}
|
|||
|
|