1 /*++ 2 3 Copyright (c) Microsoft Corporation 4 5 ModuleName: 6 7 MxWorkItemKm.h 8 9 Abstract: 10 11 Kernel mode implementation of work item 12 class defined in MxWorkItem.h 13 14 Author: 15 16 17 18 Revision History: 19 20 21 22 --*/ 23 24 #pragma once 25 26 typedef IO_WORKITEM_ROUTINE MX_WORKITEM_ROUTINE, *PMX_WORKITEM_ROUTINE; 27 typedef PIO_WORKITEM MdWorkItem; 28 29 #include "MxWorkItem.h" 30 31 __inline 32 MxWorkItem::MxWorkItem( 33 ) 34 { 35 m_WorkItem = NULL; 36 } 37 38 _Must_inspect_result_ 39 __inline 40 NTSTATUS 41 MxWorkItem::Allocate( 42 __in MdDeviceObject DeviceObject, 43 __in_opt PVOID ThreadPoolEnv 44 ) 45 { 46 UNREFERENCED_PARAMETER(ThreadPoolEnv); 47 48 m_WorkItem = IoAllocateWorkItem(DeviceObject); 49 if (NULL == m_WorkItem) { 50 return STATUS_INSUFFICIENT_RESOURCES; 51 } 52 53 return STATUS_SUCCESS; 54 } 55 56 __inline 57 VOID 58 MxWorkItem::Enqueue( 59 __in PMX_WORKITEM_ROUTINE Callback, 60 __in PVOID Context 61 ) 62 { 63 IoQueueWorkItem( 64 m_WorkItem, 65 Callback, 66 DelayedWorkQueue, 67 Context 68 ); 69 } 70 71 __inline 72 MdWorkItem 73 MxWorkItem::GetWorkItem( 74 ) 75 { 76 return m_WorkItem; 77 } 78 79 __inline 80 VOID 81 MxWorkItem::_Free( 82 __in MdWorkItem Item 83 ) 84 { 85 IoFreeWorkItem(Item); 86 } 87 88 __inline 89 VOID 90 MxWorkItem::Free( 91 ) 92 { 93 if (NULL != m_WorkItem) { 94 MxWorkItem::_Free(m_WorkItem); 95 m_WorkItem = NULL; 96 } 97 } 98 99 // 100 // FxAutoWorkitem 101 // 102 __inline 103 MxAutoWorkItem::~MxAutoWorkItem( 104 ) 105 { 106 this->Free(); 107 } 108 109 110