RtlFirstFreeAce(PACL Acl,
PACE* Ace)
{
- PACE Current;
- PVOID AclEnd;
- ULONG i;
+ PACE Current;
+ PVOID AclEnd;
+ ULONG i;
+
+ Current = (PACE)(Acl + 1);
+ *Ace = NULL;
+ i = 0;
+ if (Acl->AceCount == 0)
+ {
+ *Ace = Current;
+ return(TRUE);
+ }
- Current = (PACE)(Acl + 1);
- *Ace = NULL;
- i = 0;
- if (Acl->AceCount == 0)
- {
- *Ace = Current;
- return(TRUE);
- }
- AclEnd = Acl->AclSize + Acl;
- do
- {
- if ((PVOID)Current >= AclEnd)
- {
- return(FALSE);
- }
- if (Current->Header.AceType == 4)
- {
- if (Acl->AclRevision < 3)
- {
- return(FALSE);
- }
- }
- Current = (PACE)((PVOID)Current + (ULONG)Current->Header.AceSize);
- i++;
- } while (i < Acl->AceCount);
- if ((PVOID)Current >= AclEnd)
- {
- return(FALSE);
- }
- *Ace = Current;
- return(TRUE);
+ AclEnd = Acl->AclSize + (PVOID)Acl;
+ do
+ {
+ if ((PVOID)Current >= AclEnd)
+ {
+ return(FALSE);
+ }
+
+ if (Current->Header.AceType == 4)
+ {
+ if (Acl->AclRevision < 3)
+ {
+ return(FALSE);
+ }
+ }
+ Current = (PACE)((PVOID)Current + (ULONG)Current->Header.AceSize);
+ i++;
+ }
+ while (i < Acl->AceCount);
+
+ if ((PVOID)Current < AclEnd)
+ {
+ *Ace = Current;
+ }
+
+ return(TRUE);
}
return(STATUS_SUCCESS);
}
+
+BOOLEAN STDCALL
+RtlValidAcl(PACL Acl)
+{
+ PACE Ace;
+ USHORT Size;
+
+ Size = (Acl->AclSize + 3) & ~3;
+
+ if (Acl->AclRevision != 2 &&
+ Acl->AclRevision != 3)
+ {
+ return(FALSE);
+ }
+
+ if (Size != Acl->AclSize)
+ {
+ return(FALSE);
+ }
+
+ return(RtlFirstFreeAce(Acl, &Ace));
+}
+
/* EOF */