IovpSessionDataCreate

char *__fastcall IovpSessionDataCreate(__int64 a1, __int64 *a2, int a3){
  __int64 v4; 
  int v5; 
  VOID *PoolWithTag; 
  __int64 v7; 
  char *result; 
  __int64 *v9; 
  __int64 *v10; 
  __int64 v11; 
  if( !a3 && !(unsigned int)IovUtilIsVerifiedDeviceStack((DEVICE_OBJECT *)a1) )
    return 0i64;
  v4 = *a2;
  if( *(char *)(*a2 + 66) <= 20 && ViSessionDataInitialized )
  {
    v5 = 1;
    LODWORD(PoolWithTag) = ExAllocateFromNPagedLookasideList((NPAGED_LOOKASIDE_LIST *)ViSessionDataLookaside);
  }
  else
  {
    v5 = 0;
    PoolWithTag = ExAllocatePoolWithTag(NonPagedPoolNx, (unsigned int)(120 * *(char *)(*a2 + 66) + 200), 0x73707249ui64);
  }
  v7 = (__int64)PoolWithTag;
  if( !PoolWithTag )
    return 0i64;
  memset((INT64)PoolWithTag, 0i64);
  if( v5 )
    *(_DWORD *)(v7 + 32) |= 4u;
  v9 = (__int64 *)(v7 + 16);
  *(_DWORD *)(v7 + 72) = MmVerifierData;
  v10 = a2 + 8;
  *(_QWORD *)v7 = a2;
  v11 = a2[8];
  if( *(__int64 **)(v11 + 8) != a2 + 8 )
    __fastfail(3u);
  *(_QWORD *)(v7 + 24) = v10;
  *v9 = v11;
  *(_QWORD *)(v11 + 8) = v9;
  *v10 = (__int64)v9;
  a2[30] = v7;
  *((_BYTE *)a2 + 184) = *(_BYTE *)(v4 + 67);
  *((_DWORD *)a2 + 14) = a2[7] & 0xFFFFFE2E | 1;
  result = (char *)v7;
  *(_QWORD *)(v7 + 64) = v4;
  return result;
}

Referenced by:

IovpCallDriver1