xpmgr/BuildTools/Include/fwpstypes.idl

321 lines
11 KiB
Plaintext

/*
Copyright (c) Microsoft Corporation
SYNOPSIS
Defines data types used by the system portion of the FWP API.
*/
import "fwptypes.idl";
cpp_quote("#if _MSC_VER >= 800")
cpp_quote("#if _MSC_VER >= 1200")
cpp_quote("#pragma warning(push)")
cpp_quote("#endif")
cpp_quote("#pragma warning(disable:4201)")
cpp_quote("#endif")
///////////////////////////////////////////////////////////////////////////////
//
// Definitions for building filters. A filter expresses a rule of the form "if
// the condition is true, then perform the action."
//
///////////////////////////////////////////////////////////////////////////////
// Expresses a filter condition that must be true for the action to be invoked.
typedef struct FWPS_FILTER_CONDITION0_
{
// LUID of the field to be tested.
UINT16 fieldId;
// Reserved for system type.
UINT16 reserved;
// Type of match to be performed.
FWP_MATCH_TYPE matchType;
// Value to match the field against.
FWP_CONDITION_VALUE0 conditionValue;
} FWPS_FILTER_CONDITION0;
// Action invoked if all the filter conditions are true.
typedef struct FWPS_ACTION0_
{
// Type of action.
FWP_ACTION_TYPE type;
// LUID of the callout if FWP_ACTION_FLAG_CALLOUT is set in the action type.
// Otherwise, it's ignored.
UINT32 calloutId;
} FWPS_ACTION0;
// Clear filter action right
cpp_quote("#define FWPS_FILTER_FLAG_CLEAR_ACTION_RIGHT (0x0001)")
// Treat callout filters as permit filters if callout is not registered
cpp_quote("#define FWPS_FILTER_FLAG_PERMIT_IF_CALLOUT_UNREGISTERED (0x0002)")
// There are multiple conditions for the same field. OR semantics applied
cpp_quote("#define FWPS_FILTER_FLAG_OR_CONDITIONS (0x0004)")
typedef struct FWPM_PROVIDER_CONTEXT0_ FWPM_PROVIDER_CONTEXT0;
// System filter used for run-time classification.
typedef struct FWPS_FILTER0_
{
// LUID uniquely identifying the filter in the filter engine.
UINT64 filterId;
// Weight of the filter -- higher filters are invoked first.
FWP_VALUE0 weight;
// Weight of the filter's sub-layer -- higher weights are invoked first.
UINT16 subLayerWeight;
UINT16 flags;
// Array of filter conditions. All must be true for the action to be
// performed. In other words, the conditions are AND'ed together. If no
// conditions are specified, the action is always performed.
UINT32 numFilterConditions;
[size_is(numFilterConditions), unique]
FWPS_FILTER_CONDITION0* filterCondition;
// Action performed if the conditions are true.
FWPS_ACTION0 action;
// Opaque context that may be interpreted by callouts. The context of the
// terminating filter is also returned from classify. In many cases, this
// context will be the LUID of a provider context, but it need not be.
UINT64 context;
// If this is a callout filter and the callout has the
// FWPM_CALLOUT_FLAG_USES_PROVIDER_CONTEXT flag set, this contains the
// provider context from the corresponding FWPM_FILTER0 struct. Otherwise,
// it is null.
[unique] FWPM_PROVIDER_CONTEXT0* providerContext;
} FWPS_FILTER0;
cpp_quote("#if (NTDDI_VERSION >= NTDDI_WIN7)")
typedef struct FWPM_PROVIDER_CONTEXT1_ FWPM_PROVIDER_CONTEXT1;
// Version-1 of system filter used for run-time classification.
typedef struct FWPS_FILTER1_
{
// LUID uniquely identifying the filter in the filter engine.
UINT64 filterId;
// Weight of the filter -- higher filters are invoked first.
FWP_VALUE0 weight;
// Weight of the filter's sub-layer -- higher weights are invoked first.
UINT16 subLayerWeight;
UINT16 flags;
// Array of filter conditions. All must be true for the action to be
// performed. In other words, the conditions are AND'ed together. If no
// conditions are specified, the action is always performed.
UINT32 numFilterConditions;
[size_is(numFilterConditions), unique]
FWPS_FILTER_CONDITION0* filterCondition;
// Action performed if the conditions are true.
FWPS_ACTION0 action;
// Opaque context that may be interpreted by callouts. The context of the
// terminating filter is also returned from classify. In many cases, this
// context will be the LUID of a provider context, but it need not be.
UINT64 context;
// If this is a callout filter and the callout has the
// FWPM_CALLOUT_FLAG_USES_PROVIDER_CONTEXT flag set, this contains the
// provider context from the corresponding FWPM_FILTER1 struct. Otherwise,
// it is null.
[unique] FWPM_PROVIDER_CONTEXT1* providerContext;
} FWPS_FILTER1;
cpp_quote("#endif // (NTDDI_VERSION >= NTDDI_WIN7)")
///////////////////////////////////////////////////////////////////////////////
//
// Definitions for classifying.
//
///////////////////////////////////////////////////////////////////////////////
// An incoming value passed to the filter engine. These are what
// FWPS_FILTER_CONDITION0's are tested against.
typedef struct FWPS_INCOMING_VALUE0_
{
// Data value.
FWP_VALUE0 value;
} FWPS_INCOMING_VALUE0;
// An array of FWPS_INCOMING_VALUE0's.
typedef struct FWPS_INCOMING_VALUES0_
{
// The LUID of the layer where these values originated.
UINT16 layerId;
// Number of values in the array. The number of values, their order, and
// their data type is fixed for a given layer and determined by the layer
// schema.
UINT32 valueCount;
// Array of FWPS_INCOMING_VALUE0's.
[size_is(valueCount), ref] FWPS_INCOMING_VALUE0* incomingValue;
} FWPS_INCOMING_VALUES0;
//////////
// The FWPS_INCOMING_VALUES0 are the only values which can be tested by
// conditions. However, many layers provide additional "meta" information, that
// can be processed by callouts.
//////////
typedef enum FWPS_DISCARD_MODULE0_
{
FWPS_DISCARD_MODULE_NETWORK,
FWPS_DISCARD_MODULE_TRANSPORT,
FWPS_DISCARD_MODULE_GENERAL,
FWPS_DISCARD_MODULE_MAX
} FWPS_DISCARD_MODULE0;
// General (i.e., not layer-specific) reasons why a packet might be discarded.
typedef enum FWPS_GENERAL_DISCARD_REASON_
{
FWPS_DISCARD_FIREWALL_POLICY,
FWPS_DISCARD_IPSEC,
FWPS_GENERAL_DISCARD_REASON_MAX
} FWPS_GENERAL_DISCARD_REASON;
typedef struct FWPS_DISCARD_METADATA0_
{
FWPS_DISCARD_MODULE0 discardModule;
UINT32 discardReason;
// LUID of filter that caused discard
UINT64 filterId;
} FWPS_DISCARD_METADATA0;
typedef struct FWPS_INBOUND_FRAGMENT_METADATA0_
{
UINT32 fragmentIdentification;
UINT16 fragmentOffset;
ULONG fragmentLength;
} FWPS_INBOUND_FRAGMENT_METADATA0;
//////////
// Flags that can be specified in FWPS_INCOMING_METADATA_VALUES0.flags.
//////////
cpp_quote("#define FWPS_INCOMING_FLAG_CACHE_SAFE (0x00000001)")
cpp_quote("#define FWPS_INCOMING_FLAG_ENFORCE_QUERY (0x00000002)")
cpp_quote("#define FWPS_INCOMING_FLAG_ABSORB (0x00000004)")
cpp_quote("#define FWPS_INCOMING_FLAG_CONNECTION_FAILING_INDICATION (0x00000008)")
cpp_quote("#if (NTDDI_VERSION >= NTDDI_WIN7)")
cpp_quote("#define FWPS_INCOMING_FLAG_MID_STREAM_INSPECTION (0x00000010)")
cpp_quote("#define FWPS_INCOMING_FLAG_RECLASSIFY (0x00000020)")
cpp_quote("#endif // (NTDDI_VERSION >= NTDDI_WIN7)")
cpp_quote("#define FWPS_RIGHT_ACTION_WRITE (0x00000001)")
cpp_quote("#define FWPS_CLASSIFY_OUT_FLAG_ABSORB (0x00000001)")
cpp_quote("#define FWPS_CLASSIFY_OUT_FLAG_BUFFER_LIMIT_REACHED (0x00000002)")
cpp_quote("#define FWPS_CLASSIFY_OUT_FLAG_NO_MORE_DATA (0x00000004)")
// Used to return the outcome of classification to the shim.
typedef struct FWPS_CLASSIFY_OUT0_
{
// Suggested action for the classification. Write access to this field is
// controlled by "rights" below. Note that returning block
// when FWPS_RIGHT_ACTION_WRITE isn't held is a veto.
FWP_ACTION_TYPE actionType;
// Opaque context data set by callout or terminating filter
UINT64 outContext;
// FilterId of filter that set final actionType
UINT64 filterId;
// Controls write access to fields in within this structure.
// FWPS_RIGHT_ACTION_WRITE must be held to update the actionType
// unless executing a veto.
UINT32 rights;
UINT32 flags;
// Reserved for system use
UINT32 reserved;
} FWPS_CLASSIFY_OUT0;
///////////////////////////////////////////////////////////////////////////////
//
// Definitions for dispatching callout notifications.
//
///////////////////////////////////////////////////////////////////////////////
// Types of notifications dispatched to callouts.
typedef enum FWPS_CALLOUT_NOTIFY_TYPE_
{
// A filter invoking the callout has been added.
FWPS_CALLOUT_NOTIFY_ADD_FILTER,
// A filter invoking the callout has been deleted.
FWPS_CALLOUT_NOTIFY_DELETE_FILTER,
// A filter invoking the callout has commit, and is active in the system
FWPS_CALLOUT_NOTIFY_ADD_FILTER_POST_COMMIT,
// Not a valid type -- used for parameter validation only.
FWPS_CALLOUT_NOTIFY_TYPE_MAX
} FWPS_CALLOUT_NOTIFY_TYPE;
cpp_quote("#if (NTDDI_VERSION >= NTDDI_WIN7)")
///////////////////////////////////////////////////////////////////////////////
//
// Definitions for ALE endpoints.
//
///////////////////////////////////////////////////////////////////////////////
//////////
// Flags specific to an ALE endpoint.
//////////
// The connection is secured using IPsec
cpp_quote("#define FWPS_ALE_ENDPOINT_FLAG_IPSEC_SECURED (0x00000001)")
// ALE endpoint properties
typedef struct FWPS_ALE_ENDPOINT_PROPERTIES0_
{
UINT64 endpointId;
FWP_IP_VERSION ipVersion;
[switch_type(FWP_IP_VERSION), switch_is(ipVersion)] union
{
[case(FWP_IP_VERSION_V4)]
UINT32 localV4Address;
[case(FWP_IP_VERSION_V6)]
UINT8 localV6Address[16];
};
[switch_type(FWP_IP_VERSION), switch_is(ipVersion)] union
{
[case(FWP_IP_VERSION_V4)]
UINT32 remoteV4Address;
[case(FWP_IP_VERSION_V6)]
UINT8 remoteV6Address[16];
};
UINT8 ipProtocol;
UINT16 localPort;
UINT16 remotePort;
UINT64 localTokenModifiedId;
UINT64 mmSaId;
UINT64 qmSaId;
UINT32 ipsecStatus;
UINT32 flags;
FWP_BYTE_BLOB appId;
} FWPS_ALE_ENDPOINT_PROPERTIES0;
// Template used for enumerating ALE endpoints
typedef struct FWPS_ALE_ENDPOINT_ENUM_TEMPLATE0_
{
// If not empty, only endpoints whose local address is on
// the specified subnet will be returned. May be of type FWP_EMPTY,
// FWP_UINT32, FWP_BYTE_ARRAY16_TYPE, FWP_V4_ADDR_MASK, or FWP_V6_ADDR_MASK.
FWP_CONDITION_VALUE0 localSubNet;
// If not empty, only endpoints whose remote address is
// on the specified subnet will be returned. May be of type FWP_EMPTY,
// FWP_UINT32, FWP_BYTE_ARRAY16_TYPE, FWP_V4_ADDR_MASK, or FWP_V6_ADDR_MASK.
FWP_CONDITION_VALUE0 remoteSubNet;
// If not empty, only endpoints whose protocol matches the specified value
// will be returned. May be of type FWP_EMPTY, FWP_UINT8 or FWP_RANGE_TYPE.
FWP_CONDITION_VALUE0 ipProtocol;
// If not empty, only endpoints whose local port matches the specified value
// will be returned. May be of type FWP_EMPTY, FWP_UINT16 or FWP_RANGE_TYPE.
FWP_CONDITION_VALUE0 localPort;
// If not empty, only endpoints whose remote port matches the specified value
// will be returned. May be of type FWP_EMPTY, FWP_UINT16 or FWP_RANGE_TYPE.
FWP_CONDITION_VALUE0 remotePort;
} FWPS_ALE_ENDPOINT_ENUM_TEMPLATE0;
cpp_quote("#endif // (NTDDI_VERSION >= NTDDI_WIN7)")
cpp_quote("#if _MSC_VER >= 800")
cpp_quote("#if _MSC_VER >= 1200")
cpp_quote("#pragma warning(pop)")
cpp_quote("#else")
cpp_quote("#pragma warning(default:4201)")
cpp_quote("#endif")
cpp_quote("#endif")