ReactOS
0.4.15-dev-5606-gf34e425
iowork.c
Go to the documentation of this file.
1
/*
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)
8
*/
9
10
/* INCLUDES ******************************************************************/
11
12
#include <ntoskrnl.h>
13
#define NDEBUG
14
#include <debug.h>
15
16
/* PRIVATE FUNCTIONS *********************************************************/
17
18
VOID
19
NTAPI
20
IopWorkItemCallback
(
IN
PVOID
Parameter
)
21
{
22
PIO_WORKITEM
IoWorkItem
= (
PIO_WORKITEM
)
Parameter
;
23
PDEVICE_OBJECT
DeviceObject
=
IoWorkItem
->DeviceObject;
24
PAGED_CODE
();
25
26
/* Call the work routine */
27
IoWorkItem
->WorkerRoutine(
DeviceObject
,
IoWorkItem
->Context);
28
29
/* Dereference the device object */
30
ObDereferenceObject
(
DeviceObject
);
31
}
32
33
/* PUBLIC FUNCTIONS **********************************************************/
34
35
/*
36
* @implemented
37
*/
38
VOID
39
NTAPI
40
IoQueueWorkItem
(
IN
PIO_WORKITEM
IoWorkItem
,
41
IN
PIO_WORKITEM_ROUTINE
WorkerRoutine
,
42
IN
WORK_QUEUE_TYPE
QueueType
,
43
IN
PVOID
Context
)
44
{
45
/* Make sure we're called at DISPATCH or lower */
46
ASSERT_IRQL_LESS_OR_EQUAL
(
DISPATCH_LEVEL
);
47
48
/* Reference the device object */
49
ObReferenceObject
(
IoWorkItem
->DeviceObject);
50
51
/* Setup the work item */
52
IoWorkItem
->WorkerRoutine =
WorkerRoutine
;
53
IoWorkItem
->Context =
Context
;
54
55
/* Queue the work item */
56
ExQueueWorkItem
(&
IoWorkItem
->Item,
QueueType
);
57
}
58
59
/*
60
* @implemented
61
*/
62
VOID
63
NTAPI
64
IoFreeWorkItem
(
IN
PIO_WORKITEM
IoWorkItem
)
65
{
66
/* Free the work item */
67
ExFreePool
(
IoWorkItem
);
68
}
69
70
/*
71
* @implemented
72
*/
73
PIO_WORKITEM
74
NTAPI
75
IoAllocateWorkItem
(
IN
PDEVICE_OBJECT
DeviceObject
)
76
{
77
PIO_WORKITEM
IoWorkItem
;
78
79
/* Allocate the work item */
80
IoWorkItem
=
ExAllocatePoolWithTag
(
NonPagedPool
,
81
sizeof
(
IO_WORKITEM
),
82
TAG_IOWI
);
83
if
(!
IoWorkItem
)
return
NULL
;
84
85
/* Initialize it */
86
IoWorkItem
->DeviceObject =
DeviceObject
;
87
ExInitializeWorkItem
(&
IoWorkItem
->Item,
IopWorkItemCallback
,
IoWorkItem
);
88
89
/* Return it */
90
return
IoWorkItem
;
91
}
92
93
/* EOF */
Context
Definition:
compobj.c:4794
ASSERT_IRQL_LESS_OR_EQUAL
#define ASSERT_IRQL_LESS_OR_EQUAL(x)
Definition:
debug.h:251
IN
#define IN
Definition:
typedefs.h:39
NonPagedPool
Definition:
ketypes.h:866
ExQueueWorkItem
VOID NTAPI ExQueueWorkItem(IN PWORK_QUEUE_ITEM WorkItem, IN WORK_QUEUE_TYPE QueueType)
Definition:
work.c:723
PIO_WORKITEM_ROUTINE
IO_WORKITEM_ROUTINE * PIO_WORKITEM_ROUTINE
Definition:
iotypes.h:515
WorkerRoutine
_Must_inspect_result_ _In_ PFLT_CALLBACK_DATA _In_ PFLT_DEFERRED_IO_WORKITEM_ROUTINE WorkerRoutine
Definition:
fltkernel.h:1976
IoWorkItem
_In_opt_ PVOID _In_ PIO_WORKITEM IoWorkItem
Definition:
iotypes.h:520
Parameter
_In_ PVOID Parameter
Definition:
ldrtypes.h:241
IoAllocateWorkItem
PIO_WORKITEM NTAPI IoAllocateWorkItem(IN PDEVICE_OBJECT DeviceObject)
Definition:
iowork.c:75
IoFreeWorkItem
VOID NTAPI IoFreeWorkItem(IN PIO_WORKITEM IoWorkItem)
Definition:
iowork.c:64
DeviceObject
_In_ PDEVICE_OBJECT DeviceObject
Definition:
wdfdevice.h:2055
NTAPI
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
Definition:
IoEaTest.cpp:117
_DEVICE_OBJECT
Definition:
env_spec_w32.h:413
ExInitializeWorkItem
#define ExInitializeWorkItem(Item, Routine, Context)
Definition:
exfuncs.h:265
ObDereferenceObject
#define ObDereferenceObject
Definition:
obfuncs.h:203
ExAllocatePoolWithTag
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition:
env_spec_w32.h:350
WORK_QUEUE_TYPE
enum _WORK_QUEUE_TYPE WORK_QUEUE_TYPE
TAG_IOWI
#define TAG_IOWI
Definition:
tag.h:85
DISPATCH_LEVEL
#define DISPATCH_LEVEL
Definition:
env_spec_w32.h:696
IoQueueWorkItem
VOID NTAPI IoQueueWorkItem(IN PIO_WORKITEM IoWorkItem, IN PIO_WORKITEM_ROUTINE WorkerRoutine, IN WORK_QUEUE_TYPE QueueType, IN PVOID Context)
Definition:
iowork.c:40
IopWorkItemCallback
VOID NTAPI IopWorkItemCallback(IN PVOID Parameter)
Definition:
iowork.c:20
NULL
#define NULL
Definition:
types.h:112
Context
struct tagContext Context
Definition:
acpixf.h:1038
ObReferenceObject
#define ObReferenceObject
Definition:
obfuncs.h:204
void
Definition:
nsiface.idl:2306
PIO_WORKITEM
struct _IO_WORKITEM * PIO_WORKITEM
Definition:
iotypes.h:506
_IO_WORKITEM
Definition:
io.h:310
ExFreePool
#define ExFreePool(addr)
Definition:
env_spec_w32.h:352
QueueType
_Must_inspect_result_ _In_ PFLT_CALLBACK_DATA _In_ PFLT_DEFERRED_IO_WORKITEM_ROUTINE _In_ WORK_QUEUE_TYPE QueueType
Definition:
fltkernel.h:1976
PAGED_CODE
#define PAGED_CODE()
Definition:
Bus_PDO_QueryResourceRequirements.c:89
ntoskrnl
io
iomgr
iowork.c
Generated on Fri Jan 27 2023 06:06:17 for ReactOS by
1.8.15