summaryrefslogtreecommitdiff
path: root/network/trans/WFPSampler/sys/NotifyFunctions_BasicCallouts.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'network/trans/WFPSampler/sys/NotifyFunctions_BasicCallouts.cpp')
-rw-r--r--network/trans/WFPSampler/sys/NotifyFunctions_BasicCallouts.cpp225
1 files changed, 225 insertions, 0 deletions
diff --git a/network/trans/WFPSampler/sys/NotifyFunctions_BasicCallouts.cpp b/network/trans/WFPSampler/sys/NotifyFunctions_BasicCallouts.cpp
new file mode 100644
index 00000000..6b86daaf
--- /dev/null
+++ b/network/trans/WFPSampler/sys/NotifyFunctions_BasicCallouts.cpp
@@ -0,0 +1,225 @@
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//
+// Copyright (c) 2012 Microsoft Corporation. All Rights Reserved.
+//
+// Module Name:
+// NotifyFunctions_BasicCallouts.cpp
+//
+// Abstract:
+// This module contains WFP Notify functions for the simpler callouts.
+//
+// Naming Convention:
+//
+// <Module><Scenario>
+//
+// i.e.
+//
+// NotifyBasicNotification
+//
+// <Module>
+// Notify - Function is an FWPS_CALLOUT_NOTIFY_FN
+// <Scenario>
+// BasicNotification - Function demonstates use of the simple notifications
+//
+// Author:
+// Dusty Harper (DHarper)
+//
+// Revision History:
+//
+// [ Month ][Day] [Year] - [Revision]-[ Comments ]
+// May 01, 2010 - 1.0 - Creation
+// December 13, 2013 - 1.1 - Enhance function declaration for IntelliSense and
+// improve traces
+//
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+#include "Framework_WFPSamplerCalloutDriver.h" /// .
+#include "NotifyFunctions_BasicCallouts.tmh" /// $(OBJ_PATH)\$(O)\
+
+/**
+ @private_function="PrvBasicNotificationWorkItemRoutine"
+
+ Purpose: Traces the appropriate notification event. <br>
+ <br>
+ Notes: <br>
+ <br>
+ MSDN_Ref: <br>
+*/
+_IRQL_requires_(PASSIVE_LEVEL)
+_IRQL_requires_same_
+_Function_class_(IO_WORKITEM_ROUTINE)
+VOID PrvBasicNotificationWorkItemRoutine(_In_ PDEVICE_OBJECT pDeviceObject,
+ _Inout_opt_ PVOID pContext)
+{
+#if DBG
+
+ DbgPrintEx(DPFLTR_IHVNETWORK_ID,
+ DPFLTR_INFO_LEVEL,
+ " ---> PrvBasicNotificationWorkItemRoutine()\n");
+
+#endif /// DBG
+
+ UNREFERENCED_PARAMETER(pDeviceObject);
+
+ NT_ASSERT(pContext);
+ NT_ASSERT(((WORKITEM_DATA*)pContext)->pNotifyData);
+
+
+ WORKITEM_DATA* pWorkItemData = (WORKITEM_DATA*)pContext;
+
+ if(pWorkItemData)
+ {
+ NTSTATUS status = STATUS_SUCCESS;
+ FWPM_CALLOUT* pCallout = 0;
+ PWSTR pCalloutName = L"";
+
+ status = FwpmCalloutGetById(g_EngineHandle,
+ pWorkItemData->pNotifyData->calloutID,
+ &pCallout);
+ if(status != STATUS_SUCCESS)
+ {
+ if(status != STATUS_FWP_CALLOUT_NOT_FOUND)
+ DbgPrintEx(DPFLTR_IHVNETWORK_ID,
+ DPFLTR_ERROR_LEVEL,
+ " !!!! [FilterID: %#I64x][CalloutID: %#x] PrvBasicNotificationWorkItemRoutine : FwpmCalloutGetById() [status: %#x]\n",
+ pWorkItemData->pNotifyData->filterID,
+ pWorkItemData->pNotifyData->calloutID,
+ status);
+ }
+ else
+ pCalloutName = pCallout->displayData.name;
+
+ switch(pWorkItemData->pNotifyData->notificationType)
+ {
+ case FWPS_CALLOUT_NOTIFY_ADD_FILTER:
+ {
+ DbgPrintEx(DPFLTR_IHVNETWORK_ID,
+ DPFLTR_INFO_LEVEL,
+ " -- [FilterID: %#I64x][CalloutID: %#x] A filter referencing %S callout was added\n",
+ pWorkItemData->pNotifyData->filterID,
+ pWorkItemData->pNotifyData->calloutID,
+ pCalloutName ? pCalloutName : L"");
+ break;
+ }
+ case FWPS_CALLOUT_NOTIFY_DELETE_FILTER:
+ {
+ DbgPrintEx(DPFLTR_IHVNETWORK_ID,
+ DPFLTR_INFO_LEVEL,
+ " -- [FilterID: %#I64x][CalloutID: %#x] A filter referencing %S callout was deleted\n",
+ pWorkItemData->pNotifyData->filterID,
+ pWorkItemData->pNotifyData->calloutID,
+ pCalloutName ? pCalloutName : L"");
+
+ break;
+ }
+ case FWPS_CALLOUT_NOTIFY_ADD_FILTER_POST_COMMIT:
+ {
+ DbgPrintEx(DPFLTR_IHVNETWORK_ID,
+ DPFLTR_INFO_LEVEL,
+ " -- [FilterID: %#I64x][CalloutID: %#x] A filter referencing %S callout was committed\n",
+ pWorkItemData->pNotifyData->filterID,
+ pWorkItemData->pNotifyData->calloutID,
+ pCalloutName ? pCalloutName : L"");
+ break;
+ }
+ default:
+ {
+ DbgPrintEx(DPFLTR_IHVNETWORK_ID,
+ DPFLTR_INFO_LEVEL,
+ " -- [FilterID: %#I64x][CalloutID: %#x] Invalid Notification Type. Please Contact [email protected]\n",
+ pWorkItemData->pNotifyData->filterID,
+ pWorkItemData->pNotifyData->calloutID);
+
+ break;
+ }
+ }
+
+ FwpmFreeMemory((VOID**)&pCallout);
+
+ HLPR_DELETE(pWorkItemData->pNotifyData,
+ WFPSAMPLER_CALLOUT_DRIVER_TAG);
+
+ KrnlHlprWorkItemDataDestroy(&pWorkItemData);
+ }
+
+#if DBG
+
+ DbgPrintEx(DPFLTR_IHVNETWORK_ID,
+ DPFLTR_INFO_LEVEL,
+ " <--- PrvBasicNotificationWorkItemRoutine()\n");
+
+#endif /// DBG
+
+ return;
+}
+
+/**
+ @notify_function="NotifyBasicNotification"
+
+ Purpose: Traces the notification event. <br>
+ <br>
+ Notes: <br>
+ <br>
+ MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/FF568803.aspx <br>
+ HTTP://MSDN.Microsoft.com/En-US/Library/FF568804.aspx <br>
+*/
+_IRQL_requires_min_(PASSIVE_LEVEL)
+_IRQL_requires_max_(DISPATCH_LEVEL)
+_IRQL_requires_same_
+_Success_(return == STATUS_SUCCESS)
+NTSTATUS NTAPI NotifyBasicNotification(_In_ FWPS_CALLOUT_NOTIFY_TYPE notificationType,
+ _In_ const GUID* pFilterKey,
+ _Inout_ FWPS_FILTER* pFilter)
+{
+ NT_ASSERT(pFilter);
+
+ DbgPrintEx(DPFLTR_IHVNETWORK_ID,
+ DPFLTR_INFO_LEVEL,
+ " ---> NotifyBasicNotification() [FilterID: %#I64x][CalloutID: %#x]\n",
+ pFilter->filterId,
+ pFilter->action.calloutId);
+
+ NTSTATUS status = STATUS_SUCCESS;
+ NOTIFY_DATA* pNotifyData = 0;
+
+#pragma warning(push)
+#pragma warning(disable: 6014) /// pNotifyData is expected to be cleaned up by caller using PrvBasicNotificationWorkItemRoutine
+
+ HLPR_NEW(pNotifyData,
+ NOTIFY_DATA,
+ WFPSAMPLER_CALLOUT_DRIVER_TAG);
+ HLPR_BAIL_ON_ALLOC_FAILURE(pNotifyData,
+ status);
+
+#pragma warning(pop)
+
+ pNotifyData->notificationType = notificationType;
+ pNotifyData->calloutID = pFilter ? pFilter->action.calloutId : 0;
+ pNotifyData->filterID = pFilter ? pFilter->filterId : 0;
+ pNotifyData->pFilterKey = pFilterKey;
+
+ status = KrnlHlprWorkItemQueue(g_pWDMDevice,
+ PrvBasicNotificationWorkItemRoutine,
+ pNotifyData);
+
+ HLPR_BAIL_LABEL:
+
+ if(status != STATUS_SUCCESS)
+ {
+ DbgPrintEx(DPFLTR_IHVNETWORK_ID,
+ DPFLTR_ERROR_LEVEL,
+ " !!!! NotifyBasicNotification() [status: %#x]\n",
+ status);
+
+ HLPR_DELETE(pNotifyData,
+ WFPSAMPLER_CALLOUT_DRIVER_TAG);
+ }
+
+ DbgPrintEx(DPFLTR_IHVNETWORK_ID,
+ DPFLTR_INFO_LEVEL,
+ " <--- NotifyBasicNotification() [FilterID: %#I64x][CalloutID: %#x]\n",
+ pFilter->filterId,
+ pFilter->action.calloutId);
+
+ return status;
+}