ExpInitializeSvm
INT64 *__stdcall ExpInitializeSvm(){
unsigned int v0;
bool v1;
__int64 *v2;
unsigned int i;
__int64 v4;
__int64 v5;
_QWORD *v6;
INT64 *result;
VOID *PoolWithTag;
unsigned int v9;
v9 = 0;
(*(void(__fastcall **)(_QWORD, unsigned int *, int *, __int64 *))(HalIommuDispatch + 8))(
0i64,
&v9,
&ExpSvmAgents,
&ExpSvmIommuSystemContext);
v0 = v9;
v1 = v9 == 1;
if( v9 > 1 )
{
PoolWithTag = ExAllocatePoolWithTag(NonPagedPoolNx, 104i64 * v9, 0x76537845ui64);
v0 = v9;
v1 = v9 == 1;
ExpSvmWorkQueues = (__int64)PoolWithTag;
}
if( v1 || (v2 = (__int64 *)ExpSvmWorkQueues) == 0i64 )
{
v2 = ExpSvmStaticWorkQueue;
v0 = 1;
ExpSvmWorkQueues = (__int64)ExpSvmStaticWorkQueue;
}
ExpSvmNumberOfWorkQueues = v0;
for( i = 0; i < v0; LODWORD(v2[v5 + 12]) = 0 )
{
v4 = i;
v5 = 13i64 * i++;
v2[v5 + 2] = (__int64)ExpSvmWorkerThread;
v2[v5 + 3] = v4;
v2[v5] = 0i64;
v2[v5 + 7] = (__int64)ExpSvmDpcRoutine;
LODWORD(v2[v5 + 4]) = 275;
v2[v5 + 8] = v4;
v2[v5 + 11] = 0i64;
v2[v5 + 6] = 0i64;
}
v6 = (_QWORD *)HalIommuDispatch;
*(_QWORD *)(HalIommuDispatch + 96) = ExpSvmFaultRoutine;
v6[13] = ExpSvmReferenceAsid;
v6[14] = ExpSvmDereferenceAsid;
v6[15] = ExpSvmServicePageFault;
result = &ExpSvmDevices;
qword_140C166F8 = (__int64)&ExpSvmDevices;
ExpSvmDevices = (__int64)&ExpSvmDevices;
qword_140C166D8 = 0i64;
ExpSvmDeviceListLock = 0i64;
return result;
}Referenced by:
ExpInitSystemPhase1