FsRtlReleaseEofLock

void __fastcall FsRtlReleaseEofLock(__int64 a1, volatile signed __int32 *a2){
  __int64 *v3; 
  _ETHREAD *CurrentThread; 
  ULONG_PTR v5; 
  __int64 v6; 
  char v7; 
  __int64 v8; 
  int SessionId; 
  bool v10; 
  unsigned __int8 CurrentIrql; 
  __int64 v12; 
  __int64 *v13; 
  int 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; 
  char v26; 
  ULONG_PTR BugCheckParameter4; 
  __int64 *v29; 
  __int64 **v30; 
  INT64 BoostPriority; 
  volatile signed __int32 *v32; 
  int v33; 
  unsigned int v34; 
  v32 = a2;
  v34 = 0;
  v30 = &v29;
  LODWORD(BoostPriority) = 0;
  v29 = (__int64 *)&v29;
  v3 = 0i64;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v5 = *(_QWORD *)(*(_QWORD *)(a1 + 24) + 48i64);
  --*((_WORD *)CurrentThread + 243);
  if( ++*((_BYTE *)CurrentThread + 794) != 1 )
    KeBugCheckEx(0x192u, (ULONG_PTR)CurrentThread, v5, KeGetCurrentIrql(), 0i64);
  LOBYTE(v6) = *((_BYTE *)CurrentThread + 792);
  v33 = 0;
  if( !(_BYTE)v6 )
  {
    if( !*((_BYTE *)CurrentThread + 870) )
    {
      v8 = 0i64;
      goto LABEL_49;
    }
    v26 = *((_BYTE *)CurrentThread + 870);
    *((_BYTE *)CurrentThread + 870) = 0;
    LOBYTE(v6) = v26 | *((_BYTE *)CurrentThread + 792);
  }
  v7 = v6;
  _BitScanForward((unsigned int *)&v6, (unsigned __int8)v6);
  v33 = v6;
  *((_BYTE *)CurrentThread + 792) = v7 & ~(1 << v6);
  v8 = *((_QWORD *)CurrentThread + 100) + 96 * v6;
  if( !v8 )
  {
LABEL_49:
    _interlockedbittestandset((volatile signed __int32 *)CurrentThread + 30, 0x10u);
    goto LABEL_8;
  }
  if( v5 >= 0xFFFF800000000000ui64 && *((_BYTE *)&antNameB + ((v5 >> 39) & 0x1FF) - 256) == 1 )
    SessionId = MmGetSessionIdEx(*((_QWORD *)CurrentThread + 23));
  else
    SessionId = -1;
  *(_DWORD *)(v8 + 40) = SessionId;
  *(_QWORD *)(v8 + 32) = v5 & 0x7FFFFFFFFFFFFFFCi64;
LABEL_8:
  --*((_BYTE *)CurrentThread + 794);
  KiAbThreadRemoveBoosts((ULONG_PTR)CurrentThread, v5, &v34);
  v10 = (*((_WORD *)CurrentThread + 243))++ == 0xFFFF;
  if( v10 && *((_ETHREAD **)CurrentThread + 19) != (_ETHREAD *)((char *)CurrentThread + 152) )
    KiCheckForKernelApcDelivery();
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(1ui64);
  if( !_interlockedbittestandreset((volatile signed __int32 *)v5, 0) )
    ExpAcquireFastMutexContended((FAST_MUTEX *)v5, (PVOID)v8);
  if( v8 )
    *(_BYTE *)(v8 + 26) |= 1u;
  *(_QWORD *)(v5 + 8) = KeGetCurrentThread();
  *(_DWORD *)(v5 + 48) = CurrentIrql;
  if( a2 )
    _InterlockedIncrement(a2);
  v10 = (*(_WORD *)(a1 + 38))-- == 1;
  if( v10 )
  {
    v12 = *(_QWORD *)(*(_QWORD *)(a1 + 24) + 40i64);
    if( *(_BYTE *)(a1 + 36) )
    {
      PsBoostThreadIoEx(*(_QWORD *)a1, 1, 0, 0i64);
      *(_BYTE *)(a1 + 36) = 0;
    }
    v13 = *(__int64 **)(a1 + 8);
    if( v13 == (__int64 *)(a1 + 8) )
      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 *)(a1 + 8) );
    if( !v3 )
    {
LABEL_21:
      *(_QWORD *)a1 = 0i64;
      v14 = 0;
      *(_WORD *)(a1 + 38) = 0;
    }
    else
    {
      *(_QWORD *)a1 = v3[6];
      *(_WORD *)(a1 + 38) = 1;
      v14 = *((_DWORD *)v3 + 14);
    }
    *(_DWORD *)(a1 + 32) = v14;
    if( v32 )
      _InterlockedIncrement(v32);
    v15 = *(_QWORD *)(*(_QWORD *)(a1 + 24) + 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((PVOID)v15);
    v18 = v29;
    while( v18 != (__int64 *)&v29 )
    {
      v23 = v18;
      v18 = (__int64 *)*v18;
      LOBYTE(BugCheckParameter4) = 1;
      LODWORD(BoostPriority) = *((_DWORD *)v23 + 14);
      KeSetEventBoostPriorityEx((_KEVENT *)(v23 + 2), 0i64, &BoostPriority, 0i64, BugCheckParameter4);
    }
  }
  else
  {
    FsRtlReleaseHeaderMutex(a1, v32);
  }
}

Referenced by:

No references.