Main Page | Class Hierarchy | Class List | File List | Class Members | File Members

tex.c

Go to the documentation of this file.
00001 /*++ 00002 00003 Copyright (c) 1989 Microsoft Corporation 00004 00005 Module Name: 00006 00007 tex.c 00008 00009 Abstract: 00010 00011 Test program for the EX subcomponent of the NTOS project 00012 00013 Author: 00014 00015 Steve Wood (stevewo) 31-Mar-1989 00016 00017 Revision History: 00018 00019 --*/ 00020 00021 #include "exp.h" 00022 //#include "zwapi.h" 00023 #include <version.h> 00024 #include <string.h> 00025 00026 #define DumpPool(x, y) 00027 00028 BOOLEAN 00029 ExTest ( 00030 VOID 00031 ); 00032 00033 PTESTFCN TestFunction = ExTest; 00034 00035 #ifndef MIPS 00036 00037 USHORT TestEvent = 0; 00038 USHORT TestHandle = 0; 00039 USHORT TestInfo = 0; 00040 USHORT TestLuid = 0; 00041 USHORT TestMemory = 0; 00042 USHORT TestParty = 0; 00043 USHORT TestPool = 0; 00044 USHORT TestResource = 0; 00045 USHORT TestBitMap = 0; 00046 USHORT TestSemaphore = 0; 00047 USHORT TestTimer = 0; 00048 USHORT TestZone = 0; 00049 USHORT TestMutant = 0; 00050 USHORT TestException = 0; 00051 00052 #else 00053 00054 USHORT TestEvent = 1; 00055 USHORT TestHandle = 0; 00056 USHORT TestInfo = 0; 00057 USHORT TestLuid = 0; 00058 USHORT TestMemory = 0; 00059 USHORT TestParty = 0; 00060 USHORT TestPool = 0; 00061 USHORT TestResource = 0; 00062 USHORT TestBitMap = 0; 00063 USHORT TestSemaphore = 2; 00064 USHORT TestTimer = 3; 00065 USHORT TestZone = 0; 00066 USHORT TestMutant = 4; 00067 USHORT TestException = 0; 00068 00069 #endif // MIPS 00070 00071 BOOLEAN 00072 DoEventTest( 00073 ) 00074 { 00075 ULONG DesiredAccess = EVENT_ALL_ACCESS; 00076 EVENT_BASIC_INFORMATION EventInformation; 00077 HANDLE Handle1; 00078 HANDLE Handle1c; 00079 HANDLE Handle2; 00080 HANDLE Handle2c; 00081 ULONG Length; 00082 UNICODE_STRING Name1; 00083 UNICODE_STRING Name2; 00084 OBJECT_ATTRIBUTES Object1Attributes; 00085 OBJECT_ATTRIBUTES Object2Attributes; 00086 LONG State; 00087 NTSTATUS Status; 00088 00089 // 00090 // Announce start of event test. 00091 // 00092 00093 DbgPrint(" ** Start of Event Test **\n"); 00094 00095 // 00096 // Initialize strings and fill in object attributes structures. 00097 // 00098 00099 RtlInitUnicodeString(&Name1, L "\\Event1"); 00100 RtlInitUnicodeString(&Name2, L "\\Event2"); 00101 InitializeObjectAttributes(&Object1Attributes, &Name1, 0, NULL, NULL); 00102 InitializeObjectAttributes(&Object2Attributes, &Name2, 0, NULL, NULL); 00103 00104 // 00105 // Create event 1. 00106 // 00107 00108 Status = ZwCreateEvent(&Handle1c, DesiredAccess, &Object1Attributes, 00109 NotificationEvent, TRUE); 00110 if (Status < 0) { 00111 DbgPrint(" Event test - create event 1 failed, status = %lx\n", Status); 00112 } 00113 00114 // 00115 // Open event 1. 00116 // 00117 00118 Status = ZwOpenEvent(&Handle1, DesiredAccess, &Object1Attributes); 00119 if (Status < 0) { 00120 DbgPrint(" Event test - open event 1 failed, status = %lx\n", Status); 00121 } 00122 00123 // 00124 // Query event 1. 00125 // 00126 00127 EventInformation.EventState = 0; 00128 Length = 0; 00129 Status = ZwQueryEvent(Handle1, EventBasicInformation, 00130 (PVOID)&EventInformation, sizeof(EVENT_BASIC_INFORMATION), 00131 &Length); 00132 if (Status < 0) { 00133 DbgPrint(" Event test - query event 1 failed, status = %lx\n", Status); 00134 } 00135 if (EventInformation.EventType != NotificationEvent) { 00136 DbgPrint(" Event test - query event 1 wrong event type\n"); 00137 } 00138 if (EventInformation.EventState == 0) { 00139 DbgPrint(" Event test - query event 1 current state wrong\n"); 00140 } 00141 if (Length != sizeof(EVENT_BASIC_INFORMATION)) { 00142 DbgPrint(" Event test - query event 1 return length wrong\n"); 00143 } 00144 00145 // 00146 // Pulse event 1. 00147 // 00148 00149 State = 0; 00150 Status = ZwPulseEvent(Handle1, &State); 00151 if (Status < 0) { 00152 DbgPrint(" Event test - pulse event 1 failed, status = %lx\n", Status); 00153 } 00154 if (State == 0) { 00155 DbgPrint(" Event test - pulse event 1 previous state wrong\n"); 00156 } 00157 00158 // 00159 // Set event 1. 00160 // 00161 00162 State = 1; 00163 Status = ZwSetEvent(Handle1, &State); 00164 if (Status < 0) { 00165 DbgPrint(" Event test - set event 1 failed, status = %lx\n", Status); 00166 } 00167 if (State == 1) { 00168 DbgPrint(" Event test - set event 1 previous state wrong\n"); 00169 } 00170 00171 // 00172 // Wait on event 1. 00173 // 00174 00175 Status = ZwWaitForSingleObject(Handle1, FALSE, NULL); 00176 if (Status < 0) { 00177 DbgPrint(" Event test - wait event 1 failed\n"); 00178 } 00179 00180 // 00181 // Reset event 1. 00182 // 00183 00184 State = 0; 00185 Status = ZwResetEvent(Handle1, &State); 00186 if (Status < 0) { 00187 DbgPrint(" Event test - reset event 1 failed, status = %lx\n", Status); 00188 } 00189 if (State == 0) { 00190 DbgPrint(" Event test - reset event 1 previous state wrong\n"); 00191 } 00192 00193 // 00194 // Create event 2. 00195 // 00196 00197 Status = ZwCreateEvent(&Handle2c, DesiredAccess, &Object2Attributes, 00198 NotificationEvent, FALSE); 00199 if (Status < 0) { 00200 DbgPrint(" Event test - create event 2 failed, status = %lx\n", Status); 00201 } 00202 00203 // 00204 // Open event 2. 00205 // 00206 00207 Status = ZwOpenEvent(&Handle2, DesiredAccess, &Object2Attributes); 00208 if (Status < 0) { 00209 DbgPrint(" Event test - open event 2 failed, status = %lx\n", Status); 00210 } 00211 00212 // 00213 // Query event 2. 00214 // 00215 00216 EventInformation.EventState = 1; 00217 Length = 0; 00218 Status = ZwQueryEvent(Handle2, EventBasicInformation, 00219 (PVOID)&EventInformation, sizeof(EVENT_BASIC_INFORMATION), 00220 &Length); 00221 if (Status < 0) { 00222 DbgPrint(" Event test - query event 2 failed, status = %lx\n", Status); 00223 } 00224 if (EventInformation.EventType != NotificationEvent) { 00225 DbgPrint(" Event test - query event 2 wrong event type\n"); 00226 } 00227 if (EventInformation.EventState == 1) { 00228 DbgPrint(" Event test - query event 2 current state wrong\n"); 00229 } 00230 if (Length != sizeof(EVENT_BASIC_INFORMATION)) { 00231 DbgPrint(" Event test - query event 2 return length wrong\n"); 00232 } 00233 00234 // 00235 // Pulse event 2. 00236 // 00237 00238 State = 1; 00239 Status = ZwPulseEvent(Handle2, &State); 00240 if (Status < 0) { 00241 DbgPrint(" Event test - pulse event 2 failed, status = %lx\n", Status); 00242 } 00243 if (State == 1) { 00244 DbgPrint(" Event test - pulse event 2 previous state wrong\n"); 00245 } 00246 00247 // 00248 // Set event 2. 00249 // 00250 00251 State = 1; 00252 Status = ZwSetEvent(Handle2, &State); 00253 if (Status < 0) { 00254 DbgPrint(" Event test - set event 2 failed, status = %lx\n", Status); 00255 } 00256 if (State == 1) { 00257 DbgPrint(" Event test - set event 2 previous state wrong\n"); 00258 } 00259 00260 // 00261 // Wait on event 2. 00262 // 00263 00264 Status = ZwWaitForSingleObject(Handle2, FALSE, NULL); 00265 if (Status < 0) { 00266 DbgPrint(" Event test - wait event 2 failed\n"); 00267 } 00268 00269 // 00270 // Reset event 2. 00271 // 00272 00273 State = 0; 00274 Status = ZwResetEvent(Handle2, &State); 00275 if (Status < 0) { 00276 DbgPrint(" Event test - reset event 2 failed, status = %lx\n", Status); 00277 } 00278 if (State == 0) { 00279 DbgPrint(" Event test - reset event 2 previous state wrong\n"); 00280 } 00281 00282 // 00283 // Close all handles. 00284 // 00285 00286 Status = NtClose(Handle1); 00287 if (Status < 0) { 00288 DbgPrint(" Event test - event 1 close failed, status = %lx\n", Status); 00289 } 00290 Status = NtClose(Handle1c); 00291 if (Status < 0) { 00292 DbgPrint(" Event test - event 1c close failed, status = %lx\n", Status); 00293 } 00294 Status = NtClose(Handle2); 00295 if (Status < 0) { 00296 DbgPrint(" Event test - event 2 close failed, status = %lx\n", Status); 00297 } 00298 Status = NtClose(Handle2c); 00299 if (Status < 0) { 00300 DbgPrint(" Event test - event 2c close failed, status = %lx\n", Status); 00301 } 00302 00303 // 00304 // Announce end of event test. 00305 // 00306 00307 DbgPrint(" ** End of Event Test **\n"); 00308 return TRUE; 00309 } 00310 00311 BOOLEAN 00312 DoExceptionTest( 00313 ) 00314 00315 { 00316 #ifndef i386 00317 NTSTATUS Status; 00318 00319 // 00320 // Announce start of system service exception test. 00321 // 00322 00323 DbgPrint(" ** Start of System Service Exception Test **\n"); 00324 00325 // 00326 // Eventually this should have a test case for each system service that 00327 // has input of output arguments which are addressed by pointers. The 00328 // intent of this test is to make sure that each service correctly 00329 // handles access violations. 00330 // 00331 00332 // 00333 // Query system time test. 00334 // 00335 00336 Status = ZwQuerySystemTime((PLARGE_INTEGER)NULL); 00337 if (Status != STATUS_ACCESS_VIOLATION) { 00338 DbgPrint(" Exception test - NtQuerySystemTime failed, status = %lx\n", Status); 00339 } 00340 00341 // 00342 // Set system time test. 00343 // 00344 00345 Status = ZwSetSystemTime((PLARGE_INTEGER)NULL, (PLARGE_INTEGER)NULL); 00346 if (Status != STATUS_ACCESS_VIOLATION) { 00347 DbgPrint(" Exception test - NtSetSystemTime failed, status = %lx\n", Status); 00348 } 00349 00350 // 00351 // Announce end of system service exception test. 00352 // 00353 00354 DbgPrint(" ** End of System Service Exception Test **\n"); 00355 #else 00356 DbgPrint(" ** Skip System Service Exception Test for 386 **\n"); 00357 #endif // i386 00358 return TRUE; 00359 } 00360 00361 BOOLEAN 00362 DoMutantTest( 00363 ) 00364 { 00365 00366 LONG Count; 00367 ULONG DesiredAccess = MUTANT_ALL_ACCESS; 00368 HANDLE Handle1; 00369 HANDLE Handle1c; 00370 HANDLE Handle2; 00371 HANDLE Handle2c; 00372 ULONG Length; 00373 STRING Name1; 00374 STRING Name2; 00375 OBJECT_ATTRIBUTES Object1Attributes; 00376 OBJECT_ATTRIBUTES Object2Attributes; 00377 MUTANT_BASIC_INFORMATION MutantInformation; 00378 NTSTATUS Status; 00379 00380 // 00381 // Announce start of mutant test. 00382 // 00383 00384 DbgPrint(" ** Start of Mutant Test **\n"); 00385 00386 // 00387 // Initialize strings and fill in object attributes structures. 00388 // 00389 00390 RtlInitUnicodeString(&Name1, L"\\Mutant1"); 00391 RtlInitUnicodeString(&Name2, L"\\Mutant2"); 00392 InitializeObjectAttributes(&Object1Attributes,&Name1,0,NULL,NULL); 00393 InitializeObjectAttributes(&Object2Attributes,&Name2,0,NULL,NULL); 00394 00395 // 00396 // Create mutant 1. 00397 // 00398 00399 Status = ZwCreateMutant(&Handle1c, DesiredAccess, &Object1Attributes, 00400 FALSE); 00401 if (Status < 0) { 00402 DbgPrint(" Mutant test - create mutant 1 failed, status = %lx\n", 00403 Status); 00404 } 00405 00406 // 00407 // Open mutant 1. 00408 // 00409 00410 Status = ZwOpenMutant(&Handle1, DesiredAccess, &Object1Attributes); 00411 if (Status < 0) { 00412 DbgPrint(" Mutant test - open mutant 1 failed, status = %lx\n", 00413 Status); 00414 } 00415 00416 // 00417 // Query mutant 1. 00418 // 00419 00420 MutantInformation.CurrentCount = 10; 00421 MutantInformation.AbandonedState = TRUE; 00422 Length = 0; 00423 Status = ZwQueryMutant(Handle1, MutantBasicInformation, 00424 (PVOID)&MutantInformation, 00425 sizeof(MUTANT_BASIC_INFORMATION), &Length); 00426 if (Status < 0) { 00427 DbgPrint(" Mutant test - query mutant 1 failed, status = %lx\n", 00428 Status); 00429 } 00430 if (MutantInformation.CurrentCount != 1) { 00431 DbgPrint(" Mutant test - query mutant 1 current count wrong\n"); 00432 } 00433 if (MutantInformation.AbandonedState != FALSE) { 00434 DbgPrint(" Mutant test - query mutant 1 abandoned state wrong\n"); 00435 } 00436 if (Length != sizeof(MUTANT_BASIC_INFORMATION)) { 00437 DbgPrint(" Mutant test - query mutant 1 return length wrong\n"); 00438 } 00439 00440 // 00441 // Acquire mutant 1. 00442 // 00443 00444 Status = ZwWaitForSingleObject(Handle1, FALSE, NULL); 00445 if (Status < 0) { 00446 DbgPrint(" Mutant test - wait mutant 1 failed, status = %lx\n", 00447 Status); 00448 } 00449 00450 // 00451 // Release mutant 1. 00452 // 00453 00454 Count = 100; 00455 Status = ZwReleaseMutant(Handle1, &Count); 00456 if (Status < 0) { 00457 DbgPrint(" Mutant test - release mutant 1 failed, status = %lx\n", 00458 Status); 00459 } 00460 if (Count != 0) { 00461 DbgPrint(" Mutant test - release mutant 1 previous count wrong\n"); 00462 } 00463 00464 // 00465 // Create mutant 2. 00466 // 00467 00468 Status = ZwCreateMutant(&Handle2c, DesiredAccess, &Object2Attributes, 00469 FALSE); 00470 if (Status < 0) { 00471 DbgPrint(" Mutant test - create mutant 2 failed, status = %lx\n", 00472 Status); 00473 } 00474 00475 // 00476 // Open mutant 2. 00477 // 00478 00479 Status = ZwOpenMutant(&Handle2, DesiredAccess, &Object2Attributes); 00480 if (Status < 0) { 00481 DbgPrint(" Mutant test - open mutant 2 failed, status = %lx\n", 00482 Status); 00483 } 00484 00485 // 00486 // Acquire mutant 2. 00487 // 00488 00489 Status = ZwWaitForSingleObject(Handle2, FALSE, NULL); 00490 if (Status < 0) { 00491 DbgPrint(" Mutant test - wait mutant 2 failed, status = %lx\n", 00492 Status); 00493 } 00494 00495 // 00496 // Query mutant 2. 00497 // 00498 00499 MutantInformation.CurrentCount = 20; 00500 MutantInformation.AbandonedState = TRUE; 00501 Length = 0; 00502 Status = ZwQueryMutant(Handle2, MutantBasicInformation, 00503 (PVOID)&MutantInformation, 00504 sizeof(MUTANT_BASIC_INFORMATION), &Length); 00505 if (Status < 0) { 00506 DbgPrint(" Mutant test - query mutant 2 failed, status = %lx\n", 00507 Status); 00508 } 00509 if (MutantInformation.CurrentCount != 0) { 00510 DbgPrint(" Mutant test - query mutant 2 current count wrong\n"); 00511 } 00512 if (MutantInformation.AbandonedState != FALSE) { 00513 DbgPrint(" Mutant test - query mutant 2 abandoned state wrong\n"); 00514 } 00515 if (Length != sizeof(MUTANT_BASIC_INFORMATION)) { 00516 DbgPrint(" Mutant test - query mutant 2 return length wrong\n"); 00517 } 00518 00519 // 00520 // Acquire mutant 2. 00521 // 00522 00523 Status = ZwWaitForSingleObject(Handle2, FALSE, NULL); 00524 if (Status < 0) { 00525 DbgPrint(" Mutant test - wait mutant 2 failed, status = %lx\n", 00526 Status); 00527 } 00528 00529 // 00530 // Release mutant 2. 00531 // 00532 00533 Count = 100; 00534 Status = ZwReleaseMutant(Handle2, &Count); 00535 if (Status < 0) { 00536 DbgPrint(" Mutant test - release mutant 2 failed, status = %lx\n", 00537 Status); 00538 } 00539 if (Count != - 1) { 00540 DbgPrint(" Mutant test - release mutant 2 previous count wrong\n"); 00541 } 00542 00543 // 00544 // Release mutant 2. 00545 // 00546 00547 Count = 100; 00548 Status = ZwReleaseMutant(Handle2, &Count); 00549 if (Status < 0) { 00550 DbgPrint(" Mutant test - release mutant 2 failed, status = %lx\n", 00551 Status); 00552 } 00553 if (Count != 0) { 00554 DbgPrint(" Mutant test - release mutant 2 previous count wrong\n"); 00555 } 00556 00557 // 00558 // Close all handles. 00559 // 00560 00561 Status = NtClose(Handle1); 00562 if (Status < 0) { 00563 DbgPrint(" Mutant test - mutant 1 close failed, status = %lx\n", 00564 Status); 00565 } 00566 Status = NtClose(Handle1c); 00567 if (Status < 0) { 00568 DbgPrint(" Mutant test - mutant 1c close failed, status = %lx\n", 00569 Status); 00570 } 00571 Status = NtClose(Handle2); 00572 if (Status < 0) { 00573 DbgPrint(" Mutant test - mutant 2 close failed, status = %lx\n", 00574 Status); 00575 } 00576 Status = NtClose(Handle2c); 00577 if (Status < 0) { 00578 DbgPrint(" Mutant test - mutant 2c close failed, status = %lx\n", 00579 Status); 00580 } 00581 00582 // 00583 // Announce end of mutant test. 00584 // 00585 00586 DbgPrint(" ** End of Mutant Test **\n"); 00587 return TRUE; 00588 } 00589 00590 BOOLEAN 00591 DoSemaphoreTest( 00592 ) 00593 { 00594 00595 LONG Count; 00596 ULONG DesiredAccess = SEMAPHORE_ALL_ACCESS; 00597 HANDLE Handle1; 00598 HANDLE Handle1c; 00599 HANDLE Handle2; 00600 HANDLE Handle2c; 00601 ULONG Length; 00602 STRING Name1; 00603 STRING Name2; 00604 OBJECT_ATTRIBUTES Object1Attributes; 00605 OBJECT_ATTRIBUTES Object2Attributes; 00606 SEMAPHORE_BASIC_INFORMATION SemaphoreInformation; 00607 NTSTATUS Status; 00608 00609 // 00610 // Announce start of semaphore test. 00611 // 00612 00613 DbgPrint(" ** Start of Semaphore Test **\n"); 00614 00615 // 00616 // Initialize strings and fill in object attributes structures. 00617 // 00618 00619 RtlInitUnicodeString(&Name1, L"\\Semaphore1"); 00620 RtlInitUnicodeString(&Name2, L"\\Semaphore2"); 00621 InitializeObjectAttributes(&Object1Attributes,&Name1,0,NULL,NULL); 00622 InitializeObjectAttributes(&Object2Attributes,&Name2,0,NULL,NULL); 00623 00624 // 00625 // Create semaphore 1. 00626 // 00627 00628 Status = ZwCreateSemaphore(&Handle1c, DesiredAccess, &Object1Attributes, 00629 0, 10); 00630 if (Status < 0) { 00631 DbgPrint(" Semaphore test - create semaphore 1 failed, status = %lx\n", 00632 Status); 00633 } 00634 00635 // 00636 // Open semaphore 1. 00637 // 00638 00639 Status = ZwOpenSemaphore(&Handle1, DesiredAccess, &Object1Attributes); 00640 if (Status < 0) { 00641 DbgPrint(" Semaphore test - open semaphore 1 failed, status = %lx\n", 00642 Status); 00643 } 00644 00645 // 00646 // Query semaphore 1. 00647 // 00648 00649 SemaphoreInformation.CurrentCount = 10; 00650 SemaphoreInformation.MaximumCount = 0; 00651 Length = 0; 00652 Status = ZwQuerySemaphore(Handle1, SemaphoreBasicInformation, 00653 (PVOID)&SemaphoreInformation, 00654 sizeof(SEMAPHORE_BASIC_INFORMATION), &Length); 00655 if (Status < 0) { 00656 DbgPrint(" Semaphore test - query semaphore 1 failed, status = %lx\n", 00657 Status); 00658 } 00659 if (SemaphoreInformation.CurrentCount != 0) { 00660 DbgPrint(" Semaphore test - query semaphore 1 current count wrong\n"); 00661 } 00662 if (SemaphoreInformation.MaximumCount != 10) { 00663 DbgPrint(" Semaphore test - query semaphore 1 maximum count wrong\n"); 00664 } 00665 if (Length != sizeof(SEMAPHORE_BASIC_INFORMATION)) { 00666 DbgPrint(" Semaphore test - query semaphore 1 return length wrong\n"); 00667 } 00668 00669 // 00670 // Release semaphore 1. 00671 // 00672 00673 Count = 100; 00674 Status = ZwReleaseSemaphore(Handle1, 2, &Count); 00675 if (Status < 0) { 00676 DbgPrint(" Semaphore test - release semaphore 1 failed, status = %lx\n", 00677 Status); 00678 } 00679 if (Count != 0) { 00680 DbgPrint(" Semaphore test - release semaphore 1 previous count wrong\n"); 00681 } 00682 00683 // 00684 // Release semaphore 1. 00685 // 00686 00687 Count = 100; 00688 Status = ZwReleaseSemaphore(Handle1, 5, &Count); 00689 if (Status < 0) { 00690 DbgPrint(" Semaphore test - release semaphore 1 failed, status = %lx\n", 00691 Status); 00692 } 00693 if (Count != 2) { 00694 DbgPrint(" Semaphore test - release semaphore 1 previous count wrong\n"); 00695 } 00696 00697 // 00698 // Create semaphore 2. 00699 // 00700 00701 Status = ZwCreateSemaphore(&Handle2c, DesiredAccess, &Object2Attributes, 00702 5, 20); 00703 if (Status < 0) { 00704 DbgPrint(" Semaphore test - create semaphore 2 failed, status = %lx\n", 00705 Status); 00706 } 00707 00708 // 00709 // Open semaphore 2. 00710 // 00711 00712 Status = ZwOpenSemaphore(&Handle2, DesiredAccess, &Object2Attributes); 00713 if (Status < 0) { 00714 DbgPrint(" Semaphore test - open semaphore 2 failed, status = %lx\n", 00715 Status); 00716 } 00717 00718 // 00719 // Query semaphore 2. 00720 // 00721 00722 SemaphoreInformation.CurrentCount = 20; 00723 SemaphoreInformation.MaximumCount = 5; 00724 Length = 0; 00725 Status = ZwQuerySemaphore(Handle2, SemaphoreBasicInformation, 00726 (PVOID)&SemaphoreInformation, 00727 sizeof(SEMAPHORE_BASIC_INFORMATION), &Length); 00728 if (Status < 0) { 00729 DbgPrint(" Semaphore test - query semaphore 2 failed, status = %lx\n", 00730 Status); 00731 } 00732 if (SemaphoreInformation.CurrentCount != 5) { 00733 DbgPrint(" Semaphore test - query semaphore 2 current count wrong\n"); 00734 } 00735 if (SemaphoreInformation.MaximumCount != 20) { 00736 DbgPrint(" Semaphore test - query semaphore 2 maximum count wrong\n"); 00737 } 00738 if (Length != sizeof(SEMAPHORE_BASIC_INFORMATION)) { 00739 DbgPrint(" Semaphore test - query semaphore 2 return length wrong\n"); 00740 } 00741 00742 // 00743 // Release semaphore 2. 00744 // 00745 00746 Count = 100; 00747 Status = ZwReleaseSemaphore(Handle2, 3, &Count); 00748 if (Status < 0) { 00749 DbgPrint(" Semaphore test - release semaphore 2 failed, status = %lx\n", 00750 Status); 00751 } 00752 if (Count != 5) { 00753 DbgPrint(" Semaphore test - release semaphore 2 previous count wrong\n"); 00754 } 00755 00756 // 00757 // Release semaphore 2. 00758 // 00759 00760 Count = 100; 00761 Status = ZwReleaseSemaphore(Handle2, 5, &Count); 00762 if (Status < 0) { 00763 DbgPrint(" Semaphore test - release semaphore 2 failed, status = %lx\n", 00764 Status); 00765 } 00766 if (Count != 8) { 00767 DbgPrint(" Semaphore test - release semaphore 2 previous count wrong\n"); 00768 } 00769 00770 // 00771 // Close all handles. 00772 // 00773 00774 Status = NtClose(Handle1); 00775 if (Status < 0) { 00776 DbgPrint(" Semaphore test - semaphore 1 close failed, status = %lx\n", 00777 Status); 00778 } 00779 Status = NtClose(Handle1c); 00780 if (Status < 0) { 00781 DbgPrint(" Semaphore test - semaphore 1c close failed, status = %lx\n", 00782 Status); 00783 } 00784 Status = NtClose(Handle2); 00785 if (Status < 0) { 00786 DbgPrint(" Semaphore test - semaphore 2 close failed, status = %lx\n", 00787 Status); 00788 } 00789 Status = NtClose(Handle2c); 00790 if (Status < 0) { 00791 DbgPrint(" Semaphore test - semaphore 2c close failed, status = %lx\n", 00792 Status); 00793 } 00794 00795 // 00796 // Announce end of semaphore test. 00797 // 00798 00799 DbgPrint(" ** End of Semaphore Test **\n"); 00800 return TRUE; 00801 } 00802 00803 VOID 00804 TimerApcRoutine ( 00805 IN PVOID TimerContext, 00806 IN ULONG TimerLowValue, 00807 IN LONG TimerHighValue 00808 ) 00809 00810 { 00811 00812 *((PBOOLEAN)TimerContext) = TRUE; 00813 return; 00814 } 00815 00816 BOOLEAN 00817 DoTimerTest ( 00818 ) 00819 00820 { 00821 00822 BOOLEAN ApcHappened; 00823 BOOLEAN CurrentState; 00824 ULONG DesiredAccess = TIMER_ALL_ACCESS; 00825 LARGE_INTEGER DueTime; 00826 HANDLE Handle1; 00827 HANDLE Handle1c; 00828 HANDLE Handle2; 00829 HANDLE Handle2c; 00830 ULONG Length; 00831 STRING Name1; 00832 STRING Name2; 00833 OBJECT_ATTRIBUTES Object1Attributes; 00834 OBJECT_ATTRIBUTES Object2Attributes; 00835 BOOLEAN PreviousState; 00836 TIMER_BASIC_INFORMATION TimerInformation; 00837 NTSTATUS Status; 00838 00839 // 00840 // Announce start of timer test. 00841 // 00842 00843 DbgPrint(" ** Start of Timer Test **\n"); 00844 00845 // 00846 // Initialize strings and fill in object attributes structures. 00847 // 00848 00849 RtlInitUnicodeString(&Name1, L"\\Timer1"); 00850 RtlInitUnicodeString(&Name2, L"\\Timer2"); 00851 InitializeObjectAttributes(&Object1Attributes,&Name1,0,NULL,NULL); 00852 InitializeObjectAttributes(&Object2Attributes,&Name2,0,NULL,NULL); 00853 00854 // 00855 // Create timer 1. 00856 // 00857 00858 Status = ZwCreateTimer(&Handle1c, DesiredAccess, &Object1Attributes); 00859 if (!NT_SUCCESS(Status)) { 00860 DbgPrint(" Timer test - create timer 1 failed, status = %lx\n", 00861 Status); 00862 } 00863 00864 // 00865 // Open timer 1. 00866 // 00867 00868 Status = ZwOpenTimer(&Handle1, DesiredAccess, &Object1Attributes); 00869 if (Status < 0) { 00870 DbgPrint(" Timer test - open timer 1 failed, status = %lx\n", 00871 Status); 00872 } 00873 00874 // 00875 // Query timer 1. 00876 // 00877 00878 TimerInformation.TimerState = TRUE; 00879 Length = 0; 00880 Status = ZwQueryTimer(Handle1, TimerBasicInformation, 00881 (PVOID)&TimerInformation, 00882 sizeof(TIMER_BASIC_INFORMATION), &Length); 00883 if (Status < 0) { 00884 DbgPrint(" Timer test - query timer 1 failed, status = %lx\n", 00885 Status); 00886 } 00887 if (TimerInformation.TimerState) { 00888 DbgPrint(" Timer test - query timer 1 state wrong\n"); 00889 } 00890 if (Length != sizeof(TIMER_BASIC_INFORMATION)) { 00891 DbgPrint(" Timer test - query timer 1 return length wrong\n"); 00892 } 00893 00894 // 00895 // Set timer 1 and then cancel timer 1. 00896 // 00897 00898 DueTime.LowPart = -100000; 00899 DueTime.HighPart = -1; 00900 PreviousState = TRUE; 00901 Status = ZwSetTimer(Handle1, &DueTime, NULL, NULL, &PreviousState); 00902 if (!NT_SUCCESS(Status)) { 00903 DbgPrint(" Timer test - set timer 1 failed, status = %lx\n", 00904 Status); 00905 } 00906 if (PreviousState) { 00907 DbgPrint(" Timer test - set timer 1 previous state wrong\n"); 00908 } 00909 CurrentState = TRUE; 00910 Status = ZwCancelTimer(Handle1, &CurrentState); 00911 if (!NT_SUCCESS(Status)) { 00912 DbgPrint(" Timer test - cancel timer 1 failed, status = %lx\n", 00913 Status); 00914 } 00915 if (CurrentState) { 00916 DbgPrint(" Timer test - cancel timer 1 current state wrong\n"); 00917 } 00918 00919 // 00920 // Set timer 1, wait for timer to expire, and then cancel timer 1. 00921 // 00922 00923 DueTime.LowPart = -5; 00924 DueTime.HighPart = -1; 00925 PreviousState = TRUE; 00926 Status = ZwSetTimer(Handle1, &DueTime, NULL, NULL, &PreviousState); 00927 if (!NT_SUCCESS(Status)) { 00928 DbgPrint(" Timer test - set timer 1 failed, status = %lx\n", 00929 Status); 00930 } 00931 if (PreviousState) { 00932 DbgPrint(" Timer test - set timer 1 previous state wrong\n"); 00933 } 00934 Status = ZwWaitForSingleObject(Handle1, FALSE, NULL); 00935 if (!NT_SUCCESS(Status)) { 00936 DbgPrint(" Timer test - wait timer 1 failed, status = %lx\n", 00937 Status); 00938 } 00939 CurrentState = FALSE; 00940 Status = ZwCancelTimer(Handle1, &CurrentState); 00941 if (!NT_SUCCESS(Status)) { 00942 DbgPrint(" Timer test - cancel timer 1 failed, status = %lx\n", 00943 Status); 00944 } 00945 if (!CurrentState) { 00946 DbgPrint(" Timer test - cancel timer 1 current state wrong\n"); 00947 } 00948 00949 // 00950 // Set timer 1 with APC, then cancel timer 1. 00951 // 00952 00953 ApcHappened = FALSE; 00954 DueTime.LowPart = -100000; 00955 DueTime.HighPart = -1; 00956 PreviousState = FALSE; 00957 Status = ZwSetTimer(Handle1, &DueTime, TimerApcRoutine, &ApcHappened, 00958 &PreviousState); 00959 if (!NT_SUCCESS(Status)) { 00960 DbgPrint(" Timer test - set timer 1 failed, status = %lx\n", 00961 Status); 00962 } 00963 if (!PreviousState) { 00964 DbgPrint(" Timer test - set timer 1 previous state wrong\n"); 00965 } 00966 CurrentState = TRUE; 00967 Status = ZwCancelTimer(Handle1, &CurrentState); 00968 if (!NT_SUCCESS(Status)) { 00969 DbgPrint(" Timer test - cancel timer 1 failed, status = %lx\n", 00970 Status); 00971 } 00972 if (CurrentState) { 00973 DbgPrint(" Timer test - cancel timer 1 current state wrong\n"); 00974 } 00975 if (ApcHappened) { 00976 DbgPrint(" Timer test - cancel timer 1 APC happened state wrong\n"); 00977 } 00978 00979 // 00980 // Set timer 1 with APC, set timer again with APC, wait for timer, then 00981 // cancel timer 1. 00982 // 00983 00984 ApcHappened = FALSE; 00985 DueTime.LowPart = -100000; 00986 DueTime.HighPart = -1; 00987 PreviousState = TRUE; 00988 Status = ZwSetTimer(Handle1, &DueTime, TimerApcRoutine, &ApcHappened, 00989 &PreviousState); 00990 if (!NT_SUCCESS(Status)) { 00991 DbgPrint(" Timer test - set timer 1 failed, status = %lx\n", 00992 Status); 00993 } 00994 if (PreviousState) { 00995 DbgPrint(" Timer test - set timer 1 previous state wrong\n"); 00996 } 00997 DueTime.LowPart = -5; 00998 DueTime.HighPart = -1; 00999 PreviousState = TRUE; 01000 Status = ZwSetTimer(Handle1, &DueTime, TimerApcRoutine, &ApcHappened, 01001 &PreviousState); 01002 if (!NT_SUCCESS(Status)) { 01003 DbgPrint(" Timer test - set timer 1 failed, status = %lx\n", 01004 Status); 01005 } 01006 if (PreviousState) { 01007 DbgPrint(" Timer test - set timer 1 previous state wrong\n"); 01008 } 01009 Status = ZwWaitForSingleObject(Handle1, FALSE, NULL); 01010 if (!NT_SUCCESS(Status)) { 01011 DbgPrint(" Timer test - wait timer 1 failed, status = %lx\n", 01012 Status); 01013 } 01014 CurrentState = FALSE; 01015 Status = ZwCancelTimer(Handle1, &CurrentState); 01016 if (!NT_SUCCESS(Status)) { 01017 DbgPrint(" Timer test - cancel timer 1 failed, status = %lx\n", 01018 Status); 01019 } 01020 if (!CurrentState) { 01021 DbgPrint(" Timer test - cancel timer 1 current state wrong\n"); 01022 } 01023 if (!ApcHappened) { 01024 DbgPrint(" Timer test - cancel timer 1 APC happened state wrong\n"); 01025 } 01026 01027 // 01028 // Create timer 2. 01029 // 01030 01031 Status = ZwCreateTimer(&Handle2c, DesiredAccess, &Object2Attributes); 01032 if (Status < 0) { 01033 DbgPrint(" Timer test - create timer 2 failed, status = %lx\n", 01034 Status); 01035 } 01036 01037 // 01038 // Open timer 2. 01039 // 01040 01041 Status = ZwOpenTimer(&Handle2, DesiredAccess, &Object2Attributes); 01042 if (Status < 0) { 01043 DbgPrint(" Timer test - open timer 2 failed, status = %lx\n", 01044 Status); 01045 } 01046 01047 // 01048 // Query timer 2. 01049 // 01050 01051 TimerInformation.TimerState = TRUE; 01052 Length = 0; 01053 Status = ZwQueryTimer(Handle2, TimerBasicInformation, 01054 (PVOID)&TimerInformation, 01055 sizeof(TIMER_BASIC_INFORMATION), &Length); 01056 if (Status < 0) { 01057 DbgPrint(" Timer test - query timer 2 failed, status = %lx\n", 01058 Status); 01059 } 01060 if (TimerInformation.TimerState) { 01061 DbgPrint(" Timer test - query timer 2 state wrong\n"); 01062 } 01063 if (Length != sizeof(TIMER_BASIC_INFORMATION)) { 01064 DbgPrint(" Timer test - query timer 2 return length wrong\n"); 01065 } 01066 01067 // 01068 // Close all handles. 01069 // 01070 01071 Status = NtClose(Handle1); 01072 if (Status < 0) { 01073 DbgPrint(" Timer test - timer 1 close failed, status = %lx\n", 01074 Status); 01075 } 01076 Status = NtClose(Handle1c); 01077 if (Status < 0) { 01078 DbgPrint(" Timer test - timer 1c close failed, status = %lx\n", 01079 Status); 01080 } 01081 Status = NtClose(Handle2); 01082 if (Status < 0) { 01083 DbgPrint(" Timer test - timer 2 close failed, status = %lx\n", 01084 Status); 01085 } 01086 Status = NtClose(Handle2c); 01087 if (Status < 0) { 01088 DbgPrint(" Timer test - timer 2c close failed, status = %lx\n", 01089 Status); 01090 } 01091 01092 // 01093 // Announce end of timer test. 01094 // 01095 01096 DbgPrint(" ** End of Timer Test **\n"); 01097 return TRUE; 01098 } 01099 01100 BOOLEAN 01101 TestDupHandle1( 01102 IN PVOID HandleTableEntry 01103 ) 01104 { 01105 DbgPrint( "Dupping %lx\n", HandleTableEntry ); 01106 return( TRUE ); 01107 } 01108 01109 BOOLEAN 01110 TestDupHandle4( 01111 IN PVOID HandleTableEntry 01112 ) 01113 { 01114 PULONG p = (PULONG)HandleTableEntry; 01115 ULONG i; 01116 01117 if (!((*p>>4) % 4)) { 01118 return( FALSE ); 01119 } 01120 01121 DbgPrint( "Dupping " ); 01122 for (i=0; i<4; i++) { 01123 DbgPrint( " %lx", *p++ ); 01124 } 01125 DbgPrint( "\n" ); 01126 return( TRUE ); 01127 } 01128 01129 BOOLEAN 01130 TestEnumHandle1( 01131 IN PVOID HandleTableEntry, 01132 IN PVOID EnumParameter 01133 ) 01134 { 01135 if (EnumParameter == HandleTableEntry) { 01136 return( TRUE ); 01137 } 01138 else { 01139 return( FALSE ); 01140 } 01141 } 01142 01143 BOOLEAN 01144 TestEnumHandle4( 01145 IN PVOID HandleTableEntry, 01146 IN PVOID EnumParameter 01147 ) 01148 { 01149 if (EnumParameter == (PVOID)*(PULONG)HandleTableEntry) { 01150 return( TRUE ); 01151 } 01152 else { 01153 return( FALSE ); 01154 } 01155 } 01156 01157 #define HANDLE_TEST_SIZE 30 01158 01159 BOOLEAN 01160 DoHandleTest( void ) 01161 { 01162 PVOID HandleTable1; 01163 PVOID HandleTable4; 01164 PVOID HandleTable1a; 01165 PVOID HandleTable4a; 01166 HANDLE HandlesForTable1[ HANDLE_TEST_SIZE ]; 01167 HANDLE HandlesForTable4[ HANDLE_TEST_SIZE ]; 01168 HANDLE h; 01169 PULONG HandleValue; 01170 BOOLEAN LockFlag; 01171 ULONG i, v[4]; 01172 01173 HandleTable1 = ExCreateHandleTable( (PEPROCESS)NULL, 0L, 0L, 0L, MUTEX_LEVEL_PS_CID_TABLE, FALSE ); 01174 HandleTable4 = ExCreateHandleTable( (PEPROCESS)NULL, 16L, 8L, 2L, MUTEX_LEVEL_OB_TABLE, TRUE ); 01175 01176 ExDumpHandleTable( (PEPROCESS)NULL, HandleTable1, NULL ); 01177 ExDumpHandleTable( (PEPROCESS)NULL, HandleTable4, NULL ); 01178 01179 for (i=0; i<HANDLE_TEST_SIZE; i++) { 01180 v[0] = (i+1) << 4; 01181 v[1] = (i+1) << 3; 01182 v[2] = (i+1) << 2; 01183 v[3] = (i+1) << 1; 01184 01185 HandlesForTable1[ i ] = ExCreateHandle( HandleTable1, (PVOID)(v[0]) ); 01186 DbgPrint( "HandleTable1: %lx => %lx\n", HandlesForTable1[ i ], v[0] ); 01187 HandlesForTable4[ i ] = ExCreateHandle( HandleTable4, (PVOID)(&v[0]) ); 01188 DbgPrint( "HandleTable4: %lx => %lx\n", HandlesForTable4[ i ], v[0] ); 01189 } 01190 01191 ExDumpHandleTable( HandleTable1, NULL, NULL ); 01192 ExDumpHandleTable( HandleTable4, NULL, NULL ); 01193 01194 for (i=0; i<=HANDLE_TEST_SIZE; i++) { 01195 v[0] = (i+1) << 4; 01196 v[1] = (i+1) << 3; 01197 v[2] = (i+1) << 2; 01198 v[3] = (i+1) << 1; 01199 01200 if (ExEnumHandleTable( HandleTable1, TestEnumHandle1, (PVOID)(v[0]), &h )) { 01201 DbgPrint( "HandleTable1: Found: %lx <= %lx\n", v[0], h ); 01202 } 01203 else { 01204 DbgPrint( "HandleTable1: %lx not found\n", v[0] ); 01205 } 01206 01207 if (ExEnumHandleTable( HandleTable4, TestEnumHandle4, (PVOID)(v[0]), &h )) { 01208 DbgPrint( "HandleTable4: Found: %lx <= %lx\n", v[0], h ); 01209 } 01210 else { 01211 DbgPrint( "HandleTable4: %lx not found\n", v[0] ); 01212 } 01213 } 01214 01215 for (i=0; i<HANDLE_TEST_SIZE; i++) { 01216 LockFlag = ExMapHandleToPointer( HandleTable1, 01217 HandlesForTable1[ i ], 01218 (PVOID)&HandleValue 01219 ); 01220 01221 DbgPrint( "HandleTable1: %lx => %lx\n", 01222 HandlesForTable1[ i ], HandleValue 01223 ); 01224 ExUnlockHandleTable( HandleTable1, LockFlag ); 01225 01226 LockFlag = ExMapHandleToPointer( HandleTable4, 01227 HandlesForTable4[ i ], 01228 (PVOID)&HandleValue 01229 ); 01230 DbgPrint( "HandleTable4: %lx => %lx\n", 01231 HandlesForTable4[ i ], *HandleValue 01232 ); 01233 ExUnlockHandleTable( HandleTable4, LockFlag ); 01234 } 01235 01236 HandleTable1a = ExDupHandleTable( (PEPROCESS)NULL, HandleTable1, TestDupHandle1 ); 01237 HandleTable4a = ExDupHandleTable( (PEPROCESS)NULL, HandleTable4, TestDupHandle4 ); 01238 01239 ExDumpHandleTable( HandleTable1a, NULL, NULL ); 01240 ExDumpHandleTable( HandleTable4a, NULL, NULL ); 01241 01242 for (i=0; i<HANDLE_TEST_SIZE; i++) { 01243 ExDestroyHandle( HandleTable1, HandlesForTable1[ i ] ); 01244 ExDestroyHandle( HandleTable4, HandlesForTable4[ i ] ); 01245 } 01246 01247 ExDumpHandleTable( HandleTable1, NULL, NULL ); 01248 ExDumpHandleTable( HandleTable4, NULL, NULL ); 01249 01250 ExDestroyHandleTable( HandleTable1, NULL ); 01251 ExDestroyHandleTable( HandleTable4, NULL ); 01252 01253 ExDestroyHandleTable( HandleTable1a, NULL ); 01254 ExDestroyHandleTable( HandleTable4a, NULL ); 01255 01256 return( TRUE ); 01257 } 01258 01259 BOOLEAN 01260 DoInfoTest( void ) 01261 { 01262 BOOLEAN Result = FALSE; 01263 NTSTATUS Status; 01264 SYSTEM_BASIC_INFORMATION BasicInfo; 01265 SYSTEM_PROCESSOR_INFORMATION ProcessorInfo; 01266 ULONG ReturnedLength; 01267 01268 DbgPrint(" ** Start of System Information Test **\n"); 01269 Status = ZwQuerySystemInformation( SystemBasicInformation, 01270 (PVOID)&BasicInfo, 01271 sizeof( BasicInfo ), 01272 &ReturnedLength 01273 ); 01274 if (NT_SUCCESS( Status )) { 01275 DbgPrint( "NtQuerySystemInformation returns:\n" ); 01276 DbgPrint( " Number of Processors: %ld\n", 01277 BasicInfo.NumberOfProcessors 01278 ); 01279 DbgPrint( " OEM Machine Id: %lx\n", 01280 BasicInfo.OemMachineId 01281 ); 01282 DbgPrint( " Timer Resolution: %ld microseconds\n", 01283 BasicInfo.TimerResolutionInMicroSeconds 01284 ); 01285 DbgPrint( " Page Size: %ld Allocation Granularity: %ld\n", 01286 BasicInfo.PageSize, 01287 BasicInfo.AllocationGranularity 01288 ); 01289 DbgPrint( " User Mode Address Range: 0x%08lx <-> 0x%08lx\n", 01290 BasicInfo.MinimumUserModeAddress, 01291 BasicInfo.MaximumUserModeAddress 01292 ); 01293 } 01294 else { 01295 DbgPrint( "NtQuerySystemInformation failed. Status == %X\n", 01296 Status 01297 ); 01298 } 01299 01300 DbgPrint(" ** End of System Information Test **\n"); 01301 return( Result ); 01302 } 01303 01304 BOOLEAN 01305 DoLuidTest( void ) 01306 { 01307 BOOLEAN Result = TRUE; 01308 NTSTATUS Status; 01309 01310 LUID FirstLuid; 01311 LUID SecondLuid; 01312 01313 FirstLuid.LowPart = 0; 01314 FirstLuid.HighPart = 0; 01315 01316 SecondLuid.LowPart = 0; 01317 SecondLuid.HighPart = 0; 01318 01319 DbgPrint(" ** Start of Locally Unique ID Test **\n"); 01320 01321 01322 01323 Status = ZwAllocateLocallyUniqueId( &FirstLuid ); 01324 01325 if (!NT_SUCCESS( Status )) { 01326 DbgPrint( "First Luid Allocation Error.\n" ); 01327 Result = FALSE; 01328 } 01329 01330 if (LiLeqZero( FirstLuid )) { 01331 DbgPrint( "First Luid Allocation Failed - Bad Value.\n" ); 01332 Result = FALSE; 01333 } 01334 01335 01336 01337 if (Result) { 01338 01339 Status = ZwAllocateLocallyUniqueId( &SecondLuid ); 01340 01341 if (!NT_SUCCESS( Status )) { 01342 DbgPrint( "Second Luid Allocation Error.\n" ); 01343 Result = FALSE; 01344 } 01345 01346 if (LiLeqZero( SecondLuid )) { 01347 DbgPrint( "Second Luid Allocation Failed - Bad Value.\n" ); 01348 Result = FALSE; 01349 } 01350 01351 if (LiLeq( FirstLuid, SecondLuid )) { 01352 DbgPrint( "Second Luid Allocation Failed - Not larger than first value.\n" ); 01353 Result = FALSE; 01354 } 01355 01356 } 01357 01358 01359 DbgPrint(" ** End of Locally Unique ID Test **\n"); 01360 return( Result ); 01361 } 01362 01363 char MemoryTestBuffer1[ 128 ]; 01364 char TestString1[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; 01365 char TestString2[] = "123456789012345678901234567890123456789012345678901234567890"; 01366 char MemoryTestBuffer2[ 128 ]; 01367 01368 BOOLEAN 01369 DoMemoryTest( void ) 01370 { 01371 LONG i,j,k; 01372 BOOLEAN Result; 01373 01374 DbgPrint(" ** Start of Memory Test **\n"); 01375 01376 Result = TRUE; 01377 strcpy( MemoryTestBuffer1, TestString1 ); 01378 for (i=15; i>=0; i--) { 01379 MemoryTestBuffer1[16] = 0xFF; 01380 RtlZeroMemory( &MemoryTestBuffer1[i], 16-i ); 01381 if (strncmp( MemoryTestBuffer1, TestString1, i ) || MemoryTestBuffer1[i] || !MemoryTestBuffer1[16]) { 01382 DbgPrint( "*** failed *** - RtlZeroMemory( %s, %ld )\n", 01383 MemoryTestBuffer1, 16-i ); 01384 Result = FALSE; 01385 } 01386 } 01387 01388 for (k = 0; k < 8; k++) { 01389 DbgPrint("k = %d, j = ",k); 01390 for (j = 0; j < 8; j++) { 01391 DbgPrint(" %d ",j); 01392 for (i=0; i<26; i++) { 01393 RtlZeroMemory( MemoryTestBuffer1, (ULONG)sizeof( MemoryTestBuffer1 ) ); 01394 RtlMoveMemory( &MemoryTestBuffer1[j], &TestString2[k], i ); 01395 if (strncmp( &MemoryTestBuffer1[j], &TestString2[k], i ) || MemoryTestBuffer1[j+i]) { 01396 DbgPrint( "*** failed *** - RtlMoveMemory( %s, %s, %ld )\n", 01397 &MemoryTestBuffer1[j], TestString2, i ); 01398 Result = FALSE; 01399 } 01400 } 01401 } 01402 DbgPrint("\n"); 01403 } 01404 01405 for (k = 0; k < 8; k++) { 01406 DbgPrint("k = %d, j = ",k); 01407 for (j = 0; j < 8; j++) { 01408 DbgPrint(" %d ",j); 01409 for (i=0; i<26; i++) { 01410 RtlZeroMemory( MemoryTestBuffer2, (ULONG)sizeof( MemoryTestBuffer2 ) ); 01411 RtlMoveMemory( &MemoryTestBuffer2[j], &TestString2[k], i ); 01412 if (strncmp( &MemoryTestBuffer2[j], &TestString2[k], i ) || MemoryTestBuffer2[j+i]) { 01413 DbgPrint( "*** failed *** - RtlMoveMemory( %s, %s, %ld )\n", 01414 &MemoryTestBuffer2[j], TestString2, i ); 01415 Result = FALSE; 01416 } 01417 } 01418 } 01419 DbgPrint("\n"); 01420 } 01421 01422 for (k = 0; k < 8; k++) { 01423 DbgPrint("k = %d, j = ",k); 01424 for (j = 0; j < 8; j++) { 01425 DbgPrint(" %d ",j); 01426 for (i=0; i<26; i++) { 01427 strcpy( MemoryTestBuffer1, TestString1 ); 01428 RtlMoveMemory( &MemoryTestBuffer1[j], &MemoryTestBuffer1[k], i ); 01429 if (strncmp( &MemoryTestBuffer1[j], &TestString1[k], i )) { 01430 DbgPrint( "*** failed *** - RtlMoveMemory( %s, %s, %ld )\n", 01431 &MemoryTestBuffer2[j], TestString2, i ); 01432 Result = FALSE; 01433 } 01434 } 01435 } 01436 DbgPrint("\n"); 01437 } 01438 01439 DbgPrint(" ** End of Memory Test **\n"); 01440 01441 return( Result ); 01442 } 01443 01444 BOOLEAN 01445 DoPartyTest( void ) 01446 { 01447 BOOLEAN Result = TRUE; 01448 NTSTATUS Status; 01449 OBJECT_ATTRIBUTES ObjectAttributes; 01450 HANDLE Handle; 01451 01452 DbgPrint(" ** Start of Party By Number Test **\n"); 01453 01454 NtPartyByNumber( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ); 01455 InitializeObjectAttributes( &ObjectAttributes, NULL, 0, NULL, NULL ); 01456 Status = ZwCreateEvent( &Handle, 01457 EVENT_ALL_ACCESS, 01458 &ObjectAttributes, NotificationEvent ,TRUE); 01459 NtPartyByNumber( PARTY_DUMP_OBJECT_BY_HANDLE, Handle, NULL ); 01460 ZwClose( Handle ); 01461 NtPartyByNumber( PARTY_DUMP_OBJECT_BY_HANDLE, Handle, NULL ); 01462 01463 DbgPrint(" ** End of Party By Number Test **\n"); 01464 return( Result ); 01465 } 01466 01467 BOOLEAN 01468 DoPoolTest( void ) 01469 { 01470 PVOID p,p0,p1,p2,p3; 01471 01472 p = ExAllocatePool(NonPagedPool,4000L); 01473 DumpPool("After 4000 byte Allocation",NonPagedPool); 01474 p = ExAllocatePool(NonPagedPool,2000L); 01475 DumpPool("After 2000 byte Allocation",NonPagedPool); 01476 p = ExAllocatePool(NonPagedPool,2000L); 01477 DumpPool("After 2000 byte Allocation",NonPagedPool); 01478 01479 p0 = ExAllocatePool(NonPagedPool,24L); 01480 DumpPool("After 24 byte Allocation p0",NonPagedPool); 01481 p1 = ExAllocatePool(NonPagedPool,24L); 01482 DumpPool("After 24 byte Allocation p1",NonPagedPool); 01483 p2 = ExAllocatePool(NonPagedPool,24L); 01484 DumpPool("After 24 byte Allocation p2",NonPagedPool); 01485 p3 = ExAllocatePool(NonPagedPool,24L); 01486 DumpPool("After 24 byte Allocation p3",NonPagedPool); 01487 01488 ExFreePool(p1); 01489 DumpPool("After 24 byte Deallocation p1",NonPagedPool); 01490 ExFreePool(p3); 01491 DumpPool("After 24 byte Deallocation p3",NonPagedPool); 01492 ExFreePool(p2); 01493 DumpPool("After 24 byte Deallocation p2",NonPagedPool); 01494 ExFreePool(p0); 01495 DumpPool("After 24 byte Deallocation p0",NonPagedPool); 01496 01497 p0 = ExAllocatePool(NonPagedPool,120L); 01498 DumpPool("After 120 byte Allocation p0",NonPagedPool); 01499 p1 = ExAllocatePool(NonPagedPool,24L); 01500 DumpPool("After 24 byte Allocation p1",NonPagedPool); 01501 ExFreePool(p1); 01502 DumpPool("After 24 byte Deallocation p1",NonPagedPool); 01503 ExFreePool(p0); 01504 DumpPool("After 120 byte Deallocation p0",NonPagedPool); 01505 01506 return( TRUE ); 01507 } 01508 01509 BOOLEAN 01510 DoZoneTest( void ) 01511 { 01512 PULONG p1,p2; 01513 PZONE_HEADER z; 01514 NTSTATUS st; 01515 PVOID b1, b2, b3, b4, b5; 01516 01517 z = ExAllocatePool(NonPagedPool,(ULONG)sizeof(ZONE_HEADER)); 01518 p1 = ExAllocatePool(NonPagedPool,2048L); 01519 p2 = ExAllocatePool(NonPagedPool,1024L); 01520 st = ExInitializeZone(z,512L,p1,2048L); 01521 ExDumpZone(z); 01522 01523 b1 = ExAllocateFromZone(z); 01524 DbgPrint("b1 = 0x%lx\n",b1); 01525 ExDumpZone(z); 01526 01527 b2 = ExAllocateFromZone(z); 01528 DbgPrint("b2 = 0x%lx\n",b2); 01529 ExDumpZone(z); 01530 01531 b3 = ExAllocateFromZone(z); 01532 DbgPrint("b3 = 0x%lx\n",b3); 01533 ExDumpZone(z); 01534 01535 b4 = ExAllocateFromZone(z); 01536 DbgPrint("b4 = 0x%lx\n",b4); 01537 ExDumpZone(z); 01538 01539 b5 = ExAllocateFromZone(z); 01540 DbgPrint("b5 = 0x%lx\n",b5); 01541 ExDumpZone(z); 01542 01543 ExFreeToZone(z,b4); 01544 ExDumpZone(z); 01545 01546 ExFreeToZone(z,b3); 01547 ExDumpZone(z); 01548 01549 ExFreeToZone(z,b2); 01550 ExDumpZone(z); 01551 01552 ExFreeToZone(z,b1); 01553 ExDumpZone(z); 01554 01555 st = ExExtendZone(z,p2,1024L); 01556 ExDumpZone(z); 01557 01558 return( TRUE ); 01559 } 01560 01561 ERESOURCE Resource; 01562 ULONG ResourceCount; 01563 KSEMAPHORE ResourceSemaphore; 01564 PVOID ExDumpResource( IN PERESOURCE Resource ); 01565 01566 VOID 01567 Reader ( 01568 IN PVOID StartContext 01569 ) 01570 { 01571 LARGE_INTEGER Time; 01572 01573 //KeSetPriorityThread( &PsGetCurrentThread()->Tcb, 2 ); 01574 01575 DbgPrint("Starting Reader %lx...\n", StartContext); 01576 01577 Time.LowPart = -(1+(ULONG)StartContext); 01578 Time.HighPart = -1; 01579 01580 while (TRUE) { 01581 01582 (VOID)ExAcquireResourceShared(&Resource,TRUE); 01583 01584 DbgPrint("%lx with shared access\n", StartContext); 01585 01586 if (ResourceCount >= 10) { 01587 ExReleaseResource(&Resource); 01588 break; 01589 } 01590 01591 KeDelayExecutionThread ( KernelMode, FALSE, &Time); 01592 01593 ExReleaseResource(&Resource); 01594 01595 DbgPrint("%lx released shared access\n", StartContext); 01596 01597 KeDelayExecutionThread ( KernelMode, FALSE, &Time); 01598 } 01599 01600 DbgPrint("Reader %lx exiting\n", StartContext); 01601 01602 KeReleaseSemaphore(&ResourceSemaphore, 0, 1, FALSE); 01603 } 01604 01605 VOID 01606 Writer ( 01607 IN PVOID StartContext 01608 ) 01609 { 01610 LARGE_INTEGER Time; 01611 01612 //KeSetPriorityThread( &PsGetCurrentThread()->Tcb, 3 ); 01613 01614 DbgPrint("Starting Writer %lx...\n", StartContext); 01615 01616 Time.LowPart = -(1+(ULONG)StartContext); 01617 Time.HighPart = -1; 01618 01619 while (TRUE) { 01620 01621 (VOID)ExAcquireResourceExclusive(&Resource,TRUE); 01622 01623 DbgPrint("%lx with Exclusive access\n", StartContext); 01624 01625 ResourceCount += 1; 01626 if (ResourceCount >= 10) { 01627 ExReleaseResource(&Resource); 01628 break; 01629 } 01630 01631 KeDelayExecutionThread ( KernelMode, FALSE, &Time); 01632 01633 ExReleaseResource(&Resource); 01634 01635 DbgPrint("%lx released Exclusive access\n", StartContext); 01636 01637 KeDelayExecutionThread ( KernelMode, FALSE, &Time); 01638 } 01639 01640 DbgPrint("Writer %lx exiting\n", StartContext); 01641 01642 KeReleaseSemaphore(&ResourceSemaphore, 0, 1, FALSE); 01643 } 01644 01645 VOID 01646 ReaderTurnedWriter ( 01647 IN PVOID StartContext 01648 ) 01649 { 01650 LARGE_INTEGER Time; 01651 01652 //KeSetPriorityThread( &PsGetCurrentThread()->Tcb, 4 ); 01653 01654 DbgPrint("Starting Reader turned Writer %lx\n", StartContext); 01655 01656 Time.LowPart = -(1+(ULONG)StartContext); 01657 Time.HighPart = -1; 01658 01659 while (TRUE) { 01660 01661 (VOID)ExAcquireResourceShared(&Resource,TRUE); 01662 01663 DbgPrint("%lx with shared access\n", StartContext); 01664 01665 if (ResourceCount >= 10) { 01666 ExReleaseResource(&Resource); 01667 break; 01668 } 01669 01670 KeDelayExecutionThread ( KernelMode, FALSE, &Time); 01671 01672 ExConvertSharedToExclusive(&Resource); 01673 01674 DbgPrint("%lx Shared turned Exclusive access\n", StartContext); 01675 01676 ResourceCount += 1; 01677 if (ResourceCount >= 10) { 01678 ExReleaseResource(&Resource); 01679 break; 01680 } 01681 01682 KeDelayExecutionThread ( KernelMode, FALSE, &Time); 01683 01684 ExConvertExclusiveToShared(&Resource); 01685 01686 DbgPrint("%lx Exclusive turned Shared access\n", StartContext); 01687 01688 if (ResourceCount >= 10) { 01689 ExReleaseResource(&Resource); 01690 break; 01691 } 01692 01693 ExReleaseResource(&Resource); 01694 01695 DbgPrint("%lx release Shared access\n", StartContext); 01696 01697 KeDelayExecutionThread ( KernelMode, FALSE, &Time); 01698 } 01699 01700 DbgPrint("Reader turned Writer %lx exiting\n", StartContext); 01701 01702 KeReleaseSemaphore(&ResourceSemaphore, 0, 1, FALSE); 01703 } 01704 01705 BOOLEAN 01706 DoResourceTest( void ) 01707 { 01708 HANDLE Handles[32]; 01709 ULONG i; 01710 01711 DbgPrint("Start DoResourceTest...\n"); 01712 01713 ExInitializeResource(&Resource); 01714 ResourceCount = 0; 01715 01716 KeInitializeSemaphore(&ResourceSemaphore, 0, MAXLONG); 01717 01718 for (i = 0; i < 4; i += 1) { 01719 01720 if (!NT_SUCCESS(PsCreateSystemThread(&Handles[i], 01721 0, 01722 NULL, 01723 0, 01724 NULL, 01725 Reader, 01726 (PVOID)i))) { 01727 01728 DbgPrint("Create system thread error %8lx\n", i); 01729 } 01730 01731 } 01732 01733 for (i = 4; i < 6; i += 1) { 01734 01735 if (!NT_SUCCESS(PsCreateSystemThread(&Handles[i], 01736 0, 01737 NULL, 01738 0, 01739 NULL, 01740 Writer, 01741 (PVOID)i))) { 01742 01743 DbgPrint("Create system thread error %8lx\n", i); 01744 } 01745 01746 } 01747 01748 for (i = 6; i < 8; i += 1) { 01749 01750 if (!NT_SUCCESS(PsCreateSystemThread(&Handles[i], 01751 0, 01752 NULL, 01753 0, 01754 NULL, 01755 ReaderTurnedWriter, 01756 (PVOID)i))) { 01757 01758 DbgPrint("Create system thread error %8lx\n", i); 01759 } 01760 01761 } 01762 01763 DbgPrint("DoResourceTest wait for everyone to complete...\n"); 01764 01765 for (i = 0; i < 8; i += 1) { 01766 01767 KeWaitForSingleObject( &ResourceSemaphore, 01768 Executive, 01769 KernelMode, 01770 FALSE, 01771 NULL); 01772 01773 } 01774 01775 DbgPrint("DoResourceTest Done\n"); 01776 01777 return( TRUE ); 01778 } 01779 01780 BOOLEAN 01781 DoBitMapTest( void ) 01782 { 01783 ULONG Size; 01784 PRTL_BITMAP BitMap; 01785 01786 DbgPrint("Start DoBitMapTest...\n"); 01787 01788 // 01789 // First create a new bitmap 01790 // 01791 01792 Size = sizeof(RTL_BITMAP) + (((2048*8 + 31) / 32) * 4); 01793 BitMap = (PRTL_BITMAP)(ExAllocatePool( NonPagedPool, Size )); 01794 RtlInitializeBitMap( BitMap, (PULONG)(BitMap+1), 2048*8 ); 01795 01796 // 01797 // >>>> Test setting bits 01798 // 01799 01800 // 01801 // Now clear all bits 01802 // 01803 01804 RtlClearAllBits( BitMap ); 01805 01806 // 01807 // Now set some bit patterns, and test them 01808 // 01809 01810 RtlSetBits( BitMap, 0, 1 ); 01811 RtlSetBits( BitMap, 63, 1 ); 01812 RtlSetBits( BitMap, 65, 30 ); 01813 RtlSetBits( BitMap, 127, 2 ); 01814 RtlSetBits( BitMap, 191, 34 ); 01815 01816 if ((BitMap->Buffer[0] != 0x00000001) || 01817 (BitMap->Buffer[1] != 0x80000000) || 01818 (BitMap->Buffer[2] != 0x7ffffffe) || 01819 (BitMap->Buffer[3] != 0x80000000) || 01820 (BitMap->Buffer[4] != 0x00000001) || 01821 (BitMap->Buffer[5] != 0x80000000) || 01822 (BitMap->Buffer[6] != 0xffffffff) || 01823 (BitMap->Buffer[7] != 0x00000001)) { 01824 01825 DbgPrint("RtlSetBits Error\n"); 01826 return FALSE; 01827 } 01828 01829 // 01830 // Now test some RtlFindClearBitsAndSet 01831 // 01832 01833 RtlSetAllBits( BitMap ); 01834 01835 RtlClearBits( BitMap, 0 + 10*32, 1 ); 01836 RtlClearBits( BitMap, 5 + 11*32, 1 ); 01837 RtlClearBits( BitMap, 7 + 12*32, 1 ); 01838 01839 RtlClearBits( BitMap, 0 + 13*32, 9 ); 01840 RtlClearBits( BitMap, 4 + 14*32, 9 ); 01841 RtlClearBits( BitMap, 7 + 15*32, 9 ); 01842 01843 RtlClearBits( BitMap, 0 + 16*32, 10 ); 01844 RtlClearBits( BitMap, 4 + 17*32, 10 ); 01845 RtlClearBits( BitMap, 6 + 18*32, 10 ); 01846 RtlClearBits( BitMap, 7 + 19*32, 10 ); 01847 01848 RtlClearBits( BitMap, 0 + 110*32, 14 ); 01849 RtlClearBits( BitMap, 1 + 111*32, 14 ); 01850 RtlClearBits( BitMap, 2 + 112*32, 14 ); 01851 01852 RtlClearBits( BitMap, 0 + 113*32, 15 ); 01853 RtlClearBits( BitMap, 1 + 114*32, 15 ); 01854 RtlClearBits( BitMap, 2 + 115*32, 15 ); 01855 01856 // { 01857 // ULONG i; 01858 // for (i = 0; i < 16; i++) { 01859 // DbgPrint("%2d: %08lx\n", i, BitMap->Buffer[i]); 01860 // } 01861 // } 01862 01863 if (RtlFindClearBitsAndSet( BitMap, 15, 0) != 0 + 113*32) { 01864 DbgPrint("RtlFindClearBitsAndSet Error 0 + 113*32\n"); 01865 return FALSE; 01866 } 01867 if (RtlFindClearBitsAndSet( BitMap, 15, 0) != 1 + 114*32) { 01868 DbgPrint("RtlFindClearBitsAndSet Error 1 + 114*32\n"); 01869 return FALSE; 01870 } 01871 if (RtlFindClearBitsAndSet( BitMap, 15, 0) != 2 + 115*32) { 01872 DbgPrint("RtlFindClearBitsAndSet Error 2 + 115*32\n"); 01873 return FALSE; 01874 } 01875 01876 if (RtlFindClearBitsAndSet( BitMap, 14, 0) != 0 + 110*32) { 01877 DbgPrint("RtlFindClearBitsAndSet Error 0 + 110*32\n"); 01878 return FALSE; 01879 } 01880 if (RtlFindClearBitsAndSet( BitMap, 14, 0) != 1 + 111*32) { 01881 DbgPrint("RtlFindClearBitsAndSet Error 1 + 111*32\n"); 01882 return FALSE; 01883 } 01884 if (RtlFindClearBitsAndSet( BitMap, 14, 0) != 2 + 112*32) { 01885 DbgPrint("RtlFindClearBitsAndSet Error 2 + 112*32\n"); 01886 return FALSE; 01887 } 01888 01889 if (RtlFindClearBitsAndSet( BitMap, 10, 0) != 0 + 16*32) { 01890 DbgPrint("RtlFindClearBitsAndSet Error 0 + 16*32\n"); 01891 return FALSE; 01892 } 01893 if (RtlFindClearBitsAndSet( BitMap, 10, 0) != 4 + 17*32) { 01894 DbgPrint("RtlFindClearBitsAndSet Error 4 + 17*32\n"); 01895 return FALSE; 01896 } 01897 if (RtlFindClearBitsAndSet( BitMap, 10, 0) != 6 + 18*32) { 01898 DbgPrint("RtlFindClearBitsAndSet Error 6 + 18*32\n"); 01899 return FALSE; 01900 } 01901 if (RtlFindClearBitsAndSet( BitMap, 10, 0) != 7 + 19*32) { 01902 DbgPrint("RtlFindClearBitsAndSet Error 7 + 19*32\n"); 01903 return FALSE; 01904 } 01905 01906 if (RtlFindClearBitsAndSet( BitMap, 9, 0) != 0 + 13*32) { 01907 DbgPrint("RtlFindClearBitsAndSet Error 0 + 13*32\n"); 01908 return FALSE; 01909 } 01910 if (RtlFindClearBitsAndSet( BitMap, 9, 0) != 4 + 14*32) { 01911 DbgPrint("RtlFindClearBitsAndSet Error 4 + 14*32\n"); 01912 return FALSE; 01913 } 01914 if (RtlFindClearBitsAndSet( BitMap, 9, 0) != 7 + 15*32) { 01915 DbgPrint("RtlFindClearBitsAndSet Error 7 + 15*32\n"); 01916 return FALSE; 01917 } 01918 01919 if (RtlFindClearBitsAndSet( BitMap, 1, 0) != 0 + 10*32) { 01920 DbgPrint("RtlFindClearBitsAndSet Error 0 + 10*32\n"); 01921 return FALSE; 01922 } 01923 if (RtlFindClearBitsAndSet( BitMap, 1, 0) != 5 + 11*32) { 01924 DbgPrint("RtlFindClearBitsAndSet Error 5 + 11*32\n"); 01925 return FALSE; 01926 } 01927 if (RtlFindClearBitsAndSet( BitMap, 1, 0) != 7 + 12*32) { 01928 DbgPrint("RtlFindClearBitsAndSet Error 7 + 12*32\n"); 01929 return FALSE; 01930 } 01931 01932 // 01933 // Now test some RtlFindClearBitsAndSet 01934 // 01935 01936 RtlSetAllBits( BitMap ); 01937 01938 RtlClearBits( BitMap, 0 + 0*32, 1 ); 01939 RtlClearBits( BitMap, 5 + 1*32, 1 ); 01940 RtlClearBits( BitMap, 7 + 2*32, 1 ); 01941 01942 RtlClearBits( BitMap, 0 + 3*32, 9 ); 01943 RtlClearBits( BitMap, 4 + 4*32, 9 ); 01944 RtlClearBits( BitMap, 7 + 5*32, 9 ); 01945 01946 RtlClearBits( BitMap, 0 + 6*32, 10 ); 01947 RtlClearBits( BitMap, 4 + 7*32, 10 ); 01948 RtlClearBits( BitMap, 6 + 8*32, 10 ); 01949 RtlClearBits( BitMap, 7 + 9*32, 10 ); 01950 01951 RtlClearBits( BitMap, 0 + 10*32, 14 ); 01952 RtlClearBits( BitMap, 1 + 11*32, 14 ); 01953 RtlClearBits( BitMap, 2 + 12*32, 14 ); 01954 01955 RtlClearBits( BitMap, 0 + 13*32, 15 ); 01956 RtlClearBits( BitMap, 1 + 14*32, 15 ); 01957 RtlClearBits( BitMap, 2 + 15*32, 15 ); 01958 01959 // { 01960 // ULONG i; 01961 // for (i = 0; i < 16; i++) { 01962 // DbgPrint("%2d: %08lx\n", i, BitMap->Buffer[i]); 01963 // } 01964 // } 01965 01966 if (RtlFindClearBitsAndSet( BitMap, 15, 0) != 0 + 13*32) { 01967 DbgPrint("RtlFindClearBitsAndSet Error 0 + 13*32\n"); 01968 return FALSE; 01969 } 01970 if (RtlFindClearBitsAndSet( BitMap, 15, 0) != 1 + 14*32) { 01971 DbgPrint("RtlFindClearBitsAndSet Error 1 + 14*32\n"); 01972 return FALSE; 01973 } 01974 if (RtlFindClearBitsAndSet( BitMap, 15, 0) != 2 + 15*32) { 01975 DbgPrint("RtlFindClearBitsAndSet Error 2 + 15*32\n"); 01976 return FALSE; 01977 } 01978 01979 if (RtlFindClearBitsAndSet( BitMap, 14, 0) != 0 + 10*32) { 01980 DbgPrint("RtlFindClearBitsAndSet Error 0 + 10*32\n"); 01981 return FALSE; 01982 } 01983 if (RtlFindClearBitsAndSet( BitMap, 14, 0) != 1 + 11*32) { 01984 DbgPrint("RtlFindClearBitsAndSet Error 1 + 11*32\n"); 01985 return FALSE; 01986 } 01987 if (RtlFindClearBitsAndSet( BitMap, 14, 0) != 2 + 12*32) { 01988 DbgPrint("RtlFindClearBitsAndSet Error 2 + 12*32\n"); 01989 return FALSE; 01990 } 01991 01992 if (RtlFindClearBitsAndSet( BitMap, 10, 0) != 0 + 6*32) { 01993 DbgPrint("RtlFindClearBitsAndSet Error 0 + 6*32\n"); 01994 return FALSE; 01995 } 01996 if (RtlFindClearBitsAndSet( BitMap, 10, 0) != 4 + 7*32) { 01997 DbgPrint("RtlFindClearBitsAndSet Error 4 + 7*32\n"); 01998 return FALSE; 01999 } 02000 if (RtlFindClearBitsAndSet( BitMap, 10, 0) != 6 + 8*32) { 02001 DbgPrint("RtlFindClearBitsAndSet Error 6 + 8*32\n"); 02002 return FALSE; 02003 } 02004 if (RtlFindClearBitsAndSet( BitMap, 10, 0) != 7 + 9*32) { 02005 DbgPrint("RtlFindClearBitsAndSet Error 7 + 9*32\n"); 02006 return FALSE; 02007 } 02008 02009 if (RtlFindClearBitsAndSet( BitMap, 9, 0) != 0 + 3*32) { 02010 DbgPrint("RtlFindClearBitsAndSet Error 0 + 3*32\n"); 02011 return FALSE; 02012 } 02013 if (RtlFindClearBitsAndSet( BitMap, 9, 0) != 4 + 4*32) { 02014 DbgPrint("RtlFindClearBitsAndSet Error 4 + 4*32\n"); 02015 return FALSE; 02016 } 02017 if (RtlFindClearBitsAndSet( BitMap, 9, 0) != 7 + 5*32) { 02018 DbgPrint("RtlFindClearBitsAndSet Error 7 + 5*32\n"); 02019 return FALSE; 02020 } 02021 02022 if (RtlFindClearBitsAndSet( BitMap, 1, 0) != 0 + 0*32) { 02023 DbgPrint("RtlFindClearBitsAndSet Error 0 + 0*32\n"); 02024 return FALSE; 02025 } 02026 if (RtlFindClearBitsAndSet( BitMap, 1, 0) != 5 + 1*32) { 02027 DbgPrint("RtlFindClearBitsAndSet Error 5 + 1*32\n"); 02028 return FALSE; 02029 } 02030 if (RtlFindClearBitsAndSet( BitMap, 1, 0) != 7 + 2*32) { 02031 DbgPrint("RtlFindClearBitsAndSet Error 7 + 2*32\n"); 02032 return FALSE; 02033 } 02034 02035 // 02036 // >>>> Test clearing bits 02037 // 02038 02039 // 02040 // Now clear all bits 02041 // 02042 02043 RtlSetAllBits( BitMap ); 02044 02045 // 02046 // Now set some bit patterns, and test them 02047 // 02048 02049 RtlClearBits( BitMap, 0, 1 ); 02050 RtlClearBits( BitMap, 63, 1 ); 02051 RtlClearBits( BitMap, 65, 30 ); 02052 RtlClearBits( BitMap, 127, 2 ); 02053 RtlClearBits( BitMap, 191, 34 ); 02054 02055 if ((BitMap->Buffer[0] != ~0x00000001) || 02056 (BitMap->Buffer[1] != ~0x80000000) || 02057 (BitMap->Buffer[2] != ~0x7ffffffe) || 02058 (BitMap->Buffer[3] != ~0x80000000) || 02059 (BitMap->Buffer[4] != ~0x00000001) || 02060 (BitMap->Buffer[5] != ~0x80000000) || 02061 (BitMap->Buffer[6] != ~0xffffffff) || 02062 (BitMap->Buffer[7] != ~0x00000001)) { 02063 02064 DbgPrint("RtlClearBits Error\n"); 02065 return FALSE; 02066 } 02067 02068 // 02069 // Now test some RtlFindSetBitsAndClear 02070 // 02071 02072 RtlClearAllBits( BitMap ); 02073 02074 RtlSetBits( BitMap, 0 + 0*32, 1 ); 02075 RtlSetBits( BitMap, 5 + 1*32, 1 ); 02076 RtlSetBits( BitMap, 7 + 2*32, 1 ); 02077 02078 RtlSetBits( BitMap, 0 + 3*32, 9 ); 02079 RtlSetBits( BitMap, 4 + 4*32, 9 ); 02080 RtlSetBits( BitMap, 7 + 5*32, 9 ); 02081 02082 RtlSetBits( BitMap, 0 + 6*32, 10 ); 02083 RtlSetBits( BitMap, 4 + 7*32, 10 ); 02084 RtlSetBits( BitMap, 6 + 8*32, 10 ); 02085 RtlSetBits( BitMap, 7 + 9*32, 10 ); 02086 02087 RtlSetBits( BitMap, 0 + 10*32, 14 ); 02088 RtlSetBits( BitMap, 1 + 11*32, 14 ); 02089 RtlSetBits( BitMap, 2 + 12*32, 14 ); 02090 02091 RtlSetBits( BitMap, 0 + 13*32, 15 ); 02092 RtlSetBits( BitMap, 1 + 14*32, 15 ); 02093 RtlSetBits( BitMap, 2 + 15*32, 15 ); 02094 02095 { 02096 ULONG i; 02097 for (i = 0; i < 16; i++) { 02098 DbgPrint("%2d: %08lx\n", i, BitMap->Buffer[i]); 02099 } 02100 } 02101 02102 if (RtlFindSetBitsAndClear( BitMap, 15, 0) != 0 + 13*32) { 02103 DbgPrint("RtlFindSetBitsAndClear Error 0 + 13*32\n"); 02104 return FALSE; 02105 } 02106 if (RtlFindSetBitsAndClear( BitMap, 15, 0) != 1 + 14*32) { 02107 DbgPrint("RtlFindSetBitsAndClear Error 1 + 14*32\n"); 02108 return FALSE; 02109 } 02110 if (RtlFindSetBitsAndClear( BitMap, 15, 0) != 2 + 15*32) { 02111 DbgPrint("RtlFindSetBitsAndClear Error 2 + 15*32\n"); 02112 return FALSE; 02113 } 02114 02115 if (RtlFindSetBitsAndClear( BitMap, 14, 0) != 0 + 10*32) { 02116 DbgPrint("RtlFindSetBitsAndClear Error 0 + 10*32\n"); 02117 return FALSE; 02118 } 02119 if (RtlFindSetBitsAndClear( BitMap, 14, 0) != 1 + 11*32) { 02120 DbgPrint("RtlFindSetBitsAndClear Error 1 + 11*32\n"); 02121 return FALSE; 02122 } 02123 if (RtlFindSetBitsAndClear( BitMap, 14, 0) != 2 + 12*32) { 02124 DbgPrint("RtlFindSetBitsAndClear Error 2 + 12*32\n"); 02125 return FALSE; 02126 } 02127 02128 if (RtlFindSetBitsAndClear( BitMap, 10, 0) != 0 + 6*32) { 02129 DbgPrint("RtlFindSetBitsAndClear Error 0 + 6*32\n"); 02130 return FALSE; 02131 } 02132 if (RtlFindSetBitsAndClear( BitMap, 10, 0) != 4 + 7*32) { 02133 DbgPrint("RtlFindSetBitsAndClear Error 4 + 7*32\n"); 02134 return FALSE; 02135 } 02136 if (RtlFindSetBitsAndClear( BitMap, 10, 0) != 6 + 8*32) { 02137 DbgPrint("RtlFindSetBitsAndClear Error 6 + 8*32\n"); 02138 return FALSE; 02139 } 02140 if (RtlFindSetBitsAndClear( BitMap, 10, 0) != 7 + 9*32) { 02141 DbgPrint("RtlFindSetBitsAndClear Error 7 + 9*32\n"); 02142 return FALSE; 02143 } 02144 02145 if (RtlFindSetBitsAndClear( BitMap, 9, 0) != 0 + 3*32) { 02146 DbgPrint("RtlFindSetBitsAndClear Error 0 + 3*32\n"); 02147 return FALSE; 02148 } 02149 if (RtlFindSetBitsAndClear( BitMap, 9, 0) != 4 + 4*32) { 02150 DbgPrint("RtlFindSetBitsAndClear Error 4 + 4*32\n"); 02151 return FALSE; 02152 } 02153 if (RtlFindSetBitsAndClear( BitMap, 9, 0) != 7 + 5*32) { 02154 DbgPrint("RtlFindSetBitsAndClear Error 7 + 5*32\n"); 02155 return FALSE; 02156 } 02157 02158 if (RtlFindSetBitsAndClear( BitMap, 1, 0) != 0 + 0*32) { 02159 DbgPrint("RtlFindSetBitsAndClear Error 0 + 0*32\n"); 02160 return FALSE; 02161 } 02162 if (RtlFindSetBitsAndClear( BitMap, 1, 0) != 5 + 1*32) { 02163 DbgPrint("RtlFindSetBitsAndClear Error 5 + 1*32\n"); 02164 return FALSE; 02165 } 02166 if (RtlFindSetBitsAndClear( BitMap, 1, 0) != 7 + 2*32) { 02167 DbgPrint("RtlFindSetBitsAndClear Error 7 + 2*32\n"); 02168 return FALSE; 02169 } 02170 02171 DbgPrint("DoBitMapTest Done.\n"); 02172 02173 return TRUE; 02174 } 02175 02176 BOOLEAN 02177 ExTest ( 02178 VOID 02179 ) 02180 02181 { 02182 02183 USHORT i; 02184 02185 DbgPrint( "In extest\n" ); 02186 for (i=1; i<16; i++) { 02187 if (i == TestEvent) 02188 DoEventTest(); 02189 else 02190 if (i == TestHandle) 02191 DoHandleTest(); 02192 else 02193 if (i == TestInfo) 02194 DoInfoTest(); 02195 else 02196 if (i == TestLuid) { 02197 DoLuidTest(); 02198 } 02199 else 02200 if (i == TestMemory) { 02201 DoMemoryTest(); 02202 } 02203 else 02204 if (i == TestParty) 02205 DoPartyTest(); 02206 else 02207 if (i == TestPool) 02208 DoPoolTest(); 02209 else 02210 if (i == TestResource) 02211 DoResourceTest(); 02212 else 02213 if (i == TestBitMap) 02214 DoBitMapTest(); 02215 else 02216 if (i == TestSemaphore) 02217 DoSemaphoreTest(); 02218 else 02219 if (i == TestTimer) 02220 DoTimerTest(); 02221 else 02222 if (i == TestZone) 02223 DoZoneTest(); 02224 else 02225 if (i == TestMutant) 02226 DoMutantTest(); 02227 else 02228 if (i == TestException) 02229 DoExceptionTest(); 02230 } 02231 02232 TestFunction = NULL; // Invoke the CLI 02233 return TRUE; 02234 } 02235 #ifndef MIPS 02236 02237 int 02238 _CDECL 02239 main( 02240 int argc, 02241 char *argv[] 02242 ) 02243 { 02244 #ifdef SIMULATOR 02245 char c, *s; 02246 USHORT i; 02247 02248 i = 1; 02249 if (argc > 1 ) { 02250 while (--argc) { 02251 s = *++argv; 02252 while ((c = *s++) != '\0') { 02253 switch (c) { 02254 case 'B': 02255 case 'b': 02256 TestBitMap = i++; 02257 break; 02258 02259 case 'C': 02260 case 'c': 02261 TestException = i++; 02262 break; 02263 02264 case 'E': 02265 case 'e': 02266 TestEvent = i++; 02267 break; 02268 02269 case 'H': 02270 case 'h': 02271 TestHandle = i++; 02272 break; 02273 02274 case 'I': 02275 case 'i': 02276 TestInfo = i++; 02277 break; 02278 02279 case 'L': 02280 case 'l': 02281 TestLuid = i++; 02282 break; 02283 02284 case 'M': 02285 case 'm': 02286 TestMemory = i++; 02287 break; 02288 02289 case 'P': 02290 case 'p': 02291 TestPool = i++; 02292 break; 02293 02294 case 'R': 02295 case 'r': 02296 TestResource = i++; 02297 break; 02298 02299 case 'S': 02300 case 's': 02301 TestSemaphore = i++; 02302 break; 02303 02304 case 'T': 02305 case 't': 02306 TestTimer = i++; 02307 break; 02308 02309 case 'X': 02310 case 'x': 02311 TestMutant = i++; 02312 break; 02313 02314 case 'Z': 02315 case 'z': 02316 TestZone = i++; 02317 break; 02318 02319 default: 02320 DbgPrint( "tex: invalid test code - '%s'", *argv ); 02321 break; 02322 } 02323 } 02324 } 02325 } else { 02326 if (!strcmp( "DAVEC", szVerUser )) { 02327 TestEvent = 1; 02328 TestSemaphore = 2; 02329 TestTimer = 3; 02330 TestMutant = 4; 02331 TestException = 5; 02332 } 02333 else 02334 if (!strcmp( "MARKL", szVerUser )) { 02335 TestPool = 1; 02336 TestZone = 2; 02337 } 02338 else 02339 if (!strcmp( "STEVEWO", szVerUser )) { 02340 TestInfo = 1; 02341 TestParty = 2; 02342 TestMemory = 3; 02343 TestHandle = 4; 02344 } 02345 else 02346 if (!strcmp( "GARYKI", szVerUser )) { 02347 TestResource = 1; 02348 TestMemory = 2; 02349 TestBitMap = 3; 02350 } 02351 else 02352 if (!strcmp( "JIMK", szVerUser )) { 02353 TestLuid = 1; 02354 } 02355 else { 02356 DbgPrint( "*** Warning *** - %s is an unauthorized user of tex\n", 02357 szVerUser 02358 ); 02359 } 02360 } 02361 #else 02362 TestEvent = 1; 02363 TestSemaphore = 2; 02364 TestTimer = 3; 02365 TestMutant = 4; 02366 TestException = 5; 02367 #endif // SIMULATOR 02368 02369 TestFunction = extest; 02370 KiSystemStartup(); 02371 return 0; 02372 } 02373 #endif // MIPS 02374 02375 void 02376 oops() 02377 { 02378 ExTimerRundown(); 02379 }

Generated on Sat May 15 19:41:57 2004 for test by doxygen 1.3.7