KeFindConfigurationNextEntry

__int64 __fastcall KeFindConfigurationNextEntry(__int64 a1, int a2, int a3, int *a4, _QWORD *a5){
  __int64 v8; 
  int v9; 
  __int64 i; 
  __int64 result; 
  __int64 v12; 

  v8 = a1;
  if( a4 )
    v9 = *a4;
  else
    v9 = 0;
  if( !a1 )
    return 0i64;
  while( 2 )
  {
    if( *a5 )
    {
      if( v8 == *a5 )
        *a5 = 0i64;
LABEL_7:
      for( i = *(_QWORD *)(v8 + 16); i; i = *(_QWORD *)(i + 16) )
      {
        if( *a5 )
        {
          if( i == *a5 )
            *a5 = 0i64;
        }
        else if( *(_DWORD *)(i + 24) == a2 && *(_DWORD *)(i + 28) == a3 && (a4 != 0i64 ? *(_DWORD *)(i + 40) : 0) == v9 )
        {
          return i;
        }
        v12 = *(_QWORD *)(i + 8);
        if( v12 )
        {
          result = KeFindConfigurationNextEntry(v12, a2, a3, a4, a5);
          if( result )
            return result;
        }
      }
      v8 = *(_QWORD *)(v8 + 8);
      if( v8 )
        continue;
      return 0i64;
    }
    break;
  }
  if( *(_DWORD *)(v8 + 24) != a2 || *(_DWORD *)(v8 + 28) != a3 || (a4 != 0i64 ? *(_DWORD *)(v8 + 40) : 0) != v9 )
    goto LABEL_7;
  return v8;
}

Referenced by:

HalpAcpiFindRsdp
KeFindConfigurationEntry
KeFindConfigurationNextEntry