2 * PROJECT: ReactOS kernel-mode tests
3 * LICENSE: LGPLv2.1+ - See COPYING.LIB in the top level directory
4 * PURPOSE: Kernel-Mode Test Suite Helper functions for Se tests
5 * PROGRAMMER: Thomas Faber <thomas.faber@reactos.org>
12 RtlxAddAuditAccessAceEx(
16 _In_ ACCESS_MASK AccessMask
,
23 PSYSTEM_AUDIT_ACE Ace
;
25 if (Success
) Flags
|= SUCCESSFUL_ACCESS_ACE_FLAG
;
26 if (Failure
) Flags
|= FAILED_ACCESS_ACE_FLAG
;
28 AceSize
= FIELD_OFFSET(SYSTEM_AUDIT_ACE
, SidStart
) + RtlLengthSid(Sid
);
29 Ace
= ExAllocatePoolWithTag(PagedPool
, AceSize
, 'cAmK');
31 return STATUS_INSUFFICIENT_RESOURCES
;
32 Ace
->Header
.AceType
= SYSTEM_AUDIT_ACE_TYPE
;
33 Ace
->Header
.AceFlags
= Flags
;
34 Ace
->Header
.AceSize
= AceSize
;
35 Ace
->Mask
= AccessMask
;
36 Status
= RtlCopySid(AceSize
- FIELD_OFFSET(SYSTEM_AUDIT_ACE
, SidStart
),
39 ASSERT(NT_SUCCESS(Status
));
40 if (NT_SUCCESS(Status
))
42 Status
= RtlAddAce(Acl
,
48 ExFreePoolWithTag(Ace
, 'cAmK');
56 _In_ PISID ExpectedSid
,
57 _In_ PCSTR FileAndLine
)
62 KmtOk(Sid
!= NULL
, FileAndLine
, "Sid is NULL\n");
63 if (KmtSkip(Sid
!= NULL
, FileAndLine
, "No Sid\n"))
65 if (KmtSkip(SidSize
>= sizeof(ULONG
), FileAndLine
, "Sid too small: %lu\n", SidSize
))
67 Okay
= RtlValidSid(Sid
);
68 KmtOk(Okay
== TRUE
, FileAndLine
, "Invalid Sid\n");
69 if (KmtSkip(Okay
, FileAndLine
, "Invalid Sid\n"))
72 Length
= RtlLengthSid(Sid
);
73 KmtOk(SidSize
>= Length
, FileAndLine
, "SidSize %lu too small, need %lu\n", SidSize
, Length
);
74 if (KmtSkip(SidSize
>= Length
, FileAndLine
, "Sid too small\n"))
76 Okay
= RtlEqualSid(Sid
, ExpectedSid
);
77 KmtOk(Okay
, FileAndLine
, "Sids %p and %p not equal\n", Sid
, ExpectedSid
);
82 UNICODE_STRING SidString1
, SidString2
;
83 RtlInitEmptyUnicodeString(&SidString1
, Buffer1
, sizeof(Buffer1
));
84 RtlInitEmptyUnicodeString(&SidString2
, Buffer2
, sizeof(Buffer2
));
85 (void)RtlConvertSidToUnicodeString(&SidString1
, Sid
, FALSE
);
86 (void)RtlConvertSidToUnicodeString(&SidString2
, ExpectedSid
, FALSE
);
87 KmtOk(0, FileAndLine
, "Got %wZ, expected %wZ\n", &SidString1
, &SidString2
);
95 _In_ PCSTR FileAndLine
,
96 _In_
va_list Arguments
)
100 PACE_HEADER AceHeader
;
105 PACCESS_ALLOWED_ACE AllowedAce
;
106 PACCESS_DENIED_ACE DeniedAce
;
107 PSYSTEM_AUDIT_ACE AuditAce
;
109 KmtOk(Acl
!= NULL
, FileAndLine
, "Acl is NULL\n");
110 if (KmtSkip(Acl
!= NULL
, FileAndLine
, "No ACL\n"))
112 KmtOk((ULONG_PTR
)Acl
% sizeof(ULONG
) == 0, FileAndLine
, "Unaligned ACL %p\n", Acl
);
113 KmtOk(Acl
->AclRevision
== ACL_REVISION
, FileAndLine
, "AclRevision is %u\n", Acl
->AclRevision
);
114 KmtOk(Acl
->Sbz1
== 0, FileAndLine
, "Sbz1 is %u\n", Acl
->Sbz1
);
115 KmtOk(Acl
->Sbz2
== 0, FileAndLine
, "Sbz2 is %u\n", Acl
->Sbz2
);
116 KmtOk(Acl
->AclSize
>= sizeof(*Acl
), FileAndLine
, "AclSize too small: %u\n", Acl
->AclSize
);
117 KmtOk(Acl
->AceCount
== AceCount
, FileAndLine
, "AceCount is %u, expected %lu\n", Acl
->AceCount
, AceCount
);
118 Offset
= sizeof(*Acl
);
119 for (i
= 0; i
< Acl
->AceCount
; i
++)
121 KmtOk(Acl
->AclSize
>= Offset
+ sizeof(*AceHeader
), FileAndLine
, "AclSize too small (%u) at Offset %lu, ACE #%lu\n", Acl
->AclSize
, Offset
, i
);
122 if (Acl
->AclSize
< Offset
+ sizeof(*AceHeader
))
124 AceHeader
= (PACE_HEADER
)((PUCHAR
)Acl
+ Offset
);
125 KmtOk((ULONG_PTR
)AceHeader
% sizeof(ULONG
) == 0, FileAndLine
, "[%lu] Unaligned ACE %p\n", i
, AceHeader
);
126 KmtOk(AceHeader
->AceSize
% sizeof(ULONG
) == 0, FileAndLine
, "[%lu] Unaligned ACE size %u\n", i
, AceHeader
->AceSize
);
127 KmtOk(Acl
->AclSize
>= Offset
+ AceHeader
->AceSize
, FileAndLine
, "[%lu] AclSize too small (%u) at Offset %lu\n", i
, Acl
->AclSize
, Offset
);
128 if (Acl
->AclSize
< Offset
+ AceHeader
->AceSize
)
130 Offset
+= AceHeader
->AceSize
;
133 AceType
= va_arg(Arguments
, INT
);
134 AceFlags
= va_arg(Arguments
, INT
);
135 KmtOk(AceHeader
->AceType
== AceType
, FileAndLine
, "[%lu] AceType is %u, expected %u\n", i
, AceHeader
->AceType
, AceType
);
136 KmtOk(AceHeader
->AceFlags
== AceFlags
, FileAndLine
, "[%lu] AceFlags is 0x%x, expected 0x%x\n", i
, AceHeader
->AceFlags
, AceFlags
);
137 if (AceType
== ACCESS_ALLOWED_ACE_TYPE
)
139 Sid
= va_arg(Arguments
, PSID
);
140 Mask
= va_arg(Arguments
, INT
);
141 KmtOk(AceHeader
->AceSize
>= sizeof(*AllowedAce
), FileAndLine
, "[%lu] AllowedAce AceSize too small: %u\n", i
, AceHeader
->AceSize
);
142 if (AceHeader
->AceSize
< sizeof(*AllowedAce
))
144 AllowedAce
= (PACCESS_ALLOWED_ACE
)AceHeader
;
145 KmtOk(AllowedAce
->Mask
== Mask
, FileAndLine
, "[%lu] AllowedAce Mask is 0x%lx, expected 0x%lx\n", i
, AllowedAce
->Mask
, Mask
);
146 CheckSid__((PSID
)&AllowedAce
->SidStart
,
147 AceHeader
->AceSize
- FIELD_OFFSET(ACCESS_ALLOWED_ACE
, SidStart
),
151 else if (AceType
== ACCESS_DENIED_ACE_TYPE
)
153 Sid
= va_arg(Arguments
, PSID
);
154 Mask
= va_arg(Arguments
, INT
);
155 KmtOk(AceHeader
->AceSize
>= sizeof(*DeniedAce
), FileAndLine
, "[%lu] DeniedAce AceSize too small: %u\n", i
, AceHeader
->AceSize
);
156 if (AceHeader
->AceSize
< sizeof(*DeniedAce
))
158 DeniedAce
= (PACCESS_DENIED_ACE
)AceHeader
;
159 KmtOk(DeniedAce
->Mask
== Mask
, FileAndLine
, "[%lu] DeniedAce Mask is 0x%lx, expected 0x%lx\n", i
, DeniedAce
->Mask
, Mask
);
160 CheckSid__((PSID
)&DeniedAce
->SidStart
,
161 AceHeader
->AceSize
- FIELD_OFFSET(ACCESS_DENIED_ACE
, SidStart
),
165 else if (AceType
== SYSTEM_AUDIT_ACE_TYPE
)
167 Sid
= va_arg(Arguments
, PSID
);
168 Mask
= va_arg(Arguments
, INT
);
169 KmtOk(AceHeader
->AceSize
>= sizeof(*AuditAce
), FileAndLine
, "[%lu] AuditAce AceSize too small: %u\n", i
, AceHeader
->AceSize
);
170 if (AceHeader
->AceSize
< sizeof(*AuditAce
))
172 AuditAce
= (PSYSTEM_AUDIT_ACE
)AceHeader
;
173 KmtOk(AuditAce
->Mask
== Mask
, FileAndLine
, "[%lu] AuditAce Mask is 0x%lx, expected 0x%lx\n", i
, AuditAce
->Mask
, Mask
);
174 CheckSid__((PSID
)&AuditAce
->SidStart
,
175 AceHeader
->AceSize
- FIELD_OFFSET(ACCESS_DENIED_ACE
, SidStart
),
186 _In_ PCSTR FileAndLine
,
191 va_start(Arguments
, FileAndLine
);
192 VCheckAcl__(Acl
, AceCount
, FileAndLine
, Arguments
);