summaryrefslogtreecommitdiff
path: root/network/trans/WFPSampler/syslib/HelperFunctions_DeferredProcedureCalls.h
diff options
context:
space:
mode:
Diffstat (limited to 'network/trans/WFPSampler/syslib/HelperFunctions_DeferredProcedureCalls.h')
-rw-r--r--network/trans/WFPSampler/syslib/HelperFunctions_DeferredProcedureCalls.h275
1 files changed, 275 insertions, 0 deletions
diff --git a/network/trans/WFPSampler/syslib/HelperFunctions_DeferredProcedureCalls.h b/network/trans/WFPSampler/syslib/HelperFunctions_DeferredProcedureCalls.h
new file mode 100644
index 00000000..4de525e9
--- /dev/null
+++ b/network/trans/WFPSampler/syslib/HelperFunctions_DeferredProcedureCalls.h
@@ -0,0 +1,275 @@
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//
+// Copyright (c) 2014 Microsoft Corporation. All Rights Reserved.
+//
+// Module Name:
+// HelperFunctions_DeferredProcedureCalls.h
+//
+// Abstract:
+// This module contains prototypes for kernel helper functions that assist with DPC and
+// threaded DPC routines.
+//
+// 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 serializing asynchronous
+// FWPM_LAYER_STREAM injections
+//
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+#ifndef HELPERFUNCTIONS_DEFERRED_PROCEDURE_CALLS_H
+#define HELPERFUNCTIONS_DEFERRED_PROCEDURE_CALLS_H
+
+typedef struct DPC_DATA_
+{
+ KDPC kdpc;
+ union
+ {
+ CLASSIFY_DATA* pClassifyData;
+ NOTIFY_DATA* pNotifyData;
+ };
+ union
+ {
+ INJECTION_DATA* pInjectionData;
+ REDIRECT_DATA* pRedirectData;
+ PEND_DATA* pPendData;
+ };
+ VOID* pContext;
+}DPC_DATA, *PDPC_DATA;
+
+_IRQL_requires_min_(PASSIVE_LEVEL)
+_IRQL_requires_max_(DISPATCH_LEVEL)
+_IRQL_requires_same_
+inline VOID KrnlHlprDPCDataPurge(_Inout_ DPC_DATA* pDPCData);
+
+_At_(*ppDPCData, _Pre_ _Notnull_)
+_At_(*ppDPCData, _Post_ _Null_ __drv_freesMem(Pool))
+_IRQL_requires_min_(PASSIVE_LEVEL)
+_IRQL_requires_max_(DISPATCH_LEVEL)
+_IRQL_requires_same_
+_Success_(*ppDPCData == 0)
+inline VOID KrnlHlprDPCDataDestroy(_Inout_ DPC_DATA** ppDPCData);
+
+_IRQL_requires_min_(PASSIVE_LEVEL)
+_IRQL_requires_max_(DISPATCH_LEVEL)
+_IRQL_requires_same_
+inline VOID KrnlHlprDPCDataPopulate(_Inout_ DPC_DATA* pDPCData,
+ _In_ CLASSIFY_DATA* pClassifyData,
+ _In_opt_ INJECTION_DATA* pInjectionData = 0,
+ _In_opt_ VOID* pContext = 0);
+_IRQL_requires_min_(PASSIVE_LEVEL)
+_IRQL_requires_max_(DISPATCH_LEVEL)
+_IRQL_requires_same_
+inline VOID KrnlHlprDPCDataPopulate(_Inout_ DPC_DATA* pDPCData,
+ _In_ CLASSIFY_DATA* pClassifyData,
+ _In_ PEND_DATA* pPendData,
+ _In_opt_ VOID* pContext = 0);
+_IRQL_requires_min_(PASSIVE_LEVEL)
+_IRQL_requires_max_(DISPATCH_LEVEL)
+_IRQL_requires_same_
+inline VOID KrnlHlprDPCDataPopulate(_Inout_ DPC_DATA* pDPCData,
+ _In_ CLASSIFY_DATA* pClassifyData,
+ _In_ REDIRECT_DATA* pRedirectData,
+ _In_opt_ VOID** pContext = 0);
+_IRQL_requires_min_(PASSIVE_LEVEL)
+_IRQL_requires_max_(DISPATCH_LEVEL)
+_IRQL_requires_same_
+inline VOID KrnlHlprDPCDataPopulate(_Inout_ DPC_DATA* pDPCData,
+ _In_ NOTIFY_DATA* pNotifyData,
+ _In_opt_ VOID* pContext = 0);
+_IRQL_requires_min_(PASSIVE_LEVEL)
+_IRQL_requires_max_(DISPATCH_LEVEL)
+_IRQL_requires_same_
+inline VOID KrnlHlprDPCDataPopulate(_Inout_ DPC_DATA* pDPCData,
+ _In_ PEND_DATA* pPendData,
+ _In_opt_ VOID* pContext = 0);
+
+_At_(*ppDPCData, _Pre_ _Null_)
+_When_(return != STATUS_SUCCESS, _At_(*ppDPCData, _Post_ _Null_))
+_When_(return == STATUS_SUCCESS, _At_(*ppDPCData, _Post_ _Notnull_ __drv_allocatesMem(Pool)))
+_IRQL_requires_min_(PASSIVE_LEVEL)
+_IRQL_requires_max_(DISPATCH_LEVEL)
+_IRQL_requires_same_
+_Check_return_
+_Success_(return == STATUS_SUCCESS)
+NTSTATUS KrnlHlprDPCDataCreate(_Outptr_ DPC_DATA** ppDPCData,
+ _In_ CLASSIFY_DATA* pClassifyData,
+ _In_opt_ INJECTION_DATA* pInjectionData = 0,
+ _In_opt_ VOID* pContext = 0);
+_At_(*ppDPCData, _Pre_ _Null_)
+_When_(return != STATUS_SUCCESS, _At_(*ppDPCData, _Post_ _Null_))
+_When_(return == STATUS_SUCCESS, _At_(*ppDPCData, _Post_ _Notnull_ __drv_allocatesMem(Pool)))
+_IRQL_requires_min_(PASSIVE_LEVEL)
+_IRQL_requires_max_(DISPATCH_LEVEL)
+_IRQL_requires_same_
+_Check_return_
+_Success_(return == STATUS_SUCCESS)
+NTSTATUS KrnlHlprDPCDataCreate(_Outptr_ DPC_DATA** ppDPCData,
+ _In_ CLASSIFY_DATA* pClassifyData,
+ _In_ PEND_DATA* pPendData,
+ _In_opt_ VOID* pContext = 0);
+_At_(*ppDPCData, _Pre_ _Null_)
+_When_(return != STATUS_SUCCESS, _At_(*ppDPCData, _Post_ _Null_))
+_When_(return == STATUS_SUCCESS, _At_(*ppDPCData, _Post_ _Notnull_ __drv_allocatesMem(Pool)))
+_IRQL_requires_min_(PASSIVE_LEVEL)
+_IRQL_requires_max_(DISPATCH_LEVEL)
+_IRQL_requires_same_
+_Check_return_
+_Success_(return == STATUS_SUCCESS)
+NTSTATUS KrnlHlprDPCDataCreate(_Outptr_ DPC_DATA** ppDPCData,
+ _In_ CLASSIFY_DATA* pClassifyData,
+ _In_ REDIRECT_DATA* pRedirectData,
+ _In_opt_ VOID* pContext = 0);
+_At_(*ppDPCData, _Pre_ _Null_)
+_When_(return != STATUS_SUCCESS, _At_(*ppDPCData, _Post_ _Null_))
+_When_(return == STATUS_SUCCESS, _At_(*ppDPCData, _Post_ _Notnull_ __drv_allocatesMem(Pool)))
+_IRQL_requires_min_(PASSIVE_LEVEL)
+_IRQL_requires_max_(DISPATCH_LEVEL)
+_IRQL_requires_same_
+_Check_return_
+_Success_(return == STATUS_SUCCESS)
+NTSTATUS KrnlHlprDPCDataCreate(_Outptr_ DPC_DATA** ppDPCData,
+ _In_ NOTIFY_DATA* pNotifyData,
+ _In_opt_ VOID* pContext = 0);
+
+_At_(*ppDPCData, _Pre_ _Null_)
+_When_(return != STATUS_SUCCESS, _At_(*ppDPCData, _Post_ _Null_))
+_When_(return == STATUS_SUCCESS, _At_(*ppDPCData, _Post_ _Notnull_ __drv_allocatesMem(Pool)))
+_IRQL_requires_min_(PASSIVE_LEVEL)
+_IRQL_requires_max_(DISPATCH_LEVEL)
+_IRQL_requires_same_
+_Check_return_
+_Success_(return == STATUS_SUCCESS)
+NTSTATUS KrnlHlprDPCDataCreate(_Outptr_ DPC_DATA** ppDPCData,
+ _In_ PEND_DATA* pPendData,
+ _In_opt_ VOID* pContext = 0);
+
+_IRQL_requires_min_(PASSIVE_LEVEL)
+_IRQL_requires_max_(DISPATCH_LEVEL)
+_IRQL_requires_same_
+_Check_return_
+_Success_(return == STATUS_SUCCESS)
+NTSTATUS KrnlHlprDPCQueue(_In_ KDEFERRED_ROUTINE* pDPCFn,
+ _In_ UINT32 processorNumber = 0,
+ _In_ BOOLEAN forceProcessor = FALSE);
+_IRQL_requires_min_(PASSIVE_LEVEL)
+_IRQL_requires_max_(DISPATCH_LEVEL)
+_IRQL_requires_same_
+_Check_return_
+_Success_(return == STATUS_SUCCESS)
+NTSTATUS KrnlHlprDPCQueue(_In_ KDEFERRED_ROUTINE* pDPCFn,
+ _In_ CLASSIFY_DATA* pClassifyData,
+ _In_opt_ INJECTION_DATA* pInjectionData = 0,
+ _In_opt_ VOID* pContext = 0,
+ _In_ UINT32 processorNumber = 0,
+ _In_ BOOLEAN forceProcessor = FALSE);
+_IRQL_requires_min_(PASSIVE_LEVEL)
+_IRQL_requires_max_(DISPATCH_LEVEL)
+_IRQL_requires_same_
+_Check_return_
+_Success_(return == STATUS_SUCCESS)
+NTSTATUS KrnlHlprDPCQueue(_In_ KDEFERRED_ROUTINE* pDPCFn,
+ _In_ CLASSIFY_DATA* pClassifyData,
+ _In_ PEND_DATA* pPendData,
+ _In_opt_ VOID* pContext = 0,
+ _In_ UINT32 processorNumber = 0,
+ _In_ BOOLEAN forceProcessor = FALSE);
+_IRQL_requires_min_(PASSIVE_LEVEL)
+_IRQL_requires_max_(DISPATCH_LEVEL)
+_IRQL_requires_same_
+_Check_return_
+_Success_(return == STATUS_SUCCESS)
+NTSTATUS KrnlHlprDPCQueue(_In_ KDEFERRED_ROUTINE* pDPCFn,
+ _In_ CLASSIFY_DATA* pClassifyData,
+ _In_ REDIRECT_DATA* pRedirectData,
+ _In_opt_ VOID* pContext = 0,
+ _In_ UINT32 processorNumber = 0,
+ _In_ BOOLEAN forceProcessor = FALSE);
+_IRQL_requires_min_(PASSIVE_LEVEL)
+_IRQL_requires_max_(DISPATCH_LEVEL)
+_IRQL_requires_same_
+_Check_return_
+_Success_(return == STATUS_SUCCESS)
+NTSTATUS KrnlHlprDPCQueue(_In_ KDEFERRED_ROUTINE* pDPCFn,
+ _In_ NOTIFY_DATA* pNotifyData,
+ _In_opt_ VOID* pContext = 0,
+ _In_ UINT32 processorNumber = 0,
+ _In_ BOOLEAN forceProcessor = FALSE);
+_IRQL_requires_min_(PASSIVE_LEVEL)
+_IRQL_requires_max_(DISPATCH_LEVEL)
+_IRQL_requires_same_
+_Check_return_
+_Success_(return == STATUS_SUCCESS)
+NTSTATUS KrnlHlprDPCQueue(_In_ KDEFERRED_ROUTINE* pDPCFn,
+ _In_ PEND_DATA* pPendData,
+ _In_opt_ VOID* pContext = 0,
+ _In_ UINT32 processorNumber = 0,
+ _In_ BOOLEAN forceProcessor = FALSE);
+
+_IRQL_requires_min_(PASSIVE_LEVEL)
+_IRQL_requires_max_(DISPATCH_LEVEL)
+_IRQL_requires_same_
+_Check_return_
+_Success_(return == STATUS_SUCCESS)
+NTSTATUS KrnlHlprThreadedDPCQueue(_In_ KDEFERRED_ROUTINE* pDPCFn,
+ _In_ UINT32 processorNumber = 0,
+ _In_ BOOLEAN forceProcessor = FALSE);
+_IRQL_requires_min_(PASSIVE_LEVEL)
+_IRQL_requires_max_(DISPATCH_LEVEL)
+_IRQL_requires_same_
+_Check_return_
+_Success_(return == STATUS_SUCCESS)
+NTSTATUS KrnlHlprThreadedDPCQueue(_In_ KDEFERRED_ROUTINE* pDPCFn,
+ _In_ CLASSIFY_DATA* pClassifyData,
+ _In_opt_ INJECTION_DATA* pInjectionData = 0,
+ _In_opt_ VOID* pContext = 0,
+ _In_ UINT32 processorNumber = 0,
+ _In_ BOOLEAN forceProcessor = FALSE);
+_IRQL_requires_min_(PASSIVE_LEVEL)
+_IRQL_requires_max_(DISPATCH_LEVEL)
+_IRQL_requires_same_
+_Check_return_
+_Success_(return == STATUS_SUCCESS)
+NTSTATUS KrnlHlprThreadedDPCQueue(_In_ KDEFERRED_ROUTINE* pDPCFn,
+ _In_ CLASSIFY_DATA* pClassifyData,
+ _In_ PEND_DATA* pPendData,
+ _In_opt_ VOID* pContext = 0,
+ _In_ UINT32 processorNumber = 0,
+ _In_ BOOLEAN forceProcessor = FALSE);
+_IRQL_requires_min_(PASSIVE_LEVEL)
+_IRQL_requires_max_(DISPATCH_LEVEL)
+_IRQL_requires_same_
+_Check_return_
+_Success_(return == STATUS_SUCCESS)
+NTSTATUS KrnlHlprThreadedDPCQueue(_In_ KDEFERRED_ROUTINE* pDPCFn,
+ _In_ CLASSIFY_DATA* pClassifyData,
+ _In_ REDIRECT_DATA* pRedirectData,
+ _In_opt_ VOID* pContext = 0,
+ _In_ UINT32 processorNumber = 0,
+ _In_ BOOLEAN forceProcessor = FALSE);
+_IRQL_requires_min_(PASSIVE_LEVEL)
+_IRQL_requires_max_(DISPATCH_LEVEL)
+_IRQL_requires_same_
+_Check_return_
+_Success_(return == STATUS_SUCCESS)
+NTSTATUS KrnlHlprThreadedDPCQueue(_In_ KDEFERRED_ROUTINE* pDPCFn,
+ _In_ NOTIFY_DATA* pNotifyData,
+ _In_opt_ VOID* pContext = 0,
+ _In_ UINT32 processorNumber = 0,
+ _In_ BOOLEAN forceProcessor = FALSE);
+_IRQL_requires_min_(PASSIVE_LEVEL)
+_IRQL_requires_max_(DISPATCH_LEVEL)
+_IRQL_requires_same_
+_Check_return_
+_Success_(return == STATUS_SUCCESS)
+NTSTATUS KrnlHlprThreadedDPCQueue(_In_ KDEFERRED_ROUTINE* pDPCFn,
+ _In_ PEND_DATA* pPendData,
+ _In_opt_ VOID* pContext = 0,
+ _In_ UINT32 processorNumber = 0,
+ _In_ BOOLEAN forceProcessor = FALSE);
+
+#endif /// HELPERFUNCTIONS_DEFERRED_PROCEDURE_CALLS_H