FsRtlUninitializeOplock

VOID __stdcall FsRtlUninitializeOplock(PVOID *Oplock){
  char *v1; 
  _QWORD *v2; 
  char *v3; 
  _QWORD *v4; 
  _QWORD *v5; 
  _QWORD *v6; 
  char *v7; 
  char *v8; 
  __int64 v9; 
  __int64 v10; 
  __int64 v11; 
  _LIST_ENTRY *v12; 
  _QWORD *v13; 
  __int64 v14; 
  _QWORD *v15; 
  _RH_OP_CONTEXT *v16; 
  __int64 v17; 
  __int64 v18; 
  __int64 v19; 
  void *v20; 
  void *v21; 
  INT64 v22; 
  INT64 v23; 
  UINT64 v24; 
  v1 = (char *)*Oplock;
  if( *Oplock )
  {
    *Oplock = 0i64;
    ExAcquireFastMutexUnsafe(*((PFAST_MUTEX *)v1 + 19));
    while( 1 )
    {
      v2 = v1 + 88;
      v3 = (char *)*((_QWORD *)v1 + 11);
      if( v3 == v1 + 88 )
        break;
      v4 = *(_QWORD **)v3;
      if( *((_QWORD **)v3 + 1) != v2 || (char *)v4[1] != v3 )
        __fastfail(3u);
      *v2 = v4;
      v4[1] = v2;
      v5 = (_QWORD *)*((_QWORD *)v3 + 2);
      if( v5 )
      {
        *((_BYTE *)v5 + 69) = KeAcquireQueuedSpinLock(7ui64);
        _InterlockedExchange64(v5 + 13, 0i64);
        KeReleaseQueuedSpinLock(7ui64, *((_BYTE *)v5 + 69));
        v5[7] = 0i64;
        v5 = (_QWORD *)*((_QWORD *)v3 + 2);
      }
      (*((void(__fastcall **)(_QWORD, _QWORD *))v3 + 3))(*((_QWORD *)v3 + 4), v5);
      ExFreePoolWithTag(v3, 0);
    }
    while( 1 )
    {
      v6 = v1 + 40;
      v7 = (char *)*((_QWORD *)v1 + 5);
      if( v7 == v1 + 40 )
        break;
      v8 = v7 - 168;
      v9 = *((_QWORD *)v7 + 2);
      v10 = *(_QWORD *)v7;
      if( *((_QWORD **)v7 + 1) != v6 || *(char **)(v10 + 8) != v7 )
        __fastfail(3u);
      *v6 = v10;
      *(_QWORD *)(v10 + 8) = v6;
      v8[69] = KeAcquireQueuedSpinLock(7ui64);
      _InterlockedExchange64((volatile __int64 *)v8 + 13, 0i64);
      KeReleaseQueuedSpinLock(7ui64, v8[69]);
      ObfDereferenceObjectWithTag(*(PVOID *)(v9 + 48), 0x746C6644ui64);
      if( *(_DWORD *)(v9 + 24) == 590400 )
      {
        v11 = *((_QWORD *)v8 + 3);
        *(_OWORD *)v11 = 0i64;
        *(_QWORD *)(v11 + 16) = 0i64;
        *(_DWORD *)v11 = 1572865;
        *(_DWORD *)(v11 + 4) = (*((_DWORD *)v1 + 36) >> 12) & 7;
        *((_QWORD *)v8 + 7) = 24i64;
      }
      else
      {
        *((_QWORD *)v8 + 7) = 8i64;
      }
      *((_DWORD *)v8 + 12) = 0;
      IofCompleteRequest((_IRP *)v8, 1);
    }
    while( 1 )
    {
      v12 = (_LIST_ENTRY *)*((_QWORD *)v1 + 7);
      if( v12 == (_LIST_ENTRY *)(v1 + 56) )
        break;
      if( (*((_DWORD *)v1 + 36) & 0x10000) != 0 && v12[3].Blink )
      {
        FsRtlpOplockDequeueRH(*((_RH_OP_CONTEXT **)v1 + 7));
        v14 = *v13;
        v15 = (_QWORD *)v13[1];
        if( *(_QWORD **)(*v13 + 8i64) != v13 || (_QWORD *)*v15 != v13 )
          __fastfail(3u);
        *v15 = v14;
        *(_QWORD *)(v14 + 8) = v15;
        if( *((char **)v1 + 15) == v1 + 120 )
          *((_DWORD *)v1 + 36) &= 0xFFFCFFFF;
        if( v12[2].Blink )
          FsRtlpClearOwner((INT64)v1, (INT64)v12);
        ExFreePoolWithTag(v12, 0);
      }
      else if( (unsigned int)Feature_Servicing_39887415__private_IsEnabled() )
      {
        LODWORD(v23) = 0;
        LODWORD(v22) = 0;
        FsRtlpRemoveAndCompleteRHIrp((INT64)v12, (INT64)v1, 0i64, 0i64, v22, v23, 0);
      }
      else
      {
        LODWORD(v24) = 0;
        LODWORD(v23) = 0;
        LODWORD(v22) = 0;
        FsRtlpRemoveAndBreakRHIrp(v12, (_NONOPAQUE_OPLOCK *)v1, 1u, 0i64, v22, v23, v24, 0);
      }
    }
    while( 1 )
    {
      v16 = (_RH_OP_CONTEXT *)*((_QWORD *)v1 + 9);
      if( v16 == (_RH_OP_CONTEXT *)(v1 + 72) )
        break;
      FsRtlpOplockDequeueRH(*((_RH_OP_CONTEXT **)v1 + 9));
      FsRtlpModifyThreadPriorities((_NONOPAQUE_OPLOCK *)v1, v16, 0);
      ObfDereferenceObjectWithTag(v16->OplockRequestFileObject, 0x746C6644ui64);
      FsRtlpClearOwner((INT64)v1, (INT64)v16);
      ExFreePoolWithTag(v16, 0);
    }
    v17 = *(_QWORD *)v1;
    if( *(_QWORD *)v1 )
    {
      v18 = *(_QWORD *)(v17 + 184);
      *(_BYTE *)(v17 + 69) = KeAcquireQueuedSpinLock(7ui64);
      _InterlockedExchange64((volatile __int64 *)(v17 + 104), 0i64);
      KeReleaseQueuedSpinLock(7ui64, *(_BYTE *)(v17 + 69));
      if( *(_DWORD *)(v18 + 24) == 590400 )
      {
        v19 = *(_QWORD *)(v17 + 24);
        *(_OWORD *)v19 = 0i64;
        *(_QWORD *)(v19 + 16) = 0i64;
        *(_DWORD *)v19 = 1572865;
        *(_DWORD *)(v19 + 4) = (*((_DWORD *)v1 + 36) >> 12) & 7;
        *(_QWORD *)(v17 + 56) = 24i64;
      }
      else
      {
        *(_QWORD *)(v17 + 56) = 8i64;
      }
      *(_DWORD *)(v17 + 48) = 0;
      IofCompleteRequest((_IRP *)v17, 1);
      *(_QWORD *)v1 = 0i64;
      v20 = (void *)*((_QWORD *)v1 + 1);
      if( v20 )
        ObfDereferenceObjectWithTag(v20, 0x746C6644ui64);
      FsRtlpModifyThreadPriorities((_NONOPAQUE_OPLOCK *)v1, 0i64, 0);
      FsRtlpClearOwner((INT64)v1, 0i64);
    }
    ExReleaseFastMutexUnsafe(*((PFAST_MUTEX *)v1 + 19));
    v21 = (void *)*((_QWORD *)v1 + 17);
    if( v21 )
      ExFreePoolWithTag(v21, 0);
    ExFreePoolWithTag(*((PVOID *)v1 + 19), 0);
    ExFreePoolWithTag(v1, 0);
  }
}

Referenced by:

No references.