IovpCallDriver2
VOID **__fastcall IovpCallDriver2(INT64 a1, INT64 *a2){
VOID **result;
_DWORD *v3;
__int64 v6;
char v7;
bool v8;
int v9;
_DEVICE_OBJECT *v10;
VOID *LowerDeviceObjectWithTag;
VOID *v12;
_DEVICE_OBJECT *v13;
_DWORD *DeviceNode;
int v15;
_FAST_IO_DISPATCH *FastIoDispatch;
_VF_ERROR_ID v17;
int v18;
INT64 v19;
_VF_ERROR_ID v20;
VOID *v21;
INT64 v22;
int v23;
int v24;
__int64 v25;
_QWORD *v26;
int v27;
void *retaddr;
result = &retaddr;
v3 = *(_DWORD **)a1;
if( !*(_QWORD *)a1 )
return result;
v6 = *(_QWORD *)(a1 + 16);
v7 = KeAcquireSpinLockRaiseToDpc((UINT64 *)(v6 + 8));
v8 = *(_QWORD *)(v6 + 216) == 0i64;
*(_BYTE *)(v6 + 16) = v7;
if( !v8 && (*(_DWORD *)(a1 + 24) & 0x2000000) != 0 )
*(_DWORD *)a2 = 259;
v9 = *(_DWORD *)(a1 + 24);
v10 = *(_DEVICE_OBJECT **)(a1 + 160);
if( (v9 & 0x20000000) != 0 && *(_DWORD *)a2 != 259 && (v9 & 0x1000000) == 0 )
{
LowerDeviceObjectWithTag = IovUtilGetLowerDeviceObjectWithTag(*(_QWORD *)(a1 + 160));
v12 = LowerDeviceObjectWithTag;
if( (*(_DWORD *)(a1 + 24) & 0x10000000) != 0 )
{
LABEL_12:
if( !LowerDeviceObjectWithTag )
goto LABEL_19;
FastIoDispatch = v10->DriverObject->FastIoDispatch;
if( FastIoDispatch && FastIoDispatch->FastIoDetachDevice )
goto LABEL_17;
v17 = 541;
goto LABEL_16;
}
v13 = *(_DEVICE_OBJECT **)(a1 + 64);
DeviceNode = v13->DeviceObjectExtension->DeviceNode;
if( !DeviceNode )
goto LABEL_17;
v15 = DeviceNode[99];
if( (v15 & 0x10) == 0 )
{
if( (v15 & 0x10000) == 0 )
goto LABEL_17;
goto LABEL_12;
}
if( v10 == v13 )
{
if( (unsigned int)IovUtilIsDeviceObjectMarked(v10, 0) )
{
v17 = 545;
LABEL_16:
ViErrorReport10(v17, *(VOID **)(a1 + 48), *(const VOID **)(a1 + 72), v10);
}
}
else if( !(unsigned int)IovUtilIsDeviceObjectMarked(v10, 0) && (unsigned int)IovUtilIsDeviceObjectMarked(v10, 0) )
{
v17 = 547;
goto LABEL_16;
}
LABEL_17:
if( v12 )
ObfDereferenceObjectWithTag(v12, 0x49667256ui64);
}
LABEL_19:
v18 = *(_DWORD *)(a1 + 24);
if( (v18 & 0x40000000) == 0 || (v3[8] & 2) != 0 )
goto LABEL_35;
v19 = *(unsigned int *)a2;
if( (v18 & 0x2000000) != 0 )
{
if( (_DWORD)v19 == 259 || (v18 & 0x1000000) != 0 )
goto LABEL_35;
v20 = 574;
}
else
{
if( (_DWORD)v19 != 259 && (v18 & 0x1000000) == 0 )
goto LABEL_35;
v20 = 588;
}
ViErrorReport6(v20, *(VOID **)(a1 + 48), *(const VOID **)(a1 + 72), v19);
v3[8] |= 2u;
LABEL_35:
v21 = (VOID *)*(unsigned int *)a2;
if( (*(_DWORD *)(a1 + 24) & 0x40000000) != 0 )
{
v22 = *(unsigned int *)(a1 + 56);
if( (_DWORD)v21 == (_DWORD)v22 || (_DWORD)v21 == 259 )
{
if( (_DWORD)v21 == -1 )
ViErrorReport6(549, *(VOID **)(a1 + 48), *(const VOID **)(a1 + 72), 0xFFFFFFFFi64);
}
else
{
v23 = v3[8];
if( (v23 & 1) == 0 )
{
ViErrorReport4(v21, *(_IRP_MINI_SNAPSHOT **)(a1 + 48), a1 + 72, v22);
v23 = v3[8];
}
v3[8] = v23 | 1;
}
}
else
{
if( (_DWORD)v21 != 259 )
{
v24 = *(_DWORD *)(v6 + 56);
if( (v24 & 0x400000) == 0 )
{
ViErrorReport1(550, *(VOID **)(a1 + 48), *(const VOID **)(a1 + 72));
v24 = *(_DWORD *)(v6 + 56);
}
*(_DWORD *)(v6 + 56) = v24 | 0x400000;
}
*(_DWORD *)(*(_QWORD *)(a1 + 8) + 4i64) |= 0x4000000u;
v25 = *(_QWORD *)(a1 + 32);
if( *(_QWORD *)(v25 + 8) != a1 + 32 || (v26 = *(_QWORD **)(a1 + 40), *v26 != a1 + 32) )
__fastfail(3u);
*v26 = v25;
*(_QWORD *)(v25 + 8) = v26;
}
v27 = *(_DWORD *)(a1 + 24);
if( (v27 & 0x8000000) != 0 && *(_DWORD *)a2 != 259 && (v27 & 0x1000000) == 0 )
*(_DWORD *)a2 = *(_DWORD *)(a1 + 60);
IovpSessionDataDereference(v3);
_InterlockedDecrement((volatile signed __int32 *)(v6 + 20));
VfIrpDatabaseEntryReleaseLock((_IOV_DATABASE_HEADER *)v6);
return result;
}Referenced by:
VfAfterCallDriver