IommuSetAddressSpace

INT64 __fastcall IommuSetAddressSpace(INT64 a1, INT64 a2){
  __int64 v2; 
  unsigned __int8 v4; 
  unsigned __int8 v5; 
  unsigned __int8 CurrentIrql; 
  _QWORD *v7; 
  _QWORD *v8; 
  _QWORD *v9; 
  __int64 v10; 
  __int64 v11; 
  unsigned __int8 v13; 
  v2 = *(_QWORD *)(a1 + 8);
  if( a2 != *(_QWORD *)(v2 + 32) )
  {
    KeAcquireSpinLockRaiseToDpc(&IommupPasidTableLock, a2);
    v5 = v4;
    v13 = v4;
    CurrentIrql = KeGetCurrentIrql();
    __writecr8(0xFui64);
    KxAcquireSpinLock((UINT64 *)(v2 + 24));
    v7 = (_QWORD *)(v2 + 40);
    *(_QWORD *)(v2 + 32) = a2;
    v8 = *(_QWORD **)(v2 + 40);
    if( v8 != (_QWORD *)(v2 + 40) )
    {
      do
      {
        v9 = (_QWORD *)v8[3];
        if( v9 != v8 + 3 )
        {
          do
          {
            v10 = v9[5];
            v11 = *(_QWORD *)(v10 + 24);
            (*(void(__fastcall **)(_QWORD, _QWORD, _QWORD, INT64))(v11 + 224))(
              *(_QWORD *)(v11 + 16),
              *(_QWORD *)(v10 + 64),
              *(unsigned int *)(v2 + 16),
              a2);
            (*(void(__fastcall **)(_QWORD, _QWORD, __int64, _QWORD, _DWORD, _QWORD))(v11 + 232))(
              *(_QWORD *)(v11 + 16),
              *(unsigned int *)(v2 + 16),
              1i64,
              v9[1],
              0,
              0i64);
            v9 = (_QWORD *)*v9;
          }
          while( v9 != v8 + 3 );
          v7 = (_QWORD *)(v2 + 40);
        }
        v8 = (_QWORD *)*v8;
      }
      while( v8 != v7 );
      v5 = v13;
    }
    KxReleaseSpinLock((UINT64 *)(v2 + 24));
    __writecr8(CurrentIrql);
    KxReleaseSpinLock(&IommupPasidTableLock);
    __writecr8(v5);
  }
  return 0i64;
}

Referenced by:

No references.