308 lines
9.1 KiB
C
308 lines
9.1 KiB
C
//////////////////////////////////////////////////////////////////////////
|
||
// WARNING - WARNING - WARNING - WARNING - WARNING - WARNING - WARNING //
|
||
// //
|
||
// This test file is not current with the security implementation. //
|
||
// This file contains references to data types and APIs that do not //
|
||
// exist. //
|
||
// //
|
||
//////////////////////////////////////////////////////////////////////////
|
||
/*++
|
||
|
||
Copyright (c) 1989 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
tacl.c
|
||
|
||
Abstract:
|
||
|
||
Test program for the acl editing package
|
||
|
||
Author:
|
||
|
||
Gary Kimura [GaryKi] 19-Nov-1989
|
||
|
||
Revision History:
|
||
|
||
v4: robertre
|
||
updated ACL_REVISION
|
||
RichardW - updated ACE_HEADER
|
||
|
||
--*/
|
||
|
||
#include <stdio.h>
|
||
|
||
#include "nt.h"
|
||
#include "ntrtl.h"
|
||
|
||
VOID
|
||
RtlDumpAcl(
|
||
IN PACL Acl
|
||
);
|
||
|
||
UCHAR FredAclBuffer[128];
|
||
UCHAR WilmaAclBuffer[128];
|
||
UCHAR PebbleAclBuffer[128];
|
||
UCHAR DinoAclBuffer[128];
|
||
UCHAR BarneyAclBuffer[128];
|
||
UCHAR BettyAclBuffer[128];
|
||
UCHAR BambamAclBuffer[128];
|
||
|
||
UCHAR GuidMaskBuffer[512];
|
||
STANDARD_ACE AceListBuffer[2];
|
||
|
||
int
|
||
main(
|
||
int argc,
|
||
char *argv[]
|
||
)
|
||
{
|
||
PACL FredAcl = (PACL)FredAclBuffer;
|
||
PACL WilmaAcl = (PACL)WilmaAclBuffer;
|
||
PACL PebbleAcl = (PACL)PebbleAclBuffer;
|
||
PACL DinoAcl = (PACL)DinoAclBuffer;
|
||
PACL BarneyAcl = (PACL)BarneyAclBuffer;
|
||
PACL BettyAcl = (PACL)BettyAclBuffer;
|
||
PACL BambamAcl = (PACL)BambamAclBuffer;
|
||
|
||
PMASK_GUID_PAIRS GuidMasks = (PMASK_GUID_PAIRS)GuidMaskBuffer;
|
||
|
||
ACL_REVISION_INFORMATION AclRevisionInfo;
|
||
ACL_SIZE_INFORMATION AclSizeInfo;
|
||
|
||
//
|
||
// We're starting the test
|
||
//
|
||
|
||
DbgPrint("Start Acl Test\n");
|
||
|
||
//
|
||
// test create acl
|
||
//
|
||
|
||
if (!NT_SUCCESS(RtlCreateAcl(FredAcl, 128, 1))) {
|
||
DbgPrint("RtlCreateAcl Error\n");
|
||
}
|
||
|
||
RtlDumpAcl(FredAcl);
|
||
DbgPrint("\n");
|
||
|
||
//
|
||
// test add ace to add two aces to an empty acl
|
||
//
|
||
|
||
AceListBuffer[0].Header.AceType = ACCESS_ALLOWED_ACE_TYPE;
|
||
AceListBuffer[0].Header.AceSize = sizeof(STANDARD_ACE);
|
||
AceListBuffer[0].Header.AceFlags = 0;
|
||
AceListBuffer[0].Mask = 0x22222222;
|
||
CopyGuid(&AceListBuffer[0].Guid, &FredGuid);
|
||
|
||
AceListBuffer[1].Header.AceType = ACCESS_ALLOWED_ACE_TYPE;
|
||
AceListBuffer[1].Header.AceSize = sizeof(STANDARD_ACE);
|
||
AceListBuffer[1].Header.AceFlags = 0;
|
||
AceListBuffer[1].Mask = 0x44444444;
|
||
CopyGuid(&AceListBuffer[1].Guid, &WilmaGuid);
|
||
|
||
if (!NT_SUCCESS(RtlAddAce(FredAcl, 1, 0, AceListBuffer, 2*sizeof(STANDARD_ACE)))) {
|
||
DbgPrint("RtlAddAce Error\n");
|
||
}
|
||
|
||
RtlDumpAcl(FredAcl);
|
||
DbgPrint("\n");
|
||
|
||
//
|
||
// test add ace to add one to the beginning of an acl
|
||
//
|
||
|
||
AceListBuffer[0].Header.AceType = SYSTEM_AUDIT_ACE_TYPE;
|
||
AceListBuffer[0].Header.AceSize = sizeof(STANDARD_ACE);
|
||
AceListBuffer[0].Header.AceFlags = 0;
|
||
AceListBuffer[0].Mask = 0x11111111;
|
||
CopyGuid(&AceListBuffer[0].Guid, &PebbleGuid);
|
||
|
||
if (!NT_SUCCESS(RtlAddAce(FredAcl, 1, 0, AceListBuffer, sizeof(STANDARD_ACE)))) {
|
||
DbgPrint("RtlAddAce Error\n");
|
||
}
|
||
|
||
RtlDumpAcl(FredAcl);
|
||
DbgPrint("\n");
|
||
|
||
//
|
||
// test add ace to add one to the middle of an acl
|
||
//
|
||
|
||
AceListBuffer[0].Header.AceType = ACCESS_DENIED_ACE_TYPE;
|
||
AceListBuffer[0].Header.AceSize = sizeof(STANDARD_ACE);
|
||
AceListBuffer[0].Header.AceFlags = 0;
|
||
AceListBuffer[0].Mask = 0x33333333;
|
||
CopyGuid(&AceListBuffer[0].Guid, &DinoGuid);
|
||
|
||
if (!NT_SUCCESS(RtlAddAce(FredAcl, 1, 2, AceListBuffer, sizeof(STANDARD_ACE)))) {
|
||
DbgPrint("RtlAddAce Error\n");
|
||
}
|
||
|
||
RtlDumpAcl(FredAcl);
|
||
DbgPrint("\n");
|
||
|
||
//
|
||
// test add ace to add one to the end of an acl
|
||
//
|
||
|
||
AceListBuffer[0].Header.AceType = ACCESS_DENIED_ACE_TYPE;
|
||
AceListBuffer[0].Header.AceSize = sizeof(STANDARD_ACE);
|
||
AceListBuffer[0].Header.AceFlags = 0;
|
||
AceListBuffer[0].Mask = 0x55555555;
|
||
CopyGuid(&AceListBuffer[0].Guid, &FlintstoneGuid);
|
||
|
||
if (!NT_SUCCESS(RtlAddAce(FredAcl, 1, MAXULONG, AceListBuffer, sizeof(STANDARD_ACE)))) {
|
||
DbgPrint("RtlAddAce Error\n");
|
||
}
|
||
|
||
RtlDumpAcl(FredAcl);
|
||
DbgPrint("\n");
|
||
|
||
//
|
||
// Test get ace
|
||
//
|
||
|
||
{
|
||
PSTANDARD_ACE Ace;
|
||
|
||
if (!NT_SUCCESS(RtlGetAce(FredAcl, 2, (PVOID *)(&Ace)))) {
|
||
DbgPrint("RtlGetAce Error\n");
|
||
}
|
||
|
||
if ((Ace->Header.AceType != ACCESS_DENIED_ACE_TYPE) ||
|
||
(Ace->Mask != 0x33333333)) {
|
||
DbgPrint("Got bad ace from RtlGetAce\n");
|
||
}
|
||
}
|
||
|
||
//
|
||
// test delete ace middle ace
|
||
//
|
||
|
||
if (!NT_SUCCESS(RtlDeleteAce(FredAcl, 2))) {
|
||
DbgPrint("RtlDeleteAce Error\n");
|
||
}
|
||
|
||
RtlDumpAcl(FredAcl);
|
||
DbgPrint("\n");
|
||
|
||
//
|
||
// Test query information acl
|
||
//
|
||
|
||
if (!NT_SUCCESS(RtlQueryInformationAcl( FredAcl,
|
||
(PVOID)&AclRevisionInfo,
|
||
sizeof(ACL_REVISION_INFORMATION),
|
||
AclRevisionInformation))) {
|
||
DbgPrint("RtlQueryInformationAcl Error\n");
|
||
}
|
||
if (AclRevisionInfo.AclRevision != ACL_REVISION) {
|
||
DbgPrint("RtlAclRevision Error\n");
|
||
}
|
||
|
||
if (!NT_SUCCESS(RtlQueryInformationAcl( FredAcl,
|
||
(PVOID)&AclSizeInfo,
|
||
sizeof(ACL_SIZE_INFORMATION),
|
||
AclSizeInformation))) {
|
||
DbgPrint("RtlQueryInformationAcl Error\n");
|
||
}
|
||
if ((AclSizeInfo.AceCount != 4) ||
|
||
(AclSizeInfo.AclBytesInUse != (sizeof(ACL)+4*sizeof(STANDARD_ACE))) ||
|
||
(AclSizeInfo.AclBytesFree != 128 - AclSizeInfo.AclBytesInUse)) {
|
||
DbgPrint("RtlAclSize Error\n");
|
||
DbgPrint("AclSizeInfo.AceCount = %8lx\n", AclSizeInfo.AceCount);
|
||
DbgPrint("AclSizeInfo.AclBytesInUse = %8lx\n", AclSizeInfo.AclBytesInUse);
|
||
DbgPrint("AclSizeInfo.AclBytesFree = %8lx\n", AclSizeInfo.AclBytesFree);
|
||
DbgPrint("\n");
|
||
}
|
||
|
||
//
|
||
// Test make Mask from Acl
|
||
//
|
||
|
||
GuidMasks->PairCount = 11;
|
||
CopyGuid(&GuidMasks->MaskGuid[ 0].Guid, &FredGuid);
|
||
CopyGuid(&GuidMasks->MaskGuid[ 1].Guid, &WilmaGuid);
|
||
CopyGuid(&GuidMasks->MaskGuid[ 2].Guid, &PebbleGuid);
|
||
CopyGuid(&GuidMasks->MaskGuid[ 3].Guid, &DinoGuid);
|
||
CopyGuid(&GuidMasks->MaskGuid[ 4].Guid, &BarneyGuid);
|
||
CopyGuid(&GuidMasks->MaskGuid[ 5].Guid, &BettyGuid);
|
||
CopyGuid(&GuidMasks->MaskGuid[ 6].Guid, &BambamGuid);
|
||
CopyGuid(&GuidMasks->MaskGuid[ 7].Guid, &FlintstoneGuid);
|
||
CopyGuid(&GuidMasks->MaskGuid[ 8].Guid, &RubbleGuid);
|
||
CopyGuid(&GuidMasks->MaskGuid[ 9].Guid, &AdultGuid);
|
||
CopyGuid(&GuidMasks->MaskGuid[10].Guid, &ChildGuid);
|
||
if (!NT_SUCCESS(RtlMakeMaskFromAcl(FredAcl, GuidMasks))) {
|
||
DbgPrint("RtlMakeMaskFromAcl Error\n");
|
||
}
|
||
if ((GuidMasks->MaskGuid[ 0].Mask != 0x22222222) ||
|
||
(GuidMasks->MaskGuid[ 1].Mask != 0x44444444) ||
|
||
(GuidMasks->MaskGuid[ 2].Mask != 0x00000000) ||
|
||
(GuidMasks->MaskGuid[ 3].Mask != 0x00000000) ||
|
||
(GuidMasks->MaskGuid[ 4].Mask != 0x00000000) ||
|
||
(GuidMasks->MaskGuid[ 5].Mask != 0x00000000) ||
|
||
(GuidMasks->MaskGuid[ 6].Mask != 0x00000000) ||
|
||
(GuidMasks->MaskGuid[ 7].Mask != 0x00000000) ||
|
||
(GuidMasks->MaskGuid[ 8].Mask != 0x00000000) ||
|
||
(GuidMasks->MaskGuid[ 9].Mask != 0x00000000) ||
|
||
(GuidMasks->MaskGuid[10].Mask != 0x00000000)) {
|
||
DbgPrint("Make Mask Error\n");
|
||
DbgPrint("Fred gets %8lx\n", GuidMasks->MaskGuid[ 0].Mask);
|
||
DbgPrint("Wilma gets %8lx\n", GuidMasks->MaskGuid[ 1].Mask);
|
||
DbgPrint("Pebble gets %8lx\n", GuidMasks->MaskGuid[ 2].Mask);
|
||
DbgPrint("Dino gets %8lx\n", GuidMasks->MaskGuid[ 3].Mask);
|
||
DbgPrint("Barney gets %8lx\n", GuidMasks->MaskGuid[ 4].Mask);
|
||
DbgPrint("Betty gets %8lx\n", GuidMasks->MaskGuid[ 5].Mask);
|
||
DbgPrint("Banbam gets %8lx\n", GuidMasks->MaskGuid[ 6].Mask);
|
||
DbgPrint("Flintstone gets %8lx\n", GuidMasks->MaskGuid[ 7].Mask);
|
||
DbgPrint("Rubble gets %8lx\n", GuidMasks->MaskGuid[ 8].Mask);
|
||
DbgPrint("Adult gets %8lx\n", GuidMasks->MaskGuid[ 9].Mask);
|
||
DbgPrint("Child gets %8lx\n", GuidMasks->MaskGuid[10].Mask);
|
||
}
|
||
|
||
//
|
||
// test make acl from mask
|
||
//
|
||
|
||
GuidMasks->PairCount = 2;
|
||
GuidMasks->MaskGuid[0].Mask = 0x55555555;
|
||
CopyGuid(&GuidMasks->MaskGuid[0].Guid, &BarneyGuid);
|
||
GuidMasks->MaskGuid[1].Mask = 0xaaaa5555;
|
||
CopyGuid(&GuidMasks->MaskGuid[1].Guid, &RubbleGuid);
|
||
|
||
//
|
||
// Initialize and dump a posix style acl
|
||
//
|
||
|
||
if (!NT_SUCCESS(RtlMakeAclFromMask(GuidMasks, AclPosixEnvironment, BarneyAcl, 128, 1))) {
|
||
DbgPrint("RtlMakeAclFromMask Error\n");
|
||
}
|
||
|
||
RtlDumpAcl(BarneyAcl);
|
||
DbgPrint("\n");
|
||
|
||
//
|
||
// Initialize and dump a OS/2 style acl
|
||
//
|
||
|
||
if (!NT_SUCCESS(RtlMakeAclFromMask(GuidMasks, AclOs2Environment, BettyAcl, 128, 1))) {
|
||
DbgPrint("RtlMakeAclFromMask Error\n");
|
||
}
|
||
|
||
RtlDumpAcl(BettyAcl);
|
||
DbgPrint("\n");
|
||
|
||
//
|
||
// We're done with the test
|
||
//
|
||
|
||
DbgPrint("End Acl Test\n");
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
|
||
|