2 * PROJECT: ReactOS API tests
3 * LICENSE: LGPLv2.1+ - See COPYING.LIB in the top level directory
4 * PURPOSE: Test for RtlFirstFreeAce
5 * PROGRAMMERS: Thomas Faber <thomas.faber@reactos.org>
9 #include <ndk/mmfuncs.h>
10 #include <ndk/rtlfuncs.h>
15 _In_ SIZE_T SizeRequested
)
18 SIZE_T Size
= PAGE_ROUND_UP(SizeRequested
+ PAGE_SIZE
);
19 PVOID VirtualMemory
= NULL
;
22 Status
= NtAllocateVirtualMemory(NtCurrentProcess(), &VirtualMemory
, 0, &Size
, MEM_RESERVE
, PAGE_NOACCESS
);
24 if (!NT_SUCCESS(Status
))
30 Status
= NtAllocateVirtualMemory(NtCurrentProcess(), &VirtualMemory
, 0, &Size
, MEM_COMMIT
, PAGE_READWRITE
);
31 if (!NT_SUCCESS(Status
))
34 Status
= NtFreeVirtualMemory(NtCurrentProcess(), &VirtualMemory
, &Size
, MEM_RELEASE
);
35 ok(Status
== STATUS_SUCCESS
, "Status = %lx\n", Status
);
40 StartOfBuffer
= VirtualMemory
;
41 StartOfBuffer
+= Size
- SizeRequested
;
52 PVOID VirtualMemory
= (PVOID
)PAGE_ROUND_DOWN((SIZE_T
)Pointer
);
55 Status
= NtFreeVirtualMemory(NtCurrentProcess(), &VirtualMemory
, &Size
, MEM_RELEASE
);
56 ok(Status
== STATUS_SUCCESS
, "Status = %lx\n", Status
);
66 PACE_HEADER AceHeader
;
72 ASSERT(AceCount
<= RTL_NUMBER_OF(AceSizes
));
73 AclSize
= sizeof(ACL
);
74 va_start(Args
, AceCount
);
75 for (i
= 0; i
< AceCount
; i
++)
77 AceSizes
[i
] = va_arg(Args
, int);
78 AclSize
+= AceSizes
[i
];
82 Acl
= AllocateGuarded(AclSize
);
85 skip("Failed to allocate %lu bytes\n", AclSize
);
89 Acl
->AclRevision
= ACL_REVISION
;
91 Acl
->AclSize
= AclSize
;
92 Acl
->AceCount
= AceCount
;
95 AceHeader
= (PACE_HEADER
)(Acl
+ 1);
96 for (i
= 0; i
< AceCount
; i
++)
98 AceHeader
->AceType
= 0;
99 AceHeader
->AceFlags
= 0;
100 AceHeader
->AceSize
= AceSizes
[i
];
101 AceHeader
= (PACE_HEADER
)((PCHAR
)AceHeader
+ AceHeader
->AceSize
);
107 START_TEST(RtlFirstFreeAce
)
116 /* Simple empty ACL */
117 FirstAce
= InvalidPointer
;
118 Found
= RtlFirstFreeAce(Acl
, &FirstAce
);
119 ok(Found
== TRUE
, "Found = %u\n", Found
);
120 ok(FirstAce
== (PACE
)(Acl
+ 1), "FirstAce = %p (Acl was %p)\n", FirstAce
, Acl
);
122 /* Not enough space */
123 Acl
->AclSize
= sizeof(ACL
) - 1;
124 FirstAce
= InvalidPointer
;
125 Found
= RtlFirstFreeAce(Acl
, &FirstAce
);
126 ok(Found
== TRUE
, "Found = %u\n", Found
);
127 ok(FirstAce
== NULL
, "FirstAce = %p (Acl was %p)\n", FirstAce
, Acl
);
129 /* Invalid values for all the other fields */
130 Acl
->AclRevision
= 76;
132 Acl
->AclSize
= sizeof(ACL
);
134 FirstAce
= InvalidPointer
;
135 Found
= RtlFirstFreeAce(Acl
, &FirstAce
);
136 ok(Found
== TRUE
, "Found = %u\n", Found
);
137 ok(FirstAce
== (PACE
)(Acl
+ 1), "FirstAce = %p (Acl was %p)\n", FirstAce
, Acl
);
142 Acl
= MakeAcl(1, (int)sizeof(ACE_HEADER
));
145 /* ACL with one ACE */
146 FirstAce
= InvalidPointer
;
147 Found
= RtlFirstFreeAce(Acl
, &FirstAce
);
148 ok(Found
== TRUE
, "Found = %u\n", Found
);
149 ok(FirstAce
== (PACE
)((PACE_HEADER
)(Acl
+ 1) + 1), "FirstAce = %p (Acl was %p)\n", FirstAce
, Acl
);
151 /* The one ACE doesn't actually fit */
152 Acl
->AclSize
= sizeof(ACL
);
153 FirstAce
= InvalidPointer
;
154 Found
= RtlFirstFreeAce(Acl
, &FirstAce
);
155 ok(Found
== FALSE
, "Found = %u\n", Found
);
156 ok(FirstAce
== NULL
, "FirstAce = %p (Acl was %p)\n", FirstAce
, Acl
);
158 /* Only the first byte fits */
159 Acl
->AclSize
= sizeof(ACL
) + 1;
160 FirstAce
= InvalidPointer
;
161 Found
= RtlFirstFreeAce(Acl
, &FirstAce
);
162 ok(Found
== TRUE
, "Found = %u\n", Found
);
163 ok(FirstAce
== NULL
, "FirstAce = %p (Acl was %p)\n", FirstAce
, Acl
);
165 /* Until we cover the whole size we get NULL */
166 Acl
->AclSize
= sizeof(ACL
) + sizeof(ACE_HEADER
) - 1;
167 FirstAce
= InvalidPointer
;
168 Found
= RtlFirstFreeAce(Acl
, &FirstAce
);
169 ok(Found
== TRUE
, "Found = %u\n", Found
);
170 ok(FirstAce
== NULL
, "FirstAce = %p (Acl was %p)\n", FirstAce
, Acl
);
175 /* Same but bigger */
176 Acl
= MakeAcl(1, (int)sizeof(ACE_HEADER
) + 4);
179 /* ACL with one ACE */
180 FirstAce
= InvalidPointer
;
181 Found
= RtlFirstFreeAce(Acl
, &FirstAce
);
182 ok(Found
== TRUE
, "Found = %u\n", Found
);
183 ok(FirstAce
== (PACE
)((PCHAR
)(Acl
+ 1) + sizeof(ACE_HEADER
) + 4), "FirstAce = %p (Acl was %p)\n", FirstAce
, Acl
);
185 /* The one ACE doesn't actually fit */
186 Acl
->AclSize
= sizeof(ACL
);
187 FirstAce
= InvalidPointer
;
188 Found
= RtlFirstFreeAce(Acl
, &FirstAce
);
189 ok(Found
== FALSE
, "Found = %u\n", Found
);
190 ok(FirstAce
== NULL
, "FirstAce = %p (Acl was %p)\n", FirstAce
, Acl
);
192 /* Only the first byte fits */
193 Acl
->AclSize
= sizeof(ACL
) + 1;
194 FirstAce
= InvalidPointer
;
195 Found
= RtlFirstFreeAce(Acl
, &FirstAce
);
196 ok(Found
== TRUE
, "Found = %u\n", Found
);
197 ok(FirstAce
== NULL
, "FirstAce = %p (Acl was %p)\n", FirstAce
, Acl
);
199 /* Until we cover the whole size we get NULL */
200 Acl
->AclSize
= sizeof(ACL
) + sizeof(ACE_HEADER
) - 3;
201 FirstAce
= InvalidPointer
;
202 Found
= RtlFirstFreeAce(Acl
, &FirstAce
);
203 ok(Found
== TRUE
, "Found = %u\n", Found
);
204 ok(FirstAce
== NULL
, "FirstAce = %p (Acl was %p)\n", FirstAce
, Acl
);
209 Acl
= MakeAcl(4, (int)sizeof(ACE_HEADER
), (int)sizeof(ACE_HEADER
), (int)sizeof(ACCESS_ALLOWED_ACE
), (int)sizeof(ACCESS_ALLOWED_ACE
));
212 /* ACL with one ACE */
213 FirstAce
= InvalidPointer
;
214 Found
= RtlFirstFreeAce(Acl
, &FirstAce
);
215 ok(Found
== TRUE
, "Found = %u\n", Found
);
216 ok(FirstAce
== (PACE
)((PCHAR
)(Acl
+ 1) + 2 * sizeof(ACE_HEADER
) + 2 * sizeof(ACCESS_ALLOWED_ACE
)), "FirstAce = %p (Acl was %p)\n", FirstAce
, Acl
);
218 /* One less gives us NULL */
219 Acl
->AclSize
= sizeof(ACL
) + 2 * sizeof(ACE_HEADER
) + 2 * sizeof(ACCESS_ALLOWED_ACE
) - 1;
220 FirstAce
= InvalidPointer
;
221 Found
= RtlFirstFreeAce(Acl
, &FirstAce
);
222 ok(Found
== TRUE
, "Found = %u\n", Found
);
223 ok(FirstAce
== NULL
, "FirstAce = %p (Acl was %p)\n", FirstAce
, Acl
);
225 /* One ACE less also gives us FALSE */
226 Acl
->AclSize
= sizeof(ACL
) + 2 * sizeof(ACE_HEADER
) + sizeof(ACCESS_ALLOWED_ACE
);
227 FirstAce
= InvalidPointer
;
228 Found
= RtlFirstFreeAce(Acl
, &FirstAce
);
229 ok(Found
== FALSE
, "Found = %u\n", Found
);
230 ok(FirstAce
== NULL
, "FirstAce = %p (Acl was %p)\n", FirstAce
, Acl
);