HalpSetPCIData

INT64 __fastcall HalpSetPCIData(INT64 a1, INT64 a2, UINT64 a3, UINT8 *r9, UINT64 a5, UINT64 a6){
  unsigned int v6; 
  unsigned int v7; 
  UINT8 *v8; 
  unsigned int v9; 
  __int64 v10; 
  UINT8 v11; 
  UINT16 v12; 
  unsigned int v14; 
  UINT64 v15; 
  UINT64 v16; 
  UINT64 v17; 
  UINT64 Size; 
  UINT64 Sizea; 
  UINT64 Sizeb; 
  __int128 a4[4]; 
  __int128 v23[4]; 
  v6 = a5;
  v7 = 4096;
  v8 = r9;
  v9 = a3;
  if( (unsigned int)a6 <= 0x1000 )
    v7 = a6;
  LODWORD(v10) = 0;
  v11 = a2;
  v12 = a1;
  if( (unsigned int)a5 < 0x40 )
  {
    LODWORD(Size) = 64;
    LODWORD(v15) = 0;
    HalpReadPCIConfig(a1, a2, a3, a4, v15, Size);
    if( LOWORD(a4[0]) == 0xFFFF || (BYTE14(a4[0]) & 0x7F) != 0 )
      return 0i64;
    v23[0] = a4[0];
    v14 = v7;
    if( 64 - (int)a5 <= v7 )
      v14 = 64 - a5;
    v23[1] = a4[1];
    v23[2] = a4[2];
    v23[3] = a4[3];
    v10 = v14;
    memmove((UINT8 *)v23 + (unsigned int)a5, r9, v14);
    LODWORD(Sizeb) = v10;
    LODWORD(v17) = a5;
    HalpWritePCIConfig(v12, v11, v9, (char *)v23 + (unsigned int)a5, v17, Sizeb);
    v6 = v10 + a5;
    v8 = &r9[v10];
    v7 -= v10;
  }
  else
  {
    LODWORD(Size) = 4;
    LODWORD(v15) = 0;
    HalpReadPCIConfig(a1, a2, a3, a4, v15, Size);
    if( LOWORD(a4[0]) == 0xFFFF )
      return 0i64;
  }
  if( v7 )
  {
    if( v6 >= 0x40 )
    {
      LODWORD(Sizea) = v7;
      LODWORD(v16) = v6;
      HalpWritePCIConfig(v12, v11, v9, v8, v16, Sizea);
      LODWORD(v10) = v7 + v10;
    }
  }
  return(unsigned int)v10;
}

Referenced by:

HalSetBusDataByOffset