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 }