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