488 lines
12 KiB
C
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
|
|
|