1 /* $Id: iowork.c,v 1.5 2003/07/11 01:23:14 royce Exp $
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: reactos/ntoskrnl/io/iowork.c
6 * PURPOSE: Manage IO system work queues
7 * PROGRAMMER: David Welch (welch@mcmail.com)
8 * Robert Dickenson (odin@pnc.com.au)
10 * 28/09/2002: (RDD) Created from copy of ex/work.c
13 /* INCLUDES ******************************************************************/
15 #include <ddk/ntddk.h>
16 #include <internal/ps.h>
19 #include <internal/debug.h>
21 /* TYPES ********************************************************************/
23 typedef struct _IO_WORKITEM
26 PDEVICE_OBJECT DeviceObject
;
27 PIO_WORKITEM_ROUTINE WorkerRoutine
;
31 /* GLOBALS ******************************************************************/
33 #define TAG_IOWI TAG('I', 'O', 'W', 'I')
35 /* FUNCTIONS ****************************************************************/
38 IoWorkItemCallback(PVOID Parameter
)
40 PIO_WORKITEM IoWorkItem
= (PIO_WORKITEM
)Parameter
;
41 PDEVICE_OBJECT DeviceObject
= IoWorkItem
->DeviceObject
;
42 IoWorkItem
->WorkerRoutine(IoWorkItem
->DeviceObject
, IoWorkItem
->Context
);
43 ObDereferenceObject(DeviceObject
);
50 IoQueueWorkItem(IN PIO_WORKITEM IoWorkItem
,
51 IN PIO_WORKITEM_ROUTINE WorkerRoutine
,
52 IN WORK_QUEUE_TYPE QueueType
,
55 * FUNCTION: Inserts a work item in a queue for one of the system worker
58 * IoWorkItem = Item to insert
59 * QueueType = Queue to insert it in
62 ExInitializeWorkItem(&IoWorkItem
->Item
, IoWorkItemCallback
,
64 IoWorkItem
->WorkerRoutine
= WorkerRoutine
;
65 IoWorkItem
->Context
= Context
;
66 ObReferenceObjectByPointer(IoWorkItem
->DeviceObject
,
70 ExQueueWorkItem(&IoWorkItem
->Item
, QueueType
);
77 IoFreeWorkItem(PIO_WORKITEM IoWorkItem
)
79 ExFreePool(IoWorkItem
);
86 IoAllocateWorkItem(PDEVICE_OBJECT DeviceObject
)
88 PIO_WORKITEM IoWorkItem
= NULL
;
91 ExAllocatePoolWithTag(NonPagedPool
, sizeof(IO_WORKITEM
), TAG_IOWI
);
92 if (IoWorkItem
== NULL
)
96 RtlZeroMemory(IoWorkItem
, sizeof(IO_WORKITEM
));
97 IoWorkItem
->DeviceObject
= DeviceObject
;