HalpAuditEnumerateRsdtsInRange

__int64 __fastcall HalpAuditEnumerateRsdtsInRange(__int64 a1, unsigned int a2, char a3, int **a4){
  UINT64 v5; 
  char *v7; 
  char *v8; 
  int RsdtArrayTable; 
  unsigned int i; 
  int *v12; 
  __int64 v13; 
  unsigned int v14; 
  int *v15; 
  v5 = a2;
  MmMapIoSpaceEx((_LARGE_INTEGER)a1, a2, 0x204ui64);
  v8 = v7;
  if( v7 )
  {
    RsdtArrayTable = 0;
    for( i = 0; i < (unsigned int)v5; i += 16 )
    {
      if( *(_QWORD *)&v8[i] == 0x2052545020445352i64 )
      {
        v12 = *a4;
        if( **a4 < (unsigned int)((*a4)[1] + 1) )
        {
          RsdtArrayTable = HalpAuditAllocateRsdtArrayTable(a4);
          if( RsdtArrayTable < 0 )
            break;
          v12 = *a4;
        }
        RsdtArrayTable = HalpAuditSelectRsdtOrXsdt((__int64)&v8[i], (__int64)&v12[8 * v12[1] + 2]);
        if( RsdtArrayTable >= 0 )
        {
          v14 = *(_DWORD *)(v13 + 12) & 0xFFFFFFF7;
          if( a3 )
            v14 = *(_DWORD *)(v13 + 12) | 8;
          v15 = *a4;
          *(_DWORD *)(v13 + 12) = v14;
          ++v15[1];
        }
      }
    }
    MmUnmapIoSpace(v8, v5);
  }
  else
  {
    return(unsigned int)-1073741823;
  }
  return(unsigned int)RsdtArrayTable;
}

Referenced by:

HalpAuditEnumerateRsdts