DmrEnumerateRmrrDomains

NTSTATUS __stdcall DmrEnumerateRmrrDomains(UINT64 a1, INT64 a2, INT64 a3){
  _QWORD **v3; 
  INT64 v4; 
  INT64 v5; 
  UINT64 v7; 
  UINT64 i; 
  INT64 v9; 
  __int64 v10; 
  INT16 v11; 
  _QWORD *v12; 
  INT64 v13; 
  char v14; 
  INT64 v15; 
  int v16; 
  UINT8 *NextDeviceScope; 
  INT64 v18; 
  UINT64 v19; 
  UINT8 *v20; 
  _WORD *NextRemappingStructure; 
  _WORD *v22; 
  INT64 v24; 
  INT64 v25; 
  INT64 v26; 
  INT64 v27; 
  INT64 v28; 
  INT64 v29; 
  INT64 v30; 

  *(_DWORD *)a3 = 0;
  v3 = (_QWORD **)(a3 + 8);
  v4 = a2;
  *(_QWORD *)(a3 + 16) = a3 + 8;
  *(_QWORD *)(a3 + 8) = a3 + 8;
  v5 = 0i64;
  while( 1 )
  {
    NextRemappingStructure = (_WORD *)DmrGetNextRemappingStructure(a1, v5);
    v22 = NextRemappingStructure;
    if( !NextRemappingStructure )
      return 0;
    if( *NextRemappingStructure == 1 )
    {
      v7 = (UINT64)NextRemappingStructure + (unsigned __int16)NextRemappingStructure[1];
      for( i = 0i64; ; i = (UINT64)v20 )
      {
        NextDeviceScope = (UINT8 *)DmrGetNextDeviceScope((UINT64)(v22 + 12), v7, i);
        v20 = NextDeviceScope;
        if( !NextDeviceScope )
          break;
        if( *NextDeviceScope == 1 )
        {
          if( !v4
            || (DmrFindDrhdForDeviceScope(
                  v19,
                  (unsigned __int16)v22[3],
                  (INT64)NextDeviceScope,
                  v18,
                  v24,
                  v25,
                  v26,
                  v27,
                  v28,
                  v29,
                  v30),
                v10 == v4) )
          {
            v11 = v22[3];
            v12 = *v3;
            while( v12 != v3 )
            {
              v13 = (INT64)v12;
              v12 = (_QWORD *)*v12;
              if( *(_WORD *)(v13 + 32) == v11 && *(_BYTE *)(v13 + 34) == 1 )
              {
                DmrCheckPathMatch((INT64)v20, v13 + 34, v9);
                if( v14 )
                  goto LABEL_13;
              }
            }
            LODWORD(v15) = DmrpRmrrTreeAddNewScope(a3, v11, v20);
            v13 = v15;
LABEL_13:
            if( !v13 )
            {
              v16 = -1073741670;
LABEL_23:
              DmrFreeRmrrTree(a3);
              return v16;
            }
            v16 = DmrpRmrrTreeAddRegionToDevice(v13, *((_QWORD *)v22 + 1), *((_QWORD *)v22 + 2));
            if( v16 < 0 )
              goto LABEL_23;
            v4 = a2;
          }
        }
      }
    }
    v5 = (INT64)v22;
    a1 = v19;
  }
}

Referenced by:

HalpIvtProcessDrhdEntry