[NTDLL_APITEST]
[reactos.git] / rostests / apitests / ntdll / RtlBitmap.c
1
2 #include <apitest.h>
3
4 #define WIN32_NO_STATUS
5 #include <ndk/mmfuncs.h>
6 #include <ndk/rtlfuncs.h>
7
8 static
9 PVOID
10 AllocateGuarded(
11 _In_ SIZE_T SizeRequested)
12 {
13 NTSTATUS Status;
14 SIZE_T Size = PAGE_ROUND_UP(SizeRequested + PAGE_SIZE);
15 PVOID VirtualMemory = NULL;
16 PCHAR StartOfBuffer;
17
18 Status = NtAllocateVirtualMemory(NtCurrentProcess(), &VirtualMemory, 0, &Size, MEM_RESERVE, PAGE_NOACCESS);
19
20 if (!NT_SUCCESS(Status))
21 return NULL;
22
23 Size -= PAGE_SIZE;
24 if (Size)
25 {
26 Status = NtAllocateVirtualMemory(NtCurrentProcess(), &VirtualMemory, 0, &Size, MEM_COMMIT, PAGE_READWRITE);
27 if (!NT_SUCCESS(Status))
28 {
29 Size = 0;
30 Status = NtFreeVirtualMemory(NtCurrentProcess(), &VirtualMemory, &Size, MEM_RELEASE);
31 ok(Status == STATUS_SUCCESS, "Status = %lx\n", Status);
32 return NULL;
33 }
34 }
35
36 StartOfBuffer = VirtualMemory;
37 StartOfBuffer += Size - SizeRequested;
38
39 return StartOfBuffer;
40 }
41
42 static
43 VOID
44 FreeGuarded(
45 _In_ PVOID Pointer)
46 {
47 NTSTATUS Status;
48 PVOID VirtualMemory = (PVOID)PAGE_ROUND_DOWN((SIZE_T)Pointer);
49 SIZE_T Size = 0;
50
51 Status = NtFreeVirtualMemory(NtCurrentProcess(), &VirtualMemory, &Size, MEM_RELEASE);
52 ok(Status == STATUS_SUCCESS, "Status = %lx\n", Status);
53 }
54
55 void
56 Test_RtlFindMostSignificantBit(void)
57 {
58 ok_int(RtlFindMostSignificantBit(0), -1);
59
60 ok_int(RtlFindMostSignificantBit(0x0000000000000001ULL), 0);
61 ok_int(RtlFindMostSignificantBit(0x0000000000000002ULL), 1);
62 ok_int(RtlFindMostSignificantBit(0x1000000000000000ULL), 60);
63 ok_int(RtlFindMostSignificantBit(0x8000000000000000ULL), 63);
64 ok_int(RtlFindMostSignificantBit(0x8000000000000001ULL), 63);
65 ok_int(RtlFindMostSignificantBit(0xFFFFFFFFFFFFFFFFULL), 63);
66 ok_int(RtlFindMostSignificantBit(0x0000000070000000ULL), 30);
67 }
68
69 void
70 Test_RtlFindLeastSignificantBit(void)
71 {
72 ok_int(RtlFindLeastSignificantBit(0), -1);
73
74 ok_int(RtlFindLeastSignificantBit(0x0000000000000001ULL), 0);
75 ok_int(RtlFindLeastSignificantBit(0x0000000000000002ULL), 1);
76 ok_int(RtlFindLeastSignificantBit(0x1000000000000000ULL), 60);
77 ok_int(RtlFindLeastSignificantBit(0x8000000000000000ULL), 63);
78 ok_int(RtlFindLeastSignificantBit(0x8000000000000000ULL), 63);
79 ok_int(RtlFindLeastSignificantBit(0xFFFFFFFFFFFFFFFFULL), 0);
80 ok_int(RtlFindLeastSignificantBit(0x0000000070000000ULL), 28);
81 }
82
83 void
84 Test_RtlInitializeBitMap(void)
85 {
86 RTL_BITMAP BitMapHeader;
87 ULONG Buffer[2];
88 BOOLEAN Exception = FALSE;
89
90 _SEH2_TRY
91 {
92 RtlInitializeBitMap(NULL, NULL, 0);
93 }
94 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
95 {
96 Exception = TRUE;
97 }
98 _SEH2_END;
99 ok_int(Exception, 1);
100
101 memset(Buffer, 0xcc, sizeof(Buffer));
102 RtlInitializeBitMap(&BitMapHeader, Buffer, 0);
103 ok_int(BitMapHeader.SizeOfBitMap, 0);
104 ok_ptr(BitMapHeader.Buffer, Buffer);
105 ok_hex(Buffer[0], 0xcccccccc);
106
107 RtlInitializeBitMap(&BitMapHeader, Buffer, 8);
108 ok_int(BitMapHeader.SizeOfBitMap, 8);
109 ok_hex(Buffer[0], 0xcccccccc);
110 }
111
112 void
113 Test_RtlClearAllBits(void)
114 {
115 RTL_BITMAP BitMapHeader;
116 ULONG *Buffer;
117 ULONG BufferSize = 2 * sizeof(*Buffer);
118
119 Buffer = AllocateGuarded(BufferSize);
120 RtlInitializeBitMap(&BitMapHeader, Buffer, 19);
121 memset(Buffer, 0xcc, BufferSize);
122 RtlClearAllBits(&BitMapHeader);
123 ok_hex(Buffer[0], 0x00000000);
124 ok_hex(Buffer[1], 0xcccccccc);
125
126 RtlInitializeBitMap(&BitMapHeader, Buffer, 0);
127 memset(Buffer, 0xcc, BufferSize);
128 RtlClearAllBits(&BitMapHeader);
129 ok_hex(Buffer[0], 0xcccccccc);
130 ok_hex(Buffer[1], 0xcccccccc);
131
132 RtlInitializeBitMap(&BitMapHeader, Buffer, 64);
133 memset(Buffer, 0xcc, BufferSize);
134 RtlClearAllBits(&BitMapHeader);
135 ok_hex(Buffer[0], 0x00000000);
136 ok_hex(Buffer[1], 0x00000000);
137 FreeGuarded(Buffer);
138 }
139
140 void
141 Test_RtlSetAllBits(void)
142 {
143 RTL_BITMAP BitMapHeader;
144 ULONG *Buffer;
145 ULONG BufferSize = 2 * sizeof(*Buffer);
146
147 Buffer = AllocateGuarded(BufferSize);
148 RtlInitializeBitMap(&BitMapHeader, Buffer, 19);
149 memset(Buffer, 0xcc, BufferSize);
150 RtlSetAllBits(&BitMapHeader);
151 ok_hex(Buffer[0], 0xffffffff);
152 ok_hex(Buffer[1], 0xcccccccc);
153
154 RtlInitializeBitMap(&BitMapHeader, Buffer, 0);
155 memset(Buffer, 0xcc, BufferSize);
156 RtlSetAllBits(&BitMapHeader);
157 ok_hex(Buffer[0], 0xcccccccc);
158 ok_hex(Buffer[1], 0xcccccccc);
159
160 RtlInitializeBitMap(&BitMapHeader, Buffer, 64);
161 memset(Buffer, 0xcc, BufferSize);
162 RtlSetAllBits(&BitMapHeader);
163 ok_hex(Buffer[0], 0xffffffff);
164 ok_hex(Buffer[1], 0xffffffff);
165 FreeGuarded(Buffer);
166 }
167
168 void
169 Test_RtlClearBits(void)
170 {
171 RTL_BITMAP BitMapHeader;
172 ULONG *Buffer;
173 ULONG BufferSize = 2 * sizeof(*Buffer);
174
175 Buffer = AllocateGuarded(BufferSize);
176 RtlInitializeBitMap(&BitMapHeader, Buffer, 19);
177
178 memset(Buffer, 0xff, BufferSize);
179 RtlClearBits(&BitMapHeader, 0, 0);
180 ok_hex(Buffer[0], 0xffffffff);
181 ok_hex(Buffer[1], 0xffffffff);
182
183 memset(Buffer, 0xff, BufferSize);
184 RtlClearBits(&BitMapHeader, 0, 1);
185 ok_hex(Buffer[0], 0xfffffffe);
186 ok_hex(Buffer[1], 0xffffffff);
187
188 memset(Buffer, 0xff, BufferSize);
189 RtlClearBits(&BitMapHeader, 21, 1);
190 ok_hex(Buffer[0], 0xffdfffff);
191 ok_hex(Buffer[1], 0xffffffff);
192
193 memset(Buffer, 0xff, BufferSize);
194 RtlClearBits(&BitMapHeader, 7, 9);
195 ok_hex(Buffer[0], 0xffff007f);
196 ok_hex(Buffer[1], 0xffffffff);
197
198 memset(Buffer, 0xff, BufferSize);
199 RtlClearBits(&BitMapHeader, 13, 22);
200 ok_hex(Buffer[0], 0x00001fff);
201 ok_hex(Buffer[1], 0xfffffff8);
202
203 memset(Buffer, 0xff, BufferSize);
204 RtlClearBits(&BitMapHeader, 63, 1);
205 ok_hex(Buffer[0], 0xffffffff);
206 ok_hex(Buffer[1], 0x7fffffff);
207
208 memset(Buffer, 0xcc, BufferSize);
209 RtlClearBits(&BitMapHeader, 3, 6);
210 RtlClearBits(&BitMapHeader, 11, 5);
211 RtlClearBits(&BitMapHeader, 21, 7);
212 RtlClearBits(&BitMapHeader, 37, 4);
213 ok_hex(Buffer[0], 0xc00c0404);
214 ok_hex(Buffer[1], 0xcccccc0c);
215 FreeGuarded(Buffer);
216 }
217
218 void
219 Test_RtlSetBits(void)
220 {
221 RTL_BITMAP BitMapHeader;
222 ULONG *Buffer;
223 ULONG BufferSize = 2 * sizeof(*Buffer);
224
225 Buffer = AllocateGuarded(BufferSize);
226 RtlInitializeBitMap(&BitMapHeader, Buffer, 19);
227
228 memset(Buffer, 0x00, BufferSize);
229 RtlSetBits(&BitMapHeader, 0, 0);
230 ok_hex(Buffer[0], 0x00000000);
231 ok_hex(Buffer[1], 0x00000000);
232
233 memset(Buffer, 0x00, BufferSize);
234 RtlSetBits(&BitMapHeader, 0, 1);
235 ok_hex(Buffer[0], 0x00000001);
236 ok_hex(Buffer[1], 0x00000000);
237
238 memset(Buffer, 0x00, BufferSize);
239 RtlSetBits(&BitMapHeader, 21, 1);
240 ok_hex(Buffer[0], 0x00200000);
241 ok_hex(Buffer[1], 0x00000000);
242
243 memset(Buffer, 0x00, BufferSize);
244 RtlSetBits(&BitMapHeader, 7, 9);
245 ok_hex(Buffer[0], 0x0000ff80);
246 ok_hex(Buffer[1], 0x00000000);
247
248 memset(Buffer, 0x00, BufferSize);
249 RtlSetBits(&BitMapHeader, 13, 22);
250 ok_hex(Buffer[0], 0xffffe000);
251 ok_hex(Buffer[1], 0x00000007);
252
253 memset(Buffer, 0x00, BufferSize);
254 RtlSetBits(&BitMapHeader, 63, 1);
255 ok_hex(Buffer[0], 0x00000000);
256 ok_hex(Buffer[1], 0x80000000);
257
258 memset(Buffer, 0xcc, BufferSize);
259 RtlSetBits(&BitMapHeader, 3, 6);
260 RtlSetBits(&BitMapHeader, 11, 5);
261 RtlSetBits(&BitMapHeader, 21, 7);
262 RtlSetBits(&BitMapHeader, 37, 4);
263 ok_hex(Buffer[0], 0xcfecfdfc);
264 ok_hex(Buffer[1], 0xcccccdec);
265 FreeGuarded(Buffer);
266 }
267
268 void
269 Test_RtlAreBitsClear(void)
270 {
271 RTL_BITMAP BitMapHeader;
272 ULONG *Buffer;
273
274 Buffer = AllocateGuarded(2 * sizeof(*Buffer));
275 RtlInitializeBitMap(&BitMapHeader, Buffer, 19);
276 Buffer[0] = 0x00ff00ff;
277 Buffer[1] = 0xc0cfc0cf;
278
279 ok_hex(RtlAreBitsClear(&BitMapHeader, 0, 8), FALSE);
280 ok_hex(RtlAreBitsClear(&BitMapHeader, 8, 8), TRUE);
281 ok_hex(RtlAreBitsClear(&BitMapHeader, 7, 8), FALSE);
282 ok_hex(RtlAreBitsClear(&BitMapHeader, 8, 9), FALSE);
283 ok_hex(RtlAreBitsClear(&BitMapHeader, 24, 1), FALSE);
284
285 RtlInitializeBitMap(&BitMapHeader, Buffer, 31);
286 ok_hex(RtlAreBitsClear(&BitMapHeader, 24, 1), TRUE);
287 ok_hex(RtlAreBitsClear(&BitMapHeader, 24, 7), TRUE);
288 ok_hex(RtlAreBitsClear(&BitMapHeader, 24, 8), FALSE);
289
290 RtlInitializeBitMap(&BitMapHeader, Buffer, 64);
291 ok_hex(RtlAreBitsClear(&BitMapHeader, 60, 4), FALSE);
292 FreeGuarded(Buffer);
293 }
294
295 void
296 Test_RtlAreBitsSet(void)
297 {
298 RTL_BITMAP BitMapHeader;
299 ULONG *Buffer;
300
301 Buffer = AllocateGuarded(2 * sizeof(*Buffer));
302 RtlInitializeBitMap(&BitMapHeader, Buffer, 19);
303 Buffer[0] = 0xff00ff00;
304 Buffer[1] = 0x3F303F30;
305
306 ok_hex(RtlAreBitsSet(&BitMapHeader, 0, 8), FALSE);
307 ok_hex(RtlAreBitsSet(&BitMapHeader, 8, 8), TRUE);
308 ok_hex(RtlAreBitsSet(&BitMapHeader, 7, 8), FALSE);
309 ok_hex(RtlAreBitsSet(&BitMapHeader, 8, 9), FALSE);
310 ok_hex(RtlAreBitsSet(&BitMapHeader, 24, 1), FALSE);
311
312 RtlInitializeBitMap(&BitMapHeader, Buffer, 31);
313 ok_hex(RtlAreBitsSet(&BitMapHeader, 24, 1), TRUE);
314 ok_hex(RtlAreBitsSet(&BitMapHeader, 24, 7), TRUE);
315 ok_hex(RtlAreBitsSet(&BitMapHeader, 24, 8), FALSE);
316
317 RtlInitializeBitMap(&BitMapHeader, Buffer, 64);
318 ok_hex(RtlAreBitsSet(&BitMapHeader, 60, 4), FALSE);
319 FreeGuarded(Buffer);
320 }
321
322 void
323 Test_RtlNumberOfSetBits(void)
324 {
325 RTL_BITMAP BitMapHeader;
326 ULONG *Buffer;
327
328 Buffer = AllocateGuarded(2 * sizeof(*Buffer));
329 Buffer[0] = 0xff00ff0f;
330 Buffer[1] = 0x3F303F30;
331
332 RtlInitializeBitMap(&BitMapHeader, Buffer, 0);
333 ok_int(RtlNumberOfSetBits(&BitMapHeader), 0);
334
335 RtlInitializeBitMap(&BitMapHeader, Buffer, 4);
336 ok_int(RtlNumberOfSetBits(&BitMapHeader), 4);
337
338 RtlInitializeBitMap(&BitMapHeader, Buffer, 31);
339 ok_int(RtlNumberOfSetBits(&BitMapHeader), 19);
340
341 RtlInitializeBitMap(&BitMapHeader, Buffer, 56);
342 ok_int(RtlNumberOfSetBits(&BitMapHeader), 30);
343
344 RtlInitializeBitMap(&BitMapHeader, Buffer, 64);
345 ok_int(RtlNumberOfSetBits(&BitMapHeader), 36);
346 FreeGuarded(Buffer);
347 }
348
349 void
350 Test_RtlNumberOfClearBits(void)
351 {
352 RTL_BITMAP BitMapHeader;
353 ULONG *Buffer;
354
355 Buffer = AllocateGuarded(2 * sizeof(*Buffer));
356 Buffer[0] = 0xff00fff0;
357 Buffer[1] = 0x3F303F30;
358
359 RtlInitializeBitMap(&BitMapHeader, Buffer, 0);
360 ok_int(RtlNumberOfClearBits(&BitMapHeader), 0);
361
362 RtlInitializeBitMap(&BitMapHeader, Buffer, 4);
363 ok_int(RtlNumberOfClearBits(&BitMapHeader), 4);
364
365 RtlInitializeBitMap(&BitMapHeader, Buffer, 31);
366 ok_int(RtlNumberOfClearBits(&BitMapHeader), 12);
367
368 RtlInitializeBitMap(&BitMapHeader, Buffer, 56);
369 ok_int(RtlNumberOfClearBits(&BitMapHeader), 26);
370
371 RtlInitializeBitMap(&BitMapHeader, Buffer, 64);
372 ok_int(RtlNumberOfClearBits(&BitMapHeader), 28);
373 FreeGuarded(Buffer);
374 }
375
376 void
377 Test_RtlFindClearBits(void)
378 {
379 RTL_BITMAP BitMapHeader;
380 ULONG *Buffer;
381
382 Buffer = AllocateGuarded(2 * sizeof(*Buffer));
383 Buffer[0] = 0x060F874D;
384 Buffer[1] = 0x3F303F30;
385
386 RtlInitializeBitMap(&BitMapHeader, Buffer, 0);
387 ok_int(RtlFindClearBits(&BitMapHeader, 0, 0), 0);
388 ok_int(RtlFindClearBits(&BitMapHeader, 0, 3), 0);
389 ok_int(RtlFindClearBits(&BitMapHeader, 1, 0), -1);
390 ok_int(RtlFindClearBits(&BitMapHeader, 1, 1), -1);
391
392 RtlInitializeBitMap(&BitMapHeader, Buffer, 8);
393 ok_int(RtlFindClearBits(&BitMapHeader, 0, 3), 0);
394 ok_int(RtlFindClearBits(&BitMapHeader, 1, 0), 1);
395 ok_int(RtlFindClearBits(&BitMapHeader, 1, 1), 1);
396 ok_int(RtlFindClearBits(&BitMapHeader, 1, 2), 4);
397
398 ok_int(RtlFindClearBits(&BitMapHeader, 2, 0), 4);
399 ok_int(RtlFindClearBits(&BitMapHeader, 3, 0), -1);
400
401 RtlInitializeBitMap(&BitMapHeader, Buffer, 32);
402 ok_int(RtlFindClearBits(&BitMapHeader, 0, 3), 0);
403 ok_int(RtlFindClearBits(&BitMapHeader, 0, 21), 16);
404 ok_int(RtlFindClearBits(&BitMapHeader, 0, 12), 8);
405 ok_int(RtlFindClearBits(&BitMapHeader, 0, 31), 24);
406 ok_int(RtlFindClearBits(&BitMapHeader, 0, 32), 0);
407 ok_int(RtlFindClearBits(&BitMapHeader, 0, 39), 0);
408 ok_int(RtlFindClearBits(&BitMapHeader, 4, 0), 11);
409 ok_int(RtlFindClearBits(&BitMapHeader, 5, 0), 20);
410 ok_int(RtlFindClearBits(&BitMapHeader, 4, 11), 11);
411 ok_int(RtlFindClearBits(&BitMapHeader, 4, 12), 20);
412 ok_int(RtlFindClearBits(&BitMapHeader, 2, 11), 11);
413 ok_int(RtlFindClearBits(&BitMapHeader, 2, 12), 12);
414 ok_int(RtlFindClearBits(&BitMapHeader, 1, 32), 1);
415 ok_int(RtlFindClearBits(&BitMapHeader, 4, 32), 11);
416 ok_int(RtlFindClearBits(&BitMapHeader, 5, 32), 20);
417
418 RtlInitializeBitMap(&BitMapHeader, Buffer, 64);
419 ok_int(RtlFindClearBits(&BitMapHeader, 5, 64), 20);
420 ok_int(RtlFindClearBits(&BitMapHeader, 9, 28), 27);
421 ok_int(RtlFindClearBits(&BitMapHeader, 10, 0), -1);
422 Buffer[1] = 0xFF303F30;
423 ok_int(RtlFindClearBits(&BitMapHeader, 1, 56), 1);
424 FreeGuarded(Buffer);
425 }
426
427 void
428 Test_RtlFindSetBits(void)
429 {
430 RTL_BITMAP BitMapHeader;
431 ULONG *Buffer;
432
433 Buffer = AllocateGuarded(2 * sizeof(*Buffer));
434 Buffer[0] = 0xF9F078B2;
435 Buffer[1] = 0x3F303F30;
436
437 RtlInitializeBitMap(&BitMapHeader, Buffer, 0);
438 ok_int(RtlFindSetBits(&BitMapHeader, 0, 0), 0);
439 ok_int(RtlFindSetBits(&BitMapHeader, 0, 3), 0);
440 ok_int(RtlFindSetBits(&BitMapHeader, 1, 0), -1);
441 ok_int(RtlFindSetBits(&BitMapHeader, 1, 1), -1);
442
443 RtlInitializeBitMap(&BitMapHeader, Buffer, 8);
444 ok_int(RtlFindSetBits(&BitMapHeader, 0, 3), 0);
445 ok_int(RtlFindSetBits(&BitMapHeader, 1, 0), 1);
446 ok_int(RtlFindSetBits(&BitMapHeader, 1, 1), 1);
447 ok_int(RtlFindSetBits(&BitMapHeader, 1, 2), 4);
448
449 ok_int(RtlFindSetBits(&BitMapHeader, 2, 0), 4);
450 ok_int(RtlFindSetBits(&BitMapHeader, 3, 0), -1);
451
452 RtlInitializeBitMap(&BitMapHeader, Buffer, 32);
453 ok_int(RtlFindSetBits(&BitMapHeader, 0, 3), 0);
454 ok_int(RtlFindSetBits(&BitMapHeader, 0, 21), 16);
455 ok_int(RtlFindSetBits(&BitMapHeader, 0, 12), 8);
456 ok_int(RtlFindSetBits(&BitMapHeader, 0, 31), 24);
457 ok_int(RtlFindSetBits(&BitMapHeader, 0, 32), 0);
458 ok_int(RtlFindSetBits(&BitMapHeader, 0, 39), 0);
459 ok_int(RtlFindSetBits(&BitMapHeader, 4, 0), 11);
460 ok_int(RtlFindSetBits(&BitMapHeader, 5, 0), 20);
461 ok_int(RtlFindSetBits(&BitMapHeader, 4, 11), 11);
462 ok_int(RtlFindSetBits(&BitMapHeader, 4, 12), 20);
463 ok_int(RtlFindSetBits(&BitMapHeader, 2, 11), 11);
464 ok_int(RtlFindSetBits(&BitMapHeader, 1, 32), 1);
465 ok_int(RtlFindSetBits(&BitMapHeader, 4, 32), 11);
466 ok_int(RtlFindSetBits(&BitMapHeader, 5, 32), 20);
467
468 RtlInitializeBitMap(&BitMapHeader, Buffer, 64);
469 ok_int(RtlFindSetBits(&BitMapHeader, 5, 64), 20);
470 ok_int(RtlFindSetBits(&BitMapHeader, 6, 57), 40);
471 ok_int(RtlFindSetBits(&BitMapHeader, 7, 0), -1);
472 ok_int(RtlFindSetBits(&BitMapHeader, 1, 62), 1);
473 FreeGuarded(Buffer);
474 }
475
476 void
477 Test_RtlFindClearBitsAndSet(void)
478 {
479 RTL_BITMAP BitMapHeader;
480 ULONG *Buffer;
481
482 Buffer = AllocateGuarded(2 * sizeof(*Buffer));
483 Buffer[0] = 0x060F874D;
484 Buffer[1] = 0x3F303F30;
485
486 RtlInitializeBitMap(&BitMapHeader, Buffer, 0);
487 ok_int(RtlFindClearBitsAndSet(&BitMapHeader, 0, 0), 0);
488 ok_int(RtlFindClearBitsAndSet(&BitMapHeader, 0, 3), 0);
489 ok_int(RtlFindClearBitsAndSet(&BitMapHeader, 1, 0), -1);
490 ok_int(RtlFindClearBitsAndSet(&BitMapHeader, 1, 1), -1);
491 ok_hex(Buffer[0], 0x060F874D);
492
493 Buffer[0] = 0x060F874D;
494 RtlInitializeBitMap(&BitMapHeader, Buffer, 8);
495 ok_int(RtlFindClearBitsAndSet(&BitMapHeader, 1, 0), 1);
496 ok_hex(Buffer[0], 0x60f874f);
497 ok_int(RtlFindClearBitsAndSet(&BitMapHeader, 1, 1), 4);
498 ok_hex(Buffer[0], 0x60f875f);
499 ok_int(RtlFindClearBitsAndSet(&BitMapHeader, 1, 2), 5);
500 ok_hex(Buffer[0], 0x60f877f);
501 ok_int(RtlFindClearBitsAndSet(&BitMapHeader, 2, 0), -1);
502 ok_hex(Buffer[0], 0x60f877f);
503
504 Buffer[0] = 0x060F874D;
505 RtlInitializeBitMap(&BitMapHeader, Buffer, 32);
506 ok_int(RtlFindClearBitsAndSet(&BitMapHeader, 4, 0), 11);
507 ok_hex(Buffer[0], 0x60fff4d);
508 ok_int(RtlFindClearBitsAndSet(&BitMapHeader, 5, 0), 20);
509 ok_hex(Buffer[0], 0x7ffff4d);
510 ok_int(RtlFindClearBitsAndSet(&BitMapHeader, 4, 11), 27);
511 ok_hex(Buffer[0], 0x7fffff4d);
512
513 Buffer[0] = 0x060F874D;
514 ok_int(RtlFindClearBitsAndSet(&BitMapHeader, 4, 12), 20);
515 ok_hex(Buffer[0], 0x6ff874d);
516 ok_int(RtlFindClearBitsAndSet(&BitMapHeader, 2, 11), 11);
517 ok_hex(Buffer[0], 0x6ff9f4d);
518 ok_int(RtlFindClearBitsAndSet(&BitMapHeader, 2, 12), 13);
519 ok_hex(Buffer[0], 0x6ffff4d);
520 FreeGuarded(Buffer);
521 }
522
523 void
524 Test_RtlFindSetBitsAndClear(void)
525 {
526 RTL_BITMAP BitMapHeader;
527 ULONG *Buffer;
528
529 Buffer = AllocateGuarded(2 * sizeof(*Buffer));
530 Buffer[0] = 0xF9F078B2;
531 Buffer[1] = 0x3F303F30;
532
533 RtlInitializeBitMap(&BitMapHeader, Buffer, 0);
534 ok_int(RtlFindSetBitsAndClear(&BitMapHeader, 0, 0), 0);
535 ok_int(RtlFindSetBitsAndClear(&BitMapHeader, 0, 3), 0);
536 ok_int(RtlFindSetBitsAndClear(&BitMapHeader, 1, 0), -1);
537 ok_int(RtlFindSetBitsAndClear(&BitMapHeader, 1, 1), -1);
538 ok_hex(Buffer[0], 0xF9F078B2);
539
540 Buffer[0] = 0xF9F078B2;
541 RtlInitializeBitMap(&BitMapHeader, Buffer, 8);
542 ok_int(RtlFindSetBitsAndClear(&BitMapHeader, 1, 0), 1);
543 ok_hex(Buffer[0], 0xf9f078b0);
544 ok_int(RtlFindSetBitsAndClear(&BitMapHeader, 1, 1), 4);
545 ok_hex(Buffer[0], 0xf9f078a0);
546 ok_int(RtlFindSetBitsAndClear(&BitMapHeader, 1, 2), 5);
547 ok_hex(Buffer[0], 0xf9f07880);
548 ok_int(RtlFindSetBitsAndClear(&BitMapHeader, 2, 0), -1);
549 ok_hex(Buffer[0], 0xf9f07880);
550
551 Buffer[0] = 0xF9F078B2;
552 RtlInitializeBitMap(&BitMapHeader, Buffer, 32);
553 ok_int(RtlFindSetBitsAndClear(&BitMapHeader, 4, 0), 11);
554 ok_hex(Buffer[0], 0xf9f000b2);
555 ok_int(RtlFindSetBitsAndClear(&BitMapHeader, 5, 0), 20);
556 ok_hex(Buffer[0], 0xf80000b2);
557 ok_int(RtlFindSetBitsAndClear(&BitMapHeader, 4, 11), 27);
558 ok_hex(Buffer[0], 0x800000b2);
559
560 Buffer[0] = 0xF9F078B2;
561 ok_int(RtlFindSetBitsAndClear(&BitMapHeader, 4, 12), 20);
562 ok_hex(Buffer[0], 0xf90078b2);
563 ok_int(RtlFindSetBitsAndClear(&BitMapHeader, 2, 11), 11);
564 ok_hex(Buffer[0], 0xf90060b2);
565 ok_int(RtlFindSetBitsAndClear(&BitMapHeader, 2, 12), 13);
566 ok_hex(Buffer[0], 0xf90000b2);
567 FreeGuarded(Buffer);
568 }
569
570 void
571 Test_RtlFindNextForwardRunClear(void)
572 {
573 RTL_BITMAP BitMapHeader;
574 ULONG *Buffer;
575 ULONG Index;
576
577 Buffer = AllocateGuarded(2 * sizeof(*Buffer));
578 Buffer[0] = 0xF9F078B2;
579 Buffer[1] = 0x3F303F30;
580
581 RtlInitializeBitMap(&BitMapHeader, Buffer, 0);
582 ok_int(RtlFindNextForwardRunClear(&BitMapHeader, 0, &Index), 0);
583 ok_int(Index, 0);
584 ok_int(RtlFindNextForwardRunClear(&BitMapHeader, 1, &Index), 0);
585 ok_int(Index, 1);
586
587 Index = -1;
588 RtlInitializeBitMap(&BitMapHeader, Buffer, 8);
589 ok_int(RtlFindNextForwardRunClear(&BitMapHeader, 0, &Index), 1);
590 ok_int(Index, 0);
591 ok_int(RtlFindNextForwardRunClear(&BitMapHeader, 1, &Index), 2);
592 ok_int(Index, 2);
593 ok_int(RtlFindNextForwardRunClear(&BitMapHeader, 7, &Index), 0);
594 ok_int(Index, 8);
595 ok_int(RtlFindNextForwardRunClear(&BitMapHeader, 17, &Index), 0);
596 ok_int(Index, 17);
597 ok_int(RtlFindNextForwardRunClear(&BitMapHeader, 39, &Index), 0);
598 ok_int(Index, 39);
599 FreeGuarded(Buffer);
600 }
601
602 void
603 Test_RtlFindFirstRunClear(void)
604 {
605 }
606
607 void
608 Test_RtlFindLastBackwardRunClear(void)
609 {
610 }
611
612 void
613 Test_RtlFindClearRuns(void)
614 {
615 }
616
617 void
618 Test_RtlFindLongestRunClear(void)
619 {
620 }
621
622
623 START_TEST(RtlBitmap)
624 {
625 Test_RtlFindMostSignificantBit();
626 Test_RtlFindLeastSignificantBit();
627 Test_RtlInitializeBitMap();
628 Test_RtlClearAllBits();
629 Test_RtlSetAllBits();
630 Test_RtlClearBits();
631 Test_RtlSetBits();
632 Test_RtlAreBitsClear();
633 Test_RtlAreBitsSet();
634 Test_RtlNumberOfSetBits();
635 Test_RtlNumberOfClearBits();
636 Test_RtlFindClearBits();
637 Test_RtlFindSetBits();
638 Test_RtlFindClearBitsAndSet();
639 Test_RtlFindSetBitsAndClear();
640 Test_RtlFindNextForwardRunClear();
641 Test_RtlFindFirstRunClear();
642 Test_RtlFindLastBackwardRunClear();
643 Test_RtlFindClearRuns();
644 Test_RtlFindLongestRunClear();
645 }
646