IopQueueIrpToFileObject

VOID __stdcall IopQueueIrpToFileObject(_IRP *Irp, _FILE_OBJECT *FileObject, PVOID *a3, PVOID a4, UINT8 a5, INT8 a6){
  unsigned __int64 *p_IrpListLock; 
  unsigned __int8 CurrentIrql; 
  _LIST_ENTRY *p_IrpList; 
  _LIST_ENTRY *Flink; 
  _LIST_ENTRY *p_ThreadListEntry; 
  _EPROCESS *Process; 
  __int64 BugCheckParameter4; 
  _ETHREAD *CurrentThread; 
  volatile signed __int64 *p_Min; 
  __int64 v17; 
  signed __int64 UserApcRoutine; 
  signed __int64 v19; 

  p_IrpListLock = &FileObject->IrpListLock;
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(2ui64);
  if( _interlockedbittestandset64((volatile signed __int32 *)&FileObject->IrpListLock, 0i64) )
    KxWaitForSpinLockAndAcquire(p_IrpListLock);
  if( (FileObject->Flags & 0x400) != 0 )
  {
    KxReleaseSpinLock(p_IrpListLock);
    __writecr8(CurrentIrql);
  }
  else
  {
    p_IrpList = &FileObject->IrpList;
    Flink = FileObject->IrpList.Flink;
    p_ThreadListEntry = &Irp->ThreadListEntry;
    if( Flink->Blink != &FileObject->IrpList )
      __fastfail(3u);
    p_ThreadListEntry->Flink = Flink;
    Irp->ThreadListEntry.Blink = p_IrpList;
    Flink->Blink = p_ThreadListEntry;
    p_IrpList->Flink = p_ThreadListEntry;
    Process = KeGetCurrentThread()->ApcState.Process;
    if( ObpTraceFlags )
      ObpPushStackInfo((_OBJECT_HEADER *)&Process[-1].DynamicEnforcedCetCompatibleRanges, 1u, 1ui64, 0x70436F49ui64);
    BugCheckParameter4 = _InterlockedIncrement64((volatile signed __int64 *)&Process[-1].DynamicEnforcedCetCompatibleRanges);
    if( BugCheckParameter4 <= 1 )
      KeBugCheckEx(0x18u, 0i64, Process, (PVOID)0x10, (PVOID)BugCheckParameter4);
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    p_Min = (volatile signed __int64 *)&CurrentThread[-1].LockEntries[5].OwnerTree.Min;
    if( ObpTraceFlags )
      ObpPushStackInfo(
        (_OBJECT_HEADER *)(&CurrentThread[-1].LockEntries[5].CpuPriorityKey + 8),
        1u,
        1ui64,
        0x746C6644ui64);
    v17 = _InterlockedIncrement64(p_Min);
    if( v17 <= 1 )
      KeBugCheckEx(0x18u, 0i64, (PVOID)(p_Min + 6), (PVOID)0x10, (PVOID)v17);
    Irp->Flags |= 0x2000u;
    Irp->Overlay.UserApcRoutine = (void(__fastcall *)(void *, _IO_STATUS_BLOCK *, unsigned int))Process;
    UserApcRoutine = (signed __int64)Irp->Overlay.UserApcRoutine;
    do
    {
      v19 = UserApcRoutine;
      UserApcRoutine = _InterlockedCompareExchange64(
                         (volatile signed __int64 *)&Irp->Overlay,
                         UserApcRoutine & 0xFFFFFFFFFFFFFFF9ui64 | ((UserApcRoutine & 6) + 2),
                         UserApcRoutine);
    }
    while( v19 != UserApcRoutine );
    _InterlockedAnd64((volatile signed __int64 *)p_IrpListLock, 0i64);
    __writecr8(CurrentIrql);
  }
}

Referenced by:

IopSynchronousServiceTail