FsRtlUninitializeOplock

VOID __stdcall FsRtlUninitializeOplock(VOID **Oplock){
  char *v1; 
  INT64 v2; 
  INT64 v3; 
  _QWORD *v4; 
  char *v5; 
  _QWORD *v6; 
  _QWORD *v7; 
  INT64 *v8; 
  INT64 *v9; 
  INT64 *v10; 
  INT64 v11; 
  INT64 v12; 
  _CCHAR v13; 
  INT64 v14; 
  _RH_OP_CONTEXT *v15; 
  _QWORD *v16; 
  __int64 v17; 
  _QWORD *v18; 
  _RH_OP_CONTEXT *v19; 
  PFAST_MUTEX v20; 
  __int64 v21; 
  _CCHAR v22; 
  __int64 v23; 
  VOID *v24; 
  void *v25; 
  INT64 v26; 
  INT64 v27; 
  UINT64 AccessMode; 

  v1 = (char *)*Oplock;
  if( *Oplock )
  {
    *Oplock = 0i64;
    ExAcquireFastMutexUnsafe(*((PFAST_MUTEX *)v1 + 19));
    while( 1 )
    {
      v4 = v1 + 88;
      v5 = (char *)*((_QWORD *)v1 + 11);
      if( v5 == v1 + 88 )
        break;
      v6 = *(_QWORD **)v5;
      if( *((_QWORD **)v5 + 1) != v4 || (char *)v6[1] != v5 )
        __fastfail(3u);
      *v4 = v6;
      v6[1] = v4;
      v7 = (_QWORD *)*((_QWORD *)v5 + 2);
      if( v7 )
      {
        *((_BYTE *)v7 + 69) = KeAcquireQueuedSpinLock(7i64, v2, v3);
        _InterlockedExchange64(v7 + 13, 0i64);
        KeReleaseQueuedSpinLock(LockQueueIoCancelLock, *((_BYTE *)v7 + 69));
        v7[7] = 0i64;
        v7 = (_QWORD *)*((_QWORD *)v5 + 2);
      }
      (*((void(__fastcall **)(_QWORD, _QWORD *))v5 + 3))(*((_QWORD *)v5 + 4), v7);
      ExFreePoolWithTag(v5, 0);
    }
    while( 1 )
    {
      v8 = (INT64 *)(v1 + 40);
      v9 = (INT64 *)*((_QWORD *)v1 + 5);
      if( v9 == (INT64 *)(v1 + 40) )
        break;
      v10 = v9 - 21;
      v11 = v9[2];
      v12 = *v9;
      if( (INT64 *)v9[1] != v8 || *(INT64 **)(v12 + 8) != v9 )
        __fastfail(3u);
      *v8 = v12;
      *(_QWORD *)(v12 + 8) = v8;
      *((_BYTE *)v10 + 69) = KeAcquireQueuedSpinLock(7i64, v12, v3);
      _InterlockedExchange64(v10 + 13, 0i64);
      KeReleaseQueuedSpinLock(LockQueueIoCancelLock, *((_BYTE *)v10 + 69));
      ObfDereferenceObjectWithTag(*(VOID **)(v11 + 48), 0x746C6644ui64);
      if( *(_DWORD *)(v11 + 24) == 590400 )
      {
        v14 = v10[3];
        *(_OWORD *)v14 = 0i64;
        *(_QWORD *)(v14 + 16) = 0i64;
        *(_DWORD *)v14 = 1572865;
        *(_DWORD *)(v14 + 4) = (*((_DWORD *)v1 + 36) >> 12) & 7;
        v10[7] = 24i64;
      }
      else
      {
        v10[7] = 8i64;
      }
      *((_DWORD *)v10 + 12) = 0;
      LOBYTE(v13) = 1;
      IofCompleteRequest((PIRP)v10, v13);
    }
    while( 1 )
    {
      v15 = (_RH_OP_CONTEXT *)*((_QWORD *)v1 + 7);
      if( v15 == (_RH_OP_CONTEXT *)(v1 + 56) )
        break;
      if( (*((_DWORD *)v1 + 36) & 0x10000) != 0 && v15->AtomicLinks.Flink )
      {
        FsRtlpOplockDequeueRH(*((_RH_OP_CONTEXT **)v1 + 7));
        v17 = *v16;
        v18 = (_QWORD *)v16[1];
        if( *(_QWORD **)(*v16 + 8i64) != v16 || (_QWORD *)*v18 != v16 )
          __fastfail(3u);
        *v18 = v17;
        *(_QWORD *)(v17 + 8) = v18;
        if( *((char **)v1 + 15) == v1 + 120 )
          *((_DWORD *)v1 + 36) &= 0xFFFCFFFF;
        if( v15->OplockOwnerThread )
          FsRtlpClearOwner((_NONOPAQUE_OPLOCK *)v1, v15);
        ExFreePoolWithTag(v15, 0);
      }
      else if( Feature_Servicing_39887415__private_IsEnabled() )
      {
        LODWORD(v27) = 0;
        LODWORD(v26) = 0;
        FsRtlpRemoveAndCompleteRHIrp(v15, (_NONOPAQUE_OPLOCK *)v1, 0i64, 0i64, v26, v27, 0);
      }
      else
      {
        LODWORD(AccessMode) = 0;
        LODWORD(v27) = 0;
        LODWORD(v26) = 0;
        FsRtlpRemoveAndBreakRHIrp(v15, (_NONOPAQUE_OPLOCK *)v1, 1u, 0i64, v26, v27, AccessMode, 0);
      }
    }
    while( 1 )
    {
      v19 = (_RH_OP_CONTEXT *)*((_QWORD *)v1 + 9);
      if( v19 == (_RH_OP_CONTEXT *)(v1 + 72) )
        break;
      FsRtlpOplockDequeueRH(*((_RH_OP_CONTEXT **)v1 + 9));
      FsRtlpModifyThreadPriorities((_NONOPAQUE_OPLOCK *)v1, v19, 0);
      ObfDereferenceObjectWithTag(v19->OplockRequestFileObject, 0x746C6644ui64);
      FsRtlpClearOwner((_NONOPAQUE_OPLOCK *)v1, v19);
      ExFreePoolWithTag(v19, 0);
    }
    v20 = *(PFAST_MUTEX *)v1;
    if( *(_QWORD *)v1 )
    {
      v21 = *(_QWORD *)&v20[3].Contention;
      BYTE5(v20[1].Owner) = KeAcquireQueuedSpinLock(7i64, v2, v3);
      _InterlockedExchange64((volatile __int64 *)&v20[1].OldIrql, 0i64);
      KeReleaseQueuedSpinLock(LockQueueIoCancelLock, BYTE5(v20[1].Owner));
      if( *(_DWORD *)(v21 + 24) == 590400 )
      {
        v23 = *(_QWORD *)&v20->gap14[4];
        *(_OWORD *)v23 = 0i64;
        *(_QWORD *)(v23 + 16) = 0i64;
        *(_DWORD *)v23 = 1572865;
        *(_DWORD *)(v23 + 4) = (*((_DWORD *)v1 + 36) >> 12) & 7;
        *(_QWORD *)&v20[1].Count = 24i64;
      }
      else
      {
        *(_QWORD *)&v20[1].Count = 8i64;
      }
      v20->OldIrql = 0;
      LOBYTE(v22) = 1;
      IofCompleteRequest((PIRP)v20, v22);
      *(_QWORD *)v1 = 0i64;
      v24 = (VOID *)*((_QWORD *)v1 + 1);
      if( v24 )
        ObfDereferenceObjectWithTag(v24, 0x746C6644ui64);
      FsRtlpModifyThreadPriorities((_NONOPAQUE_OPLOCK *)v1, 0i64, 0);
      FsRtlpClearOwner((_NONOPAQUE_OPLOCK *)v1, 0i64);
    }
    ExReleaseFastMutexUnsafe(*((PFAST_MUTEX *)v1 + 19));
    v25 = (void *)*((_QWORD *)v1 + 17);
    if( v25 )
      ExFreePoolWithTag(v25, 0);
    ExFreePoolWithTag(*((PVOID *)v1 + 19), 0);
    ExFreePoolWithTag(v1, 0);
  }
}

Referenced by:

No references.