00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
#include "tsecomm.c"
00030
00031
00032
00033
00035
00036
00037
00039
00040
00041 BOOLEAN
00042 TestSeSid()
00043 {
00044
00045
#define TARGET_SID_ARRAY_LENGTH 1024
00046
00047
typedef struct _TALT_SID1 {
00048 ULONG Value[3];
00049 } TALT_SID1;
00050
typedef TALT_SID1 *PTALT_SID1;
00051
00052
NTSTATUS Status;
00053
00054 PVOID Ignore;
00055
00056 PSID TFredSid;
00057 PSID TBarneySid;
00058 PSID TWilmaSid;
00059 PSID TWilmaSubSid;
00060 PSID TNoSubSid;
00061 PSID TTempSid;
00062
00063 PSID_AND_ATTRIBUTES SourceArray;
00064 PSID_AND_ATTRIBUTES TargetArray;
00065 ULONG TargetLength;
00066 ULONG OriginalTargetLength;
00067
00068 ULONG
NormalGroupAttributes;
00069 ULONG
OwnerGroupAttributes;
00070
00071
00072
NormalGroupAttributes = 7;
00073
OwnerGroupAttributes = 15;
00074
00075
00076
00077 TFredSid = (PSID)TstAllocatePool(
PagedPool, 256 );
00078 TBarneySid = (PSID)TstAllocatePool(
PagedPool, 256 );
00079 TWilmaSid = (PSID)TstAllocatePool(
PagedPool, 256 );
00080 TWilmaSubSid = (PSID)TstAllocatePool(
PagedPool, 256 );
00081 TNoSubSid = (PSID)TstAllocatePool(
PagedPool, 256 );
00082 TTempSid = (PSID)TstAllocatePool(
PagedPool, 256 );
00083
00084
00085
00086
00087
00088
00089
if (!
RtlValidSid( TFredSid )) {
00090
DbgPrint(
"**** Failed **** \n");
00091
DbgPrint(
"*Se** Failure: RtlValidSid, TFredSid\n");
00092
return FALSE;
00093 }
00094
00095
if (!
RtlValidSid( TBarneySid )) {
00096
DbgPrint(
"**** Failed **** \n");
00097
DbgPrint(
"*Se** Failure: RtlValidSid, TBarneySid\n");
00098
return FALSE;
00099 }
00100
00101
if (!
RtlValidSid( TWilmaSid )) {
00102
DbgPrint(
"**** Failed **** \n");
00103
DbgPrint(
"*Se** Failure: RtlValidSid, TWilmaSid\n");
00104
return FALSE;
00105 }
00106
00107
if (!
RtlValidSid( TWilmaSubSid )) {
00108
DbgPrint(
"**** Failed **** \n");
00109
DbgPrint(
"*Se** Failure: RtlValidSid, TWilmaSubSid\n");
00110
return FALSE;
00111 }
00112
00113
if (!
RtlValidSid( TNoSubSid )) {
00114
DbgPrint(
"**** Failed **** \n");
00115
DbgPrint(
"*Se** Failure: RtlValidSid, TNoSubSid\n");
00116
return FALSE;
00117 }
00118
00119
00120
00121
00122
00123
00124
if (
RtlEqualSid( TFredSid, TBarneySid )) {
00125
DbgPrint(
"*Se** Failure: RtlEqualSid, TFredSid - TBarneySid\n");
00126
DbgPrint(
"**** Failed **** \n");
00127
return FALSE;
00128 }
00129
00130
if (!
RtlEqualSid( TFredSid, TFredSid )) {
00131
DbgPrint(
"*Se** Failure: RtlEqualSid, TFredSid - TFredSid\n");
00132
return FALSE;
00133 }
00134
00135
if (
RtlEqualSid( TWilmaSid, TWilmaSubSid )) {
00136
DbgPrint(
"**** Failed **** \n");
00137
DbgPrint(
"*Se** Failure: RtlEqualSid, TWilmaSid - TWilmaSubSid\n");
00138
return FALSE;
00139 }
00140
00141
if (
RtlEqualSid( TWilmaSid, TNoSubSid )) {
00142
DbgPrint(
"**** Failed **** \n");
00143
DbgPrint(
"*Se** Failure: RtlEqualSid, TWilmaSid - TNoSubSid\n");
00144
return FALSE;
00145 }
00146
00147
00148
00149
00150
00151
00152
if (
RtlLengthRequiredSid( 0 ) != 8) {
00153
DbgPrint(
"**** Failed **** \n");
00154
DbgPrint(
"*Se** Failure: RtlLengthRequiredSid, 0 SubAuthorities\n");
00155
return FALSE;
00156 }
00157
00158
if (
RtlLengthRequiredSid( 1 ) != 12) {
00159
DbgPrint(
"**** Failed **** \n");
00160
DbgPrint(
"*Se** Failure: RtlLengthRequiredSid, 1 SubAuthorities\n");
00161
return FALSE;
00162 }
00163
00164
if (
RtlLengthRequiredSid( 2 ) != 16) {
00165
DbgPrint(
"**** Failed **** \n");
00166
DbgPrint(
"*Se** Failure: RtlLengthRequiredSid, 2 SubAuthorities\n");
00167
return FALSE;
00168 }
00169
00170
00171
00172
00173
00174
00175
if (
SeLengthSid( TNoSubSid ) != 8) {
00176
DbgPrint(
"**** Failed **** \n");
00177
DbgPrint(
"*Se** Failure: SeLengthSid, TNoSubSid\n");
00178
return FALSE;
00179 }
00180
00181
if (
SeLengthSid( TFredSid ) != 12) {
00182
DbgPrint(
"**** Failed **** \n");
00183
DbgPrint(
"*Se** Failure: SeLengthSid, TFredSid\n");
00184
return FALSE;
00185 }
00186
00187
if (
SeLengthSid( TWilmaSubSid ) != 16) {
00188
DbgPrint(
"**** Failed **** \n");
00189
DbgPrint(
"*Se** Failure: SeLengthSid, TWilmaSubSid\n");
00190
return FALSE;
00191 }
00192
00193
00194
00195
00196
00197
00198
if (
NT_SUCCESS(
RtlCopySid( 7, TTempSid, TNoSubSid ))) {
00199
DbgPrint(
"**** Failed **** \n");
00200
DbgPrint(
"*Se** Failure: RtlCopySid, insufficient TNoSubSid\n");
00201
return FALSE;
00202 }
00203
00204
00205
if (!
NT_SUCCESS(
RtlCopySid( 256, TTempSid, TNoSubSid ))) {
00206
DbgPrint(
"**** Failed **** \n");
00207
DbgPrint(
"*Se** Failure: RtlCopySid, TNoSubSid\n");
00208
return FALSE;
00209 }
00210
00211
if (!
RtlEqualSid( TTempSid, TNoSubSid )) {
00212
DbgPrint(
"**** Failed **** \n");
00213
DbgPrint(
"*Se** Failure: RtlCopySid compare, TNoSubSid\n");
00214
return FALSE;
00215 }
00216
00217
00218
if (
NT_SUCCESS(
RtlCopySid( 11, TTempSid, TBarneySid ))) {
00219
DbgPrint(
"**** Failed **** \n");
00220
DbgPrint(
"*Se** Failure: RtlCopySid, insufficient TBarneySid\n");
00221
return FALSE;
00222 }
00223
00224
00225
if (!
NT_SUCCESS(
RtlCopySid( 256, TTempSid, TBarneySid ))) {
00226
DbgPrint(
"**** Failed **** \n");
00227
DbgPrint(
"*Se** Failure: RtlCopySid, TBarneySid\n");
00228
return FALSE;
00229 }
00230
00231
if (!
RtlEqualSid( TTempSid, TBarneySid )) {
00232
DbgPrint(
"**** Failed **** \n");
00233
DbgPrint(
"*Se** Failure: RtlCopySid compare, TBarneySid\n");
00234
return FALSE;
00235 }
00236
00237
if (
NT_SUCCESS(
RtlCopySid( 15, TTempSid, TWilmaSubSid ))) {
00238
DbgPrint(
"**** Failed **** \n");
00239
DbgPrint(
"*Se** Failure: RtlCopySid, insufficient TWilmaSubSid\n");
00240
return FALSE;
00241 }
00242
00243
if (!
NT_SUCCESS(
RtlCopySid( 256, TTempSid, TWilmaSubSid ))) {
00244
DbgPrint(
"**** Failed **** \n");
00245
DbgPrint(
"*Se** Failure: RtlCopySid, TNoSubSid\n");
00246
return FALSE;
00247 }
00248
00249
if (!
RtlEqualSid( TTempSid, TWilmaSubSid )) {
00250
DbgPrint(
"**** Failed **** \n");
00251
DbgPrint(
"*Se** Failure: RtlCopySid compare, TWilmaSubSid\n");
00252
return FALSE;
00253 }
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
if (!
RtlValidSid(
BedrockDomainSid )) {
00266
DbgPrint(
"**** Failed **** \n");
00267
DbgPrint(
"*Se** Failure: RtlValidSid, BedrockDomainSid\n");
00268
return FALSE;
00269 }
00270
00271
if (!
RtlValidSid(
FredSid )) {
00272
DbgPrint(
"**** Failed **** \n");
00273
DbgPrint(
"*Se** Failure: RtlValidSid, FredSid\n");
00274
return FALSE;
00275 }
00276
00277
if (!
RtlValidSid(
WilmaSid )) {
00278
DbgPrint(
"**** Failed **** \n");
00279
DbgPrint(
"*Se** Failure: RtlValidSid, WilmaSid\n");
00280
return FALSE;
00281 }
00282
00283
if (!
RtlValidSid(
PebblesSid )) {
00284
DbgPrint(
"**** Failed **** \n");
00285
DbgPrint(
"*Se** Failure: RtlValidSid, PebblesSid\n");
00286
return FALSE;
00287 }
00288
00289
if (!
RtlValidSid(
DinoSid )) {
00290
DbgPrint(
"**** Failed **** \n");
00291
DbgPrint(
"*Se** Failure: RtlValidSid, DinoSid\n");
00292
return FALSE;
00293 }
00294
00295
if (!
RtlValidSid(
BarneySid )) {
00296
DbgPrint(
"**** Failed **** \n");
00297
DbgPrint(
"*Se** Failure: RtlValidSid, BarneySid\n");
00298
return FALSE;
00299 }
00300
00301
if (!
RtlValidSid(
BettySid )) {
00302
DbgPrint(
"**** Failed **** \n");
00303
DbgPrint(
"*Se** Failure: RtlValidSid, BettySid\n");
00304
return FALSE;
00305 }
00306
00307
if (!
RtlValidSid(
BambamSid )) {
00308
DbgPrint(
"**** Failed **** \n");
00309
DbgPrint(
"*Se** Failure: RtlValidSid, BambamSid\n");
00310
return FALSE;
00311 }
00312
00313
if (!
RtlValidSid(
FlintstoneSid )) {
00314
DbgPrint(
"**** Failed **** \n");
00315
DbgPrint(
"*Se** Failure: RtlValidSid, FlintstoneSid\n");
00316
return FALSE;
00317 }
00318
00319
if (!
RtlValidSid(
RubbleSid )) {
00320
DbgPrint(
"**** Failed **** \n");
00321
DbgPrint(
"*Se** Failure: RtlValidSid, RubbleSid\n");
00322
return FALSE;
00323 }
00324
00325
if (!
RtlValidSid(
AdultSid )) {
00326
DbgPrint(
"**** Failed **** \n");
00327
DbgPrint(
"*Se** Failure: RtlValidSid, AdultSid\n");
00328
return FALSE;
00329 }
00330
00331
if (!
RtlValidSid(
ChildSid )) {
00332
DbgPrint(
"**** Failed **** \n");
00333
DbgPrint(
"*Se** Failure: RtlValidSid, ChildSid\n");
00334
return FALSE;
00335 }
00336
00337
if (!
RtlValidSid(
NeandertholSid )) {
00338
DbgPrint(
"**** Failed **** \n");
00339
DbgPrint(
"*Se** Failure: RtlValidSid, NeandertholSid\n");
00340
return FALSE;
00341 }
00342
00343
00344
00345
00346
00347
if (!
RtlValidSid(
NullSid )) {
00348
DbgPrint(
"**** Failed **** \n");
00349
DbgPrint(
"*Se** Failure: RtlValidSid, NullSid\n");
00350
return FALSE;
00351 }
00352
00353
if (!
RtlValidSid(
WorldSid )) {
00354
DbgPrint(
"**** Failed **** \n");
00355
DbgPrint(
"*Se** Failure: RtlValidSid, WorldSid\n");
00356
return FALSE;
00357 }
00358
00359
if (!
RtlValidSid(
LocalSid )) {
00360
DbgPrint(
"**** Failed **** \n");
00361
DbgPrint(
"*Se** Failure: RtlValidSid, CreatorSid\n");
00362
return FALSE;
00363 }
00364
00365
if (!
RtlValidSid(
NtAuthoritySid )) {
00366
DbgPrint(
"**** Failed **** \n");
00367
DbgPrint(
"*Se** Failure: RtlValidSid, NtAuthoritySid\n");
00368
return FALSE;
00369 }
00370
00371
if (!
RtlValidSid(
DialupSid )) {
00372
DbgPrint(
"**** Failed **** \n");
00373
DbgPrint(
"*Se** Failure: RtlValidSid, DialupSid\n");
00374
return FALSE;
00375 }
00376
00377
if (!
RtlValidSid(
NetworkSid )) {
00378
DbgPrint(
"**** Failed **** \n");
00379
DbgPrint(
"*Se** Failure: RtlValidSid, NetworkSid\n");
00380
return FALSE;
00381 }
00382
00383
if (!
RtlValidSid(
BatchSid )) {
00384
DbgPrint(
"**** Failed **** \n");
00385
DbgPrint(
"*Se** Failure: RtlValidSid, BatchSid\n");
00386
return FALSE;
00387 }
00388
00389
if (!
RtlValidSid(
InteractiveSid )) {
00390
DbgPrint(
"**** Failed **** \n");
00391
DbgPrint(
"*Se** Failure: RtlValidSid, InteractiveSid\n");
00392
return FALSE;
00393 }
00394
00395
00396
if (!
RtlValidSid(
LocalSystemSid )) {
00397
DbgPrint(
"**** Failed **** \n");
00398
DbgPrint(
"*Se** Failure: RtlValidSid, LocalSystemSid\n");
00399
return FALSE;
00400 }
00401
00402
00403
00404
00405
00406
00407
00408
00409 SourceArray = (PSID_AND_ATTRIBUTES)TstAllocatePool(
PagedPool, 100 );
00410 TargetArray = (PSID_AND_ATTRIBUTES)TstAllocatePool(
PagedPool,
00411
TARGET_SID_ARRAY_LENGTH
00412 );
00413 TargetLength =
TARGET_SID_ARRAY_LENGTH - (5 *
sizeof(PSID_AND_ATTRIBUTES));
00414 OriginalTargetLength = TargetLength;
00415
00416 SourceArray[0].Sid = &
PebblesSid;
00417 SourceArray[0].Attributes = 0;
00418 SourceArray[1].Sid = &
FlintstoneSid;
00419 SourceArray[1].Attributes =
OwnerGroupAttributes;
00420 SourceArray[2].Sid = &
ChildSid;
00421 SourceArray[2].Attributes =
NormalGroupAttributes;
00422 SourceArray[3].Sid = &
NeandertholSid;
00423 SourceArray[3].Attributes =
NormalGroupAttributes;
00424 SourceArray[4].Sid = &
WorldSid;
00425 SourceArray[4].Attributes =
NormalGroupAttributes;
00426
00427
Status =
RtlCopySidAndAttributesArray(
00428 0,
00429 SourceArray,
00430 TargetLength,
00431 TargetArray,
00432 &(TargetArray[5]),
00433 &(PSID)Ignore,
00434 &TargetLength
00435 );
00436
00437
if (!
NT_SUCCESS(
Status) || TargetLength != OriginalTargetLength ) {
00438
DbgPrint(
"**** Failed **** \n");
00439
DbgPrint(
"*Se** Failure: RtLCopySidAndAttributesArray, Zero length.\n");
00440
return FALSE;
00441 }
00442
00443
00444
00445
Status =
RtlCopySidAndAttributesArray(
00446 1,
00447 SourceArray,
00448 1,
00449 TargetArray,
00450 &(TargetArray[1]),
00451 &(PSID)Ignore,
00452 &TargetLength
00453 );
00454
00455
if (
NT_SUCCESS(
Status)) {
00456
DbgPrint(
"**** Failed **** \n");
00457
DbgPrint(
"*Se** Failure: RtLCopySidAndAttributesArray,\n");
00458
DbgPrint(
"*Se** Buffer Too Short Test.\n");
00459
return FALSE;
00460 }
00461
00462
00463 TargetLength =
TARGET_SID_ARRAY_LENGTH - (5 *
sizeof(PSID_AND_ATTRIBUTES));
00464 OriginalTargetLength = TargetLength;
00465
00466
Status =
RtlCopySidAndAttributesArray(
00467 5,
00468 SourceArray,
00469 TargetLength,
00470 TargetArray,
00471 &(TargetArray[5]),
00472 &(PSID)Ignore,
00473 &TargetLength
00474 );
00475
00476
if (!
NT_SUCCESS(
Status) ||
00477 !
RtlEqualSid( SourceArray[0].Sid, TargetArray[0].Sid ) ||
00478 !
RtlEqualSid( SourceArray[1].Sid, TargetArray[1].Sid ) ||
00479 !
RtlEqualSid( SourceArray[2].Sid, TargetArray[2].Sid ) ||
00480 !
RtlEqualSid( SourceArray[3].Sid, TargetArray[3].Sid ) ||
00481 !
RtlEqualSid( SourceArray[4].Sid, TargetArray[4].Sid ) ||
00482 ( SourceArray[0].Attributes != TargetArray[0].Attributes ) ||
00483 ( SourceArray[1].Attributes != TargetArray[1].Attributes ) ||
00484 ( SourceArray[2].Attributes != TargetArray[2].Attributes ) ||
00485 ( SourceArray[3].Attributes != TargetArray[3].Attributes ) ||
00486 ( SourceArray[4].Attributes != TargetArray[4].Attributes ) ) {
00487
00488
DbgPrint(
"**** Failed **** \n");
00489
DbgPrint(
"*Se** Failure: RtLCopySidAndAttributesArray,\n");
00490
DbgPrint(
"*Se** Valid copy of 5 SIDs test.\n");
00491
return FALSE;
00492 }
00493
00494
00495
00496
return TRUE;
00497
00498
00499 }
00500
00501
00502 BOOLEAN
00503 TestSeSecurityDescriptor()
00504 {
00505
NTSTATUS Status;
00506 PSECURITY_DESCRIPTOR TFredDescriptor;
00507 PSECURITY_DESCRIPTOR TBarneyDescriptor;
00508 PSECURITY_DESCRIPTOR TWilmaDescriptor;
00509
00510 PSECURITY_DESCRIPTOR TTempDescriptor;
00511
00512 SECURITY_DESCRIPTOR_CONTROL Control;
00513 ULONG Revision;
00514
00515 PACL
TDacl;
00516 BOOLEAN
TDaclPresent;
00517 BOOLEAN
TDaclDefaulted;
00518
00519 PACL
TSacl;
00520 BOOLEAN
TSaclPresent;
00521 BOOLEAN
TSaclDefaulted;
00522
00523 PSID
TOwner;
00524 BOOLEAN
TOwnerDefaulted;
00525 PSID
TGroup;
00526 BOOLEAN
TGroupDefaulted;
00527
00528
00529 PSID TFredSid;
00530 PSID TBarneySid;
00531 PSID TWilmaSid;
00532 PSID TWilmaSubSid;
00533 PSID TNoSubSid;
00534 PSID TTempSid;
00535
00536
00537 TFredDescriptor = (PSECURITY_DESCRIPTOR)TstAllocatePool(
PagedPool, 1024 );
00538 TBarneyDescriptor = (PSECURITY_DESCRIPTOR)TstAllocatePool(
PagedPool, 1024 );
00539 TWilmaDescriptor = (PSECURITY_DESCRIPTOR)TstAllocatePool(
PagedPool, 1024 );
00540 TTempDescriptor = (PSECURITY_DESCRIPTOR)TstAllocatePool(
PagedPool, 1024 );
00541
00542
00543 TFredSid = (PSID)TstAllocatePool(
PagedPool, 256 );
00544 TBarneySid = (PSID)TstAllocatePool(
PagedPool, 256 );
00545 TWilmaSid = (PSID)TstAllocatePool(
PagedPool, 256 );
00546 TWilmaSubSid = (PSID)TstAllocatePool(
PagedPool, 256 );
00547 TNoSubSid = (PSID)TstAllocatePool(
PagedPool, 256 );
00548 TTempSid = (PSID)TstAllocatePool(
PagedPool, 256 );
00549
00550
00551
00552
00553
00554
TDacl = (PACL)TstAllocatePool(
PagedPool, 256 );
00555
TSacl = (PACL)TstAllocatePool(
PagedPool, 256 );
00556
00557
TDacl->AclRevision=
TSacl->AclRevision=ACL_REVISION;
00558
TDacl->Sbz1=
TSacl->Sbz1=0;
00559
TDacl->Sbz2=
TSacl->Sbz2=0;
00560
TDacl->AclSize=256;
00561
TSacl->AclSize=8;
00562
TDacl->AceCount=
TSacl->AceCount=0;
00563
00564
00565
00566
00567
00568
00569
if (
NT_SUCCESS(
RtlCreateSecurityDescriptor( TTempDescriptor, 0 ))) {
00570
DbgPrint(
"**** Failed **** \n");
00571
DbgPrint(
"*Se** Failure: RtlCreateSecurityDescriptor, Rev=0\n");
00572
return FALSE;
00573 }
00574
00575
if (
NT_SUCCESS(
RtlCreateSecurityDescriptor( TTempDescriptor, 2 ))) {
00576
DbgPrint(
"**** Failed **** \n");
00577
DbgPrint(
"*Se** Failure: RtlCreateSecurityDescriptor, Rev=2\n");
00578
return FALSE;
00579 }
00580
00581
if (!
NT_SUCCESS(
RtlCreateSecurityDescriptor( TTempDescriptor, 1 ))) {
00582
DbgPrint(
"**** Failed **** \n");
00583
DbgPrint(
"*Se** Failure: RtlCreateSecurityDescriptor, Rev=1\n");
00584
return FALSE;
00585 }
00586
00587
#ifdef NOT_YET_DEBUGGED
00588
00589
00590
00591
00592
if (!
NT_SUCCESS(
RtlGetControlSecurityDescriptor( TTempDescriptor,
00593 &Control,
00594 &Revision))) {
00595
DbgPrint(
"**** Failed **** \n");
00596
DbgPrint(
"*Se** Failure: RtlGetControlSecurityDescriptor\n");
00597
DbgPrint(
"*Se** Call failed. Status = 0x%lx\n",
Status);
00598
return FALSE;
00599 }
00600
00601
if ( (Control != 0) || (Revision != 1) ) {
00602
DbgPrint(
"**** Failed **** \n");
00603
DbgPrint(
"*Se** Failure: RtlGetControlSecurityDescriptor\n");
00604
DbgPrint(
"*Se** Bad Control or Revision value. \n");
00605
DbgPrint(
"*Se** Status = 0x%lx\n",
Status);
00606
DbgPrint(
"*Se** Returned Revision = 0x%lx\n",Revision );
00607
DbgPrint(
"*Se** Returned Control = 0x%lx\n", (ULONG)Control);
00608
return FALSE;
00609 }
00610
#else
00611
DBG_UNREFERENCED_LOCAL_VARIABLE(
Status );
00612 DBG_UNREFERENCED_LOCAL_VARIABLE( Revision );
00613 DBG_UNREFERENCED_LOCAL_VARIABLE( Control );
00614
#endif //NOT_YET_DEFINED
00615
00616
if (!
NT_SUCCESS(
RtlGetDaclSecurityDescriptor( TTempDescriptor,
00617 &
TDaclPresent,
00618 &
TDacl,
00619 &
TDaclDefaulted))) {
00620
DbgPrint(
"**** Failed **** \n");
00621
DbgPrint(
"*Se** Failure: RtlGetDaclSecurityDescriptor, Empty\n");
00622
return FALSE;
00623 }
00624
00625
if (
TDaclPresent) {
00626
DbgPrint(
"**** Failed **** \n");
00627
DbgPrint(
"*Se** Failure: RtlGetDaclSecurityDescriptor, Empty-TDaclPresent\n");
00628
return FALSE;
00629 }
00630
00631
if (!
NT_SUCCESS(
RtlGetSaclSecurityDescriptor( TTempDescriptor,
00632 &
TSaclPresent,
00633 &
TSacl,
00634 &
TSaclDefaulted))) {
00635
DbgPrint(
"**** Failed **** \n");
00636
DbgPrint(
"*Se** Failure: RtlGetSaclSecurityDescriptor, Empty\n");
00637
return FALSE;
00638 }
00639
00640
if (
TSaclPresent) {
00641
DbgPrint(
"**** Failed **** \n");
00642
DbgPrint(
"*Se** Failure: RtlGetSaclSecurityDescriptor, Empty-TSaclPresent\n");
00643
return FALSE;
00644 }
00645
00646
if (!
NT_SUCCESS(
RtlGetOwnerSecurityDescriptor( TTempDescriptor,
00647 &
TOwner,
00648 &
TOwnerDefaulted))) {
00649
DbgPrint(
"**** Failed **** \n");
00650
DbgPrint(
"*Se** Failure: RtlGetOwnerSecurityDescriptor, Empty\n");
00651
return FALSE;
00652 }
00653
00654
if (
TOwner !=
NULL) {
00655
DbgPrint(
"**** Failed **** \n");
00656
DbgPrint(
"*Se** Failure: RtlGetOwnerSecurityDescriptor, Empty-TOwner\n");
00657
return FALSE;
00658 }
00659
00660
if (!
NT_SUCCESS(
RtlGetGroupSecurityDescriptor( TTempDescriptor,
00661 &
TGroup,
00662 &
TGroupDefaulted))) {
00663
DbgPrint(
"**** Failed **** \n");
00664
DbgPrint(
"*Se** Failure: RtlGetGroupSecurityDescriptor, Empty\n");
00665
return FALSE;
00666 }
00667
00668
if (
TGroup !=
NULL) {
00669
DbgPrint(
"**** Failed **** \n");
00670
DbgPrint(
"*Se** Failure: RtlGetGroupSecurityDescriptor, Empty-TGroup\n");
00671
return FALSE;
00672 }
00673
00674
00675
00676
00677
00678 ((SECURITY_DESCRIPTOR *)TTempDescriptor)->Revision=0;
00679
if (
RtlValidSecurityDescriptor( TTempDescriptor )) {
00680
DbgPrint(
"**** Failed **** \n");
00681
DbgPrint(
"*Se** Failure: RtlValidSecurityDescriptor, Rev=0\n");
00682
return FALSE;
00683 }
00684 ((SECURITY_DESCRIPTOR *)TTempDescriptor)->Revision=1;
00685
00686
if (!
RtlValidSecurityDescriptor( TTempDescriptor )) {
00687
DbgPrint(
"**** Failed **** \n");
00688
DbgPrint(
"*Se** Failure: RtlValidSecurityDescriptor, Empty\n");
00689
return FALSE;
00690 }
00691
00692
00693
00694
00695
00696
00697
if (
RtlLengthSecurityDescriptor( TTempDescriptor ) != 20) {
00698
DbgPrint(
"**** Failed **** \n");
00699
DbgPrint(
"*Se** Failure: RtlLengthSecurityDescriptor, Empty\n");
00700
return FALSE;
00701 }
00702
00703
00704
00705
00706
00707
if (!
NT_SUCCESS(
RtlSetOwnerSecurityDescriptor( TTempDescriptor, TWilmaSid,
FALSE ))) {
00708
DbgPrint(
"**** Failed **** \n");
00709
DbgPrint(
"*Se** Failure: RtlSetOwnerSecurityDescriptor, TWilmaSid\n");
00710
return FALSE;
00711 }
00712
if (
RtlLengthSecurityDescriptor( TTempDescriptor ) != 32) {
00713
DbgPrint(
"**** Failed **** \n");
00714
DbgPrint(
"*Se** Failure: RtlLengthSecurityDescriptor, Wilma Owner\n");
00715
return FALSE;
00716 }
00717
00718
00719
00720
00721
00722
if (!
NT_SUCCESS(
RtlSetDaclSecurityDescriptor( TTempDescriptor,
TRUE,
00723
TDacl,
FALSE ))) {
00724
DbgPrint(
"**** Failed **** \n");
00725
DbgPrint(
"*Se** Failure: RtlSetDaclSecurityDescriptor, TDacl\n");
00726
return FALSE;
00727 }
00728
if (
RtlLengthSecurityDescriptor( TTempDescriptor ) != 40) {
00729
DbgPrint(
"**** Failed **** \n");
00730
DbgPrint(
"*Se** Failure: RtlLengthSecurityDescriptor, TDacl Dacl\n");
00731
return FALSE;
00732 }
00733
00734
00735
00736
00737
00738
if (!
NT_SUCCESS(
RtlSetSaclSecurityDescriptor( TTempDescriptor,
TRUE,
00739
TSacl,
FALSE ))) {
00740
DbgPrint(
"**** Failed **** \n");
00741
DbgPrint(
"*Se** Failure: RtlSetSaclSecurityDescriptor, TSacl\n");
00742
return FALSE;
00743 }
00744
if (
RtlLengthSecurityDescriptor( TTempDescriptor ) != 48) {
00745
DbgPrint(
"**** Failed **** \n");
00746
DbgPrint(
"*Se** Failure: RtlLengthSecurityDescriptor, TSacl Sacl\n");
00747
return FALSE;
00748 }
00749
00750
00751
00752
00753
00754
if (!
NT_SUCCESS(
RtlSetGroupSecurityDescriptor( TTempDescriptor, TWilmaSubSid,
FALSE ))) {
00755
DbgPrint(
"**** Failed **** \n");
00756
DbgPrint(
"*Se** Failure: RtlSetGroupSecurityDescriptor, TWilmaSubSid\n");
00757
return FALSE;
00758 }
00759
if (
RtlLengthSecurityDescriptor( TTempDescriptor ) != 64) {
00760
DbgPrint(
"**** Failed **** \n");
00761
DbgPrint(
"*Se** Failure: RtlLengthSecurityDescriptor, WilmaSub Group\n");
00762
return FALSE;
00763 }
00764
00765
00766
return TRUE;
00767
00768 }
00769
00770
00771 BOOLEAN
00772 TestSeAccessMask()
00773 {
00774
return TRUE;
00775 }
00776
00777
00778
00779
00780
VOID
00781 DumpAclSizeInfo(PACL_SIZE_INFORMATION AclSizeInfo)
00782 {
00783
DbgPrint(
"\n");
00784
DbgPrint(
"Acl size info:\n");
00785
DbgPrint(
"AceCount = %d\n",AclSizeInfo->AceCount);
00786
DbgPrint(
"AclBytesInUse = %d\n",AclSizeInfo->AclBytesInUse);
00787
DbgPrint(
"AclBytesFree = %d\n",AclSizeInfo->AclBytesFree);
00788
return;
00789 }
00790
00791 #define NUM_ACE 6
00792
00793 typedef struct _SIMPLE_ACE {
00794 ACE_HEADER
Header;
00795 ACCESS_MASK
Mask;
00796 SID
Sid;
00797 }
SIMPLE_ACE, *
PSIMPLE_ACE;
00798
00799
00800 BOOLEAN
00801 TestSeAclRtl()
00802 {
00803
00804 PACL
TDacl;
00805
NTSTATUS Status;
00806
00807 ACL_REVISION_INFORMATION AclInformation;
00808 ACL_REVISION_INFORMATION AclInformationOut;
00809
00810 ACL_SIZE_INFORMATION AclSizeInfo;
00811
00812 PVOID AceList;
00813 PVOID Ace;
00814
00815 ULONG AceSize;
00816
00817
00818
00819
00820
00821
00822
00823
00824
00825
00826
00827
00828
00829
#define DEAD_AUTHORITY {0,0,0,0,212,127}
00830
#define DEAD_SUBAUTHORITY_0 0x00000017L
00831
#define DEAD_SUBAUTHORITY_1 0x00000012L
00832
#define DEAD_SUBAUTHORITY_2 0x00000002L
00833
00834
#define BOBBY_RID 0x00000002
00835
#define JERRY_RID 0x00000003
00836
#define PHIL_RID 0x00000004
00837
#define KREUTZMAN_RID 0x00000005
00838
#define BRENT_RID 0x00000006
00839
#define MICKY_RID 0x00000007
00840
00841 PSID DeadDomainSid;
00842
00843 PSID BobbySid;
00844 PSID JerrySid;
00845 PSID PhilSid;
00846 PSID KreutzmanSid;
00847 PSID BrentSid;
00848 PSID MickySid;
00849
00850 ULONG SidWithZeroSubAuthorities;
00851 ULONG SidWithOneSubAuthority;
00852 ULONG SidWithThreeSubAuthorities;
00853 ULONG SidWithFourSubAuthorities;
00854
00855 SID_IDENTIFIER_AUTHORITY DeadAuthority =
DEAD_AUTHORITY;
00856
00857
00858
00859
00860
00861
00862 SidWithZeroSubAuthorities =
RtlLengthRequiredSid( 0 );
00863 SidWithOneSubAuthority =
RtlLengthRequiredSid( 1 );
00864 SidWithThreeSubAuthorities =
RtlLengthRequiredSid( 3 );
00865 SidWithFourSubAuthorities =
RtlLengthRequiredSid( 4 );
00866
00867 DeadDomainSid = (PSID)TstAllocatePool(
PagedPool,SidWithThreeSubAuthorities);
00868
00869 BobbySid = (PSID)TstAllocatePool(
PagedPool,SidWithFourSubAuthorities);
00870 JerrySid = (PSID)TstAllocatePool(
PagedPool,SidWithFourSubAuthorities);
00871 PhilSid = (PSID)TstAllocatePool(
PagedPool,SidWithFourSubAuthorities);
00872 KreutzmanSid = (PSID)TstAllocatePool(
PagedPool,SidWithFourSubAuthorities);
00873
00874 BrentSid = (PSID)TstAllocatePool(
PagedPool,SidWithFourSubAuthorities);
00875 MickySid = (PSID)TstAllocatePool(
PagedPool,SidWithFourSubAuthorities);
00876
00877
RtlInitializeSid( DeadDomainSid, &DeadAuthority, 3 );
00878 *(
RtlSubAuthoritySid( DeadDomainSid, 0)) =
DEAD_SUBAUTHORITY_0;
00879 *(
RtlSubAuthoritySid( DeadDomainSid, 1)) =
DEAD_SUBAUTHORITY_1;
00880 *(
RtlSubAuthoritySid( DeadDomainSid, 2)) =
DEAD_SUBAUTHORITY_2;
00881
00882
RtlCopySid( SidWithFourSubAuthorities, BobbySid, DeadDomainSid);
00883 *(
RtlSubAuthorityCountSid( BobbySid )) += 1;
00884 *(
RtlSubAuthoritySid( BobbySid, 3)) =
BOBBY_RID;
00885
00886
RtlCopySid( SidWithFourSubAuthorities, JerrySid, DeadDomainSid);
00887 *(
RtlSubAuthorityCountSid( JerrySid )) += 1;
00888 *(
RtlSubAuthoritySid( JerrySid, 3)) =
JERRY_RID;
00889
00890
RtlCopySid( SidWithFourSubAuthorities, PhilSid, DeadDomainSid);
00891 *(
RtlSubAuthorityCountSid( PhilSid )) += 1;
00892 *(
RtlSubAuthoritySid( PhilSid, 3)) =
PHIL_RID;
00893
00894
RtlCopySid( SidWithFourSubAuthorities, KreutzmanSid, DeadDomainSid);
00895 *(
RtlSubAuthorityCountSid( KreutzmanSid )) += 1;
00896 *(
RtlSubAuthoritySid( KreutzmanSid, 3)) =
KREUTZMAN_RID;
00897
00898
RtlCopySid( SidWithFourSubAuthorities, BrentSid, DeadDomainSid);
00899 *(
RtlSubAuthorityCountSid( BrentSid )) += 1;
00900 *(
RtlSubAuthoritySid( BrentSid, 3)) =
BRENT_RID;
00901
00902
RtlCopySid( SidWithFourSubAuthorities, MickySid, DeadDomainSid);
00903 *(
RtlSubAuthorityCountSid( MickySid )) += 1;
00904 *(
RtlSubAuthoritySid( MickySid, 3)) =
MICKY_RID;
00905
00906
TDacl = (PACL)TstAllocatePool(
PagedPool, 256 );
00907
00908
00909
00910
if (!
NT_SUCCESS(
Status =
RtlCreateAcl(
TDacl, 256, ACL_REVISION ))) {
00911
DbgPrint(
"**** Failed **** \n");
00912
DbgPrint(
"RtlCreateAcl returned %X \n",
Status);
00913
return(
FALSE);
00914 }
00915
00916
00917
00918
if (!
NT_SUCCESS(
Status =
RtlValidAcl(
TDacl ) )) {
00919
DbgPrint(
"**** Failed **** \n");
00920
DbgPrint(
"RtlValidAcl returned %X \n",
Status);
00921
return(
FALSE);
00922 }
00923
00924
00925
00926 AclInformation.AclRevision = ACL_REVISION;
00927
00928
if (!
NT_SUCCESS(
Status =
RtlSetInformationAcl(
TDacl, &AclInformation,
00929
sizeof(AclInformation), AclRevisionInformation ) )) {
00930
DbgPrint(
"**** Failed **** \n");
00931
DbgPrint(
"RtlSetInformation returned %X \n",
Status);
00932
return(
FALSE);
00933 }
00934
00935
if (!
NT_SUCCESS(
Status =
RtlQueryInformationAcl(
TDacl, (PVOID)&AclInformationOut,
00936
sizeof(AclInformationOut), AclRevisionInformation ) )) {
00937
DbgPrint(
"**** Failed **** \n");
00938
DbgPrint(
"RtlQueryInformation returned %X during revision query \n",
Status);
00939
return(
FALSE);
00940 }
00941
00942
if (AclInformationOut.AclRevision != ACL_REVISION) {
00943
DbgPrint(
"**** Failed **** \n");
00944
DbgPrint(
"RtlQueryInformation returned incorrect revision \n");
00945
return(
FALSE);
00946 }
00947
00948
if (!
NT_SUCCESS(
Status =
RtlQueryInformationAcl(
TDacl, (PVOID)&AclSizeInfo,
00949
sizeof(AclSizeInfo), AclSizeInformation ) )) {
00950
DbgPrint(
"**** Failed **** \n");
00951
DbgPrint(
"RtlQueryInformation returned %X during size query \n",
Status);
00952
return(
FALSE);
00953 }
00954
00955
00956
00957 AceSize = 6 * SidWithFourSubAuthorities + 1 * SidWithThreeSubAuthorities
00958 + 7 * (
sizeof( ACE_HEADER ) +
sizeof( ACCESS_MASK ));
00959
00960 AceList = (PVOID)TstAllocatePool(
PagedPool, AceSize);
00961
00962 Ace = AceList;
00963
00964 ((
PSIMPLE_ACE)Ace)->Header.AceType = ACCESS_ALLOWED_ACE_TYPE;
00965 ((
PSIMPLE_ACE)Ace)->Header.AceSize = (
USHORT)SidWithThreeSubAuthorities +
00966 (
USHORT)
sizeof(ACE_HEADER) + (
USHORT)
sizeof( ACCESS_MASK );
00967 ((
PSIMPLE_ACE)Ace)->Header.AceFlags = OBJECT_INHERIT_ACE;
00968 ((
PSIMPLE_ACE)Ace)->Mask = DELETE;
00969
RtlCopySid(SidWithThreeSubAuthorities,&((
PSIMPLE_ACE)Ace)->Sid,DeadDomainSid);
00970
00971 (ULONG)Ace += ((
PSIMPLE_ACE)Ace)->
Header.AceSize;
00972
00973 ((
PSIMPLE_ACE)Ace)->Header.AceType = ACCESS_ALLOWED_ACE_TYPE;
00974 ((
PSIMPLE_ACE)Ace)->Header.AceSize = (
USHORT)SidWithFourSubAuthorities +
00975 (
USHORT)
sizeof(ACE_HEADER) + (
USHORT)
sizeof( ACCESS_MASK );
00976 ((
PSIMPLE_ACE)Ace)->Header.AceFlags = OBJECT_INHERIT_ACE;
00977 ((
PSIMPLE_ACE)Ace)->Mask = DELETE;
00978
RtlCopySid(SidWithFourSubAuthorities,&((
PSIMPLE_ACE)Ace)->Sid,BobbySid);
00979
00980 (ULONG)Ace += ((
PSIMPLE_ACE)Ace)->
Header.AceSize;
00981
00982 ((
PSIMPLE_ACE)Ace)->Header.AceType = ACCESS_ALLOWED_ACE_TYPE;
00983 ((
PSIMPLE_ACE)Ace)->Header.AceSize = (
USHORT)SidWithFourSubAuthorities +
00984 (
USHORT)
sizeof(ACE_HEADER) + (
USHORT)
sizeof( ACCESS_MASK );
00985 ((
PSIMPLE_ACE)Ace)->Header.AceFlags = OBJECT_INHERIT_ACE;
00986 ((
PSIMPLE_ACE)Ace)->Mask = DELETE;
00987
RtlCopySid(SidWithFourSubAuthorities,&((
PSIMPLE_ACE)Ace)->Sid,JerrySid);
00988
00989 (ULONG)Ace += ((
PSIMPLE_ACE)Ace)->
Header.AceSize;
00990
00991 ((
PSIMPLE_ACE)Ace)->Header.AceType = ACCESS_ALLOWED_ACE_TYPE;
00992 ((
PSIMPLE_ACE)Ace)->Header.AceSize = (
USHORT)SidWithFourSubAuthorities +
00993 (
USHORT)
sizeof(ACE_HEADER) + (
USHORT)
sizeof( ACCESS_MASK );
00994 ((
PSIMPLE_ACE)Ace)->Header.AceFlags = OBJECT_INHERIT_ACE;
00995 ((
PSIMPLE_ACE)Ace)->Mask = DELETE;
00996
RtlCopySid(SidWithFourSubAuthorities,&((
PSIMPLE_ACE)Ace)->Sid,PhilSid);
00997
00998 (ULONG)Ace += ((
PSIMPLE_ACE)Ace)->
Header.AceSize;
00999
01000 ((
PSIMPLE_ACE)Ace)->Header.AceType = ACCESS_ALLOWED_ACE_TYPE;
01001 ((
PSIMPLE_ACE)Ace)->Header.AceSize = (
USHORT)SidWithFourSubAuthorities +
01002 (
USHORT)
sizeof(ACE_HEADER) + (
USHORT)
sizeof( ACCESS_MASK );
01003 ((
PSIMPLE_ACE)Ace)->Header.AceFlags = OBJECT_INHERIT_ACE;
01004 ((
PSIMPLE_ACE)Ace)->Mask = DELETE;
01005
RtlCopySid(SidWithFourSubAuthorities,&((
PSIMPLE_ACE)Ace)->Sid,KreutzmanSid);
01006
01007 (ULONG)Ace += ((
PSIMPLE_ACE)Ace)->
Header.AceSize;
01008
01009 ((
PSIMPLE_ACE)Ace)->Header.AceType = ACCESS_ALLOWED_ACE_TYPE;
01010 ((
PSIMPLE_ACE)Ace)->Header.AceSize = (
USHORT)SidWithFourSubAuthorities +
01011 (
USHORT)
sizeof(ACE_HEADER) + (
USHORT)
sizeof( ACCESS_MASK );
01012 ((
PSIMPLE_ACE)Ace)->Header.AceFlags = OBJECT_INHERIT_ACE;
01013 ((
PSIMPLE_ACE)Ace)->Mask = DELETE;
01014
RtlCopySid(SidWithFourSubAuthorities,&((
PSIMPLE_ACE)Ace)->Sid,BrentSid);
01015
01016 (ULONG)Ace += ((
PSIMPLE_ACE)Ace)->
Header.AceSize;
01017
01018 ((
PSIMPLE_ACE)Ace)->Header.AceType = ACCESS_ALLOWED_ACE_TYPE;
01019 ((
PSIMPLE_ACE)Ace)->Header.AceSize = (
USHORT)SidWithFourSubAuthorities +
01020 (
USHORT)
sizeof(ACE_HEADER) + (
USHORT)
sizeof( ACCESS_MASK );
01021 ((
PSIMPLE_ACE)Ace)->Header.AceFlags = OBJECT_INHERIT_ACE;
01022 ((
PSIMPLE_ACE)Ace)->Mask = DELETE;
01023
RtlCopySid(SidWithFourSubAuthorities,&((
PSIMPLE_ACE)Ace)->Sid,MickySid);
01024
01025
01026
01027
RtlAddAce(
TDacl, ACL_REVISION, 0, AceList, AceSize);
01028
01029
if (!
NT_SUCCESS(
Status =
RtlQueryInformationAcl(
TDacl, (PVOID)&AclSizeInfo,
01030
sizeof(AclSizeInfo), AclSizeInformation ) )) {
01031
DbgPrint(
"**** Failed **** \n");
01032
DbgPrint(
"RtlQueryInformation returned %X during size query \n",
Status);
01033
return(
FALSE);
01034 }
01035
01036
#if 0
01037
RtlDumpAcl(
TDacl);
01038
#endif
01039
01040
RtlGetAce(
TDacl, 5, &Ace );
01041
01042
if ( !
RtlEqualSid( &((
PSIMPLE_ACE)Ace)->Sid, BrentSid) ) {
01043
DbgPrint(
"\n **** Failed **** \n");
01044
DbgPrint(
"RtlGetAce returned wrong Ace\n");
01045
return(
FALSE);
01046 }
01047
01048
if (!
NT_SUCCESS(
RtlDeleteAce (
TDacl, 5))) {
01049
DbgPrint(
"\n **** Failed **** \n");
01050
DbgPrint(
"RtlDeleteAce failed\n");
01051
return(
FALSE);
01052 }
01053
01054
#if 0
01055
RtlDumpAcl(
TDacl);
01056
#endif
01057
01058
return(
TRUE);
01059 }
01060
01061
01062 BOOLEAN
01063 TestSeRtl()
01064 {
01065
01066 BOOLEAN Result =
TRUE;
01067
01068
DbgPrint(
"Se: Global Variable Initialization... ");
01069
if (
TSeVariableInitialization()) {
01070
DbgPrint(
"Succeeded.\n");
01071 }
else {
01072 Result =
FALSE;
01073 }
01074
01075
DbgPrint(
"Se: SID test... ");
01076
if (
TestSeSid()) {
01077
DbgPrint(
"Succeeded.\n");
01078 }
else {
01079 Result =
FALSE;
01080 }
01081
01082
DbgPrint(
"Se: SECURITY_DESCRIPTOR test... ");
01083
if (
TestSeSecurityDescriptor()) {
01084
DbgPrint(
"Succeeded.\n");
01085 }
else {
01086 Result =
FALSE;
01087 }
01088
01089
DbgPrint(
"Se: ACCESS_MASK test... ");
01090
if (
TestSeAccessMask()) {
01091
DbgPrint(
"Succeeded.\n");
01092 }
else {
01093 Result =
FALSE;
01094 }
01095
01096
DbgPrint(
"Se: ACL test... ");
01097
if (
TestSeAclRtl()) {
01098
DbgPrint(
"Succeeded.\n");
01099 }
else {
01100 Result =
FALSE;
01101 }
01102
01103
DbgPrint(
"\n");
01104
DbgPrint(
"\n");
01105
DbgPrint(
" ********************\n");
01106
DbgPrint(
" ** **\n");
01107
01108
if (Result =
TRUE) {
01109
DbgPrint(
" ** Test Succeeded **\n");
01110 }
else {
01111
DbgPrint(
" ** Test Failed **\n");
01112 }
01113
01114
DbgPrint(
" ** **\n");
01115
DbgPrint(
" ********************\n");
01116
DbgPrint(
"\n");
01117
DbgPrint(
"\n");
01118
01119
return Result;
01120 }