NtQuerySecurityObject

NTSTATUS __fastcall NtQuerySecurityObject(UINT64 a1, INT64 a2, UINT64 a3, UINT64 a4, UINT64 LengthNeeded){
  char PreviousMode; 
  _DWORD *v8; 
  UINT64 v9; 
  NTSTATUS result; 
  _ADAPTER_OBJECT *v11; 
  __int64 v12; 
  NTSTATUS v13; 
  UINT64 DesiredAccess; 
  PVOID Object; 
  _OBJECT_HANDLE_INFORMATION HandleInformation; 
  UINT64 SecurityInformation; 
  UINT64 Length; 

  LODWORD(Length) = a4;
  LODWORD(SecurityInformation) = a2;
  LODWORD(DesiredAccess) = 0;
  HandleInformation = 0i64;
  PreviousMode = KeGetCurrentThread()->PreviousMode;
  if( PreviousMode )
  {
    v8 = (_DWORD *)LengthNeeded;
    v9 = LengthNeeded;
    if( LengthNeeded >= 0x7FFFFFFF0000i64 )
      v9 = 0x7FFFFFFF0000i64;
    *(_DWORD *)v9 = *(_DWORD *)v9;
    ProbeForWrite(a3, (unsigned int)Length, 4i64);
  }
  else
  {
    v8 = (_DWORD *)LengthNeeded;
  }
  SeQuerySecurityAccessMask((unsigned int)SecurityInformation, &DesiredAccess);
  Object = 0i64;
  result = ObReferenceObjectByHandle(
             (VOID *)a1,
             (unsigned int)DesiredAccess,
             0i64,
             PreviousMode,
             &Object,
             &HandleInformation);
  if( result >= 0 )
  {
    v11 = (_ADAPTER_OBJECT *)Object;
    v12 = ObTypeIndexTable[(unsigned __int8)ObHeaderCookie ^ (unsigned __int8)*((char *)Object - 24) ^ (unsigned __int64)(unsigned __int8)((unsigned __int16)((_WORD)Object - 48) >> 8)];
    v13 = (*(__int64(__fastcall **)(PVOID, __int64, UINT64 *, UINT64, UINT64 *, char *, _DWORD, __int64, char))(v12 + 152))(
            Object,
            1i64,
            &SecurityInformation,
            a3,
            &Length,
            (char *)Object - 8,
            *(_DWORD *)(v12 + 100),
            v12 + 76,
            PreviousMode);
    *v8 = Length;
    HalPutDmaAdapter(v11);
    return v13;
  }
  return result;
}

Referenced by:

RtlpSysVolCheckOwnerAndSecurity