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');
53 RtlxAddMandatoryLabelAceEx(
57 _In_ ACCESS_MASK AccessMask
,
62 PSYSTEM_MANDATORY_LABEL_ACE Ace
;
64 AceSize
= FIELD_OFFSET(SYSTEM_MANDATORY_LABEL_ACE
, SidStart
) + RtlLengthSid(Sid
);
65 Ace
= ExAllocatePoolWithTag(PagedPool
, AceSize
, 'cAmK');
67 return STATUS_INSUFFICIENT_RESOURCES
;
68 Ace
->Header
.AceType
= SYSTEM_MANDATORY_LABEL_ACE_TYPE
;
69 Ace
->Header
.AceFlags
= Flags
;
70 Ace
->Header
.AceSize
= AceSize
;
71 Ace
->Mask
= AccessMask
;
72 Status
= RtlCopySid(AceSize
- FIELD_OFFSET(SYSTEM_MANDATORY_LABEL_ACE
, SidStart
),
75 ASSERT(NT_SUCCESS(Status
));
76 if (NT_SUCCESS(Status
))
78 Status
= RtlAddAce(Acl
,
84 ExFreePoolWithTag(Ace
, 'cAmK');
92 _In_ PISID ExpectedSid
,
93 _In_ PCSTR FileAndLine
)
98 KmtOk(Sid
!= NULL
, FileAndLine
, "Sid is NULL\n");
99 if (KmtSkip(Sid
!= NULL
, FileAndLine
, "No Sid\n"))
101 if (KmtSkip(SidSize
>= sizeof(ULONG
), FileAndLine
, "Sid too small: %lu\n", SidSize
))
103 Okay
= RtlValidSid(Sid
);
104 KmtOk(Okay
== TRUE
, FileAndLine
, "Invalid Sid\n");
105 if (KmtSkip(Okay
, FileAndLine
, "Invalid Sid\n"))
108 Length
= RtlLengthSid(Sid
);
109 KmtOk(SidSize
>= Length
, FileAndLine
, "SidSize %lu too small, need %lu\n", SidSize
, Length
);
110 if (KmtSkip(SidSize
>= Length
, FileAndLine
, "Sid too small\n"))
112 Okay
= RtlEqualSid(Sid
, ExpectedSid
);
113 KmtOk(Okay
, FileAndLine
, "Sids %p and %p not equal\n", Sid
, ExpectedSid
);
118 UNICODE_STRING SidString1
, SidString2
;
119 RtlInitEmptyUnicodeString(&SidString1
, Buffer1
, sizeof(Buffer1
));
120 RtlInitEmptyUnicodeString(&SidString2
, Buffer2
, sizeof(Buffer2
));
121 (void)RtlConvertSidToUnicodeString(&SidString1
, Sid
, FALSE
);
122 (void)RtlConvertSidToUnicodeString(&SidString2
, ExpectedSid
, FALSE
);
123 KmtOk(0, FileAndLine
, "Got %wZ, expected %wZ\n", &SidString1
, &SidString2
);
131 _In_ PCSTR FileAndLine
,
132 _In_
va_list Arguments
)
136 PACE_HEADER AceHeader
;
141 PACCESS_ALLOWED_ACE AllowedAce
;
142 PACCESS_DENIED_ACE DeniedAce
;
143 PSYSTEM_AUDIT_ACE AuditAce
;
145 KmtOk(Acl
!= NULL
, FileAndLine
, "Acl is NULL\n");
146 if (KmtSkip(Acl
!= NULL
, FileAndLine
, "No ACL\n"))
148 KmtOk((ULONG_PTR
)Acl
% sizeof(ULONG
) == 0, FileAndLine
, "Unaligned ACL %p\n", Acl
);
149 KmtOk(Acl
->AclRevision
== ACL_REVISION
, FileAndLine
, "AclRevision is %u\n", Acl
->AclRevision
);
150 KmtOk(Acl
->Sbz1
== 0, FileAndLine
, "Sbz1 is %u\n", Acl
->Sbz1
);
151 KmtOk(Acl
->Sbz2
== 0, FileAndLine
, "Sbz2 is %u\n", Acl
->Sbz2
);
152 KmtOk(Acl
->AclSize
>= sizeof(*Acl
), FileAndLine
, "AclSize too small: %u\n", Acl
->AclSize
);
153 KmtOk(Acl
->AceCount
== AceCount
, FileAndLine
, "AceCount is %u, expected %lu\n", Acl
->AceCount
, AceCount
);
154 Offset
= sizeof(*Acl
);
155 for (i
= 0; i
< Acl
->AceCount
; i
++)
157 KmtOk(Acl
->AclSize
>= Offset
+ sizeof(*AceHeader
), FileAndLine
, "AclSize too small (%u) at Offset %lu, ACE #%lu\n", Acl
->AclSize
, Offset
, i
);
158 if (Acl
->AclSize
< Offset
+ sizeof(*AceHeader
))
160 AceHeader
= (PACE_HEADER
)((PUCHAR
)Acl
+ Offset
);
161 KmtOk((ULONG_PTR
)AceHeader
% sizeof(ULONG
) == 0, FileAndLine
, "[%lu] Unaligned ACE %p\n", i
, AceHeader
);
162 KmtOk(AceHeader
->AceSize
% sizeof(ULONG
) == 0, FileAndLine
, "[%lu] Unaligned ACE size %u\n", i
, AceHeader
->AceSize
);
163 KmtOk(Acl
->AclSize
>= Offset
+ AceHeader
->AceSize
, FileAndLine
, "[%lu] AclSize too small (%u) at Offset %lu\n", i
, Acl
->AclSize
, Offset
);
164 if (Acl
->AclSize
< Offset
+ AceHeader
->AceSize
)
166 Offset
+= AceHeader
->AceSize
;
169 AceType
= va_arg(Arguments
, INT
);
170 AceFlags
= va_arg(Arguments
, INT
);
171 KmtOk(AceHeader
->AceType
== AceType
, FileAndLine
, "[%lu] AceType is %u, expected %u\n", i
, AceHeader
->AceType
, AceType
);
172 KmtOk(AceHeader
->AceFlags
== AceFlags
, FileAndLine
, "[%lu] AceFlags is 0x%x, expected 0x%x\n", i
, AceHeader
->AceFlags
, AceFlags
);
173 if (AceType
== ACCESS_ALLOWED_ACE_TYPE
)
175 Sid
= va_arg(Arguments
, PSID
);
176 Mask
= va_arg(Arguments
, INT
);
177 KmtOk(AceHeader
->AceSize
>= sizeof(*AllowedAce
), FileAndLine
, "[%lu] AllowedAce AceSize too small: %u\n", i
, AceHeader
->AceSize
);
178 if (AceHeader
->AceSize
< sizeof(*AllowedAce
))
180 AllowedAce
= (PACCESS_ALLOWED_ACE
)AceHeader
;
181 KmtOk(AllowedAce
->Mask
== Mask
, FileAndLine
, "[%lu] AllowedAce Mask is 0x%lx, expected 0x%lx\n", i
, AllowedAce
->Mask
, Mask
);
182 CheckSid__((PSID
)&AllowedAce
->SidStart
,
183 AceHeader
->AceSize
- FIELD_OFFSET(ACCESS_ALLOWED_ACE
, SidStart
),
187 else if (AceType
== ACCESS_DENIED_ACE_TYPE
)
189 Sid
= va_arg(Arguments
, PSID
);
190 Mask
= va_arg(Arguments
, INT
);
191 KmtOk(AceHeader
->AceSize
>= sizeof(*DeniedAce
), FileAndLine
, "[%lu] DeniedAce AceSize too small: %u\n", i
, AceHeader
->AceSize
);
192 if (AceHeader
->AceSize
< sizeof(*DeniedAce
))
194 DeniedAce
= (PACCESS_DENIED_ACE
)AceHeader
;
195 KmtOk(DeniedAce
->Mask
== Mask
, FileAndLine
, "[%lu] DeniedAce Mask is 0x%lx, expected 0x%lx\n", i
, DeniedAce
->Mask
, Mask
);
196 CheckSid__((PSID
)&DeniedAce
->SidStart
,
197 AceHeader
->AceSize
- FIELD_OFFSET(ACCESS_DENIED_ACE
, SidStart
),
201 else if (AceType
== SYSTEM_AUDIT_ACE_TYPE
)
203 Sid
= va_arg(Arguments
, PSID
);
204 Mask
= va_arg(Arguments
, INT
);
205 KmtOk(AceHeader
->AceSize
>= sizeof(*AuditAce
), FileAndLine
, "[%lu] AuditAce AceSize too small: %u\n", i
, AceHeader
->AceSize
);
206 if (AceHeader
->AceSize
< sizeof(*AuditAce
))
208 AuditAce
= (PSYSTEM_AUDIT_ACE
)AceHeader
;
209 KmtOk(AuditAce
->Mask
== Mask
, FileAndLine
, "[%lu] AuditAce Mask is 0x%lx, expected 0x%lx\n", i
, AuditAce
->Mask
, Mask
);
210 CheckSid__((PSID
)&AuditAce
->SidStart
,
211 AceHeader
->AceSize
- FIELD_OFFSET(ACCESS_DENIED_ACE
, SidStart
),
222 _In_ PCSTR FileAndLine
,
227 va_start(Arguments
, FileAndLine
);
228 VCheckAcl__(Acl
, AceCount
, FileAndLine
, Arguments
);