IommuSetAddressSpace

NTSTATUS __stdcall IommuSetAddressSpace(INT64 a1, INT64 a2){
  __int64 v2; 
  unsigned __int8 v4; 
  unsigned __int8 CurrentIrql; 
  _QWORD *v6; 
  _QWORD *v7; 
  _QWORD *v8; 
  __int64 v9; 
  __int64 v10; 
  unsigned __int8 v12; 

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

Referenced by:

No references.