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