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