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