HalpPCIConfig

INT8 __fastcall HalpPCIConfig(
        INT64 *rcx0,
        UINT8 BusNumber,
        PVOID er8_0,
        VOID *Buffer,
        UINT64 BugCheckParameter3,
        UINT64 Size,
        PCI_ACCESS_TYPE arg30){
  unsigned __int64 v8; 
  void *v9; 
  unsigned int v10; 
  INT64 *v11; 
  char v12; 
  UINT64 v13; 
  int v14; 
  int v15; 
  UINT64 Offset; 
  UINT64 Offseta; 
  UINT64 Length; 
  INT64 Lengtha; 
  INT64 AccessType; 
  char v22[16]; 

  v8 = (unsigned int)er8_0;
  v9 = (void *)BusNumber;
  v10 = (unsigned __int16)rcx0;
  v22[0] = 0;
  if( byte_140C49B20 )
    goto LABEL_3;
  v11 = (INT64 *)qword_140C49B50;
  v12 = 0;
  if( (INT64 *)qword_140C49B50 == &qword_140C49B50 )
    goto LABEL_3;
  do
  {
    rcx0 = v11;
    v11 = (INT64 *)*v11;
    v14 = *((_DWORD *)rcx0 + 114);
    if( (v14 & 8) != 0 && *((_DWORD *)rcx0 + 116) == v10 && *((_DWORD *)rcx0 + 117) == (_DWORD)v9 )
    {
      v15 = *((_DWORD *)rcx0 + 118);
      LOBYTE(v14) = v8 ^ v15;
      if( (((unsigned __int8)v8 ^ *((_BYTE *)rcx0 + 472)) & 0x1F) == 0
        && (((unsigned __int8)v8 ^ (unsigned __int8)v15) & 0xE0) == 0 )
      {
        v12 = 1;
      }
    }
  }
  while( v11 != &qword_140C49B50 );
  if( !v12 )
  {
LABEL_3:
    if( qword_140C4A208 )
    {
      LOBYTE(rcx0) = arg30 == PCI_WRITE;
      v14 = qword_140C4A208(
              rcx0,
              v10,
              (unsigned int)v9,
              v8 & 0x1F,
              (unsigned __int8)v8 >> 5,
              BugCheckParameter3,
              Size,
              Buffer);
      if( v14 >= 0 )
        return v14;
      if( v14 != -1073741822 )
        KeBugCheckEx(0xC0u, v9, (PVOID)v8, (PVOID)(unsigned int)BugCheckParameter3, (PVOID)v14);
    }
    HalpPCIAcquireConfigSpaceLock((UINT8 *)v22);
    LODWORD(Length) = Size;
    LOBYTE(v13) = (_BYTE)v9;
    LODWORD(Offset) = BugCheckParameter3;
    LOBYTE(v14) = HalpPciAccessMmConfigSpace(
                    (unsigned __int16)v10,
                    v13,
                    (PCI_SLOT_NUMBER)v8,
                    (UINT8 *)Buffer,
                    Offset,
                    Length,
                    arg30);
    if( !(_BYTE)v14 )
    {
      LODWORD(AccessType) = arg30;
      LODWORD(Lengtha) = Size;
      LODWORD(Offseta) = BugCheckParameter3;
      LOBYTE(v14) = HalpPciAccessIoConfigSpace(v10, (UINT8)v9, v8, (INT64)Buffer, Offseta, Lengtha, AccessType);
      if( !(_BYTE)v14 && arg30 == PCI_READ )
        LOBYTE(v14) = (unsigned __int8)memset(Buffer, 255i64, Size);
    }
    if( !byte_140C49C90 )
    {
      KxReleaseSpinLock(&qword_140C49B18);
      LOBYTE(v14) = v22[0];
      __writecr8((unsigned __int8)v22[0]);
    }
  }
  else if( arg30 == PCI_READ )
  {
    LOBYTE(v14) = (unsigned __int8)memset(Buffer, 255i64, Size);
  }
  return v14;
}

Referenced by:

HaliHandlePCIConfigSpaceAccess
HaliPciInterfaceReadConfig
HaliPciInterfaceWriteConfig
HalpKdWritePCIConfig
HalpPciHandleSecureAccess
HalpReadPCIConfig
HalpWritePCIConfig