FsRtlAcquireEofLock

VOID __stdcall FsRtlAcquireEofLock(_FSRTL_EOF_LOCK *EofLock, INT64 a2){
  _ETHREAD *CurrentThread; 
  __int64 v3; 
  unsigned __int64 v5; 
  __int64 v6; 
  char v7; 
  __int64 v8; 
  NTSTATUS SessionId; 
  bool v10; 
  unsigned __int8 CurrentIrql; 
  __int64 v12; 
  unsigned __int64 v13; 
  unsigned __int32 v14; 
  __int64 AbOrphanedEntrySummary; 
  UINT64 a3; 
  volatile signed __int32 *v18; 

  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  LODWORD(a3) = 0;
  v3 = *((_QWORD *)EofLock + 3);
  v18 = (volatile signed __int32 *)a2;
  v5 = *(_QWORD *)(v3 + 48);
  --CurrentThread->Tcb.SpecialApcDisable;
  if( ++CurrentThread->Tcb.AbAllocationRegionCount != 1 )
    KeBugCheckEx(0x192u, CurrentThread, (PVOID)v5, (PVOID)KeGetCurrentIrql(), 0i64);
  LOBYTE(v6) = CurrentThread->Tcb.AbEntrySummary;
  if( !(_BYTE)v6 )
  {
    if( !CurrentThread->Tcb.AbOrphanedEntrySummary )
    {
      v8 = 0i64;
      goto LABEL_29;
    }
    AbOrphanedEntrySummary = CurrentThread->Tcb.AbOrphanedEntrySummary;
    CurrentThread->Tcb.AbOrphanedEntrySummary = 0;
    LOBYTE(v6) = AbOrphanedEntrySummary | CurrentThread->Tcb.AbEntrySummary;
  }
  v7 = v6;
  _BitScanForward((unsigned int *)&v6, (unsigned __int8)v6);
  CurrentThread->Tcb.AbEntrySummary = v7 & ~(1 << v6);
  v8 = (__int64)&CurrentThread->Tcb.LockEntries[v6];
  if( !v8 )
  {
LABEL_29:
    _interlockedbittestandset((volatile signed __int32 *)&CurrentThread->Tcb.116 + 1, 0x10u);
    goto LABEL_7;
  }
  if( MiGetSystemRegionType(v5) == 1 )
    SessionId = MmGetSessionIdEx(CurrentThread->Tcb.ApcState.Process);
  else
    SessionId = -1;
  *(_DWORD *)(v8 + 40) = SessionId;
  *(_QWORD *)(v8 + 32) = v5 & 0x7FFFFFFFFFFFFFFCi64;
LABEL_7:
  --CurrentThread->Tcb.AbAllocationRegionCount;
  KiAbThreadRemoveBoosts(&CurrentThread->Tcb, (VOID *)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((volatile signed __int32 *)v5, 0) )
    ExpAcquireFastMutexContended((_FAST_MUTEX *)v5, (VOID *)v8);
  if( v8 )
    *(_BYTE *)(v8 + 26) |= 1u;
  *(_QWORD *)(v5 + 8) = KeGetCurrentThread();
  *(_DWORD *)(v5 + 48) = CurrentIrql;
  if( v18 )
    _InterlockedIncrement(v18);
  if( *(_ETHREAD **)EofLock == CurrentThread )
  {
    ++*((_WORD *)EofLock + 19);
  }
  else if( *(_QWORD *)EofLock )
  {
    FsRtlpWaitForIoAtEof(EofLock, (INT64 *)a2, -1i64);
  }
  else
  {
    *(_QWORD *)EofLock = CurrentThread;
    *((_WORD *)EofLock + 19) = 1;
  }
  if( a2 )
    _InterlockedIncrement((volatile signed __int32 *)a2);
  v12 = *(_QWORD *)(*((_QWORD *)EofLock + 3) + 48i64);
  v13 = *(unsigned __int8 *)(v12 + 48);
  *(_QWORD *)(v12 + 8) = 0i64;
  v14 = _InterlockedCompareExchange((volatile signed __int32 *)v12, 1, 0);
  if( v14 )
    ExpReleaseFastMutexContended((_FAST_MUTEX *)v12, v14);
  __writecr8(v13);
  KeAbPostRelease((VOID *)v12);
}

Referenced by:

No references.