|
|
/********************************************************************/ /** 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 GPC_FLAGS_USERMODE_CLIENT_EX 0x00000002
#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 PTC_INTERFACE_ID InterfaceInfo, 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
|