diff options
Diffstat (limited to 'network/trans/WFPSampler/syslib/HelperFunctions_FwpObjects.cpp')
| -rw-r--r-- | network/trans/WFPSampler/syslib/HelperFunctions_FwpObjects.cpp | 9068 |
1 files changed, 9068 insertions, 0 deletions
diff --git a/network/trans/WFPSampler/syslib/HelperFunctions_FwpObjects.cpp b/network/trans/WFPSampler/syslib/HelperFunctions_FwpObjects.cpp new file mode 100644 index 00000000..cc9a0646 --- /dev/null +++ b/network/trans/WFPSampler/syslib/HelperFunctions_FwpObjects.cpp @@ -0,0 +1,9068 @@ +//////////////////////////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2014 Microsoft Corporation. All Rights Reserved. +// +// Module Name: +// HelperFunctions\FwpObjects.c +// +// Abstract: +// This module contains kernel helper functions that allocate, populate, purge, and free WFP +// structures in memory. +// +// Naming Convention: +// +// <Module><Object><Action><Modifier> +// +// i.e. +// +// KrnlHlprFwpValueCreateLocalCopy +// +// <Module> +// KrnlHlpr - Function is located in syslib\ and applies to kernel +// mode. +// <Object> +// { +// FwpByteBlob - Function pertains to FWP_BYTE_BLOB objects. +// FwpConditionValue - Function pertains to FWP_CONDITION_VALUE objects. +// FwpmClassifyOption - Function pertains to FWPM_CLASSIFY_OPTION objects. +// FwpmClassifyOptions - Function pertains to FWPM_CLASSIFY_OPTIONS objects. +// FwpmDisplayData - Function pertains to FWPM_DISPLAY_DATA objects. +// FwpmProviderContext - Function pertains to FWPM_PROVIDER_CONTEXT objects. +// FwpRange - Function pertains to FWP_RANGE objects. +// FwpsClassifyOut - Function pertains to FWPS_CLASSIFY_OUT objects. +// FwpsFilter - Function pertains to FWPS_FILTER objects. +// FwpsFilterCondition - Function pertains to FWPS_FILTER_CONDITION objects. +// FwpsIncomingMetadataValues - Function pertains to FWPS_INCOMING_METADATA +// objects. +// FwpsIncomingValues - Function pertains to FWPS_INCOMING_VALUES objects. +// FwpsStreamCalloutIOPacket - Function pertains to FWPS_STREAM_DATA objects. +// FwpsStreamData - Function pertains to FWPS_STREAM_DATA objects. +// FwpTokenInformation - Function pertains to FWP_TOKEN_INFORMATION objects. +// FwpV4AddrAndMask - Function pertains to FWP_V4_ADDR_AND_MASK objects. +// FwpV6AddrAndMask - Function pertains to FWP_V6_ADDR_AND_MASK objects. +// FwpValue - Function pertains to FWP_VALUE objects. +// IPsecDoSPOptions - Function pertains to IPSEC_DOSP_OPTIONS objects. +// } +// <Action> +// { +// Get - Function returns a pointer or value +// Create - Function allocates and fills memory +// Populate - Function fills memory with values +// Acquire - Function will take a reference on an object +// Release - Function releases the reference on the object +// Purge - Function cleans up values +// Destroy - Function cleans up and frees memory +// } +// <Modifier> +// LocalCopy - Function acts on the LocalCopy (as opposed to the original) +// +// Author: +// Dusty Harper (DHarper) +// +// Revision History: +// +// [ Month ][Day] [Year] - [Revision]-[ Comments ] +// May 01, 2010 - 1.0 - Creation +// December 13, 2013 - 1.1 - Add support for multiple injectors, add +// KrnlHlprFwpValueGetStringForFwpsIncomingValue, +// KrnlHlprFwpsRedirectHandleCreate, +// KrnlHlprFwpsRedirecthandleDestroy, +// KrnlHlprFwpsLayerIsDiscard, +// KrnlHlprFwpsLayerIDToString functions, add missing +// conditions, and fix invalid conditions. +// +//////////////////////////////////////////////////////////////////////////////////////////////////// + +#include "HelperFunctions_Include.h" /// . +#include "HelperFunctions_FwpObjects.tmh" /// $(OBJ_PATH)\$(O)\ + +HANDLE g_EngineHandle = 0; +HANDLE g_pIPv4InboundMACInjectionHandles[2] = {0}; +HANDLE g_pIPv4IngressVSwitchEthernetInjectionHandles[2] = {0}; +HANDLE g_pIPv4InboundForwardInjectionHandles[2] = {0}; +HANDLE g_pIPv4InboundNetworkInjectionHandles[2] = {0}; +HANDLE g_pIPv4InboundTransportInjectionHandles[2] = {0}; +HANDLE g_pIPv4InboundStreamInjectionHandles[2] = {0}; +HANDLE g_pIPv4OutboundMACInjectionHandles[2] = {0}; +HANDLE g_pIPv4EgressVSwitchEthernetInjectionHandles[2] = {0}; +HANDLE g_pIPv4OutboundForwardInjectionHandles[2] = {0}; +HANDLE g_pIPv4OutboundNetworkInjectionHandles[2] = {0}; +HANDLE g_pIPv4OutboundTransportInjectionHandles[2] = {0}; +HANDLE g_pIPv4OutboundStreamInjectionHandles[2] = {0}; +HANDLE g_pIPv6InboundMACInjectionHandles[2] = {0}; +HANDLE g_pIPv6IngressVSwitchEthernetInjectionHandles[2] = {0}; +HANDLE g_pIPv6InboundForwardInjectionHandles[2] = {0}; +HANDLE g_pIPv6InboundNetworkInjectionHandles[2] = {0}; +HANDLE g_pIPv6InboundTransportInjectionHandles[2] = {0}; +HANDLE g_pIPv6InboundStreamInjectionHandles[2] = {0}; +HANDLE g_pIPv6OutboundForwardInjectionHandles[2] = {0}; +HANDLE g_pIPv6OutboundNetworkInjectionHandles[2] = {0}; +HANDLE g_pIPv6OutboundTransportInjectionHandles[2] = {0}; +HANDLE g_pIPv6OutboundStreamInjectionHandles[2] = {0}; +HANDLE g_pIPv6OutboundMACInjectionHandles[2] = {0}; +HANDLE g_pIPv6EgressVSwitchEthernetInjectionHandles[2] = {0}; +HANDLE g_pInboundForwardInjectionHandles[2] = {0}; +HANDLE g_pInboundNetworkInjectionHandles[2] = {0}; +HANDLE g_pInboundTransportInjectionHandles[2] = {0}; +HANDLE g_pInboundStreamInjectionHandles[2] = {0}; +HANDLE g_pInboundMACInjectionHandles[2] = {0}; +HANDLE g_pIngressVSwitchEthernetInjectionHandles[2] = {0}; +HANDLE g_pOutboundForwardInjectionHandles[2] = {0}; +HANDLE g_pOutboundNetworkInjectionHandles[2] = {0}; +HANDLE g_pOutboundTransportInjectionHandles[2] = {0}; +HANDLE g_pOutboundStreamInjectionHandles[2] = {0}; +HANDLE g_pOutboundMACInjectionHandles[2] = {0}; +HANDLE g_pEgressVSwitchEthernetInjectionHandles[2] = {0}; +HANDLE g_pRedirectionHandles[2] = {0}; + +#ifndef FWP_BYTE_BLOB____ +#define FWP_BYTE_BLOB____ + +#pragma warning(disable: 24002) /// Code is IPv4 & IPv6 specific + +/** + @kernel_helper_function="KrnlHlprFwpByteBlobPurgeLocalCopy" + + Purpose: Cleanup a local copy of an FWP_BYTE_BLOB. <br> + <br> + Notes: <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552427.aspx <br> +*/ +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +inline VOID KrnlHlprFwpByteBlobPurgeLocalCopy(_Inout_ FWP_BYTE_BLOB* pBlob) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpByteBlobPurgeLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(pBlob); + + HLPR_DELETE_ARRAY(pBlob->data, + WFPSAMPLER_SYSLIB_TAG); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpByteBlobPurgeLocalCopy()\n"); + +#endif /// DBG + + return; +} + +/** + @kernel_helper_function="KrnlHlprFwpByteBlobDestroyLocalCopy" + + Purpose: Cleanup and free a local copy of an FWP_BYTE_BLOB. <br> + <br> + Notes: <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552427.aspx <br> +*/ +_At_(*ppBlob, _Pre_ _Notnull_) +_At_(*ppBlob, _Post_ _Null_ __drv_freesMem(Pool)) +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Success_(*ppBlob == 0) +inline VOID KrnlHlprFwpByteBlobDestroyLocalCopy(_Inout_ FWP_BYTE_BLOB** ppBlob) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpByteBlobDestroyLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(ppBlob); + + if(*ppBlob) + KrnlHlprFwpByteBlobPurgeLocalCopy(*ppBlob); + + HLPR_DELETE(*ppBlob, + WFPSAMPLER_SYSLIB_TAG); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpByteBlobDestroyLocalCopy()\n"); + +#endif /// DBG + + return; +} + +/** + @kernel_helper_function="KrnlHlprFwpByteBlobPopulateLocalCopy" + + Purpose: Populate a local copy of an FWP_BYTE_BLOB. <br> + <br> + Notes: The caller is responsible for freeing any allocated memory using + KrnlHlprFwpByteBlobPurgeLocalCopy(). <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552427.aspx <br> +*/ +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Check_return_ +_Success_(return == STATUS_SUCCESS) +NTSTATUS KrnlHlprFwpByteBlobPopulateLocalCopy(_In_ const FWP_BYTE_BLOB* pOriginalBlob, + _Inout_ FWP_BYTE_BLOB* pBlob) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpByteBlobPopulateLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(pOriginalBlob); + NT_ASSERT(pBlob); + + NTSTATUS status = STATUS_SUCCESS; + + pBlob->size = pOriginalBlob->size; + + if(pBlob->size) + { + HLPR_NEW_ARRAY(pBlob->data, + BYTE, + pBlob->size, + WFPSAMPLER_SYSLIB_TAG); + HLPR_BAIL_ON_ALLOC_FAILURE(pBlob->data, + status); + + RtlCopyMemory(pBlob->data, + pOriginalBlob->data, + pBlob->size); + } + + HLPR_BAIL_LABEL: + + if(status != STATUS_SUCCESS) + KrnlHlprFwpByteBlobPurgeLocalCopy(pBlob); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpByteBlobPopulateLocalCopy() [status: %#x]\n", + status); + +#endif /// DBG + + return status; +} + +/** + @kernel_helper_function="KrnlHlprFwpByteBlobCreateLocalCopy" + + Purpose: Allocate and populate a local copy of an FWP_BYTE_BLOB. <br> + <br> + Notes: The caller is responsible for freeing the allocated memory using + KrnlHlprFwpByteBlobDestroyLocalCopy(). <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552427.aspx <br> +*/ +__drv_allocatesMem(Pool) +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Must_inspect_result_ +_Success_(return != 0) +FWP_BYTE_BLOB* KrnlHlprFwpByteBlobCreateLocalCopy(_In_ const FWP_BYTE_BLOB* pOriginalBlob) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpByteBlobCreateLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(pOriginalBlob); + + NTSTATUS status = STATUS_SUCCESS; + FWP_BYTE_BLOB* pByteBlob = 0; + +#pragma warning(push) +#pragma warning(disable: 6014) /// pByteBlob is expected to be cleaned up by caller using KrnlHlprFwpByteBlobDestroyLocalCopy + + HLPR_NEW(pByteBlob, + FWP_BYTE_BLOB, + WFPSAMPLER_SYSLIB_TAG); + HLPR_BAIL_ON_ALLOC_FAILURE(pByteBlob, + status); + +#pragma warning(pop) + + status = KrnlHlprFwpByteBlobPopulateLocalCopy(pOriginalBlob, + pByteBlob); + HLPR_BAIL_ON_FAILURE(status); + + HLPR_BAIL_LABEL: + +#pragma warning(push) +#pragma warning(disable: 6001) /// pByteBlob initialized with call to HLPR_NEW & KrnlHlprFwpByteBlobPopulateLocalCopy + + if(status != STATUS_SUCCESS && + pByteBlob) + KrnlHlprFwpByteBlobDestroyLocalCopy(&pByteBlob); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpByteBlobCreateLocalCopy() [pByteBlob: %#p]\n", + pByteBlob); + +#endif /// DBG + + return pByteBlob; + +#pragma warning(pop) +} + +#endif /// FWP_BYTE_BLOB____ + +#ifndef FWPM_DISPLAY_DATA____ +#define FWPM_DISPLAY_DATA____ + +/** + @kernel_helper_function="KrnlHlprFwpmDisplayDataPurgeLocalCopy" + + Purpose: Cleanup a local copy of an FWPM_DISPLAY_DATA. <br> + <br> + Notes: <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Desktop/AA364261.aspx <br> +*/ +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +inline VOID KrnlHlprFwpmDisplayDataPurgeLocalCopy(_Inout_ FWPM_DISPLAY_DATA* pData) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpmDisplayDataPurgeLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(pData); + + HLPR_DELETE_ARRAY(pData->name, + WFPSAMPLER_SYSLIB_TAG); + + HLPR_DELETE_ARRAY(pData->description, + WFPSAMPLER_SYSLIB_TAG); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpmDisplayDataPurgeLocalCopy()\n"); + +#endif /// DBG + + return; +} + +/** + @kernel_helper_function="KrnlHlprFwpmDisplayDataDestroyLocalCopy" + + Purpose: Cleanup and free a local copy of an FWPM_DISPLAY_DATA. <br> + <br> + Notes: <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Desktop/AA364261.aspx <br> +*/ +_At_(*ppDisplayData, _Pre_ _Notnull_) +_At_(*ppDisplayData, _Post_ _Null_ __drv_freesMem(Pool)) +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Success_(*ppDisplayData == 0) +inline VOID KrnlHlprFwpmDisplayDataDestroyLocalCopy(_Inout_ FWPM_DISPLAY_DATA** ppDisplayData) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpmDisplayDataDestroyLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(ppDisplayData); + + if(*ppDisplayData) + KrnlHlprFwpmDisplayDataPurgeLocalCopy(*ppDisplayData); + + HLPR_DELETE(*ppDisplayData, + WFPSAMPLER_SYSLIB_TAG); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpmDisplayDataDestroyLocalCopy()\n"); + +#endif /// DBG + + return; +} + +/** + @kernel_helper_function="KrnlHlprFwpmDisplayDataPopulateLocalCopy" + + Purpose: Populate a local copy of an FWPM_DISPLAY_DATA. <br> + <br> + Notes: The caller is responsible for freeing any allocated memory using + KrnlHlprFwpmDisplayDataPurgeLocalCopy(). <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Desktop/AA364261.aspx <br> +*/ +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Check_return_ +_Success_(return == STATUS_SUCCESS) +NTSTATUS KrnlHlprFwpmDisplayDataPopulateLocalCopy(_In_ const FWPM_DISPLAY_DATA* pOriginalData, + _Inout_ FWPM_DISPLAY_DATA* pData) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpmDisplayDataPopulateLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(pOriginalData); + NT_ASSERT(pData); + + NTSTATUS status = STATUS_SUCCESS; + KIRQL irql = KeGetCurrentIrql(); + size_t nameSize = 0; + size_t descriptionSize = 0; + + if(irql == PASSIVE_LEVEL) + { + status = RtlStringCchLengthW(pOriginalData->name, + NTSTRSAFE_MAX_CCH, + &nameSize); + HLPR_BAIL_ON_FAILURE(status); + + if(pOriginalData->description) + { + status = RtlStringCchLengthW(pOriginalData->description, + NTSTRSAFE_MAX_CCH, + &descriptionSize); + HLPR_BAIL_ON_FAILURE(status); + } + } + else + { + nameSize = wcslen(pOriginalData->name); + + if(pOriginalData->description) + descriptionSize = wcslen(pOriginalData->description); + } + + /// name is required for the FWPM_DISPLAY_DATA to be valid + if(nameSize) + { + HLPR_NEW_ARRAY(pData->name, + WCHAR, + nameSize + 1, /// add space for '\0' + WFPSAMPLER_SYSLIB_TAG); + HLPR_BAIL_ON_ALLOC_FAILURE(pData->name, + status); + + RtlCopyMemory(pData->name, + pOriginalData->name, + nameSize); + + pData->name[nameSize] = L'\0'; + } + else + { + status = STATUS_INVALID_BUFFER_SIZE; + + HLPR_BAIL; + } + + /// description is not required for the FWPM_DISPLAY_DATA to be valid + if(descriptionSize) + { + HLPR_NEW_ARRAY(pData->description, + WCHAR, + descriptionSize + 1, /// add space for '\0' + WFPSAMPLER_SYSLIB_TAG); + HLPR_BAIL_ON_ALLOC_FAILURE(pData->description, + status); + + RtlCopyMemory(pData->description, + pOriginalData->description, + nameSize); + + pData->description[descriptionSize] = L'\0'; + } + + HLPR_BAIL_LABEL: + + if(status != STATUS_SUCCESS) + { + HLPR_DELETE_ARRAY(pData->name, + WFPSAMPLER_SYSLIB_TAG); + + HLPR_DELETE_ARRAY(pData->description, + WFPSAMPLER_SYSLIB_TAG); + } + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpmDisplayDataPopulateLocalCopy() [status: %#x]\n", + status); + +#endif /// DBG + + return status; +} + +/** + @kernel_helper_function="KrnlHlprFwpmDisplayDataCreateLocalCopy" + + Purpose: ALlocate and populate a local copy of an FWPM_DISPLAY_DATA. <br> + <br> + Notes: The caller is responsible for freeing any allocated memory using + KrnlHlprFwpmDisplayDataDestroyLocalCopy(). <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Desktop/AA364261.aspx <br> +*/ +__drv_allocatesMem(Pool) +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Must_inspect_result_ +_Success_(return != 0) +FWPM_DISPLAY_DATA* KrnlHlprFwpmDisplayDataCreateLocalCopy(_In_ const FWPM_DISPLAY_DATA* pOriginalDisplayData) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpmDisplayDataCreateLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(pOriginalDisplayData); + + NTSTATUS status = STATUS_SUCCESS; + FWPM_DISPLAY_DATA* pDisplayData = 0; + +#pragma warning(push) +#pragma warning(disable: 6014) /// pDisplayData is expected to be cleaned up by caller using KrnlHlprFwpmDisplayDataDestroyLocalCopy + + HLPR_NEW(pDisplayData, + FWPM_DISPLAY_DATA, + WFPSAMPLER_SYSLIB_TAG); + HLPR_BAIL_ON_ALLOC_FAILURE(pDisplayData, + status); + +#pragma warning(pop) + + status = KrnlHlprFwpmDisplayDataPopulateLocalCopy(pOriginalDisplayData, + pDisplayData); + + HLPR_BAIL_LABEL: + +#pragma warning(push) +#pragma warning(disable: 6001) /// pDisplayData initialized with call to HLPR_NEW & KrnlHlprFwpmDisplayDataPopulateLocalCopy + + if(status != STATUS_SUCCESS && + pDisplayData) + KrnlHlprFwpmDisplayDataDestroyLocalCopy(&pDisplayData); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpmDisplayDataCreateLocalCopy() [pDisplayData: %#p]\n", + pDisplayData); + +#endif /// DBG + + return pDisplayData; + +#pragma warning(pop) +} + +#endif /// FWP_DISPLAY_DATA____ + +#ifndef FWPM_CLASSIFY_OPTION____ +#define FWPM_CLASSIFY_OPTION____ + +/** + @kernel_helper_function="KrnlHlprFwpmClassifyOptionPurgeLocalCopy" + + Purpose: Cleanup a local copy of an FWPM_CLASSIFY_OPTION. <br> + <br> + Notes: <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Desktop/AA364259.aspx <br> +*/ +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +inline VOID KrnlHlprFwpmClassifyOptionPurgeLocalCopy(_Inout_ FWPM_CLASSIFY_OPTION* pOption) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpmClassifyOptionPurgeLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(pOption); + + KrnlHlprFwpValuePurgeLocalCopy(&(pOption->value)); + + pOption->type = FWP_CLASSIFY_OPTION_MAX; + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpmClassifyOptionPurgeLocalCopy()\n"); + +#endif /// DBG + + return; +} + +/** + @kernel_helper_function="KrnlHlprFwpmClassifyOptionDestroyLocalCopy" + + Purpose: Cleanup and free a local copy of an FWPM_CLASSIFY_OPTION. <br> + <br> + Notes: <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Desktop/AA364259.aspx <br> +*/ +_At_(*ppOption, _Pre_ _Notnull_) +_At_(*ppOption, _Post_ _Null_ __drv_freesMem(Pool)) +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Success_(*ppOption == 0) +inline VOID KrnlHlprFwpmClassifyOptionDestroyLocalCopy(_Inout_ FWPM_CLASSIFY_OPTION** ppOption) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpmClassifyOptionDestroyLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(ppOption); + + if(*ppOption) + KrnlHlprFwpmClassifyOptionPurgeLocalCopy(*ppOption); + + HLPR_DELETE(*ppOption, + WFPSAMPLER_SYSLIB_TAG); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpmClassifyOptionDestroyLocalCopy()\n"); + +#endif /// DBG + + return; +} + +/** + @kernel_helper_function="KrnlHlprFwpmClassifyOptionPopulateLocalCopy" + + Purpose: Populate a local copy of an FWPM_CLASSIFY_OPTION. <br> + <br> + Notes: The caller is responsible for freeing any allocated memory using + KrnlHlprFwpmClassifyOptionPurgeLocalCopy(). <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Desktop/AA364259.aspx <br> +*/ +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Check_return_ +_Success_(return == STATUS_SUCCESS) +NTSTATUS KrnlHlprFwpmClassifyOptionPopulateLocalCopy(_In_ const FWPM_CLASSIFY_OPTION* pOriginalOption, + _Inout_ FWPM_CLASSIFY_OPTION* pOption) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpmClassifyOptionPopulateLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(pOriginalOption); + NT_ASSERT(pOption); + + NTSTATUS status = STATUS_SUCCESS; + + status = KrnlHlprFwpValuePopulateLocalCopy(&(pOriginalOption->value), + &(pOption->value)); + HLPR_BAIL_ON_FAILURE(status); + + pOption->type = pOriginalOption->type; + + HLPR_BAIL_LABEL: + + if(status != STATUS_SUCCESS) + { + KrnlHlprFwpValuePurgeLocalCopy(&(pOption->value)); + + pOption->type = FWP_CLASSIFY_OPTION_MAX; + } + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpmClassifyOptionPopulateLocalCopy() [status: %#x]\n", + status); + +#endif /// DBG + + return status; +} + +/** + @kernel_helper_function="KrnlHlprFwpmClassifyOptionCreateLocalCopy" + + Purpose: Allocate and populate a local copy of an FWPM_CLASSIFY_OPTION. <br> + <br> + Notes: The caller is responsible for freeing any allocated memory using + KrnlHlprFwpmClassifyOptionDestroyLocalCopy(). <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Desktop/AA364259.aspx <br> +*/ +__drv_allocatesMem(Pool) +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Must_inspect_result_ +_Success_(return != 0) +FWPM_CLASSIFY_OPTION* KrnlHlprFwpmClassifyOptionCreateLocalCopy(_In_ const FWPM_CLASSIFY_OPTION* pOriginalOption) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpmClassifyOptionCreateLocalCopy()\n"); + +#endif /// DBG + + FWPM_CLASSIFY_OPTION* pOption = 0; + + if(pOriginalOption) + { + NTSTATUS status = STATUS_SUCCESS; + +#pragma warning(push) +#pragma warning(disable: 6014) /// pOption is expected to be cleaned up by caller using KrnlHlprFwpmClassifyOptionDestroyLocalCopy + + HLPR_NEW(pOption, + FWPM_CLASSIFY_OPTION, + WFPSAMPLER_SYSLIB_TAG); + HLPR_BAIL_ON_ALLOC_FAILURE(pOption, + status); + +#pragma warning(pop) + + status = KrnlHlprFwpmClassifyOptionPopulateLocalCopy(pOriginalOption, + pOption); + + HLPR_BAIL_LABEL: + +#pragma warning(push) +#pragma warning(disable: 6001) /// pOption initialized with call to HLPR_NEW & KrnlHlprFwpmClassifyOptionPopulateLocalCopy + + if(status != STATUS_SUCCESS) + KrnlHlprFwpmClassifyOptionDestroyLocalCopy(&pOption); + } + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpmClassifyOptionCreateLocalCopy() [pOption: %#p]\n", + pOption); + +#endif /// DBG + + return pOption; + +#pragma warning(pop) +} + +#endif /// FWPM_CLASSIFY_OPTION____ + +#ifndef FWPM_CLASSIFY_OPTIONS____ +#define FWPM_CLASSIFY_OPTIONS____ + +/** + @kernel_helper_function="KrnlHlprFwpmClassifyOptionsPurgeLocalCopy" + + Purpose: Cleanup a local copy of an FWPM_CLASSIFY_OPTIONS. <br> + <br> + Notes: <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Desktop/AA364260.aspx <br> +*/ +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +inline VOID KrnlHlprFwpmClassifyOptionsPurgeLocalCopy(_Inout_ FWPM_CLASSIFY_OPTIONS* pOptions) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpmClassifyOptionsPurgeLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(pOptions); + + for(UINT32 optionIndex = 0; + optionIndex < pOptions->numOptions; + optionIndex++) + { + KrnlHlprFwpmClassifyOptionPurgeLocalCopy(&(pOptions->options[optionIndex])); + } + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpmClassifyOptionsPurgeLocalCopy()\n"); + +#endif /// DBG + + return; +} + +/** + @kernel_helper_function="KrnlHlprFwpmClassifyOptionsDestroyLocalCopy" + + Purpose: Cleanup and free a local copy of an FWPM_CLASSIFY_OPTIONS. <br> + <br> + Notes: <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Desktop/AA364260.aspx <br> +*/ +_At_(*ppOptions, _Pre_ _Notnull_) +_At_(*ppOptions, _Post_ _Null_ __drv_freesMem(Pool)) +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Success_(*ppOptions == 0) +inline VOID KrnlHlprFwpmClassifyOptionsDestroyLocalCopy(_Inout_ FWPM_CLASSIFY_OPTIONS** ppOptions) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpmClassifyOptionsDestroyLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(ppOptions); + + if(*ppOptions) + KrnlHlprFwpmClassifyOptionsPurgeLocalCopy(*ppOptions); + + HLPR_DELETE(*ppOptions, + WFPSAMPLER_SYSLIB_TAG); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpmClassifyOptionsDestroyLocalCopy()\n"); + +#endif /// DBG + + return; +} + +/** + @kernel_helper_function="KrnlHlprFwpmClassifyOptionsPopulateLocalCopy" + + Purpose: Populate a local copy of an FWPM_CLASSIFY_OPTIONS. <br> + <br> + Notes: The caller is responsible for freeing the allocated memory using + KrnlHlprFwpmClassifyOptionsPurgeLocalCopy(). <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Desktop/AA364260.aspx <br> +*/ +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Check_return_ +_Success_(return == STATUS_SUCCESS) +NTSTATUS KrnlHlprFwpmClassifyOptionsPopulateLocalCopy(_In_ const FWPM_CLASSIFY_OPTIONS* pOriginalOptions, + _Inout_ FWPM_CLASSIFY_OPTIONS* pOptions) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpmClassifyOptionsPopulateLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(pOriginalOptions); + NT_ASSERT(pOptions); + + NTSTATUS status = STATUS_SUCCESS; + + if(pOriginalOptions->numOptions) + { + HLPR_NEW_ARRAY(pOptions->options, + FWPM_CLASSIFY_OPTION, + pOriginalOptions->numOptions, + WFPSAMPLER_SYSLIB_TAG); + HLPR_BAIL_ON_ALLOC_FAILURE(pOptions->options, + status); + + pOptions->numOptions = pOriginalOptions->numOptions; + + for(UINT32 optionIndex = 0; + optionIndex < pOptions->numOptions; + optionIndex++) + { + status = KrnlHlprFwpmClassifyOptionPopulateLocalCopy(&(pOriginalOptions->options[optionIndex]), + &(pOptions->options[optionIndex])); + HLPR_BAIL_ON_FAILURE(status); + } + } + + HLPR_BAIL_LABEL: + + if(status != STATUS_SUCCESS) + KrnlHlprFwpmClassifyOptionsPurgeLocalCopy(pOptions); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpmClassifyOptionsPopulateLocalCopy() [status: %#x]\n", + status); + +#endif /// DBG + + return status; +} + +/** + @kernel_helper_function="KrnlHlprFwpmClassifyOptionsCreateLocalCopy" + + Purpose: Allocate and populate a local copy of an FWPM_CLASSIFY_OPTIONS. <br> + <br> + Notes: The caller is responsible for freeing the allocated memory using + KrnlHlprFwpmClassifyOptionsDestroyLocalCopy(). <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Desktop/AA364260.aspx <br> +*/ +__drv_allocatesMem(Pool) +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Must_inspect_result_ +_Success_(return != 0) +FWPM_CLASSIFY_OPTIONS* KrnlHlprFwpmClassifyOptionsCreateLocalCopy(_In_ const FWPM_CLASSIFY_OPTIONS* pOriginalOptions) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpmClassifyOptionsCreateLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(pOriginalOptions); + + NTSTATUS status = STATUS_SUCCESS; + FWPM_CLASSIFY_OPTIONS* pOptions = 0; + +#pragma warning(push) +#pragma warning(disable: 6014) /// pOptions is expected to be cleaned up by caller using KrnlHlprFwpmClassifyOptionsDestroyLocalCopy + + HLPR_NEW(pOptions, + FWPM_CLASSIFY_OPTIONS, + WFPSAMPLER_SYSLIB_TAG); + HLPR_BAIL_ON_ALLOC_FAILURE(pOptions, + status); + +#pragma warning(pop) + + status = KrnlHlprFwpmClassifyOptionsPopulateLocalCopy(pOriginalOptions, + pOptions); + + HLPR_BAIL_LABEL: + +#pragma warning(push) +#pragma warning(disable: 6001) /// pOptions initialized with call to HLPR_NEW & KrnlHlprFwpmClassifyOptionsPopulateLocalCopy + + if(status != STATUS_SUCCESS && + pOptions) + KrnlHlprFwpmClassifyOptionsDestroyLocalCopy(&pOptions); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpmClassifyOptionsCreateLocalCopy() [pOptions: %#p]\n", + pOptions); + +#endif /// DBG + + return pOptions; + +#pragma warning(pop) +} + +#endif /// FWPM_CLASSIFY_OPTIONS____ + +#ifndef IPSEC_DOSP_OPTIONS____ +#define IPSEC_DOSP_OPTIONS____ + +#if(NTDDI_VERSION >= NTDDI_WIN7) + +/** + @kernel_helper_function="KrnlHlprIPsecDoSPOptionsPurgeLocalCopy" + + Purpose: Cleanup a local copy of an IPSEC_DOSP_OPTIONS. <br> + <br> + Notes: <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Desktop/DD744994.aspx <br> +*/ +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +inline VOID KrnlHlprIPsecDoSPOptionsPurgeLocalCopy(_Inout_ IPSEC_DOSP_OPTIONS* pOptions) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprIPsecDoSPOptionsPurgeLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(pOptions); + + HLPR_DELETE_ARRAY(pOptions->publicIFLuids, + WFPSAMPLER_SYSLIB_TAG); + + HLPR_DELETE_ARRAY(pOptions->internalIFLuids, + WFPSAMPLER_SYSLIB_TAG); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprIPsecDoSPOptionsPurgeLocalCopy()\n"); + +#endif /// DBG + + return; +} + +/** + @kernel_helper_function="KrnlHlprIPsecDoSPOptionsDestroyLocalCopy" + + Purpose: Cleanup and free a local copy of an IPSEC_DOSP_OPTIONS. <br> + <br> + Notes: <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Desktop/DD744994.aspx <br> +*/ +_At_(*ppOptions, _Pre_ _Notnull_) +_At_(*ppOptions, _Post_ _Null_ __drv_freesMem(Pool)) +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Success_(*ppOptions == 0) +inline VOID KrnlHlprIPsecDoSPOptionsDestroyLocalCopy(_Inout_ IPSEC_DOSP_OPTIONS** ppOptions) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprIPsecDoSPOptionsDestroyLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(ppOptions); + + if(*ppOptions) + KrnlHlprIPsecDoSPOptionsPurgeLocalCopy(*ppOptions); + + HLPR_DELETE(*ppOptions, + WFPSAMPLER_SYSLIB_TAG); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprIPsecDoSPOptionsDestroyLocalCopy()\n"); + +#endif /// DBG + + return; +} + +/** + @kernel_helper_function="KrnlHlprIPsecDoSPOptionsPopulateLocalCopy" + + Purpose: Allocate and populate a local copy of an IPSEC_DOSP_OPTIONS. <br> + <br> + Notes: The caller is responsible for freeing any allocated memory using + KrnlHlprIPsecDoSPOptionsDestroyLocalCopy(). <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Desktop/DD744994.aspx <br> +*/ +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Check_return_ +_Success_(return == STATUS_SUCCESS) +NTSTATUS KrnlHlprIPsecDoSPOptionsPopulateLocalCopy(_In_ const IPSEC_DOSP_OPTIONS* pOriginalOptions, + _Inout_ IPSEC_DOSP_OPTIONS* pOptions) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprIPsecDoSPOptionsPopulateLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(pOriginalOptions); + NT_ASSERT(pOptions); + + NTSTATUS status = STATUS_SUCCESS; + + RtlCopyMemory(pOptions, + pOriginalOptions, + sizeof(IPSEC_DOSP_OPTIONS)); + + pOptions->publicIFLuids = 0; + pOptions->internalIFLuids = 0; + + if(pOptions->numPublicIFLuids) + { + HLPR_NEW_ARRAY(pOptions->publicIFLuids, + UINT64, + pOptions->numPublicIFLuids, + WFPSAMPLER_SYSLIB_TAG); + HLPR_BAIL_ON_ALLOC_FAILURE(pOptions->publicIFLuids, + status); + } + + if(pOptions->numInternalIFLuids) + { + HLPR_NEW_ARRAY(pOptions->internalIFLuids, + UINT64, + pOptions->numInternalIFLuids, + WFPSAMPLER_SYSLIB_TAG); + HLPR_BAIL_ON_ALLOC_FAILURE(pOptions->internalIFLuids, + status); + } + + HLPR_BAIL_LABEL: + + if(status != STATUS_SUCCESS) + KrnlHlprIPsecDoSPOptionsPurgeLocalCopy(pOptions); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprIPsecDoSPOptionsPopulateLocalCopy() [status: %#x]\n", + status); + +#endif /// DBG + + return status; + +} + +/** + @kernel_helper_function="KrnlHlprIPsecDoSPOptionsCreateLocalCopy" + + Purpose: Allocate and populate a local copy of an IPSEC_DOSP_OPTIONS. <br> + <br> + Notes: The caller is responsible for freeing any allocated memory using + KrnlHlprIPsecDoSPOptionsDestroyLocalCopy(). <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Desktop/DD744994.aspx <br> +*/ +__drv_allocatesMem(Pool) +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Must_inspect_result_ +_Success_(return != 0) +IPSEC_DOSP_OPTIONS* KrnlHlprIPsecDoSPOptionsCreateLocalCopy(_In_ const IPSEC_DOSP_OPTIONS* pOriginalOptions) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprIPsecDoSPOptionsCreateLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(pOriginalOptions); + + NTSTATUS status = STATUS_SUCCESS; + IPSEC_DOSP_OPTIONS* pOptions = 0; + +#pragma warning(push) +#pragma warning(disable: 6014) /// pOptions is expected to be cleaned up by caller using KrnlHlprIPsecDoSPOptionsPopulateLocalCopy + + HLPR_NEW(pOptions, + IPSEC_DOSP_OPTIONS, + WFPSAMPLER_SYSLIB_TAG); + HLPR_BAIL_ON_ALLOC_FAILURE(pOptions, + status); + +#pragma warning(pop) + + status = KrnlHlprIPsecDoSPOptionsPopulateLocalCopy(pOriginalOptions, + pOptions); + + HLPR_BAIL_LABEL: + +#pragma warning(push) +#pragma warning(disable: 6001) /// pOptions initialized with call to HLPR_NEW & KrnlHlprIPsecDoSPOptionsPopulateLocalCopy + + if(status != STATUS_SUCCESS && + pOptions) + KrnlHlprIPsecDoSPOptionsDestroyLocalCopy(&pOptions); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprIPsecDoSPOptionsCreateLocalCopy() [pOptions: %#p]\n", + pOptions); + +#endif /// DBG + + return pOptions; + +#pragma warning(pop) +} + +#endif /// (NTDDI_VERSION >= NTDDI_WIN7) + +#endif /// IPSEC_DOSP_OPTIONS____ + +#ifndef FWP_TOKEN_INFORMATION____ +#define FWP_TOKEN_INFORMATION____ + +/** + @kernel_helper_function="KrnlHlprFwpTokenInformationPurgeLocalCopy" + + Purpose: Cleanup a local copy of an FWP_TOKEN_INFORMATION. <br> + <br> + Notes: <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552440.aspx <br> +*/ +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +inline VOID KrnlHlprFwpTokenInformationPurgeLocalCopy(_Inout_ FWP_TOKEN_INFORMATION* pTokenInfo) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpTokenInformationPurgeLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(pTokenInfo); + + for(UINT32 i = 0; + i < pTokenInfo->sidCount; + i++) + { + HLPR_DELETE_ARRAY(pTokenInfo->sids[i].Sid, + WFPSAMPLER_SYSLIB_TAG); + } + + HLPR_DELETE_ARRAY(pTokenInfo->sids, + WFPSAMPLER_SYSLIB_TAG); + + for(UINT32 i = 0; + i < pTokenInfo->restrictedSidCount; + i++) + { + HLPR_DELETE_ARRAY(pTokenInfo->restrictedSids[i].Sid, + WFPSAMPLER_SYSLIB_TAG); + } + + HLPR_DELETE_ARRAY(pTokenInfo->restrictedSids, + WFPSAMPLER_SYSLIB_TAG); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpTokenInformationPurgeLocalCopy()\n"); + +#endif /// DBG + + return; +} + +/** + @kernel_helper_function="KrnlHlprFwpTokenInformationDestroyLocalCopy" + + Purpose: Cleanup and free a local copy of an FWP_TOKEN_INFORMATION. <br> + <br> + Notes: <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552440.aspx <br> +*/ +_At_(*ppTokenInfo, _Pre_ _Notnull_) +_At_(*ppTokenInfo, _Post_ _Null_ __drv_freesMem(Pool)) +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Success_(*ppTokenInfo == 0) +inline VOID KrnlHlprFwpTokenInformationDestroyLocalCopy(_Inout_ FWP_TOKEN_INFORMATION** ppTokenInfo) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpTokenInformationDestroyLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(ppTokenInfo); + + if(*ppTokenInfo) + KrnlHlprFwpTokenInformationPurgeLocalCopy(*ppTokenInfo); + + HLPR_DELETE(*ppTokenInfo, + WFPSAMPLER_SYSLIB_TAG); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpTokenInformationDestroyLocalCopy()\n"); + +#endif /// DBG + + return; +} + +/** + @kernel_helper_function="KrnlHlprFwpTokenInformationPopulateLocalCopy" + + Purpose: Populate a local copy of an FWP_TOKEN_INFORMATION. <br> + <br> + Notes: The caller is responsible for freeing the allocated memory using + KrnlHlprFwpTokenInformationPurgeLocalCopy(). <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552440.aspx <br> +*/ +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Check_return_ +_Success_(return == STATUS_SUCCESS) +NTSTATUS KrnlHlprFwpTokenInformationPopulateLocalCopy(_In_ const FWP_TOKEN_INFORMATION* pOriginalTokenInfo, + _Inout_ FWP_TOKEN_INFORMATION* pTokenInfo) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpTokenInformationPopulateLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(pOriginalTokenInfo); + NT_ASSERT(pTokenInfo); + + NTSTATUS status = STATUS_SUCCESS; + KIRQL irql = KeGetCurrentIrql(); + + HLPR_NEW_ARRAY(pTokenInfo->sids, + SID_AND_ATTRIBUTES, + pOriginalTokenInfo->sidCount, + WFPSAMPLER_SYSLIB_TAG); + HLPR_BAIL_ON_ALLOC_FAILURE(pTokenInfo->sids, + status); + + pTokenInfo->sidCount = pOriginalTokenInfo->sidCount; + + for(UINT32 i = 0; + i < pTokenInfo->sidCount; + i++) + { + UINT32 sidSize = 0; + + if(irql < DISPATCH_LEVEL) + { + if(RtlValidSid(pOriginalTokenInfo->sids[i].Sid)) + { + sidSize = RtlLengthSid(pOriginalTokenInfo->sids[i].Sid); + if(sidSize) + { + HLPR_NEW_ARRAY(pTokenInfo->sids[i].Sid, + BYTE, + sidSize, + WFPSAMPLER_SYSLIB_TAG); + HLPR_BAIL_ON_ALLOC_FAILURE(pTokenInfo->sids[i].Sid, + status); + + status = RtlCopySid(sidSize, + pTokenInfo->sids[i].Sid, + pOriginalTokenInfo->sids[i].Sid); + HLPR_BAIL_ON_FAILURE(status); + } + else + { + status = STATUS_INVALID_BUFFER_SIZE; + + HLPR_BAIL; + } + } + else + { + status = STATUS_INVALID_SID; + + HLPR_BAIL; + } + } + else + { + sidSize = SID_LENGTH(pOriginalTokenInfo->sids[i].Sid); + if(sidSize) + { + HLPR_NEW_ARRAY(pTokenInfo->sids[i].Sid, + BYTE, + sidSize, + WFPSAMPLER_SYSLIB_TAG); + HLPR_BAIL_ON_ALLOC_FAILURE(pTokenInfo->sids[i].Sid, + status); + + RtlCopyMemory(pTokenInfo->sids[i].Sid, + pOriginalTokenInfo->sids[i].Sid, + sidSize); + } + else + { + status = STATUS_INVALID_BUFFER_SIZE; + + HLPR_BAIL; + } + } + + pTokenInfo->sids[i].Attributes = pTokenInfo->sids[i].Attributes; + } + + HLPR_NEW_ARRAY(pTokenInfo->restrictedSids, + SID_AND_ATTRIBUTES, + pOriginalTokenInfo->restrictedSidCount, + WFPSAMPLER_SYSLIB_TAG); + HLPR_BAIL_ON_ALLOC_FAILURE(pTokenInfo->restrictedSids, + status); + + pTokenInfo->restrictedSidCount = pOriginalTokenInfo->restrictedSidCount; + + for(UINT32 i = 0; + i < pTokenInfo->restrictedSidCount; + i++) + { + UINT32 sidSize = 0; + + if(irql < DISPATCH_LEVEL) + { +#pragma warning(push) +#pragma warning(disable: 28118) /// IRQL check has already been performed + + if(RtlValidSid(pOriginalTokenInfo->restrictedSids[i].Sid)) + { + +#pragma warning(pop) + + sidSize = RtlLengthSid(pOriginalTokenInfo->restrictedSids[i].Sid); + if(sidSize) + { + HLPR_NEW_ARRAY(pTokenInfo->restrictedSids[i].Sid, + BYTE, + sidSize, + WFPSAMPLER_SYSLIB_TAG); + HLPR_BAIL_ON_ALLOC_FAILURE(pTokenInfo->restrictedSids[i].Sid, + status); + + status = RtlCopySid(sidSize, + pTokenInfo->restrictedSids[i].Sid, + pOriginalTokenInfo->restrictedSids[i].Sid); + HLPR_BAIL_ON_FAILURE(status); + } + else + { + status = STATUS_INVALID_BUFFER_SIZE; + + HLPR_BAIL; + } + } + else + { + status = STATUS_INVALID_SID; + + HLPR_BAIL; + } + } + else + { + sidSize = SID_LENGTH(pOriginalTokenInfo->restrictedSids[i].Sid); + if(sidSize) + { + HLPR_NEW_ARRAY(pTokenInfo->restrictedSids[i].Sid, + BYTE, + sidSize, + WFPSAMPLER_SYSLIB_TAG); + HLPR_BAIL_ON_ALLOC_FAILURE(pTokenInfo->restrictedSids[i].Sid, + status); + + RtlCopyMemory(pTokenInfo->restrictedSids[i].Sid, + pOriginalTokenInfo->restrictedSids[i].Sid, + sidSize); + } + else + { + status = STATUS_INVALID_BUFFER_SIZE; + + HLPR_BAIL; + } + } + + pTokenInfo->restrictedSids[i].Attributes = pTokenInfo->restrictedSids[i].Attributes; + } + + HLPR_BAIL_LABEL: + + if(status != STATUS_SUCCESS) + KrnlHlprFwpTokenInformationDestroyLocalCopy(&pTokenInfo); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpTokenInformationPopulateLocalCopy() [status: %#x]\n", + status); + +#endif /// DBG + + return status; +} + +/** + @kernel_helper_function="KrnlHlprFwpTokenInformationCreateLocalCopy" + + Purpose: Allocate and populate a local copy of an FWP_TOKEN_INFORMATION. <br> + <br> + Notes: The caller is responsible for freeing the allocated memory using + KrnlHlprFwpTokenInformationDestroyLocalCopy(). <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552440.aspx <br> +*/ +__drv_allocatesMem(Pool) +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Must_inspect_result_ +_Success_(return != 0) +FWP_TOKEN_INFORMATION* KrnlHlprFwpTokenInformationCreateLocalCopy(_In_ const FWP_TOKEN_INFORMATION* pOriginalTokenInfo) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpTokenInformationCreateLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(pOriginalTokenInfo); + + NTSTATUS status = STATUS_SUCCESS; + FWP_TOKEN_INFORMATION* pTokenInfo = 0; + +#pragma warning(push) +#pragma warning(disable: 6014) /// pTokenInfo is expected to be cleaned up by caller using KrnlHlprFwpTokenInformationDestroyLocalCopy + + HLPR_NEW(pTokenInfo, + FWP_TOKEN_INFORMATION, + WFPSAMPLER_SYSLIB_TAG); + HLPR_BAIL_ON_ALLOC_FAILURE(pTokenInfo, + status); + +#pragma warning(pop) + + status = KrnlHlprFwpTokenInformationPopulateLocalCopy(pOriginalTokenInfo, + pTokenInfo); + + HLPR_BAIL_LABEL: + +#pragma warning(push) +#pragma warning(disable: 6001) /// pTokenInfo initialized with call to HLPR_NEW & KrnlHlprFwpTokenInformationPopulateLocalCopy + + if(status != STATUS_SUCCESS && + pTokenInfo) + KrnlHlprFwpTokenInformationDestroyLocalCopy(&pTokenInfo); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpTokenInformationCreateLocalCopy() [pTokenInfo: %#p]\n", + pTokenInfo); + +#endif /// DBG + + return pTokenInfo; + +#pragma warning(pop) +} + +#endif /// FWP_TOKEN_INFORMATION____ + +#ifndef FWP_VALUE____ +#define FWP_VALUE____ + +/** + @kernel_helper_function="KrnlHlprFwpValueGetStringForFwpsIncomingValue" + + Purpose: Return a string representing the condition field of the FWPS_INCOMING_VALUE. <br> + <br> + Notes: <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552450.aspx <br> + HTTP://MSDN.Microsoft.com/En-US/Library/Windwos/Hardware/FF549939.aspx <br> +*/ +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Success_(return != 0) +PSTR KrnlHlprFwpValueGetStringForFwpsIncomingValue(_In_ UINT32 layerID, + _In_ UINT32 fieldID, + _Out_opt_ BOOLEAN* pFormat) /* 0 */ +{ + PSTR pString = 0; + + if(pFormat) + *pFormat = FALSE; + + switch(layerID) + { + case FWPS_LAYER_INBOUND_IPPACKET_V4: + case FWPS_LAYER_INBOUND_IPPACKET_V4_DISCARD: + case FWPS_LAYER_INBOUND_IPPACKET_V6: + case FWPS_LAYER_INBOUND_IPPACKET_V6_DISCARD: + { + if(fieldID == FWPS_FIELD_INBOUND_IPPACKET_V4_IP_LOCAL_ADDRESS) + { + pString = "FWPM_CONDITION_IP_LOCAL_ADDRESS"; + + if(pFormat) + *pFormat = ADDRESS_VALUE; + } + else if(fieldID == FWPS_FIELD_INBOUND_IPPACKET_V4_IP_REMOTE_ADDRESS) + { + pString = "FWPM_CONDITION_IP_REMOTE_ADDRESS"; + + if(pFormat) + *pFormat = ADDRESS_VALUE; + } + else if(fieldID == FWPS_FIELD_INBOUND_IPPACKET_V4_IP_LOCAL_ADDRESS_TYPE) + pString = "FWPM_CONDITION_IP_LOCAL_ADDRESS_TYPE"; + else if(fieldID == FWPS_FIELD_INBOUND_IPPACKET_V4_IP_LOCAL_INTERFACE) + pString = "FWPM_CONDITION_IP_LOCAL_INTERFACE"; + else if(fieldID == FWPS_FIELD_INBOUND_IPPACKET_V4_INTERFACE_INDEX) + pString = "FWPM_CONDITION_INTERFACE_INDEX"; + else if(fieldID == FWPS_FIELD_INBOUND_IPPACKET_V4_SUB_INTERFACE_INDEX) + pString = "FWPM_CONDITION_SUB_INTERFACE_INDEX"; + else if(fieldID == FWPS_FIELD_INBOUND_IPPACKET_V4_FLAGS) + { + pString = "FWPM_CONDITION_FLAGS"; + + if(pFormat) + *pFormat = FLAGS_VALUE; + } + else if(fieldID == FWPS_FIELD_INBOUND_IPPACKET_V4_INTERFACE_TYPE) + pString = "FWPM_CONDITION_INTERFACE_TYPE"; + else if(fieldID == FWPS_FIELD_INBOUND_IPPACKET_V4_TUNNEL_TYPE) + pString = "FWPM_CONDITION_TUNNEL_TYPE"; + + break; + } + case FWPS_LAYER_OUTBOUND_IPPACKET_V4: + case FWPS_LAYER_OUTBOUND_IPPACKET_V4_DISCARD: + case FWPS_LAYER_OUTBOUND_IPPACKET_V6: + case FWPS_LAYER_OUTBOUND_IPPACKET_V6_DISCARD: + { + if(fieldID == FWPS_FIELD_OUTBOUND_IPPACKET_V4_IP_LOCAL_ADDRESS) + { + pString = "FWPM_CONDITION_IP_LOCAL_ADDRESS"; + + if(pFormat) + *pFormat = ADDRESS_VALUE; + } + else if(fieldID == FWPS_FIELD_OUTBOUND_IPPACKET_V4_IP_LOCAL_ADDRESS_TYPE) + pString = "FWPM_CONDITION_IP_LOCAL_ADDRESS_TYPE"; + else if(fieldID == FWPS_FIELD_OUTBOUND_IPPACKET_V4_IP_REMOTE_ADDRESS) + { + pString = "FWPM_CONDITION_IP_REMOTE_ADDRESS"; + + if(pFormat) + *pFormat = ADDRESS_VALUE; + } + else if(fieldID == FWPS_FIELD_OUTBOUND_IPPACKET_V4_IP_LOCAL_INTERFACE) + pString = "FWPM_CONDITION_IP_LOCAL_INTERFACE"; + else if(fieldID == FWPS_FIELD_OUTBOUND_IPPACKET_V4_INTERFACE_INDEX) + pString = "FWPM_CONDITION_INTERFACE_INDEX"; + else if(fieldID == FWPS_FIELD_OUTBOUND_IPPACKET_V4_SUB_INTERFACE_INDEX) + pString = "FWPM_CONDITION_SUB_INTERFACE_INDEX"; + else if(fieldID == FWPS_FIELD_OUTBOUND_IPPACKET_V4_FLAGS) + { + pString = "FWPM_CONDITION_FLAGS"; + + if(pFormat) + *pFormat = FLAGS_VALUE; + } + else if(fieldID == FWPS_FIELD_OUTBOUND_IPPACKET_V4_INTERFACE_TYPE) + pString = "FWPM_CONDITION_INTERFACE_TYPE"; + else if(fieldID == FWPS_FIELD_OUTBOUND_IPPACKET_V4_TUNNEL_TYPE) + pString = "FWPM_CONDITION_TUNNEL_TYPE"; + + break; + } + case FWPS_LAYER_IPFORWARD_V4: + case FWPS_LAYER_IPFORWARD_V4_DISCARD: + case FWPS_LAYER_IPFORWARD_V6: + case FWPS_LAYER_IPFORWARD_V6_DISCARD: + { + if(fieldID == FWPS_FIELD_IPFORWARD_V4_IP_SOURCE_ADDRESS) + { + pString = "FWPM_CONDITION_IP_SOURCE_ADDRESS"; + + if(pFormat) + *pFormat = ADDRESS_VALUE; + } + else if(fieldID == FWPS_FIELD_IPFORWARD_V4_IP_DESTINATION_ADDRESS) + { + pString = "FWPM_CONDITION_IP_DESTINATION_ADDRESS"; + + if(pFormat) + *pFormat = ADDRESS_VALUE; + } + else if(fieldID == FWPS_FIELD_IPFORWARD_V4_IP_DESTINATION_ADDRESS_TYPE) + pString = "FWPM_CONDITION_IP_DESTINATION_ADDRESS_TYPE"; + else if(fieldID == FWPS_FIELD_IPFORWARD_V4_IP_LOCAL_INTERFACE) + pString = "FWPM_CONDITION_IP_LOCAL_INTERFACE"; + else if(fieldID == FWPS_FIELD_IPFORWARD_V4_IP_FORWARD_INTERFACE) + pString = "FWPM_CONDITION_IP_FORWARD_INTERFACE"; + else if(fieldID == FWPS_FIELD_IPFORWARD_V4_SOURCE_INTERFACE_INDEX) + pString = "FWPM_CONDITION_SOURCE_INTERFACE_INDEX"; + else if(fieldID == FWPS_FIELD_IPFORWARD_V4_SOURCE_SUB_INTERFACE_INDEX) + pString = "FWPM_CONDITION_SOURCE_SUB_INTERFACE_INDEX"; + else if(fieldID == FWPS_FIELD_IPFORWARD_V4_DESTINATION_INTERFACE_INDEX) + pString = "FWPM_CONDITION_DESTINATION_INTERFACE_INDEX"; + else if(fieldID == FWPS_FIELD_IPFORWARD_V4_DESTINATION_SUB_INTERFACE_INDEX) + pString = "FWPM_CONDITION_DESTINATION_SUB_INTERFACE_INDEX"; + else if(fieldID == FWPS_FIELD_IPFORWARD_V4_FLAGS) + { + pString = "FWPM_CONDITION_FLAGS"; + + if(pFormat) + *pFormat = FLAGS_VALUE; + } + +#if(NTDDI_VERSION >= NTDDI_WIN7) + + else if(fieldID == FWPS_FIELD_IPFORWARD_V4_IP_PHYSICAL_ARRIVAL_INTERFACE) + pString = "FWPM_CONDITION_IP_PHYSICAL_ARRIVAL_INTERFACE"; + else if(fieldID == FWPS_FIELD_IPFORWARD_V4_ARRIVAL_INTERFACE_PROFILE_ID) + pString = "FWPM_CONDITION_ARRIVAL_INTERFACE_PROFILE_ID"; + else if(fieldID == FWPS_FIELD_IPFORWARD_V4_IP_PHYSICAL_NEXTHOP_INTERFACE) + pString = "FWPM_CONDITION_IP_PHYSICAL_NEXTHOP_INTERFACE"; + else if(fieldID == FWPS_FIELD_IPFORWARD_V4_NEXTHOP_INTERFACE_PROFILE_ID) + pString = "FWPM_CONDITION_NEXTHOP_INTERFACE_PROFILE_ID"; + +#endif /// (NTDDI_VERSION >= NTDDI_WIN7) + + break; + } + case FWPS_LAYER_INBOUND_TRANSPORT_V4: + case FWPS_LAYER_INBOUND_TRANSPORT_V4_DISCARD: + case FWPS_LAYER_INBOUND_TRANSPORT_V6: + case FWPS_LAYER_INBOUND_TRANSPORT_V6_DISCARD: + { + if(fieldID == FWPS_FIELD_INBOUND_TRANSPORT_V4_IP_PROTOCOL) + pString = "FWPM_CONDITION_IP_PROTOCOL"; + else if(fieldID == FWPS_FIELD_INBOUND_TRANSPORT_V4_IP_LOCAL_ADDRESS) + { + pString = "FWPM_CONDITION_IP_LOCAL_ADDRESS"; + + if(pFormat) + *pFormat = ADDRESS_VALUE; + } + else if(fieldID == FWPS_FIELD_INBOUND_TRANSPORT_V4_IP_REMOTE_ADDRESS) + { + pString = "FWPM_CONDITION_IP_REMOTE_ADDRESS"; + + if(pFormat) + *pFormat = ADDRESS_VALUE; + } + else if(fieldID == FWPS_FIELD_INBOUND_TRANSPORT_V4_IP_LOCAL_ADDRESS_TYPE) + pString = "FWPM_CONDITION_IP_LOCAL_ADDRESS_TYPE"; + else if(fieldID == FWPS_FIELD_INBOUND_TRANSPORT_V4_IP_LOCAL_PORT) + pString = "FWPM_CONDITION_IP_LOCAL_PORT"; + else if(fieldID == FWPS_FIELD_INBOUND_TRANSPORT_V4_IP_REMOTE_PORT) + pString = "FWPM_CONDITION_IP_REMOTE_PORT"; + else if(fieldID == FWPS_FIELD_INBOUND_TRANSPORT_V4_IP_LOCAL_INTERFACE) + pString = "FWPM_CONDITION_IP_LOCAL_INTERFACE"; + else if(fieldID == FWPS_FIELD_INBOUND_TRANSPORT_V4_INTERFACE_INDEX) + pString = "FWPM_CONDITION_INTERFACE_INDEX"; + else if(fieldID == FWPS_FIELD_INBOUND_TRANSPORT_V4_SUB_INTERFACE_INDEX) + pString = "FWPM_CONDITION_SUB_INTERFACE_INDEX"; + else if(fieldID == FWPS_FIELD_INBOUND_TRANSPORT_V4_FLAGS) + { + pString = "FWPM_CONDITION_FLAGS"; + + if(pFormat) + *pFormat = FLAGS_VALUE; + } + else if(fieldID == FWPS_FIELD_INBOUND_TRANSPORT_V4_INTERFACE_TYPE) + pString = "FWPM_CONDITION_INTERFACE_TYPE"; + else if(fieldID == FWPS_FIELD_INBOUND_TRANSPORT_V4_TUNNEL_TYPE) + pString = "FWPM_CONDITION_TUNNEL_TYPE"; + +#if(NTDDI_VERSION >= NTDDI_WIN7) + + else if(fieldID == FWPS_FIELD_INBOUND_TRANSPORT_V4_PROFILE_ID) + pString = "FWPM_CONDITION_PROFILE_ID"; + +#if(NTDDI_VERSION >= NTDDI_WINTHRESHOLD) + + else if(fieldID == FWPS_FIELD_INBOUND_TRANSPORT_V4_IPSEC_SECURITY_REALM_ID) + pString = "FWPM_CONDITION_IPSEC_SECURITY_REALM_ID"; + +#endif /// (NTDDI_VERSION >= NTDDI_WINTHRESHOLD) + +#endif /// (NTDDI_VERSION >= NTDDI_WIN7) + + break; + } + case FWPS_LAYER_OUTBOUND_TRANSPORT_V4: + case FWPS_LAYER_OUTBOUND_TRANSPORT_V4_DISCARD: + case FWPS_LAYER_OUTBOUND_TRANSPORT_V6: + case FWPS_LAYER_OUTBOUND_TRANSPORT_V6_DISCARD: + { + if(fieldID == FWPS_FIELD_OUTBOUND_TRANSPORT_V4_IP_PROTOCOL) + pString = "FWPM_CONDITION_IP_PROTOCOL"; + else if(fieldID == FWPS_FIELD_OUTBOUND_TRANSPORT_V4_IP_LOCAL_ADDRESS) + { + pString = "FWPM_CONDITION_IP_LOCAL_ADDRESS"; + + if(pFormat) + *pFormat = ADDRESS_VALUE; + } + else if(fieldID == FWPS_FIELD_OUTBOUND_TRANSPORT_V4_IP_LOCAL_ADDRESS_TYPE) + pString = "FWPM_CONDITION_IP_LOCAL_ADDRESS_TYPE"; + else if(fieldID == FWPS_FIELD_OUTBOUND_TRANSPORT_V4_IP_REMOTE_ADDRESS) + { + pString = "FWPM_CONDITION_IP_REMOTE_ADDRESS"; + + if(pFormat) + *pFormat = ADDRESS_VALUE; + } + else if(fieldID == FWPS_FIELD_OUTBOUND_TRANSPORT_V4_IP_LOCAL_PORT) + pString = "FWPM_CONDITION_IP_LOCAL_PORT"; + else if(fieldID == FWPS_FIELD_OUTBOUND_TRANSPORT_V4_IP_REMOTE_PORT) + pString = "FWPM_CONDITION_IP_REMOTE_PORT"; + else if(fieldID == FWPS_FIELD_OUTBOUND_TRANSPORT_V4_IP_LOCAL_INTERFACE) + pString = "FWPM_CONDITION_IP_LOCAL_INTERFACE"; + else if(fieldID == FWPS_FIELD_OUTBOUND_TRANSPORT_V4_INTERFACE_INDEX) + pString = "FWPM_CONDITION_INTERFACE_INDEX"; + else if(fieldID == FWPS_FIELD_OUTBOUND_TRANSPORT_V4_SUB_INTERFACE_INDEX) + pString = "FWPM_CONDITION_SUB_INTERFACE_INDEX"; + else if(fieldID == FWPS_FIELD_OUTBOUND_TRANSPORT_V4_IP_DESTINATION_ADDRESS_TYPE) + pString = "FWPM_CONDITION_IP_DESTINATION_ADDRESS_TYPE"; + else if(fieldID == FWPS_FIELD_OUTBOUND_TRANSPORT_V4_FLAGS) + { + pString = "FWPM_CONDITION_FLAGS"; + + if(pFormat) + *pFormat = FLAGS_VALUE; + } + else if(fieldID == FWPS_FIELD_OUTBOUND_TRANSPORT_V4_INTERFACE_TYPE) + pString = "FWPM_CONDITION_INTERFACE_TYPE"; + else if(fieldID == FWPS_FIELD_OUTBOUND_TRANSPORT_V4_TUNNEL_TYPE) + pString = "FWPM_CONDITION_TUNNEL_TYPE"; + +#if(NTDDI_VERSION >= NTDDI_WIN7) + + else if(fieldID == FWPS_FIELD_OUTBOUND_TRANSPORT_V4_PROFILE_ID) + pString = "FWPM_CONDITION_PROFILE_ID"; + +#if(NTDDI_VERSION >= NTDDI_WINTHRESHOLD) + + else if(fieldID == FWPS_FIELD_OUTBOUND_TRANSPORT_V4_IPSEC_SECURITY_REALM_ID) + pString = "FWPM_CONDITION_IPSEC_SECURITY_REALM_ID"; + +#endif /// (NTDDI_VERSION >= NTDDI_WINTHRESHOLD) +#endif /// (NTDDI_VERSION >= NTDDI_WIN7) + + break; + } + case FWPS_LAYER_STREAM_V4: + case FWPS_LAYER_STREAM_V4_DISCARD: + case FWPS_LAYER_STREAM_V6: + case FWPS_LAYER_STREAM_V6_DISCARD: + { + if(fieldID == FWPS_FIELD_STREAM_V4_IP_LOCAL_ADDRESS) + { + pString = "FWPM_CONDITION_IP_LOCAL_ADDRESS"; + + if(pFormat) + *pFormat = ADDRESS_VALUE; + } + else if(fieldID == FWPS_FIELD_STREAM_V4_IP_LOCAL_ADDRESS_TYPE) + pString = "FWPM_CONDITION_IP_LOCAL_ADDRESS_TYPE"; + else if(fieldID == FWPS_FIELD_STREAM_V4_IP_REMOTE_ADDRESS) + { + pString = "FWPM_CONDITION_IP_REMOTE_ADDRESS"; + + if(pFormat) + *pFormat = ADDRESS_VALUE; + } + else if(fieldID == FWPS_FIELD_STREAM_V4_IP_LOCAL_PORT) + pString = "FWPM_CONDITION_IP_LOCAL_PORT"; + else if(fieldID == FWPS_FIELD_STREAM_V4_IP_REMOTE_PORT) + pString = "FWPM_CONDITION_IP_REMOTE_PORT"; + else if(fieldID == FWPS_FIELD_STREAM_V4_DIRECTION) + pString = "FWPM_CONDITION_DIRECTION"; + +#if(NTDDI_VERSION >= NTDDI_VISTASP1) + + else if(fieldID == FWPS_FIELD_STREAM_V4_FLAGS) + { + pString = "FWPM_CONDITION_FLAGS"; + + if(pFormat) + *pFormat = FLAGS_VALUE; + } + +#endif /// (NTDDI_VERSION >= NTDDI_VISTASP1) + + break; + } + case FWPS_LAYER_DATAGRAM_DATA_V4: + case FWPS_LAYER_DATAGRAM_DATA_V4_DISCARD: + case FWPS_LAYER_DATAGRAM_DATA_V6: + case FWPS_LAYER_DATAGRAM_DATA_V6_DISCARD: + { + if(fieldID == FWPS_FIELD_DATAGRAM_DATA_V4_IP_PROTOCOL) + pString = "FWPM_CONDITION_IP_PROTOCOL"; + else if(fieldID == FWPS_FIELD_DATAGRAM_DATA_V4_IP_LOCAL_ADDRESS) + { + pString = "FWPM_CONDITION_IP_LOCAL_ADDRESS"; + + if(pFormat) + *pFormat = ADDRESS_VALUE; + } + else if(fieldID == FWPS_FIELD_DATAGRAM_DATA_V4_IP_REMOTE_ADDRESS) + { + pString = "FWPM_CONDITION_IP_REMOTE_ADDRESS"; + + if(pFormat) + *pFormat = ADDRESS_VALUE; + } + else if(fieldID == FWPS_FIELD_DATAGRAM_DATA_V4_IP_LOCAL_ADDRESS_TYPE) + pString = "FWPM_CONDITION_IP_LOCAL_ADDRESS_TYPE"; + else if(fieldID == FWPS_FIELD_DATAGRAM_DATA_V4_IP_LOCAL_PORT) + pString = "FWPM_CONDITION_IP_LOCAL_PORT"; + else if(fieldID == FWPS_FIELD_DATAGRAM_DATA_V4_IP_REMOTE_PORT) + pString = "FWPM_CONDITION_IP_REMOTE_PORT"; + else if(fieldID == FWPS_FIELD_DATAGRAM_DATA_V4_IP_LOCAL_INTERFACE) + pString = "FWPM_CONDITION_IP_LOCAL_INTERFACE"; + else if(fieldID == FWPS_FIELD_DATAGRAM_DATA_V4_INTERFACE_INDEX) + pString = "FWPM_CONDITION_INTERFACE_INDEX"; + else if(fieldID == FWPS_FIELD_DATAGRAM_DATA_V4_SUB_INTERFACE_INDEX) + pString = "FWPM_CONDITION_SUB_INTERFACE_INDEX"; + else if(fieldID == FWPS_FIELD_DATAGRAM_DATA_V4_DIRECTION) + pString = "FWPM_CONDITION_DIRECTION"; + else if(fieldID == FWPS_FIELD_DATAGRAM_DATA_V4_FLAGS) + { + pString = "FWPM_CONDITION_FLAGS"; + + if(pFormat) + *pFormat = FLAGS_VALUE; + } + else if(fieldID == FWPS_FIELD_DATAGRAM_DATA_V4_INTERFACE_TYPE) + pString = "FWPM_CONDITION_INTERFACE_TYPE"; + else if(fieldID == FWPS_FIELD_DATAGRAM_DATA_V4_TUNNEL_TYPE) + pString = "FWPM_CONDITION_TUNNEL_TYPE"; + + break; + } + case FWPS_LAYER_INBOUND_ICMP_ERROR_V4: + case FWPS_LAYER_INBOUND_ICMP_ERROR_V4_DISCARD: + case FWPS_LAYER_INBOUND_ICMP_ERROR_V6: + case FWPS_LAYER_INBOUND_ICMP_ERROR_V6_DISCARD: + { + if(fieldID == FWPS_FIELD_INBOUND_ICMP_ERROR_V4_EMBEDDED_PROTOCOL) + pString = "FWPM_CONDITION_EMBEDDED_PROTOCOL"; + else if(fieldID == FWPS_FIELD_INBOUND_ICMP_ERROR_V4_IP_LOCAL_ADDRESS) + { + pString = "FWPM_CONDITION_IP_LOCAL_ADDRESS"; + + if(pFormat) + *pFormat = ADDRESS_VALUE; + } + else if(fieldID == FWPS_FIELD_INBOUND_ICMP_ERROR_V4_IP_REMOTE_ADDRESS) + { + pString = "FWPM_CONDITION_IP_REMOTE_ADDRESS"; + + if(pFormat) + *pFormat = ADDRESS_VALUE; + } + else if(fieldID == FWPS_FIELD_INBOUND_ICMP_ERROR_V4_EMBEDDED_REMOTE_ADDRESS) + pString = "FWPM_CONDITION_EMBEDDED_REMOTE_ADDRESS"; + else if(fieldID == FWPS_FIELD_INBOUND_ICMP_ERROR_V4_EMBEDDED_LOCAL_ADDRESS_TYPE) + pString = "FWPM_CONDITION_EMBEDDED_LOCAL_ADDRESS_TYPE"; + else if(fieldID == FWPS_FIELD_INBOUND_ICMP_ERROR_V4_EMBEDDED_LOCAL_PORT) + pString = "FWPM_CONDITION_EMBEDDED_LOCAL_PORT"; + else if(fieldID == FWPS_FIELD_INBOUND_ICMP_ERROR_V4_EMBEDDED_REMOTE_PORT) + pString = "FWPM_CONDITION_EMBEDDED_REMOTE_PORT"; + else if(fieldID == FWPS_FIELD_INBOUND_ICMP_ERROR_V4_IP_LOCAL_INTERFACE) + pString = "FWPM_CONDITION_IP_LOCAL_INTERFACE"; + else if(fieldID == FWPS_FIELD_INBOUND_ICMP_ERROR_V4_ICMP_TYPE) + pString = "FWPM_CONDITION_ICMP_TYPE"; + else if(fieldID == FWPS_FIELD_INBOUND_ICMP_ERROR_V4_ICMP_CODE) + pString = "FWPM_CONDITION_ICMP_CODE"; + else if(fieldID == FWPS_FIELD_INBOUND_ICMP_ERROR_V4_INTERFACE_INDEX) + pString = "FWPM_CONDITION_INTERFACE_INDEX"; + else if(fieldID == FWPS_FIELD_INBOUND_ICMP_ERROR_V4_SUB_INTERFACE_INDEX) + pString = "FWPM_CONDITION_SUB_INTERFACE_INDEX"; + else if(fieldID == FWPS_FIELD_INBOUND_ICMP_ERROR_V4_INTERFACE_TYPE) + pString = "FWPM_CONDITION_INTERFACE_TYPE"; + else if(fieldID == FWPS_FIELD_INBOUND_ICMP_ERROR_V4_TUNNEL_TYPE) + pString = "FWPM_CONDITION_TUNNEL_TYPE"; + +#if(NTDDI_VERSION >= NTDDI_VISTASP1) + + else if(fieldID == FWPS_FIELD_INBOUND_ICMP_ERROR_V4_IP_ARRIVAL_INTERFACE) + pString = "FWPM_CONDITION_IP_ARRIVAL_INTERFACE"; + else if(fieldID == FWPS_FIELD_INBOUND_ICMP_ERROR_V4_ARRIVAL_INTERFACE_INDEX) + pString = "FWPM_CONDITION_ARRIVAL_INTERFACE_INDEX"; + else if(fieldID == FWPS_FIELD_INBOUND_ICMP_ERROR_V4_ARRIVAL_INTERFACE_TYPE) + pString = "FWPM_CONDITION_ARRIVAL_INTERFACE_TYPE"; + else if(fieldID == FWPS_FIELD_INBOUND_ICMP_ERROR_V4_ARRIVAL_TUNNEL_TYPE) + pString = "FWPM_CONDITION_ARRIVAL_TUNNEL_TYPE"; + else if(fieldID == FWPS_FIELD_INBOUND_ICMP_ERROR_V4_FLAGS) + { + pString = "FWPM_CONDITION_FLAGS"; + + if(pFormat) + *pFormat = FLAGS_VALUE; + } + +#if(NTDDI_VERSION >= NTDDI_WIN7) + + else if(fieldID == FWPS_FIELD_INBOUND_ICMP_ERROR_V4_ARRIVAL_INTERFACE_PROFILE_ID) + pString = "FWPM_CONDITION_ARRIVAL_INTERFACE_PROFILE_ID"; + else if(fieldID == FWPS_FIELD_INBOUND_ICMP_ERROR_V4_INTERFACE_QUARANTINE_EPOCH) + pString = "FWPM_CONDITION_INTERFACE_QUARANTINE_EPOCH"; + +#endif /// (NTDDI_VERSION >= NTDDI_WIN7) +#endif /// (NTDDI_VERSION >= NTDDI_VISTASP1) + + break; + } + case FWPS_LAYER_OUTBOUND_ICMP_ERROR_V4: + case FWPS_LAYER_OUTBOUND_ICMP_ERROR_V4_DISCARD: + case FWPS_LAYER_OUTBOUND_ICMP_ERROR_V6: + case FWPS_LAYER_OUTBOUND_ICMP_ERROR_V6_DISCARD: + { + if(fieldID == FWPS_FIELD_OUTBOUND_ICMP_ERROR_V4_IP_LOCAL_ADDRESS) + { + pString = "FWPM_CONDITION_IP_LOCAL_ADDRESS"; + + if(pFormat) + *pFormat = ADDRESS_VALUE; + } + else if(fieldID == FWPS_FIELD_OUTBOUND_ICMP_ERROR_V4_IP_REMOTE_ADDRESS) + { + pString = "FWPM_CONDITION_IP_REMOTE_ADDRESS"; + + if(pFormat) + *pFormat = ADDRESS_VALUE; + } + else if(fieldID == FWPS_FIELD_OUTBOUND_ICMP_ERROR_V4_IP_LOCAL_ADDRESS_TYPE) + pString = "FWPM_CONDITION_IP_LOCAL_ADDRESS_TYPE"; + else if(fieldID == FWPS_FIELD_OUTBOUND_ICMP_ERROR_V4_IP_LOCAL_INTERFACE) + pString = "FWPM_CONDITION_IP_LOCAL_INTERFACE"; + else if(fieldID == FWPS_FIELD_OUTBOUND_ICMP_ERROR_V4_ICMP_TYPE) + pString = "FWPM_CONDITION_ICMP_TYPE"; + else if(fieldID == FWPS_FIELD_OUTBOUND_ICMP_ERROR_V4_ICMP_CODE) + pString = "FWPM_CONDITION_ICMP_CODE"; + else if(fieldID == FWPS_FIELD_OUTBOUND_ICMP_ERROR_V4_INTERFACE_INDEX) + pString = "FWPM_CONDITION_INTERFACE_INDEX"; + else if(fieldID == FWPS_FIELD_OUTBOUND_ICMP_ERROR_V4_SUB_INTERFACE_INDEX) + pString = "FWPM_CONDITION_SUB_INTERFACE_INDEX"; + else if(fieldID == FWPS_FIELD_OUTBOUND_ICMP_ERROR_V4_INTERFACE_TYPE) + pString = "FWPM_CONDITION_INTERFACE_TYPE"; + else if(fieldID == FWPS_FIELD_OUTBOUND_ICMP_ERROR_V4_TUNNEL_TYPE) + pString = "FWPM_CONDITION_TUNNEL_TYPE"; + +#if(NTDDI_VERSION >= NTDDI_VISTASP1) + + else if(fieldID == FWPS_FIELD_OUTBOUND_ICMP_ERROR_V4_FLAGS) + { + pString = "FWPM_CONDITION_FLAGS"; + + if(pFormat) + *pFormat = FLAGS_VALUE; + } + +#if(NTDDI_VERSION >= NTDDI_WIN7) + + else if(fieldID == FWPS_FIELD_OUTBOUND_ICMP_ERROR_V4_NEXTHOP_INTERFACE_PROFILE_ID) + pString = "FWPM_CONDITION_NEXTHOP_INTERFACE_PROFILE_ID"; + else if(fieldID == FWPS_FIELD_OUTBOUND_ICMP_ERROR_V4_INTERFACE_QUARANTINE_EPOCH) + pString = "FWPM_CONDITION_INTERFACE_QUARANTINE_EPOCH"; + +#endif /// (NTDDI_VERSION >= NTDDI_WIN7) +#endif /// (NTDDI_VERSION >= NTDDI_VISTASP1) + + break; + } + case FWPS_LAYER_ALE_RESOURCE_ASSIGNMENT_V4: + case FWPS_LAYER_ALE_RESOURCE_ASSIGNMENT_V4_DISCARD: + case FWPS_LAYER_ALE_RESOURCE_ASSIGNMENT_V6: + case FWPS_LAYER_ALE_RESOURCE_ASSIGNMENT_V6_DISCARD: + { + if(fieldID == FWPS_FIELD_ALE_RESOURCE_ASSIGNMENT_V4_ALE_APP_ID) + { + pString = "FWPM_CONDITION_ALE_APP_ID"; + + if(pFormat) + *pFormat = UNICODE_STRING_VALUE; + } + else if(fieldID == FWPS_FIELD_ALE_RESOURCE_ASSIGNMENT_V4_ALE_USER_ID) + pString = "FWPM_CONDITION_ALE_USER_ID"; + else if(fieldID == FWPS_FIELD_ALE_RESOURCE_ASSIGNMENT_V4_IP_LOCAL_ADDRESS) + { + pString = "FWPM_CONDITION_IP_LOCAL_ADDRESS"; + + if(pFormat) + *pFormat = ADDRESS_VALUE; + } + else if(fieldID == FWPS_FIELD_ALE_RESOURCE_ASSIGNMENT_V4_IP_LOCAL_ADDRESS_TYPE) + pString = "FWPM_CONDITION_IP_LOCAL_ADDRESS_TYPE"; + else if(fieldID == FWPS_FIELD_ALE_RESOURCE_ASSIGNMENT_V4_IP_LOCAL_PORT) + pString = "FWPM_CONDITION_IP_LOCAL_PORT"; + else if(fieldID == FWPS_FIELD_ALE_RESOURCE_ASSIGNMENT_V4_IP_PROTOCOL) + pString = "FWPM_CONDITION_IP_PROTOCOL"; + else if(fieldID == FWPS_FIELD_ALE_RESOURCE_ASSIGNMENT_V4_ALE_PROMISCUOUS_MODE) + pString = "FWPM_CONDITION_ALE_PROMISCUOUS_MODE"; + else if(fieldID == FWPS_FIELD_ALE_RESOURCE_ASSIGNMENT_V4_IP_LOCAL_INTERFACE) + pString = "FWPM_CONDITION_IP_LOCAL_INTERFACE"; + else if(fieldID == FWPS_FIELD_ALE_RESOURCE_ASSIGNMENT_V4_FLAGS) + { + pString = "FWPM_CONDITION_FLAGS"; + + if(pFormat) + *pFormat = FLAGS_VALUE; + } + else if(fieldID == FWPS_FIELD_ALE_RESOURCE_ASSIGNMENT_V4_INTERFACE_TYPE) + pString = "FWPM_CONDITION_INTERFACE_TYPE"; + else if(fieldID == FWPS_FIELD_ALE_RESOURCE_ASSIGNMENT_V4_TUNNEL_TYPE) + pString = "FWPM_CONDITION_TUNNEL_TYPE"; + +#if(NTDDI_VERSION >= NTDDI_WIN7) + + else if(fieldID == FWPS_FIELD_ALE_RESOURCE_ASSIGNMENT_V4_LOCAL_INTERFACE_PROFILE_ID) + pString = "FWPM_CONDITION_LOCAL_INTERFACE_PROFILE_ID"; + else if(fieldID == FWPS_FIELD_ALE_RESOURCE_ASSIGNMENT_V4_SIO_FIREWALL_SOCKET_PROPERTY) + pString = "FWPM_CONDITION_SIO_FIREWALL_SOCKET_PROPERTY"; + +#if(NTDDI_VERSION >= NTDDI_WIN8) + + else if(fieldID == FWPS_FIELD_ALE_RESOURCE_ASSIGNMENT_V4_ALE_PACKAGE_ID) + pString = "FWPM_CONDITION_ALE_PACKAGE_ID"; + +#if(NTDDI_VERSION >= NTDDI_WINTHRESHOLD) + + else if(fieldID == FWPS_FIELD_ALE_RESOURCE_ASSIGNMENT_V4_ALE_SECURITY_ATTRIBUTE_FQBN_VALUE) + pString = "FWPM_CONDITION_ALE_SECURITY_ATTRIBUTE_FQBN_VALUE"; + +#endif /// (NTDDI_VERSION >= NTDDI_WINTHRESHOLD) +#endif /// (NTDDI_VERSION >= NTDDI_WIN8) +#endif /// (NTDDI_VERSION >= NTDDI_WIN7) + + break; + } + case FWPS_LAYER_ALE_AUTH_LISTEN_V4: + case FWPS_LAYER_ALE_AUTH_LISTEN_V4_DISCARD: + case FWPS_LAYER_ALE_AUTH_LISTEN_V6: + case FWPS_LAYER_ALE_AUTH_LISTEN_V6_DISCARD: + { + if(fieldID == FWPS_FIELD_ALE_AUTH_LISTEN_V4_ALE_APP_ID) + { + pString = "FWPM_CONDITION_ALE_APP_ID"; + + if(pFormat) + *pFormat = UNICODE_STRING_VALUE; + } + else if(fieldID == FWPS_FIELD_ALE_AUTH_LISTEN_V4_ALE_USER_ID) + pString = "FWPM_CONDITION_ALE_USER_ID"; + else if(fieldID == FWPS_FIELD_ALE_AUTH_LISTEN_V4_IP_LOCAL_ADDRESS) + { + pString = "FWPM_CONDITION_IP_LOCAL_ADDRESS"; + + if(pFormat) + *pFormat = ADDRESS_VALUE; + } + else if(fieldID == FWPS_FIELD_ALE_AUTH_LISTEN_V4_IP_LOCAL_ADDRESS_TYPE) + pString = "FWPM_CONDITION_IP_LOCAL_ADDRESS_TYPE"; + else if(fieldID == FWPS_FIELD_ALE_AUTH_LISTEN_V4_IP_LOCAL_PORT) + pString = "FWPM_CONDITION_IP_LOCAL_PORT"; + else if(fieldID == FWPS_FIELD_ALE_AUTH_LISTEN_V4_IP_LOCAL_INTERFACE) + pString = "FWPM_CONDITION_IP_LOCAL_INTERFACE"; + else if(fieldID == FWPS_FIELD_ALE_AUTH_LISTEN_V4_FLAGS) + { + pString = "FWPM_CONDITION_FLAGS"; + + if(pFormat) + *pFormat = FLAGS_VALUE; + } + else if(fieldID == FWPS_FIELD_ALE_AUTH_LISTEN_V4_INTERFACE_TYPE) + pString = "FWPM_CONDITION_INTERFACE_TYPE"; + else if(fieldID == FWPS_FIELD_ALE_AUTH_LISTEN_V4_TUNNEL_TYPE) + pString = "FWPM_CONDITION_TUNNEL_TYPE"; + +#if(NTDDI_VERSION >= NTDDI_WIN7) + + else if(fieldID == FWPS_FIELD_ALE_AUTH_LISTEN_V4_LOCAL_INTERFACE_PROFILE_ID) + pString = "FWPM_CONDITION_LOCAL_INTERFACE_PROFILE_ID"; + else if(fieldID == FWPS_FIELD_ALE_AUTH_LISTEN_V4_SIO_FIREWALL_SOCKET_PROPERTY) + pString = "FWPM_CONDITION_SIO_FIREWALL_SOCKET_PROPERTY"; + +#if(NTDDI_VERSION >= NTDDI_WIN8) + + else if(fieldID == FWPS_FIELD_ALE_AUTH_LISTEN_V4_ALE_PACKAGE_ID) + pString = "FWPM_CONDITION_ALE_PACKAGE_ID"; + +#if(NTDDI_VERSION >= NTDDI_WINTHRESHOLD) + + else if(fieldID == FWPS_FIELD_ALE_AUTH_LISTEN_V4_ALE_SECURITY_ATTRIBUTE_FQBN_VALUE) + pString = "FWPM_CONDITION_ALE_SECURITY_ATTRIBUTE_FQBN_VALUE"; + +#endif /// (NTDDI_VERSION >= NTDDI_WINTHRESHOLD) +#endif /// (NTDDI_VERSION >= NTDDI_WIN8) +#endif /// (NTDDI_VERSION >= NTDDI_WIN7) + + break; + } + case FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4: + case FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4_DISCARD: + case FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6: + case FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6_DISCARD: + { + if(fieldID == FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_ALE_APP_ID) + { + pString = "FWPM_CONDITION_ALE_APP_ID"; + + if(pFormat) + *pFormat = UNICODE_STRING_VALUE; + } + else if(fieldID == FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_ALE_USER_ID) + pString = "FWPM_CONDITION_ALE_USER_ID"; + else if(fieldID == FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_IP_LOCAL_ADDRESS) + { + pString = "FWPM_CONDITION_IP_LOCAL_ADDRESS"; + + if(pFormat) + *pFormat = ADDRESS_VALUE; + } + else if(fieldID == FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_IP_LOCAL_ADDRESS_TYPE) + pString = "FWPM_CONDITION_IP_LOCAL_ADDRESS_TYPE"; + else if(fieldID == FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_IP_LOCAL_PORT) + pString = "FWPM_CONDITION_IP_LOCAL_PORT"; + else if(fieldID == FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_IP_PROTOCOL) + pString = "FWPM_CONDITION_IP_PROTOCOL"; + else if(fieldID == FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_IP_REMOTE_ADDRESS) + { + pString = "FWPM_CONDITION_IP_REMOTE_ADDRESS"; + + if(pFormat) + *pFormat = ADDRESS_VALUE; + } + else if(fieldID == FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_IP_REMOTE_PORT) + pString = "FWPM_CONDITION_IP_REMOTE_PORT"; + else if(fieldID == FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_ALE_REMOTE_USER_ID) + pString = "FWPM_CONDITION_ALE_REMOTE_USER_ID"; + else if(fieldID == FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_ALE_REMOTE_MACHINE_ID) + pString = "FWPM_CONDITION_ALE_REMOTE_MACHINE_ID"; + else if(fieldID == FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_IP_LOCAL_INTERFACE) + pString = "FWPM_CONDITION_IP_LOCAL_INTERFACE"; + else if(fieldID == FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_FLAGS) + { + pString = "FWPM_CONDITION_FLAGS"; + + if(pFormat) + *pFormat = FLAGS_VALUE; + } + else if(fieldID == FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_SIO_FIREWALL_SYSTEM_PORT) + pString = "FWPM_CONDITION_SIO_FIREWALL_SYSTEM_PORT"; + else if(fieldID == FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_NAP_CONTEXT) + pString = "FWPM_CONDITION_NAP_CONTEXT"; + else if(fieldID == FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_INTERFACE_TYPE) + pString = "FWPM_CONDITION_INTERFACE_TYPE"; + else if(fieldID == FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_TUNNEL_TYPE) + pString = "FWPM_CONDITION_TUNNEL_TYPE"; + else if(fieldID == FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_INTERFACE_INDEX) + pString = "FWPM_CONDITION_INTERFACE_INDEX"; + else if(fieldID == FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_SUB_INTERFACE_INDEX) + pString = "FWPM_CONDITION_SUB_INTERFACE_INDEX"; + +#if(NTDDI_VERSION >= NTDDI_VISTASP1) + + else if(fieldID == FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_IP_ARRIVAL_INTERFACE) + pString = "FWPM_CONDITION_IP_ARRIVAL_INTERFACE"; + else if(fieldID == FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_ARRIVAL_INTERFACE_TYPE) + pString = "FWPM_CONDITION_ARRIVAL_INTERFACE_TYPE"; + else if(fieldID == FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_ARRIVAL_TUNNEL_TYPE) + pString = "FWPM_CONDITION_ARRIVAL_TUNNEL_TYPE"; + else if(fieldID == FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_ARRIVAL_INTERFACE_INDEX) + pString = "FWPM_CONDITION_ARRIVAL_INTERFACE_INDEX"; + +#if(NTDDI_VERSION >= NTDDI_WIN7) + + else if(fieldID == FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_NEXTHOP_SUB_INTERFACE_INDEX) + pString = "FWPM_CONDITION_NEXTHOP_SUB_INTERFACE_INDEX"; + else if(fieldID == FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_IP_NEXTHOP_INTERFACE) + pString = "FWPM_CONDITION_IP_NEXTHOP_INTERFACE"; + else if(fieldID == FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_NEXTHOP_INTERFACE_TYPE) + pString = "FWPM_CONDITION_NEXTHOP_INTERFACE_TYPE"; + else if(fieldID == FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_NEXTHOP_TUNNEL_TYPE) + pString = "FWPM_CONDITION_NEXTHOP_TUNNEL_TYPE"; + else if(fieldID == FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_NEXTHOP_INTERFACE_INDEX) + pString = "FWPM_CONDITION_NEXTHOP_INTERFACE_INDEX"; + else if(fieldID == FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_ORIGINAL_PROFILE_ID) + pString = "FWPM_CONDITION_ORIGINAL_PROFILE_ID"; + else if(fieldID == FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_CURRENT_PROFILE_ID) + pString = "FWPM_CONDITION_CURRENT_PROFILE_ID"; + else if(fieldID == FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_REAUTHORIZE_REASON) + pString = "FWPM_CONDITION_REAUTHORIZE_REASON"; + else if(fieldID == FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_ORIGINAL_ICMP_TYPE) + pString = "FWPM_CONDITION_ORIGINAL_ICMP_TYPE"; + else if(fieldID == FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_INTERFACE_QUARANTINE_EPOCH) + pString = "FWPM_CONDITION_INTERFACE_QUARANTINE_EPOCH"; + +#if(NTDDI_VERSION >= NTDDI_WIN8) + + else if(fieldID == FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_ALE_PACKAGE_ID) + pString = "FWPM_CONDITION_ALE_PACKAGE_ID"; + +#if(NTDDI_VERSION >= NTDDI_WINTHRESHOLD) + + else if(fieldID == FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_ALE_SECURITY_ATTRIBUTE_FQBN_VALUE) + pString = "FWPM_CONDITION_ALE_SECURITY_ATTRIBUTE_FQBN_VALUE"; + +#endif /// (NTDDI_VERSION >= NTDDI_WINTHRESHOLD) +#endif /// (NTDDI_VERSION >= NTDDI_WIN8) +#endif /// (NTDDI_VERSION >= NTDDI_WIN7) +#endif /// (NTDDI_VERSION >= NTDDI_VISTASP1) + + break; + } + case FWPS_LAYER_ALE_AUTH_CONNECT_V4: + case FWPS_LAYER_ALE_AUTH_CONNECT_V4_DISCARD: + case FWPS_LAYER_ALE_AUTH_CONNECT_V6: + case FWPS_LAYER_ALE_AUTH_CONNECT_V6_DISCARD: + { + if(fieldID == FWPS_FIELD_ALE_AUTH_CONNECT_V4_ALE_APP_ID) + { + pString = "FWPM_CONDITION_ALE_APP_ID"; + + if(pFormat) + *pFormat = UNICODE_STRING_VALUE; + } + else if(fieldID == FWPS_FIELD_ALE_AUTH_CONNECT_V4_ALE_USER_ID) + pString = "FWPM_CONDITION_ALE_USER_ID"; + else if(fieldID == FWPS_FIELD_ALE_AUTH_CONNECT_V4_IP_LOCAL_ADDRESS) + { + pString = "FWPM_CONDITION_IP_LOCAL_ADDRESS"; + + if(pFormat) + *pFormat = ADDRESS_VALUE; + } + else if(fieldID == FWPS_FIELD_ALE_AUTH_CONNECT_V4_IP_LOCAL_ADDRESS_TYPE) + pString = "FWPM_CONDITION_IP_LOCAL_ADDRESS_TYPE"; + else if(fieldID == FWPS_FIELD_ALE_AUTH_CONNECT_V4_IP_LOCAL_PORT) + pString = "FWPM_CONDITION_IP_LOCAL_PORT"; + else if(fieldID == FWPS_FIELD_ALE_AUTH_CONNECT_V4_IP_PROTOCOL) + pString = "FWPM_CONDITION_IP_PROTOCOL"; + else if(fieldID == FWPS_FIELD_ALE_AUTH_CONNECT_V4_IP_REMOTE_ADDRESS) + { + pString = "FWPM_CONDITION_IP_REMOTE_ADDRESS"; + + if(pFormat) + *pFormat = ADDRESS_VALUE; + } + else if(fieldID == FWPS_FIELD_ALE_AUTH_CONNECT_V4_IP_REMOTE_PORT) + pString = "FWPM_CONDITION_IP_REMOTE_PORT"; + else if(fieldID == FWPS_FIELD_ALE_AUTH_CONNECT_V4_ALE_REMOTE_USER_ID) + pString = "FWPM_CONDITION_ALE_REMOTE_USER_ID"; + else if(fieldID == FWPS_FIELD_ALE_AUTH_CONNECT_V4_ALE_REMOTE_MACHINE_ID) + pString = "FWPM_CONDITION_ALE_REMOTE_MACHINE_ID"; + else if(fieldID == FWPS_FIELD_ALE_AUTH_CONNECT_V4_IP_DESTINATION_ADDRESS_TYPE) + pString = "FWPM_CONDITION_IP_DESTINATION_ADDRESS_TYPE"; + else if(fieldID == FWPS_FIELD_ALE_AUTH_CONNECT_V4_IP_LOCAL_INTERFACE) + pString = "FWPM_CONDITION_IP_LOCAL_INTERFACE"; + else if(fieldID == FWPS_FIELD_ALE_AUTH_CONNECT_V4_FLAGS) + { + pString = "FWPM_CONDITION_FLAGS"; + + if(pFormat) + *pFormat = FLAGS_VALUE; + } + else if(fieldID == FWPS_FIELD_ALE_AUTH_CONNECT_V4_INTERFACE_TYPE) + pString = "FWPM_CONDITION_INTERFACE_TYPE"; + else if(fieldID == FWPS_FIELD_ALE_AUTH_CONNECT_V4_TUNNEL_TYPE) + pString = "FWPM_CONDITION_TUNNEL_TYPE"; + +#if(NTDDI_VERSION >= NTDDI_VISTASP1) + + else if(fieldID == FWPS_FIELD_ALE_AUTH_CONNECT_V4_INTERFACE_INDEX) + pString = "FWPM_CONDITION_INTERFACE_INDEX"; + else if(fieldID == FWPS_FIELD_ALE_AUTH_CONNECT_V4_SUB_INTERFACE_INDEX) + pString = "FWPM_CONDITION_SUB_INTERFACE_INDEX"; + +#if(NTDDI_VERSION >= NTDDI_WIN7) + + else if(fieldID == FWPS_FIELD_ALE_AUTH_CONNECT_V4_IP_ARRIVAL_INTERFACE) + pString = "FWPM_CONDITION_IP_ARRIVAL_INTERFACE"; + else if(fieldID == FWPS_FIELD_ALE_AUTH_CONNECT_V4_ARRIVAL_INTERFACE_TYPE) + pString = "FWPM_CONDITION_ARRIVAL_INTERFACE_TYPE"; + else if(fieldID == FWPS_FIELD_ALE_AUTH_CONNECT_V4_ARRIVAL_TUNNEL_TYPE) + pString = "FWPM_CONDITION_ARRIVAL_TUNNEL_TYPE"; + else if(fieldID == FWPS_FIELD_ALE_AUTH_CONNECT_V4_ARRIVAL_INTERFACE_INDEX) + pString = "FWPM_CONDITION_ARRIVAL_INTERFACE_INDEX"; + else if(fieldID == FWPS_FIELD_ALE_AUTH_CONNECT_V4_NEXTHOP_SUB_INTERFACE_INDEX) + pString = "FWPM_CONDITION_NEXTHOP_SUB_INTERFACE_INDEX"; + else if(fieldID == FWPS_FIELD_ALE_AUTH_CONNECT_V4_IP_NEXTHOP_INTERFACE) + pString = "FWPM_CONDITION_IP_NEXTHOP_INTERFACE"; + else if(fieldID == FWPS_FIELD_ALE_AUTH_CONNECT_V4_NEXTHOP_INTERFACE_TYPE) + pString = "FWPM_CONDITION_NEXTHOP_INTERFACE_TYPE"; + else if(fieldID == FWPS_FIELD_ALE_AUTH_CONNECT_V4_NEXTHOP_TUNNEL_TYPE) + pString = "FWPM_CONDITION_NEXTHOP_TUNNEL_TYPE"; + else if(fieldID == FWPS_FIELD_ALE_AUTH_CONNECT_V4_NEXTHOP_INTERFACE_INDEX) + pString = "FWPM_CONDITION_NEXTHOP_INTERFACE_INDEX"; + else if(fieldID == FWPS_FIELD_ALE_AUTH_CONNECT_V4_ORIGINAL_PROFILE_ID) + pString = "FWPM_CONDITION_ORIGINAL_PROFILE_ID"; + else if(fieldID == FWPS_FIELD_ALE_AUTH_CONNECT_V4_CURRENT_PROFILE_ID) + pString = "FWPM_CONDITION_CURRENT_PROFILE_ID"; + else if(fieldID == FWPS_FIELD_ALE_AUTH_CONNECT_V4_REAUTHORIZE_REASON) + pString = "FWPM_CONDITION_REAUTHORIZE_REASON"; + else if(fieldID == FWPS_FIELD_ALE_AUTH_CONNECT_V4_PEER_NAME) + pString = "FWPM_CONDITION_PEER_NAME"; + else if(fieldID == FWPS_FIELD_ALE_AUTH_CONNECT_V4_ORIGINAL_ICMP_TYPE) + pString = "FWPM_CONDITION_ORIGINAL_ICMP_TYPE"; + else if(fieldID == FWPS_FIELD_ALE_AUTH_CONNECT_V4_INTERFACE_QUARANTINE_EPOCH) + pString = "FWPM_CONDITION_INTERFACE_QUARANTINE_EPOCH"; + +#if(NTDDI_VERSION >= NTDDI_WIN8) + + else if(fieldID == FWPS_FIELD_ALE_AUTH_CONNECT_V4_ALE_ORIGINAL_APP_ID) + { + pString = "FWPM_CONDITION_ALE_ORIGINAL_APP_ID"; + + if(pFormat) + *pFormat = UNICODE_STRING_VALUE; + } + else if(fieldID == FWPS_FIELD_ALE_AUTH_CONNECT_V4_ALE_PACKAGE_ID) + pString = "FWPM_CONDITION_ALE_PACKAGE_ID"; + +#if(NTDDI_VERSION >= NTDDI_WINTHRESHOLD) + + else if(fieldID == FWPS_FIELD_ALE_AUTH_CONNECT_V4_ALE_SECURITY_ATTRIBUTE_FQBN_VALUE) + pString = "FWPM_CONDITION_ALE_SECURITY_ATTRIBUTE_FQBN_VALUE"; + +#endif /// (NTDDI_VERSION >= NTDDI_WINTHRESHOLD) +#endif /// (NTDDI_VERSION >= NTDDI_WIN8) +#endif /// (NTDDI_VERSION >= NTDDI_WIN7) +#endif /// (NTDDI_VERSION >= NTDDI_VISTASP1) + + break; + } + case FWPS_LAYER_ALE_FLOW_ESTABLISHED_V4: + case FWPS_LAYER_ALE_FLOW_ESTABLISHED_V4_DISCARD: + case FWPS_LAYER_ALE_FLOW_ESTABLISHED_V6: + case FWPS_LAYER_ALE_FLOW_ESTABLISHED_V6_DISCARD: + { + if(fieldID == FWPS_FIELD_ALE_FLOW_ESTABLISHED_V4_ALE_APP_ID) + { + pString = "FWPM_CONDITION_ALE_APP_ID"; + + if(pFormat) + *pFormat = UNICODE_STRING_VALUE; + } + else if(fieldID == FWPS_FIELD_ALE_FLOW_ESTABLISHED_V4_ALE_USER_ID) + pString = "FWPM_CONDITION_ALE_USER_ID"; + else if(fieldID == FWPS_FIELD_ALE_FLOW_ESTABLISHED_V4_IP_LOCAL_ADDRESS) + { + pString = "FWPM_CONDITION_IP_LOCAL_ADDRESS"; + + if(pFormat) + *pFormat = ADDRESS_VALUE; + } + else if(fieldID == FWPS_FIELD_ALE_FLOW_ESTABLISHED_V4_IP_LOCAL_ADDRESS_TYPE) + pString = "FWPM_CONDITION_IP_LOCAL_ADDRESS_TYPE"; + else if(fieldID == FWPS_FIELD_ALE_FLOW_ESTABLISHED_V4_IP_LOCAL_PORT) + pString = "FWPM_CONDITION_IP_LOCAL_PORT"; + else if(fieldID == FWPS_FIELD_ALE_FLOW_ESTABLISHED_V4_IP_PROTOCOL) + pString = "FWPM_CONDITION_IP_PROTOCOL"; + else if(fieldID == FWPS_FIELD_ALE_FLOW_ESTABLISHED_V4_IP_REMOTE_ADDRESS) + { + pString = "FWPM_CONDITION_IP_REMOTE_ADDRESS"; + + if(pFormat) + *pFormat = ADDRESS_VALUE; + } + else if(fieldID == FWPS_FIELD_ALE_FLOW_ESTABLISHED_V4_IP_REMOTE_PORT) + pString = "FWPM_CONDITION_IP_REMOTE_PORT"; + else if(fieldID == FWPS_FIELD_ALE_FLOW_ESTABLISHED_V4_ALE_REMOTE_USER_ID) + pString = "FWPM_CONDITION_ALE_REMOTE_USER_ID"; + else if(fieldID == FWPS_FIELD_ALE_FLOW_ESTABLISHED_V4_ALE_REMOTE_MACHINE_ID) + pString = "FWPM_CONDITION_ALE_REMOTE_MACHINE_ID"; + else if(fieldID == FWPS_FIELD_ALE_FLOW_ESTABLISHED_V4_IP_DESTINATION_ADDRESS_TYPE) + pString = "FWPM_CONDITION_IP_DESTINATION_ADDRESS_TYPE"; + else if(fieldID == FWPS_FIELD_ALE_FLOW_ESTABLISHED_V4_IP_LOCAL_INTERFACE) + pString = "FWPM_CONDITION_IP_LOCAL_INTERFACE"; + else if(fieldID == FWPS_FIELD_ALE_FLOW_ESTABLISHED_V4_DIRECTION) + pString = "FWPM_CONDITION_DIRECTION"; + else if(fieldID == FWPS_FIELD_ALE_FLOW_ESTABLISHED_V4_INTERFACE_TYPE) + pString = "FWPM_CONDITION_INTERFACE_TYPE"; + else if(fieldID == FWPS_FIELD_ALE_FLOW_ESTABLISHED_V4_TUNNEL_TYPE) + pString = "FWPM_CONDITION_TUNNEL_TYPE"; + +#if(NTDDI_VERSION >= NTDDI_VISTASP1) + + else if(fieldID == FWPS_FIELD_ALE_FLOW_ESTABLISHED_V4_FLAGS) + { + pString = "FWPM_CONDITION_FLAGS"; + + if(pFormat) + *pFormat = FLAGS_VALUE; + } + +#if(NTDDI_VERSION >= NTDDI_WIN8) + + else if(fieldID == FWPS_FIELD_ALE_FLOW_ESTABLISHED_V4_ALE_ORIGINAL_APP_ID) + { + pString = "FWPM_CONDITION_ALE_ORIGINAL_APP_ID"; + + if(pFormat) + *pFormat = UNICODE_STRING_VALUE; + } + else if(fieldID == FWPS_FIELD_ALE_FLOW_ESTABLISHED_V4_ALE_PACKAGE_ID) + pString = "FWPM_CONDITION_ALE_PACKAGE_ID"; + +#if(NTDDI_VERSION >= NTDDI_WINTHRESHOLD) + + else if(fieldID == FWPS_FIELD_ALE_FLOW_ESTABLISHED_V4_ALE_SECURITY_ATTRIBUTE_FQBN_VALUE) + pString = "FWPM_CONDITION_ALE_SECURITY_ATTRIBUTE_FQBN_VALUE"; + +#endif /// (NTDDI_VERSION >= NTDDI_WINTHRESHOLD) +#endif /// (NTDDI_VERSION >= NTDDI_WIN8) +#endif /// (NTDDI_VERSION >= NTDDI_VISTASP1) + + break; + } + +#if(NTDDI_VERSION >= NTDDI_WIN7) + + case FWPS_LAYER_NAME_RESOLUTION_CACHE_V4: + case FWPS_LAYER_NAME_RESOLUTION_CACHE_V6: + { + if(fieldID == FWPS_FIELD_NAME_RESOLUTION_CACHE_V4_ALE_USER_ID) + pString = "FWPM_CONDITION_ALE_USER_ID"; + else if(fieldID == FWPS_FIELD_NAME_RESOLUTION_CACHE_V4_ALE_APP_ID) + { + pString = "FWPM_CONDITION_ALE_APP_ID"; + + if(pFormat) + *pFormat = UNICODE_STRING_VALUE; + } + else if(fieldID == FWPS_FIELD_NAME_RESOLUTION_CACHE_V4_IP_REMOTE_ADDRESS) + { + pString = "FWPM_CONDITION_IP_REMOTE_ADDRESS"; + + if(pFormat) + *pFormat = ADDRESS_VALUE; + } + else if(fieldID == FWPS_FIELD_NAME_RESOLUTION_CACHE_V4_PEER_NAME) + pString = "FWPM_CONDITION_PEER_NAME"; + + break; + } + case FWPS_LAYER_ALE_RESOURCE_RELEASE_V4: + case FWPS_LAYER_ALE_RESOURCE_RELEASE_V6: + { + if(fieldID == FWPS_FIELD_ALE_RESOURCE_RELEASE_V4_ALE_APP_ID) + { + pString = "FWPM_CONDITION_ALE_APP_ID"; + + if(pFormat) + *pFormat = UNICODE_STRING_VALUE; + } + else if(fieldID == FWPS_FIELD_ALE_RESOURCE_RELEASE_V4_ALE_USER_ID) + pString = "FWPM_CONDITION_ALE_USER_ID"; + else if(fieldID == FWPS_FIELD_ALE_RESOURCE_RELEASE_V4_IP_LOCAL_ADDRESS) + { + pString = "FWPM_CONDITION_IP_LOCAL_ADDRESS"; + + if(pFormat) + *pFormat = ADDRESS_VALUE; + } + else if(fieldID == FWPS_FIELD_ALE_RESOURCE_RELEASE_V4_IP_LOCAL_ADDRESS_TYPE) + pString = "FWPM_CONDITION_IP_LOCAL_ADDRESS_TYPE"; + else if(fieldID == FWPS_FIELD_ALE_RESOURCE_RELEASE_V4_IP_LOCAL_PORT) + pString = "FWPM_CONDITION_IP_LOCAL_PORT"; + else if(fieldID == FWPS_FIELD_ALE_RESOURCE_RELEASE_V4_IP_PROTOCOL) + pString = "FWPM_CONDITION_IP_PROTOCOL"; + else if(fieldID == FWPS_FIELD_ALE_RESOURCE_RELEASE_V4_IP_LOCAL_INTERFACE) + pString = "FWPM_CONDITION_IP_LOCAL_INTERFACE"; + else if(fieldID == FWPS_FIELD_ALE_RESOURCE_RELEASE_V4_FLAGS) + { + pString = "FWPM_CONDITION_FLAGS"; + + if(pFormat) + *pFormat = FLAGS_VALUE; + } + +#if(NTDDI_VERSION >= NTDDI_WIN8) + + else if(fieldID == FWPS_FIELD_ALE_RESOURCE_RELEASE_V4_ALE_PACKAGE_ID) + pString = "FWPM_CONDITION_ALE_PACKAGE_ID"; + +#endif /// (NTDDI_VERSION >= NTDDI_WIN8) + + break; + } + case FWPS_LAYER_ALE_ENDPOINT_CLOSURE_V4: + case FWPS_LAYER_ALE_ENDPOINT_CLOSURE_V6: + { + if(fieldID == FWPS_FIELD_ALE_ENDPOINT_CLOSURE_V4_ALE_APP_ID) + { + pString = "FWPM_CONDITION_ALE_APP_ID"; + + if(pFormat) + *pFormat = UNICODE_STRING_VALUE; + } + else if(fieldID == FWPS_FIELD_ALE_ENDPOINT_CLOSURE_V4_ALE_USER_ID) + pString = "FWPM_CONDITION_ALE_USER_ID"; + else if(fieldID == FWPS_FIELD_ALE_ENDPOINT_CLOSURE_V4_IP_LOCAL_ADDRESS) + { + pString = "FWPM_CONDITION_IP_LOCAL_ADDRESS"; + + if(pFormat) + *pFormat = ADDRESS_VALUE; + } + else if(fieldID == FWPS_FIELD_ALE_ENDPOINT_CLOSURE_V4_IP_LOCAL_ADDRESS_TYPE) + pString = "FWPM_CONDITION_IP_LOCAL_ADDRESS_TYPE"; + else if(fieldID == FWPS_FIELD_ALE_ENDPOINT_CLOSURE_V4_IP_LOCAL_PORT) + pString = "FWPM_CONDITION_IP_LOCAL_PORT"; + else if(fieldID == FWPS_FIELD_ALE_ENDPOINT_CLOSURE_V4_IP_PROTOCOL) + pString = "FWPM_CONDITION_IP_PROTOCOL"; + else if(fieldID == FWPS_FIELD_ALE_ENDPOINT_CLOSURE_V4_IP_REMOTE_ADDRESS) + { + pString = "FWPM_CONDITION_IP_REMOTE_ADDRESS"; + + if(pFormat) + *pFormat = ADDRESS_VALUE; + } + else if(fieldID == FWPS_FIELD_ALE_ENDPOINT_CLOSURE_V4_IP_REMOTE_PORT) + pString = "FWPM_CONDITION_IP_REMOTE_PORT"; + else if(fieldID == FWPS_FIELD_ALE_ENDPOINT_CLOSURE_V4_IP_LOCAL_INTERFACE) + pString = "FWPM_CONDITION_IP_LOCAL_INTERFACE"; + else if(fieldID == FWPS_FIELD_ALE_ENDPOINT_CLOSURE_V4_FLAGS) + { + pString = "FWPM_CONDITION_FLAGS"; + + if(pFormat) + *pFormat = FLAGS_VALUE; + } + +#if(NTDDI_VERSION >= NTDDI_WIN8) + + else if(fieldID == FWPS_FIELD_ALE_ENDPOINT_CLOSURE_V4_ALE_PACKAGE_ID) + pString = "FWPM_CONDITION_ALE_PACKAGE_ID"; + +#if(NTDDI_VERSION >= NTDDI_WINTHRESHOLD) + + else if(fieldID == FWPS_FIELD_ALE_ENDPOINT_CLOSURE_V4_ALE_SECURITY_ATTRIBUTE_FQBN_VALUE) + pString = "FWPM_CONDITION_ALE_SECURITY_ATTRIBUTE_FQBN_VALUE"; + +#endif /// (NTDDI_VERSION >= NTDDI_WINTHRESHOLD) +#endif /// (NTDDI_VERSION >= NTDDI_WIN8) + + break; + } + case FWPS_LAYER_ALE_CONNECT_REDIRECT_V4: + case FWPS_LAYER_ALE_CONNECT_REDIRECT_V6: + { + if(fieldID == FWPS_FIELD_ALE_CONNECT_REDIRECT_V4_ALE_APP_ID) + { + pString = "FWPM_CONDITION_ALE_APP_ID"; + + if(pFormat) + *pFormat = UNICODE_STRING_VALUE; + } + else if(fieldID == FWPS_FIELD_ALE_CONNECT_REDIRECT_V4_ALE_USER_ID) + pString = "FWPM_CONDITION_ALE_USER_ID"; + else if(fieldID == FWPS_FIELD_ALE_CONNECT_REDIRECT_V4_IP_LOCAL_ADDRESS) + { + pString = "FWPM_CONDITION_IP_LOCAL_ADDRESS"; + + if(pFormat) + *pFormat = ADDRESS_VALUE; + } + else if(fieldID == FWPS_FIELD_ALE_CONNECT_REDIRECT_V4_IP_LOCAL_ADDRESS_TYPE) + pString = "FWPM_CONDITION_IP_LOCAL_ADDRESS_TYPE"; + else if(fieldID == FWPS_FIELD_ALE_CONNECT_REDIRECT_V4_IP_LOCAL_PORT) + pString = "FWPM_CONDITION_IP_LOCAL_PORT"; + else if(fieldID == FWPS_FIELD_ALE_CONNECT_REDIRECT_V4_IP_PROTOCOL) + pString = "FWPM_CONDITION_IP_PROTOCOL"; + else if(fieldID == FWPS_FIELD_ALE_CONNECT_REDIRECT_V4_IP_REMOTE_ADDRESS) + { + pString = "FWPM_CONDITION_IP_REMOTE_ADDRESS"; + + if(pFormat) + *pFormat = ADDRESS_VALUE; + } + else if(fieldID == FWPS_FIELD_ALE_CONNECT_REDIRECT_V4_IP_DESTINATION_ADDRESS_TYPE) + pString = "FWPM_CONDITION_IP_DESTINATION_ADDRESS_TYPE"; + else if(fieldID == FWPS_FIELD_ALE_CONNECT_REDIRECT_V4_IP_REMOTE_PORT) + pString = "FWPM_CONDITION_IP_REMOTE_PORT"; + else if(fieldID == FWPS_FIELD_ALE_CONNECT_REDIRECT_V4_FLAGS) + { + pString = "FWPM_CONDITION_FLAGS"; + + if(pFormat) + *pFormat = FLAGS_VALUE; + } + +#if(NTDDI_VERSION >= NTDDI_WIN8) + + else if(fieldID == FWPS_FIELD_ALE_CONNECT_REDIRECT_V4_ALE_ORIGINAL_APP_ID) + { + pString = "FWPM_CONDITION_ALE_ORIGINAL_APP_ID"; + + if(pFormat) + *pFormat = UNICODE_STRING_VALUE; + } + else if(fieldID == FWPS_FIELD_ALE_CONNECT_REDIRECT_V4_ALE_PACKAGE_ID) + pString = "FWPM_CONDITION_ALE_PACKAGE_ID"; + +#if(NTDDI_VERSION >= NTDDI_WINTHRESHOLD) + + else if(fieldID == FWPS_FIELD_ALE_CONNECT_REDIRECT_V4_ALE_SECURITY_ATTRIBUTE_FQBN_VALUE) + pString = "FWPM_CONDITION_ALE_SECURITY_ATTRIBUTE_FQBN_VALUE"; + +#endif /// (NTDDI_VERSION >= NTDDI_WINTHRESHOLD) +#endif /// (NTDDI_VERSION >= NTDDI_WIN8) + + break; + } + case FWPS_LAYER_ALE_BIND_REDIRECT_V4: + case FWPS_LAYER_ALE_BIND_REDIRECT_V6: + { + if(fieldID == FWPS_FIELD_ALE_BIND_REDIRECT_V4_ALE_APP_ID) + { + pString = "FWPM_CONDITION_ALE_APP_ID"; + + if(pFormat) + *pFormat = UNICODE_STRING_VALUE; + } + else if(fieldID == FWPS_FIELD_ALE_BIND_REDIRECT_V4_ALE_USER_ID) + pString = "FWPM_CONDITION_ALE_USER_ID"; + else if(fieldID == FWPS_FIELD_ALE_BIND_REDIRECT_V4_IP_LOCAL_ADDRESS) + { + pString = "FWPM_CONDITION_IP_LOCAL_ADDRESS"; + + if(pFormat) + *pFormat = ADDRESS_VALUE; + } + else if(fieldID == FWPS_FIELD_ALE_BIND_REDIRECT_V4_IP_LOCAL_ADDRESS_TYPE) + pString = "FWPM_CONDITION_IP_LOCAL_ADDRESS_TYPE"; + else if(fieldID == FWPS_FIELD_ALE_BIND_REDIRECT_V4_IP_LOCAL_PORT) + pString = "FWPM_CONDITION_IP_LOCAL_PORT"; + else if(fieldID == FWPS_FIELD_ALE_BIND_REDIRECT_V4_IP_PROTOCOL) + pString = "FWPM_CONDITION_IP_PROTOCOL"; + else if(fieldID == FWPS_FIELD_ALE_BIND_REDIRECT_V4_FLAGS) + { + pString = "FWPM_CONDITION_FLAGS"; + + if(pFormat) + *pFormat = FLAGS_VALUE; + } + +#if(NTDDI_VERSION >= NTDDI_WIN8) + + else if(fieldID == FWPS_FIELD_ALE_BIND_REDIRECT_V4_ALE_PACKAGE_ID) + pString = "FWPM_CONDITION_ALE_PACKAGE_ID"; + +#if(NTDDI_VERSION >= NTDDI_WINTHRESHOLD) + + else if(fieldID == FWPS_FIELD_ALE_BIND_REDIRECT_V4_ALE_SECURITY_ATTRIBUTE_FQBN_VALUE) + pString = "FWPM_CONDITION_ALE_SECURITY_ATTRIBUTE_FQBN_VALUE"; + +#endif /// (NTDDI_VERSION >= NTDDI_WINTHRESHOLD) +#endif /// (NTDDI_VERSION >= NTDDI_WIN8) + + break; + } + case FWPS_LAYER_STREAM_PACKET_V4: + case FWPS_LAYER_STREAM_PACKET_V6: + { + if(fieldID == FWPS_FIELD_STREAM_PACKET_V4_IP_LOCAL_ADDRESS) + { + pString = "FWPM_CONDITION_IP_LOCAL_ADDRESS"; + + if(pFormat) + *pFormat = ADDRESS_VALUE; + } + else if(fieldID == FWPS_FIELD_STREAM_PACKET_V4_IP_REMOTE_ADDRESS) + { + pString = "FWPM_CONDITION_IP_REMOTE_ADDRESS"; + + if(pFormat) + *pFormat = ADDRESS_VALUE; + } + else if(fieldID == FWPS_FIELD_STREAM_PACKET_V4_IP_LOCAL_PORT) + pString = "FWPM_CONDITION_IP_LOCAL_PORT"; + else if(fieldID == FWPS_FIELD_STREAM_PACKET_V4_IP_REMOTE_PORT) + pString = "FWPM_CONDITION_IP_REMOTE_PORT"; + else if(fieldID == FWPS_FIELD_STREAM_PACKET_V4_IP_LOCAL_INTERFACE) + pString = "FWPM_CONDITION_IP_LOCAL_INTERFACE"; + else if(fieldID == FWPS_FIELD_STREAM_PACKET_V4_INTERFACE_INDEX) + pString = "FWPM_CONDITION_INTERFACE_INDEX"; + else if(fieldID == FWPS_FIELD_STREAM_PACKET_V4_SUB_INTERFACE_INDEX) + pString = "FWPM_CONDITION_SUB_INTERFACE_INDEX"; + else if(fieldID == FWPS_FIELD_STREAM_PACKET_V4_DIRECTION) + pString = "FWPM_CONDITION_DIRECTION"; + else if(fieldID == FWPS_FIELD_STREAM_PACKET_V4_FLAGS) + { + pString = "FWPM_CONDITION_FLAGS"; + + if(pFormat) + *pFormat = FLAGS_VALUE; + } + else if(fieldID == FWPS_FIELD_STREAM_PACKET_V4_INTERFACE_TYPE) + pString = "FWPM_CONDITION_INTERFACE_TYPE"; + else if(fieldID == FWPS_FIELD_STREAM_PACKET_V4_TUNNEL_TYPE) + pString = "FWPM_CONDITION_TUNNEL_TYPE"; + + break; + } + +#if(NTDDI_VERSION >= NTDDI_WIN8) + + case FWPS_LAYER_INBOUND_MAC_FRAME_ETHERNET: + { + if(fieldID == FWPS_FIELD_INBOUND_MAC_FRAME_ETHERNET_INTERFACE_MAC_ADDRESS) + pString = "FWPM_CONDITION_INTERFACE_MAC_ADDRESS"; + else if(fieldID == FWPS_FIELD_INBOUND_MAC_FRAME_ETHERNET_MAC_LOCAL_ADDRESS) + pString = "FWPM_CONDITION_MAC_LOCAL_ADDRESS"; + else if(fieldID == FWPS_FIELD_INBOUND_MAC_FRAME_ETHERNET_MAC_REMOTE_ADDRESS) + pString = "FWPM_CONDITION_MAC_REMOTE_ADDRESS"; + else if(fieldID == FWPS_FIELD_INBOUND_MAC_FRAME_ETHERNET_MAC_LOCAL_ADDRESS_TYPE) + pString = "FWPM_CONDITION_MAC_LOCAL_ADDRESS_TYPE"; + else if(fieldID == FWPS_FIELD_INBOUND_MAC_FRAME_ETHERNET_MAC_REMOTE_ADDRESS_TYPE) + pString = "FWPM_CONDITION_MAC_REMOTE_ADDRESS_TYPE"; + else if(fieldID == FWPS_FIELD_INBOUND_MAC_FRAME_ETHERNET_ETHER_TYPE) + pString = "FWPM_CONDITION_ETHER_TYPE"; + else if(fieldID == FWPS_FIELD_INBOUND_MAC_FRAME_ETHERNET_VLAN_ID) + pString = "FWPM_CONDITION_VLAN_ID"; + else if(fieldID == FWPS_FIELD_INBOUND_MAC_FRAME_ETHERNET_INTERFACE) + pString = "FWPM_CONDITION_INTERFACE"; + else if(fieldID == FWPS_FIELD_INBOUND_MAC_FRAME_ETHERNET_INTERFACE_INDEX) + pString = "FWPM_CONDITION_INTERFACE_INDEX"; + else if(fieldID == FWPS_FIELD_INBOUND_MAC_FRAME_ETHERNET_NDIS_PORT) + pString = "FWPM_CONDITION_NDIS_PORT"; + else if(fieldID == FWPS_FIELD_INBOUND_MAC_FRAME_ETHERNET_L2_FLAGS) + { + pString = "FWPM_CONDITION_L2_FLAGS"; + + if(pFormat) + *pFormat = L2_FLAGS_VALUE; + } + + break; + } + case FWPS_LAYER_OUTBOUND_MAC_FRAME_ETHERNET: + { + if(fieldID == FWPS_FIELD_OUTBOUND_MAC_FRAME_ETHERNET_INTERFACE_MAC_ADDRESS) + pString = "FWPM_CONDITION_INTERFACE_MAC_ADDRESS"; + else if(fieldID == FWPS_FIELD_OUTBOUND_MAC_FRAME_ETHERNET_MAC_LOCAL_ADDRESS) + pString = "FWPM_CONDITION_MAC_LOCAL_ADDRESS"; + else if(fieldID == FWPS_FIELD_OUTBOUND_MAC_FRAME_ETHERNET_MAC_REMOTE_ADDRESS) + pString = "FWPM_CONDITION_MAC_REMOTE_ADDRESS"; + else if(fieldID == FWPS_FIELD_OUTBOUND_MAC_FRAME_ETHERNET_MAC_LOCAL_ADDRESS_TYPE) + pString = "FWPM_CONDITION_MAC_LOCAL_ADDRESS_TYPE"; + else if(fieldID == FWPS_FIELD_OUTBOUND_MAC_FRAME_ETHERNET_MAC_REMOTE_ADDRESS_TYPE) + pString = "FWPM_CONDITION_MAC_REMOTE_ADDRESS_TYPE"; + else if(fieldID == FWPS_FIELD_OUTBOUND_MAC_FRAME_ETHERNET_ETHER_TYPE) + pString = "FWPM_CONDITION_ETHER_TYPE"; + else if(fieldID == FWPS_FIELD_OUTBOUND_MAC_FRAME_ETHERNET_VLAN_ID) + pString = "FWPM_CONDITION_VLAN_ID"; + else if(fieldID == FWPS_FIELD_OUTBOUND_MAC_FRAME_ETHERNET_INTERFACE) + pString = "FWPM_CONDITION_INTERFACE"; + else if(fieldID == FWPS_FIELD_OUTBOUND_MAC_FRAME_ETHERNET_INTERFACE_INDEX) + pString = "FWPM_CONDITION_INTERFACE_INDEX"; + else if(fieldID == FWPS_FIELD_OUTBOUND_MAC_FRAME_ETHERNET_NDIS_PORT) + pString = "FWPM_CONDITION_NDIS_PORT"; + else if(fieldID == FWPS_FIELD_OUTBOUND_MAC_FRAME_ETHERNET_L2_FLAGS) + { + pString = "FWPM_CONDITION_L2_FLAGS"; + + if(pFormat) + *pFormat = L2_FLAGS_VALUE; + } + + break; + } + case FWPS_LAYER_INBOUND_MAC_FRAME_NATIVE: + { + if(fieldID == FWPS_FIELD_INBOUND_MAC_FRAME_NATIVE_NDIS_MEDIA_TYPE) + pString = "FWPM_CONDITION_NDIS_MEDIA_TYPE"; + else if(fieldID == FWPS_FIELD_INBOUND_MAC_FRAME_NATIVE_NDIS_PHYSICAL_MEDIA_TYPE) + pString = "FWPM_CONDITION_NDIS_PHYSICAL_MEDIA_TYPE"; + else if(fieldID == FWPS_FIELD_INBOUND_MAC_FRAME_NATIVE_INTERFACE) + pString = "FWPM_CONDITION_INTERFACE"; + else if(fieldID == FWPS_FIELD_INBOUND_MAC_FRAME_NATIVE_INTERFACE_TYPE) + pString = "FWPM_CONDITION_INTERFACE_TYPE"; + else if(fieldID == FWPS_FIELD_INBOUND_MAC_FRAME_NATIVE_INTERFACE_INDEX) + pString = "FWPM_CONDITION_INTERFACE_INDEX"; + else if(fieldID == FWPS_FIELD_INBOUND_MAC_FRAME_NATIVE_NDIS_PORT) + pString = "FWPM_CONDITION_NDIS_PORT"; + else if(fieldID == FWPS_FIELD_INBOUND_MAC_FRAME_NATIVE_L2_FLAGS) + { + pString = "FWPM_CONDITION_L2_FLAGS"; + + if(pFormat) + *pFormat = L2_FLAGS_VALUE; + } + + break; + } + case FWPS_LAYER_OUTBOUND_MAC_FRAME_NATIVE: + { + if(fieldID == FWPS_FIELD_OUTBOUND_MAC_FRAME_NATIVE_NDIS_MEDIA_TYPE) + pString = "FWPM_CONDITION_NDIS_MEDIA_TYPE"; + else if(fieldID == FWPS_FIELD_OUTBOUND_MAC_FRAME_NATIVE_NDIS_PHYSICAL_MEDIA_TYPE) + pString = "FWPM_CONDITION_NDIS_PHYSICAL_MEDIA_TYPE"; + else if(fieldID == FWPS_FIELD_OUTBOUND_MAC_FRAME_NATIVE_INTERFACE) + pString = "FWPM_CONDITION_INTERFACE"; + else if(fieldID == FWPS_FIELD_OUTBOUND_MAC_FRAME_NATIVE_INTERFACE_TYPE) + pString = "FWPM_CONDITION_INTERFACE_TYPE"; + else if(fieldID == FWPS_FIELD_OUTBOUND_MAC_FRAME_NATIVE_INTERFACE_INDEX) + pString = "FWPM_CONDITION_INTERFACE_INDEX"; + else if(fieldID == FWPS_FIELD_OUTBOUND_MAC_FRAME_NATIVE_NDIS_PORT) + pString = "FWPM_CONDITION_NDIS_PORT"; + else if(fieldID == FWPS_FIELD_OUTBOUND_MAC_FRAME_NATIVE_L2_FLAGS) + { + pString = "FWPM_CONDITION_L2_FLAGS"; + + if(pFormat) + *pFormat = L2_FLAGS_VALUE; + } + + break; + } + case FWPS_LAYER_INGRESS_VSWITCH_ETHERNET: + { + if(fieldID == FWPS_FIELD_INGRESS_VSWITCH_ETHERNET_MAC_SOURCE_ADDRESS) + pString = "FWPS_FIELD_INGRESS_VSWITCH_ETHERNET_MAC_SOURCE_ADDRESS"; + else if(fieldID == FWPS_FIELD_INGRESS_VSWITCH_ETHERNET_MAC_SOURCE_ADDRESS_TYPE) + pString = "FWPS_FIELD_INGRESS_VSWITCH_ETHERNET_MAC_SOURCE_ADDRESS_TYPE"; + else if(fieldID == FWPS_FIELD_INGRESS_VSWITCH_ETHERNET_MAC_DESTINATION_ADDRESS) + pString = "FWPS_FIELD_INGRESS_VSWITCH_ETHERNET_MAC_DESTINATION_ADDRESS"; + else if(fieldID == FWPS_FIELD_INGRESS_VSWITCH_ETHERNET_MAC_DESTINATION_ADDRESS_TYPE) + pString = "FWPS_FIELD_INGRESS_VSWITCH_ETHERNET_MAC_DESTINATION_ADDRESS_TYPE"; + else if(fieldID == FWPS_FIELD_INGRESS_VSWITCH_ETHERNET_ETHER_TYPE) + pString = "FWPS_FIELD_INGRESS_VSWITCH_ETHERNET_ETHER_TYPE"; + else if(fieldID == FWPS_FIELD_INGRESS_VSWITCH_ETHERNET_VLAN_ID) + pString = "FWPS_FIELD_INGRESS_VSWITCH_ETHERNET_VLAN_ID"; + else if(fieldID == FWPS_FIELD_INGRESS_VSWITCH_ETHERNET_VSWITCH_TENANT_NETWORK_ID) + pString = "FWPS_FIELD_INGRESS_VSWITCH_ETHERNET_VSWITCH_TENANT_NETWORK_ID"; + else if(fieldID == FWPS_FIELD_INGRESS_VSWITCH_ETHERNET_VSWITCH_ID) + pString = "FWPS_FIELD_INGRESS_VSWITCH_ETHERNET_VSWITCH_ID"; + else if(fieldID == FWPS_FIELD_INGRESS_VSWITCH_ETHERNET_VSWITCH_NETWORK_TYPE) + pString = "FWPS_FIELD_INGRESS_VSWITCH_ETHERNET_VSWITCH_NETWORK_TYPE"; + else if(fieldID == FWPS_FIELD_INGRESS_VSWITCH_ETHERNET_VSWITCH_SOURCE_INTERFACE_ID) + pString = "FWPS_FIELD_INGRESS_VSWITCH_ETHERNET_VSWITCH_SOURCE_INTERFACE_ID"; + else if(fieldID == FWPS_FIELD_INGRESS_VSWITCH_ETHERNET_VSWITCH_SOURCE_INTERFACE_TYPE) + pString = "FWPS_FIELD_INGRESS_VSWITCH_ETHERNET_VSWITCH_SOURCE_INTERFACE_TYPE"; + else if(fieldID == FWPS_FIELD_INGRESS_VSWITCH_ETHERNET_VSWITCH_SOURCE_VM_ID) + pString = "FWPS_FIELD_INGRESS_VSWITCH_ETHERNET_VSWITCH_SOURCE_VM_ID"; + else if(fieldID == FWPS_FIELD_INGRESS_VSWITCH_ETHERNET_L2_FLAGS) + pString = "FWPS_FIELD_INGRESS_VSWITCH_ETHERNET_L2_FLAGS"; + + break; + } + case FWPS_LAYER_EGRESS_VSWITCH_ETHERNET: + { + if(fieldID == FWPS_FIELD_EGRESS_VSWITCH_ETHERNET_MAC_SOURCE_ADDRESS) + pString = "FWPS_FIELD_EGRESS_VSWITCH_ETHERNET_MAC_SOURCE_ADDRESS"; + else if(fieldID == FWPS_FIELD_EGRESS_VSWITCH_ETHERNET_MAC_SOURCE_ADDRESS_TYPE) + pString = "FWPS_FIELD_EGRESS_VSWITCH_ETHERNET_MAC_SOURCE_ADDRESS_TYPE"; + else if(fieldID == FWPS_FIELD_EGRESS_VSWITCH_ETHERNET_MAC_DESTINATION_ADDRESS) + pString = "FWPS_FIELD_EGRESS_VSWITCH_ETHERNET_MAC_DESTINATION_ADDRESS"; + else if(fieldID == FWPS_FIELD_EGRESS_VSWITCH_ETHERNET_MAC_DESTINATION_ADDRESS_TYPE) + pString = "FWPS_FIELD_EGRESS_VSWITCH_ETHERNET_MAC_DESTINATION_ADDRESS_TYPE"; + else if(fieldID == FWPS_FIELD_EGRESS_VSWITCH_ETHERNET_ETHER_TYPE) + pString = "FWPS_FIELD_EGRESS_VSWITCH_ETHERNET_ETHER_TYPE"; + else if(fieldID == FWPS_FIELD_EGRESS_VSWITCH_ETHERNET_VLAN_ID) + pString = "FWPS_FIELD_EGRESS_VSWITCH_ETHERNET_VLAN_ID"; + else if(fieldID == FWPS_FIELD_EGRESS_VSWITCH_ETHERNET_VSWITCH_TENANT_NETWORK_ID) + pString = "FWPS_FIELD_EGRESS_VSWITCH_ETHERNET_VSWITCH_TENANT_NETWORK_ID"; + else if(fieldID == FWPS_FIELD_EGRESS_VSWITCH_ETHERNET_VSWITCH_ID) + pString = "FWPS_FIELD_EGRESS_VSWITCH_ETHERNET_VSWITCH_ID"; + else if(fieldID == FWPS_FIELD_EGRESS_VSWITCH_ETHERNET_VSWITCH_NETWORK_TYPE) + pString = "FWPS_FIELD_EGRESS_VSWITCH_ETHERNET_VSWITCH_NETWORK_TYPE"; + else if(fieldID == FWPS_FIELD_EGRESS_VSWITCH_ETHERNET_VSWITCH_SOURCE_INTERFACE_ID) + pString = "FWPS_FIELD_EGRESS_VSWITCH_ETHERNET_VSWITCH_SOURCE_INTERFACE_ID"; + else if(fieldID == FWPS_FIELD_EGRESS_VSWITCH_ETHERNET_VSWITCH_SOURCE_INTERFACE_TYPE) + pString = "FWPS_FIELD_EGRESS_VSWITCH_ETHERNET_VSWITCH_SOURCE_INTERFACE_TYPE"; + else if(fieldID == FWPS_FIELD_EGRESS_VSWITCH_ETHERNET_VSWITCH_SOURCE_VM_ID) + pString = "FWPS_FIELD_EGRESS_VSWITCH_ETHERNET_VSWITCH_SOURCE_VM_ID"; + else if(fieldID == FWPS_FIELD_EGRESS_VSWITCH_ETHERNET_VSWITCH_DESTINATION_INTERFACE_ID) + pString = "FWPS_FIELD_EGRESS_VSWITCH_ETHERNET_VSWITCH_DESTINATION_INTERFACE_ID"; + else if(fieldID == FWPS_FIELD_EGRESS_VSWITCH_ETHERNET_VSWITCH_DESTINATION_INTERFACE_TYPE) + pString = "FWPS_FIELD_EGRESS_VSWITCH_ETHERNET_VSWITCH_DESTINATION_INTERFACE_TYPE"; + else if(fieldID == FWPS_FIELD_EGRESS_VSWITCH_ETHERNET_VSWITCH_DESTINATION_VM_ID) + pString = "FWPS_FIELD_EGRESS_VSWITCH_ETHERNET_VSWITCH_DESTINATION_VM_ID"; + else if(fieldID == FWPS_FIELD_EGRESS_VSWITCH_ETHERNET_L2_FLAGS) + pString = "FWPS_FIELD_EGRESS_VSWITCH_ETHERNET_L2_FLAGS"; + + break; + } + case FWPS_LAYER_INGRESS_VSWITCH_TRANSPORT_V4: + case FWPS_LAYER_INGRESS_VSWITCH_TRANSPORT_V6: + { + if(fieldID == FWPS_FIELD_INGRESS_VSWITCH_TRANSPORT_V4_IP_SOURCE_ADDRESS) + { + pString = "FWPM_CONDITION_IP_SOURCE_ADDRESS"; + + if(pFormat) + *pFormat = ADDRESS_VALUE; + } + else if(fieldID == FWPS_FIELD_INGRESS_VSWITCH_TRANSPORT_V4_IP_DESTINATION_ADDRESS) + { + pString = "FWPM_CONDITION_IP_DESTINATION_ADDRESS"; + + if(pFormat) + *pFormat = ADDRESS_VALUE; + } + else if(fieldID == FWPS_FIELD_INGRESS_VSWITCH_TRANSPORT_V4_IP_PROTOCOL) + pString = "FWPM_CONDITION_IP_PROTOCOL"; + else if(fieldID == FWPS_FIELD_INGRESS_VSWITCH_TRANSPORT_V4_IP_SOURCE_PORT) + pString = "FWPM_CONDITION_IP_SOURCE_PORT"; + else if(fieldID == FWPS_FIELD_INGRESS_VSWITCH_TRANSPORT_V4_IP_DESTINATION_PORT) + pString = "FWPM_CONDITION_IP_DESTINATION_PORT"; + else if(fieldID == FWPS_FIELD_INGRESS_VSWITCH_TRANSPORT_V4_VLAN_ID) + pString = "FWPM_CONDITION_VLAN_ID"; + else if(fieldID == FWPS_FIELD_INGRESS_VSWITCH_TRANSPORT_V4_VSWITCH_TENANT_NETWORK_ID) + pString = "FWPM_CONDITION_VSWITCH_TENANT_NETWORK_ID"; + else if(fieldID == FWPS_FIELD_INGRESS_VSWITCH_TRANSPORT_V4_VSWITCH_ID) + pString = "FWPM_CONDITION_VSWITCH_ID"; + else if(fieldID == FWPS_FIELD_INGRESS_VSWITCH_TRANSPORT_V4_VSWITCH_NETWORK_TYPE) + pString = "FWPM_CONDITION_VSWITCH_NETWORK_TYPE"; + else if(fieldID == FWPS_FIELD_INGRESS_VSWITCH_TRANSPORT_V4_VSWITCH_SOURCE_INTERFACE_ID) + pString = "FWPM_CONDITION_VSWITCH_SOURCE_INTERFACE_ID"; + else if(fieldID == FWPS_FIELD_INGRESS_VSWITCH_TRANSPORT_V4_VSWITCH_SOURCE_INTERFACE_TYPE) + pString = "FWPM_CONDITION_VSWITCH_SOURCE_INTERFACE_TYPE"; + else if(fieldID == FWPS_FIELD_INGRESS_VSWITCH_TRANSPORT_V4_VSWITCH_SOURCE_VM_ID) + pString = "FWPM_CONDITION_VSWITCH_SOURCE_VM_ID"; + else if(fieldID == FWPS_FIELD_INGRESS_VSWITCH_TRANSPORT_V4_L2_FLAGS) + { + pString = "FWPM_CONDITION_L2_FLAGS"; + + if(pFormat) + *pFormat = L2_FLAGS_VALUE; + } + + break; + } + case FWPS_LAYER_EGRESS_VSWITCH_TRANSPORT_V4: + case FWPS_LAYER_EGRESS_VSWITCH_TRANSPORT_V6: + { + if(fieldID == FWPS_FIELD_EGRESS_VSWITCH_TRANSPORT_V4_IP_SOURCE_ADDRESS) + { + pString = "FWPM_CONDITION_IP_SOURCE_ADDRESS"; + + if(pFormat) + *pFormat = ADDRESS_VALUE; + } + else if(fieldID == FWPS_FIELD_EGRESS_VSWITCH_TRANSPORT_V4_IP_DESTINATION_ADDRESS) + { + pString = "FWPM_CONDITION_IP_DESTINATION_ADDRESS"; + + if(pFormat) + *pFormat = ADDRESS_VALUE; + } + else if(fieldID == FWPS_FIELD_EGRESS_VSWITCH_TRANSPORT_V4_IP_PROTOCOL) + pString = "FWPM_CONDITION_IP_PROTOCOL"; + else if(fieldID == FWPS_FIELD_EGRESS_VSWITCH_TRANSPORT_V4_IP_SOURCE_PORT) + pString = "FWPM_CONDITION_IP_SOURCE_PORT"; + else if(fieldID == FWPS_FIELD_EGRESS_VSWITCH_TRANSPORT_V4_IP_DESTINATION_PORT) + pString = "FWPM_CONDITION_IP_DESTINATION_PORT"; + else if(fieldID == FWPS_FIELD_EGRESS_VSWITCH_TRANSPORT_V4_VLAN_ID) + pString = "FWPM_CONDITION_VLAN_ID"; + else if(fieldID == FWPS_FIELD_EGRESS_VSWITCH_TRANSPORT_V4_VSWITCH_TENANT_NETWORK_ID) + pString = "FWPM_CONDITION_VSWITCH_TENANT_NETWORK_ID"; + else if(fieldID == FWPS_FIELD_EGRESS_VSWITCH_TRANSPORT_V4_VSWITCH_ID) + pString = "FWPM_CONDITION_VSWITCH_ID"; + else if(fieldID == FWPS_FIELD_EGRESS_VSWITCH_TRANSPORT_V4_VSWITCH_NETWORK_TYPE) + pString = "FWPM_CONDITION_VSWITCH_NETWORK_TYPE"; + else if(fieldID == FWPS_FIELD_EGRESS_VSWITCH_TRANSPORT_V4_VSWITCH_SOURCE_INTERFACE_ID) + pString = "FWPM_CONDITION_VSWITCH_SOURCE_INTERFACE_ID"; + else if(fieldID == FWPS_FIELD_EGRESS_VSWITCH_TRANSPORT_V4_VSWITCH_SOURCE_INTERFACE_TYPE) + pString = "FWPM_CONDITION_VSWITCH_SOURCE_INTERFACE_TYPE"; + else if(fieldID == FWPS_FIELD_EGRESS_VSWITCH_TRANSPORT_V4_VSWITCH_SOURCE_VM_ID) + pString = "FWPM_CONDITION_VSWITCH_SOURCE_VM_ID"; + else if(fieldID == FWPS_FIELD_EGRESS_VSWITCH_TRANSPORT_V4_VSWITCH_DESTINATION_INTERFACE_ID) + pString = "FWPM_CONDITION_VSWITCH_DESTINATION_INTERFACE_ID"; + else if(fieldID == FWPS_FIELD_EGRESS_VSWITCH_TRANSPORT_V4_VSWITCH_DESTINATION_INTERFACE_TYPE) + pString = "FWPM_CONDITION_VSWITCH_DESTINATION_INTERFACE_TYPE"; + else if(fieldID == FWPS_FIELD_EGRESS_VSWITCH_TRANSPORT_V4_VSWITCH_DESTINATION_VM_ID) + pString = "FWPM_CONDITION_VSWITCH_DESTINATION_VM_ID"; + else if(fieldID == FWPS_FIELD_EGRESS_VSWITCH_TRANSPORT_V4_L2_FLAGS) + { + pString = "FWPM_CONDITION_L2_FLAGS"; + + if(pFormat) + *pFormat = L2_FLAGS_VALUE; + } + + break; + } + +#endif /// (NTDDI_VERSION >= NTDDI_WIN8) +#endif /// (NTDDI_VERSION >= NTDDI_WIN7) + + } + + return pString; +} + + +/** + @kernel_helper_function="KrnlHlprFwpValueGetFromFwpsIncomingValues" + + Purpose: Retrieve a pointer to the FWP_VALUE for a given condition in the + FWPS_INCOMING_VALUES. <br> + <br> + Notes: <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552450.aspx <br> + HTTP://MSDN.Microsoft.com/En-US/Library/Windwos/Hardware/FF549939.aspx <br> +*/ +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Must_inspect_result_ +_Success_(return != 0) +FWP_VALUE* KrnlHlprFwpValueGetFromFwpsIncomingValues(_In_ const FWPS_INCOMING_VALUES* pClassifyValues, + _In_ const GUID* pConditionKey) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpValueGetFromFwpsIncomingValues()\n"); + +#endif /// DBG + + NT_ASSERT(pClassifyValues); + NT_ASSERT(pConditionKey); + + FWP_VALUE* pValue = 0; + + switch(pClassifyValues->layerId) + { + case FWPS_LAYER_INBOUND_IPPACKET_V4: + case FWPS_LAYER_INBOUND_IPPACKET_V4_DISCARD: + case FWPS_LAYER_INBOUND_IPPACKET_V6: + case FWPS_LAYER_INBOUND_IPPACKET_V6_DISCARD: + { + if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_ADDRESS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_IPPACKET_V4_IP_LOCAL_ADDRESS].value); + else if(pConditionKey == &FWPM_CONDITION_IP_REMOTE_ADDRESS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_IPPACKET_V4_IP_REMOTE_ADDRESS].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_ADDRESS_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_IPPACKET_V4_IP_LOCAL_ADDRESS_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_INTERFACE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_IPPACKET_V4_IP_LOCAL_INTERFACE].value); + else if(pConditionKey == &FWPM_CONDITION_INTERFACE_INDEX) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_IPPACKET_V4_INTERFACE_INDEX].value); + else if(pConditionKey == &FWPM_CONDITION_SUB_INTERFACE_INDEX) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_IPPACKET_V4_SUB_INTERFACE_INDEX].value); + else if(pConditionKey == &FWPM_CONDITION_FLAGS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_IPPACKET_V4_FLAGS].value); + else if(pConditionKey == &FWPM_CONDITION_INTERFACE_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_IPPACKET_V4_INTERFACE_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_TUNNEL_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_IPPACKET_V4_TUNNEL_TYPE].value); + + break; + } + case FWPS_LAYER_OUTBOUND_IPPACKET_V4: + case FWPS_LAYER_OUTBOUND_IPPACKET_V4_DISCARD: + case FWPS_LAYER_OUTBOUND_IPPACKET_V6: + case FWPS_LAYER_OUTBOUND_IPPACKET_V6_DISCARD: + { + if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_ADDRESS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_OUTBOUND_IPPACKET_V4_IP_LOCAL_ADDRESS].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_ADDRESS_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_OUTBOUND_IPPACKET_V4_IP_LOCAL_ADDRESS_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_IP_REMOTE_ADDRESS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_OUTBOUND_IPPACKET_V4_IP_REMOTE_ADDRESS].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_INTERFACE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_OUTBOUND_IPPACKET_V4_IP_LOCAL_INTERFACE].value); + else if(pConditionKey == &FWPM_CONDITION_INTERFACE_INDEX) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_OUTBOUND_IPPACKET_V4_INTERFACE_INDEX].value); + else if(pConditionKey == &FWPM_CONDITION_SUB_INTERFACE_INDEX) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_OUTBOUND_IPPACKET_V4_SUB_INTERFACE_INDEX].value); + else if(pConditionKey == &FWPM_CONDITION_FLAGS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_OUTBOUND_IPPACKET_V4_FLAGS].value); + else if(pConditionKey == &FWPM_CONDITION_INTERFACE_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_OUTBOUND_IPPACKET_V4_INTERFACE_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_TUNNEL_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_OUTBOUND_IPPACKET_V4_TUNNEL_TYPE].value); + + break; + } + case FWPS_LAYER_IPFORWARD_V4: + case FWPS_LAYER_IPFORWARD_V4_DISCARD: + case FWPS_LAYER_IPFORWARD_V6: + case FWPS_LAYER_IPFORWARD_V6_DISCARD: + { + if(pConditionKey == &FWPM_CONDITION_IP_SOURCE_ADDRESS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_IPFORWARD_V4_IP_SOURCE_ADDRESS].value); + else if(pConditionKey == &FWPM_CONDITION_IP_DESTINATION_ADDRESS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_IPFORWARD_V4_IP_DESTINATION_ADDRESS].value); + else if(pConditionKey == &FWPM_CONDITION_IP_DESTINATION_ADDRESS_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_IPFORWARD_V4_IP_DESTINATION_ADDRESS_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_INTERFACE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_IPFORWARD_V4_IP_LOCAL_INTERFACE].value); + else if(pConditionKey == &FWPM_CONDITION_IP_FORWARD_INTERFACE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_IPFORWARD_V4_IP_FORWARD_INTERFACE].value); + else if(pConditionKey == &FWPM_CONDITION_SOURCE_INTERFACE_INDEX) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_IPFORWARD_V4_SOURCE_INTERFACE_INDEX].value); + else if(pConditionKey == &FWPM_CONDITION_SOURCE_SUB_INTERFACE_INDEX) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_IPFORWARD_V4_SOURCE_SUB_INTERFACE_INDEX].value); + else if(pConditionKey == &FWPM_CONDITION_DESTINATION_INTERFACE_INDEX) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_IPFORWARD_V4_DESTINATION_INTERFACE_INDEX].value); + else if(pConditionKey == &FWPM_CONDITION_DESTINATION_SUB_INTERFACE_INDEX) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_IPFORWARD_V4_DESTINATION_SUB_INTERFACE_INDEX].value); + else if(pConditionKey == &FWPM_CONDITION_FLAGS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_IPFORWARD_V4_FLAGS].value); + +#if(NTDDI_VERSION >= NTDDI_WIN7) + + else if(pConditionKey == &FWPM_CONDITION_IP_PHYSICAL_ARRIVAL_INTERFACE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_IPFORWARD_V4_IP_PHYSICAL_ARRIVAL_INTERFACE].value); + else if(pConditionKey == &FWPM_CONDITION_ARRIVAL_INTERFACE_PROFILE_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_IPFORWARD_V4_ARRIVAL_INTERFACE_PROFILE_ID].value); + else if(pConditionKey == &FWPM_CONDITION_IP_PHYSICAL_NEXTHOP_INTERFACE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_IPFORWARD_V4_IP_PHYSICAL_NEXTHOP_INTERFACE].value); + else if(pConditionKey == &FWPM_CONDITION_NEXTHOP_INTERFACE_PROFILE_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_IPFORWARD_V4_NEXTHOP_INTERFACE_PROFILE_ID].value); + +#endif /// (NTDDI_VERSION >= NTDDI_WIN7) + + break; + } + case FWPS_LAYER_INBOUND_TRANSPORT_V4: + case FWPS_LAYER_INBOUND_TRANSPORT_V4_DISCARD: + case FWPS_LAYER_INBOUND_TRANSPORT_V6: + case FWPS_LAYER_INBOUND_TRANSPORT_V6_DISCARD: + { + if(pConditionKey == &FWPM_CONDITION_IP_PROTOCOL) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_TRANSPORT_V4_IP_PROTOCOL].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_ADDRESS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_TRANSPORT_V4_IP_LOCAL_ADDRESS].value); + else if(pConditionKey == &FWPM_CONDITION_IP_REMOTE_ADDRESS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_TRANSPORT_V4_IP_REMOTE_ADDRESS].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_ADDRESS_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_TRANSPORT_V4_IP_LOCAL_ADDRESS_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_PORT) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_TRANSPORT_V4_IP_LOCAL_PORT].value); + else if(pConditionKey == &FWPM_CONDITION_IP_REMOTE_PORT) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_TRANSPORT_V4_IP_REMOTE_PORT].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_INTERFACE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_TRANSPORT_V4_IP_LOCAL_INTERFACE].value); + else if(pConditionKey == &FWPM_CONDITION_INTERFACE_INDEX) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_TRANSPORT_V4_INTERFACE_INDEX].value); + else if(pConditionKey == &FWPM_CONDITION_SUB_INTERFACE_INDEX) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_TRANSPORT_V4_SUB_INTERFACE_INDEX].value); + else if(pConditionKey == &FWPM_CONDITION_FLAGS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_TRANSPORT_V4_FLAGS].value); + else if(pConditionKey == &FWPM_CONDITION_INTERFACE_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_TRANSPORT_V4_INTERFACE_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_TUNNEL_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_TRANSPORT_V4_TUNNEL_TYPE].value); + +#if(NTDDI_VERSION >= NTDDI_WIN7) + + else if(pConditionKey == &FWPM_CONDITION_CURRENT_PROFILE_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_TRANSPORT_V4_PROFILE_ID].value); + +#endif /// (NTDDI_VERSION >= NTDDI_WIN7) + + break; + } + case FWPS_LAYER_OUTBOUND_TRANSPORT_V4: + case FWPS_LAYER_OUTBOUND_TRANSPORT_V4_DISCARD: + case FWPS_LAYER_OUTBOUND_TRANSPORT_V6: + case FWPS_LAYER_OUTBOUND_TRANSPORT_V6_DISCARD: + { + if(pConditionKey == &FWPM_CONDITION_IP_PROTOCOL) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_OUTBOUND_TRANSPORT_V4_IP_PROTOCOL].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_ADDRESS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_OUTBOUND_TRANSPORT_V4_IP_LOCAL_ADDRESS].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_ADDRESS_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_OUTBOUND_TRANSPORT_V4_IP_LOCAL_ADDRESS_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_IP_REMOTE_ADDRESS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_OUTBOUND_TRANSPORT_V4_IP_REMOTE_ADDRESS].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_PORT) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_OUTBOUND_TRANSPORT_V4_IP_LOCAL_PORT].value); + else if(pConditionKey == &FWPM_CONDITION_IP_REMOTE_PORT) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_OUTBOUND_TRANSPORT_V4_IP_REMOTE_PORT].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_INTERFACE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_OUTBOUND_TRANSPORT_V4_IP_LOCAL_INTERFACE].value); + else if(pConditionKey == &FWPM_CONDITION_INTERFACE_INDEX) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_OUTBOUND_TRANSPORT_V4_INTERFACE_INDEX].value); + else if(pConditionKey == &FWPM_CONDITION_SUB_INTERFACE_INDEX) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_OUTBOUND_TRANSPORT_V4_SUB_INTERFACE_INDEX].value); + else if(pConditionKey == &FWPM_CONDITION_IP_DESTINATION_ADDRESS_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_OUTBOUND_TRANSPORT_V4_IP_DESTINATION_ADDRESS_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_FLAGS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_OUTBOUND_TRANSPORT_V4_FLAGS].value); + else if(pConditionKey == &FWPM_CONDITION_INTERFACE_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_OUTBOUND_TRANSPORT_V4_INTERFACE_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_TUNNEL_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_OUTBOUND_TRANSPORT_V4_TUNNEL_TYPE].value); + +#if(NTDDI_VERSION >= NTDDI_WIN7) + + else if(pConditionKey == &FWPM_CONDITION_CURRENT_PROFILE_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_OUTBOUND_TRANSPORT_V4_PROFILE_ID].value); + +#if(NTDDI_VERSION >= NTDDI_WINTHRESHOLD) + + else if(pConditionKey == &FWPM_CONDITION_IPSEC_SECURITY_REALM_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_OUTBOUND_TRANSPORT_V4_IPSEC_SECURITY_REALM_ID].value); + +#endif /// (NTDDI_VERSION >= NTDDI_WINTHRESHOLD) +#endif /// (NTDDI_VERSION >= NTDDI_WIN7) + + break; + } + case FWPS_LAYER_STREAM_V4: + case FWPS_LAYER_STREAM_V4_DISCARD: + case FWPS_LAYER_STREAM_V6: + case FWPS_LAYER_STREAM_V6_DISCARD: + { + if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_ADDRESS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_STREAM_V4_IP_LOCAL_ADDRESS].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_ADDRESS_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_STREAM_V4_IP_LOCAL_ADDRESS_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_IP_REMOTE_ADDRESS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_STREAM_V4_IP_REMOTE_ADDRESS].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_PORT) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_STREAM_V4_IP_LOCAL_PORT].value); + else if(pConditionKey == &FWPM_CONDITION_IP_REMOTE_PORT) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_STREAM_V4_IP_REMOTE_PORT].value); + else if(pConditionKey == &FWPM_CONDITION_DIRECTION) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_STREAM_V4_DIRECTION].value); + +#if(NTDDI_VERSION >= NTDDI_VISTASP1) + + else if(pConditionKey == &FWPM_CONDITION_FLAGS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_STREAM_V4_FLAGS].value); + +#endif /// (NTDDI_VERSION >= NTDDI_VISTASP1) + + break; + } + case FWPS_LAYER_DATAGRAM_DATA_V4: + case FWPS_LAYER_DATAGRAM_DATA_V4_DISCARD: + case FWPS_LAYER_DATAGRAM_DATA_V6: + case FWPS_LAYER_DATAGRAM_DATA_V6_DISCARD: + { + if(pConditionKey == &FWPM_CONDITION_IP_PROTOCOL) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_DATAGRAM_DATA_V4_IP_PROTOCOL].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_ADDRESS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_DATAGRAM_DATA_V4_IP_LOCAL_ADDRESS].value); + else if(pConditionKey == &FWPM_CONDITION_IP_REMOTE_ADDRESS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_DATAGRAM_DATA_V4_IP_REMOTE_ADDRESS].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_ADDRESS_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_DATAGRAM_DATA_V4_IP_LOCAL_ADDRESS_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_PORT) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_DATAGRAM_DATA_V4_IP_LOCAL_PORT].value); + else if(pConditionKey == &FWPM_CONDITION_IP_REMOTE_PORT) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_DATAGRAM_DATA_V4_IP_REMOTE_PORT].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_INTERFACE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_DATAGRAM_DATA_V4_IP_LOCAL_INTERFACE].value); + else if(pConditionKey == &FWPM_CONDITION_INTERFACE_INDEX) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_DATAGRAM_DATA_V4_INTERFACE_INDEX].value); + else if(pConditionKey == &FWPM_CONDITION_SUB_INTERFACE_INDEX) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_DATAGRAM_DATA_V4_SUB_INTERFACE_INDEX].value); + else if(pConditionKey == &FWPM_CONDITION_DIRECTION) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_DATAGRAM_DATA_V4_DIRECTION].value); + else if(pConditionKey == &FWPM_CONDITION_FLAGS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_DATAGRAM_DATA_V4_FLAGS].value); + else if(pConditionKey == &FWPM_CONDITION_INTERFACE_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_DATAGRAM_DATA_V4_INTERFACE_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_TUNNEL_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_DATAGRAM_DATA_V4_TUNNEL_TYPE].value); + + break; + } + case FWPS_LAYER_INBOUND_ICMP_ERROR_V4: + case FWPS_LAYER_INBOUND_ICMP_ERROR_V4_DISCARD: + case FWPS_LAYER_INBOUND_ICMP_ERROR_V6: + case FWPS_LAYER_INBOUND_ICMP_ERROR_V6_DISCARD: + { + if(pConditionKey == &FWPM_CONDITION_EMBEDDED_PROTOCOL) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_ICMP_ERROR_V4_EMBEDDED_PROTOCOL].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_ADDRESS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_ICMP_ERROR_V4_IP_LOCAL_ADDRESS].value); + else if(pConditionKey == &FWPM_CONDITION_IP_REMOTE_ADDRESS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_ICMP_ERROR_V4_IP_REMOTE_ADDRESS].value); + else if(pConditionKey == &FWPM_CONDITION_EMBEDDED_REMOTE_ADDRESS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_ICMP_ERROR_V4_EMBEDDED_REMOTE_ADDRESS].value); + else if(pConditionKey == &FWPM_CONDITION_EMBEDDED_LOCAL_ADDRESS_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_ICMP_ERROR_V4_EMBEDDED_LOCAL_ADDRESS_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_EMBEDDED_LOCAL_PORT) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_ICMP_ERROR_V4_EMBEDDED_LOCAL_PORT].value); + else if(pConditionKey == &FWPM_CONDITION_EMBEDDED_REMOTE_PORT) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_ICMP_ERROR_V4_EMBEDDED_REMOTE_PORT].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_INTERFACE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_ICMP_ERROR_V4_IP_LOCAL_INTERFACE].value); + else if(pConditionKey == &FWPM_CONDITION_ICMP_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_ICMP_ERROR_V4_ICMP_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_ICMP_CODE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_ICMP_ERROR_V4_ICMP_CODE].value); + else if(pConditionKey == &FWPM_CONDITION_INTERFACE_INDEX) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_ICMP_ERROR_V4_INTERFACE_INDEX].value); + else if(pConditionKey == &FWPM_CONDITION_SUB_INTERFACE_INDEX) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_ICMP_ERROR_V4_SUB_INTERFACE_INDEX].value); + else if(pConditionKey == &FWPM_CONDITION_INTERFACE_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_ICMP_ERROR_V4_INTERFACE_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_TUNNEL_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_ICMP_ERROR_V4_TUNNEL_TYPE].value); + +#if(NTDDI_VERSION >= NTDDI_VISTASP1) + + else if(pConditionKey == &FWPM_CONDITION_IP_ARRIVAL_INTERFACE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_ICMP_ERROR_V4_IP_ARRIVAL_INTERFACE].value); + else if(pConditionKey == &FWPM_CONDITION_ARRIVAL_INTERFACE_INDEX) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_ICMP_ERROR_V4_ARRIVAL_INTERFACE_INDEX].value); + else if(pConditionKey == &FWPM_CONDITION_ARRIVAL_INTERFACE_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_ICMP_ERROR_V4_ARRIVAL_INTERFACE_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_ARRIVAL_TUNNEL_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_ICMP_ERROR_V4_ARRIVAL_TUNNEL_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_FLAGS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_ICMP_ERROR_V4_FLAGS].value); + +#if(NTDDI_VERSION >= NTDDI_WIN7) + + else if(pConditionKey == &FWPM_CONDITION_ARRIVAL_INTERFACE_PROFILE_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_ICMP_ERROR_V4_ARRIVAL_INTERFACE_PROFILE_ID].value); + else if(pConditionKey == &FWPM_CONDITION_INTERFACE_QUARANTINE_EPOCH) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_ICMP_ERROR_V4_INTERFACE_QUARANTINE_EPOCH].value); + +#endif /// (NTDDI_VERSION >= NTDDI_WIN7) +#endif /// (NTDDI_VERSION >= NTDDI_VISTASP1) + + break; + } + case FWPS_LAYER_OUTBOUND_ICMP_ERROR_V4: + case FWPS_LAYER_OUTBOUND_ICMP_ERROR_V4_DISCARD: + case FWPS_LAYER_OUTBOUND_ICMP_ERROR_V6: + case FWPS_LAYER_OUTBOUND_ICMP_ERROR_V6_DISCARD: + { + if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_ADDRESS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_OUTBOUND_ICMP_ERROR_V4_IP_LOCAL_ADDRESS].value); + else if(pConditionKey == &FWPM_CONDITION_IP_REMOTE_ADDRESS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_OUTBOUND_ICMP_ERROR_V4_IP_REMOTE_ADDRESS].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_ADDRESS_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_OUTBOUND_ICMP_ERROR_V4_IP_LOCAL_ADDRESS_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_INTERFACE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_OUTBOUND_ICMP_ERROR_V4_IP_LOCAL_INTERFACE].value); + else if(pConditionKey == &FWPM_CONDITION_ICMP_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_OUTBOUND_ICMP_ERROR_V4_ICMP_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_ICMP_CODE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_OUTBOUND_ICMP_ERROR_V4_ICMP_CODE].value); + else if(pConditionKey == &FWPM_CONDITION_INTERFACE_INDEX) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_OUTBOUND_ICMP_ERROR_V4_INTERFACE_INDEX].value); + else if(pConditionKey == &FWPM_CONDITION_SUB_INTERFACE_INDEX) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_OUTBOUND_ICMP_ERROR_V4_SUB_INTERFACE_INDEX].value); + else if(pConditionKey == &FWPM_CONDITION_INTERFACE_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_OUTBOUND_ICMP_ERROR_V4_INTERFACE_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_TUNNEL_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_OUTBOUND_ICMP_ERROR_V4_TUNNEL_TYPE].value); + +#if(NTDDI_VERSION >= NTDDI_VISTASP1) + + else if(pConditionKey == &FWPM_CONDITION_FLAGS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_OUTBOUND_ICMP_ERROR_V4_FLAGS].value); + +#if(NTDDI_VERSION >= NTDDI_WIN7) + + else if(pConditionKey == &FWPM_CONDITION_NEXTHOP_INTERFACE_PROFILE_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_OUTBOUND_ICMP_ERROR_V4_NEXTHOP_INTERFACE_PROFILE_ID].value); + else if(pConditionKey == &FWPM_CONDITION_INTERFACE_QUARANTINE_EPOCH) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_OUTBOUND_ICMP_ERROR_V4_INTERFACE_QUARANTINE_EPOCH].value); + +#endif /// (NTDDI_VERSION >= NTDDI_WIN7) +#endif /// (NTDDI_VERSION >= NTDDI_VISTASP1) + + break; + } + case FWPS_LAYER_ALE_RESOURCE_ASSIGNMENT_V4: + case FWPS_LAYER_ALE_RESOURCE_ASSIGNMENT_V4_DISCARD: + case FWPS_LAYER_ALE_RESOURCE_ASSIGNMENT_V6: + case FWPS_LAYER_ALE_RESOURCE_ASSIGNMENT_V6_DISCARD: + { + if(pConditionKey == &FWPM_CONDITION_ALE_APP_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_RESOURCE_ASSIGNMENT_V4_ALE_APP_ID].value); + else if(pConditionKey == &FWPM_CONDITION_ALE_USER_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_RESOURCE_ASSIGNMENT_V4_ALE_USER_ID].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_ADDRESS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_RESOURCE_ASSIGNMENT_V4_IP_LOCAL_ADDRESS].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_ADDRESS_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_RESOURCE_ASSIGNMENT_V4_IP_LOCAL_ADDRESS_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_PORT) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_RESOURCE_ASSIGNMENT_V4_IP_LOCAL_PORT].value); + else if(pConditionKey == &FWPM_CONDITION_IP_PROTOCOL) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_RESOURCE_ASSIGNMENT_V4_IP_PROTOCOL].value); + else if(pConditionKey == &FWPM_CONDITION_ALE_PROMISCUOUS_MODE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_RESOURCE_ASSIGNMENT_V4_ALE_PROMISCUOUS_MODE].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_INTERFACE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_RESOURCE_ASSIGNMENT_V4_IP_LOCAL_INTERFACE].value); + else if(pConditionKey == &FWPM_CONDITION_FLAGS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_RESOURCE_ASSIGNMENT_V4_FLAGS].value); + else if(pConditionKey == &FWPM_CONDITION_INTERFACE_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_RESOURCE_ASSIGNMENT_V4_INTERFACE_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_TUNNEL_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_RESOURCE_ASSIGNMENT_V4_TUNNEL_TYPE].value); + +#if(NTDDI_VERSION >= NTDDI_WIN7) + + else if(pConditionKey == &FWPM_CONDITION_LOCAL_INTERFACE_PROFILE_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_RESOURCE_ASSIGNMENT_V4_LOCAL_INTERFACE_PROFILE_ID].value); + else if(pConditionKey == &FWPM_CONDITION_ALE_SIO_FIREWALL_SOCKET_PROPERTY) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_RESOURCE_ASSIGNMENT_V4_SIO_FIREWALL_SOCKET_PROPERTY].value); + +#if(NTDDI_VERSION >= NTDDI_WIN8) + + else if(pConditionKey == &FWPM_CONDITION_ALE_PACKAGE_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_RESOURCE_ASSIGNMENT_V4_ALE_PACKAGE_ID].value); + +#if(NTDDI_VERSION >= NTDDI_WINTHRESHOLD) + + else if(pConditionKey == &FWPM_CONDITION_ALE_SECURITY_ATTRIBUTE_FQBN_VALUE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_RESOURCE_ASSIGNMENT_V4_ALE_SECURITY_ATTRIBUTE_FQBN_VALUE].value); + +#endif /// (NTDDI_VERSION >= NTDDI_WINTHRESHOLD) +#endif /// (NTDDI_VERSION >= NTDDI_WIN8) +#endif /// (NTDDI_VERSION >= NTDDI_WIN7) + + break; + } + case FWPS_LAYER_ALE_AUTH_LISTEN_V4: + case FWPS_LAYER_ALE_AUTH_LISTEN_V4_DISCARD: + case FWPS_LAYER_ALE_AUTH_LISTEN_V6: + case FWPS_LAYER_ALE_AUTH_LISTEN_V6_DISCARD: + { + if(pConditionKey == &FWPM_CONDITION_ALE_APP_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_LISTEN_V4_ALE_APP_ID].value); + else if(pConditionKey == &FWPM_CONDITION_ALE_USER_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_LISTEN_V4_ALE_USER_ID].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_ADDRESS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_LISTEN_V4_IP_LOCAL_ADDRESS].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_ADDRESS_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_LISTEN_V4_IP_LOCAL_ADDRESS_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_PORT) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_LISTEN_V4_IP_LOCAL_PORT].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_INTERFACE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_LISTEN_V4_IP_LOCAL_INTERFACE].value); + else if(pConditionKey == &FWPM_CONDITION_FLAGS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_LISTEN_V4_FLAGS].value); + else if(pConditionKey == &FWPM_CONDITION_INTERFACE_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_LISTEN_V4_INTERFACE_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_TUNNEL_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_LISTEN_V4_TUNNEL_TYPE].value); + +#if(NTDDI_VERSION >= NTDDI_WIN7) + + else if(pConditionKey == &FWPM_CONDITION_LOCAL_INTERFACE_PROFILE_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_LISTEN_V4_LOCAL_INTERFACE_PROFILE_ID].value); + else if(pConditionKey == &FWPM_CONDITION_ALE_SIO_FIREWALL_SOCKET_PROPERTY) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_LISTEN_V4_SIO_FIREWALL_SOCKET_PROPERTY].value); + +#if(NTDDI_VERSION >= NTDDI_WIN8) + + else if(pConditionKey == &FWPM_CONDITION_ALE_PACKAGE_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_LISTEN_V4_ALE_PACKAGE_ID].value); + +#if(NTDDI_VERSION >= NTDDI_WINTHRESHOLD) + + else if(pConditionKey == &FWPM_CONDITION_ALE_SECURITY_ATTRIBUTE_FQBN_VALUE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_LISTEN_V4_ALE_SECURITY_ATTRIBUTE_FQBN_VALUE].value); + +#endif /// (NTDDI_VERSION >= NTDDI_WINTHRESHOLD) +#endif /// (NTDDI_VERSION >= NTDDI_WIN8) +#endif /// (NTDDI_VERSION >= NTDDI_WIN7) + + break; + } + case FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4: + case FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4_DISCARD: + case FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6: + case FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6_DISCARD: + { + if(pConditionKey == &FWPM_CONDITION_ALE_APP_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_ALE_APP_ID].value); + else if(pConditionKey == &FWPM_CONDITION_ALE_USER_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_ALE_USER_ID].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_ADDRESS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_IP_LOCAL_ADDRESS].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_ADDRESS_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_IP_LOCAL_ADDRESS_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_PORT) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_IP_LOCAL_PORT].value); + else if(pConditionKey == &FWPM_CONDITION_IP_PROTOCOL) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_IP_PROTOCOL].value); + else if(pConditionKey == &FWPM_CONDITION_IP_REMOTE_ADDRESS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_IP_REMOTE_ADDRESS].value); + else if(pConditionKey == &FWPM_CONDITION_IP_REMOTE_PORT) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_IP_REMOTE_PORT].value); + else if(pConditionKey == &FWPM_CONDITION_ALE_REMOTE_USER_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_ALE_REMOTE_USER_ID].value); + else if(pConditionKey == &FWPM_CONDITION_ALE_REMOTE_MACHINE_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_ALE_REMOTE_MACHINE_ID].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_INTERFACE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_IP_LOCAL_INTERFACE].value); + else if(pConditionKey == &FWPM_CONDITION_FLAGS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_FLAGS].value); + else if(pConditionKey == &FWPM_CONDITION_ALE_SIO_FIREWALL_SYSTEM_PORT) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_SIO_FIREWALL_SYSTEM_PORT].value); + else if(pConditionKey == &FWPM_CONDITION_ALE_NAP_CONTEXT) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_NAP_CONTEXT].value); + else if(pConditionKey == &FWPM_CONDITION_INTERFACE_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_INTERFACE_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_TUNNEL_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_TUNNEL_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_INTERFACE_INDEX) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_INTERFACE_INDEX].value); + else if(pConditionKey == &FWPM_CONDITION_SUB_INTERFACE_INDEX) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_SUB_INTERFACE_INDEX].value); + +#if(NTDDI_VERSION >= NTDDI_VISTASP1) + + else if(pConditionKey == &FWPM_CONDITION_IP_ARRIVAL_INTERFACE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_IP_ARRIVAL_INTERFACE].value); + else if(pConditionKey == &FWPM_CONDITION_ARRIVAL_INTERFACE_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_ARRIVAL_INTERFACE_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_ARRIVAL_TUNNEL_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_ARRIVAL_TUNNEL_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_ARRIVAL_INTERFACE_INDEX) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_ARRIVAL_INTERFACE_INDEX].value); + +#if(NTDDI_VERSION >= NTDDI_WIN7) + + else if(pConditionKey == &FWPM_CONDITION_NEXTHOP_SUB_INTERFACE_INDEX) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_NEXTHOP_SUB_INTERFACE_INDEX].value); + else if(pConditionKey == &FWPM_CONDITION_IP_NEXTHOP_INTERFACE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_IP_NEXTHOP_INTERFACE].value); + else if(pConditionKey == &FWPM_CONDITION_NEXTHOP_INTERFACE_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_NEXTHOP_INTERFACE_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_NEXTHOP_TUNNEL_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_NEXTHOP_TUNNEL_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_NEXTHOP_INTERFACE_INDEX) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_NEXTHOP_INTERFACE_INDEX].value); + else if(pConditionKey == &FWPM_CONDITION_ORIGINAL_PROFILE_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_ORIGINAL_PROFILE_ID].value); + else if(pConditionKey == &FWPM_CONDITION_CURRENT_PROFILE_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_CURRENT_PROFILE_ID].value); + else if(pConditionKey == &FWPM_CONDITION_REAUTHORIZE_REASON) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_REAUTHORIZE_REASON].value); + else if(pConditionKey == &FWPM_CONDITION_ORIGINAL_ICMP_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_ORIGINAL_ICMP_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_INTERFACE_QUARANTINE_EPOCH) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_INTERFACE_QUARANTINE_EPOCH].value); + +#if(NTDDI_VERSION >= NTDDI_WIN8) + + else if(pConditionKey == &FWPM_CONDITION_ALE_PACKAGE_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_ALE_PACKAGE_ID].value); + +#if(NTDDI_VERSION >= NTDDI_WINTHRESHOLD) + + else if(pConditionKey == &FWPM_CONDITION_ALE_SECURITY_ATTRIBUTE_FQBN_VALUE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_RECV_ACCEPT_V4_ALE_SECURITY_ATTRIBUTE_FQBN_VALUE].value); + +#endif /// (NTDDI_VERSION >= NTDDI_WINTHRESHOLD) +#endif /// (NTDDI_VERSION >= NTDDI_WIN8) +#endif /// (NTDDI_VERSION >= NTDDI_WIN7) +#endif /// (NTDDI_VERSION >= NTDDI_VISTASP1) + + break; + } + case FWPS_LAYER_ALE_AUTH_CONNECT_V4: + case FWPS_LAYER_ALE_AUTH_CONNECT_V4_DISCARD: + case FWPS_LAYER_ALE_AUTH_CONNECT_V6: + case FWPS_LAYER_ALE_AUTH_CONNECT_V6_DISCARD: + { + if(pConditionKey == &FWPM_CONDITION_ALE_APP_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_CONNECT_V4_ALE_APP_ID].value); + else if(pConditionKey == &FWPM_CONDITION_ALE_USER_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_CONNECT_V4_ALE_USER_ID].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_ADDRESS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_CONNECT_V4_IP_LOCAL_ADDRESS].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_ADDRESS_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_CONNECT_V4_IP_LOCAL_ADDRESS_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_PORT) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_CONNECT_V4_IP_LOCAL_PORT].value); + else if(pConditionKey == &FWPM_CONDITION_IP_PROTOCOL) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_CONNECT_V4_IP_PROTOCOL].value); + else if(pConditionKey == &FWPM_CONDITION_IP_REMOTE_ADDRESS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_CONNECT_V4_IP_REMOTE_ADDRESS].value); + else if(pConditionKey == &FWPM_CONDITION_IP_REMOTE_PORT) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_CONNECT_V4_IP_REMOTE_PORT].value); + else if(pConditionKey == &FWPM_CONDITION_ALE_REMOTE_USER_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_CONNECT_V4_ALE_REMOTE_USER_ID].value); + else if(pConditionKey == &FWPM_CONDITION_ALE_REMOTE_MACHINE_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_CONNECT_V4_ALE_REMOTE_MACHINE_ID].value); + else if(pConditionKey == &FWPM_CONDITION_IP_DESTINATION_ADDRESS_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_CONNECT_V4_IP_DESTINATION_ADDRESS_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_INTERFACE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_CONNECT_V4_IP_LOCAL_INTERFACE].value); + else if(pConditionKey == &FWPM_CONDITION_FLAGS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_CONNECT_V4_FLAGS].value); + else if(pConditionKey == &FWPM_CONDITION_INTERFACE_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_CONNECT_V4_INTERFACE_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_TUNNEL_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_CONNECT_V4_TUNNEL_TYPE].value); + +#if(NTDDI_VERSION >= NTDDI_VISTASP1) + + else if(pConditionKey == &FWPM_CONDITION_INTERFACE_INDEX) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_CONNECT_V4_INTERFACE_INDEX].value); + else if(pConditionKey == &FWPM_CONDITION_SUB_INTERFACE_INDEX) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_CONNECT_V4_SUB_INTERFACE_INDEX].value); + +#if(NTDDI_VERSION >= NTDDI_WIN7) + + else if(pConditionKey == &FWPM_CONDITION_IP_ARRIVAL_INTERFACE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_CONNECT_V4_IP_ARRIVAL_INTERFACE].value); + else if(pConditionKey == &FWPM_CONDITION_ARRIVAL_INTERFACE_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_CONNECT_V4_ARRIVAL_INTERFACE_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_ARRIVAL_TUNNEL_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_CONNECT_V4_ARRIVAL_TUNNEL_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_ARRIVAL_INTERFACE_INDEX) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_CONNECT_V4_ARRIVAL_INTERFACE_INDEX].value); + else if(pConditionKey == &FWPM_CONDITION_NEXTHOP_SUB_INTERFACE_INDEX) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_CONNECT_V4_NEXTHOP_SUB_INTERFACE_INDEX].value); + else if(pConditionKey == &FWPM_CONDITION_IP_NEXTHOP_INTERFACE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_CONNECT_V4_IP_NEXTHOP_INTERFACE].value); + else if(pConditionKey == &FWPM_CONDITION_NEXTHOP_INTERFACE_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_CONNECT_V4_NEXTHOP_INTERFACE_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_NEXTHOP_TUNNEL_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_CONNECT_V4_NEXTHOP_TUNNEL_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_NEXTHOP_INTERFACE_INDEX) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_CONNECT_V4_NEXTHOP_INTERFACE_INDEX].value); + else if(pConditionKey == &FWPM_CONDITION_ORIGINAL_PROFILE_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_CONNECT_V4_ORIGINAL_PROFILE_ID].value); + else if(pConditionKey == &FWPM_CONDITION_CURRENT_PROFILE_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_CONNECT_V4_CURRENT_PROFILE_ID].value); + else if(pConditionKey == &FWPM_CONDITION_REAUTHORIZE_REASON) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_CONNECT_V4_REAUTHORIZE_REASON].value); + else if(pConditionKey == &FWPM_CONDITION_PEER_NAME) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_CONNECT_V4_PEER_NAME].value); + else if(pConditionKey == &FWPM_CONDITION_ORIGINAL_ICMP_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_CONNECT_V4_ORIGINAL_ICMP_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_INTERFACE_QUARANTINE_EPOCH) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_CONNECT_V4_INTERFACE_QUARANTINE_EPOCH].value); + +#if(NTDDI_VERSION >= NTDDI_WIN8) + + else if(pConditionKey == &FWPM_CONDITION_ALE_ORIGINAL_APP_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_CONNECT_V4_ALE_ORIGINAL_APP_ID].value); + else if(pConditionKey == &FWPM_CONDITION_ALE_PACKAGE_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_CONNECT_V4_ALE_PACKAGE_ID].value); + +#if(NTDDI_VERSION >= NTDDI_WINTHRESHOLD) + + else if(pConditionKey == &FWPM_CONDITION_ALE_SECURITY_ATTRIBUTE_FQBN_VALUE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_AUTH_CONNECT_V4_ALE_SECURITY_ATTRIBUTE_FQBN_VALUE].value); + +#endif /// (NTDDI_VERSION >= NTDDI_WINTHRESHOLD) +#endif /// (NTDDI_VERSION >= NTDDI_WIN8) +#endif /// (NTDDI_VERSION >= NTDDI_WIN7) +#endif /// (NTDDI_VERSION >= NTDDI_VISTASP1) + + break; + } + case FWPS_LAYER_ALE_FLOW_ESTABLISHED_V4: + case FWPS_LAYER_ALE_FLOW_ESTABLISHED_V4_DISCARD: + case FWPS_LAYER_ALE_FLOW_ESTABLISHED_V6: + case FWPS_LAYER_ALE_FLOW_ESTABLISHED_V6_DISCARD: + { + if(pConditionKey == &FWPM_CONDITION_ALE_APP_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_FLOW_ESTABLISHED_V4_ALE_APP_ID].value); + else if(pConditionKey == &FWPM_CONDITION_ALE_USER_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_FLOW_ESTABLISHED_V4_ALE_USER_ID].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_ADDRESS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_FLOW_ESTABLISHED_V4_IP_LOCAL_ADDRESS].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_ADDRESS_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_FLOW_ESTABLISHED_V4_IP_LOCAL_ADDRESS_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_PORT) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_FLOW_ESTABLISHED_V4_IP_LOCAL_PORT].value); + else if(pConditionKey == &FWPM_CONDITION_IP_PROTOCOL) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_FLOW_ESTABLISHED_V4_IP_PROTOCOL].value); + else if(pConditionKey == &FWPM_CONDITION_IP_REMOTE_ADDRESS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_FLOW_ESTABLISHED_V4_IP_REMOTE_ADDRESS].value); + else if(pConditionKey == &FWPM_CONDITION_IP_REMOTE_PORT) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_FLOW_ESTABLISHED_V4_IP_REMOTE_PORT].value); + else if(pConditionKey == &FWPM_CONDITION_ALE_REMOTE_USER_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_FLOW_ESTABLISHED_V4_ALE_REMOTE_USER_ID].value); + else if(pConditionKey == &FWPM_CONDITION_ALE_REMOTE_MACHINE_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_FLOW_ESTABLISHED_V4_ALE_REMOTE_MACHINE_ID].value); + else if(pConditionKey == &FWPM_CONDITION_IP_DESTINATION_ADDRESS_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_FLOW_ESTABLISHED_V4_IP_DESTINATION_ADDRESS_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_INTERFACE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_FLOW_ESTABLISHED_V4_IP_LOCAL_INTERFACE].value); + else if(pConditionKey == &FWPM_CONDITION_DIRECTION) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_FLOW_ESTABLISHED_V4_DIRECTION].value); + else if(pConditionKey == &FWPM_CONDITION_INTERFACE_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_FLOW_ESTABLISHED_V4_INTERFACE_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_TUNNEL_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_FLOW_ESTABLISHED_V4_TUNNEL_TYPE].value); + +#if(NTDDI_VERSION >= NTDDI_VISTASP1) + + else if(pConditionKey == &FWPM_CONDITION_FLAGS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_FLOW_ESTABLISHED_V4_FLAGS].value); + +#if(NTDDI_VERSION >= NTDDI_WIN8) + + else if(pConditionKey == &FWPM_CONDITION_ALE_ORIGINAL_APP_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_FLOW_ESTABLISHED_V4_ALE_ORIGINAL_APP_ID].value); + else if(pConditionKey == &FWPM_CONDITION_ALE_PACKAGE_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_FLOW_ESTABLISHED_V4_ALE_PACKAGE_ID].value); + +#if(NTDDI_VERSION >= NTDDI_WINTHRESHOLD) + + else if(pConditionKey == &FWPM_CONDITION_ALE_SECURITY_ATTRIBUTE_FQBN_VALUE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_FLOW_ESTABLISHED_V4_ALE_SECURITY_ATTRIBUTE_FQBN_VALUE].value); + +#endif /// (NTDDI_VERSION >= NTDDI_WINTHRESHOLD) +#endif /// (NTDDI_VERSION >= NTDDI_WIN8) +#endif /// (NTDDI_VERSION >= NTDDI_VISTASP1) + + break; + } + +#if(NTDDI_VERSION >= NTDDI_WIN7) + + case FWPS_LAYER_NAME_RESOLUTION_CACHE_V4: + case FWPS_LAYER_NAME_RESOLUTION_CACHE_V6: + { + if(pConditionKey == &FWPM_CONDITION_ALE_USER_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_NAME_RESOLUTION_CACHE_V4_ALE_USER_ID].value); + else if(pConditionKey == &FWPM_CONDITION_ALE_APP_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_NAME_RESOLUTION_CACHE_V4_ALE_APP_ID].value); + else if(pConditionKey == &FWPM_CONDITION_IP_REMOTE_ADDRESS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_NAME_RESOLUTION_CACHE_V4_IP_REMOTE_ADDRESS].value); + else if(pConditionKey == &FWPM_CONDITION_PEER_NAME) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_NAME_RESOLUTION_CACHE_V4_PEER_NAME].value); + + break; + } + case FWPS_LAYER_ALE_RESOURCE_RELEASE_V4: + case FWPS_LAYER_ALE_RESOURCE_RELEASE_V6: + { + if(pConditionKey == &FWPM_CONDITION_ALE_APP_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_RESOURCE_RELEASE_V4_ALE_APP_ID].value); + else if(pConditionKey == &FWPM_CONDITION_ALE_USER_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_RESOURCE_RELEASE_V4_ALE_USER_ID].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_ADDRESS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_RESOURCE_RELEASE_V4_IP_LOCAL_ADDRESS].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_ADDRESS_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_RESOURCE_RELEASE_V4_IP_LOCAL_ADDRESS_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_PORT) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_RESOURCE_RELEASE_V4_IP_LOCAL_PORT].value); + else if(pConditionKey == &FWPM_CONDITION_IP_PROTOCOL) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_RESOURCE_RELEASE_V4_IP_PROTOCOL].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_INTERFACE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_RESOURCE_RELEASE_V4_IP_LOCAL_INTERFACE].value); + else if(pConditionKey == &FWPM_CONDITION_FLAGS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_RESOURCE_RELEASE_V4_FLAGS].value); + +#if(NTDDI_VERSION >= NTDDI_WIN8) + + else if(pConditionKey == &FWPM_CONDITION_ALE_PACKAGE_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_RESOURCE_RELEASE_V4_ALE_PACKAGE_ID].value); + +#if(NTDDI_VERSION >= NTDDI_WINTHRESHOLD) + + else if(pConditionKey == &FWPM_CONDITION_ALE_SECURITY_ATTRIBUTE_FQBN_VALUE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_RESOURCE_RELEASE_V4_ALE_SECURITY_ATTRIBUTE_FQBN_VALUE].value); + +#endif /// (NTDDI_VERSION >= NTDDI_WINTHRESHOLD) +#endif /// (NTDDI_VERSION >= NTDDI_WIN8) + + break; + } + case FWPS_LAYER_ALE_ENDPOINT_CLOSURE_V4: + case FWPS_LAYER_ALE_ENDPOINT_CLOSURE_V6: + { + if(pConditionKey == &FWPM_CONDITION_ALE_APP_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_ENDPOINT_CLOSURE_V4_ALE_APP_ID].value); + else if(pConditionKey == &FWPM_CONDITION_ALE_USER_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_ENDPOINT_CLOSURE_V4_ALE_USER_ID].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_ADDRESS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_ENDPOINT_CLOSURE_V4_IP_LOCAL_ADDRESS].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_ADDRESS_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_ENDPOINT_CLOSURE_V4_IP_LOCAL_ADDRESS_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_PORT) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_ENDPOINT_CLOSURE_V4_IP_LOCAL_PORT].value); + else if(pConditionKey == &FWPM_CONDITION_IP_PROTOCOL) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_ENDPOINT_CLOSURE_V4_IP_PROTOCOL].value); + else if(pConditionKey == &FWPM_CONDITION_IP_REMOTE_ADDRESS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_ENDPOINT_CLOSURE_V4_IP_REMOTE_ADDRESS].value); + else if(pConditionKey == &FWPM_CONDITION_IP_REMOTE_PORT) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_ENDPOINT_CLOSURE_V4_IP_REMOTE_PORT].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_INTERFACE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_ENDPOINT_CLOSURE_V4_IP_LOCAL_INTERFACE].value); + else if(pConditionKey == &FWPM_CONDITION_FLAGS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_ENDPOINT_CLOSURE_V4_FLAGS].value); + +#if(NTDDI_VERSION >= NTDDI_WIN8) + + else if(pConditionKey == &FWPM_CONDITION_ALE_PACKAGE_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_ENDPOINT_CLOSURE_V4_ALE_PACKAGE_ID].value); + +#if(NTDDI_VERSION >= NTDDI_WINTHRESHOLD) + + else if(pConditionKey == &FWPM_CONDITION_ALE_SECURITY_ATTRIBUTE_FQBN_VALUE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_ENDPOINT_CLOSURE_V4_ALE_SECURITY_ATTRIBUTE_FQBN_VALUE].value); + +#endif /// (NTDDI_VERSION >= NTDDI_WINTHRESHOLD) +#endif /// (NTDDI_VERSION >= NTDDI_WIN8) + + break; + } + case FWPS_LAYER_ALE_CONNECT_REDIRECT_V4: + case FWPS_LAYER_ALE_CONNECT_REDIRECT_V6: + { + if(pConditionKey == &FWPM_CONDITION_ALE_APP_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_CONNECT_REDIRECT_V4_ALE_APP_ID].value); + else if(pConditionKey == &FWPM_CONDITION_ALE_USER_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_CONNECT_REDIRECT_V4_ALE_USER_ID].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_ADDRESS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_CONNECT_REDIRECT_V4_IP_LOCAL_ADDRESS].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_ADDRESS_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_CONNECT_REDIRECT_V4_IP_LOCAL_ADDRESS_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_PORT) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_CONNECT_REDIRECT_V4_IP_LOCAL_PORT].value); + else if(pConditionKey == &FWPM_CONDITION_IP_PROTOCOL) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_CONNECT_REDIRECT_V4_IP_PROTOCOL].value); + else if(pConditionKey == &FWPM_CONDITION_IP_REMOTE_ADDRESS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_CONNECT_REDIRECT_V4_IP_REMOTE_ADDRESS].value); + else if(pConditionKey == &FWPM_CONDITION_IP_DESTINATION_ADDRESS_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_CONNECT_REDIRECT_V4_IP_DESTINATION_ADDRESS_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_IP_REMOTE_PORT) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_CONNECT_REDIRECT_V4_IP_REMOTE_PORT].value); + else if(pConditionKey == &FWPM_CONDITION_FLAGS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_CONNECT_REDIRECT_V4_FLAGS].value); + +#if(NTDDI_VERSION >= NTDDI_WIN8) + + else if(pConditionKey == &FWPM_CONDITION_ALE_ORIGINAL_APP_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_CONNECT_REDIRECT_V4_ALE_ORIGINAL_APP_ID].value); + else if(pConditionKey == &FWPM_CONDITION_ALE_PACKAGE_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_CONNECT_REDIRECT_V4_ALE_PACKAGE_ID].value); + +#if(NTDDI_VERSION >= NTDDI_WINTHRESHOLD) + + else if(pConditionKey == &FWPM_CONDITION_ALE_SECURITY_ATTRIBUTE_FQBN_VALUE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_CONNECT_REDIRECT_V4_ALE_SECURITY_ATTRIBUTE_FQBN_VALUE].value); + +#endif /// (NTDDI_VERSION >= NTDDI_WINTHRESHOLD) +#endif /// (NTDDI_VERSION >= NTDDI_WIN8) + + break; + } + case FWPS_LAYER_ALE_BIND_REDIRECT_V4: + case FWPS_LAYER_ALE_BIND_REDIRECT_V6: + { + if(pConditionKey == &FWPM_CONDITION_ALE_APP_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_BIND_REDIRECT_V4_ALE_APP_ID].value); + else if(pConditionKey == &FWPM_CONDITION_ALE_USER_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_BIND_REDIRECT_V4_ALE_USER_ID].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_ADDRESS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_BIND_REDIRECT_V4_IP_LOCAL_ADDRESS].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_ADDRESS_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_BIND_REDIRECT_V4_IP_LOCAL_ADDRESS_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_PORT) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_BIND_REDIRECT_V4_IP_LOCAL_PORT].value); + else if(pConditionKey == &FWPM_CONDITION_IP_PROTOCOL) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_BIND_REDIRECT_V4_IP_PROTOCOL].value); + else if(pConditionKey == &FWPM_CONDITION_FLAGS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_BIND_REDIRECT_V4_FLAGS].value); + +#if(NTDDI_VERSION >= NTDDI_WIN8) + + else if(pConditionKey == &FWPM_CONDITION_ALE_PACKAGE_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_BIND_REDIRECT_V4_ALE_PACKAGE_ID].value); + +#if(NTDDI_VERSION >= NTDDI_WINTHRESHOLD) + + else if(pConditionKey == &FWPM_CONDITION_ALE_SECURITY_ATTRIBUTE_FQBN_VALUE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_ALE_BIND_REDIRECT_V4_ALE_SECURITY_ATTRIBUTE_FQBN_VALUE].value); + +#endif /// (NTDDI_VERSION >= NTDDI_WINTHRESHOLD) +#endif /// (NTDDI_VERSION >= NTDDI_WIN8) + + break; + } + case FWPS_LAYER_STREAM_PACKET_V4: + case FWPS_LAYER_STREAM_PACKET_V6: + { + if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_ADDRESS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_STREAM_PACKET_V4_IP_LOCAL_ADDRESS].value); + else if(pConditionKey == &FWPM_CONDITION_IP_REMOTE_ADDRESS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_STREAM_PACKET_V4_IP_REMOTE_ADDRESS].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_PORT) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_STREAM_PACKET_V4_IP_LOCAL_PORT].value); + else if(pConditionKey == &FWPM_CONDITION_IP_REMOTE_PORT) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_STREAM_PACKET_V4_IP_REMOTE_PORT].value); + else if(pConditionKey == &FWPM_CONDITION_IP_LOCAL_INTERFACE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_STREAM_PACKET_V4_IP_LOCAL_INTERFACE].value); + else if(pConditionKey == &FWPM_CONDITION_INTERFACE_INDEX) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_STREAM_PACKET_V4_INTERFACE_INDEX].value); + else if(pConditionKey == &FWPM_CONDITION_SUB_INTERFACE_INDEX) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_STREAM_PACKET_V4_SUB_INTERFACE_INDEX].value); + else if(pConditionKey == &FWPM_CONDITION_DIRECTION) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_STREAM_PACKET_V4_DIRECTION].value); + else if(pConditionKey == &FWPM_CONDITION_FLAGS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_STREAM_PACKET_V4_FLAGS].value); + else if(pConditionKey == &FWPM_CONDITION_INTERFACE_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_STREAM_PACKET_V4_INTERFACE_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_TUNNEL_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_STREAM_PACKET_V4_TUNNEL_TYPE].value); + + break; + } + +#if(NTDDI_VERSION >= NTDDI_WIN8) + + case FWPS_LAYER_INBOUND_MAC_FRAME_ETHERNET: + { + if(pConditionKey == &FWPM_CONDITION_INTERFACE_MAC_ADDRESS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_MAC_FRAME_ETHERNET_INTERFACE_MAC_ADDRESS].value); + else if(pConditionKey == &FWPM_CONDITION_MAC_LOCAL_ADDRESS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_MAC_FRAME_ETHERNET_MAC_LOCAL_ADDRESS].value); + else if(pConditionKey == &FWPM_CONDITION_MAC_REMOTE_ADDRESS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_MAC_FRAME_ETHERNET_MAC_REMOTE_ADDRESS].value); + else if(pConditionKey == &FWPM_CONDITION_MAC_LOCAL_ADDRESS_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_MAC_FRAME_ETHERNET_MAC_LOCAL_ADDRESS_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_MAC_REMOTE_ADDRESS_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_MAC_FRAME_ETHERNET_MAC_REMOTE_ADDRESS_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_ETHER_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_MAC_FRAME_ETHERNET_ETHER_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_VLAN_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_MAC_FRAME_ETHERNET_VLAN_ID].value); + else if(pConditionKey == &FWPM_CONDITION_INTERFACE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_MAC_FRAME_ETHERNET_INTERFACE].value); + else if(pConditionKey == &FWPM_CONDITION_INTERFACE_INDEX) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_MAC_FRAME_ETHERNET_INTERFACE_INDEX].value); + else if(pConditionKey == &FWPM_CONDITION_NDIS_PORT) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_MAC_FRAME_ETHERNET_NDIS_PORT].value); + else if(pConditionKey == &FWPM_CONDITION_L2_FLAGS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_MAC_FRAME_ETHERNET_L2_FLAGS].value); + + break; + } + case FWPS_LAYER_OUTBOUND_MAC_FRAME_ETHERNET: + { + if(pConditionKey == &FWPM_CONDITION_INTERFACE_MAC_ADDRESS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_OUTBOUND_MAC_FRAME_ETHERNET_INTERFACE_MAC_ADDRESS].value); + else if(pConditionKey == &FWPM_CONDITION_MAC_LOCAL_ADDRESS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_OUTBOUND_MAC_FRAME_ETHERNET_MAC_LOCAL_ADDRESS].value); + else if(pConditionKey == &FWPM_CONDITION_MAC_REMOTE_ADDRESS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_OUTBOUND_MAC_FRAME_ETHERNET_MAC_REMOTE_ADDRESS].value); + else if(pConditionKey == &FWPM_CONDITION_MAC_LOCAL_ADDRESS_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_OUTBOUND_MAC_FRAME_ETHERNET_MAC_LOCAL_ADDRESS_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_MAC_REMOTE_ADDRESS_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_OUTBOUND_MAC_FRAME_ETHERNET_MAC_REMOTE_ADDRESS_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_ETHER_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_OUTBOUND_MAC_FRAME_ETHERNET_ETHER_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_VLAN_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_OUTBOUND_MAC_FRAME_ETHERNET_VLAN_ID].value); + else if(pConditionKey == &FWPM_CONDITION_INTERFACE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_OUTBOUND_MAC_FRAME_ETHERNET_INTERFACE].value); + else if(pConditionKey == &FWPM_CONDITION_INTERFACE_INDEX) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_OUTBOUND_MAC_FRAME_ETHERNET_INTERFACE_INDEX].value); + else if(pConditionKey == &FWPM_CONDITION_NDIS_PORT) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_OUTBOUND_MAC_FRAME_ETHERNET_NDIS_PORT].value); + else if(pConditionKey == &FWPM_CONDITION_L2_FLAGS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_OUTBOUND_MAC_FRAME_ETHERNET_L2_FLAGS].value); + + break; + } + case FWPS_LAYER_INBOUND_MAC_FRAME_NATIVE: + { + if(pConditionKey == &FWPM_CONDITION_NDIS_MEDIA_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_MAC_FRAME_NATIVE_NDIS_MEDIA_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_NDIS_PHYSICAL_MEDIA_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_MAC_FRAME_NATIVE_NDIS_PHYSICAL_MEDIA_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_INTERFACE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_MAC_FRAME_NATIVE_INTERFACE].value); + else if(pConditionKey == &FWPM_CONDITION_INTERFACE_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_MAC_FRAME_NATIVE_INTERFACE_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_INTERFACE_INDEX) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_MAC_FRAME_NATIVE_INTERFACE_INDEX].value); + else if(pConditionKey == &FWPM_CONDITION_NDIS_PORT) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_MAC_FRAME_NATIVE_NDIS_PORT].value); + else if(pConditionKey == &FWPM_CONDITION_L2_FLAGS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INBOUND_MAC_FRAME_NATIVE_L2_FLAGS].value); + + break; + } + case FWPS_LAYER_OUTBOUND_MAC_FRAME_NATIVE: + { + if(pConditionKey == &FWPM_CONDITION_NDIS_MEDIA_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_OUTBOUND_MAC_FRAME_NATIVE_NDIS_MEDIA_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_NDIS_PHYSICAL_MEDIA_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_OUTBOUND_MAC_FRAME_NATIVE_NDIS_PHYSICAL_MEDIA_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_INTERFACE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_OUTBOUND_MAC_FRAME_NATIVE_INTERFACE].value); + else if(pConditionKey == &FWPM_CONDITION_INTERFACE_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_OUTBOUND_MAC_FRAME_NATIVE_INTERFACE_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_INTERFACE_INDEX) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_OUTBOUND_MAC_FRAME_NATIVE_INTERFACE_INDEX].value); + else if(pConditionKey == &FWPM_CONDITION_NDIS_PORT) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_OUTBOUND_MAC_FRAME_NATIVE_NDIS_PORT].value); + else if(pConditionKey == &FWPM_CONDITION_L2_FLAGS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_OUTBOUND_MAC_FRAME_NATIVE_L2_FLAGS].value); + + break; + } + case FWPS_LAYER_INGRESS_VSWITCH_ETHERNET: + { + if(pConditionKey == &FWPM_CONDITION_MAC_SOURCE_ADDRESS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INGRESS_VSWITCH_ETHERNET_MAC_SOURCE_ADDRESS].value); + else if(pConditionKey == &FWPM_CONDITION_MAC_SOURCE_ADDRESS_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INGRESS_VSWITCH_ETHERNET_MAC_SOURCE_ADDRESS_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_MAC_DESTINATION_ADDRESS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INGRESS_VSWITCH_ETHERNET_MAC_DESTINATION_ADDRESS].value); + else if(pConditionKey == &FWPM_CONDITION_MAC_DESTINATION_ADDRESS_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INGRESS_VSWITCH_ETHERNET_MAC_DESTINATION_ADDRESS_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_ETHER_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INGRESS_VSWITCH_ETHERNET_ETHER_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_VLAN_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INGRESS_VSWITCH_ETHERNET_VLAN_ID].value); + else if(pConditionKey == &FWPM_CONDITION_VSWITCH_TENANT_NETWORK_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INGRESS_VSWITCH_ETHERNET_VSWITCH_TENANT_NETWORK_ID].value); + else if(pConditionKey == &FWPM_CONDITION_VSWITCH_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INGRESS_VSWITCH_ETHERNET_VSWITCH_ID].value); + else if(pConditionKey == &FWPM_CONDITION_VSWITCH_NETWORK_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INGRESS_VSWITCH_ETHERNET_VSWITCH_NETWORK_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_VSWITCH_SOURCE_INTERFACE_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INGRESS_VSWITCH_ETHERNET_VSWITCH_SOURCE_INTERFACE_ID].value); + else if(pConditionKey == &FWPM_CONDITION_VSWITCH_SOURCE_INTERFACE_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INGRESS_VSWITCH_ETHERNET_VSWITCH_SOURCE_INTERFACE_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_VSWITCH_SOURCE_VM_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INGRESS_VSWITCH_ETHERNET_VSWITCH_SOURCE_VM_ID].value); + else if(pConditionKey == &FWPM_CONDITION_L2_FLAGS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INGRESS_VSWITCH_ETHERNET_L2_FLAGS].value); + + break; + } + case FWPS_LAYER_EGRESS_VSWITCH_ETHERNET: + { + if(pConditionKey == &FWPM_CONDITION_MAC_SOURCE_ADDRESS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_EGRESS_VSWITCH_ETHERNET_MAC_SOURCE_ADDRESS].value); + else if(pConditionKey == &FWPM_CONDITION_MAC_SOURCE_ADDRESS_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_EGRESS_VSWITCH_ETHERNET_MAC_SOURCE_ADDRESS_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_MAC_DESTINATION_ADDRESS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_EGRESS_VSWITCH_ETHERNET_MAC_DESTINATION_ADDRESS].value); + else if(pConditionKey == &FWPM_CONDITION_MAC_DESTINATION_ADDRESS_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_EGRESS_VSWITCH_ETHERNET_MAC_DESTINATION_ADDRESS_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_ETHER_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_EGRESS_VSWITCH_ETHERNET_ETHER_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_VLAN_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_EGRESS_VSWITCH_ETHERNET_VLAN_ID].value); + else if(pConditionKey == &FWPM_CONDITION_VSWITCH_TENANT_NETWORK_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_EGRESS_VSWITCH_ETHERNET_VSWITCH_TENANT_NETWORK_ID].value); + else if(pConditionKey == &FWPM_CONDITION_VSWITCH_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_EGRESS_VSWITCH_ETHERNET_VSWITCH_ID].value); + else if(pConditionKey == &FWPM_CONDITION_VSWITCH_NETWORK_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_EGRESS_VSWITCH_ETHERNET_VSWITCH_NETWORK_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_VSWITCH_SOURCE_INTERFACE_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_EGRESS_VSWITCH_ETHERNET_VSWITCH_SOURCE_INTERFACE_ID].value); + else if(pConditionKey == &FWPM_CONDITION_VSWITCH_SOURCE_INTERFACE_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_EGRESS_VSWITCH_ETHERNET_VSWITCH_SOURCE_INTERFACE_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_VSWITCH_SOURCE_VM_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_EGRESS_VSWITCH_ETHERNET_VSWITCH_SOURCE_VM_ID].value); + else if(pConditionKey == &FWPM_CONDITION_VSWITCH_DESTINATION_INTERFACE_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_EGRESS_VSWITCH_ETHERNET_VSWITCH_DESTINATION_INTERFACE_ID].value); + else if(pConditionKey == &FWPM_CONDITION_VSWITCH_DESTINATION_INTERFACE_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_EGRESS_VSWITCH_ETHERNET_VSWITCH_DESTINATION_INTERFACE_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_VSWITCH_DESTINATION_VM_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_EGRESS_VSWITCH_ETHERNET_VSWITCH_DESTINATION_VM_ID].value); + else if(pConditionKey == &FWPM_CONDITION_L2_FLAGS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_EGRESS_VSWITCH_ETHERNET_L2_FLAGS].value); + + break; + } + case FWPS_LAYER_INGRESS_VSWITCH_TRANSPORT_V4: + case FWPS_LAYER_INGRESS_VSWITCH_TRANSPORT_V6: + { + if(pConditionKey == &FWPM_CONDITION_IP_SOURCE_ADDRESS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INGRESS_VSWITCH_TRANSPORT_V4_IP_SOURCE_ADDRESS].value); + else if(pConditionKey == &FWPM_CONDITION_IP_DESTINATION_ADDRESS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INGRESS_VSWITCH_TRANSPORT_V4_IP_DESTINATION_ADDRESS].value); + else if(pConditionKey == &FWPM_CONDITION_IP_PROTOCOL) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INGRESS_VSWITCH_TRANSPORT_V4_IP_PROTOCOL].value); + else if(pConditionKey == &FWPM_CONDITION_IP_SOURCE_PORT) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INGRESS_VSWITCH_TRANSPORT_V4_IP_SOURCE_PORT].value); + else if(pConditionKey == &FWPM_CONDITION_IP_DESTINATION_PORT) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INGRESS_VSWITCH_TRANSPORT_V4_IP_DESTINATION_PORT].value); + else if(pConditionKey == &FWPM_CONDITION_VLAN_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INGRESS_VSWITCH_TRANSPORT_V4_VLAN_ID].value); + else if(pConditionKey == &FWPM_CONDITION_VSWITCH_TENANT_NETWORK_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INGRESS_VSWITCH_TRANSPORT_V4_VSWITCH_TENANT_NETWORK_ID].value); + else if(pConditionKey == &FWPM_CONDITION_VSWITCH_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INGRESS_VSWITCH_TRANSPORT_V4_VSWITCH_ID].value); + else if(pConditionKey == &FWPM_CONDITION_VSWITCH_NETWORK_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INGRESS_VSWITCH_TRANSPORT_V4_VSWITCH_NETWORK_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_VSWITCH_SOURCE_INTERFACE_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INGRESS_VSWITCH_TRANSPORT_V4_VSWITCH_SOURCE_INTERFACE_ID].value); + else if(pConditionKey == &FWPM_CONDITION_VSWITCH_SOURCE_INTERFACE_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INGRESS_VSWITCH_TRANSPORT_V4_VSWITCH_SOURCE_INTERFACE_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_VSWITCH_SOURCE_VM_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INGRESS_VSWITCH_TRANSPORT_V4_VSWITCH_SOURCE_VM_ID].value); + else if(pConditionKey == &FWPM_CONDITION_L2_FLAGS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INGRESS_VSWITCH_TRANSPORT_V4_L2_FLAGS].value); + + break; + } + case FWPS_LAYER_EGRESS_VSWITCH_TRANSPORT_V4: + case FWPS_LAYER_EGRESS_VSWITCH_TRANSPORT_V6: + { + if(pConditionKey == &FWPM_CONDITION_IP_SOURCE_ADDRESS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INGRESS_VSWITCH_TRANSPORT_V4_IP_SOURCE_ADDRESS].value); + else if(pConditionKey == &FWPM_CONDITION_IP_DESTINATION_ADDRESS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INGRESS_VSWITCH_TRANSPORT_V4_IP_DESTINATION_ADDRESS].value); + else if(pConditionKey == &FWPM_CONDITION_IP_PROTOCOL) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INGRESS_VSWITCH_TRANSPORT_V4_IP_PROTOCOL].value); + else if(pConditionKey == &FWPM_CONDITION_IP_SOURCE_PORT) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INGRESS_VSWITCH_TRANSPORT_V4_IP_SOURCE_PORT].value); + else if(pConditionKey == &FWPM_CONDITION_IP_DESTINATION_PORT) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_INGRESS_VSWITCH_TRANSPORT_V4_IP_DESTINATION_PORT].value); + else if(pConditionKey == &FWPM_CONDITION_VLAN_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_EGRESS_VSWITCH_TRANSPORT_V4_VLAN_ID].value); + else if(pConditionKey == &FWPM_CONDITION_VSWITCH_TENANT_NETWORK_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_EGRESS_VSWITCH_TRANSPORT_V4_VSWITCH_TENANT_NETWORK_ID].value); + else if(pConditionKey == &FWPM_CONDITION_VSWITCH_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_EGRESS_VSWITCH_TRANSPORT_V4_VSWITCH_ID].value); + else if(pConditionKey == &FWPM_CONDITION_VSWITCH_NETWORK_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_EGRESS_VSWITCH_TRANSPORT_V4_VSWITCH_NETWORK_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_VSWITCH_SOURCE_INTERFACE_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_EGRESS_VSWITCH_TRANSPORT_V4_VSWITCH_SOURCE_INTERFACE_ID].value); + else if(pConditionKey == &FWPM_CONDITION_VSWITCH_SOURCE_INTERFACE_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_EGRESS_VSWITCH_TRANSPORT_V4_VSWITCH_SOURCE_INTERFACE_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_VSWITCH_SOURCE_VM_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_EGRESS_VSWITCH_TRANSPORT_V4_VSWITCH_SOURCE_VM_ID].value); + else if(pConditionKey == &FWPM_CONDITION_VSWITCH_DESTINATION_INTERFACE_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_EGRESS_VSWITCH_TRANSPORT_V4_VSWITCH_DESTINATION_INTERFACE_ID].value); + else if(pConditionKey == &FWPM_CONDITION_VSWITCH_DESTINATION_INTERFACE_TYPE) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_EGRESS_VSWITCH_TRANSPORT_V4_VSWITCH_DESTINATION_INTERFACE_TYPE].value); + else if(pConditionKey == &FWPM_CONDITION_VSWITCH_DESTINATION_VM_ID) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_EGRESS_VSWITCH_TRANSPORT_V4_VSWITCH_DESTINATION_VM_ID].value); + else if(pConditionKey == &FWPM_CONDITION_L2_FLAGS) + pValue = &(pClassifyValues->incomingValue[FWPS_FIELD_EGRESS_VSWITCH_TRANSPORT_V4_L2_FLAGS].value); + + break; + } + +#endif /// (NTDDI_VERSION >= NTDDI_WIN8) +#endif /// (NTDDI_VERSION >= NTDDI_WIN7) + + } + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpValueGetFromFwpsIncomingValues() [pValue: %#p]\n", + pValue); + +#endif /// DBG + + return pValue; +} + +/** + @kernel_helper_function="KrnlHlprFwpValuePurgeLocalCopy" + + Purpose: Cleanup a local copy of an FWP_VALUE. <br> + <br> + Notes: <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552450.aspx <br> +*/ +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +inline VOID KrnlHlprFwpValuePurgeLocalCopy(_Inout_ FWP_VALUE* pValue) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpValuePurgeLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(pValue); + + switch(pValue->type) + { + case FWP_UINT64: + { + HLPR_DELETE(pValue->uint64, + WFPSAMPLER_SYSLIB_TAG); + + break; + } + case FWP_INT64: + { + HLPR_DELETE(pValue->int64, + WFPSAMPLER_SYSLIB_TAG); + + break; + } + case FWP_DOUBLE: + { + HLPR_DELETE(pValue->double64, + WFPSAMPLER_SYSLIB_TAG); + + break; + } + case FWP_BYTE_ARRAY16_TYPE: + { + HLPR_DELETE(pValue->byteArray16, + WFPSAMPLER_SYSLIB_TAG); + + break; + } + case FWP_BYTE_BLOB_TYPE: + { + KrnlHlprFwpByteBlobDestroyLocalCopy(&(pValue->byteBlob)); + + break; + } + case FWP_SID: + { + HLPR_DELETE_ARRAY(pValue->sid, + WFPSAMPLER_SYSLIB_TAG); + + break; + } + case FWP_SECURITY_DESCRIPTOR_TYPE: + { + KrnlHlprFwpByteBlobDestroyLocalCopy(&(pValue->sd)); + + break; + } + case FWP_TOKEN_INFORMATION_TYPE: + { + KrnlHlprFwpTokenInformationDestroyLocalCopy(&(pValue->tokenInformation)); + + break; + } + case FWP_TOKEN_ACCESS_INFORMATION_TYPE: + { + KrnlHlprFwpByteBlobDestroyLocalCopy(&(pValue->tokenAccessInformation)); + + break; + } + case FWP_UNICODE_STRING_TYPE: + { + HLPR_DELETE_ARRAY(pValue->unicodeString, + WFPSAMPLER_SYSLIB_TAG); + + break; + } + +#if(NTDDI_VERSION >= NTDDI_WIN7) + + case FWP_BYTE_ARRAY6_TYPE: + { + HLPR_DELETE(pValue->byteArray6, + WFPSAMPLER_SYSLIB_TAG); + + break; + } + +#endif /// (NTDDI_VERSION >= NTDDI_WIN7) + + default: + { + pValue->uint64 = 0; + + break; + } + } + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpValuePurgeLocalCopy()\n"); + +#endif /// DBG + + return; +} + +/** + @kernel_helper_function="KrnlHlprFwpValueDestroyLocalCopy" + + Purpose: Cleanup and free a local copy of an FWP_VALUE. <br> + <br> + Notes: <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552450.aspx <br> +*/ +_At_(*ppValue, _Pre_ _Notnull_) +_At_(*ppValue, _Post_ _Null_ __drv_freesMem(Pool)) +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Success_(*ppValue == 0) +inline VOID KrnlHlprFwpValueDestroyLocalCopy(_Inout_ FWP_VALUE** ppValue) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpValueDestroyLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(ppValue); + + if(*ppValue) + KrnlHlprFwpValuePurgeLocalCopy(*ppValue); + + HLPR_DELETE(*ppValue, + WFPSAMPLER_SYSLIB_TAG); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpValueDestroyLocalCopy()\n"); + +#endif /// DBG + + return; +} + +/** + @kernel_helper_function="KrnlHlprFwpValuePopulateLocalCopy" + + Purpose: Populate a local copy of an FWP_VALUE. <br> + <br> + Notes: The caller is responsible for freeing any allocated memory using + KrnlHlprFwpValuePurgeLocalCopy(). <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552450.aspx <br> +*/ +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Check_return_ +_Success_(return == STATUS_SUCCESS) +NTSTATUS KrnlHlprFwpValuePopulateLocalCopy(_In_ const FWP_VALUE* pOriginalValue, + _Inout_ FWP_VALUE* pValue) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpValuePopulateLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(pOriginalValue); + NT_ASSERT(pValue); + + NTSTATUS status = STATUS_SUCCESS; + KIRQL irql = KeGetCurrentIrql(); + + pValue->type = pOriginalValue->type; + + switch(pValue->type) + { + case FWP_UINT64: + { + HLPR_NEW(pValue->uint64, + UINT64, + WFPSAMPLER_SYSLIB_TAG); + HLPR_BAIL_ON_ALLOC_FAILURE(pValue->uint64, + status); + + RtlCopyMemory(pValue->uint64, + pOriginalValue->uint64, + sizeof(UINT64)); + + break; + } + case FWP_INT64: + { + HLPR_NEW(pValue->int64, + INT64, + WFPSAMPLER_SYSLIB_TAG); + HLPR_BAIL_ON_ALLOC_FAILURE(pValue->int64, + status); + + RtlCopyMemory(pValue->int64, + pOriginalValue->int64, + sizeof(INT64)); + + break; + } + case FWP_DOUBLE: + { + HLPR_NEW(pValue->double64, + double, + WFPSAMPLER_SYSLIB_TAG); + HLPR_BAIL_ON_ALLOC_FAILURE(pValue->double64, + status); + + RtlCopyMemory(pValue->double64, + pOriginalValue->double64, + sizeof(double)); + + break; + } + case FWP_BYTE_ARRAY16_TYPE: + { + HLPR_NEW(pValue->byteArray16, + FWP_BYTE_ARRAY16, + WFPSAMPLER_SYSLIB_TAG); + HLPR_BAIL_ON_ALLOC_FAILURE(pValue->byteArray16, + status); + + RtlCopyMemory(pValue->byteArray16, + pOriginalValue->byteArray16, + sizeof(FWP_BYTE_ARRAY16)); + + break; + } + case FWP_BYTE_BLOB_TYPE: + { + pValue->byteBlob = KrnlHlprFwpByteBlobCreateLocalCopy(pOriginalValue->byteBlob); + HLPR_BAIL_ON_ALLOC_FAILURE(pValue->byteBlob, + status); + + break; + } + case FWP_SID: + { + HLPR_DELETE_ARRAY(pValue->sid, + WFPSAMPLER_SYSLIB_TAG); + + break; + } + case FWP_SECURITY_DESCRIPTOR_TYPE: + { + pValue->sd = KrnlHlprFwpByteBlobCreateLocalCopy(pOriginalValue->sd); + HLPR_BAIL_ON_ALLOC_FAILURE(pValue->sd, + status); + break; + } + case FWP_TOKEN_INFORMATION_TYPE: + { + pValue->tokenInformation = KrnlHlprFwpTokenInformationCreateLocalCopy(pOriginalValue->tokenInformation); + HLPR_BAIL_ON_ALLOC_FAILURE(pValue->tokenInformation, + status); + + break; + } + case FWP_TOKEN_ACCESS_INFORMATION_TYPE: + { + pValue->tokenAccessInformation = KrnlHlprFwpByteBlobCreateLocalCopy(pOriginalValue->tokenAccessInformation); + HLPR_BAIL_ON_ALLOC_FAILURE(pValue->tokenAccessInformation, + status); + + break; + } + case FWP_UNICODE_STRING_TYPE: + { + size_t stringSize = 0; + + if(irql == PASSIVE_LEVEL) + { + status = RtlStringCchLengthW(pOriginalValue->unicodeString, + NTSTRSAFE_MAX_CCH, + &stringSize); + HLPR_BAIL_ON_FAILURE(status); + } + else + stringSize = wcslen(pOriginalValue->unicodeString); + + if(stringSize) + { + HLPR_NEW_ARRAY(pValue->unicodeString, + WCHAR, + stringSize + 1, /// add space for '\0' + WFPSAMPLER_SYSLIB_TAG); + HLPR_BAIL_ON_ALLOC_FAILURE(pValue->unicodeString, + status); + +#pragma warning(push) +#pragma warning(disable: 26018) /// buffers are contrained by stringSize + + RtlCopyMemory(pValue->unicodeString, + pOriginalValue->unicodeString, + stringSize * sizeof(WCHAR)); + + pValue->unicodeString[stringSize] = L'\0'; + +#pragma warning(pop) + } + else + { + status = STATUS_INVALID_BUFFER_SIZE; + + HLPR_BAIL; + } + + break; + } + +#if(NTDDI_VERSION >= NTDDI_WIN7) + + case FWP_BYTE_ARRAY6_TYPE: + { + HLPR_NEW(pValue->byteArray6, + FWP_BYTE_ARRAY6, + WFPSAMPLER_SYSLIB_TAG); + HLPR_BAIL_ON_ALLOC_FAILURE(pValue->byteArray6, + status); + + RtlCopyMemory(pValue->byteArray6, + pOriginalValue->byteArray6, + sizeof(FWP_BYTE_ARRAY6)); + + break; + } + +#endif /// (NTDDI_VERSION >= NTDDI_WIN7) + + default: + { + /// this is a straight value copy so it's safe to use the largest static space + pValue->uint64 = pOriginalValue->uint64; + + break; + } + } + + HLPR_BAIL_LABEL: + + if(status != STATUS_SUCCESS) + KrnlHlprFwpValuePurgeLocalCopy(pValue); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpValuePopulateLocalCopy() [status: %#x]\n", + status); + +#endif /// DBG + + return status; +} + +/** + @kernel_helper_function="KrnlHlprFwpValueCreateLocalCopy" + + Purpose: Allocate and populate a local copy of an FWP_VALUE. <br> + <br> + Notes: The caller is responsible for freeing the allocated memory using + KrnlHlprFwpValueDestroyLocalCopy(). <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552450.aspx <br> +*/ +__drv_allocatesMem(Pool) +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Must_inspect_result_ +_Success_(return != 0) +FWP_VALUE* KrnlHlprFwpValueCreateLocalCopy(_In_ const FWP_VALUE* pOriginalValue) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpValueCreateLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(pOriginalValue); + + NTSTATUS status = STATUS_SUCCESS; + FWP_VALUE* pValue = 0; + +#pragma warning(push) +#pragma warning(disable: 6014) /// pValue is expected to be cleaned up by caller using KrnlHlprFwpValueDestroyLocalCopy + + HLPR_NEW(pValue, + FWP_VALUE, + WFPSAMPLER_SYSLIB_TAG); + HLPR_BAIL_ON_ALLOC_FAILURE(pValue, + status); + +#pragma warning(pop) + + status = KrnlHlprFwpValuePopulateLocalCopy(pOriginalValue, + pValue); + + HLPR_BAIL_LABEL: + +#pragma warning(push) +#pragma warning(disable: 6001) /// pValue initialized with call to HLPR_NEW & KrnlHlprFwpValuePopulateLocalCopy + + if(status != STATUS_SUCCESS && + pValue) + KrnlHlprFwpValueDestroyLocalCopy(&pValue); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpValueCreateLocalCopy() [pValue: %#p]\n", + pValue); + +#endif /// DBG + + return pValue; + +#pragma warning(pop) +} + +#endif /// FWP_VALUE____ + +#ifndef FWP_V4_ADDR_AND_MASK____ +#define FWP_V4_ADDR_AND_MASK____ + +/** + @kernel_helper_function="KrnlHlprFwpV4AddrAndMaskPurgeLocalCopy" + + Purpose: Cleanup a local copy of an FWP_V4_ADDR_AND_MASK. <br> + <br> + Notes: <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552441.aspx <br> +*/ +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +inline VOID KrnlHlprFwpV4AddrAndMaskPurgeLocalCopy(_Inout_ FWP_V4_ADDR_AND_MASK* pAddrMask) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpV4AddrAndMaskPurgeLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(pAddrMask); + + RtlZeroMemory(pAddrMask, + sizeof(FWP_V4_ADDR_AND_MASK)); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpV4AddrAndMaskPurgeLocalCopy()\n"); + +#endif /// DBG + + return; +} + +/** + @kernel_helper_function="KrnlHlprFwpV4AddrAndMaskDestroyLocalCopy" + + Purpose: Cleanup and free a local copy of an FWP_V4_ADDR_AND_MASK. <br> + <br> + Notes: <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552441.aspx <br> +*/ +_At_(*ppAddrMask, _Pre_ _Notnull_) +_At_(*ppAddrMask, _Post_ _Null_ __drv_freesMem(Pool)) +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Success_(*ppAddrMask == 0) +inline VOID KrnlHlprFwpV4AddrAndMaskDestroyLocalCopy(_Inout_ FWP_V4_ADDR_AND_MASK** ppAddrMask) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpV4AddrAndMaskDestroyLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(ppAddrMask); + + if(*ppAddrMask) + KrnlHlprFwpV4AddrAndMaskPurgeLocalCopy(*ppAddrMask); + + HLPR_DELETE(*ppAddrMask, + WFPSAMPLER_SYSLIB_TAG); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpV4AddrAndMaskDestroyLocalCopy()\n"); + +#endif /// DBG + + return; +} + +/** + @kernel_helper_function="KrnlHlprFwpV4AddrAndMaskPopulateLocalCopy" + + Purpose: Populate a local copy of an FWP_V4_ADDR_AND_MASK. <br> + <br> + Notes: The caller is responsible for freeing the allocated memory using + KrnlHlprFwpV4AddrMaskPurgeLocalCopy(). <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552441.aspx <br> +*/ +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Check_return_ +_Success_(return == STATUS_SUCCESS) +NTSTATUS KrnlHlprFwpV4AddrAndMaskPopulateLocalCopy(_In_ const FWP_V4_ADDR_AND_MASK* pOriginalAddrMask, + _Inout_ FWP_V4_ADDR_AND_MASK* pAddrMask) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpV4AddrAndMaskPopulateLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(pOriginalAddrMask); + NT_ASSERT(pAddrMask); + + NTSTATUS status = STATUS_SUCCESS; + + pAddrMask->addr = pOriginalAddrMask->addr; + pAddrMask->mask = pOriginalAddrMask->mask; + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpV4AddrAndMaskPopulateLocalCopy() [status: %#x]\n", + status); + +#endif /// DBG + + return status; +} + +/** + @kernel_helper_function="KrnlHlprFwpV4AddrAndMaskCreateLocalCopy" + + Purpose: Allocate and populate a local copy of an FWP_V4_ADDR_AND_MASK. <br> + <br> + Notes: The caller is responsible for freeing the allocated memory using + KrnlHlprFwpV4AddrMaskDestroyLocalCopy(). <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552441.aspx <br> +*/ +__drv_allocatesMem(Pool) +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Must_inspect_result_ +_Success_(return != 0) +FWP_V4_ADDR_AND_MASK* KrnlHlprFwpV4AddrAndMaskCreateLocalCopy(_In_ const FWP_V4_ADDR_AND_MASK* pOriginalAddrMask) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpV4AddrAndMaskCreateLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(pOriginalAddrMask); + + NTSTATUS status = STATUS_SUCCESS; + FWP_V4_ADDR_AND_MASK* pAddrMask = 0; + +#pragma warning(push) +#pragma warning(disable: 6014) /// pAddrMask is expected to be cleaned up by caller using KrnlHlprFwpV4AddrAndMaskDestroyLocalCopy + + HLPR_NEW(pAddrMask, + FWP_V4_ADDR_AND_MASK, + WFPSAMPLER_SYSLIB_TAG); + HLPR_BAIL_ON_ALLOC_FAILURE(pAddrMask, + status); + +#pragma warning(pop) + + status = KrnlHlprFwpV4AddrAndMaskPopulateLocalCopy(pOriginalAddrMask, + pAddrMask); + + HLPR_BAIL_LABEL: + +#pragma warning(push) +#pragma warning(disable: 6001) /// pAddrMask initialized with call to HLPR_NEW & KrnlHlprFwpV4AddrAndMaskPopulateLocalCopy + + if(status != STATUS_SUCCESS && + pAddrMask) + KrnlHlprFwpV4AddrAndMaskDestroyLocalCopy(&pAddrMask); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpV4AddrAndMaskCreateLocalCopy() [pAddrMask: %#p]\n", + pAddrMask); + +#endif /// DBG + + return pAddrMask; + +#pragma warning(pop) +} + +#endif /// FWP_V4_ADDR_AND_MASK____ + +#ifndef FWP_V6_ADDR_AND_MASK____ +#define FWP_V6_ADDR_AND_MASK____ + +/** + @kernel_helper_function="KrnlHlprFwpV6AddrAndMaskPurgeLocalCopy" + + Purpose: Cleanup a local copy of an FWP_V6_ADDR_AND_MASK. <br> + <br> + Notes: <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552446.aspx <br> +*/ +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +inline VOID KrnlHlprFwpV6AddrAndMaskPurgeLocalCopy(_Inout_ FWP_V6_ADDR_AND_MASK* pAddrMask) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpV6AddrAndMaskPurgeLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(pAddrMask); + + RtlZeroMemory(pAddrMask, + sizeof(FWP_V6_ADDR_AND_MASK)); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpV6AddrAndMaskPurgeLocalCopy()\n"); + +#endif /// DBG + + return; +} + +/** + @kernel_helper_function="KrnlHlprFwpV6AddrAndMaskDestroyLocalCopy" + + Purpose: Cleanup and free a local copy of an FWP_V6_ADDR_AND_MASK. <br> + <br> + Notes: <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552446.aspx <br> +*/ +_At_(*ppAddrMask, _Pre_ _Notnull_) +_At_(*ppAddrMask, _Post_ _Null_ __drv_freesMem(Pool)) +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Success_(*ppAddrMask == 0) +inline VOID KrnlHlprFwpV6AddrAndMaskDestroyLocalCopy(_Inout_ FWP_V6_ADDR_AND_MASK** ppAddrMask) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpV6AddrAndMaskDestroyLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(ppAddrMask); + + if(*ppAddrMask) + KrnlHlprFwpV6AddrAndMaskPurgeLocalCopy(*ppAddrMask); + + HLPR_DELETE(*ppAddrMask, + WFPSAMPLER_SYSLIB_TAG); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpV6AddrAndMaskDestroyLocalCopy()\n"); + +#endif /// DBG + + return; +} + +/** + @kernel_helper_function="KrnlHlprFwpV6AddrAndMaskPopulateLocalCopy" + + Purpose: Populate a local copy of an FWP_V6_ADDR_AND_MASK. <br> + <br> + Notes: The caller is responsible for freeing the allocated memory using + KrnlHlprFwpV6AddrMaskPurgeLocalCopy(). <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552446.aspx <br> +*/ +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Check_return_ +_Success_(return == STATUS_SUCCESS) +NTSTATUS KrnlHlprFwpV6AddrAndMaskPopulateLocalCopy(_In_ const FWP_V6_ADDR_AND_MASK* pOriginalAddrMask, + _Inout_ FWP_V6_ADDR_AND_MASK* pAddrMask) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpV6AddrAndMaskPopulateLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(pOriginalAddrMask); + NT_ASSERT(pAddrMask); + + NTSTATUS status = STATUS_SUCCESS; + + RtlCopyMemory(pAddrMask->addr, + pOriginalAddrMask->addr, + FWP_V6_ADDR_SIZE); + + pAddrMask->prefixLength = pOriginalAddrMask->prefixLength; + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpV6AddrAndMaskPopulateLocalCopy() [status: %#x]\n", + status); + +#endif /// DBG + + return status; +} + +/** + @kernel_helper_function="KrnlHlprFwpV6AddrAndMaskCreateLocalCopy" + + Purpose: Allocate and populate a local copy of an FWP_V6_ADDR_AND_MASK. <br> + <br> + Notes: The caller is responsible for freeing the allocated memory using + KrnlHlprFwpV6AddrMaskDestroyLocalCopy(). <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552446.aspx <br> +*/ +__drv_allocatesMem(Pool) +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Must_inspect_result_ +_Success_(return != 0) +FWP_V6_ADDR_AND_MASK* KrnlHlprFwpV6AddrAndMaskCreateLocalCopy(_In_ const FWP_V6_ADDR_AND_MASK* pOriginalAddrMask) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpV6AddrAndMaskCreateLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(pOriginalAddrMask); + + NTSTATUS status = STATUS_SUCCESS; + FWP_V6_ADDR_AND_MASK* pAddrMask = 0; + +#pragma warning(push) +#pragma warning(disable: 6014) /// pAddrMask is expected to be cleaned up by caller using KrnlHlprFwpV6AddrAndMaskDestroyLocalCopy + + HLPR_NEW(pAddrMask, + FWP_V6_ADDR_AND_MASK, + WFPSAMPLER_SYSLIB_TAG); + HLPR_BAIL_ON_ALLOC_FAILURE(pAddrMask, + status); + +#pragma warning(pop) + + status = KrnlHlprFwpV6AddrAndMaskPopulateLocalCopy(pOriginalAddrMask, + pAddrMask); + + HLPR_BAIL_LABEL: + +#pragma warning(push) +#pragma warning(disable: 6001) /// pAddrMask initialized with call to HLPR_NEW & KrnlHlprFwpV6AddrAndMaskPopulateLocalCopy + + if(status != STATUS_SUCCESS && + pAddrMask) + KrnlHlprFwpV6AddrAndMaskDestroyLocalCopy(&pAddrMask); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpV6AddrAndMaskCreateLocalCopy() [pAddrMask: %#p]\n", + pAddrMask); + +#endif /// DBG + + return pAddrMask; + +#pragma warning(pop) +} + +#endif /// FWP_V6_ADDR_AND_MASK____ + +#ifndef FWP_RANGE____ +#define FWP_RANGE____ + +/** + @kernel_helper_function="KrnlHlprFwpRangePurgeLocalCopy" + + Purpose: Cleanup a local copy of an FWP_RANGE. <br> + <br> + Notes: <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552438.aspx <br> +*/ +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +inline VOID KrnlHlprFwpRangePurgeLocalCopy(_Inout_ FWP_RANGE* pRange) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpRangePurgeLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(pRange); + + KrnlHlprFwpValuePurgeLocalCopy(&(pRange->valueLow)); + + KrnlHlprFwpValuePurgeLocalCopy(&(pRange->valueHigh)); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpRangePurgeLocalCopy()\n"); + +#endif /// DBG + + return; +} + +/** + @kernel_helper_function="KrnlHlprFwpRangeDestroyLocalCopy" + + Purpose: Cleanup and free a local copy of an FWP_RANGE. <br> + <br> + Notes: <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552438.aspx <br> +*/ +_At_(*ppRange, _Pre_ _Notnull_) +_At_(*ppRange, _Post_ _Null_ __drv_freesMem(Pool)) +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Success_(*ppRange == 0) +inline VOID KrnlHlprFwpRangeDestroyLocalCopy(_Inout_ FWP_RANGE** ppRange) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpRangeDestroyLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(ppRange); + + if(*ppRange) + KrnlHlprFwpRangePurgeLocalCopy(*ppRange); + + HLPR_DELETE(*ppRange, + WFPSAMPLER_SYSLIB_TAG); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpRangeDestroyLocalCopy()\n"); + +#endif /// DBG + + return; +} + +/** + @kernel_helper_function="KrnlHlprFwpRangePopulateLocalCopy" + + Purpose: Populate a local copy of an FWP_RANGE. <br> + <br> + Notes: The caller is responsible for freeing the allocated memory using + KrnlHlprFwpRangePurgeLocalCopy(). <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552438.aspx <br> +*/ +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Check_return_ +_Success_(return == STATUS_SUCCESS) +NTSTATUS KrnlHlprFwpRangePopulateLocalCopy(_In_ const FWP_RANGE* pOriginalRange, + _Inout_ FWP_RANGE* pRange) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpRangePopulateLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(pOriginalRange); + NT_ASSERT(pRange); + + NTSTATUS status = STATUS_SUCCESS; + + status = KrnlHlprFwpValuePopulateLocalCopy(&(pOriginalRange->valueLow), + &(pRange->valueLow)); + HLPR_BAIL_ON_FAILURE(status); + + status = KrnlHlprFwpValuePopulateLocalCopy(&(pOriginalRange->valueHigh), + &(pRange->valueHigh)); + HLPR_BAIL_ON_FAILURE(status); + + HLPR_BAIL_LABEL: + + if(status != STATUS_SUCCESS) + KrnlHlprFwpRangePurgeLocalCopy(pRange); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpRangePopulateLocalCopy() [status: %#x]\n", + status); + +#endif /// DBG + + return status; +} + +/** + @kernel_helper_function="KrnlHlprFwpRangeCreateLocalCopy" + + Purpose: Allocate and populate a local copy of an FWP_RANGE. <br> + <br> + Notes: The caller is responsible for freeing the allocated memory using + KrnlHlprFwpRangeDestroyLocalCopy(). <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552438.aspx <br> +*/ +__drv_allocatesMem(Pool) +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Must_inspect_result_ +_Success_(return != 0) +FWP_RANGE* KrnlHlprFwpRangeCreateLocalCopy(_In_ const FWP_RANGE* pOriginalRange) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpRangeCreateLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(pOriginalRange); + + NTSTATUS status = STATUS_SUCCESS; + FWP_RANGE* pRange = 0; + +#pragma warning(push) +#pragma warning(disable: 6014) /// pRange is expected to be cleaned up by caller using KrnlHlprFwpRangeDestroyLocalCopy + + HLPR_NEW(pRange, + FWP_RANGE, + WFPSAMPLER_SYSLIB_TAG); + HLPR_BAIL_ON_ALLOC_FAILURE(pRange, + status); + +#pragma warning(pop) + + status = KrnlHlprFwpValuePopulateLocalCopy(&(pOriginalRange->valueLow), + &(pRange->valueLow)); + HLPR_BAIL_ON_FAILURE(status); + + status = KrnlHlprFwpValuePopulateLocalCopy(&(pOriginalRange->valueHigh), + &(pRange->valueHigh)); + HLPR_BAIL_ON_FAILURE(status); + + HLPR_BAIL_LABEL: + +#pragma warning(push) +#pragma warning(disable: 6001) /// pRange initialized with call to HLPR_NEW & KrnlHlprFwpValuePopulateLocalCopy + + if(status != STATUS_SUCCESS && + pRange) + KrnlHlprFwpRangeDestroyLocalCopy(&pRange); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpRangeCreateLocalCopy() [pRange: %#p]\n", + pRange); + +#endif /// DBG + + return pRange; + +#pragma warning(pop) +} + +#endif /// FWP_RANGE____ + +#ifndef FWP_CONDITION_VALUE____ +#define FWP_CONDITION_VALUE____ + +/** + @kernel_helper_function="KrnlHlprFwpConditionValuePurgeLocalCopy" + + Purpose: Cleanup a local copy of an FWP_CONDITION_VALUE. <br> + <br> + Notes: <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552430.aspx <br> +*/ +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +inline VOID KrnlHlprFwpConditionValuePurgeLocalCopy(_Inout_ FWP_CONDITION_VALUE* pValue) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpConditionValuePurgeLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(pValue); + + switch(pValue->type) + { + case FWP_UINT64: + { + HLPR_DELETE(pValue->uint64, + WFPSAMPLER_SYSLIB_TAG); + + break; + } + case FWP_INT64: + { + HLPR_DELETE(pValue->int64, + WFPSAMPLER_SYSLIB_TAG); + + break; + } + case FWP_DOUBLE: + { + HLPR_DELETE(pValue->double64, + WFPSAMPLER_SYSLIB_TAG); + + break; + } + case FWP_BYTE_ARRAY16_TYPE: + { + HLPR_DELETE(pValue->byteArray16, + WFPSAMPLER_SYSLIB_TAG); + + break; + } + case FWP_BYTE_BLOB_TYPE: + { + KrnlHlprFwpByteBlobDestroyLocalCopy(&(pValue->byteBlob)); + + break; + } + case FWP_SID: + { + HLPR_DELETE_ARRAY(pValue->sid, + WFPSAMPLER_SYSLIB_TAG); + + break; + } + case FWP_SECURITY_DESCRIPTOR_TYPE: + { + KrnlHlprFwpByteBlobDestroyLocalCopy(&(pValue->sd)); + + break; + } + case FWP_TOKEN_INFORMATION_TYPE: + { + KrnlHlprFwpTokenInformationDestroyLocalCopy(&(pValue->tokenInformation)); + + break; + } + case FWP_TOKEN_ACCESS_INFORMATION_TYPE: + { + KrnlHlprFwpByteBlobDestroyLocalCopy(&(pValue->tokenAccessInformation)); + + break; + } + case FWP_UNICODE_STRING_TYPE: + { + HLPR_DELETE_ARRAY(pValue->unicodeString, + WFPSAMPLER_SYSLIB_TAG); + + break; + } + +#if(NTDDI_VERSION >= NTDDI_WIN7) + + case FWP_BYTE_ARRAY6_TYPE: + { + HLPR_DELETE(pValue->byteArray6, + WFPSAMPLER_SYSLIB_TAG); + + break; + } + +#endif /// (NTDDI_VERSION >= NTDDI_WIN7) + + case FWP_SINGLE_DATA_TYPE_MAX: + { + break; + } + case FWP_V4_ADDR_MASK: + { + KrnlHlprFwpV4AddrAndMaskDestroyLocalCopy(&(pValue->v4AddrMask)); + + break; + } + case FWP_V6_ADDR_MASK: + { + KrnlHlprFwpV6AddrAndMaskDestroyLocalCopy(&(pValue->v6AddrMask)); + + break; + } + case FWP_RANGE_TYPE: + { + KrnlHlprFwpRangeDestroyLocalCopy(&(pValue->rangeValue)); + + break; + } + case FWP_DATA_TYPE_MAX: + { + break; + } + default: + { + pValue->uint64 = 0; + + break; + } + } + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpConditionValuePurgeLocalCopy()\n"); + +#endif /// DBG + + return; +} + +/** + @kernel_helper_function="KrnlHlprFwpConditionValueDestroyLocalCopy" + + Purpose: Cleanup and free a local copy of an FWP_CONDITION_VALUE. <br> + <br> + Notes: <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552430.aspx <br> +*/ +_At_(*ppValue, _Pre_ _Notnull_) +_At_(*ppValue, _Post_ _Null_ __drv_freesMem(Pool)) +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Success_(*ppValue == 0) +inline VOID KrnlHlprFwpConditionValueDestroyLocalCopy(_Inout_ FWP_CONDITION_VALUE** ppValue) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpConditionValueDestroyLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(ppValue); + + if(*ppValue) + KrnlHlprFwpConditionValuePurgeLocalCopy(*ppValue); + + HLPR_DELETE(*ppValue, + WFPSAMPLER_SYSLIB_TAG); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpConditionValueDestroyLocalCopy()\n"); + +#endif /// DBG + + return; +} + +/** + @kernel_helper_function="KrnlHlprFwpConditionValuePopulateLocalCopy" + + Purpose: Populate a local copy of an FWP_CONDITION_VALUE. <br> + <br> + Notes: The caller is responsible for freeing any allocated memory using + KrnlHlprFwpConditionValuePurgeLocalCopy(). <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552430.aspx <br> +*/ +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Check_return_ +_Success_(return == STATUS_SUCCESS) +NTSTATUS KrnlHlprFwpConditionValuePopulateLocalCopy(_In_ const FWP_CONDITION_VALUE* pOriginalValue, + _Inout_ FWP_CONDITION_VALUE* pValue) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpConditionValuePopulateLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(pOriginalValue); + NT_ASSERT(pValue); + + NTSTATUS status = STATUS_SUCCESS; + + KIRQL irql = KeGetCurrentIrql(); + + pValue->type = pOriginalValue->type; + + switch(pValue->type) + { + case FWP_UINT64: + { + HLPR_NEW(pValue->uint64, + UINT64, + WFPSAMPLER_SYSLIB_TAG); + HLPR_BAIL_ON_ALLOC_FAILURE(pValue->uint64, + status); + + RtlCopyMemory(pValue->uint64, + pOriginalValue->uint64, + sizeof(UINT64)); + + break; + } + case FWP_INT64: + { + HLPR_NEW(pValue->int64, + INT64, + WFPSAMPLER_SYSLIB_TAG); + HLPR_BAIL_ON_ALLOC_FAILURE(pValue->int64, + status); + + RtlCopyMemory(pValue->int64, + pOriginalValue->int64, + sizeof(INT64)); + + break; + } + case FWP_DOUBLE: + { + HLPR_NEW(pValue->double64, + double, + WFPSAMPLER_SYSLIB_TAG); + HLPR_BAIL_ON_ALLOC_FAILURE(pValue->double64, + status); + + RtlCopyMemory(pValue->double64, + pOriginalValue->double64, + sizeof(double)); + + break; + } + case FWP_BYTE_ARRAY16_TYPE: + { + HLPR_NEW(pValue->byteArray16, + FWP_BYTE_ARRAY16, + WFPSAMPLER_SYSLIB_TAG); + HLPR_BAIL_ON_ALLOC_FAILURE(pValue->byteArray16, + status); + + RtlCopyMemory(pValue->byteArray16, + pOriginalValue->byteArray16, + sizeof(FWP_BYTE_ARRAY16)); + + break; + } + case FWP_BYTE_BLOB_TYPE: + { + pValue->byteBlob = KrnlHlprFwpByteBlobCreateLocalCopy(pOriginalValue->byteBlob); + HLPR_BAIL_ON_ALLOC_FAILURE(pValue->byteBlob, + status); + + break; + } + case FWP_SID: + { + HLPR_DELETE_ARRAY(pValue->sid, + WFPSAMPLER_SYSLIB_TAG); + + break; + } + case FWP_SECURITY_DESCRIPTOR_TYPE: + { + pValue->sd = KrnlHlprFwpByteBlobCreateLocalCopy(pOriginalValue->sd); + HLPR_BAIL_ON_ALLOC_FAILURE(pValue->sd, + status); + break; + } + case FWP_TOKEN_INFORMATION_TYPE: + { + pValue->tokenInformation = KrnlHlprFwpTokenInformationCreateLocalCopy(pOriginalValue->tokenInformation); + HLPR_BAIL_ON_ALLOC_FAILURE(pValue->tokenInformation, + status); + + break; + } + case FWP_TOKEN_ACCESS_INFORMATION_TYPE: + { + pValue->tokenAccessInformation = KrnlHlprFwpByteBlobCreateLocalCopy(pOriginalValue->tokenAccessInformation); + HLPR_BAIL_ON_ALLOC_FAILURE(pValue->tokenAccessInformation, + status); + + break; + } + case FWP_UNICODE_STRING_TYPE: + { + size_t stringSize = 0; + + if(irql == PASSIVE_LEVEL) + { + status = RtlStringCchLengthW(pOriginalValue->unicodeString, + NTSTRSAFE_MAX_CCH, + &stringSize); + HLPR_BAIL_ON_FAILURE(status); + } + else + stringSize = wcslen(pOriginalValue->unicodeString); + + if(stringSize) + { + HLPR_NEW_ARRAY(pValue->unicodeString, + WCHAR, + stringSize + 1, /// add space for '\0' + WFPSAMPLER_SYSLIB_TAG); + HLPR_BAIL_ON_ALLOC_FAILURE(pValue->unicodeString, + status); + +#pragma warning(push) +#pragma warning(disable: 26018) /// buffers are contrained by stringSize + + RtlCopyMemory(pValue->unicodeString, + pOriginalValue->unicodeString, + stringSize * sizeof(WCHAR)); + + pValue->unicodeString[stringSize] = L'\0'; + +#pragma warning(pop) + } + else + { + status = STATUS_INVALID_BUFFER_SIZE; + + HLPR_BAIL; + } + + break; + } + +#if(NTDDI_VERSION >= NTDDI_WIN7) + + case FWP_BYTE_ARRAY6_TYPE: + { + HLPR_NEW(pValue->byteArray6, + FWP_BYTE_ARRAY6, + WFPSAMPLER_SYSLIB_TAG); + HLPR_BAIL_ON_ALLOC_FAILURE(pValue->byteArray6, + status); + + RtlCopyMemory(pValue->byteArray6, + pOriginalValue->byteArray6, + sizeof(FWP_BYTE_ARRAY6)); + + break; + } + +#endif /// (NTDDI_VERSION >= NTDDI_WIN7) + + case FWP_SINGLE_DATA_TYPE_MAX: + { + status = STATUS_INVALID_LABEL; + + break; + } + case FWP_V4_ADDR_MASK: + { + pValue->v4AddrMask = KrnlHlprFwpV4AddrAndMaskCreateLocalCopy(pOriginalValue->v4AddrMask); + HLPR_BAIL_ON_ALLOC_FAILURE(pValue->v4AddrMask, + status); + + break; + } + case FWP_V6_ADDR_MASK: + { + pValue->v6AddrMask = KrnlHlprFwpV6AddrAndMaskCreateLocalCopy(pOriginalValue->v6AddrMask); + HLPR_BAIL_ON_ALLOC_FAILURE(pValue->v6AddrMask, + status); + + break; + } + case FWP_RANGE_TYPE: + { + pValue->rangeValue = KrnlHlprFwpRangeCreateLocalCopy(pOriginalValue->rangeValue); + HLPR_BAIL_ON_ALLOC_FAILURE(pValue->rangeValue, + status); + + break; + } + case FWP_DATA_TYPE_MAX: + { + status = STATUS_INVALID_LABEL; + + break; + } + default: + { + /// this is a straight value copy so it's safe to use the largest static space + pValue->uint64 = pOriginalValue->uint64; + + break; + } + } + + HLPR_BAIL_LABEL: + + if(status != STATUS_SUCCESS) + KrnlHlprFwpConditionValuePurgeLocalCopy(pValue); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpConditionValuePopulateLocalCopy() [status: %#x]\n", + status); + +#endif /// DBG + + return status; +} + +/** + @kernel_helper_function="KrnlHlprFwpConditionValueCreateLocalCopy" + + Purpose: Allocate ans populate a local copy of an FWP_CONDITION_VALUE. <br> + <br> + Notes: The caller is responsible for freeing any allocated memory using + KrnlHlprFwpConditionValueDestroyLocalCopy(). <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552430.aspx <br> +*/ +__drv_allocatesMem(Pool) +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Must_inspect_result_ +_Success_(return != 0) +FWP_CONDITION_VALUE* KrnlHlprFwpConditionValueCreateLocalCopy(_In_ const FWP_CONDITION_VALUE* pOriginalValue) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpConditionValueCreateLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(pOriginalValue); + + NTSTATUS status = STATUS_SUCCESS; + FWP_CONDITION_VALUE* pConditionValue = 0; + +#pragma warning(push) +#pragma warning(disable: 6014) /// pConditionValue is expected to be cleaned up by caller using KrnlHlprFwpConditionValueDestroyLocalCopy + + HLPR_NEW(pConditionValue, + FWP_CONDITION_VALUE, + WFPSAMPLER_SYSLIB_TAG); + HLPR_BAIL_ON_ALLOC_FAILURE(pConditionValue, + status); + +#pragma warning(push) + + status = KrnlHlprFwpConditionValuePopulateLocalCopy(pOriginalValue, + pConditionValue); + + HLPR_BAIL_LABEL: + +#pragma warning(push) +#pragma warning(disable: 6001) /// pConditionValue initialized with call to HLPR_NEW & KrnlHlprFwpConditionValuePopulateLocalCopy + + if(status != STATUS_SUCCESS && + pConditionValue) + KrnlHlprFwpConditionValueDestroyLocalCopy(&pConditionValue); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpConditionValueCreateLocalCopy() [pConditionValue: %#p]\n", + pConditionValue); + +#endif /// DBG + + return pConditionValue; + +#pragma warning(pop) +} + +#endif /// FWP_CONDITION_VALUE____ + +#ifndef FWPS_INCOMING_VALUES____ +#define FWPS_INCOMING_VALUES____ + +/** + @kernel_helper_function="KrnlHlprFwpsIncomingValueConditionFlagsAreSet" + + Purpose: Determine if the FWPS_INCOMING_VALUES has the FLAGS condition set with the given + flags. <br> + <br> + Notes: <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552401.aspx <br> +*/ +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Check_return_ +BOOLEAN KrnlHlprFwpsIncomingValueConditionFlagsAreSet(_In_ const FWPS_INCOMING_VALUES* pClassifyValues, + _In_ UINT32 flags) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpsIncomingValueConditionFlagsAreSet()\n"); + +#endif /// DBG + + NT_ASSERT(pClassifyValues); + + BOOLEAN flagsAreSet = FALSE; + FWP_VALUE* pFlagsValue = KrnlHlprFwpValueGetFromFwpsIncomingValues(pClassifyValues, + &FWPM_CONDITION_FLAGS); + + if(pFlagsValue && + pFlagsValue->uint32 & flags) + flagsAreSet = TRUE; + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpsIncomingValueConditionFlagsAreSet()\n"); + +#endif /// DBG + + return flagsAreSet; +} + +/** + @kernel_helper_function="KrnlHlprFwpsIncomingValuesPurgeLocalCopy" + + Purpose: Cleanup a local copy of an FWPS_INCOMING_VALUES. <br> + <br> + Notes: <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552401.aspx <br> +*/ +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +inline VOID KrnlHlprFwpsIncomingValuesPurgeLocalCopy(_Inout_ FWPS_INCOMING_VALUES* pValues) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpsIncomingValuesPurgeLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(pValues); + + for(UINT32 valueIndex = 0; + valueIndex < pValues->valueCount; + valueIndex++) + { + KrnlHlprFwpValuePurgeLocalCopy(&(pValues->incomingValue[valueIndex].value)); + } + + HLPR_DELETE_ARRAY(pValues->incomingValue, + WFPSAMPLER_SYSLIB_TAG); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpsIncomingValuesPurgeLocalCopy()\n"); + +#endif /// DBG + + return; +} + +/** + @kernel_helper_function="KrnlHlprFwpsIncomingValuesDestroyLocalCopy" + + Purpose: Cleanup and free a local copy of an FWPS_INCOMING_VALUES. <br> + <br> + Notes: <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552401.aspx <br> +*/ +_At_(*ppValues, _Pre_ _Notnull_) +_At_(*ppValues, _Post_ _Null_ __drv_freesMem(Pool)) +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Success_(*ppValues == 0) +inline VOID KrnlHlprFwpsIncomingValuesDestroyLocalCopy(_Inout_ FWPS_INCOMING_VALUES** ppValues) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpsIncomingValuesDestroyLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(ppValues); + + if(*ppValues) + KrnlHlprFwpsIncomingValuesPurgeLocalCopy(*ppValues); + + HLPR_DELETE(*ppValues, + WFPSAMPLER_SYSLIB_TAG); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpsIncomingValuesDestroyLocalCopy()\n"); + +#endif /// DBG + + return; +} + +/** + @kernel_helper_function="KrnlHlprFwpsIncomingValuesPopulateLocalCopy" + + Purpose: Populate a local copy of an FWPS_INCOMING_VALUES. <br> + <br> + Notes: The caller is responsible for freeing the allocated memory using + KrnlHlprFwpsIncomingValuesPurgeLocalCopy(). <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552401.aspx <br> +*/ +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Check_return_ +_Success_(return == STATUS_SUCCESS) +NTSTATUS KrnlHlprFwpsIncomingValuesPopulateLocalCopy(_In_ const FWPS_INCOMING_VALUES* pOriginalValues, + _Inout_ FWPS_INCOMING_VALUES* pValues) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpsIncomingValuesPopulateLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(pOriginalValues); + NT_ASSERT(pValues); + + NTSTATUS status = STATUS_SUCCESS; + + HLPR_NEW_ARRAY(pValues->incomingValue, + FWPS_INCOMING_VALUE, + pOriginalValues->valueCount, + WFPSAMPLER_SYSLIB_TAG); + HLPR_BAIL_ON_ALLOC_FAILURE(pValues->incomingValue, + status); + + for(UINT32 valueIndex = 0; + valueIndex < pOriginalValues->valueCount; + valueIndex++) + { + status = KrnlHlprFwpValuePopulateLocalCopy(&(pOriginalValues->incomingValue[valueIndex].value), + &(pValues->incomingValue[valueIndex].value)); + HLPR_BAIL_ON_FAILURE(status); + } + + pValues->valueCount = pOriginalValues->valueCount; + pValues->layerId = pOriginalValues->layerId; + + HLPR_BAIL_LABEL: + + if(status != STATUS_SUCCESS) + KrnlHlprFwpsIncomingValuesPurgeLocalCopy(pValues); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpsIncomingValuesPopulateLocalCopy() [status: %#x]\n", + status); + +#endif /// DBG + + return status; +} + +/** + @kernel_helper_function="KrnlHlprFwpsIncomingValuesCreateLocalCopy" + + Purpose: Allocate and populate a local copy of an FWPS_INCOMING_VALUES. <br> + <br> + Notes: The caller is responsible for freeing the allocated memory using + KrnlHlprFwpsIncomingValuesDestroyLocalCopy(). <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552401.aspx <br> +*/ +__drv_allocatesMem(Pool) +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Must_inspect_result_ +_Success_(return != 0) +FWPS_INCOMING_VALUES* KrnlHlprFwpsIncomingValuesCreateLocalCopy(_In_ const FWPS_INCOMING_VALUES* pOriginalValues) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpsIncomingValuesCreateLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(pOriginalValues); + + NTSTATUS status = STATUS_SUCCESS; + FWPS_INCOMING_VALUES* pIncomingValues = 0; + +#pragma warning(push) +#pragma warning(disable: 6014) /// pIncomingValues is expected to be cleaned up by caller using KrnlHlprFwpsIncomingValuesDestroyLocalCopy + + HLPR_NEW(pIncomingValues, + FWPS_INCOMING_VALUES, + WFPSAMPLER_SYSLIB_TAG); + HLPR_BAIL_ON_ALLOC_FAILURE(pIncomingValues, + status); + +#pragma warning(pop) + + status = KrnlHlprFwpsIncomingValuesPopulateLocalCopy(pOriginalValues, + pIncomingValues); + + HLPR_BAIL_LABEL: + +#pragma warning(push) +#pragma warning(disable: 6001) /// pIncomingValues initialized with call to HLPR_NEW & KrnlHlprFwpsIncomingValuesPopulateLocalCopy + + if(status != STATUS_SUCCESS && + pIncomingValues) + KrnlHlprFwpsIncomingValuesDestroyLocalCopy(&pIncomingValues); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpsIncomingValuesCreateLocalCopy() [pIncomingValues: %#p]\n", + pIncomingValues); + +#endif /// DBG + + return pIncomingValues; + +#pragma warning(pop) +} + +#endif /// FWPS_INCOMING_VALUES____ + +#ifndef FWPS_INCOMING_METADATA_VALUES____ +#define FWPS_INCOMING_METADATA_VALUES____ + +/** + @kernel_helper_function="KrnlHlprFwpsIncomingMetadataValuesPurgeLocalCopy + + Purpose: Cleanup a local copy of an FWPS_INCOMING_METADATA_VALUES. <br> + <br> + Notes: <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552397.aspx <br> +*/ +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +inline VOID KrnlHlprFwpsIncomingMetadataValuesPurgeLocalCopy(_Inout_ FWPS_INCOMING_METADATA_VALUES* pMetadata) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpsIncomingMetadataValuesPurgeLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(pMetadata); + + KrnlHlprFwpByteBlobDestroyLocalCopy(&(pMetadata->processPath)); + + HLPR_DELETE_ARRAY(pMetadata->controlData, + WFPSAMPLER_SYSLIB_TAG); + +#if(NTDDI_VERSION >= NTDDI_WIN6SP1) + + HLPR_DELETE_ARRAY(pMetadata->headerIncludeHeader, + WFPSAMPLER_SYSLIB_TAG); + +#if(NTDDI_VERSION >= NTDDI_WIN7) + + HLPR_DELETE_ARRAY(pMetadata->originalDestination, + WFPSAMPLER_SYSLIB_TAG); + +#if(NTDDI_VERSION >= NTDDI_WIN8) + + if(pMetadata->vSwitchPacketContext) + FwpsDereferencevSwitchPacketContext(pMetadata->vSwitchPacketContext); + +#endif /// (NTDDI_VERSION >= NTDDI_WIN8) +#endif /// (NTDDI_VERSION >= NTDDI_WIN7) +#endif /// (NTDDI_VERSION >= NTDDI_WIN6SP1) + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpsIncomingMetadataValuesPurgeLocalCopy()\n"); + +#endif /// DBG + + return; +} + +/** + @kernel_helper_function="KrnlHlprFwpsIncomingMetadataValuesDestroyLocalCopy + + Purpose: Cleanup and free a local copy of an FWPS_INCOMING_METADATA_VALUES. <br> + <br> + Notes: <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552397.aspx <br> +*/ +_At_(*ppMetadata, _Pre_ _Notnull_) +_At_(*ppMetadata, _Post_ _Null_ __drv_freesMem(Pool)) +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Success_(*ppMetadata == 0) +inline VOID KrnlHlprFwpsIncomingMetadataValuesDestroyLocalCopy(_Inout_ FWPS_INCOMING_METADATA_VALUES** ppMetadata) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpsIncomingMetadataValuesDestroyLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(ppMetadata); + + if(*ppMetadata) + KrnlHlprFwpsIncomingMetadataValuesPurgeLocalCopy(*ppMetadata); + + HLPR_DELETE(*ppMetadata, + WFPSAMPLER_SYSLIB_TAG); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpsIncomingMetadataValuesDestroyLocalCopy()\n"); + +#endif /// DBG + + return; +} + +/** + @kernel_helper_function="KrnlHlprFwpsIncomingMetadataValuesPopulateLocalCopy + + Purpose: Populate a local copy of the FWPS_INCOMING_METADATA_VALUES. <br> + <br> + Notes: The caller is responsible for freeing any allocated memory using + KrnlHlprFwpsIncomingMetadataValuesPurgeLocalCopy(). <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552397.aspx <br> +*/ +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Check_return_ +_Success_(return == STATUS_SUCCESS) +NTSTATUS KrnlHlprFwpsIncomingMetadataValuesPopulateLocalCopy(_In_ const FWPS_INCOMING_METADATA_VALUES* pOriginalMetadata, + _Inout_ FWPS_INCOMING_METADATA_VALUES* pMetadata) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpsIncomingMetadataValuesPopulateLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(pOriginalMetadata); + + NTSTATUS status = STATUS_SUCCESS; + + pMetadata->currentMetadataValues = pOriginalMetadata->currentMetadataValues; + pMetadata->flags = pOriginalMetadata->flags; + + /// Used internally by the filter engine. Callout drivers should ignore this member. + if(FWPS_IS_METADATA_FIELD_PRESENT(pOriginalMetadata, + FWPS_METADATA_FIELD_RESERVED)) + pMetadata->reserved = pOriginalMetadata->reserved; + + if(FWPS_IS_METADATA_FIELD_PRESENT(pOriginalMetadata, + FWPS_METADATA_FIELD_DISCARD_REASON)) + { + pMetadata->discardMetadata.discardModule = pOriginalMetadata->discardMetadata.discardModule; + pMetadata->discardMetadata.discardReason = pOriginalMetadata->discardMetadata.discardReason; + pMetadata->discardMetadata.filterId = pOriginalMetadata->discardMetadata.filterId; + } + + /// Not guaranteed to be available outside of the classifyFn. + /// Use of an invalid handle will fail gracefully. + if(FWPS_IS_METADATA_FIELD_PRESENT(pOriginalMetadata, + FWPS_METADATA_FIELD_FLOW_HANDLE)) + pMetadata->flowHandle = pOriginalMetadata->flowHandle; + + if(FWPS_IS_METADATA_FIELD_PRESENT(pOriginalMetadata, + FWPS_METADATA_FIELD_IP_HEADER_SIZE)) + pMetadata->ipHeaderSize = pOriginalMetadata->ipHeaderSize; + + if(FWPS_IS_METADATA_FIELD_PRESENT(pOriginalMetadata, + FWPS_METADATA_FIELD_TRANSPORT_HEADER_SIZE)) + pMetadata->transportHeaderSize = pOriginalMetadata->transportHeaderSize; + + if(FWPS_IS_METADATA_FIELD_PRESENT(pOriginalMetadata, + FWPS_METADATA_FIELD_PROCESS_PATH)) + { + pMetadata->processPath = KrnlHlprFwpByteBlobCreateLocalCopy(pOriginalMetadata->processPath); + HLPR_BAIL_ON_ALLOC_FAILURE(pMetadata->processPath, + status); + } + + if(FWPS_IS_METADATA_FIELD_PRESENT(pOriginalMetadata, + FWPS_METADATA_FIELD_TOKEN)) + pMetadata->token = pOriginalMetadata->token; + + if(FWPS_IS_METADATA_FIELD_PRESENT(pOriginalMetadata, + FWPS_METADATA_FIELD_PROCESS_ID)) + pMetadata->processId = pOriginalMetadata->processId; + + if(FWPS_IS_METADATA_FIELD_PRESENT(pOriginalMetadata, + FWPS_METADATA_FIELD_SOURCE_INTERFACE_INDEX)) + pMetadata->sourceInterfaceIndex = pOriginalMetadata->sourceInterfaceIndex; + + if(FWPS_IS_METADATA_FIELD_PRESENT(pOriginalMetadata, + FWPS_METADATA_FIELD_DESTINATION_INTERFACE_INDEX)) + pMetadata->destinationInterfaceIndex = pOriginalMetadata->destinationInterfaceIndex; + + if(FWPS_IS_METADATA_FIELD_PRESENT(pOriginalMetadata, + FWPS_METADATA_FIELD_COMPARTMENT_ID)) + pMetadata->compartmentId = pOriginalMetadata->compartmentId; + + if(FWPS_IS_METADATA_FIELD_PRESENT(pOriginalMetadata, + FWPS_METADATA_FIELD_FRAGMENT_DATA)) + { + pMetadata->fragmentMetadata.fragmentIdentification = pOriginalMetadata->fragmentMetadata.fragmentIdentification; + pMetadata->fragmentMetadata.fragmentOffset = pOriginalMetadata->fragmentMetadata.fragmentOffset; + pMetadata->fragmentMetadata.fragmentLength = pOriginalMetadata->fragmentMetadata.fragmentLength; + } + + if(FWPS_IS_METADATA_FIELD_PRESENT(pOriginalMetadata, + FWPS_METADATA_FIELD_PATH_MTU)) + pMetadata->pathMtu = pOriginalMetadata->pathMtu; + + /// Not guaranteed to be available outside of the classifyFn. + /// Use of an invalid handle will fail gracefully. + if(FWPS_IS_METADATA_FIELD_PRESENT(pOriginalMetadata, + FWPS_METADATA_FIELD_COMPLETION_HANDLE)) + pMetadata->completionHandle = pOriginalMetadata->completionHandle; + + /// Not guaranteed to be available outside of the classifyFn. + /// Use of an invalid handle will fail gracefully. + if(FWPS_IS_METADATA_FIELD_PRESENT(pOriginalMetadata, + FWPS_METADATA_FIELD_TRANSPORT_ENDPOINT_HANDLE)) + pMetadata->transportEndpointHandle = pOriginalMetadata->transportEndpointHandle; + + if(FWPS_IS_METADATA_FIELD_PRESENT(pOriginalMetadata, + FWPS_METADATA_FIELD_REMOTE_SCOPE_ID)) + pMetadata->remoteScopeId = pOriginalMetadata->remoteScopeId; + + if(FWPS_IS_METADATA_FIELD_PRESENT(pOriginalMetadata, + FWPS_METADATA_FIELD_TRANSPORT_CONTROL_DATA)) + { + BYTE* pControlData = 0; + + HLPR_NEW_ARRAY(pControlData, + BYTE, + pOriginalMetadata->controlDataLength, + WFPSAMPLER_SYSLIB_TAG); + HLPR_BAIL_ON_ALLOC_FAILURE(pControlData, + status); + + RtlCopyMemory(pControlData, + pOriginalMetadata->controlData, + pOriginalMetadata->controlDataLength); + + pMetadata->controlData = (WSACMSGHDR*)pControlData; + pMetadata->controlDataLength = pOriginalMetadata->controlDataLength; + } + + if(FWPS_IS_METADATA_FIELD_PRESENT(pOriginalMetadata, + FWPS_METADATA_FIELD_PACKET_DIRECTION)) + pMetadata->packetDirection= pOriginalMetadata->packetDirection; + +#if(NTDDI_VERSION >= NTDDI_WIN6SP1) + + if(FWPS_IS_METADATA_FIELD_PRESENT(pOriginalMetadata, + FWPS_METADATA_FIELD_TRANSPORT_HEADER_INCLUDE_HEADER)) + { + HLPR_NEW_ARRAY(pMetadata->headerIncludeHeader, + BYTE, + pOriginalMetadata->headerIncludeHeaderLength, + WFPSAMPLER_SYSLIB_TAG); + HLPR_BAIL_ON_ALLOC_FAILURE(pMetadata->headerIncludeHeader, + status); + + RtlCopyMemory(pMetadata->headerIncludeHeader, + pOriginalMetadata->headerIncludeHeader, + pOriginalMetadata->headerIncludeHeaderLength); + + pMetadata->headerIncludeHeaderLength = pOriginalMetadata->headerIncludeHeaderLength; + } + +#if(NTDDI_VERSION >= NTDDI_WIN7) + + if(FWPS_IS_METADATA_FIELD_PRESENT(pOriginalMetadata, + FWPS_METADATA_FIELD_DESTINATION_PREFIX)) + pMetadata->destinationPrefix = pOriginalMetadata->destinationPrefix; + + /// Not guaranteed to be available outside of the classifyFn. + /// Use of an invalid handle will fail gracefully. + if(FWPS_IS_METADATA_FIELD_PRESENT(pOriginalMetadata, + FWPS_METADATA_FIELD_PARENT_ENDPOINT_HANDLE)) + pMetadata->parentEndpointHandle = pOriginalMetadata->parentEndpointHandle; + + if(FWPS_IS_METADATA_FIELD_PRESENT(pOriginalMetadata, + FWPS_METADATA_FIELD_ICMP_ID_AND_SEQUENCE)) + pMetadata->icmpIdAndSequence = pOriginalMetadata->icmpIdAndSequence; + + if(FWPS_IS_METADATA_FIELD_PRESENT(pOriginalMetadata, + FWPS_METADATA_FIELD_LOCAL_REDIRECT_TARGET_PID)) + pMetadata->localRedirectTargetPID = pOriginalMetadata->localRedirectTargetPID; + + if(FWPS_IS_METADATA_FIELD_PRESENT(pOriginalMetadata, + FWPS_METADATA_FIELD_ORIGINAL_DESTINATION)) + { + BYTE* pDestination = 0; + SIZE_T sockAddrSize = (pOriginalMetadata->originalDestination->sa_family == AF_INET) ? + sizeof(SOCKADDR_IN) : + sizeof(SOCKADDR_IN6); + + HLPR_NEW_ARRAY(pDestination, + BYTE, + sockAddrSize, + WFPSAMPLER_SYSLIB_TAG); + HLPR_BAIL_ON_ALLOC_FAILURE(pDestination, + status); + + RtlCopyMemory(pMetadata->originalDestination, + pOriginalMetadata->originalDestination, + sockAddrSize); + + pMetadata->originalDestination = (SOCKADDR*)pDestination; + } + +#if(NTDDI_VERSION >= NTDDI_WIN8) + + if(FWPS_IS_METADATA_FIELD_PRESENT(pOriginalMetadata, + FWPS_METADATA_FIELD_REDIRECT_RECORD_HANDLE)) + pMetadata->redirectRecords = pOriginalMetadata->redirectRecords; + + if(FWPS_IS_METADATA_FIELD_PRESENT(pOriginalMetadata, + FWPS_METADATA_FIELD_SUB_PROCESS_TAG)) + pMetadata->subProcessTag = pOriginalMetadata->subProcessTag; + + pMetadata->currentL2MetadataValues = pOriginalMetadata->currentL2MetadataValues; + pMetadata->l2Flags = pOriginalMetadata->l2Flags; + + if(FWPS_IS_L2_METADATA_FIELD_PRESENT(pOriginalMetadata, + FWPS_L2_METADATA_FIELD_ETHERNET_MAC_HEADER_SIZE)) + pMetadata->ethernetMacHeaderSize = pOriginalMetadata->ethernetMacHeaderSize; + + if(FWPS_IS_L2_METADATA_FIELD_PRESENT(pOriginalMetadata, + FWPS_L2_METADATA_FIELD_WIFI_OPERATION_MODE)) + pMetadata->wiFiOperationMode = pOriginalMetadata->wiFiOperationMode; + +#if(NDIS_SUPPORT_NDIS630) + + if(FWPS_IS_L2_METADATA_FIELD_PRESENT(pOriginalMetadata, + FWPS_L2_METADATA_FIELD_VSWITCH_SOURCE_PORT_ID)) + pMetadata->vSwitchSourcePortId = pOriginalMetadata->vSwitchSourcePortId; + + if(FWPS_IS_L2_METADATA_FIELD_PRESENT(pOriginalMetadata, + FWPS_L2_METADATA_FIELD_VSWITCH_SOURCE_NIC_INDEX)) + pMetadata->vSwitchSourceNicIndex = pOriginalMetadata->vSwitchSourceNicIndex; + + if(FWPS_IS_L2_METADATA_FIELD_PRESENT(pOriginalMetadata, + FWPS_L2_METADATA_FIELD_VSWITCH_DESTINATION_PORT_ID)) + pMetadata->vSwitchDestinationPortId = pOriginalMetadata->vSwitchDestinationPortId; + +#endif /// (NDIS_SUPPORT_NDIS630) + + /// Technically only need this if allocating and injecting new NBLs + if(FWPS_IS_L2_METADATA_FIELD_PRESENT(pOriginalMetadata, + FWPS_L2_METADATA_FIELD_VSWITCH_PACKET_CONTEXT)) + { + FwpsReferencevSwitchPacketContext(pOriginalMetadata->vSwitchPacketContext); + + pMetadata->vSwitchPacketContext = pOriginalMetadata->vSwitchPacketContext; + } + +#endif /// (NTDDI_VERSION >= NTDDI_WIN8) +#endif /// (NTDDI_VERSION >= NTDDI_WIN7) +#endif /// (NTDDI_VERSION >= NTDDI_WIN6SP1) + + HLPR_BAIL_LABEL: + + if(status != STATUS_SUCCESS) + KrnlHlprFwpsIncomingMetadataValuesPurgeLocalCopy(pMetadata); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpsIncomingMetadataValuesPopulateLocalCopy() [status: %#x]\n", + status); + +#endif /// DBG + + return status; +} + +/** + @kernel_helper_function="KrnlHlprFwpsIncomingMetadataValuesCreateLocalCopy + + Purpose: Allocate and populate a local copy of the FWPS_INCOMING_METADATA_VALUES. <br> + <br> + Notes: The caller is responsible for freeing the allocated memory using + KrnlHlprFwpsIncomingMetadataValuesDestroyLocalCopy(). <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552397.aspx <br> +*/ +__drv_allocatesMem(Pool) +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Must_inspect_result_ +_Success_(return != 0) +FWPS_INCOMING_METADATA_VALUES* KrnlHlprFwpsIncomingMetadataValuesCreateLocalCopy(_In_ const FWPS_INCOMING_METADATA_VALUES* pOriginalMetadata) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpsIncomingMetadataValuesCreateLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(pOriginalMetadata); + + NTSTATUS status = STATUS_SUCCESS; + FWPS_INCOMING_METADATA_VALUES* pMetadata = 0; + +#pragma warning(push) +#pragma warning(disable: 6014) /// pMetadata is expected to be cleaned up by caller using KrnlHlprFwpsIncomingMetadataValuesDestroyLocalCopy + + HLPR_NEW(pMetadata, + FWPS_INCOMING_METADATA_VALUES, + WFPSAMPLER_SYSLIB_TAG); + HLPR_BAIL_ON_ALLOC_FAILURE(pMetadata, + status); + +#pragma warning(pop) + + status = KrnlHlprFwpsIncomingMetadataValuesPopulateLocalCopy(pOriginalMetadata, + pMetadata); + + HLPR_BAIL_LABEL: + +#pragma warning(push) +#pragma warning(disable: 6001) /// pMetadata initialized with call to HLPR_NEW & KrnlHlprFwpsIncomingMetadataValuesPopulateLocalCopy + + if(status != STATUS_SUCCESS && + pMetadata) + KrnlHlprFwpsIncomingMetadataValuesDestroyLocalCopy(&pMetadata); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpsIncomingMetadataValuesCreateLocalCopy() [pMetadata: %#p]\n", + pMetadata); + +#endif /// DBG + + return pMetadata; + +#pragma warning(pop) +} + +#endif /// FWPS_INCOMING_METADATA_VALUES____ + +#ifndef FWPS_CLASSIFY_OUT____ +#define FWPS_CLASSIFY_OUT____ + +/** + @kernel_helper_function="KrnlHlprFwpsClassifyOutPurgeLocalCopy" + + Purpose: Cleanup a local copy of an FWPS_CLASSIFY_OUT. <br> + <br> + Notes: <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF551229.aspx <br> +*/ +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +inline VOID KrnlHlprFwpsClassifyOutPurgeLocalCopy(_Inout_ FWPS_CLASSIFY_OUT* pOriginalClassifyOut) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpsClassifyOutPurgeLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(pOriginalClassifyOut); + + RtlZeroMemory(pOriginalClassifyOut, + sizeof(FWPS_CLASSIFY_OUT)); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpsClassifyOutPurgeLocalCopy()\n"); + +#endif /// DBG + + return; +} + +/** + @kernel_helper_function="KrnlHlprFwpsClassifyOutDestroyLocalCopy" + + Purpose: Cleanup and free a local copy of an FWPS_CLASSIFY_OUT. <br> + <br> + Notes: <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF551229.aspx <br> +*/ +_At_(*ppClassifyOut, _Pre_ _Notnull_) +_At_(*ppClassifyOut, _Post_ _Null_ __drv_freesMem(Pool)) +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Success_(*ppClassifyOut == 0) +VOID KrnlHlprFwpsClassifyOutDestroyLocalCopy(_Inout_ FWPS_CLASSIFY_OUT** ppClassifyOut) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpsClassifyOutDestroyLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(ppClassifyOut); + + if(*ppClassifyOut) + KrnlHlprFwpsClassifyOutPurgeLocalCopy(*ppClassifyOut); + + HLPR_DELETE(*ppClassifyOut, + WFPSAMPLER_SYSLIB_TAG); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpsClassifyOutDestroyLocalCopy()\n"); + +#endif /// DBG + + return; +} + +/** + @kernel_helper_function="KrnlHlprFwpsClassifyOutPopulateLocalCopy" + + Purpose: Populate a local copy of the FWPS_CLASSIFY_OUT. <br> + <br> + Notes: The caller is responsible for freeing the allocated memory using + KrnlHlprFwpsClassifyOutPurgeLocalCopy(). <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF551229.aspx <br> +*/ +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +inline VOID KrnlHlprFwpsClassifyOutPopulateLocalCopy(_In_ const FWPS_CLASSIFY_OUT* pOriginalClassifyOut, + _Inout_ FWPS_CLASSIFY_OUT* pClassifyOut) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpsClassifyOutPopulateLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(pOriginalClassifyOut); + NT_ASSERT(pClassifyOut); + + RtlCopyMemory(pClassifyOut, + pOriginalClassifyOut, + sizeof(FWPS_CLASSIFY_OUT)); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpsClassifyOutPopulateLocalCopy()\n"); + +#endif /// DBG + + return; +} + +/** + @kernel_helper_function="KrnlHlprFwpsClassifyOutCreateLocalCopy" + + Purpose: Allocate and populate a local copy of the FWPS_CLASSIFY_OUT. <br> + <br> + Notes: The caller is responsible for freeing the allocated memory using + KrnlHlprFwpsClassifyOutDestroyLocalCopy(). <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF551229.aspx <br> +*/ +__drv_allocatesMem(Pool) +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Must_inspect_result_ +_Success_(return != 0) +FWPS_CLASSIFY_OUT* KrnlHlprFwpsClassifyOutCreateLocalCopy(_In_ const FWPS_CLASSIFY_OUT* pOriginalClassifyOut) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpsClassifyOutCreateLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(pOriginalClassifyOut); + + NTSTATUS status = 0; + FWPS_CLASSIFY_OUT* pClassifyOut = 0; + + HLPR_NEW(pClassifyOut, + FWPS_CLASSIFY_OUT, + WFPSAMPLER_SYSLIB_TAG); + HLPR_BAIL_ON_ALLOC_FAILURE(pClassifyOut, + status); + + KrnlHlprFwpsClassifyOutPopulateLocalCopy(pOriginalClassifyOut, + pClassifyOut); + + HLPR_BAIL_LABEL: + + if(status != STATUS_SUCCESS) + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_ERROR_LEVEL, + " !!!! KrnlHlprFwpsClassifyOutCreateLocalCopy() [status: %#x]\n", + status); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpsClassifyOutCreateLocalCopy() [pClassifyOut: %#p]\n", + pClassifyOut); + +#endif /// DBG + + return pClassifyOut; +} + +#endif /// FWPS_CLASSIFY_OUT____ + +#ifndef FWPS_STREAM_DATA____ +#define FWPS_STREAM_DATA____ + +/** + @kernel_helper_function="KrnlHlprFwpsStreamDataPurgeLocalCopy" + + Purpose: Cleanup a local copy of an FWPS_STREAM_DATA. <br> + <br> + Notes: <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552419.aspx <br> +*/ +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +inline VOID KrnlHlprFwpsStreamDataPurgeLocalCopy(_Inout_ FWPS_STREAM_DATA* pStreamData) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpsStreamDataPurgeLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(pStreamData); + + BOOLEAN isDispatch = (KeGetCurrentIrql() == DISPATCH_LEVEL) ? TRUE : FALSE; + + for(NET_BUFFER_LIST* pNBL = pStreamData->netBufferListChain; + pNBL; + ) + { + NET_BUFFER_LIST* pNBLNext = NET_BUFFER_LIST_NEXT_NBL(pNBL); + + FwpsDereferenceNetBufferList(pNBL, + isDispatch); + + pNBL = pNBLNext; + } + + pStreamData->netBufferListChain = 0; + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpsStreamDataPurgeLocalCopy()\n"); + +#endif /// DBG + + return; +} + +/** + @kernel_helper_function="KrnlHlprFwpsStreamDataDestroyLocalCopy" + + Purpose: Cleanup and free a local copy of an FWPS_STREAM_DATA. <br> + <br> + Notes: <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552419.aspx <br> +*/ +_At_(*ppStreamData, _Pre_ _Notnull_) +_At_(*ppStreamData, _Post_ _Null_ __drv_freesMem(Pool)) +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Success_(*ppStreamData == 0) +inline VOID KrnlHlprFwpsStreamDataDestroyLocalCopy(_Inout_ FWPS_STREAM_DATA** ppStreamData) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpsStreamDataDestroyLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(ppStreamData); + + if(*ppStreamData) + KrnlHlprFwpsStreamDataPurgeLocalCopy(*ppStreamData); + + HLPR_DELETE(*ppStreamData, + WFPSAMPLER_SYSLIB_TAG); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpsStreamDataDestroyLocalCopy()\n"); + +#endif /// DBG + + return; +} + +/** + @kernel_helper_function="KrnlHlprFwpsStreamDataPopulateLocalCopy + + Purpose: Populate a local copy of the FWPS_STREAM_DATA. <br> + <br> + Notes: The caller is responsible for freeing the allocated memory using + KrnlHlprFwpsStreamDataPurgeLocalCopy(). <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552419.aspx <br> +*/ +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Check_return_ +_Success_(return == STATUS_SUCCESS) +NTSTATUS KrnlHlprFwpsStreamDataPopulateLocalCopy(_In_ const FWPS_STREAM_DATA* pOriginalStreamData, + _Inout_ FWPS_STREAM_DATA* pStreamData) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpsStreamDataPopulateLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(pOriginalStreamData); + NT_ASSERT(pStreamData); + + NTSTATUS status = STATUS_SUCCESS; + + for(NET_BUFFER_LIST* pNBL = pOriginalStreamData->netBufferListChain; + pNBL; + pNBL = NET_BUFFER_LIST_NEXT_NBL(pNBL)) + { + FwpsReferenceNetBufferList(pNBL, + TRUE); + } + + pStreamData->flags = pOriginalStreamData->flags; + pStreamData->dataOffset = pOriginalStreamData->dataOffset; + pStreamData->dataLength = pOriginalStreamData->dataLength; + pStreamData->netBufferListChain = pOriginalStreamData->netBufferListChain; + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpsStreamDataPopulateLocalCopy() [status: %#x]\n", + status); + +#endif /// DBG + + return status; +} + +/** + @kernel_helper_function="KrnlHlprFwpsStreamDataCreateLocalCopy + + Purpose: Allocate and populate a local copy of the FWPS_STREAM_DATA. <br> + <br> + Notes: The caller is responsible for freeing the allocated memory using + KrnlHlprFwpsStreamDataDestroyLocalCopy(). <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552419.aspx <br> +*/ +__drv_allocatesMem(Pool) +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Must_inspect_result_ +_Success_(return != 0) +FWPS_STREAM_DATA* KrnlHlprFwpsStreamDataCreateLocalCopy(_In_ const FWPS_STREAM_DATA* pOriginalStreamData) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpsStreamDataCreateLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(pOriginalStreamData); + + NTSTATUS status = STATUS_SUCCESS; + FWPS_STREAM_DATA* pStreamData = 0; + +#pragma warning(push) +#pragma warning(disable: 6014) /// pStreamData is expected to be cleaned up by caller using KrnlHlprFwpsStreamDataDestroyLocalCopy + + HLPR_NEW(pStreamData, + FWPS_STREAM_DATA, + WFPSAMPLER_SYSLIB_TAG); + HLPR_BAIL_ON_ALLOC_FAILURE(pStreamData, + status); + +#pragma warning(pop) + + status = KrnlHlprFwpsStreamDataPopulateLocalCopy(pOriginalStreamData, + pStreamData); + + HLPR_BAIL_LABEL: + +#pragma warning(push) +#pragma warning(disable: 6001) /// pStreamData initialized with call to HLPR_NEW & KrnlHlprFwpsStreamDataPopulateLocalCopy + + if(status != STATUS_SUCCESS && + pStreamData) + KrnlHlprFwpsStreamDataDestroyLocalCopy(&pStreamData); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpsStreamDataCreateLocalCopy() [pStreamData: %#p]\n", + pStreamData); + +#endif /// DBG + + return pStreamData; + +#pragma warning(pop) +} + +#endif /// FWPS_STREAM_DATA____ + +#ifndef FWPS_STREAM_CALLOUT_IO_PACKET____ +#define FWPS_STREAM_CALLOUT_IO_PACKET____ + +/** + @kernel_helper_function="KrnlHlprFwpsStreamCalloutIOPacketPurgeLocalCopy" + + Purpose: Cleanup a local copy of an FWPS_STREAM_CALLOUT_IO_PACKET. <br> + <br> + Notes: <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552417.aspx <br> +*/ +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +inline VOID KrnlHlprFwpsStreamCalloutIOPacketPurgeLocalCopy(_Inout_ FWPS_STREAM_CALLOUT_IO_PACKET* pIOPacket) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpsStreamCalloutIOPacketPurgeLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(pIOPacket); + + KrnlHlprFwpsStreamDataDestroyLocalCopy(&(pIOPacket->streamData)); + + RtlZeroMemory(pIOPacket, + sizeof(FWPS_STREAM_CALLOUT_IO_PACKET)); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpsStreamCalloutIOPacketPurgeLocalCopy()\n"); + +#endif /// DBG + + return; +} + +/** + @kernel_helper_function="KrnlHlprFwpsStreamCalloutIOPacketDestroyLocalCopy" + + Purpose: Cleanup and free a local copy of an FWPS_STREAM_CALLOUT_IO_PACKET. <br> + <br> + Notes: <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552417.aspx <br> +*/ +_At_(*ppIOPacket, _Pre_ _Notnull_) +_At_(*ppIOPacket, _Post_ _Null_ __drv_freesMem(Pool)) +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Success_(*ppIOPacket == 0) +inline VOID KrnlHlprFwpsStreamCalloutIOPacketDestroyLocalCopy(_Inout_ FWPS_STREAM_CALLOUT_IO_PACKET** ppIOPacket) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpsStreamCalloutIOPacketDestroyLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(ppIOPacket); + + if(*ppIOPacket) + KrnlHlprFwpsStreamCalloutIOPacketPurgeLocalCopy(*ppIOPacket); + + HLPR_DELETE(*ppIOPacket, + WFPSAMPLER_SYSLIB_TAG); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpsStreamCalloutIOPacketDestroyLocalCopy()\n"); + +#endif /// DBG + + return; +} + +/** + @kernel_helper_function="KrnlHlprFwpsStreamCalloutIOPacketPopulateLocalCopy + + Purpose: Populate a local copy of the FWPS_STREAM_CALLOUT_IO_PACKET. <br> + <br> + Notes: The caller is responsible for freeing the allocated memory using + KrnlHlprFwpsStreamCalloutIOPacketPurgeLocalCopy(). <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552417.aspx <br> +*/ +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Check_return_ +_Success_(return == STATUS_SUCCESS) +NTSTATUS KrnlHlprFwpsStreamCalloutIOPacketPopulateLocalCopy(_In_ const FWPS_STREAM_CALLOUT_IO_PACKET* pOriginalIOPacket, + _Inout_ FWPS_STREAM_CALLOUT_IO_PACKET* pIOPacket) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpsStreamCalloutIOPacketPopulateLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(pOriginalIOPacket); + NT_ASSERT(pIOPacket); + + NTSTATUS status = STATUS_SUCCESS; + + pIOPacket->streamData = KrnlHlprFwpsStreamDataCreateLocalCopy(pOriginalIOPacket->streamData); + HLPR_BAIL_ON_NULL_POINTER_WITH_STATUS(pIOPacket->streamData, + status); + + pIOPacket->missedBytes = pOriginalIOPacket->missedBytes; + pIOPacket->countBytesRequired = pOriginalIOPacket->countBytesRequired; + pIOPacket->countBytesEnforced = pOriginalIOPacket->countBytesEnforced; + pIOPacket->streamAction = pOriginalIOPacket->streamAction; + + HLPR_BAIL_LABEL: + + if(status != STATUS_SUCCESS) + KrnlHlprFwpsStreamCalloutIOPacketPurgeLocalCopy(pIOPacket); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpsStreamCalloutIOPacketPopulateLocalCopy() [status: %#x]\n", + status); + +#endif /// DBG + + return status; +} + +/** + @kernel_helper_function="KrnlHlprFwpsStreamCalloutIOPacketCreateLocalCopy + + Purpose: Allocate and populate a local copy of the FWPS_STREAM_CALLOUT_IO_PACKET. <br> + <br> + Notes: The caller is responsible for freeing the allocated memory using + KrnlHlprFwpsStreamCalloutIOPacketDestroyLocalCopy(). <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552417.aspx <br> +*/ +__drv_allocatesMem(Pool) +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Must_inspect_result_ +_Success_(return != 0) +FWPS_STREAM_CALLOUT_IO_PACKET* KrnlHlprFwpsStreamCalloutIOPacketCreateLocalCopy(_In_ const FWPS_STREAM_CALLOUT_IO_PACKET* pOriginalIOPacket) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpsStreamCalloutIOPacketCreateLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(pOriginalIOPacket); + + NTSTATUS status = STATUS_SUCCESS; + FWPS_STREAM_CALLOUT_IO_PACKET* pIOPacket = 0; + +#pragma warning(push) +#pragma warning(disable: 6014) /// pIOPacket is expected to be cleaned up by caller using KrnlHlprFwpsStreamCalloutIOPacketDestroyLocalCopy + + HLPR_NEW(pIOPacket, + FWPS_STREAM_CALLOUT_IO_PACKET, + WFPSAMPLER_SYSLIB_TAG); + HLPR_BAIL_ON_ALLOC_FAILURE(pIOPacket, + status); + +#pragma warning(pop) + + status = KrnlHlprFwpsStreamCalloutIOPacketPopulateLocalCopy(pOriginalIOPacket, + pIOPacket); + + HLPR_BAIL_LABEL: + +#pragma warning(push) +#pragma warning(disable: 6001) /// pIOPacket initialized with call to HLPR_NEW & KrnlHlprFwpsStreamCalloutIOPacketPopulateLocalCopy + + if(status != STATUS_SUCCESS) + KrnlHlprFwpsStreamCalloutIOPacketDestroyLocalCopy(&pIOPacket); + +#pragma warning(push) + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpsStreamCalloutIOPacketCreateLocalCopy() [pIOPacket: %#p]\n", + pIOPacket); + +#endif /// DBG + + return pIOPacket; +} + +#endif /// FWPS_STREAM_CALLOUT_IO_PACKET____ + +#ifndef FWPM_PROVIDER_CONTEXT____ +#define FWPM_PROVIDER_CONTEXT____ + +/** + @kernel_helper_function="KrnlHlprFwpmProviderContextPurgeLocalCopy" + + Purpose: Cleanup a local copy of an FWPM_PROVIDER_CONTEXT. <br> + <br> + Notes: <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Desktop/HH447383.aspx <br> + HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Desktop/DD744952.aspx <br> + HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Desktop/AA364289.aspx <br> +*/ +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +inline VOID KrnlHlprFwpmProviderContextPurgeLocalCopy(_Inout_ FWPM_PROVIDER_CONTEXT* pContext) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpmProviderContextPurgeLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(pContext); + + switch(pContext->type) + { + case FWPM_IPSEC_KEYING_CONTEXT: + { + if(pContext->keyingPolicy) + { + HLPR_DELETE_ARRAY(pContext->keyingPolicy->keyModKeys, + WFPSAMPLER_SYSLIB_TAG); + } + + HLPR_DELETE(pContext->keyingPolicy, + WFPSAMPLER_SYSLIB_TAG); + + break; + } + case FWPM_IPSEC_IKE_QM_TRANSPORT_CONTEXT: + { + break; + } + case FWPM_IPSEC_IKE_QM_TUNNEL_CONTEXT: + { + break; + } + case FWPM_IPSEC_AUTHIP_QM_TRANSPORT_CONTEXT: + { + break; + } + case FWPM_IPSEC_AUTHIP_QM_TUNNEL_CONTEXT: + { + break; + } + case FWPM_IPSEC_IKE_MM_CONTEXT: + { + break; + } + case FWPM_IPSEC_AUTHIP_MM_CONTEXT: + { + break; + } + case FWPM_CLASSIFY_OPTIONS_CONTEXT: + { + KrnlHlprFwpmClassifyOptionsDestroyLocalCopy(&(pContext->classifyOptions)); + + break; + } + case FWPM_GENERAL_CONTEXT: + { + KrnlHlprFwpByteBlobDestroyLocalCopy(&(pContext->dataBuffer)); + + break; + } + +#if(NTDDI_VERSION >= NTDDI_WIN7) + + case FWPM_IPSEC_IKEV2_QM_TUNNEL_CONTEXT: + { + break; + } + case FWPM_IPSEC_IKEV2_MM_CONTEXT: + { + break; + } + case FWPM_IPSEC_DOSP_CONTEXT: + { + KrnlHlprIPsecDoSPOptionsDestroyLocalCopy(&(pContext->idpOptions)); + + break; + } + +#endif /// (NTDDI_VERSION >= NTDDI_WIN7) + + } + + KrnlHlprFwpByteBlobPurgeLocalCopy(&(pContext->providerData)); + + HLPR_DELETE(pContext->providerKey, + WFPSAMPLER_SYSLIB_TAG); + + KrnlHlprFwpmDisplayDataPurgeLocalCopy(&(pContext->displayData)); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpmProviderContextPurgeLocalCopy()\n"); + +#endif /// DBG + + return; +} + +/** + @kernel_helper_function="KrnlHlprFwpmProviderContextDestroyLocalCopy" + + Purpose: Cleanup and free a local copy of an FWPM_PROVIDER_CONTEXT. <br> + <br> + Notes: <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Desktop/HH447383.aspx <br> + HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Desktop/DD744952.aspx <br> + HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Desktop/AA364289.aspx <br> +*/ +_At_(*ppContext, _Pre_ _Notnull_) +_At_(*ppContext, _Post_ _Null_ __drv_freesMem(Pool)) +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Success_(*ppContext == 0) +inline VOID KrnlHlprFwpmProviderContextDestroyLocalCopy(_Inout_ FWPM_PROVIDER_CONTEXT** ppContext) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpmProviderContextDestroyLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(ppContext); + + if(*ppContext) + KrnlHlprFwpmProviderContextPurgeLocalCopy(*ppContext); + + HLPR_DELETE(*ppContext, + WFPSAMPLER_SYSLIB_TAG); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpmProviderContextDestroyLocalCopy()\n"); + +#endif /// DBG + + return; +} + +/** + @kernel_helper_function="KrnlHlprFwpmProviderContextPopulateLocalCopy + + Purpose: Populate a local copy of the FWPM_PROVIDER_CONTEXT. <br> + <br> + Notes: The caller is responsible for freeing the allocated memory using + KrnlHlprFwpmProviderContextPurgeLocalCopy(). <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Desktop/HH447383.aspx <br> + HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Desktop/DD744952.aspx <br> + HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Desktop/AA364289.aspx <br> +*/ +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Check_return_ +_Success_(return == STATUS_SUCCESS) +NTSTATUS KrnlHlprFwpmProviderContextPopulateLocalCopy(_In_ const FWPM_PROVIDER_CONTEXT* pOriginalContext, + _Inout_ FWPM_PROVIDER_CONTEXT* pProviderContext) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpmProviderContextPopulateLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(pOriginalContext); + NT_ASSERT(pProviderContext); + + NTSTATUS status = STATUS_SUCCESS; + + pProviderContext->providerContextKey = pOriginalContext->providerContextKey; + pProviderContext->flags = pOriginalContext->flags; + pProviderContext->type = pOriginalContext->type; + pProviderContext->providerContextId = pOriginalContext->providerContextId; + + switch(pProviderContext->type) + { + case FWPM_IPSEC_KEYING_CONTEXT: + { + if(pOriginalContext->keyingPolicy) + { + HLPR_NEW(pProviderContext->keyingPolicy, + IPSEC_KEYING_POLICY, + WFPSAMPLER_SYSLIB_TAG); + HLPR_BAIL_ON_ALLOC_FAILURE(pProviderContext->keyingPolicy, + status); + + if(pOriginalContext->keyingPolicy->numKeyMods) + { + pProviderContext->keyingPolicy->numKeyMods = pOriginalContext->keyingPolicy->numKeyMods; + + HLPR_NEW_ARRAY(pProviderContext->keyingPolicy->keyModKeys, + GUID, + pProviderContext->keyingPolicy->numKeyMods, + WFPSAMPLER_SYSLIB_TAG); + HLPR_BAIL_ON_ALLOC_FAILURE(pProviderContext->keyingPolicy->keyModKeys, + status); + + RtlCopyMemory(pProviderContext->keyingPolicy->keyModKeys, + pOriginalContext->keyingPolicy->keyModKeys, + pProviderContext->keyingPolicy->numKeyMods * sizeof(GUID)); + } + } + + break; + } + case FWPM_IPSEC_IKE_QM_TRANSPORT_CONTEXT: + { + break; + } + case FWPM_IPSEC_IKE_QM_TUNNEL_CONTEXT: + { + break; + } + case FWPM_IPSEC_AUTHIP_QM_TRANSPORT_CONTEXT: + { + break; + } + case FWPM_IPSEC_AUTHIP_QM_TUNNEL_CONTEXT: + { + break; + } + case FWPM_IPSEC_IKE_MM_CONTEXT: + { + break; + } + case FWPM_IPSEC_AUTHIP_MM_CONTEXT: + { + break; + } + case FWPM_CLASSIFY_OPTIONS_CONTEXT: + { + break; + } + case FWPM_GENERAL_CONTEXT: + { + pProviderContext->dataBuffer = KrnlHlprFwpByteBlobCreateLocalCopy(pOriginalContext->dataBuffer); + HLPR_BAIL_ON_NULL_POINTER_WITH_STATUS(pProviderContext->dataBuffer, + status); + + break; + } + +#if(NTDDI_VERSION >= NTDDI_WIN7) + + case FWPM_IPSEC_IKEV2_QM_TUNNEL_CONTEXT: + { + break; + } + case FWPM_IPSEC_IKEV2_MM_CONTEXT: + { + break; + } + case FWPM_IPSEC_DOSP_CONTEXT: + { + pProviderContext->idpOptions = KrnlHlprIPsecDoSPOptionsCreateLocalCopy(pOriginalContext->idpOptions); + HLPR_BAIL_ON_NULL_POINTER_WITH_STATUS(pProviderContext->idpOptions, + status); + break; + } + +#endif /// (NTDDI_VERSION >= NTDDI_WIN7) + + } + + HLPR_BAIL_LABEL: + + if(status != STATUS_SUCCESS) + KrnlHlprFwpmProviderContextPurgeLocalCopy(pProviderContext); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpmProviderContextPopulateLocalCopy() [status: %#x]\n", + status); + +#endif /// DBG + + return status; +} + +/** + @kernel_helper_function="KrnlHlprFwpmProviderContextCreateLocalCopy + + Purpose: Allocate and populate a local copy of the FWPM_PROVIDER_CONTEXT. <br> + <br> + Notes: The caller is responsible for freeing the allocated memory using + KrnlHlprFwpmProviderContextDestroyLocalCopy(). <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Desktop/HH447383.aspx <br> + HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Desktop/DD744952.aspx <br> + HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Desktop/AA364289.aspx <br> +*/ +__drv_allocatesMem(Pool) +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Must_inspect_result_ +_Success_(return != 0) +FWPM_PROVIDER_CONTEXT* KrnlHlprFwpmProviderContextCreateLocalCopy(_In_ const FWPM_PROVIDER_CONTEXT* pOriginalContext) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpmProviderContextCreateLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(pOriginalContext); + + NTSTATUS status = STATUS_SUCCESS; + FWPM_PROVIDER_CONTEXT* pProviderContext = 0; + +#pragma warning(push) +#pragma warning(disable: 6014) /// pProviderContext is expected to be cleaned up by caller using KrnlHlprFwpmProviderContextDestroyLocalCopy + + HLPR_NEW(pProviderContext, + FWPM_PROVIDER_CONTEXT, + WFPSAMPLER_SYSLIB_TAG); + HLPR_BAIL_ON_ALLOC_FAILURE(pProviderContext, + status); + +#pragma warning(pop) + + status = KrnlHlprFwpmProviderContextPopulateLocalCopy(pOriginalContext, + pProviderContext); + + HLPR_BAIL_LABEL: + +#pragma warning(push) +#pragma warning(disable: 6001) /// pProviderContext initialized with call to HLPR_NEW & KrnlHlprFwpmProviderContextPopulateLocalCopy + + if(status != STATUS_SUCCESS) + KrnlHlprFwpmProviderContextDestroyLocalCopy(&pProviderContext); + +#pragma warning(pop) + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpmProviderContextCreateLocalCopy() [pProviderContext: %#p]\n", + pProviderContext); + +#endif /// DBG + + return pProviderContext; +} + +#endif /// FWPS_PROVIDER_CONTEXT____ + +#ifndef FWPS_FILTER_CONDITION____ +#define FWPS_FILTER_CONDITION____ + +/** + @kernel_helper_function="KrnlHlprFwpsFilterConditionPurgeLocalCopy" + + Purpose: Cleanup a local copy of an FWPS_FILTER_CONDITION. <br> + <br> + Notes: <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552391.aspx <br> +*/ +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +inline VOID KrnlHlprFwpsFilterConditionPurgeLocalCopy(_Inout_ FWPS_FILTER_CONDITION* pCondition) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpsFilterConditionPurgeLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(pCondition); + + KrnlHlprFwpConditionValuePurgeLocalCopy(&(pCondition->conditionValue)); + + RtlZeroMemory(pCondition, + sizeof(FWPS_FILTER_CONDITION)); + + pCondition->matchType = FWP_MATCH_TYPE_MAX; + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpsFilterConditionPurgeLocalCopy()\n"); + +#endif /// DBG + + return; +} + +/** + @kernel_helper_function="KrnlHlprFwpsFilterConditionDestroyLocalCopy" + + Purpose: Cleanup and free a local copy of an FWPS_FILTER_CONDITION. <br> + <br> + Notes: <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552391.aspx <br> +*/ +_At_(*ppConditions, _Pre_ _Notnull_) +_At_(*ppConditions, _Post_ _Null_ __drv_freesMem(Pool)) +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Success_(*ppConditions == 0) +inline VOID KrnlHlprFwpsFilterConditionDestroyLocalCopy(_Inout_ FWPS_FILTER_CONDITION** ppConditions, + _In_ UINT32 numConditions) /* 1 */ +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpsFilterConditionDestroyLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(ppConditions); + + if(*ppConditions) + { + for(UINT32 conditionIndex = 0; + conditionIndex < numConditions; + conditionIndex++) + { + KrnlHlprFwpsFilterConditionPurgeLocalCopy(&((*ppConditions)[conditionIndex])); + } + } + + HLPR_DELETE_ARRAY(*ppConditions, + WFPSAMPLER_SYSLIB_TAG); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpsFilterConditionDestroyLocalCopy()\n"); + +#endif /// DBG + + return; +} + +/** + @kernel_helper_function="KrnlHlprFwpsFilterConditionPopulateLocalCopy" + + Purpose: Populate a local copy of an FWPS_FILTER_CONDITION. <br> + <br> + Notes: The caller is responsible for freeing any allocated memory using + KrnlHlprFwpsFilterConditionPurgeLocalCopy(). <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552391.aspx <br> +*/ +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Check_return_ +_Success_(return == STATUS_SUCCESS) +NTSTATUS KrnlHlprFwpsFilterConditionPopulateLocalCopy(_In_ const FWPS_FILTER_CONDITION* pOriginalCondition, + _Inout_ FWPS_FILTER_CONDITION* pCondition) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpsFilterConditionPopulateLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(pOriginalCondition); + NT_ASSERT(pCondition); + + NTSTATUS status = STATUS_SUCCESS; + + pCondition->fieldId = pOriginalCondition->fieldId; + pCondition->reserved = pOriginalCondition->reserved; + pCondition->matchType = pOriginalCondition->matchType; + + status = KrnlHlprFwpConditionValuePopulateLocalCopy(&(pOriginalCondition->conditionValue), + &(pCondition->conditionValue)); + + if(status != STATUS_SUCCESS) + KrnlHlprFwpsFilterConditionPurgeLocalCopy(pCondition); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpsFilterConditionPopulateLocalCopy() [status: %#x]\n", + status); + +#endif /// DBG + + return status; +} + +/** + @kernel_helper_function="KrnlHlprFwpsFilterConditionCreateLocalCopy" + + Purpose: Allocate and populate a local copy of an FWPS_FILTER_CONDITION. <br> + <br> + Notes: The caller is responsible for freeing any allocated memory using + KrnlHlprFwpsFilterConditionDestroyLocalCopy(). <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552391.aspx <br> +*/ +__drv_allocatesMem(Pool) +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Must_inspect_result_ +_Success_(return != 0) +FWPS_FILTER_CONDITION* KrnlHlprFwpsFilterConditionCreateLocalCopy(_In_reads_(numConditions) const FWPS_FILTER_CONDITION* pOriginalConditions, + _In_ UINT32 numConditions) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpsFilterConditionCreateLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(pOriginalConditions); + NT_ASSERT(numConditions); + + NTSTATUS status = STATUS_SUCCESS; + FWPS_FILTER_CONDITION* pConditions = 0; + +#pragma warning(push) +#pragma warning(disable: 6014) /// pConditions is expected to be cleaned up by caller using KrnlHlprFwpsFilterConditionDestroyLocalCopy + + HLPR_NEW_ARRAY(pConditions, + FWPS_FILTER_CONDITION, + numConditions, + WFPSAMPLER_SYSLIB_TAG); + HLPR_BAIL_ON_ALLOC_FAILURE(pConditions, + status); + +#pragma warning(pop) + + for(UINT32 conditionIndex = 0; + conditionIndex < numConditions; + conditionIndex++) + { + status = KrnlHlprFwpsFilterConditionPopulateLocalCopy(&(pOriginalConditions[conditionIndex]), + &(pConditions[conditionIndex])); + } + + HLPR_BAIL_LABEL: + +#pragma warning(push) +#pragma warning(disable: 6001) /// pConditions initialized with call to HLPR_NEW_ARRAY & KrnlHlprFwpsFilterConditionPopulateLocalCopy + + if(status != STATUS_SUCCESS && + pConditions) + KrnlHlprFwpsFilterConditionDestroyLocalCopy(&pConditions); + +#pragma warning(pop) + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpsFilterConditionCreateLocalCopy() [pConditions: %#p]\n", + pConditions); + +#endif /// DBG + + return pConditions; +} + +#endif /// FWPS_FILTER_CONDITION____ + +#ifndef FWPS_FILTER____ +#define FWPS_FILTER____ + +/** + @kernel_helper_function="KrnlHlprFwpsFilterPurgeLocalCopy" + + Purpose: Cleanup a local copy of an FWPS_FILTER. <br> + <br> + Notes: <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/EE220716.aspx <br> +*/ +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +inline VOID KrnlHlprFwpsFilterPurgeLocalCopy(_Inout_ FWPS_FILTER* pFilter) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpsFilterPurgeLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(pFilter); + + KrnlHlprFwpmProviderContextDestroyLocalCopy(&(pFilter->providerContext)); + + KrnlHlprFwpsFilterConditionDestroyLocalCopy(&(pFilter->filterCondition), + pFilter->numFilterConditions); + + KrnlHlprFwpValuePurgeLocalCopy(&(pFilter->weight)); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpsFilterPurgeLocalCopy()\n"); + +#endif /// DBG + + return; +} + +/** + @kernel_helper_function="KrnlHlprFwpsFilterDestroyLocalCopy" + + Purpose: Cleanup and free a local copy of an FWPS_FILTER. <br> + <br> + Notes: <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/HH439768.aspx <br> + HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552389.aspx <br> + HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552387.aspx <br> +*/ +_At_(*ppFilter, _Pre_ _Notnull_) +_At_(*ppFilter, _Post_ _Null_ __drv_freesMem(Pool)) +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Success_(*ppFilter == 0) +inline VOID KrnlHlprFwpsFilterDestroyLocalCopy(_Inout_ FWPS_FILTER** ppFilter) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpsFilterDestroyLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(ppFilter); + + if(*ppFilter) + KrnlHlprFwpsFilterPurgeLocalCopy(*ppFilter); + + HLPR_DELETE(*ppFilter, + WFPSAMPLER_SYSLIB_TAG); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpsFilterDestroyLocalCopy()\n"); + +#endif /// DBG + + return; +} + +/** + @kernel_helper_function="KrnlHlprFwpsFilterPopulateLocalCopy + + Purpose: Populate a local copy of the FWPS_FILTER. <br> + <br> + Notes: The caller is responsible for freeing the allocated memory using + KrnlHlprFwpsFilterPurgeLocalCopy(). <br> + <br> + + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/HH439768.aspx <br> + HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552389.aspx <br> + HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552387.aspx <br> +*/ +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Check_return_ +_Success_(return == STATUS_SUCCESS) +NTSTATUS KrnlHlprFwpsFilterPopulateLocalCopy(_In_ const FWPS_FILTER* pOriginalFilter, + _Inout_ FWPS_FILTER* pFilter) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpsFilterPopulateLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(pOriginalFilter); + NT_ASSERT(pFilter); + + NTSTATUS status = STATUS_SUCCESS; + + pFilter->filterId = pOriginalFilter->filterId; + pFilter->subLayerWeight = pOriginalFilter->subLayerWeight; + pFilter->flags = pOriginalFilter->flags; + pFilter->numFilterConditions = pOriginalFilter->numFilterConditions; + pFilter->action.type = pOriginalFilter->action.type; + pFilter->action.calloutId = pOriginalFilter->action.calloutId; + pFilter->context = pOriginalFilter->context; + + status = KrnlHlprFwpValuePopulateLocalCopy(&(pOriginalFilter->weight), + &(pFilter->weight)); + HLPR_BAIL_ON_FAILURE(status); + + if(pFilter->numFilterConditions) + { + pFilter->filterCondition = KrnlHlprFwpsFilterConditionCreateLocalCopy(pOriginalFilter->filterCondition, + pFilter->numFilterConditions); + HLPR_BAIL_ON_NULL_POINTER_WITH_STATUS(pFilter->filterCondition, + status); + } + + if(pOriginalFilter->providerContext) + { + pFilter->providerContext = KrnlHlprFwpmProviderContextCreateLocalCopy(pOriginalFilter->providerContext); + HLPR_BAIL_ON_ALLOC_FAILURE(pFilter->providerContext, + status); + } + + HLPR_BAIL_LABEL: + + if(status != STATUS_SUCCESS) + KrnlHlprFwpsFilterPurgeLocalCopy(pFilter); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpsFilterPopulateLocalCopy() [status: %#x]\n", + status); + +#endif /// DBG + + return status; +} + +/** + @kernel_helper_function="KrnlHlprFwpsFilterCreateLocalCopy + + Purpose: Allocate and populate a local copy of the FWPS_FILTER. <br> + <br> + Notes: The caller is responsible for freeing the allocated memory using + KrnlHlprFwpsFilterDestroyLocalCopy(). <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/HH439768.aspx <br> + HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552389.aspx <br> + HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF552387.aspx <br> +*/ +__drv_allocatesMem(Pool) +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Must_inspect_result_ +_Success_(return != 0) +FWPS_FILTER* KrnlHlprFwpsFilterCreateLocalCopy(_In_ const FWPS_FILTER* pOriginalFilter) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpsFilterCreateLocalCopy()\n"); + +#endif /// DBG + + NT_ASSERT(pOriginalFilter); + + NTSTATUS status = STATUS_SUCCESS; + FWPS_FILTER* pFilter = 0; + +#pragma warning(push) +#pragma warning(disable: 6014) /// pFilter is expected to be cleaned up by caller using KrnlHlprFwpsFilterDestroyLocalCopy + + HLPR_NEW(pFilter, + FWPS_FILTER, + WFPSAMPLER_SYSLIB_TAG); + HLPR_BAIL_ON_ALLOC_FAILURE(pFilter, + status); + +#pragma warning(pop) + + status = KrnlHlprFwpsFilterPopulateLocalCopy(pOriginalFilter, + pFilter); + + HLPR_BAIL_LABEL: + +#pragma warning(push) +#pragma warning(disable: 6001) /// pFilter initialized with call to HLPR_NEW & KrnlHlprFwpsFilterPopulateLocalCopy + + if(status != STATUS_SUCCESS) + KrnlHlprFwpsFilterDestroyLocalCopy(&pFilter); + +#pragma warning(pop) + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpsFilterCreateLocalCopy() [pFilter: %p]\n", + pFilter); + +#endif /// DBG + + return pFilter; +} + +#endif /// FWPS_FILTER____ + +#ifndef FWPM_SESSION____ +#define FWPM_SESSION____ + +/** + @kernel_helper_function="KrnlHlprFwpmSessionReleaseHandle + + Purpose: Close an open handle to BFE. <br> + <br> + Notes: <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF550072.aspx <br> +*/ +_IRQL_requires_(PASSIVE_LEVEL) +_IRQL_requires_same_ +_Success_(return == STATUS_SUCCESS) +NTSTATUS KrnlHlprFwpmSessionReleaseHandle(_Inout_ HANDLE* pEngineHandle) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpmSessionReleaseHandle()\n"); + +#endif /// DBG + + NT_ASSERT(pEngineHandle); + + NTSTATUS status = STATUS_SUCCESS; + + if(*pEngineHandle) + { + status = FwpmEngineClose(*pEngineHandle); + if(status != STATUS_SUCCESS) + { + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_ERROR_LEVEL, + " !!!! KrnlHlprFwpmSessionReleaseHandle : FwpmEngineClose() [status: %#x]\n", + status); + + HLPR_BAIL; + } + + *pEngineHandle = 0; + } + + HLPR_BAIL_LABEL: + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpmSessionReleaseHandle() [status: %#x]\n", + status); + +#endif /// DBG + + return status; +} + +/** + @kernel_helper_function="KrnlHlprFwpmSessionDestroyEngineHandle + + Purpose: Close an open handle to BFE and set the handle to 0. <br> + <br> + Notes: <br> + <br> + MSDN_Ref: <br> +*/ +_At_(*ppEngineHandle, _Pre_ _Notnull_) +_At_(*ppEngineHandle, _Post_ _Null_) +_IRQL_requires_(PASSIVE_LEVEL) +_IRQL_requires_same_ +_Success_(*ppEngineHandle == 0) +VOID KrnlHlprFwpmSessionDestroyEngineHandle(_Inout_ HANDLE** ppEngineHandle) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpmSessionDestroyEngineHandle()\n"); + +#endif /// DBG + + NT_ASSERT(ppEngineHandle); + + if(*ppEngineHandle) + KrnlHlprFwpmSessionReleaseHandle(*ppEngineHandle); + + *ppEngineHandle = 0; + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpmSessionDestroyEngineHandle()\n"); + +#endif /// DBG + + return; +} + +/** + @kernel_helper_function="KrnlHlprFwpmSessionAcquireHandle + + Purpose: Open a handle to BFE. <br> + <br> + Notes: <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF550083.aspx <br> + HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF550075.aspx <br> +*/ +_IRQL_requires_(PASSIVE_LEVEL) +_IRQL_requires_same_ +_Check_return_ +_Success_(return == STATUS_SUCCESS) +NTSTATUS KrnlHlprFwpmSessionAcquireHandle(_Inout_ HANDLE* pEngineHandle, + _In_ const GUID* pSessionKey) /* WFPSAMPLER_SESSION_KM */ +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpmSessionAcquireHandle()\n"); + +#endif /// DBG + + NT_ASSERT(pEngineHandle); + NT_ASSERT(pSessionKey); + + NTSTATUS status = STATUS_SUCCESS; + FWPM_SESSION session = {0}; + + session.sessionKey = *pSessionKey; + session.displayData.name = L"Microsoft Corporation - WFPSampler's Session"; + session.displayData.description = L"Session created by WFPSampler"; + + status = FwpmEngineOpen(0, + RPC_C_AUTHN_WINNT, + 0, + &session, + pEngineHandle); + if(status != STATUS_SUCCESS || + *pEngineHandle == 0) + { + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_ERROR_LEVEL, + " !!!! KrnlHlprFwpmSessionAcquireHandle : FwpmEngineOpen() [status: %#x][*pEngineHandle: %#p]\n", + status, + *pEngineHandle); + + *pEngineHandle = 0; + } + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpmSessionAcquireHandle() [status: %#x]\n", + status); + +#endif /// DBG + + return status; +} + +/** + @kernel_helper_function="KrnlHlprFwpmSessionCreateEngineHandle + + Purpose: Open a handle to BFE. <br> + <br> + Notes: <br> + <br> + MSDN_Ref: <br> +*/ +_When_(return != STATUS_SUCCESS, _At_(*ppEngineHandle, _Post_ _Null_)) +_When_(return == STATUS_SUCCESS, _At_(*ppEngineHandle, _Post_ _Notnull_)) +_IRQL_requires_(PASSIVE_LEVEL) +_IRQL_requires_same_ +_Check_return_ +_Success_(return == STATUS_SUCCESS) +NTSTATUS KrnlHlprFwpmSessionCreateEngineHandle(_Outptr_ HANDLE** ppEngineHandle, + _In_ const GUID* pSessionKey) /* WFPSAMPLER_SESSION_KM */ +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpmSessionCreateEngineHandle()\n"); + +#endif /// DBG + + NT_ASSERT(ppEngineHandle); + NT_ASSERT(pSessionKey); + + NTSTATUS status = STATUS_SUCCESS; + + *ppEngineHandle = 0; + + status = KrnlHlprFwpmSessionAcquireHandle(&g_EngineHandle, + pSessionKey); + HLPR_BAIL_ON_FAILURE(status); + + *ppEngineHandle = &g_EngineHandle; + + HLPR_BAIL_LABEL: + + if(status != STATUS_SUCCESS) + KrnlHlprFwpmSessionReleaseHandle(&g_EngineHandle); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpmSessionCreateEngineHandle() [status: %#x]\n", + status); + +#endif /// DBG + + return status; +} + +#endif /// FWPS_SESSION____ + +#ifndef FwpsInjection____ +#define FwpsInjection____ + +/** + @kernel_helper_function="KrnlHlprFwpsInjectionReleaseHandle + + Purpose: Destroy an opened injection handle and set it to 0. <br> + <br> + Notes: <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF551181.aspx <br> +*/ +_IRQL_requires_(PASSIVE_LEVEL) +_IRQL_requires_same_ +_Check_return_ +_Success_(return == STATUS_SUCCESS) +NTSTATUS KrnlHlprFwpsInjectionReleaseHandle(_In_ HANDLE* pInjectionHandle) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpsInjectionReleaseHandle()\n"); + +#endif /// DBG + + NT_ASSERT(pInjectionHandle); + + NTSTATUS status = STATUS_SUCCESS; + + status = FwpsInjectionHandleDestroy(*pInjectionHandle); + if(status != STATUS_SUCCESS) + { + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_ERROR_LEVEL, + " !!!! KrnlHlprFwpsInjectionReleaseHandle : FwpsInjectionHandleDestroy() [status: %#x]\n", + status); + + HLPR_BAIL; + } + + *pInjectionHandle = 0; + + HLPR_BAIL_LABEL: + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpsInjectionReleaseHandle() {status: %#x]\n", + status); + +#endif /// DBG + + return status; +} + +/** + @kernel_helper_function="KrnlHlprFwpsInjectionAcquireHandle + + Purpose: Open injection handle for use with the various injection APIs. <br> + <br> + Notes: <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/FF551180.aspx <br> +*/ +_IRQL_requires_(PASSIVE_LEVEL) +_IRQL_requires_same_ +_Check_return_ +_Success_(return == STATUS_SUCCESS) +NTSTATUS KrnlHlprFwpsInjectionAcquireHandle(_Inout_ HANDLE* pInjectionHandle, + _In_ ADDRESS_FAMILY addressFamily, /* AF_UNSPEC */ + _In_ UINT32 injectionType) /* 0 */ +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpsInjectionAcquireHandle()\n"); + +#endif /// DBG + + NT_ASSERT(pInjectionHandle); + + NTSTATUS status = STATUS_SUCCESS; + + status = FwpsInjectionHandleCreate(addressFamily, + injectionType, + pInjectionHandle); + if(status != STATUS_SUCCESS) + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_ERROR_LEVEL, + " !!!! KrnlHlprFwpsInjectionAcquireHandle : FwpsInjectionHandleCreate() [status: %#x]\n", + status); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpsInjectionAcquireHandle() [status: %#x]\n", + status); + +#endif /// DBG + + return status; +} + +#endif /// FwpsInjection____ + +#if(NTDDI_VERSION >= NTDDI_WIN8) + +#ifndef FwpsRedirection____ +#define FwpsRedirection____ + +/** + @kernel_helper_function="KrnlHlprFwpsRedirectHandleDestroy + + Purpose: Destroy an opened redirection handle and set it to 0. <br> + <br> + Notes: <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/HH439684.aspx <br> +*/ +_IRQL_requires_(PASSIVE_LEVEL) +_IRQL_requires_same_ +VOID KrnlHlprFwpsRedirectHandleDestroy(_In_ HANDLE* pRedirectionHandle) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpsRedirectHandleDestroy()\n"); + +#endif /// DBG + + NT_ASSERT(pRedirectionHandle); + + FwpsRedirectHandleDestroy(*pRedirectionHandle); + + *pRedirectionHandle = 0; + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpsRedirectHandleDestroy()\n"); + +#endif /// DBG + + return; +} + +/** + @kernel_helper_function="KrnlHlprFwpsRedirectHandleCreate + + Purpose: Open redirection handle for use with the various redirection APIs. <br> + <br> + Notes: <br> + <br> + MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Hardware/HH439681.aspx <br> +*/ +_IRQL_requires_(PASSIVE_LEVEL) +_IRQL_requires_same_ +_Check_return_ +_Success_(return == STATUS_SUCCESS) +NTSTATUS KrnlHlprFwpsRedirectHandleCreate(_Inout_ HANDLE* pRedirectionHandle) /* 0 */ +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> KrnlHlprFwpsRedirectHandleCreate()\n"); + +#endif /// DBG + + NT_ASSERT(pRedirectionHandle); + + NTSTATUS status = STATUS_SUCCESS; + + status = FwpsRedirectHandleCreate(&WFPSAMPLER_PROVIDER, + 0, + pRedirectionHandle); + if(status != STATUS_SUCCESS) + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_ERROR_LEVEL, + " !!!! KrnlHlprFwpsRedirectHandleCreate : FwpsRedirectHandleCreate() [status: %#x]\n", + status); + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- KrnlHlprFwpsRedirectHandleCreate() [status: %#x]\n", + status); + +#endif /// DBG + + return status; +} + +#endif /// FwpsRedirection____ + +#endif /// (NTDDI_VERSION >= NTDDI_WIN8) + +#ifndef FwpsLayer____ +#define FwpsLayer____ + +/** + @helper function="KrnlHlprFwpsLayerGetDirection" + + Purpose: Determine the direction of the NBL based on the layer. <br> + <br> + Notes: <br> + <br> + MSDN_Ref: <br> +*/ +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +FWP_DIRECTION KrnlHlprFwpsLayerGetDirection(_In_ UINT32 layerID) +{ + FWP_DIRECTION direction = FWP_DIRECTION_MAX; + + if(layerID == FWPS_LAYER_INBOUND_IPPACKET_V4 || + layerID == FWPS_LAYER_INBOUND_IPPACKET_V4_DISCARD || + layerID == FWPS_LAYER_INBOUND_IPPACKET_V6 || + layerID == FWPS_LAYER_INBOUND_IPPACKET_V6_DISCARD || + layerID == FWPS_LAYER_INBOUND_TRANSPORT_V4 || + layerID == FWPS_LAYER_INBOUND_TRANSPORT_V4_DISCARD || + layerID == FWPS_LAYER_INBOUND_TRANSPORT_V6 || + layerID == FWPS_LAYER_INBOUND_TRANSPORT_V6_DISCARD || + layerID == FWPS_LAYER_INBOUND_ICMP_ERROR_V4 || + layerID == FWPS_LAYER_INBOUND_ICMP_ERROR_V4_DISCARD || + layerID == FWPS_LAYER_INBOUND_ICMP_ERROR_V6 || + layerID == FWPS_LAYER_INBOUND_ICMP_ERROR_V6_DISCARD || + layerID == FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4 || + layerID == FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4_DISCARD || + layerID == FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6 || + layerID == FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6_DISCARD + +#if(NTDDI_VERSION >= NTDDI_WIN8) + + || + layerID == FWPS_LAYER_INBOUND_MAC_FRAME_ETHERNET || + layerID == FWPS_LAYER_INBOUND_MAC_FRAME_NATIVE + +#endif /// (NTDDI_VERSION >= NTDDI_WIN8) + + ) + direction = FWP_DIRECTION_INBOUND; + else if(layerID == FWPS_LAYER_OUTBOUND_IPPACKET_V4 || + layerID == FWPS_LAYER_OUTBOUND_IPPACKET_V4_DISCARD || + layerID == FWPS_LAYER_OUTBOUND_IPPACKET_V6 || + layerID == FWPS_LAYER_OUTBOUND_IPPACKET_V6_DISCARD || + layerID == FWPS_LAYER_OUTBOUND_TRANSPORT_V4 || + layerID == FWPS_LAYER_OUTBOUND_TRANSPORT_V4_DISCARD || + layerID == FWPS_LAYER_OUTBOUND_TRANSPORT_V6 || + layerID == FWPS_LAYER_OUTBOUND_TRANSPORT_V6_DISCARD || + layerID == FWPS_LAYER_OUTBOUND_ICMP_ERROR_V4 || + layerID == FWPS_LAYER_OUTBOUND_ICMP_ERROR_V4_DISCARD || + layerID == FWPS_LAYER_OUTBOUND_ICMP_ERROR_V6 || + layerID == FWPS_LAYER_OUTBOUND_ICMP_ERROR_V6_DISCARD || + layerID == FWPS_LAYER_ALE_AUTH_CONNECT_V4 || + layerID == FWPS_LAYER_ALE_AUTH_CONNECT_V4_DISCARD || + layerID == FWPS_LAYER_ALE_AUTH_CONNECT_V6 || + layerID == FWPS_LAYER_ALE_AUTH_CONNECT_V6_DISCARD + +#if(NTDDI_VERSION >= NTDDI_WIN8) + + || + layerID == FWPS_LAYER_OUTBOUND_MAC_FRAME_ETHERNET || + layerID == FWPS_LAYER_OUTBOUND_MAC_FRAME_NATIVE + +#endif /// (NTDDI_VERSION >= NTDDI_WIN8) + + ) + direction = FWP_DIRECTION_OUTBOUND; + + return direction; +} + +/** + @helper function="KrnlHlprFwpsLayerIsIPv4" + + Purpose: Determine if the layer is an IPv4 layer. <br> + <br> + Notes: <br> + <br> + MSDN_Ref: <br> +*/ +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +BOOLEAN KrnlHlprFwpsLayerIsIPv4(_In_ UINT32 layerID) +{ + BOOLEAN isIPv4 = FALSE; + + if(layerID == FWPS_LAYER_INBOUND_IPPACKET_V4 || + layerID == FWPS_LAYER_INBOUND_IPPACKET_V4_DISCARD || + layerID == FWPS_LAYER_OUTBOUND_IPPACKET_V4 || + layerID == FWPS_LAYER_OUTBOUND_IPPACKET_V4_DISCARD || + layerID == FWPS_LAYER_IPFORWARD_V4 || + layerID == FWPS_LAYER_IPFORWARD_V4_DISCARD || + layerID == FWPS_LAYER_INBOUND_TRANSPORT_V4 || + layerID == FWPS_LAYER_INBOUND_TRANSPORT_V4_DISCARD || + layerID == FWPS_LAYER_OUTBOUND_TRANSPORT_V4 || + layerID == FWPS_LAYER_OUTBOUND_TRANSPORT_V4_DISCARD || + layerID == FWPS_LAYER_STREAM_V4 || + layerID == FWPS_LAYER_STREAM_V4_DISCARD || + layerID == FWPS_LAYER_DATAGRAM_DATA_V4 || + layerID == FWPS_LAYER_DATAGRAM_DATA_V4_DISCARD || + layerID == FWPS_LAYER_INBOUND_ICMP_ERROR_V4 || + layerID == FWPS_LAYER_INBOUND_ICMP_ERROR_V4_DISCARD || + layerID == FWPS_LAYER_OUTBOUND_ICMP_ERROR_V4 || + layerID == FWPS_LAYER_OUTBOUND_ICMP_ERROR_V4_DISCARD || + layerID == FWPS_LAYER_ALE_RESOURCE_ASSIGNMENT_V4 || + layerID == FWPS_LAYER_ALE_RESOURCE_ASSIGNMENT_V4_DISCARD || + layerID == FWPS_LAYER_ALE_AUTH_LISTEN_V4 || + layerID == FWPS_LAYER_ALE_AUTH_LISTEN_V4_DISCARD || + layerID == FWPS_LAYER_ALE_AUTH_CONNECT_V4 || + layerID == FWPS_LAYER_ALE_AUTH_CONNECT_V4_DISCARD || + layerID == FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4 || + layerID == FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4_DISCARD || + layerID == FWPS_LAYER_ALE_FLOW_ESTABLISHED_V4 || + layerID == FWPS_LAYER_ALE_FLOW_ESTABLISHED_V4_DISCARD || + +#if(NTDDI_VERSION >= NTDDI_WIN7) + + layerID == FWPS_LAYER_NAME_RESOLUTION_CACHE_V4 || + layerID == FWPS_LAYER_ALE_RESOURCE_RELEASE_V4 || + layerID == FWPS_LAYER_ALE_ENDPOINT_CLOSURE_V4 || + layerID == FWPS_LAYER_ALE_CONNECT_REDIRECT_V4 || + layerID == FWPS_LAYER_ALE_BIND_REDIRECT_V4 || + layerID == FWPS_LAYER_STREAM_PACKET_V4 || + +#if(NTDDI_VERSION >= NTDDI_WIN8) + + layerID == FWPS_LAYER_INGRESS_VSWITCH_TRANSPORT_V4 || + layerID == FWPS_LAYER_EGRESS_VSWITCH_TRANSPORT_V4 || + +#endif /// (NTDDI_VERSION >= NTDDI_WIN8) +#endif /// (NTDDI_VERSION >= NTDDI_WIN7) + + layerID == FWPS_LAYER_IPSEC_KM_DEMUX_V4 || + layerID == FWPS_LAYER_IPSEC_V4 || + layerID == FWPS_LAYER_IKEEXT_V4) + isIPv4 = TRUE; + + return isIPv4; +} + +/** + @helper function="KrnlHlprFwpsLayerIsIPv6" + + Purpose: Determine if the layer is an IPv6 layer. <br> + <br> + Notes: <br> + <br> + MSDN_Ref: <br> +*/ +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +BOOLEAN KrnlHlprFwpsLayerIsIPv6(_In_ UINT32 layerID) +{ + BOOLEAN isIPv6 = FALSE; + + if(layerID == FWPS_LAYER_INBOUND_IPPACKET_V6 || + layerID == FWPS_LAYER_INBOUND_IPPACKET_V6_DISCARD || + layerID == FWPS_LAYER_OUTBOUND_IPPACKET_V6 || + layerID == FWPS_LAYER_OUTBOUND_IPPACKET_V6_DISCARD || + layerID == FWPS_LAYER_IPFORWARD_V6 || + layerID == FWPS_LAYER_IPFORWARD_V6_DISCARD || + layerID == FWPS_LAYER_INBOUND_TRANSPORT_V6 || + layerID == FWPS_LAYER_INBOUND_TRANSPORT_V6_DISCARD || + layerID == FWPS_LAYER_OUTBOUND_TRANSPORT_V6 || + layerID == FWPS_LAYER_OUTBOUND_TRANSPORT_V6_DISCARD || + layerID == FWPS_LAYER_STREAM_V6 || + layerID == FWPS_LAYER_STREAM_V6_DISCARD || + layerID == FWPS_LAYER_DATAGRAM_DATA_V6 || + layerID == FWPS_LAYER_DATAGRAM_DATA_V6_DISCARD || + layerID == FWPS_LAYER_INBOUND_ICMP_ERROR_V6 || + layerID == FWPS_LAYER_INBOUND_ICMP_ERROR_V6_DISCARD || + layerID == FWPS_LAYER_OUTBOUND_ICMP_ERROR_V6 || + layerID == FWPS_LAYER_OUTBOUND_ICMP_ERROR_V6_DISCARD || + layerID == FWPS_LAYER_ALE_RESOURCE_ASSIGNMENT_V6 || + layerID == FWPS_LAYER_ALE_RESOURCE_ASSIGNMENT_V6_DISCARD || + layerID == FWPS_LAYER_ALE_AUTH_LISTEN_V6 || + layerID == FWPS_LAYER_ALE_AUTH_LISTEN_V6_DISCARD || + layerID == FWPS_LAYER_ALE_AUTH_CONNECT_V6 || + layerID == FWPS_LAYER_ALE_AUTH_CONNECT_V6_DISCARD || + layerID == FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6 || + layerID == FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6_DISCARD || + layerID == FWPS_LAYER_ALE_FLOW_ESTABLISHED_V6 || + layerID == FWPS_LAYER_ALE_FLOW_ESTABLISHED_V6_DISCARD || + +#if(NTDDI_VERSION >= NTDDI_WIN7) + + layerID == FWPS_LAYER_NAME_RESOLUTION_CACHE_V6 || + layerID == FWPS_LAYER_ALE_RESOURCE_RELEASE_V6 || + layerID == FWPS_LAYER_ALE_ENDPOINT_CLOSURE_V6 || + layerID == FWPS_LAYER_ALE_CONNECT_REDIRECT_V6 || + layerID == FWPS_LAYER_ALE_BIND_REDIRECT_V6 || + layerID == FWPS_LAYER_STREAM_PACKET_V6 || + +#if(NTDDI_VERSION >= NTDDI_WIN8) + + layerID == FWPS_LAYER_INGRESS_VSWITCH_TRANSPORT_V6 || + layerID == FWPS_LAYER_EGRESS_VSWITCH_TRANSPORT_V6 || + +#endif /// (NTDDI_VERSION >= NTDDI_WIN8) +#endif /// (NTDDI_VERSION >= NTDDI_WIN7) + + layerID == FWPS_LAYER_IPSEC_KM_DEMUX_V6 || + layerID == FWPS_LAYER_IPSEC_V6 || + layerID == FWPS_LAYER_IKEEXT_V6) + isIPv6 = TRUE; + + return isIPv6; +} + +/** + @helper function="KrnlHlprFwpsLayerIsDiscard" + + Purpose: Determine if the layer is a discard layer. <br> + <br> + Notes: <br> + <br> + MSDN_Ref: <br> +*/ +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +BOOLEAN KrnlHlprFwpsLayerIsDiscard(_In_ UINT32 layerID) +{ + BOOLEAN isDiscard = FALSE; + + if(layerID == FWPS_LAYER_INBOUND_IPPACKET_V4_DISCARD || + layerID == FWPS_LAYER_INBOUND_IPPACKET_V6_DISCARD || + layerID == FWPS_LAYER_OUTBOUND_IPPACKET_V4_DISCARD || + layerID == FWPS_LAYER_OUTBOUND_IPPACKET_V6_DISCARD || + layerID == FWPS_LAYER_IPFORWARD_V4_DISCARD || + layerID == FWPS_LAYER_IPFORWARD_V6_DISCARD || + layerID == FWPS_LAYER_INBOUND_TRANSPORT_V4_DISCARD || + layerID == FWPS_LAYER_INBOUND_TRANSPORT_V6_DISCARD || + layerID == FWPS_LAYER_OUTBOUND_TRANSPORT_V4_DISCARD || + layerID == FWPS_LAYER_OUTBOUND_TRANSPORT_V6_DISCARD || + layerID == FWPS_LAYER_STREAM_V4_DISCARD || + layerID == FWPS_LAYER_STREAM_V6_DISCARD || + layerID == FWPS_LAYER_DATAGRAM_DATA_V4_DISCARD || + layerID == FWPS_LAYER_DATAGRAM_DATA_V6_DISCARD || + layerID == FWPS_LAYER_INBOUND_ICMP_ERROR_V4_DISCARD || + layerID == FWPS_LAYER_INBOUND_ICMP_ERROR_V6_DISCARD || + layerID == FWPS_LAYER_OUTBOUND_ICMP_ERROR_V4_DISCARD || + layerID == FWPS_LAYER_OUTBOUND_ICMP_ERROR_V6_DISCARD || + layerID == FWPS_LAYER_ALE_RESOURCE_ASSIGNMENT_V4_DISCARD || + layerID == FWPS_LAYER_ALE_RESOURCE_ASSIGNMENT_V6_DISCARD || + layerID == FWPS_LAYER_ALE_AUTH_LISTEN_V4_DISCARD || + layerID == FWPS_LAYER_ALE_AUTH_LISTEN_V6_DISCARD || + layerID == FWPS_LAYER_ALE_AUTH_CONNECT_V4_DISCARD || + layerID == FWPS_LAYER_ALE_AUTH_CONNECT_V6_DISCARD || + layerID == FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4_DISCARD || + layerID == FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6_DISCARD || + layerID == FWPS_LAYER_ALE_FLOW_ESTABLISHED_V4_DISCARD || + layerID == FWPS_LAYER_ALE_FLOW_ESTABLISHED_V6_DISCARD) + isDiscard = TRUE; + + return isDiscard; +} + +/** + @helper function="KrnlHlprFwpsLayerIDToString" + + Purpose: Return a string representation of the supplied layer. <br> + <br> + Notes: <br> + <br> + MSDN_Ref: <br> +*/ +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Success_(return != 0) +PSTR KrnlHlprFwpsLayerIDToString(_In_ UINT32 layerID) +{ + PSTR pLayerString = 0; + + if(layerID == FWPS_LAYER_INBOUND_IPPACKET_V4) + pLayerString = "FWPS_LAYER_INBOUND_IPPACKET_V4"; + else if(layerID == FWPS_LAYER_INBOUND_IPPACKET_V4_DISCARD) + pLayerString = "FWPS_LAYER_INBOUND_IPPACKET_V4_DISCARD"; + else if(layerID == FWPS_LAYER_INBOUND_IPPACKET_V6) + pLayerString = "FWPS_LAYER_INBOUND_IPPACKET_V6"; + else if(layerID == FWPS_LAYER_INBOUND_IPPACKET_V6_DISCARD) + pLayerString = "FWPS_LAYER_INBOUND_IPPACKET_V6_DISCARD"; + else if(layerID == FWPS_LAYER_OUTBOUND_IPPACKET_V4) + pLayerString = "FWPS_LAYER_OUTBOUND_IPPACKET_V4"; + else if(layerID == FWPS_LAYER_OUTBOUND_IPPACKET_V4_DISCARD) + pLayerString = "FWPS_LAYER_OUTBOUND_IPPACKET_V4_DISCARD"; + else if(layerID == FWPS_LAYER_OUTBOUND_IPPACKET_V6) + pLayerString = "FWPS_LAYER_OUTBOUND_IPPACKET_V6"; + else if(layerID == FWPS_LAYER_OUTBOUND_IPPACKET_V6_DISCARD) + pLayerString = "FWPS_LAYER_OUTBOUND_IPPACKET_V6_DISCARD"; + else if(layerID == FWPS_LAYER_IPFORWARD_V4) + pLayerString = "FWPS_LAYER_IPFORWARD_V4"; + else if(layerID == FWPS_LAYER_IPFORWARD_V4_DISCARD) + pLayerString = "FWPS_LAYER_IPFORWARD_V4_DISCARD"; + else if(layerID == FWPS_LAYER_IPFORWARD_V6) + pLayerString = "FWPS_LAYER_IPFORWARD_V6"; + else if(layerID == FWPS_LAYER_IPFORWARD_V6_DISCARD) + pLayerString = "FWPS_LAYER_IPFORWARD_V6_DISCARD"; + else if(layerID == FWPS_LAYER_INBOUND_TRANSPORT_V4) + pLayerString = "FWPS_LAYER_INBOUND_TRANSPORT_V4"; + else if(layerID == FWPS_LAYER_INBOUND_TRANSPORT_V4_DISCARD) + pLayerString = "FWPS_LAYER_INBOUND_TRANSPORT_V4_DISCARD"; + else if(layerID == FWPS_LAYER_INBOUND_TRANSPORT_V6) + pLayerString = "FWPS_LAYER_INBOUND_TRANSPORT_V6"; + else if(layerID == FWPS_LAYER_INBOUND_TRANSPORT_V6_DISCARD) + pLayerString = "FWPS_LAYER_INBOUND_TRANSPORT_V6_DISCARD"; + else if(layerID == FWPS_LAYER_OUTBOUND_TRANSPORT_V4) + pLayerString = "FWPS_LAYER_OUTBOUND_TRANSPORT_V4"; + else if(layerID == FWPS_LAYER_OUTBOUND_TRANSPORT_V4_DISCARD) + pLayerString = "FWPS_LAYER_OUTBOUND_TRANSPORT_V4_DISCARD"; + else if(layerID == FWPS_LAYER_OUTBOUND_TRANSPORT_V6) + pLayerString = "FWPS_LAYER_OUTBOUND_TRANSPORT_V6"; + else if(layerID == FWPS_LAYER_OUTBOUND_TRANSPORT_V6_DISCARD) + pLayerString = "FWPS_LAYER_OUTBOUND_TRANSPORT_V6_DISCARD"; + else if(layerID == FWPS_LAYER_STREAM_V4) + pLayerString = "FWPS_LAYER_STREAM_V4"; + else if(layerID == FWPS_LAYER_STREAM_V4_DISCARD) + pLayerString = "FWPS_LAYER_STREAM_V4_DISCARD"; + else if(layerID == FWPS_LAYER_STREAM_V6) + pLayerString = "FWPS_LAYER_STREAM_V6"; + else if(layerID == FWPS_LAYER_STREAM_V6_DISCARD) + pLayerString = "FWPS_LAYER_STREAM_V6_DISCARD"; + else if(layerID == FWPS_LAYER_DATAGRAM_DATA_V4) + pLayerString = "FWPS_LAYER_DATAGRAM_DATA_V4"; + else if(layerID == FWPS_LAYER_DATAGRAM_DATA_V4_DISCARD) + pLayerString = "FWPS_LAYER_DATAGRAM_DATA_V4_DISCARD"; + else if(layerID == FWPS_LAYER_DATAGRAM_DATA_V6) + pLayerString = "FWPS_LAYER_DATAGRAM_DATA_V6"; + else if(layerID == FWPS_LAYER_DATAGRAM_DATA_V6_DISCARD) + pLayerString = "FWPS_LAYER_DATAGRAM_DATA_V6_DISCARD"; + else if(layerID == FWPS_LAYER_INBOUND_ICMP_ERROR_V4) + pLayerString = "FWPS_LAYER_INBOUND_ICMP_ERROR_V4"; + else if(layerID == FWPS_LAYER_INBOUND_ICMP_ERROR_V4_DISCARD) + pLayerString = "FWPS_LAYER_INBOUND_ICMP_ERROR_V4_DISCARD"; + else if(layerID == FWPS_LAYER_INBOUND_ICMP_ERROR_V6) + pLayerString = "FWPS_LAYER_INBOUND_ICMP_ERROR_V6"; + else if(layerID == FWPS_LAYER_INBOUND_ICMP_ERROR_V6_DISCARD) + pLayerString = "FWPS_LAYER_INBOUND_ICMP_ERROR_V6_DISCARD"; + else if(layerID == FWPS_LAYER_OUTBOUND_ICMP_ERROR_V4) + pLayerString = "FWPS_LAYER_OUTBOUND_ICMP_ERROR_V4"; + else if(layerID == FWPS_LAYER_OUTBOUND_ICMP_ERROR_V4_DISCARD) + pLayerString = "FWPS_LAYER_OUTBOUND_ICMP_ERROR_V4_DISCARD"; + else if(layerID == FWPS_LAYER_OUTBOUND_ICMP_ERROR_V6) + pLayerString = "FWPS_LAYER_OUTBOUND_ICMP_ERROR_V6"; + else if(layerID == FWPS_LAYER_OUTBOUND_ICMP_ERROR_V6_DISCARD) + pLayerString = "FWPS_LAYER_OUTBOUND_ICMP_ERROR_V6_DISCARD"; + else if(layerID == FWPS_LAYER_ALE_RESOURCE_ASSIGNMENT_V4) + pLayerString = "FWPS_LAYER_ALE_RESOURCE_ASSIGNMENT_V4"; + else if(layerID == FWPS_LAYER_ALE_RESOURCE_ASSIGNMENT_V4_DISCARD) + pLayerString = "FWPS_LAYER_ALE_RESOURCE_ASSIGNMENT_V4_DISCARD"; + else if(layerID == FWPS_LAYER_ALE_RESOURCE_ASSIGNMENT_V6) + pLayerString = "FWPS_LAYER_ALE_RESOURCE_ASSIGNMENT_V6"; + else if(layerID == FWPS_LAYER_ALE_RESOURCE_ASSIGNMENT_V6_DISCARD) + pLayerString = "FWPS_LAYER_ALE_RESOURCE_ASSIGNMENT_V6_DISCARD"; + else if(layerID == FWPS_LAYER_ALE_AUTH_LISTEN_V4) + pLayerString = "FWPS_LAYER_ALE_AUTH_LISTEN_V4"; + else if(layerID == FWPS_LAYER_ALE_AUTH_LISTEN_V4_DISCARD) + pLayerString = "FWPS_LAYER_ALE_AUTH_LISTEN_V4_DISCARD"; + else if(layerID == FWPS_LAYER_ALE_AUTH_LISTEN_V6) + pLayerString = "FWPS_LAYER_ALE_AUTH_LISTEN_V6"; + else if(layerID == FWPS_LAYER_ALE_AUTH_LISTEN_V6_DISCARD) + pLayerString = "FWPS_LAYER_ALE_AUTH_LISTEN_V6_DISCARD"; + else if(layerID == FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4) + pLayerString = "FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4"; + else if(layerID == FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4_DISCARD) + pLayerString = "FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4_DISCARD"; + else if(layerID == FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6) + pLayerString = "FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6"; + else if(layerID == FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6_DISCARD) + pLayerString = "FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6_DISCARD"; + else if(layerID == FWPS_LAYER_ALE_AUTH_CONNECT_V4) + pLayerString = "FWPS_LAYER_ALE_AUTH_CONNECT_V4"; + else if(layerID == FWPS_LAYER_ALE_AUTH_CONNECT_V4_DISCARD) + pLayerString = "FWPS_LAYER_ALE_AUTH_CONNECT_V4_DISCARD"; + else if(layerID == FWPS_LAYER_ALE_AUTH_CONNECT_V6) + pLayerString = "FWPS_LAYER_ALE_AUTH_CONNECT_V6"; + else if(layerID == FWPS_LAYER_ALE_AUTH_CONNECT_V6_DISCARD) + pLayerString = "FWPS_LAYER_ALE_AUTH_CONNECT_V6_DISCARD"; + else if(layerID == FWPS_LAYER_ALE_FLOW_ESTABLISHED_V4) + pLayerString = "FWPS_LAYER_ALE_FLOW_ESTABLISHED_V4"; + else if(layerID == FWPS_LAYER_ALE_FLOW_ESTABLISHED_V4_DISCARD) + pLayerString = "FWPS_LAYER_ALE_FLOW_ESTABLISHED_V4_DISCARD"; + else if(layerID == FWPS_LAYER_ALE_FLOW_ESTABLISHED_V6) + pLayerString = "FWPS_LAYER_ALE_FLOW_ESTABLISHED_V6"; + else if(layerID == FWPS_LAYER_ALE_FLOW_ESTABLISHED_V6_DISCARD) + pLayerString = "FWPS_LAYER_ALE_FLOW_ESTABLISHED_V6_DISCARD"; + +#if(NTDDI_VERSION >= NTDDI_WIN7) + + else if(layerID == FWPS_LAYER_NAME_RESOLUTION_CACHE_V4) + pLayerString = "FWPS_LAYER_NAME_RESOLUTION_CACHE_V4"; + else if(layerID == FWPS_LAYER_NAME_RESOLUTION_CACHE_V6) + pLayerString = "FWPS_LAYER_NAME_RESOLUTION_CACHE_V6"; + else if(layerID == FWPS_LAYER_ALE_RESOURCE_RELEASE_V4) + pLayerString = "FWPS_LAYER_ALE_RESOURCE_RELEASE_V4"; + else if(layerID == FWPS_LAYER_ALE_RESOURCE_RELEASE_V6) + pLayerString = "FWPS_LAYER_ALE_RESOURCE_RELEASE_V6"; + else if(layerID == FWPS_LAYER_ALE_ENDPOINT_CLOSURE_V4) + pLayerString = "FWPS_LAYER_ALE_ENDPOINT_CLOSURE_V4"; + else if(layerID == FWPS_LAYER_ALE_ENDPOINT_CLOSURE_V6) + pLayerString = "FWPS_LAYER_ALE_ENDPOINT_CLOSURE_V6"; + else if(layerID == FWPS_LAYER_ALE_CONNECT_REDIRECT_V4) + pLayerString = "FWPS_LAYER_ALE_CONNECT_REDIRECT_V4"; + else if(layerID == FWPS_LAYER_ALE_CONNECT_REDIRECT_V6) + pLayerString = "FWPS_LAYER_ALE_CONNECT_REDIRECT_V6"; + else if(layerID == FWPS_LAYER_ALE_BIND_REDIRECT_V4) + pLayerString = "FWPS_LAYER_ALE_BIND_REDIRECT_V4"; + else if(layerID == FWPS_LAYER_ALE_BIND_REDIRECT_V6) + pLayerString = "FWPS_LAYER_ALE_BIND_REDIRECT_V6"; + else if(layerID == FWPS_LAYER_STREAM_PACKET_V4) + pLayerString = "FWPS_LAYER_STREAM_PACKET_V4"; + else if(layerID == FWPS_LAYER_STREAM_PACKET_V6) + pLayerString = "FWPS_LAYER_STREAM_PACKET_V6"; + +#if(NTDDI_VERSION >= NTDDI_WIN8) + + else if(layerID == FWPS_LAYER_INBOUND_MAC_FRAME_ETHERNET) + pLayerString = "FWPS_LAYER_INBOUND_MAC_FRAME_ETHERNET"; + else if(layerID == FWPS_LAYER_OUTBOUND_MAC_FRAME_ETHERNET) + pLayerString = "FWPS_LAYER_OUTBOUND_MAC_FRAME_ETHERNET"; + else if(layerID == FWPS_LAYER_INBOUND_MAC_FRAME_NATIVE) + pLayerString = "FWPS_LAYER_INBOUND_MAC_FRAME_NATIVE"; + else if(layerID == FWPS_LAYER_OUTBOUND_MAC_FRAME_NATIVE) + pLayerString = "FWPS_LAYER_OUTBOUND_MAC_FRAME_NATIVE"; + else if(layerID == FWPS_LAYER_INGRESS_VSWITCH_ETHERNET) + pLayerString = "FWPS_LAYER_INGRESS_VSWITCH_ETHERNET"; + else if(layerID == FWPS_LAYER_EGRESS_VSWITCH_ETHERNET) + pLayerString = "FWPS_LAYER_EGRESS_VSWITCH_ETHERNET"; + else if(layerID == FWPS_LAYER_INGRESS_VSWITCH_TRANSPORT_V4) + pLayerString = "FWPS_LAYER_INGRESS_VSWITCH_TRANSPORT_V4"; + else if(layerID == FWPS_LAYER_INGRESS_VSWITCH_TRANSPORT_V6) + pLayerString = "FWPS_LAYER_INGRESS_VSWITCH_TRANSPORT_V6"; + else if(layerID == FWPS_LAYER_EGRESS_VSWITCH_TRANSPORT_V4) + pLayerString = "FWPS_LAYER_EGRESS_VSWITCH_TRANSPORT_V4"; + else if(layerID == FWPS_LAYER_EGRESS_VSWITCH_TRANSPORT_V6) + pLayerString = "FWPS_LAYER_EGRESS_VSWITCH_TRANSPORT_V6"; + +#if(NTDDI_VERSION >= NTDDI_WINBLUE) + + else if(layerID == FWPS_LAYER_INBOUND_TRANSPORT_FAST) + pLayerString = "FWPS_LAYER_INBOUND_TRANSPORT_FAST"; + else if(layerID == FWPS_LAYER_OUTBOUND_TRANSPORT_FAST) + pLayerString = "FWPS_LAYER_OUTBOUND_TRANSPORT_FAST"; + else if(layerID == FWPS_LAYER_INBOUND_MAC_FRAME_NATIVE_FAST) + pLayerString = "FWPS_LAYER_INBOUND_MAC_FRAME_NATIVE_FAST"; + else if(layerID == FWPS_LAYER_OUTBOUND_MAC_FRAME_NATIVE_FAST) + pLayerString = "FWPS_LAYER_OUTBOUND_MAC_FRAME_NATIVE_FAST"; + +#endif /// (NTDDI_VERSION >= NTDDI_WINBLUE) +#endif /// (NTDDI_VERSION >= NTDDI_WIN8) +#endif /// (NTDDI_VERSION >= NTDDI_WIN7) + + return pLayerString; +} + +#endif /// FwpsLayer____ |
