ReactOS 0.4.15-dev-7924-g5949c20
KeDevQueue.c File Reference
#include <kmt_test.h>
#include <debug.h>
Include dependency graph for KeDevQueue.c:

Go to the source code of this file.

Macros

#define NDEBUG
 
#define NUMBER   255
 
#define INSERT_COUNT   5
 

Functions

int Check_mem (void *a, int n, int size)
 
void Test_Initialize ()
 
void Tests_Insert_And_Delete ()
 
 START_TEST (KeDeviceQueue)
 

Macro Definition Documentation

◆ INSERT_COUNT

#define INSERT_COUNT   5

Definition at line 16 of file KeDevQueue.c.

◆ NDEBUG

#define NDEBUG

Definition at line 12 of file KeDevQueue.c.

◆ NUMBER

#define NUMBER   255

Definition at line 15 of file KeDevQueue.c.

Function Documentation

◆ Check_mem()

int Check_mem ( void a,
int  n,
int  size 
)

Definition at line 18 of file KeDevQueue.c.

19{
20 int i;
21 for (i = 0; i < size; i++) {
22 if (*((unsigned char*)a + i) != n) {
23 return 0;
24 }
25 }
26 return 1;
27}
GLsizeiptr size
Definition: glext.h:5919
GLdouble n
Definition: glext.h:7729
GLboolean GLboolean GLboolean GLboolean a
Definition: glext.h:6204
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248

Referenced by Test_Initialize().

◆ START_TEST()

START_TEST ( KeDeviceQueue  )

Definition at line 192 of file KeDevQueue.c.

193{
196}
void Tests_Insert_And_Delete()
Definition: KeDevQueue.c:71
void Test_Initialize()
Definition: KeDevQueue.c:29

◆ Test_Initialize()

void Test_Initialize ( )

Definition at line 29 of file KeDevQueue.c.

30{
31 PKDEVICE_QUEUE testing_queue;
32 void* double_queue;
33
34 trace("******* Testing KeInitializeDeviceQueue ************\n");
35 DPRINT1("\nStart test for KeInitializeDeviceQueue function\n");
36
37 testing_queue = ExAllocatePool(NonPagedPool, sizeof(KDEVICE_QUEUE));
38
39 testing_queue->Busy = TRUE;
40 testing_queue->Size = 0;
41
42 KeInitializeDeviceQueue(testing_queue);
43
44 /* Check for properly setting up fields */
45 ok(!testing_queue->Busy, "(Initialize testing) Test 1:\tExpected 'not busy' status\n");
46 DPRINT1("Test 1 completed\n");
47
48 ok(testing_queue->Size == sizeof(KDEVICE_QUEUE), "(Initialize testing) Test 2:\tExpected another size for KDEVICE_QUEUE\n");
49 DPRINT1("Test 2 completed\n");
50
51 ok(testing_queue->Type == DeviceQueueObject, "(Initialize testing) Test 3:\tExpected type == DeviceQueueObject\n");
52 DPRINT1("Test 3 completed\n");
53
54 /* Make sure it does not write outside allocated buffer */
55 double_queue = ExAllocatePool(NonPagedPool, sizeof(KDEVICE_QUEUE) * 2);
56
57 memset(double_queue, NUMBER, sizeof(KDEVICE_QUEUE) * 2);
58 KeInitializeDeviceQueue(double_queue);
59
60 ok(Check_mem((void*)((char*)double_queue + sizeof(KDEVICE_QUEUE)), NUMBER, sizeof(KDEVICE_QUEUE)), "(Initialize testing) Test 4:\tFunction uses someone else's memory \n");
61 DPRINT1("Test 4 completed\n");
62
63//====================================================================
64
65 ExFreePool(testing_queue);
66 ExFreePool(double_queue);
67
68 DPRINT1("KeInitializeDeviceQueue test finished\n");
69}
#define NUMBER
Definition: KeDevQueue.c:15
int Check_mem(void *a, int n, int size)
Definition: KeDevQueue.c:18
#define trace
Definition: atltest.h:70
#define ok(value,...)
Definition: atltest.h:57
#define DPRINT1
Definition: precomp.h:8
VOID NTAPI KeInitializeDeviceQueue(IN PKDEVICE_QUEUE DeviceQueue)
Definition: devqueue.c:22
#define TRUE
Definition: types.h:120
#define ExFreePool(addr)
Definition: env_spec_w32.h:352
#define NonPagedPool
Definition: env_spec_w32.h:307
#define ExAllocatePool(type, size)
Definition: fbtusb.h:44
@ DeviceQueueObject
Definition: ketypes.h:426
#define memset(x, y, z)
Definition: compat.h:39
BOOLEAN Busy
Definition: ketypes.h:733
CSHORT Type
Definition: ketypes.h:720
CSHORT Size
Definition: ketypes.h:721

