766 lines
20 KiB
C
766 lines
20 KiB
C
/*++
|
||
|
||
Copyright (c) 1996 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
cnpdef.h
|
||
|
||
Abstract:
|
||
|
||
Main private header file for the Cluster Network Protocol.
|
||
|
||
Author:
|
||
|
||
Mike Massa (mikemas) July 29, 1996
|
||
|
||
Revision History:
|
||
|
||
Who When What
|
||
-------- -------- ----------------------------------------------
|
||
mikemas 07-29-96 created
|
||
|
||
Notes:
|
||
|
||
--*/
|
||
|
||
#ifndef _CNPDEF_INCLUDED_
|
||
#define _CNPDEF_INCLUDED_
|
||
|
||
#include <fipsapi.h>
|
||
#include <sspi.h>
|
||
|
||
//
|
||
// Forward declarations
|
||
//
|
||
typedef struct _CNP_INTERFACE *PCNP_INTERFACE;
|
||
|
||
//
|
||
// Priority definitions
|
||
//
|
||
#define CnpIsHigherPriority(_p1, _p2) ((_p1) < (_p2))
|
||
#define CnpIsLowerPriority(_p1, _p2) ((_p1) > (_p2))
|
||
#define CnpIsEqualPriority(_p1, _p2) ((_p1) == (_p2))
|
||
|
||
|
||
//
|
||
// Multicast Group Object
|
||
//
|
||
// This structure contains the data needed to implement a multicast
|
||
// endpoint on a network.
|
||
//
|
||
typedef struct _CNP_MULTICAST_GROUP {
|
||
ULONG McastNetworkBrand;
|
||
PTRANSPORT_ADDRESS McastTdiAddress;
|
||
ULONG McastTdiAddressLength;
|
||
PVOID Key;
|
||
ULONG KeyLength;
|
||
DESTable DesTable;
|
||
PVOID Salt;
|
||
ULONG SaltLength;
|
||
ULONG SignatureLength;
|
||
ULONG RefCount;
|
||
} CNP_MULTICAST_GROUP, *PCNP_MULTICAST_GROUP;
|
||
|
||
//
|
||
// Network Object
|
||
//
|
||
// This structure represents a communication link between the nodes of a
|
||
// cluster. It references a particular transport protocol and interface
|
||
// configured on the local system. It also links together all of the
|
||
// interface objects for the nodes attached to the network.
|
||
//
|
||
// Networks are identified by a small integer assigned by the Cluster
|
||
// Service. Network objects are stored in a global array indexed by
|
||
// the network ID.
|
||
//
|
||
typedef struct {
|
||
LIST_ENTRY Linkage;
|
||
CN_SIGNATURE_FIELD
|
||
CL_NETWORK_ID Id;
|
||
CN_LOCK Lock;
|
||
CN_IRQL Irql;
|
||
ULONG RefCount;
|
||
ULONG ActiveRefCount;
|
||
CLUSNET_NETWORK_STATE State;
|
||
ULONG Flags;
|
||
ULONG Priority;
|
||
HANDLE DatagramHandle;
|
||
PFILE_OBJECT DatagramFileObject;
|
||
PDEVICE_OBJECT DatagramDeviceObject;
|
||
TDI_PROVIDER_INFO ProviderInfo;
|
||
PIRP PendingDeleteIrp;
|
||
PIRP PendingOfflineIrp;
|
||
WORK_QUEUE_ITEM ExWorkItem;
|
||
PCNP_MULTICAST_GROUP CurrentMcastGroup;
|
||
PCNP_MULTICAST_GROUP PreviousMcastGroup;
|
||
CX_CLUSTERSCREEN McastReachableNodes;
|
||
ULONG McastReachableCount;
|
||
} CNP_NETWORK, *PCNP_NETWORK;
|
||
|
||
#define CNP_NETWORK_SIG 'kwtn'
|
||
|
||
extern LIST_ENTRY CnpNetworkList;
|
||
extern CN_LOCK CnpNetworkListLock;
|
||
|
||
#define CNP_NET_FLAG_DELETING 0x00000001
|
||
#define CNP_NET_FLAG_PARTITIONED 0x00000002
|
||
#define CNP_NET_FLAG_RESTRICTED 0x00000004
|
||
#define CNP_NET_FLAG_LOCALDISCONN 0x00000008
|
||
#define CNP_NET_FLAG_MULTICAST 0x00000010
|
||
#define CNP_NET_FLAG_MCASTSORTED 0x00000020
|
||
|
||
#define CnpIsNetworkDeleting(_network) \
|
||
(((_network)->Flags & CNP_NET_FLAG_DELETING) != 0)
|
||
|
||
#define CnpIsValidNetworkId(_id) ( ((_id) != ClusterAnyNetworkId ) && \
|
||
((_id) != ClusterInvalidNetworkId))
|
||
|
||
#define CnpIsNetworkRestricted(_network) \
|
||
(((_network)->Flags & CNP_NET_FLAG_RESTRICTED) != 0)
|
||
|
||
#define CnpIsNetworkLocalDisconn(_network) \
|
||
(((_network)->Flags & CNP_NET_FLAG_LOCALDISCONN) != 0)
|
||
|
||
#define CnpIsNetworkMulticastCapable(_network) \
|
||
(((_network)->Flags & CNP_NET_FLAG_MULTICAST) != 0)
|
||
|
||
#define CnpIsNetworkMulticastSorted(_network) \
|
||
(((_network)->Flags & CNP_NET_FLAG_MCASTSORTED) != 0)
|
||
|
||
#define CnpNetworkResetMcastReachableNodes(_network) \
|
||
(RtlZeroMemory( \
|
||
&((_network)->McastReachableNodes), \
|
||
sizeof((_network)->McastReachableNodes) \
|
||
))
|
||
/*
|
||
(BYTE((_network)->McastReachableNodes, INT_NODE(CnLocalNodeId)) \
|
||
= (1 << (BYTEL-1-BIT(INT_NODE(CnLocalNodeId)))))
|
||
*/
|
||
|
||
//
|
||
// Node Object
|
||
//
|
||
// This structure represents a cluster node. One exists for each
|
||
// defined member of a cluster.
|
||
//
|
||
// Nodes are identified by a small integer assigned by the Cluster Service.
|
||
// Node objects are stored in a global array indexed by node ID.
|
||
//
|
||
// Note that the order of the CLUSTER_NODE_COMM_STATE enumeration *is* important.
|
||
//
|
||
typedef struct {
|
||
LIST_ENTRY Linkage;
|
||
CN_SIGNATURE_FIELD
|
||
CL_NODE_ID Id;
|
||
CN_LOCK Lock;
|
||
CN_IRQL Irql;
|
||
ULONG RefCount;
|
||
CLUSNET_NODE_COMM_STATE CommState;
|
||
CLUSNET_NODE_STATE MMState;
|
||
ULONG Flags;
|
||
LIST_ENTRY InterfaceList;
|
||
PCNP_INTERFACE CurrentInterface;
|
||
PIRP PendingDeleteIrp;
|
||
BOOLEAN HBWasMissed;
|
||
BOOLEAN NodeDownIssued;
|
||
ULONG MissedHBs;
|
||
} CNP_NODE, *PCNP_NODE;
|
||
|
||
#define CNP_NODE_SIG 'edon'
|
||
|
||
extern PCNP_NODE * CnpNodeTable;
|
||
extern CN_LOCK CnpNodeTableLock;
|
||
extern PCNP_NODE CnpLocalNode;
|
||
|
||
#define CNP_NODE_FLAG_DELETING 0x00000001
|
||
#define CNP_NODE_FLAG_UNREACHABLE 0x00000002
|
||
#define CNP_NODE_FLAG_LOCAL 0x00000010
|
||
|
||
#define CnpIsNodeDeleting(_node) \
|
||
((_node)->Flags & CNP_NODE_FLAG_DELETING)
|
||
|
||
#define CnpIsNodeLocal(_node) \
|
||
((_node)->Flags & CNP_NODE_FLAG_LOCAL)
|
||
|
||
#define CnpIsNodeUnreachable(_node) \
|
||
((_node)->Flags & CNP_NODE_FLAG_UNREACHABLE)
|
||
|
||
//++
|
||
//
|
||
// Routine Description:
|
||
//
|
||
// Callback routine for CnpWalkNodeTable. Performs an operation on
|
||
// the specified node.
|
||
//
|
||
// Arguments:
|
||
//
|
||
// UpdateNode - A pointer to the node on which to operate.
|
||
//
|
||
// UpdateContext - Operation-specific context
|
||
//
|
||
// NodeTableIrql - The IRQL at which the CnpNodeTableLock was acquired.
|
||
//
|
||
// Return Value:
|
||
//
|
||
// Returns TRUE if the CnpNodeTable lock is still held.
|
||
// Returns FALSE if the CnpNodeTable lock is released.
|
||
//
|
||
// Notes:
|
||
//
|
||
// Called with both the CnpNodeTable and node object locks held.
|
||
// The node object lock is released upon return.
|
||
//
|
||
//--
|
||
typedef
|
||
BOOLEAN
|
||
(*PCNP_NODE_UPDATE_ROUTINE)(
|
||
IN PCNP_NODE UpdateNode,
|
||
IN PVOID UpdateContext,
|
||
IN CN_IRQL NodeTableIrql
|
||
);
|
||
|
||
//
|
||
// Interface Object
|
||
//
|
||
// This structure represents a node's transport interface to a network.
|
||
// It contains a transport address which may be used to communicate
|
||
// with the specified node using the specified network.
|
||
//
|
||
// Interface objects are linked onto lists in the associated node objects.
|
||
// They are identified by a {node, network} tuple.
|
||
//
|
||
// The interfaces on a node are ranked based on their state and priority.
|
||
// Numerically higher state values are ranked ahead of lower values.
|
||
// For interfaces with the same state, Numerically lower priority values
|
||
// are ranked ahead of lower values. Priority values fall in the range
|
||
// 0x1-0xFFFFFFFF. State values are defined by CLUSNET_INTERFACE_STATE
|
||
// enumeration. By default, interfaces inherit their priority from the
|
||
// associated network. In this case, the Priority field will contain the
|
||
// network's priority value, and the CNP_IF_FLAG_USE_NETWORK_PRIORITY flag
|
||
// will be set in the Flags field.
|
||
//
|
||
// Note that the order of the CLUSNET_INTERFACE_STATE enumeration
|
||
// *is* important.
|
||
//
|
||
|
||
typedef struct _CNP_INTERFACE {
|
||
LIST_ENTRY NodeLinkage;
|
||
CN_SIGNATURE_FIELD
|
||
PCNP_NODE Node;
|
||
PCNP_NETWORK Network;
|
||
CLUSNET_INTERFACE_STATE State;
|
||
ULONG Priority;
|
||
ULONG Flags;
|
||
ULONG MissedHBs;
|
||
ULONG SequenceToSend;
|
||
ULONG LastSequenceReceived;
|
||
ULONG McastDiscoverCount;
|
||
ULONG McastRediscoveryCountdown;
|
||
ULONG AdapterWMIProviderId;
|
||
ULONG TdiAddressLength;
|
||
TRANSPORT_ADDRESS TdiAddress;
|
||
} CNP_INTERFACE;
|
||
|
||
#define CNP_INTERFACE_SIG ' fi'
|
||
|
||
#define CNP_INTERFACE_MCAST_DISCOVERY 0x5
|
||
#define CNP_INTERFACE_MCAST_REDISCOVERY 3000 // 1 hr at 1.2 hbs/sec
|
||
|
||
#define CNP_IF_FLAG_USE_NETWORK_PRIORITY 0x00000001
|
||
#define CNP_IF_FLAG_RECVD_MULTICAST 0x00000002
|
||
|
||
#define CnpIsInterfaceUsingNetworkPriority(_if) \
|
||
( (_if)->Flags & CNP_IF_FLAG_USE_NETWORK_PRIORITY )
|
||
|
||
#define CnpInterfaceQueryReceivedMulticast(_if) \
|
||
( (_if)->Flags & CNP_IF_FLAG_RECVD_MULTICAST )
|
||
|
||
#define CnpInterfaceSetReceivedMulticast(_if) \
|
||
( (_if)->Flags |= CNP_IF_FLAG_RECVD_MULTICAST )
|
||
|
||
#define CnpInterfaceClearReceivedMulticast(_if) \
|
||
( (_if)->Flags &= ~CNP_IF_FLAG_RECVD_MULTICAST )
|
||
|
||
|
||
//++
|
||
//
|
||
// Routine Description:
|
||
//
|
||
// Callback routine for CnpWalkInterfacesOnNetwork and
|
||
// CnpWalkInterfacesOnNode routines. Performs a specified
|
||
// operation on all interfaces.
|
||
//
|
||
// Arguments:
|
||
//
|
||
// UpdateInterface - A pointer to the interface on which to operate.
|
||
//
|
||
// Return Value:
|
||
//
|
||
// None.
|
||
//
|
||
// Notes:
|
||
//
|
||
// Called with the associated node and network object locks held.
|
||
// Mut return with the network object lock released.
|
||
// May not release node object lock at any time.
|
||
//
|
||
//--
|
||
typedef
|
||
VOID
|
||
(*PCNP_INTERFACE_UPDATE_ROUTINE)(
|
||
IN PCNP_INTERFACE UpdateInterface
|
||
);
|
||
|
||
|
||
//
|
||
// Send Request Pool
|
||
//
|
||
typedef struct {
|
||
USHORT UpperProtocolHeaderLength;
|
||
ULONG UpperProtocolContextSize;
|
||
UCHAR UpperProtocolNumber;
|
||
UCHAR CnpVersionNumber;
|
||
UCHAR Pad[2];
|
||
} CNP_SEND_REQUEST_POOL_CONTEXT, *PCNP_SEND_REQUEST_POOL_CONTEXT;
|
||
|
||
//
|
||
// Forward Declaration
|
||
//
|
||
typedef struct _CNP_SEND_REQUEST *PCNP_SEND_REQUEST;
|
||
|
||
typedef
|
||
VOID
|
||
(*PCNP_SEND_COMPLETE_ROUTINE)(
|
||
IN NTSTATUS Status,
|
||
IN OUT PULONG BytesSent,
|
||
IN PCNP_SEND_REQUEST SendRequest,
|
||
IN PMDL DataMdl
|
||
);
|
||
|
||
//
|
||
// Send Request Structure
|
||
//
|
||
typedef struct _CNP_SEND_REQUEST {
|
||
CN_RESOURCE CnResource;
|
||
PMDL HeaderMdl;
|
||
PVOID CnpHeader;
|
||
PIRP UpperProtocolIrp;
|
||
PVOID UpperProtocolHeader;
|
||
USHORT UpperProtocolHeaderLength;
|
||
KPROCESSOR_MODE UpperProtocolIrpMode;
|
||
UCHAR Pad;
|
||
PMDL UpperProtocolMdl;
|
||
PVOID UpperProtocolContext;
|
||
PCNP_SEND_COMPLETE_ROUTINE CompletionRoutine;
|
||
PCNP_NETWORK Network;
|
||
PCNP_MULTICAST_GROUP McastGroup;
|
||
TDI_CONNECTION_INFORMATION TdiSendDatagramInfo;
|
||
} CNP_SEND_REQUEST;
|
||
|
||
|
||
//
|
||
// Internal Init/Cleanup routines
|
||
//
|
||
|
||
//
|
||
// Internal Node Routines
|
||
//
|
||
VOID
|
||
CnpWalkNodeTable(
|
||
PCNP_NODE_UPDATE_ROUTINE UpdateRoutine,
|
||
PVOID UpdateContext
|
||
);
|
||
|
||
NTSTATUS
|
||
CnpValidateAndFindNode(
|
||
IN CL_NODE_ID NodeId,
|
||
OUT PCNP_NODE * Node
|
||
);
|
||
|
||
PCNP_NODE
|
||
CnpLockedFindNode(
|
||
IN CL_NODE_ID NodeId,
|
||
IN CN_IRQL NodeTableIrql
|
||
);
|
||
|
||
PCNP_NODE
|
||
CnpFindNode(
|
||
IN CL_NODE_ID NodeId
|
||
);
|
||
|
||
VOID
|
||
CnpOfflineNode(
|
||
PCNP_NODE Node
|
||
);
|
||
|
||
VOID
|
||
CnpDeclareNodeUnreachable(
|
||
PCNP_NODE Node
|
||
);
|
||
|
||
VOID
|
||
CnpDeclareNodeReachable(
|
||
PCNP_NODE Node
|
||
);
|
||
|
||
VOID
|
||
CnpReferenceNode(
|
||
PCNP_NODE Node
|
||
);
|
||
|
||
VOID
|
||
CnpDereferenceNode(
|
||
PCNP_NODE Node
|
||
);
|
||
|
||
|
||
//
|
||
// Internal Network Routines
|
||
//
|
||
VOID
|
||
CnpReferenceNetwork(
|
||
PCNP_NETWORK Network
|
||
);
|
||
|
||
VOID
|
||
CnpDereferenceNetwork(
|
||
PCNP_NETWORK Network
|
||
);
|
||
|
||
VOID
|
||
CnpActiveReferenceNetwork(
|
||
PCNP_NETWORK Network
|
||
);
|
||
|
||
VOID
|
||
CnpActiveDereferenceNetwork(
|
||
PCNP_NETWORK Network
|
||
);
|
||
|
||
PCNP_NETWORK
|
||
CnpFindNetwork(
|
||
IN CL_NETWORK_ID NetworkId
|
||
);
|
||
|
||
VOID
|
||
CnpDeleteNetwork(
|
||
PCNP_NETWORK Network,
|
||
CN_IRQL NetworkListIrql
|
||
);
|
||
|
||
VOID
|
||
CnpFreeMulticastGroup(
|
||
IN PCNP_MULTICAST_GROUP Group
|
||
);
|
||
|
||
#define CnpReferenceMulticastGroup(_group) \
|
||
(InterlockedIncrement(&((_group)->RefCount)))
|
||
|
||
#define CnpDereferenceMulticastGroup(_group) \
|
||
if (InterlockedDecrement(&((_group)->RefCount)) == 0) { \
|
||
CnpFreeMulticastGroup(_group); \
|
||
}
|
||
|
||
BOOLEAN
|
||
CnpSortMulticastNetwork(
|
||
IN PCNP_NETWORK Network,
|
||
IN BOOLEAN RaiseEvent,
|
||
OUT CX_CLUSTERSCREEN * McastReachableNodes OPTIONAL
|
||
);
|
||
|
||
BOOLEAN
|
||
CnpMulticastChangeNodeReachability(
|
||
IN PCNP_NETWORK Network,
|
||
IN PCNP_NODE Node,
|
||
IN BOOLEAN Reachable,
|
||
IN BOOLEAN RaiseEvent,
|
||
OUT CX_CLUSTERSCREEN * NewMcastReachableNodes OPTIONAL
|
||
);
|
||
|
||
PCNP_NETWORK
|
||
CnpGetBestMulticastNetwork(
|
||
VOID
|
||
);
|
||
|
||
//
|
||
// Internal Interface Routines
|
||
//
|
||
|
||
VOID
|
||
CnpWalkInterfacesOnNode(
|
||
PCNP_NODE Node,
|
||
PCNP_INTERFACE_UPDATE_ROUTINE UpdateRoutine
|
||
);
|
||
|
||
VOID
|
||
CnpWalkInterfacesOnNetwork(
|
||
PCNP_NETWORK Network,
|
||
PCNP_INTERFACE_UPDATE_ROUTINE UpdateRoutine
|
||
);
|
||
|
||
NTSTATUS
|
||
CnpOnlinePendingInterface(
|
||
PCNP_INTERFACE Interface
|
||
);
|
||
|
||
VOID
|
||
CnpOnlinePendingInterfaceWrapper(
|
||
PCNP_INTERFACE Interface
|
||
);
|
||
|
||
NTSTATUS
|
||
CnpOfflineInterface(
|
||
PCNP_INTERFACE Interface
|
||
);
|
||
|
||
VOID
|
||
CnpOfflineInterfaceWrapper(
|
||
PCNP_INTERFACE Interface
|
||
);
|
||
|
||
NTSTATUS
|
||
CnpOnlineInterface(
|
||
PCNP_INTERFACE Interface
|
||
);
|
||
|
||
NTSTATUS
|
||
CnpFailInterface(
|
||
PCNP_INTERFACE Interface
|
||
);
|
||
|
||
VOID
|
||
CnpDeleteInterface(
|
||
IN PCNP_INTERFACE Interface
|
||
);
|
||
|
||
VOID
|
||
CnpReevaluateInterfaceRole(
|
||
IN PCNP_INTERFACE Interface
|
||
);
|
||
|
||
VOID
|
||
CnpRecalculateInterfacePriority(
|
||
IN PCNP_INTERFACE Interface
|
||
);
|
||
|
||
VOID
|
||
CnpUpdateNodeCurrentInterface(
|
||
PCNP_NODE Node
|
||
);
|
||
|
||
VOID
|
||
CnpResetAndOnlinePendingInterface(
|
||
IN PCNP_INTERFACE Interface
|
||
);
|
||
|
||
NTSTATUS
|
||
CnpFindInterface(
|
||
IN CL_NODE_ID NodeId,
|
||
IN CL_NETWORK_ID NetworkId,
|
||
OUT PCNP_INTERFACE * Interface
|
||
);
|
||
|
||
|
||
//
|
||
// Send Routines.
|
||
//
|
||
PCN_RESOURCE_POOL
|
||
CnpCreateSendRequestPool(
|
||
IN UCHAR CnpVersionNumber,
|
||
IN UCHAR UpperProtocolNumber,
|
||
IN USHORT UpperProtocolHeaderSize,
|
||
IN USHORT UpperProtocolContextSize,
|
||
IN USHORT PoolDepth
|
||
);
|
||
|
||
#define CnpDeleteSendRequestPool(_pool) \
|
||
{ \
|
||
CnDrainResourcePool(_pool); \
|
||
CnFreePool(_pool); \
|
||
}
|
||
|
||
NTSTATUS
|
||
CnpSendPacket(
|
||
IN PCNP_SEND_REQUEST SendRequest,
|
||
IN CL_NODE_ID DestNodeId,
|
||
IN PMDL DataMdl,
|
||
IN USHORT DataLength,
|
||
IN BOOLEAN CheckDestState,
|
||
IN CL_NETWORK_ID NetworkId OPTIONAL
|
||
);
|
||
|
||
VOID
|
||
CcmpSendPoisonPacket(
|
||
IN PCNP_NODE Node,
|
||
IN PCX_SEND_COMPLETE_ROUTINE CompletionRoutine, OPTIONAL
|
||
IN PVOID CompletionContext, OPTIONAL
|
||
IN PCNP_NETWORK Network, OPTIONAL
|
||
IN PIRP Irp OPTIONAL
|
||
);
|
||
|
||
//
|
||
// Receive Routines
|
||
//
|
||
NTSTATUS
|
||
CcmpReceivePacketHandler(
|
||
IN PCNP_NETWORK Network,
|
||
IN CL_NODE_ID SourceNodeId,
|
||
IN ULONG CnpReceiveFlags,
|
||
IN ULONG TdiReceiveDatagramFlags,
|
||
IN ULONG BytesIndicated,
|
||
IN ULONG BytesAvailable,
|
||
OUT PULONG BytesTaken,
|
||
IN PVOID Tsdu,
|
||
OUT PIRP * Irp
|
||
);
|
||
|
||
VOID
|
||
CnpReceiveHeartBeatMessage(
|
||
IN PCNP_NETWORK Network,
|
||
IN CL_NODE_ID SourceNodeId,
|
||
IN ULONG SeqNumber,
|
||
IN ULONG AckNumber,
|
||
IN BOOLEAN Multicast
|
||
);
|
||
|
||
VOID
|
||
CnpReceivePoisonPacket(
|
||
IN PCNP_NETWORK Network,
|
||
IN CL_NODE_ID SourceNodeId,
|
||
IN ULONG SeqNumber
|
||
);
|
||
|
||
//
|
||
// TDI routines
|
||
//
|
||
NTSTATUS
|
||
CnpTdiReceiveDatagramHandler(
|
||
IN PVOID TdiEventContext,
|
||
IN LONG SourceAddressLength,
|
||
IN PVOID SourceAddress,
|
||
IN LONG OptionsLength,
|
||
IN PVOID Options,
|
||
IN ULONG ReceiveDatagramFlags,
|
||
IN ULONG BytesIndicated,
|
||
IN ULONG BytesAvailable,
|
||
OUT PULONG BytesTaken,
|
||
IN PVOID Tsdu,
|
||
OUT PIRP * IoRequestPacket
|
||
);
|
||
|
||
NTSTATUS
|
||
CnpTdiErrorHandler(
|
||
IN PVOID TdiEventContext,
|
||
IN NTSTATUS Status
|
||
);
|
||
|
||
NTSTATUS
|
||
CnpTdiSetEventHandler(
|
||
IN PFILE_OBJECT FileObject,
|
||
IN PDEVICE_OBJECT DeviceObject,
|
||
IN ULONG EventType,
|
||
IN PVOID EventHandler,
|
||
IN PVOID EventContext,
|
||
IN PIRP ClientIrp OPTIONAL
|
||
);
|
||
|
||
NTSTATUS
|
||
CnpIssueDeviceControl (
|
||
IN PFILE_OBJECT FileObject,
|
||
IN PDEVICE_OBJECT DeviceObject,
|
||
IN PVOID IrpParameters,
|
||
IN ULONG IrpParametersLength,
|
||
IN PVOID MdlBuffer,
|
||
IN ULONG MdlBufferLength,
|
||
IN UCHAR MinorFunction,
|
||
IN PIRP ClientIrp OPTIONAL
|
||
);
|
||
|
||
VOID
|
||
CnpAttachSystemProcess(
|
||
VOID
|
||
);
|
||
|
||
VOID
|
||
CnpDetachSystemProcess(
|
||
VOID
|
||
);
|
||
|
||
NTSTATUS
|
||
CnpOpenDevice(
|
||
IN LPWSTR DeviceName,
|
||
OUT HANDLE *Handle
|
||
);
|
||
|
||
NTSTATUS
|
||
CnpZwDeviceControl(
|
||
IN HANDLE Handle,
|
||
IN ULONG IoControlCode,
|
||
IN PVOID InputBuffer,
|
||
IN ULONG InputBufferLength,
|
||
IN PVOID OutputBuffer,
|
||
IN ULONG OutputBufferLength
|
||
);
|
||
|
||
NTSTATUS
|
||
CnpSetTcpInfoEx(
|
||
IN HANDLE Handle,
|
||
IN ULONG Entity,
|
||
IN ULONG Class,
|
||
IN ULONG Type,
|
||
IN ULONG Id,
|
||
IN PVOID Value,
|
||
IN ULONG ValueLength
|
||
);
|
||
|
||
#define CnpIsIrpStackSufficient(_irp, _targetdevice) \
|
||
((_irp)->CurrentLocation - (_targetdevice)->StackSize >= 1)
|
||
|
||
#define CnpIsIPv4McastTransportAddress(_ta) \
|
||
( (((PTA_IP_ADDRESS)(_ta))->Address[0].AddressType \
|
||
== TDI_ADDRESS_TYPE_IP \
|
||
) \
|
||
&& ((((PTA_IP_ADDRESS)(_ta))->Address[0].Address[0].in_addr \
|
||
& 0xf0) \
|
||
== 0xe0 \
|
||
) \
|
||
)
|
||
|
||
#define CnpIsIPv4McastSameGroup(_ta1, _ta2) \
|
||
( ((PTA_IP_ADDRESS)(_ta1))->Address[0].Address[0].in_addr == \
|
||
((PTA_IP_ADDRESS)(_ta2))->Address[0].Address[0].in_addr \
|
||
)
|
||
|
||
//
|
||
// Signature mechanisms.
|
||
//
|
||
|
||
extern FIPS_FUNCTION_TABLE CxFipsFunctionTable;
|
||
|
||
// Pad the signature length to be an even multiple of DES_BLOCKLEN.
|
||
#define CX_SIGNATURE_LENGTH \
|
||
(((A_SHA_DIGEST_LEN % DES_BLOCKLEN) == 0) ? \
|
||
A_SHA_DIGEST_LEN : \
|
||
A_SHA_DIGEST_LEN + DES_BLOCKLEN - (A_SHA_DIGEST_LEN % DES_BLOCKLEN))
|
||
|
||
NTSTATUS
|
||
CnpSignMulticastMessage(
|
||
IN PCNP_SEND_REQUEST SendRequest,
|
||
IN PMDL DataMdl,
|
||
IN OUT CL_NETWORK_ID * NetworkId,
|
||
OUT ULONG * SigLen OPTIONAL
|
||
);
|
||
|
||
NTSTATUS
|
||
CnpVerifyMulticastMessage(
|
||
IN PCNP_NETWORK Network,
|
||
IN PVOID Tsdu,
|
||
IN ULONG TsduLength,
|
||
IN ULONG ExpectedPayload,
|
||
OUT ULONG * BytesTaken,
|
||
OUT BOOLEAN * CurrentGroup
|
||
);
|
||
|
||
#endif // ifndef _CNPDEF_INCLUDED_
|
||
|