summaryrefslogtreecommitdiff
path: root/network/trans/WFPSampler/lib/HelperFunctions_FwpmCallout.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'network/trans/WFPSampler/lib/HelperFunctions_FwpmCallout.cpp')
-rw-r--r--network/trans/WFPSampler/lib/HelperFunctions_FwpmCallout.cpp387
1 files changed, 387 insertions, 0 deletions
diff --git a/network/trans/WFPSampler/lib/HelperFunctions_FwpmCallout.cpp b/network/trans/WFPSampler/lib/HelperFunctions_FwpmCallout.cpp
new file mode 100644
index 00000000..826e69e3
--- /dev/null
+++ b/network/trans/WFPSampler/lib/HelperFunctions_FwpmCallout.cpp
@@ -0,0 +1,387 @@
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//
+// Copyright (c) 2012 Microsoft Corporation. All Rights Reserved.
+//
+// Module Name:
+// HelperFunctions_FwpmCallout.cpp
+//
+// Abstract:
+// This module contains functions which assist in actions pertaining to FWPM_CALLOUT objects.
+//
+// Naming Convention:
+//
+// <Scope><Module><Object><Action><Modifier>
+//
+// i.e.
+//
+// <Scope>
+// {
+// - Function is likely visible to other modules.
+// }
+// <Module>
+// {
+// Hlpr - Function is from HelperFunctions_* Modules.
+// }
+// <Object>
+// {
+// FwpmCallout - Function pertains to FWPM_CALLOUT objects.
+// }
+// <Action>
+// {
+// Add - Function adds and object to BFE.
+// Create - Function allocates memory for an object.
+// Delete - Function deletes an object from BFE.
+// Destroy - Function frees memory for an object
+// Enum - Function returns list of requested objects.
+// Remove - Function deletes objects from BFE.
+// }
+// <Modifier>
+// {
+// All - Function acts on all FWPM_CALLOUT objects.
+// ByKey - Function takes a runtime ID.
+// EnumHandle - Function acts on the enumeration Handle.
+// }
+//
+// Private Functions:
+//
+// Public Functions:
+// HlprFwpmCalloutAdd(),
+// HlprFwpmCalloutCreateEnumHandle(),
+// HlprFwpmCalloutDeleteByKey(),
+// HlprFwpmCalloutDestroyEnumHandle(),
+// HlprFwpmCalloutEnum(),
+// HlprFwpmCalloutRemoveAll(),
+//
+// Author:
+// Dusty Harper (DHarper)
+//
+// Revision History:
+//
+// [ Month ][Day] [Year] - [Revision]-[ Comments ]
+// May 01, 2010 - 1.0 - Creation
+//
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+#include "HelperFunctions_Include.h" /// .
+
+/**
+ @helper_function="HlprFwpmCalloutDeleteByKey"
+
+ Purpose: Wrapper for the FwpmCalloutDeleteByKey API <br>
+ <br>
+ Notes: <br>
+ <br>
+ MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/AA364016.aspx <br>
+*/
+_Success_(return == NO_ERROR)
+UINT32 HlprFwpmCalloutDeleteByKey(_In_ const HANDLE engineHandle,
+ _In_ const GUID* pCalloutKey)
+{
+ UINT32 status = NO_ERROR;
+
+ if(engineHandle &&
+ pCalloutKey)
+ {
+ status = FwpmCalloutDeleteByKey(engineHandle,
+ pCalloutKey);
+ if(status != NO_ERROR)
+ {
+ if(status != FWP_E_IN_USE &&
+ status != FWP_E_BUILTIN_OBJECT &&
+ status != FWP_E_CALLOUT_NOT_FOUND)
+ HlprLogError(L"HlprFwpmCalloutDeleteByKey : FwpmCalloutDeleteByKey() [status: %#x]",
+ status);
+ else
+ {
+ HlprLogInfo(L"HlprFwpmCalloutDeleteByKey : FwpmCalloutDeleteByKey() [status: %#x]",
+ status);
+
+ status = NO_ERROR;
+ }
+ }
+ }
+ else
+ {
+ status = ERROR_INVALID_PARAMETER;
+
+ HlprLogError(L"HlprFwpmCalloutDeleteByKey() [status: %#x][engineHandle: %#p][pCalloutKey: %#p]",
+ status,
+ engineHandle,
+ pCalloutKey);
+ }
+
+ return status;
+}
+
+/**
+ @helper_function="HlprFwpmCalloutAdd"
+
+ Purpose: Wrapper for the FwpmCalloutAdd API <br>
+ <br>
+ Notes: Callout ID is written to pCallout->calloutId. <br>
+ <br>
+ MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/AA364010.aspx <br>
+*/
+_Success_(return == NO_ERROR)
+UINT32 HlprFwpmCalloutAdd(_In_ const HANDLE engineHandle,
+ _Inout_ FWPM_CALLOUT* pCallout)
+{
+ UINT32 status = NO_ERROR;
+
+ if(engineHandle &&
+ pCallout)
+ {
+ status = FwpmCalloutAdd(engineHandle,
+ pCallout,
+ 0,
+ &(pCallout->calloutId));
+ if(status != NO_ERROR)
+ {
+ if(status == FWP_E_ALREADY_EXISTS)
+ {
+ HlprLogInfo(L"Callout Already Exists");
+
+ status = NO_ERROR;
+ }
+ else
+ HlprLogError(L"HlprFwpmCalloutAdd : FwpmCalloutAdd() [status: %#x]",
+ status);
+ }
+ }
+ else
+ {
+ status = ERROR_INVALID_PARAMETER;
+
+ HlprLogError(L"HlprFwpmCalloutAdd() [status: %#x][engineHandle: %#p][pCallout: %#p]",
+ status,
+ engineHandle,
+ pCallout);
+ }
+
+ return status;
+}
+
+/**
+ @helper_function="HlprFwpmCalloutRemoveAll"
+
+ Purpose: Remove all callouts associated with the specified provider. <br>
+ <br>
+ Notes: <br>
+ <br>
+ MSDN_Ref: <br>
+*/
+_Success_(return == NO_ERROR)
+UINT32 HlprFwpmCalloutRemoveAll(_In_opt_ HANDLE* pEngineHandle,
+ _In_ const GUID* pProviderKey)
+{
+ UINT32 status = NO_ERROR;
+ HANDLE engineHandle = 0;
+ BOOLEAN isLocal = FALSE;
+
+ if(pEngineHandle &&
+ *pEngineHandle)
+ engineHandle = *pEngineHandle;
+ else
+ {
+ status = HlprFwpmEngineOpen(&engineHandle);
+ HLPR_BAIL_ON_FAILURE(status);
+
+ isLocal = TRUE;
+ }
+
+ HANDLE enumHandle = 0;
+ FWPM_CALLOUT** ppCallouts = 0;
+ UINT32 calloutCount = 0;
+ FWPM_CALLOUT_ENUM_TEMPLATE enumTemplate;
+
+ enumTemplate.providerKey = (GUID*)pProviderKey;
+
+ status = HlprFwpmCalloutCreateEnumHandle(engineHandle,
+ &enumTemplate,
+ &enumHandle);
+ HLPR_BAIL_ON_FAILURE(status);
+
+ status = HlprFwpmCalloutEnum(engineHandle,
+ enumHandle,
+ 0xFFFFFFFF,
+ &ppCallouts,
+ &calloutCount);
+ if(ppCallouts &&
+ calloutCount)
+ {
+ for(UINT32 calloutIndex = 0;
+ calloutIndex < calloutCount;
+ calloutIndex++)
+ {
+ HlprFwpmCalloutDeleteByKey(engineHandle,
+ &(ppCallouts[calloutIndex]->calloutKey));
+ }
+
+ FwpmFreeMemory((VOID**)&ppCallouts);
+ }
+
+ HlprFwpmCalloutDestroyEnumHandle(engineHandle,
+ &enumHandle);
+
+ HLPR_BAIL_LABEL:
+
+ if(engineHandle &&
+ isLocal)
+ HlprFwpmEngineClose(&engineHandle);
+
+ return status;
+}
+
+/**
+ @helper_function="HlprFwpmCalloutEnum"
+
+ Purpose: Wrapper for the FwpmCalloutEnum API <br>
+ <br>
+ Notes: <br>
+ <br>
+ MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/AA364020.aspx <br>
+*/
+_At_(*pppEntries, _Pre_ _Null_)
+_When_(return != NO_ERROR, _At_(*pppEntries, _Post_ _Null_))
+_Success_(return == NO_ERROR)
+UINT32 HlprFwpmCalloutEnum(_In_ const HANDLE engineHandle,
+ _In_ const HANDLE enumHandle,
+ _In_ const UINT32 numEntriesRequested,
+ _Outptr_result_buffer_maybenull_(*pNumEntriesReturned) FWPM_CALLOUT*** pppEntries,
+ _Out_ UINT32* pNumEntriesReturned)
+{
+ UINT32 status = NO_ERROR;
+
+ if(engineHandle &&
+ enumHandle &&
+ numEntriesRequested &&
+ pppEntries &&
+ pNumEntriesReturned)
+ {
+ status = FwpmCalloutEnum(engineHandle,
+ enumHandle,
+ numEntriesRequested,
+ pppEntries,
+ pNumEntriesReturned);
+ if(status != NO_ERROR &&
+ status != FWP_E_CALLOUT_NOT_FOUND &&
+ status != FWP_E_NOT_FOUND)
+ HlprLogError(L"HlprFwpmCalloutEnum : FwpmCalloutEnum() [status: %#x]",
+ status);
+ }
+ else
+ {
+ if(pppEntries)
+ *pppEntries = 0;
+
+ if(pNumEntriesReturned)
+ *pNumEntriesReturned = 0;
+
+ status = ERROR_INVALID_PARAMETER;
+
+ HlprLogError(L"HlprFwpmCalloutEnum() [status: %#x][engineHandle: %#p][enumHandle: %#p][numEntriesRequested: %d][pppEntries: %#p][pNumEntriesReturned: %#p]",
+ status,
+ engineHandle,
+ enumHandle,
+ numEntriesRequested,
+ pppEntries,
+ pNumEntriesReturned);
+ }
+
+ return status;
+}
+
+/**
+ @helper_function="HlprFwpmCalloutDestroyEnumHandle"
+
+ Purpose: Wrapper for the FwpmCalloutDestroyEnumHandle API <br>
+ <br>
+ Notes: <br>
+ <br>
+ MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/AA364017.aspx <br>
+*/
+_When_(return != NO_ERROR, _At_(*pEnumHandle, _Post_ _Notnull_))
+_When_(return == NO_ERROR, _At_(*pEnumHandle, _Post_ _Null_))
+_Success_(return == NO_ERROR)
+UINT32 HlprFwpmCalloutDestroyEnumHandle(_In_ const HANDLE engineHandle,
+ _Inout_ HANDLE* pEnumHandle)
+{
+ UINT32 status = NO_ERROR;
+
+ if(engineHandle &&
+ pEnumHandle)
+ {
+ if(*pEnumHandle)
+ {
+ status = FwpmCalloutDestroyEnumHandle(engineHandle,
+ *pEnumHandle);
+ if(status != NO_ERROR)
+ {
+ HlprLogError(L"HlprFwpmCalloutDestroyEnumHandle : FwpmCalloutDestroyEnumHandle() [status: %#x]",
+ status);
+
+ HLPR_BAIL;
+ }
+
+ *pEnumHandle = 0;
+ }
+ }
+ else
+ {
+ status = ERROR_INVALID_PARAMETER;
+
+ HlprLogError(L"HlprFwpmCalloutDestroyEnumHandle() [status: %#x][engineHandle: %#p][pEnumHandle: %#p]",
+ status,
+ engineHandle,
+ pEnumHandle);
+ }
+
+ HLPR_BAIL_LABEL:
+
+ return status;
+}
+
+/**
+ @helper_function="HlprFwpmCalloutCreateEnumHandle"
+
+ Purpose: Wrapper for the FwpmCalloutCreateEnumHandle API <br>
+ <br>
+ Notes: <br>
+ <br>
+ MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/AA364012.aspx <br>
+*/
+_When_(return != NO_ERROR, _At_(*pEnumHandle, _Post_ _Null_))
+_When_(return == NO_ERROR, _At_(*pEnumHandle, _Post_ _Notnull_))
+_Success_(return == NO_ERROR)
+UINT32 HlprFwpmCalloutCreateEnumHandle(_In_ const HANDLE engineHandle,
+ _In_opt_ const FWPM_CALLOUT_ENUM_TEMPLATE* pEnumTemplate,
+ _Out_ HANDLE* pEnumHandle)
+{
+ UINT32 status = NO_ERROR;
+
+ if(engineHandle &&
+ pEnumHandle)
+ {
+ status = FwpmCalloutCreateEnumHandle(engineHandle,
+ pEnumTemplate,
+ pEnumHandle);
+ if(status != NO_ERROR)
+ {
+ *pEnumHandle = 0;
+
+ HlprLogError(L"HlprFwpmCalloutCreateEnumHandle : FwpmCalloutCreateEnumHandle() [status: %#x]",
+ status);
+ }
+ }
+ else
+ {
+ status = ERROR_INVALID_PARAMETER;
+
+ HlprLogError(L"HlprFwpmCalloutCreateEnumHandle() [status: %#x][engineHandle: %#p][pEnumHandle: %#p]",
+ status,
+ engineHandle,
+ pEnumHandle);
+ }
+
+ return status;
+}