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;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|