SeAccessCheckByType

NTSTATUS __stdcall SeAccessCheckByType(
        VOID *SecurityDescriptor,
        VOID *PrincipalSelfSid,
        VOID *ClientToken,
        UINT64 DesiredAccess,
        _OBJECT_TYPE_LIST *ObjectTypeList,
        UINT64 ObjectTypeListLength,
        _GENERIC_MAPPING *GenericMapping,
        PRIVILEGE_SET *PrivilegeSet,
        UINT64 *PrivilegeSetLength,
        UINT64 *GrantedAccess,
        INT64 *AccessStatus,
        UINT8 ReturnResultList){
  _SIZE_T Length; 
  __int64 v14; 
  INT64 v16; 

  if( KeGetCurrentThread()->PreviousMode )
  {
    v14 = 0x7FFFFFFF0000i64;
    if( (unsigned __int64)PrivilegeSetLength < 0x7FFFFFFF0000i64 )
      v14 = (__int64)PrivilegeSetLength;
    Length = *(_DWORD *)v14;
  }
  else
  {
    Length = *(_DWORD *)PrivilegeSetLength;
  }
  LODWORD(v16) = ObjectTypeListLength;
  return SeAccessCheckByTypeWithAdminlessChecks(
           (INT64)SecurityDescriptor,
           (INT64)PrincipalSelfSid,
           (INT64)ClientToken,
           DesiredAccess,
           (INT64)ObjectTypeList,
           v16,
           (INT64)GenericMapping,
           PrivilegeSet,
           Length,
           (INT64)PrivilegeSetLength,
           (INT64)GrantedAccess,
           AccessStatus,
           ReturnResultList,
           0);
}

Referenced by:

NtAccessCheck
NtAccessCheckByType
NtAccessCheckByTypeResultList