HalpGetPCIData

INT64 __fastcall HalpGetPCIData(INT64 a1, INT64 a2, UINT64 a3, UINT8 *r9_0, UINT64 arg20, UINT64 a6){
  unsigned int v6; 
  unsigned int v7; 
  unsigned int v9; 
  char v10; 
  __int64 v11; 
  unsigned __int16 v12; 
  unsigned int v13; 
  unsigned int v14; 
  unsigned int v15; 
  INT64 v16; 
  UINT64 a5; 
  UINT64 a5a; 
  UINT64 Size; 
  UINT64 Sizea; 
  __int16 a4[32]; 
  v6 = arg20;
  v7 = 4096;
  v9 = a3;
  if( (unsigned int)a6 <= 0x1000 )
    v7 = a6;
  v10 = a2;
  LODWORD(v11) = 0;
  v12 = a1;
  if( (unsigned int)arg20 < 0x40 )
  {
    LODWORD(Size) = 64;
    LODWORD(a5) = 0;
    HalpReadPCIConfig(a1, a2, a3, a4, a5, Size);
    v13 = 2;
    if( a4[0] != -1 )
      v13 = 64;
    if( v13 >= (unsigned int)arg20 )
    {
      v14 = v13 - arg20;
      v15 = v7;
      if( v14 <= v7 )
        v15 = v14;
      v11 = v15;
      memmove(r9_0, (UINT8 *)a4 + (unsigned int)arg20, v15);
      v6 = v11 + arg20;
      r9_0 += v11;
      v7 -= v11;
      goto LABEL_10;
    }
    return 0i64;
  }
  LODWORD(Size) = 4;
  LODWORD(a5) = 0;
  HalpReadPCIConfig(a1, a2, a3, a4, a5, Size);
  if( a4[0] == -1 )
    return 0i64;
LABEL_10:
  if( v7 )
  {
    if( v6 >= 0x40 )
    {
      LODWORD(Sizea) = v7;
      LODWORD(a5a) = v6;
      LOBYTE(v16) = v10;
      HalpReadPCIConfig(v12, v16, v9, r9_0, a5a, Sizea);
      LODWORD(v11) = v7 + v11;
    }
  }
  return(unsigned int)v11;
}

Referenced by:

HalGetBusDataByOffset
HalpPciReadSecondaryBusNumber