3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/io/iowork.c
6 * PURPOSE: Manage IO system work queues
8 * PROGRAMMERS: David Welch (welch@mcmail.com)
9 * Robert Dickenson (odin@pnc.com.au)
12 /* INCLUDES ******************************************************************/
16 #include <internal/debug.h>
18 /* TYPES ********************************************************************/
20 typedef struct _IO_WORKITEM
23 PDEVICE_OBJECT DeviceObject
;
24 PIO_WORKITEM_ROUTINE WorkerRoutine
;
28 /* GLOBALS ******************************************************************/
30 #define TAG_IOWI TAG('I', 'O', 'W', 'I')
32 /* FUNCTIONS ****************************************************************/
35 IoWorkItemCallback(PVOID Parameter
)
37 PIO_WORKITEM IoWorkItem
= (PIO_WORKITEM
)Parameter
;
38 PDEVICE_OBJECT DeviceObject
= IoWorkItem
->DeviceObject
;
39 IoWorkItem
->WorkerRoutine(IoWorkItem
->DeviceObject
, IoWorkItem
->Context
);
40 ObDereferenceObject(DeviceObject
);
47 IoQueueWorkItem(IN PIO_WORKITEM IoWorkItem
,
48 IN PIO_WORKITEM_ROUTINE WorkerRoutine
,
49 IN WORK_QUEUE_TYPE QueueType
,
52 * FUNCTION: Inserts a work item in a queue for one of the system worker
55 * IoWorkItem = Item to insert
56 * QueueType = Queue to insert it in
59 ExInitializeWorkItem(&IoWorkItem
->Item
, IoWorkItemCallback
,
61 IoWorkItem
->WorkerRoutine
= WorkerRoutine
;
62 IoWorkItem
->Context
= Context
;
63 ObReferenceObjectByPointer(IoWorkItem
->DeviceObject
,
67 ExQueueWorkItem(&IoWorkItem
->Item
, QueueType
);
74 IoFreeWorkItem(PIO_WORKITEM IoWorkItem
)
76 ExFreePool(IoWorkItem
);
83 IoAllocateWorkItem(PDEVICE_OBJECT DeviceObject
)
85 PIO_WORKITEM IoWorkItem
= NULL
;
88 ExAllocatePoolWithTag(NonPagedPool
, sizeof(IO_WORKITEM
), TAG_IOWI
);
89 if (IoWorkItem
== NULL
)
93 RtlZeroMemory(IoWorkItem
, sizeof(IO_WORKITEM
));
94 IoWorkItem
->DeviceObject
= DeviceObject
;