IopQueueIrpToFileObject

UINT8 __stdcall IopQueueIrpToFileObject(_IRP *Irp, _FILE_OBJECT *FileObject){
  unsigned __int64 *p_IrpListLock; 
  unsigned __int8 CurrentIrql; 
  _LIST_ENTRY *p_IrpList; 
  _LIST_ENTRY *Flink; 
  _LIST_ENTRY *v8; 
  ULONG_PTR v9; 
  signed __int64 BugCheckParameter4; 
  _ETHREAD *CurrentThread; 
  volatile signed __int64 *v12; 
  signed __int64 v13; 
  signed __int64 v14; 
  signed __int64 v15; 
  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);
    return 0;
  }
  else
  {
    p_IrpList = &FileObject->IrpList;
    Flink = FileObject->IrpList.Flink;
    v8 = (_LIST_ENTRY *)((char *)Irp + 32);
    if( Flink->Blink != &FileObject->IrpList )
      __fastfail(3u);
    v8->Flink = Flink;
    *((_QWORD *)Irp + 5) = p_IrpList;
    Flink->Blink = v8;
    p_IrpList->Flink = v8;
    v9 = *((_QWORD *)KeGetCurrentThread() + 23);
    if( ObpTraceFlags )
      ObpPushStackInfo(v9 - 48, 1, 1i64, 1883467593i64);
    BugCheckParameter4 = _InterlockedIncrement64((volatile signed __int64 *)(v9 - 48));
    if( BugCheckParameter4 <= 1 )
      KeBugCheckEx(0x18u, 0i64, v9, 0x10ui64, BugCheckParameter4);
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    v12 = (volatile signed __int64 *)((char *)CurrentThread - 48);
    if( ObpTraceFlags )
      ObpPushStackInfo((INT64)CurrentThread - 48, 1, 1i64, 1953261124i64);
    v13 = _InterlockedIncrement64(v12);
    if( v13 <= 1 )
      KeBugCheckEx(0x18u, 0i64, (ULONG_PTR)(v12 + 6), 0x10ui64, v13);
    *((_DWORD *)Irp + 4) |= 0x2000u;
    *((_QWORD *)Irp + 11) = v9;
    v14 = *((_QWORD *)Irp + 11);
    do
    {
      v15 = v14;
      v14 = _InterlockedCompareExchange64(
              (volatile signed __int64 *)Irp + 11,
              v14 & 0xFFFFFFFFFFFFFFF9ui64 | ((v14 & 6) + 2),
              v14);
    }
    while( v15 != v14 );
    _InterlockedAnd64((volatile signed __int64 *)p_IrpListLock, 0i64);
    __writecr8(CurrentIrql);
    return 1;
  }
}

Referenced by:

IopSynchronousServiceTail