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