Referenced by START_TEST().

◆ Tests_Insert_And_Delete()

void Tests_Insert_And_Delete ( )

Definition at line 71 of file KeDevQueue.c.

72{
73 ULONG i, j;
74 PKDEVICE_QUEUE testing_queue;
77 PKDEVICE_QUEUE_ENTRY* elem_array;
78 PKDEVICE_QUEUE_ENTRY return_value;
80 ULONG key;
81
82 trace("******* Testing KeInsertDeviceQueue **************** \n");
83 DPRINT1("\nStart KeInsertDeviceQueue test\n");
84
85 testing_queue = ExAllocatePool(NonPagedPool, sizeof(KDEVICE_QUEUE));
86 KeInitializeDeviceQueue(testing_queue);
87
89
90 /* Raise to dispatch level */
92
93 KeInsertDeviceQueue(testing_queue, element);
94 ok(!element->Inserted, "Wrong 'Inserted' status\n");
95 DPRINT1("Test 1 completed\n");
96
97 /* Fill the queue*/
99
100 DPRINT1("Arrow of tests starting\n");
101 for (i = 0; i < INSERT_COUNT; i++) {
102 elem_array[i] = ExAllocatePool(NonPagedPool, sizeof(KDEVICE_QUEUE_ENTRY));
103 elem_array[i]->Inserted = FALSE;
104 elem_array[i]->SortKey = i;
105 KeInsertDeviceQueue(testing_queue, elem_array[i]);
106 ok(elem_array[i]->Inserted, "Element was not inserted\n");
107 }
108 DPRINT1("Arrow of tests complete\n");
109
110 ok(testing_queue->Size == sizeof(KDEVICE_QUEUE), "Wrong size of queue\n");
111
112 /* Check how the queue was filled */
113 next = &testing_queue->DeviceListHead;
114
115 DPRINT1("Bunch of tests starting\n");
116 for (i = 0; i < INSERT_COUNT; i++) {
117 next = next->Flink;
118 key = CONTAINING_RECORD(next, KDEVICE_QUEUE_ENTRY, DeviceListEntry)->SortKey;
119 ok(key == i, "Sort key was changed\n");
120 }
121 DPRINT1("Bunch of tests completed\n");
122
123 trace("****************************************************\n\n");
124 DPRINT1("KeInsertDeviceQueue test finish\n");
125
126 /* Test deletion */
127 trace("******* Testing KeRemoveDeviceQueue **************** \n");
128 DPRINT1("\nStart KeRemoveDeviceQueue test\n");
129
130 DPRINT1("Start deleting elements from queue\n");
131 for (i = 0; i < INSERT_COUNT; i++) {
132 return_value = KeRemoveDeviceQueue(testing_queue);
133 ok(return_value == elem_array[i], "Returning element != head element\n");
134 ok(return_value->Inserted == FALSE, "Returning element is still in queue\n");
135 next = &testing_queue->DeviceListHead;
136 for (j = i + 1; j < INSERT_COUNT; j++) {
137 next = next->Flink;
138 ok(CONTAINING_RECORD(next, KDEVICE_QUEUE_ENTRY, DeviceListEntry)->SortKey == j, "Queue was damaged\n");
139 }
140 }
141 DPRINT1("Deleting finish. Queue must be empty\n");
142
143 ok(KeRemoveDeviceQueue(testing_queue) == NULL, "Queue is not empty\n");
144 ok(testing_queue->Busy == FALSE, "Queue is busy\n");
145
146 trace("****************************************************\n\n");
147 DPRINT1("Finish KeRemoveDeviceQueue test\n");
148
149 trace("******* Testing KeRemoveEntryDeviceQueue *********** \n");
150 DPRINT1("\nStart KeRemoveEntryDeviceQueue test\n");
151
152 DPRINT1("Filling queue\n");
153 for (i = 0; i < INSERT_COUNT; i++) {
154 elem_array[i]->SortKey = i;
155 elem_array[i]->Inserted = FALSE;
156 KeInsertDeviceQueue(testing_queue, elem_array[i]);
157 }
158
159 /* Delete half of all elements in the queue */
160 DPRINT1("Deleting elements\n");
161 for (i = 0; i < INSERT_COUNT / 2; i++) {
162 ok(KeRemoveEntryDeviceQueue(testing_queue, elem_array[i * 2 + 1]), "Element is not deleted\n");
163 }
164
165 /* Checking queue */
166 DPRINT1("Checking\n");
167 next = &testing_queue->DeviceListHead;
168 for (i = 0; i < INSERT_COUNT / 2 + 1; i++) {
169 ok(CONTAINING_RECORD(next, KDEVICE_QUEUE_ENTRY, DeviceListEntry)->SortKey == i * 2, "Queue was damaged\n");
170 next = next->Flink;
171 }
172
173 /* Trying delete elements, which are not in this queue */
174 DPRINT1("Trying delete nonexistent elements\n");
175 for (i = 0; i < INSERT_COUNT / 2; i++) {
176 ok(!KeRemoveEntryDeviceQueue(testing_queue, elem_array[i * 2 + 1]), "Wrong remove operation\n");
177 }
178
179 trace("****************************************************\n\n");
180 /* Freeing memory */
181 for (i = 0; i < INSERT_COUNT; i++) {
182 ExFreePool(elem_array[i]);
183 }
184
185 /* Return back to previous IRQL */
187
188 ExFreePool(testing_queue);
190}
#define INSERT_COUNT
Definition: KeDevQueue.c:16
PKDEVICE_QUEUE_ENTRY NTAPI KeRemoveDeviceQueue(IN PKDEVICE_QUEUE DeviceQueue)
Definition: devqueue.c:153
BOOLEAN NTAPI KeInsertDeviceQueue(IN PKDEVICE_QUEUE DeviceQueue, IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry)
Definition: devqueue.c:41
BOOLEAN NTAPI KeRemoveEntryDeviceQueue(IN PKDEVICE_QUEUE DeviceQueue, IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry)
Definition: devqueue.c:348
#define NULL
Definition: types.h:112
#define FALSE
Definition: types.h:117
UCHAR KIRQL
Definition: env_spec_w32.h:591
#define KeRaiseIrql(irql, oldIrql)
Definition: env_spec_w32.h:597
#define KeLowerIrql(oldIrql)
Definition: env_spec_w32.h:602
#define DISPATCH_LEVEL
Definition: env_spec_w32.h:696
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
static unsigned __int64 next
Definition: rand_nt.c:6
Definition: ketypes.h:578
ULONG SortKey
Definition: ketypes.h:580
BOOLEAN Inserted
Definition: ketypes.h:581
LIST_ENTRY DeviceListHead
Definition: ketypes.h:722
Definition: typedefs.h:120
Definition: copy.c:22
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
Definition: kefuncs.h:778
_Inout_ PKDEVICE_QUEUE_ENTRY _In_ ULONG SortKey
Definition: kefuncs.h:328

Referenced by START_TEST().