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