2 * PROJECT: ReactOS Kernel
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: ntoskrnl/io/iomgr/iowork.c
5 * PURPOSE: I/O Wrappers for the Executive Work Item Functions
6 * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org)
7 * Robert Dickenson (odin@pnc.com.au)
10 /* INCLUDES ******************************************************************/
16 /* PRIVATE FUNCTIONS *********************************************************/
20 IopWorkItemCallback(IN PVOID Parameter
)
22 PIO_WORKITEM IoWorkItem
= (PIO_WORKITEM
)Parameter
;
23 PDEVICE_OBJECT DeviceObject
= IoWorkItem
->DeviceObject
;
26 /* Call the work routine */
27 IoWorkItem
->WorkerRoutine(DeviceObject
, IoWorkItem
->Context
);
29 /* Dereference the device object */
30 ObDereferenceObject(DeviceObject
);
33 /* PUBLIC FUNCTIONS **********************************************************/
40 IoQueueWorkItem(IN PIO_WORKITEM IoWorkItem
,
41 IN PIO_WORKITEM_ROUTINE WorkerRoutine
,
42 IN WORK_QUEUE_TYPE QueueType
,
45 /* Make sure we're called at DISPATCH or lower */
46 ASSERT_IRQL_LESS_OR_EQUAL(DISPATCH_LEVEL
);
48 /* Reference the device object */
49 ObReferenceObject(IoWorkItem
->DeviceObject
);
51 /* Setup the work item */
52 IoWorkItem
->WorkerRoutine
= WorkerRoutine
;
53 IoWorkItem
->Context
= Context
;
55 /* Queue the work item */
56 ExQueueWorkItem(&IoWorkItem
->Item
, QueueType
);
64 IoFreeWorkItem(IN PIO_WORKITEM IoWorkItem
)
66 /* Free the work item */
67 ExFreePool(IoWorkItem
);
75 IoAllocateWorkItem(IN PDEVICE_OBJECT DeviceObject
)
77 PIO_WORKITEM IoWorkItem
;
79 /* Allocate the work item */
80 IoWorkItem
= ExAllocatePoolWithTag(NonPagedPool
,
83 if (!IoWorkItem
) return NULL
;
86 IoWorkItem
->DeviceObject
= DeviceObject
;
87 ExInitializeWorkItem(&IoWorkItem
->Item
, IopWorkItemCallback
, IoWorkItem
);