#ifndef QUEUE_H #define QUEUE_H #include #include "common.h" #define MAX_REPORTS_PER_IRP 20 typedef struct _QUEUE_NODE { struct _QUEUE_NODE* next; PVOID data; } QUEUE_NODE, *PQUEUE_NODE; typedef struct QUEUE_HEAD { struct _QUEUE_NODE* start; struct _QUEUE_NODE* end; KGUARDED_MUTEX lock; INT entries; } QUEUE_HEAD, *PQUEUE_HEAD; typedef struct _GLOBAL_REPORT_QUEUE_HEADER { INT count; } GLOBAL_REPORT_QUEUE_HEADER, *PGLOBAL_REPORT_QUEUE_HEADER; typedef struct _REPORT_HEADER { INT report_id; } REPORT_HEADER, *PREPORT_HEADER; #define LIST_POOL_TAG 'list' _IRQL_requires_max_(APC_LEVEL) _Acquires_lock_(_Lock_kind_mutex_) _Releases_lock_(_Lock_kind_mutex_) VOID QueuePush(_Inout_ PQUEUE_HEAD Head, _In_ PVOID Data); _IRQL_requires_max_(APC_LEVEL) _Acquires_lock_(_Lock_kind_mutex_) _Releases_lock_(_Lock_kind_mutex_) PVOID QueuePop(_Inout_ PQUEUE_HEAD Head); VOID InitialiseGlobalReportQueue(_Out_ PBOOLEAN Status); _IRQL_requires_max_(APC_LEVEL) _Acquires_lock_(_Lock_kind_mutex_) _Releases_lock_(_Lock_kind_mutex_) VOID InsertReportToQueue(_In_ PVOID Report); _IRQL_requires_max_(APC_LEVEL) _Acquires_lock_(_Lock_kind_mutex_) _Releases_lock_(_Lock_kind_mutex_) NTSTATUS HandlePeriodicGlobalReportQueueQuery(_Inout_ PIRP Irp); _IRQL_requires_max_(APC_LEVEL) _Acquires_lock_(_Lock_kind_mutex_) _Releases_lock_(_Lock_kind_mutex_) VOID FreeGlobalReportQueueObjects(); VOID ListInit(_Inout_ PSINGLE_LIST_ENTRY Head, _Inout_ PKGUARDED_MUTEX Lock); _Acquires_lock_(_Lock_kind_mutex_) _Releases_lock_(_Lock_kind_mutex_) VOID ListInsert(_Inout_ PSINGLE_LIST_ENTRY Head, _Inout_ PSINGLE_LIST_ENTRY NewEntry, _In_ PKGUARDED_MUTEX Lock); _Acquires_lock_(_Lock_kind_mutex_) _Releases_lock_(_Lock_kind_mutex_) BOOLEAN ListFreeFirstEntry(_Inout_ PSINGLE_LIST_ENTRY Head, _In_ PKGUARDED_MUTEX Lock, _In_opt_ PVOID CallbackRoutine); _Acquires_lock_(_Lock_kind_mutex_) _Releases_lock_(_Lock_kind_mutex_) VOID ListRemoveEntry(_Inout_ PSINGLE_LIST_ENTRY Head, _Inout_ PSINGLE_LIST_ENTRY Entry, _In_ PKGUARDED_MUTEX Lock); #endif