IoQueryInformationByName

NTSTATUS __fastcall IoQueryInformationByName(INT64 a1, UINT64 a2, INT8 *a3, UINT64 a4, UINT64 a5, INT16 a6, INT16 *Src){
  UINT64 v7; 
  unsigned int FileInformationLength; 
  char v11; 
  CHAR v12; 
  char PreviousMode; 
  _FILE_INFORMATION_CLASS v14; 
  NTSTATUS result; 
  __int64 v16; 
  __int64 SiloContext; 
  void *v18; 
  unsigned __int64 v19; 
  _ETHREAD *CurrentThread; 
  int FinalStatus; 
  _ECP_LIST *v22; 
  void *FileInformation; 
  UINT64 Length; 
  UINT64 Lengtha; 
  INT64 v26; 
  CHAR AccessMode; 
  _OPEN_PACKET ParseContext; 
  PVOID Handle; 
  char v31[272]; 

  v7 = (unsigned int)a4;
  memset(v31, 0i64, sizeof(v31));
  FileInformationLength = 0;
  v11 = 0;
  v12 = 0;
  PreviousMode = KeGetCurrentThread()->PreviousMode;
  if( (a6 & 0x100) == 0 )
    v12 = PreviousMode;
  AccessMode = v12;
  v14 = (int)a5;
  LODWORD(v26) = a5;
  LODWORD(Length) = v7;
  result = IopValidateQueryInformationParameters(v12, (INT64)KeGetCurrentThread(), a2, (UINT64)a3, Length, v26);
  if( result >= 0 )
  {
    if( (_DWORD)a5 == 75 && !AccessMode )
    {
      v14 = FileCaseSensitiveInformation;
      v11 = 1;
    }
    if( ((v14 - 68) & 0xFFFFFFFC) != 0 || v14 == FileMemoryPartitionInformation )
      return -1073741811;
    memset(&ParseContext, 0i64, sizeof(ParseContext));
    *(_DWORD *)&ParseContext.Type = 14155784;
    ParseContext.ShareAccess = 7;
    ParseContext.Disposition = 1;
    ParseContext.CreateOptions = 2113536;
    ParseContext.QueryOnly = 1;
    ParseContext.FilterQuery = 1;
    ParseContext.LocalFileObject = (_DUMMY_FILE_OBJECT *)v31;
    ParseContext.OriginalAttributes = (_OBJECT_ATTRIBUTES *)a1;
    ParseContext.InternalFlags = 32;
    ParseContext.FileInformationClass = v14;
    ParseContext.FileInformationLength = v7;
    memset(&ParseContext.DriverCreateContext, 0, 32);
    ParseContext.DriverCreateContext.Size = 40;
    SiloContext = 1i64;
    ParseContext.DriverCreateContext.SiloContext = (_EJOB *)1;
    if( v11 )
      ParseContext.Options |= 1u;
    if( Src )
    {
      v18 = (void *)*((_QWORD *)Src + 1);
      if( v18 )
      {
        result = FsRtlpPrepareExtraCreateParametersForCreate(v18);
        if( result < 0 )
          return result;
      }
      v19 = *Src;
      if( v19 > 0x28 )
        LODWORD(v19) = 40;
      memmove(&ParseContext.DriverCreateContext, Src, v19);
      SiloContext = (__int64)ParseContext.DriverCreateContext.SiloContext;
    }
    if( SiloContext == 1 )
      ParseContext.DriverCreateContext.SiloContext = PsGetCurrentSilo();
    if( (unsigned __int64)a3 <= 0x7FFFFFFEFFFFi64 )
      ParseContext.FileInformation = IopVerifierExAllocatePoolWithQuota_3(v16, v7);
    else
      ParseContext.FileInformation = a3;
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    ++CurrentThread->Tcb.OtherOperationCount;
    __incgsdword(0x2EE4u);
    LODWORD(Lengtha) = 128;
    FinalStatus = ObOpenObjectByNameEx(
                    (_OBJECT_ATTRIBUTES *)a1,
                    (_OBJECT_TYPE *)IoFileObjectType,
                    AccessMode,
                    0i64,
                    Lengtha,
                    &ParseContext,
                    ParseContext.DriverCreateContext.SiloContext,
                    &Handle);
    IopCleanupExtraCreateParameters(&ParseContext, v22);
    if( ParseContext.ParseCheck == -1096154543 )
      FinalStatus = ParseContext.FinalStatus;
    FileInformation = ParseContext.FileInformation;
    if( a3 != ParseContext.FileInformation )
    {
      if( FinalStatus >= 0 )
        memmove(a3, ParseContext.FileInformation, ParseContext.FileInformationLength);
      ExFreePoolWithTag(FileInformation, 0);
    }
    *(_DWORD *)a2 = FinalStatus;
    if( FinalStatus >= 0 )
      FileInformationLength = ParseContext.FileInformationLength;
    *(_QWORD *)(a2 + 8) = FileInformationLength;
    return FinalStatus;
  }
  return result;
}

Referenced by:

NtQueryInformationByName