IopCheckVpbMounted
VPB *__fastcall IopCheckVpbMounted(INT64 a1, DEVICE_OBJECT *a2, UINT8 *a3, INT64 *a4){
KIRQL CurrentIrql;
KSPIN_LOCK_QUEUE *v9;
KSPIN_LOCK_QUEUE *v10;
ULONG_PTR v11;
_KSPIN_LOCK_QUEUE *v12;
_KSPIN_LOCK_QUEUE *Next;
VPB *result;
bool v15;
bool v16;
NTSTATUS v17;
UINT8 v18;
void *v19;
void *v20;
VPB *Vpb;
Vpb = 0i64;
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
v9 = (KSPIN_LOCK_QUEUE *)(*((_QWORD *)KeGetPcr() + 5) + 144i64);
v10 = (KSPIN_LOCK_QUEUE *)_InterlockedExchange64((volatile __int64 *)v9->Lock, (__int64)v9);
if( v10 )
KxWaitForLockOwnerShip(v9, v10);
v11 = *((_QWORD *)a2 + 7);
if( (*(_BYTE *)(v11 + 4) & 1) != 0 )
{
LABEL_4:
if( (*(_BYTE *)(v11 + 4) & 2) != 0 )
{
*(_DWORD *)a4 = -1073741790;
v11 = 0i64;
}
else if( (int)++*(_DWORD *)(v11 + 28) <= 0 )
{
v19 = *(void **)(v11 + 8);
if( v19 )
{
IoAddTriageDumpDataBlock(v19, 0x150ui64);
v20 = *(void **)(*(_QWORD *)(v11 + 8) + 8i64);
if( v20 )
{
IoAddTriageDumpDataBlock(v20, 0x150ui64);
IoAddTriageDumpDataBlock(
*(PVOID *)(*(_QWORD *)(*(_QWORD *)(v11 + 8) + 8i64) + 64i64),
*(unsigned __int16 *)(*(_QWORD *)(*(_QWORD *)(v11 + 8) + 8i64) + 56i64));
}
}
KeBugCheckEx(0x18u, 0i64, v11, 7ui64, *(unsigned int *)(v11 + 28));
}
v12 = (_KSPIN_LOCK_QUEUE *)(*((_QWORD *)KeGetPcr() + 5) + 144i64);
_m_prefetchw(v12);
Next = v12->Next;
if( !v12->Next )
{
if( v12 == (_KSPIN_LOCK_QUEUE *)_InterlockedCompareExchange64(
(volatile signed __int64 *)v12->Lock,
0i64,
(signed __int64)v12) )
{
LABEL_8:
__writecr8(CurrentIrql);
if( !v11 )
IopDecrementDeviceObjectRef(a2, 0, 0);
return(VPB *)v11;
}
Next = KxWaitForLockChainValid(v12);
}
v12->Next = 0i64;
_InterlockedXor64((volatile signed __int64 *)&Next->Lock, 1ui64);
goto LABEL_8;
}
while( 1 )
{
KeReleaseQueuedSpinLock(9ui64, CurrentIrql);
v15 = (*(_DWORD *)(a1 + 64) & 0x10) != 0;
Vpb = 0i64;
v16 = !*(_WORD *)a3 && !*(_QWORD *)(a1 + 40);
v17 = IopMountVolume(a2, v16, 0, v15, &Vpb);
*(_DWORD *)a4 = v17;
if( v17 < 0 || v17 == 192 || v17 == 257 )
break;
result = Vpb;
if( Vpb )
return result;
v18 = KeAcquireQueuedSpinLock(9ui64);
v11 = *((_QWORD *)a2 + 7);
CurrentIrql = v18;
if( (*(_BYTE *)(v11 + 4) & 1) != 0 )
goto LABEL_4;
}
IopDecrementDeviceObjectRef(a2, 0, 0);
result = 0i64;
if( *(int *)a4 >= 0 )
*(_DWORD *)a4 = -1073741806;
return result;
}Referenced by:
IopParseDevice