RawInitiateDeleteVolume

CHAR __fastcall RawInitiateDeleteVolume(INT64 a1, INT64 a2, INT64 a3){
  CHAR v3; 
  int v4; 
  int v5; 
  KIRQL v7; 
  __int64 v9; 
  INT64 v10; 
  KIRQL v11; 
  __int64 v12; 
  _QWORD *v13; 
  __int64 v14; 
  KIRQL v15; 
  __int64 v16; 
  _QWORD *v17; 
  INT64 *v18; 
  __int64 v19; 
  _QWORD *v20; 
  KIRQL Irql; 
  v3 = 0;
  v4 = a3;
  Irql = 0;
  v5 = a2;
  if( (*(_DWORD *)(a1 + 104) & 4) != 0 )
  {
    if( *(_DWORD *)(a1 + 112) )
      return v3;
    IoAcquireVpbSpinLock(&Irql);
    v7 = Irql;
    if( *(_DWORD *)(*(_QWORD *)(a1 + 184) + 28i64) )
      goto LABEL_5;
    IoReleaseVpbSpinLock(Irql);
    ExAcquireFastMutex(&RawGlobalLock);
    v19 = *(_QWORD *)(a1 + 160);
    if( *(_QWORD *)(v19 + 8) == a1 + 160 )
    {
      v20 = *(_QWORD **)(a1 + 168);
      if( *v20 == a1 + 160 )
      {
        *v20 = v19;
        *(_QWORD *)(v19 + 8) = v20;
        KeReleaseGuardedMutex(&RawGlobalLock);
        goto LABEL_11;
      }
    }
LABEL_21:
    __fastfail(3u);
  }
  IoAcquireVpbSpinLock(&Irql);
  if( v5 || *(_DWORD *)(a1 + 108) + *(_DWORD *)(*(_QWORD *)(a1 + 184) + 28i64) == v4 )
  {
    v9 = *(_QWORD *)(a1 + 184);
    v10 = a1 + 160;
    if( *(_DWORD *)(a1 + 112) + *(_DWORD *)(v9 + 28) )
    {
      memset(*(_QWORD *)(a1 + 192), 0i64);
      **(_WORD **)(a1 + 192) = 10;
      *(_WORD *)(*(_QWORD *)(a1 + 192) + 2i64) = 96;
      *(_QWORD *)(*(_QWORD *)(a1 + 192) + 16i64) = *(_QWORD *)(*(_QWORD *)(a1 + 184) + 16i64);
      *(_QWORD *)(*(_QWORD *)(a1 + 192) + 8i64) = 0i64;
      *(_WORD *)(*(_QWORD *)(a1 + 192) + 4i64) = *(_WORD *)(*(_QWORD *)(a1 + 184) + 4i64) & 8;
      *(_QWORD *)(*(_QWORD *)(*(_QWORD *)(a1 + 184) + 16i64) + 56i64) = *(_QWORD *)(a1 + 192);
      v14 = *(_QWORD *)(a1 + 184);
      v15 = Irql;
      *(_QWORD *)(a1 + 192) = 0i64;
      *(_WORD *)(v14 + 4) |= 4u;
      *(_DWORD *)(a1 + 104) |= 8u;
      IoReleaseVpbSpinLock(v15);
      ExAcquireFastMutex(&RawGlobalLock);
      v16 = *(_QWORD *)v10;
      if( *(_QWORD *)(*(_QWORD *)v10 + 8i64) == v10 )
      {
        v17 = *(_QWORD **)(a1 + 168);
        if( *v17 == v10 )
        {
          *v17 = v16;
          *(_QWORD *)(v16 + 8) = v17;
          *(_DWORD *)(a1 + 104) |= 6u;
          v18 = (INT64 *)qword_140C1DCE8;
          if( *(__int64 **)qword_140C1DCE8 == &RawDismountedQueue )
          {
            *(_QWORD *)v10 = &RawDismountedQueue;
            *(_QWORD *)(a1 + 168) = v18;
            *v18 = v10;
            qword_140C1DCE8 = a1 + 160;
            KeReleaseGuardedMutex(&RawGlobalLock);
            return v3;
          }
        }
      }
    }
    else
    {
      *(_WORD *)(v9 + 4) &= ~1u;
      v11 = Irql;
      *(_QWORD *)(*(_QWORD *)(a1 + 184) + 8i64) = 0i64;
      IoReleaseVpbSpinLock(v11);
      ExAcquireFastMutex(&RawGlobalLock);
      v12 = *(_QWORD *)v10;
      if( *(_QWORD *)(*(_QWORD *)v10 + 8i64) == v10 )
      {
        v13 = *(_QWORD **)(a1 + 168);
        if( *v13 == v10 )
        {
          *v13 = v12;
          *(_QWORD *)(v12 + 8) = v13;
          KeReleaseGuardedMutex(&RawGlobalLock);
          *(_DWORD *)(a1 + 104) |= 2u;
LABEL_11:
          KeReleaseGuardedMutex((_FAST_MUTEX *)(a1 + 224));
          RawCleanupVcb((PFSRTL_ADVANCED_FCB_HEADER)a1);
          RawDeleteVcb(a1);
          return 1;
        }
      }
    }
    goto LABEL_21;
  }
  v7 = Irql;
LABEL_5:
  IoReleaseVpbSpinLock(v7);
  return v3;
}

Referenced by:

RawCleanup
RawClose
RawCompletionRoutine
RawCreate
RawReadWriteDeviceControl
RawVerifyVolume