1 ///////////////////////////////////////////////////////////////////////////////
\r
5 ///////////////////////////////////////////////////////////////////////////////
\r
9 typedef struct KeyQue {
\r
10 ULONG count; // Number of keys in the que
\r
11 ULONG lengthof_que; // Length of que
\r
12 KEYBOARD_INPUT_DATA *insert; // Insertion pointer for que
\r
13 KEYBOARD_INPUT_DATA *remove; // Removal pointer for que
\r
14 KEYBOARD_INPUT_DATA *que;
\r
18 #define KeyQueSize 100
\r
21 ///////////////////////////////////////////////////////////////////////////////
\r
25 NTSTATUS KqInitialize(KeyQue *kq);
\r
26 void KqClear(KeyQue *kq);
\r
27 NTSTATUS KqFinalize(KeyQue *kq);
\r
28 BOOLEAN KqIsEmpty(KeyQue *kq);
\r
29 ULONG KqEnque(KeyQue *kq, IN KEYBOARD_INPUT_DATA *buf, IN ULONG lengthof_buf);
\r
30 ULONG KqDeque(KeyQue *kq, OUT KEYBOARD_INPUT_DATA *buf, IN ULONG lengthof_buf);
\r
34 #pragma alloc_text( init, KqInitialize )
\r
35 #pragma alloc_text( page, KqFinalize )
\r
36 #endif // ALLOC_PRAGMA
\r
39 ///////////////////////////////////////////////////////////////////////////////
\r
43 NTSTATUS KqInitialize(KeyQue *kq)
\r
46 kq->lengthof_que = KeyQueSize;
\r
47 kq->que = ExAllocatePool(NonPagedPool,
\r
48 kq->lengthof_que * sizeof(KEYBOARD_INPUT_DATA));
\r
49 kq->insert = kq->que;
\r
50 kq->remove = kq->que;
\r
51 if (kq->que == NULL)
\r
52 return STATUS_INSUFFICIENT_RESOURCES;
\r
54 return STATUS_SUCCESS;
\r
58 void KqClear(KeyQue *kq)
\r
61 kq->insert = kq->que;
\r
62 kq->remove = kq->que;
\r
66 NTSTATUS KqFinalize(KeyQue *kq)
\r
69 ExFreePool(kq->que);
\r
70 return STATUS_SUCCESS;
\r
74 BOOLEAN KqIsEmpty(KeyQue *kq)
\r
76 return 0 == kq->count;
\r
80 // return: lengthof copied data
\r
81 ULONG KqEnque(KeyQue *kq, IN KEYBOARD_INPUT_DATA *buf, IN ULONG lengthof_buf)
\r
85 if (kq->lengthof_que - kq->count < lengthof_buf) // overflow
\r
86 lengthof_buf = kq->lengthof_que - kq->count; // chop overflowed datum
\r
87 if (lengthof_buf <= 0)
\r
90 rest = kq->lengthof_que - (kq->insert - kq->que);
\r
91 if (rest < lengthof_buf) {
\r
94 RtlMoveMemory((PCHAR)kq->insert, (PCHAR)buf,
\r
95 sizeof(KEYBOARD_INPUT_DATA) * copy);
\r
98 copy = lengthof_buf - copy;
\r
100 RtlMoveMemory((PCHAR)kq->que, (PCHAR)buf,
\r
101 sizeof(KEYBOARD_INPUT_DATA) * copy);
\r
102 kq->insert = kq->que + copy;
\r
104 RtlMoveMemory((PCHAR)kq->insert, (PCHAR)buf,
\r
105 sizeof(KEYBOARD_INPUT_DATA) * lengthof_buf);
\r
106 kq->insert += lengthof_buf;
\r
108 kq->count += lengthof_buf;
\r
109 return lengthof_buf;
\r
113 // return: lengthof copied data
\r
114 ULONG KqDeque(KeyQue *kq, OUT KEYBOARD_INPUT_DATA *buf, IN ULONG lengthof_buf)
\r
118 if (kq->count < lengthof_buf)
\r
119 lengthof_buf = kq->count;
\r
120 if (lengthof_buf <= 0)
\r
123 rest = kq->lengthof_que - (kq->remove - kq->que);
\r
124 if (rest < lengthof_buf) {
\r
127 RtlMoveMemory((PCHAR)buf, (PCHAR)kq->remove,
\r
128 sizeof(KEYBOARD_INPUT_DATA) * copy);
\r
131 copy = lengthof_buf - copy;
\r
133 RtlMoveMemory((PCHAR)buf, (PCHAR)kq->que,
\r
134 sizeof(KEYBOARD_INPUT_DATA) * copy);
\r
135 kq->remove = kq->que + copy;
\r
137 RtlMoveMemory((PCHAR)buf, (PCHAR)kq->remove,
\r
138 sizeof(KEYBOARD_INPUT_DATA) * lengthof_buf);
\r
139 kq->remove += lengthof_buf;
\r
141 kq->count -= lengthof_buf;
\r
142 return lengthof_buf;
\r