IovpSessionDataCreate

_IOV_SESSION_DATA *__stdcall IovpSessionDataCreate(
        _DEVICE_OBJECT *DeviceObject,
        _IOV_REQUEST_PACKET *IovPacket,
        UINT64 AlwaysCreate){
  __int64 v4; 
  int v5; 
  size_t v6; 
  int v7; 
  char *PoolWithTag; 
  char *v9; 
  _IOV_SESSION_DATA *result; 
  _QWORD *v11; 
  _IOV_REQUEST_PACKET *v12; 
  __int64 v13; 

  if( !(_DWORD)AlwaysCreate && !(unsigned int)IovUtilIsVerifiedDeviceStack(DeviceObject) )
    return 0i64;
  v4 = *(_QWORD *)IovPacket;
  v5 = *(char *)(*(_QWORD *)IovPacket + 66i64);
  v6 = 120 * v5 + 200;
  if( *(char *)(*(_QWORD *)IovPacket + 66i64) <= 20 && ViSessionDataInitialized )
  {
    v7 = 1;
    PoolWithTag = (char *)ExAllocateFromNPagedLookasideList(&ViSessionDataLookaside);
  }
  else
  {
    v7 = 0;
    PoolWithTag = (char *)ExAllocatePoolWithTag(0x200ui64, (unsigned int)(120 * v5 + 200), 1936749129i64);
  }
  v9 = PoolWithTag;
  if( !PoolWithTag )
    return 0i64;
  memset(PoolWithTag, 0i64, v6);
  if( v7 )
    *((_DWORD *)v9 + 8) |= 4u;
  v11 = v9 + 16;
  *((_DWORD *)v9 + 18) = MmVerifierData;
  v12 = IovPacket + 16;
  *(_QWORD *)v9 = IovPacket;
  v13 = *((_QWORD *)IovPacket + 8);
  if( *(_IOV_REQUEST_PACKET **)(v13 + 8) != IovPacket + 16 )
    __fastfail(3u);
  *((_QWORD *)v9 + 3) = v12;
  *v11 = v13;
  *(_QWORD *)(v13 + 8) = v11;
  *(_QWORD *)v12 = v11;
  *((_QWORD *)IovPacket + 30) = v9;
  *((_BYTE *)IovPacket + 184) = *(_BYTE *)(v4 + 67);
  IovPacket[14] = IovPacket[14] & 0xFFFFFE2E | 1;
  result = (_IOV_SESSION_DATA *)v9;
  *((_QWORD *)v9 + 8) = v4;
  return result;
}

Referenced by:

IovpCallDriver1