IovpCallDriver1
int __fastcall IovpCallDriver1(__int64 a1){
unsigned __int64 v1;
unsigned __int8 CurrentIrql;
volatile signed __int32 *v4;
__int64 v5;
__int64 v6;
int v7;
int v8;
unsigned __int8 *v9;
int ShouldForce;
char *v11;
int v12;
__int64 v13;
int v14;
int v15;
__int64 v16;
_DEVICE_OBJECT *v17;
_DEVICE_OBJECT *v18;
__int64 v19;
int IsNewRequest;
char v21;
int v22;
__int64 v23;
bool v24;
void *LowerDeviceObjectWithTag;
__int64 v26;
_QWORD *v27;
_QWORD *v28;
__int64 v29;
__int64 v30;
void *v31;
VOID *v32;
char *v33;
char v34;
VOID *v36;
_IO_STACK_LOCATION *IrpLastSp;
__int64 v38;
char *v39;
INT64 started;
int v41;
int v42;
int v43;
VOID *v44;
v1 = *(_QWORD *)(a1 + 168);
v38 = 0i64;
IrpLastSp = 0i64;
v42 = 0;
CurrentIrql = KeGetCurrentIrql();
LODWORD(v4) = *(_DWORD *)(v1 + 16) & 0xC0000000;
if( (_DWORD)v4 )
{
if( (_DWORD)v4 != 0x40000000 )
return(int)v4;
v4 = VfIrpDatabaseEntryFindAndLock(v1);
v5 = (__int64)v4;
}
else
{
v4 = VfIrpDatabaseEntryFindAndLock(v1);
v5 = (__int64)v4;
if( v4 )
{
*(_DWORD *)(v1 + 16) |= 0x40000000u;
}
else
{
LODWORD(v6) = VfPacketCreateAndLock(v1);
v5 = v6;
v7 = *(_DWORD *)(v1 + 16);
if( v5 )
LODWORD(v4) = v7 | 0x40000000;
else
LODWORD(v4) = v7 | 0x80000000;
*(_DWORD *)(v1 + 16) = (_DWORD)v4;
}
}
if( v5 )
{
v8 = *(_DWORD *)(v5 + 232);
*(_BYTE *)(v5 + 61) = CurrentIrql;
*(_BYTE *)(v5 + 60) = CurrentIrql;
v36 = *(VOID **)(a1 + 176);
v9 = (unsigned __int8 *)(*(_QWORD *)(v1 + 184) - 72i64);
started = 0i64;
v44 = v36;
ShouldForce = VfPendingShouldForce(v8, CurrentIrql, v1, v9, v5, (unsigned __int64)v36);
v11 = *(char **)(v5 + 240);
v12 = ShouldForce;
v13 = *(_QWORD *)(a1 + 160);
v43 = ShouldForce;
v39 = v11;
if( v11 || (v14 = *(_DWORD *)(v5 + 56), (v14 & 1) != 0) )
{
v15 = 0;
v41 = 0;
}
else
{
v41 = 1;
*(_DWORD *)(v5 + 56) = v14 | 1;
v11 = IovpSessionDataCreate(v13, (__int64 *)v5, v12);
v39 = v11;
v15 = 1;
}
*(_QWORD *)a1 = v11;
*(_QWORD *)(a1 + 16) = v5;
if( v11 )
{
v16 = *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart;
if( v15 )
{
LODWORD(v17) = IovUtilGetBottomDeviceObjectWithTag((PVOID)v13);
v18 = v17;
VfIrpLogRecordEvent(*(unsigned int *)(v5 + 232), v17, (_IRP *)v1);
ObfDereferenceObjectWithTag(v18, 0x49667256ui64);
_InterlockedIncrement((volatile signed __int32 *)(v5 + 20));
v11 = v39;
++*(_DWORD *)(v5 + 24);
IovpSessionDataReference(v11);
}
if( *(_QWORD *)(v1 + 104) )
{
ViErrorReport1(515i64, v44, (const VOID *)v1);
*(_QWORD *)(v1 + 104) = 0i64;
}
if( (*(_DWORD *)(v5 + 56) & 0x10) != 0 )
ViErrorReport1(517i64, v44, (const VOID *)v1);
if( *(_BYTE *)(v1 + 67) <= *(_BYTE *)(v1 + 66)
&& (unsigned __int8)(*v9 - 3) <= 1u
&& *(_QWORD *)(*(_QWORD *)(a1 + 168) + 8i64)
&& (MmVerifierData & 0x6000) != 0 )
{
MdlInvariantPreProcessing1(a1, v5, (INT64)v9);
}
*((_DWORD *)v11 + 14) = IovpExamineDevObjForwarding(v13, *((_QWORD *)v11 + 6));
IovpExamineIrpStackForwarding(v5, v41, v19, v1, v44, (unsigned __int16 *)v9, &IrpLastSp, &v42);
if( v43 )
{
_InterlockedIncrement((volatile signed __int32 *)(v5 + 20));
++*(_DWORD *)(v5 + 24);
*(_QWORD *)(v5 + 216) = v9;
started = (INT64)VfPendingStartLogging((_IRP *)v1);
}
IsNewRequest = VfMajorIsNewRequest(IrpLastSp, (_IO_STACK_LOCATION *)v9);
v21 = *(_BYTE *)(v1 + 67);
v43 = IsNewRequest;
v22 = IovpAdvanceStackDownwards(
(__int64)(v11 + 80),
v21,
(__int64)v9,
(__int64)IrpLastSp,
v42,
IsNewRequest,
1,
&v38);
v23 = v38;
*(_QWORD *)(v38 + 48) = v16;
if( !v22 )
{
*(_DWORD *)(a1 + 24) |= 0x4000000u;
v24 = v43 == 0;
*(_QWORD *)(a1 + 40) = a1 + 32;
*(_QWORD *)(a1 + 32) = a1 + 32;
*(_QWORD *)(v23 + 56) = v16;
v23 = v38;
*(_QWORD *)(v38 + 112) = KeGetCurrentThread();
if( !v24 )
{
*(_OWORD *)(v23 + 80) = *(_OWORD *)(v1 + 48);
*(_OWORD *)(v23 + 96) = *(_OWORD *)(v1 + 48);
if( v41 )
*(_DWORD *)(v23 + 4) |= 0x8000000u;
}
}
LowerDeviceObjectWithTag = IovUtilGetLowerDeviceObjectWithTag(v13);
if( LowerDeviceObjectWithTag )
ObfDereferenceObjectWithTag(LowerDeviceObjectWithTag, 0x49667256ui64);
else
*(_DWORD *)(v23 + 4) |= 0x10000000u;
LODWORD(v26) = VfGetPristineDispatchRoutine(*(DRIVER_OBJECT **)(v13 + 8), *v9);
*(_QWORD *)(v23 + 40) = v26;
v27 = (_QWORD *)(a1 + 32);
*(_DWORD *)(v23 + 4) &= ~0x40000000u;
v28 = (_QWORD *)(v23 + 16);
v29 = *(_QWORD *)(v23 + 16);
if( *(_QWORD *)(v29 + 8) != v23 + 16 )
__fastfail(3u);
*v27 = v29;
*(_QWORD *)(a1 + 40) = v28;
*(_QWORD *)(v29 + 8) = v27;
*v28 = v27;
*(_QWORD *)(a1 + 8) = v23;
*(_QWORD *)(a1 + 72) = v1;
v30 = *(_QWORD *)(v1 + 184);
*(_OWORD *)(a1 + 80) = *(_OWORD *)(v30 - 72);
*(_OWORD *)(a1 + 96) = *(_OWORD *)(v30 - 56);
*(_OWORD *)(a1 + 112) = *(_OWORD *)(v30 - 40);
*(_OWORD *)(a1 + 128) = *(_OWORD *)(v30 - 24);
*(_QWORD *)(a1 + 144) = *(_QWORD *)(v30 - 8);
if( (v9[3] & 1) != 0 )
*(_DWORD *)(a1 + 24) |= 0x1000000u;
if( *v9 == 27 && v9[1] == 2 )
{
*(_DWORD *)(a1 + 24) |= 0x20000000u;
LODWORD(v31) = IovUtilGetBottomDeviceObjectWithTag((PVOID)v13);
*(_QWORD *)(a1 + 64) = v31;
ObfDereferenceObjectWithTag(v31, 0x49667256ui64);
if( (unsigned int)IovUtilIsInFdoStack((DEVICE_OBJECT *)v13)
&& !(unsigned int)IovUtilIsDeviceObjectMarked(v13, 3) )
{
*(_DWORD *)(a1 + 24) |= 0x10000000u;
}
VfDevObjMarkDeviceRemoved((DEVICE_OBJECT *)v13);
}
v32 = v44;
if( v41 )
VfMajorVerifyNewIrp(v5, v1, v9, v23, (__int64)v44);
if( v43 && (*(_DWORD *)(v5 + 56) & 0x80000) == 0 )
VfMajorVerifyNewRequest(v5, v13, (__int64)IrpLastSp, v9, v23, (__int64)v32);
VfMajorVerifyIrpStackDownward(v5, v13, (__int64)IrpLastSp, v9, v23, (__int64)v32);
v33 = v39;
*((_QWORD *)v39 + 6) = v13;
*(_BYTE *)(v5 + 186) = *(_BYTE *)(v1 + 67);
*(_OWORD *)(*(_QWORD *)(v23 + 8) + 96i64) = *(_OWORD *)(v1 + 48);
v34 = *(_BYTE *)(v1 + 67);
if( v34 > 2 )
{
*(_QWORD *)(v1 + 184) -= 72i64;
*(_BYTE *)(v1 + 67) = v34 - 1;
*(_BYTE *)(*(_QWORD *)(v1 + 184) - 69i64) |= 0x10u;
++*(_BYTE *)(v1 + 67);
*(_QWORD *)(v1 + 184) += 72i64;
}
IovpSessionDataReference(v33);
_InterlockedIncrement((volatile signed __int32 *)(v5 + 20));
if( VfWdCancelTimeoutTicks )
ViWdBeforeCallDriver((_IRP *)v1, *(VOID **)(a1 + 48), (_VF_WATCHDOG_IRP **)(v5 + 248));
}
VfIrpDatabaseEntryReleaseLock((_QWORD *)v5);
LODWORD(v4) = started;
if( started )
LODWORD(v4) = VfPendingFinishLogging(started);
}
return(int)v4;
}Referenced by:
VfBeforeCallDriver