blob: b1546062da8c8f66f1b2efc0a2bf1043d20e0c5c (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
#ifndef _LWQUEUE_H
#define _LWQUEUE_H
#define POOL_ZERO_DOWN_LEVEL_SUPPORT
#include <wdm.h>
#define STMEDIT_TAG_LQWI 'wLeS' // Light Weight Queue Work Items.
typedef struct _LW_ENTRY
{
struct _LW_ENTRY *Next;
} LW_ENTRY, *PLW_ENTRY;
typedef struct _LW_QUEUE
{
// Queue Head
PLW_ENTRY Head;
// Queue Tail
PLW_ENTRY Tail;
// Dummy Queue head.
LW_ENTRY Dummy;
// Lock for queue synchronization
KSPIN_LOCK Lock;
// If a workitem is already scheduled
BOOLEAN WorkerScheduled;
// Is the Queue initialized
BOOLEAN Initialized;
// Workitem for IoXxxWorkItem
PIO_WORKITEM WorkItem;
// Callback routine to be invoked
PIO_WORKITEM_ROUTINE WorkerRoutine;
// One of the caller's device objects.
PVOID IoObject;
} LW_QUEUE, *PLW_QUEUE;
NTSTATUS
LwInitializeQueue(
_In_ PVOID IoObject,
_Out_ PLW_QUEUE Queue,
_In_ PIO_WORKITEM_ROUTINE WorkerRoutine
);
VOID
LwUninitializeQueue(
_Inout_ PLW_QUEUE Queue
);
VOID
LwEnqueue(
_In_ PLW_QUEUE Queue,
_In_ PLW_ENTRY Entry
);
PLW_ENTRY
LwDequeueAll(
_In_ PLW_QUEUE Queue
);
#endif // _LWQUEUE_H
|