windows-nt/Source/XPSP1/NT/public/internal/net/inc/gpcifc.h
2020-09-26 16:20:57 +08:00

488 lines
12 KiB
C

/********************************************************************/
/** Microsoft Generic Packet Scheduler **/
/** Copyright (c) Microsoft Corporation. All rights reserved. **/
/********************************************************************/
#ifndef __GPCIFC
#define __GPCIFC
//*** gpcifc.h - GPC interface definitions
//
// This file containes all the GPC interface definitions.
/*
/////////////////////////////////////////////////////////////////
//
// defines
//
/////////////////////////////////////////////////////////////////
*/
//
// Protocol Template Id's
//
#define GPC_PROTOCOL_TEMPLATE_IP 0
#define GPC_PROTOCOL_TEMPLATE_IPX 1
#define GPC_PROTOCOL_TEMPLATE_MAX 2
#define GPC_PROTOCOL_TEMPLATE_NOT_SPECIFIED (-1)
#define DD_GPC_DEVICE_NAME L"\\Device\\Gpc"
#define GpcMajorVersion 2
//
// GPC max supported priorities
//
#define GPC_PRIORITY_MAX 16
//
// Classification Family IDs
//
#define GPC_CF_QOS 0
#define GPC_CF_IPSEC_OUT 1
#define GPC_CF_IPSEC_IN 2
#define GPC_CF_FILTER 3
#define GPC_CF_CLASS_MAP 4
#define GPC_CF_MAX 5
//
// IPSEC specific
//
#define GPC_PRIORITY_IPSEC 2
#define GPC_CF_IPSEC GPC_CF_IPSEC_OUT
#define GPC_CF_IPSEC_MAX GPC_CF_IPSEC_IN
#define GPC_CF_IPSEC_MIN GPC_CF_IPSEC_OUT
//
// GPC flags defined
//
#define GPC_FLAGS_FRAGMENT 0x00000001
#define MAX_STRING_LENGTH 256
//
// handle definitions and error codes
//
#define GPC_INVALID_HANDLE (-1)
#define GPC_STATUS_SUCCESS STATUS_SUCCESS
#define GPC_STATUS_PENDING STATUS_PENDING
#define GPC_STATUS_FAILURE STATUS_UNSUCCESSFUL
#define GPC_STATUS_RESOURCES STATUS_INSUFFICIENT_RESOURCES
#define GPC_STATUS_NOTREADY STATUS_DEVICE_NOT_READY
#define GPC_STATUS_NOT_FOUND STATUS_NOT_FOUND
#define GPC_STATUS_CONFLICT STATUS_DUPLICATE_NAME
#define GPC_STATUS_INVALID_HANDLE STATUS_INVALID_HANDLE
#define GPC_STATUS_INVALID_PARAMETER STATUS_INVALID_PARAMETER
#define GPC_STATUS_NOT_SUPPORTED STATUS_NOT_SUPPORTED
#define GPC_STATUS_NOT_EMPTY STATUS_DIRECTORY_NOT_EMPTY
#define GPC_STATUS_TOO_MANY_HANDLES STATUS_TOO_MANY_OPENED_FILES
#define GPC_STATUS_NOT_IMPLEMENTED STATUS_NOT_IMPLEMENTED
#define GPC_STATUS_INSUFFICIENT_BUFFER STATUS_BUFFER_TOO_SMALL
#define GPC_STATUS_NO_MEMORY STATUS_NO_MEMORY
#define GPC_STATUS_IGNORED 1L
/*
/////////////////////////////////////////////////////////////////
//
// typedef
//
/////////////////////////////////////////////////////////////////
*/
//
// Gpc status
//
typedef NTSTATUS GPC_STATUS;
//
// handles
//
typedef HANDLE GPC_HANDLE, *PGPC_HANDLE;
typedef HANDLE GPC_CLIENT_HANDLE, *PGPC_CLIENT_HANDLE;
//
// A classification handle is used as a reference to a classification
// block by the clients
//
typedef ULONG CLASSIFICATION_HANDLE, *PCLASSIFICATION_HANDLE;
//
// A pointer to the CfInfo blob data that is stored in the GPC.
// The client will use this definition in all references to a CfInfo blob.
//
typedef UCHAR GPC_CFINFO, *PGPC_CFINFO;
typedef VOID GPC_PATTERN, *PGPC_PATTERN;
typedef struct _TC_INTERFACE_ID {
ULONG InterfaceId;
ULONG LinkId;
} TC_INTERFACE_ID, *PTC_INTERFACE_ID;
//
// Clients on the IP stack use the IP template.
// The usage of the union is defined by the value of the ProtocolId,
// which can be IP, TCP, UDP, ICMP or IPSEC.
//
typedef struct _GPC_IP_PATTERN {
TC_INTERFACE_ID InterfaceId;
ULONG SrcAddr;
ULONG DstAddr;
union {
struct { USHORT s_srcport,s_dstport; } S_un_ports; // UDP, TCP
struct { UCHAR s_type,s_code; USHORT filler; } S_un_icmp; // ICMP
ULONG S_Spi; // IPSEC
} S_un;
UCHAR ProtocolId;
UCHAR Reserved[3];
#define gpcSrcPort S_un.S_un_ports.s_srcport
#define gpcDstPort S_un.S_un_ports.s_dstport
#define gpcIcmpType S_un.S_un_icmp.s_type
#define gpcIcmpCode S_un.S_un_icmp.s_code
#define gpcSpi S_un.S_Spi
} GPC_IP_PATTERN, *PGPC_IP_PATTERN;
//
// Clients of the IPX stack will use the IPX pattern
//
typedef struct _GPC_IPX_PATTERN {
struct {
ULONG NetworkAddress;
UCHAR NodeAddress[6];
USHORT Socket;
} Src, Dest;
} GPC_IPX_PATTERN, *PGPC_IPX_PATTERN;
typedef struct _GPC_GEN_PATTERN {
ULONG ProtocolId;
ULONG PatternSize;
ULONG PatternOffset;
ULONG MaskOffset;
//
// the pattern and mask bits will follow here...
//
} GPC_GEN_PATTERN, *PGPC_GEN_PATTERN;
typedef struct _GPC_ENUM_CFINFO_BUFFER {
ULONG Length;
USHORT InstanceNameLength;
WCHAR InstanceName[MAX_STRING_LENGTH];
ULONG CfInfoSize;
ULONG CfInfoOffset; // from the beginning of this buffer
GPC_CLIENT_HANDLE OwnerClientCtx;
ULONG PatternCount;
ULONG PatternMaskLen;
GPC_GEN_PATTERN GenericPattern[1];
} GPC_ENUM_CFINFO_BUFFER, *PGPC_ENUM_CFINFO_BUFFER;
/*
/////////////////////////////////////////////////////////////////
//
// Client handler prototypes
//
/////////////////////////////////////////////////////////////////
*/
typedef
GPC_STATUS
(*GPC_CL_ADD_CFINFO_NOTIFY_HANDLER)(
IN GPC_CLIENT_HANDLE ClientContext,
IN GPC_HANDLE GpcCfInfoHandle,
IN ULONG CfInfoSize,
IN PVOID pCfInfo,
OUT PGPC_CLIENT_HANDLE pClientCfInfoContext
);
typedef
VOID
(*GPC_CL_ADD_CFINFO_COMPLETE_HANDLER)(
IN GPC_CLIENT_HANDLE ClientContext,
IN GPC_CLIENT_HANDLE ClientCfInfoContext,
IN GPC_STATUS Status
);
typedef
VOID
(*GPC_CL_MODIFY_CFINFO_COMPLETE_HANDLER)(
IN GPC_CLIENT_HANDLE ClientContext,
IN GPC_CLIENT_HANDLE ClientCfInfoContext,
IN GPC_STATUS Status
);
typedef
GPC_STATUS
(*GPC_CL_MODIFY_CFINFO_NOTIFY_HANDLER)(
IN GPC_CLIENT_HANDLE ClientContext,
IN GPC_CLIENT_HANDLE ClientCfInfoContext,
IN ULONG CfInfoSize,
IN PVOID pNewCfInfo
);
typedef
VOID
(*GPC_CL_REMOVE_CFINFO_COMPLETE_HANDLER)(
IN GPC_CLIENT_HANDLE ClientContext,
IN GPC_CLIENT_HANDLE ClientCfInfoContext,
IN GPC_STATUS Status
);
typedef
GPC_STATUS
(*GPC_CL_REMOVE_CFINFO_NOTIFY_HANDLER)(
IN GPC_CLIENT_HANDLE ClientContext,
IN GPC_CLIENT_HANDLE ClientCfInfoContext
);
typedef
GPC_STATUS
(*GPC_CL_GET_CFINFO_NAME)(
IN GPC_CLIENT_HANDLE ClientContext,
IN GPC_CLIENT_HANDLE ClientCfInfoContext,
OUT PUNICODE_STRING CfInfoName
);
//
// A function list used to pass function pointers for client registration.
//
typedef struct _GPC_CLIENT_FUNC_LIST {
ULONG GpcVersion;
GPC_CL_ADD_CFINFO_COMPLETE_HANDLER ClAddCfInfoCompleteHandler;
GPC_CL_ADD_CFINFO_NOTIFY_HANDLER ClAddCfInfoNotifyHandler;
GPC_CL_MODIFY_CFINFO_COMPLETE_HANDLER ClModifyCfInfoCompleteHandler;
GPC_CL_MODIFY_CFINFO_NOTIFY_HANDLER ClModifyCfInfoNotifyHandler;
GPC_CL_REMOVE_CFINFO_COMPLETE_HANDLER ClRemoveCfInfoCompleteHandler;
GPC_CL_REMOVE_CFINFO_NOTIFY_HANDLER ClRemoveCfInfoNotifyHandler;
GPC_CL_GET_CFINFO_NAME ClGetCfInfoName;
} GPC_CLIENT_FUNC_LIST, *PGPC_CLIENT_FUNC_LIST;
/*
/////////////////////////////////////////////////////////////////
//
// GPC API prototypes
//
/////////////////////////////////////////////////////////////////
*/
//
// Calls to GPC
//
typedef
GPC_STATUS
(*GPC_GET_CFINFO_CLIENT_CONTEXT_HANDLER)(
IN GPC_HANDLE ClientHandle,
IN CLASSIFICATION_HANDLE ClassificationHandle,
OUT PGPC_CLIENT_HANDLE pClientCfInfoContext
);
typedef
GPC_CLIENT_HANDLE
(*GPC_GET_CFINFO_CLIENT_CONTEXT_WITH_REF_HANDLER)(
IN GPC_HANDLE ClientHandle,
IN CLASSIFICATION_HANDLE ClassificationHandle,
IN ULONG Offset
);
typedef
GPC_STATUS
(*GPC_GET_ULONG_FROM_CFINFO_HANDLER)(
IN GPC_HANDLE ClientHandle,
IN CLASSIFICATION_HANDLE ClassificationHandle,
IN ULONG Offset,
OUT PULONG pValue
);
typedef
GPC_STATUS
(*GPC_REGISTER_CLIENT_HANDLER)(
IN ULONG CfId,
IN ULONG Flags,
IN ULONG MaxPriorities,
IN PGPC_CLIENT_FUNC_LIST pClientFuncList,
IN GPC_CLIENT_HANDLE ClientContext,
OUT PGPC_HANDLE pClientHandle
);
typedef
GPC_STATUS
(*GPC_DEREGISTER_CLIENT_HANDLER)(
IN GPC_HANDLE ClientHandle
);
typedef
GPC_STATUS
(*GPC_ADD_CFINFO_HANDLER)(
IN GPC_HANDLE ClientHandle,
IN ULONG CfInfoSize,
IN PVOID pClientCfInfo,
IN GPC_CLIENT_HANDLE ClientCfInfoContext,
OUT PGPC_HANDLE pGpcCfInfoHandle
);
typedef
GPC_STATUS
(*GPC_ADD_PATTERN_HANDLER)(
IN GPC_HANDLE ClientHandle,
IN ULONG ProtocolTemplate,
IN PVOID Pattern,
IN PVOID Mask,
IN ULONG Priority,
IN GPC_HANDLE GpcCfInfoHandle,
OUT PGPC_HANDLE pGpcPatternHandle,
OUT PCLASSIFICATION_HANDLE pClassificationHandle
);
typedef
VOID
(*GPC_ADD_CFINFO_NOTIFY_COMPLETE_HANDLER)(
IN GPC_HANDLE ClientHandle,
IN GPC_HANDLE GpcCfInfoHandle,
IN GPC_STATUS Status,
IN GPC_CLIENT_HANDLE ClientCfInfoContext
);
typedef
GPC_STATUS
(*GPC_MODIFY_CFINFO_HANDLER) (
IN GPC_HANDLE ClientHandle,
IN GPC_HANDLE GpcCfInfoHandle,
IN ULONG CfInfoSize,
IN PVOID pClientCfInfo
);
typedef
VOID
(*GPC_MODIFY_CFINFO_NOTIFY_COMPLETE_HANDLER)(
IN GPC_HANDLE ClientHandle,
IN GPC_HANDLE GpcCfInfoHandle,
IN GPC_STATUS Status
);
typedef
GPC_STATUS
(*GPC_REMOVE_CFINFO_HANDLER) (
IN GPC_HANDLE ClientHandle,
IN GPC_HANDLE GpcCfInfoHandle
);
typedef
VOID
(*GPC_REMOVE_CFINFO_NOTIFY_COMPLETE_HANDLER)(
IN GPC_HANDLE ClientHandle,
IN GPC_HANDLE GpcCfInfoHandle,
IN GPC_STATUS Status
);
typedef
GPC_STATUS
(*GPC_REMOVE_PATTERN_HANDLER) (
IN GPC_HANDLE ClientHandle,
IN GPC_HANDLE GpcPatternHandle
);
typedef
GPC_STATUS
(*GPC_CLASSIFY_PATTERN_HANDLER) (
IN GPC_HANDLE ClientHandle,
IN ULONG ProtocolTemplate,
IN PVOID pPattern,
OUT PGPC_CLIENT_HANDLE pClientCfInfoContext,
IN OUT PCLASSIFICATION_HANDLE pClassificationHandle,
IN ULONG Offset,
OUT PULONG pValue,
IN BOOLEAN bNoCache
);
typedef
GPC_STATUS
(*GPC_CLASSIFY_PACKET_HANDLER) (
IN GPC_HANDLE ClientHandle,
IN ULONG ProtocolTemplate,
IN PVOID pNdisPacket, // PNDIS_PACKET type
IN ULONG TransportHeaderOffset,
IN PTC_INTERFACE_ID pInterfaceId,
OUT PGPC_CLIENT_HANDLE pClientCfInfoContext,
IN OUT PCLASSIFICATION_HANDLE pClassificationHandle
);
typedef struct _GPC_EXPORTED_CALLS {
ULONG GpcVersion;
HANDLE Reserved;
GPC_GET_CFINFO_CLIENT_CONTEXT_HANDLER GpcGetCfInfoClientContextHandler;
GPC_GET_CFINFO_CLIENT_CONTEXT_WITH_REF_HANDLER GpcGetCfInfoClientContextWithRefHandler;
GPC_GET_ULONG_FROM_CFINFO_HANDLER GpcGetUlongFromCfInfoHandler;
GPC_REGISTER_CLIENT_HANDLER GpcRegisterClientHandler;
GPC_DEREGISTER_CLIENT_HANDLER GpcDeregisterClientHandler;
GPC_ADD_CFINFO_HANDLER GpcAddCfInfoHandler;
GPC_ADD_PATTERN_HANDLER GpcAddPatternHandler;
GPC_ADD_CFINFO_NOTIFY_COMPLETE_HANDLER GpcAddCfInfoNotifyCompleteHandler;
GPC_MODIFY_CFINFO_HANDLER GpcModifyCfInfoHandler;
GPC_MODIFY_CFINFO_NOTIFY_COMPLETE_HANDLER GpcModifyCfInfoNotifyCompleteHandler;
GPC_REMOVE_CFINFO_HANDLER GpcRemoveCfInfoHandler;
GPC_REMOVE_CFINFO_NOTIFY_COMPLETE_HANDLER GpcRemoveCfInfoNotifyCompleteHandler;
GPC_REMOVE_PATTERN_HANDLER GpcRemovePatternHandler;
GPC_CLASSIFY_PATTERN_HANDLER GpcClassifyPatternHandler;
GPC_CLASSIFY_PACKET_HANDLER GpcClassifyPacketHandler;
} GPC_EXPORTED_CALLS, *PGPC_EXPORTED_CALLS;
NTSTATUS
GpcInitialize(
OUT PGPC_EXPORTED_CALLS pGpcEntries
);
NTSTATUS
GpcDeinitialize(
IN PGPC_EXPORTED_CALLS pGpcEntries
);
#if 0
NTSTATUS
GetInterfaceIdFromIp(
IN ULONG DestAddress,
IN PULONG pBestIfIndex
);
#endif
#endif // __GPCIFC