HvlpInitializeSvmIommuSupport

NTSTATUS __stdcall HvlpInitializeSvmIommuSupport(
        INT64 a1,
        INT64 a2,
        INT64 a3,
        INT64 a4,
        UINT8 *FreeWhenDone2,
        _UNICODE_STRING *ResultantString3,
        UINT8 *FreeWhenDone3){
  int v7; 
  VOID **PoolWithTag; 
  __int64 v9; 
  unsigned int v11; 
  __int64 v12; 
  __int128 v13; 
  __int64 v14; 

  v13 = 0i64;
  v14 = 0i64;
  HvlSvmGetSystemCapabilities((INT64)&v13);
  if( (v13 & 1) == 0 )
    return -1073741637;
  v7 = v14;
  if( !(_DWORD)v14 )
    return -1073741637;
  PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 104i64 * (unsigned int)v14, 541873736i64);
  qword_140CF6288 = (__int64)PoolWithTag;
  v9 = (__int64)PoolWithTag;
  if( !PoolWithTag )
    return -1073741670;
  memset(PoolWithTag, 0i64, 104 * v7);
  dword_140CF6284 = v7;
  v11 = 0;
  if( v7 )
  {
    while( 1 )
    {
      v12 = v9 + 104i64 * v11;
      *(_DWORD *)v12 = v11;
      *(_QWORD *)(v12 + 32) = HvlpIommuPrqDpcRoutine;
      *(_DWORD *)(v12 + 8) = 275;
      *(_QWORD *)(v12 + 40) = v12;
      *(_QWORD *)(v12 + 64) = 0i64;
      *(_QWORD *)(v12 + 24) = 0i64;
      *(_QWORD *)(v12 + 96) = v12;
      *(_QWORD *)(v12 + 88) = HvlpProcessIommuPrq;
      *(_QWORD *)(v12 + 72) = 0i64;
      *(_DWORD *)(v12 + 4) = 3;
      ExQueueWorkItem((PWORK_QUEUE_ITEM)(v12 + 72), HyperCriticalWorkQueue);
      if( ++v11 >= dword_140CF6284 )
        break;
      v9 = qword_140CF6288;
    }
  }
  return 0;
}

Referenced by:

HvlPhase2Initialize