IovpSessionDataDereference
VOID __stdcall IovpSessionDataDereference(VOID *IovSessionData){
bool v1;
__int64 v2;
_QWORD *v3;
__int64 v4;
_QWORD *v5;
v1 = (*((_DWORD *)IovSessionData + 2))-- == 1;
v2 = *(_QWORD *)IovSessionData;
if( v1 )
{
v3 = (char *)IovSessionData + 16;
v4 = *((_QWORD *)IovSessionData + 2);
if( *(VOID **)(v4 + 8) != (char *)IovSessionData + 16
|| (v5 = (_QWORD *)*((_QWORD *)IovSessionData + 3), (_QWORD *)*v5 != v3) )
{
__fastfail(3u);
}
*v5 = v4;
*(_QWORD *)(v4 + 8) = v5;
*((_QWORD *)IovSessionData + 3) = (char *)IovSessionData + 16;
*v3 = v3;
_InterlockedDecrement((volatile signed __int32 *)(v2 + 20));
if( (*((_DWORD *)IovSessionData + 8) & 4) != 0 )
ExFreeToNPagedLookasideList(&ViSessionDataLookaside, IovSessionData);
else
VfUtilFreePoolDispatchLevel(IovSessionData);
}
}Referenced by:
IovpCallDriver2
IovpCompleteRequest2
IovpLocalCompletionRoutine