00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
#include "exp.h"
00022
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
00091
00092
00093
DbgPrint(
" ** Start of Event Test **\n");
00094
00095
00096
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
00321
00322
00323
DbgPrint(
" ** Start of System Service Exception Test **\n");
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
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
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
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
00382
00383
00384
DbgPrint(
" ** Start of Mutant Test **\n");
00385
00386
00387
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
00611
00612
00613
DbgPrint(
" ** Start of Semaphore Test **\n");
00614
00615
00616
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
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
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
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
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
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
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
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
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
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
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
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
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
00841
00842
00843
DbgPrint(
" ** Start of Timer Test **\n");
00844
00845
00846
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
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
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
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
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
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
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
00981
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
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
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
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
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
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, 0
L, 0
L, 0
L, MUTEX_LEVEL_PS_CID_TABLE,
FALSE );
01174 HandleTable4 =
ExCreateHandleTable( (
PEPROCESS)
NULL, 16
L, 8
L, 2
L, 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,4000
L);
01473
DumpPool(
"After 4000 byte Allocation",
NonPagedPool);
01474 p =
ExAllocatePool(
NonPagedPool,2000
L);
01475
DumpPool(
"After 2000 byte Allocation",
NonPagedPool);
01476 p =
ExAllocatePool(
NonPagedPool,2000
L);
01477
DumpPool(
"After 2000 byte Allocation",
NonPagedPool);
01478
01479 p0 =
ExAllocatePool(
NonPagedPool,24
L);
01480
DumpPool(
"After 24 byte Allocation p0",
NonPagedPool);
01481 p1 =
ExAllocatePool(
NonPagedPool,24
L);
01482
DumpPool(
"After 24 byte Allocation p1",
NonPagedPool);
01483 p2 =
ExAllocatePool(
NonPagedPool,24
L);
01484
DumpPool(
"After 24 byte Allocation p2",
NonPagedPool);
01485 p3 =
ExAllocatePool(
NonPagedPool,24
L);
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,120
L);
01498
DumpPool(
"After 120 byte Allocation p0",
NonPagedPool);
01499 p1 =
ExAllocatePool(
NonPagedPool,24
L);
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,2048
L);
01519 p2 =
ExAllocatePool(
NonPagedPool,1024
L);
01520 st =
ExInitializeZone(z,512
L,p1,2048
L);
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,1024
L);
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
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
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
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
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
01798
01799
01800
01801
01802
01803
01804
RtlClearAllBits(
BitMap );
01805
01806
01807
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
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
01858
01859
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
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
01961
01962
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
02037
02038
02039
02040
02041
02042
02043
RtlSetAllBits(
BitMap );
02044
02045
02046
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
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;
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 }