SeCaptureAcl
INT64 __fastcall SeCaptureAcl(
_ACL *InputAcl,
CHAR RequestorMode,
VOID *CaptureBuffer,
UINT64 CaptureBufferLength,
_POOL_TYPE PoolType,
UINT8 ForceCapture,
_ACL **CapturedAcl,
UINT64 *AlignedAclSize){
__int64 p_AclSize;
__int64 v10;
unsigned int AclSize;
char *v12;
_ACL *PoolWithTag;
if( RequestorMode )
{
p_AclSize = (__int64)&InputAcl->AclSize;
if( (unsigned __int64)&InputAcl->AclSize >= 0x7FFFFFFF0000i64 )
p_AclSize = 0x7FFFFFFF0000i64;
v10 = *(unsigned __int16 *)p_AclSize;
AclSize = v10;
if( (_DWORD)v10 )
{
if( ((unsigned __int8)InputAcl & 3) != 0 )
ExRaiseDatatypeMisalignment();
v12 = (char *)InputAcl + v10;
if( (unsigned __int64)v12 > 0x7FFFFFFF0000i64 || v12 < (char *)InputAcl )
MEMORY[0x7FFFFFFF0000] = 0;
}
}
else
{
AclSize = InputAcl->AclSize;
}
if( AclSize < 8 )
return 3221225591i64;
*(_DWORD *)AlignedAclSize = (AclSize + 3) & 0xFFFFFFFC;
PoolWithTag = (_ACL *)ExAllocatePoolWithTag(PoolType, AclSize, 0x63416553ui64);
*CapturedAcl = PoolWithTag;
if( PoolWithTag )
{
memmove((UINT8 *)PoolWithTag, (UINT8 *)InputAcl, AclSize);
if( SepCheckAcl(*CapturedAcl, AclSize) )
return 0i64;
ExFreePoolWithTag(*CapturedAcl, 0);
*CapturedAcl = 0i64;
return 3221225591i64;
}
return 3221225626i64;
}Referenced by:
NtCreateTokenEx
NtSetInformationToken