FsRtlReleaseEofLock

VOID __stdcall FsRtlReleaseEofLock(_FSRTL_EOF_LOCK *EofLock, INT64 a2){
  __int64 *v3; 
  _ETHREAD *CurrentThread; 
  _FAST_MUTEX *v5; 
  __int64 v6; 
  char v7; 
  __int64 v8; 
  NTSTATUS SessionId; 
  bool v10; 
  unsigned __int8 CurrentIrql; 
  __int64 v12; 
  __int64 *v13; 
  _FSRTL_EOF_LOCK v14; 
  __int64 v15; 
  unsigned __int64 v16; 
  unsigned __int32 v17; 
  __int64 *v18; 
  __int64 *v19; 
  __int64 v20; 
  __int64 **v21; 
  __int64 v22; 
  __int64 *v23; 
  __int64 **v24; 
  __int64 **v25; 
  __int64 AbOrphanedEntrySummary; 
  PVOID BugCheckParameter4; 
  __int64 *v29; 
  __int64 **v30; 
  UINT64 BoostPriority; 
  INT64 *EofGeneration; 
  int v33; 
  UINT64 a3; 

  EofGeneration = (INT64 *)a2;
  LODWORD(a3) = 0;
  v30 = &v29;
  LODWORD(BoostPriority) = 0;
  v29 = (__int64 *)&v29;
  v3 = 0i64;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v5 = *(_FAST_MUTEX **)(*((_QWORD *)EofLock + 3) + 48i64);
  --CurrentThread->Tcb.SpecialApcDisable;
  if( ++CurrentThread->Tcb.AbAllocationRegionCount != 1 )
    KeBugCheckEx(0x192u, CurrentThread, v5, (PVOID)KeGetCurrentIrql(), 0i64);
  LOBYTE(v6) = CurrentThread->Tcb.AbEntrySummary;
  v33 = 0;
  if( !(_BYTE)v6 )
  {
    if( !CurrentThread->Tcb.AbOrphanedEntrySummary )
    {
      v8 = 0i64;
      goto LABEL_49;
    }
    AbOrphanedEntrySummary = CurrentThread->Tcb.AbOrphanedEntrySummary;
    CurrentThread->Tcb.AbOrphanedEntrySummary = 0;
    LOBYTE(v6) = AbOrphanedEntrySummary | CurrentThread->Tcb.AbEntrySummary;
  }
  v7 = v6;
  _BitScanForward((unsigned int *)&v6, (unsigned __int8)v6);
  v33 = v6;
  CurrentThread->Tcb.AbEntrySummary = v7 & ~(1 << v6);
  v8 = (__int64)&CurrentThread->Tcb.LockEntries[v6];
  if( !v8 )
  {
LABEL_49:
    _interlockedbittestandset((volatile signed __int32 *)&CurrentThread->Tcb.116 + 1, 0x10u);
    goto LABEL_8;
  }
  if( (unsigned __int64)v5 >= 0xFFFF800000000000ui64
    && *((_BYTE *)&stru_140C4DB30 + (((unsigned __int64)v5 >> 39) & 0x1FF) + 6872) == 1 )
  {
    SessionId = MmGetSessionIdEx(CurrentThread->Tcb.ApcState.Process);
  }
  else
  {
    SessionId = -1;
  }
  *(_DWORD *)(v8 + 40) = SessionId;
  *(_QWORD *)(v8 + 32) = (unsigned __int64)v5 & 0x7FFFFFFFFFFFFFFCi64;
LABEL_8:
  --CurrentThread->Tcb.AbAllocationRegionCount;
  KiAbThreadRemoveBoosts(&CurrentThread->Tcb, v5, &a3);
  v10 = CurrentThread->Tcb.SpecialApcDisable++ == -1;
  if( v10
    && ($F25F8C4BA33AF922A5F1AF68CD89DDDF *)CurrentThread->Tcb.ApcState.ApcListHead[0].Flink != &CurrentThread->Tcb.152 )
  {
    KiCheckForKernelApcDelivery();
  }
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(1ui64);
  if( !_interlockedbittestandreset(&v5->Count, 0) )
    ExpAcquireFastMutexContended(v5, (VOID *)v8);
  if( v8 )
    *(_BYTE *)(v8 + 26) |= 1u;
  v5->Owner = KeGetCurrentThread();
  v5->OldIrql = CurrentIrql;
  if( a2 )
    _InterlockedIncrement((volatile signed __int32 *)a2);
  v10 = (*((_WORD *)EofLock + 19))-- == 1;
  if( v10 )
  {
    v12 = *(_QWORD *)(*((_QWORD *)EofLock + 3) + 40i64);
    if( *((_BYTE *)EofLock + 36) )
    {
      PsBoostThreadIoEx(*(_ETHREAD **)EofLock, 1u, 0, 0i64);
      *((_BYTE *)EofLock + 36) = 0;
    }
    v13 = (__int64 *)*((_QWORD *)EofLock + 1);
    if( v13 == (__int64 *)(EofLock + 2) )
      goto LABEL_21;
    do
    {
      v19 = v13;
      v13 = (__int64 *)*v13;
      v20 = v19[5];
      if( v20 < 0 || v20 > v12 )
      {
        if( !v3 )
        {
          v21 = (__int64 **)v19[1];
          if( (__int64 *)v13[1] != v19 )
            goto LABEL_45;
          if( *v21 != v19 )
            goto LABEL_45;
          *v21 = v13;
          v13[1] = (__int64)v21;
          v22 = (__int64)v29;
          if( (__int64 **)v29[1] != &v29 )
            goto LABEL_45;
          *v19 = (__int64)v29;
          v19[1] = (__int64)&v29;
          v3 = v19;
          *(_QWORD *)(v22 + 8) = v19;
          v29 = v19;
        }
      }
      else
      {
        v24 = (__int64 **)v19[1];
        if( (__int64 *)v13[1] != v19
          || *v24 != v19
          || (*v24 = v13, v13[1] = (__int64)v24, v25 = v30, *v30 != (__int64 *)&v29) )
        {
LABEL_45:
          __fastfail(3u);
        }
        v19[1] = (__int64)v30;
        *v19 = (__int64)&v29;
        *v25 = v19;
        v30 = (__int64 **)v19;
      }
    }
    while( v13 != (__int64 *)(EofLock + 2) );
    if( !v3 )
    {
LABEL_21:
      *(_QWORD *)EofLock = 0i64;
      v14 = 0;
      *((_WORD *)EofLock + 19) = 0;
    }
    else
    {
      *(_QWORD *)EofLock = v3[6];
      *((_WORD *)EofLock + 19) = 1;
      v14 = *((_DWORD *)v3 + 14);
    }
    EofLock[8] = v14;
    if( EofGeneration )
      _InterlockedIncrement((volatile signed __int32 *)EofGeneration);
    v15 = *(_QWORD *)(*((_QWORD *)EofLock + 3) + 48i64);
    v16 = *(unsigned __int8 *)(v15 + 48);
    *(_QWORD *)(v15 + 8) = 0i64;
    v17 = _InterlockedCompareExchange((volatile signed __int32 *)v15, 1, 0);
    if( v17 )
      ExpReleaseFastMutexContended((_FAST_MUTEX *)v15, v17);
    __writecr8(v16);
    KeAbPostRelease((VOID *)v15);
    v18 = v29;
    while( v18 != (__int64 *)&v29 )
    {
      v23 = v18;
      v18 = (__int64 *)*v18;
      LOBYTE(BugCheckParameter4) = 1;
      LODWORD(BoostPriority) = *((_DWORD *)v23 + 14);
      KeSetEventBoostPriorityEx(v23 + 2, 0i64, &BoostPriority, 0i64, (UINT64)BugCheckParameter4);
    }
  }
  else
  {
    FsRtlReleaseHeaderMutex(EofLock, EofGeneration);
  }
}

Referenced by:

No references.