ST_STORE::StDeviceIoBuild
VOID **__fastcall ST_STORE::StDeviceIoBuild(__int64 a1, __int64 a2, __int64 a3, __int64 a4){
int v6;
VOID **v7;
int v8;
unsigned int v9;
int v10;
unsigned int v11;
int Reference;
VOID **PoolWithTag;
VOID **v14;
size_t v15;
size_t v16;
int v17;
unsigned int v19;
v6 = *(_DWORD *)(a1 + 824) + *(unsigned __int16 *)(a2 + 4);
v7 = 0i64;
v8 = *(_DWORD *)(a1 + 792);
v9 = *(_DWORD *)a2 >> *(_DWORD *)(a1 + 812);
v19 = v9;
v10 = (v8 - 1) & (16 * (*(_DWORD *)a2 & *(_DWORD *)(a1 + 808)));
v11 = v8 + v10 - ((v8 - 1) & (v10 + v8 + v6 - 1)) + v6 - 1;
Reference = ST_STORE::StRegionReadReference(a1, v9);
if( !Reference )
return v7;
PoolWithTag = *(VOID ***)(a1 + 1800);
if( PoolWithTag )
{
*(_DWORD *)(a1 + 1800) |= 1u;
goto LABEL_5;
}
PoolWithTag = ExAllocatePoolWithTag(0x200ui64, v11 + *(_DWORD *)(a1 + 792) + 28, 1951624563i64);
if( PoolWithTag )
{
LABEL_5:
*(VOID **)((char *)PoolWithTag + 4) = 0i64;
*(VOID **)((char *)PoolWithTag + 12) = 0i64;
*(VOID **)((char *)PoolWithTag + 20) = 0i64;
*(_DWORD *)PoolWithTag = 1;
*(_OWORD *)((char *)PoolWithTag + 12) = *(_OWORD *)a2;
v14 = *(VOID ***)(a1 + 1808);
v15 = SmCalcIoWorkItemSize(
*(VOID **)(a1 + 800),
(VOID *)(-(__int64)*(unsigned int *)(a1 + 792) & ((unsigned __int64)&PoolWithTag[2
* *(unsigned int *)PoolWithTag
+ 1]
+ *(unsigned int *)(a1 + 792)
+ 3)),
v11);
v16 = v15;
if( v14 )
{
*(_DWORD *)(a1 + 1808) |= 1u;
}
else
{
v14 = ExAllocatePoolWithTag(0x200ui64, v15, 1951624563i64);
if( !v14 )
{
LABEL_9:
if( PoolWithTag )
{
v17 = *(_DWORD *)(a1 + 1800);
if( (v17 & 1) != 0 && ((unsigned __int64)PoolWithTag | 1) == *(_QWORD *)(a1 + 1800) )
*(_DWORD *)(a1 + 1800) = v17 & 0xFFFFFFFE;
else
ExFreePoolWithTag(PoolWithTag, 0);
}
v9 = v19;
goto LABEL_15;
}
}
memset(v14, 0i64, v16);
*(_DWORD *)v14 |= 7u;
v7 = v14;
v14[1] = (VOID *)a4;
v14[2] = PoolWithTag;
PoolWithTag = 0i64;
*((_DWORD *)v14 + 6) = *(_DWORD *)a2;
*((_DWORD *)v14 + 7) = *((_DWORD *)v14 + 7) & 0x1D | (32 * v11) | *(_DWORD *)(a1 + 832) & 2;
Reference = 0;
goto LABEL_9;
}
LABEL_15:
if( Reference )
ST_STORE::StRegionReadDereference(a1, v9);
return v7;
}
Referenced by:
No references.