IopQueryXxxInformation

NTSTATUS __stdcall IopQueryXxxInformation(
        PVOID FileObject,
        UINT64 InformationClass,
        UINT64 Length,
        _KPROCESSOR_MODE Mode,
        VOID *Information,
        UINT64 *ReturnedLength,
        UINT8 FileInformation){
  CHAR v7; 
  int v8; 
  char v10; 
  _DEVICE_OBJECT *v11; 
  int v12; 
  UINT64 v13; 
  _IRP *Irp; 
  _IRP *v15; 
  __int128 *p_Object; 
  _IO_STACK_LOCATION *CurrentStackLocation; 
  bool v18; 
  NTSTATUS v19; 
  _KPROCESSOR_MODE v20; 
  NTSTATUS v21; 
  _ETHREAD *CurrentThread; 
  bool v24; 
  _BYTE *v25; 
  NTSTATUS v26; 
  __int128 v27; 
  __int128 Object; 
  __int64 v29; 
  VOID *retaddr; 
  INT64 v31; 
  int v32; 

  v32 = Length;
  Object = 0i64;
  v29 = 0i64;
  v7 = Mode;
  v27 = 0i64;
  v8 = InformationClass;
  ObfReferenceObject(FileObject);
  if( (*((_DWORD *)FileObject + 20) & 2) != 0 )
  {
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    v24 = (*((_DWORD *)FileObject + 20) & 4) != 0;
    --CurrentThread->Tcb.KernelApcDisable;
    v25 = KeAbPreAcquire((char *)FileObject + 128, 0i64, 0i64);
    LOBYTE(v31) = 0;
    if( _InterlockedExchange((volatile __int32 *)FileObject + 29, 1) )
    {
      v26 = IopWaitAndAcquireFileObjectLock(FileObject, v7, v24, v25, (INT64)&v31);
      if( (_BYTE)v31 )
      {
        HalPutDmaAdapter((PADAPTER_OBJECT)FileObject);
        return v26;
      }
    }
    else
    {
      if( v25 )
        v25[26] |= 1u;
      ObfReferenceObject(FileObject);
    }
    KeResetEvent((_KEVENT *)((char *)FileObject + 152));
    v10 = 1;
  }
  else
  {
    KeInitializeEvent((INT64)&Object, 1, 0);
    v10 = 0;
  }
  LODWORD(v11) = IoGetRelatedDeviceObject((INT64)FileObject);
  v12 = 71;
  v13 = (UINT64)v11;
  if( v8 != 75 )
    v12 = v8;
  Irp = IopAllocateIrpExReturn(v11, v11->StackSize, v10 ^ 1u, retaddr);
  v15 = Irp;
  if( Irp )
  {
    Irp->Tail.OriginalFileObject = (_FILE_OBJECT *)FileObject;
    Irp->Tail.Thread = (_ETHREAD *)KeGetCurrentThread();
    Irp->RequestorMode = v7;
    if( v10 )
    {
      Irp->AllocationFlags |= 2u;
      p_Object = 0i64;
    }
    else
    {
      Irp->Flags = 4;
      p_Object = &Object;
    }
    v15->UserEvent = (_KEVENT *)p_Object;
    v15->Overlay.UserApcRoutine = 0i64;
    CurrentStackLocation = v15->Tail.CurrentStackLocation;
    v18 = FileInformation != 0;
    FileInformation = -FileInformation;
    v15->UserIosb = (_IO_STATUS_BLOCK *)&v27;
    CurrentStackLocation[-1].FileObject = (_FILE_OBJECT *)FileObject;
    CurrentStackLocation[-1].MajorFunction = v18 ? 5 : 10;
    v15->Flags |= 0x10u;
    v15->AssociatedIrp.MasterIrp = (_IRP *)Information;
    LODWORD(CurrentStackLocation[-1].Parameters.SecurityContext) = v32;
    CurrentStackLocation[-1].Parameters.Options = v12;
    if( v8 == 75 )
      CurrentStackLocation[-1].Flags |= 1u;
    IopQueueThreadIrp(v15);
    v19 = IofCallDriver(v13, (UINT64)v15);
    v21 = v19;
    if( v10 )
    {
      if( v19 == 259 )
      {
        LOBYTE(v20) = v7;
        IopWaitForSynchronousIo(v15, (_FILE_OBJECT *)FileObject, v20);
        v21 = *((_DWORD *)FileObject + 14);
      }
      IopReleaseFileObjectLock((PADAPTER_OBJECT)FileObject);
    }
    else if( v19 == 259 )
    {
      KeWaitForSingleObject((UINT64)&Object, 0, 0, 0, 0i64);
      v21 = v27;
    }
    *(_DWORD *)ReturnedLength = DWORD2(v27);
    return v21;
  }
  else
  {
    IopAllocateIrpCleanup(FileObject, 0i64);
    return -1073741670;
  }
}

Referenced by:

IoQueryFileInformation
IopGetNetworkOpenInformation
IopQueryNameInternal
IopValidateJunctionTarget
MiAttemptPageFileExtension
PfSnGetSectionObject
PfpPrefetchEntireDirectory