HalpPCIConfig

CHAR __fastcall HalpPCIConfig(INT64 *a1, UINT8 a2, UINT64 a3, VOID *a4, UINT64 BugCheckParameter3, UINT64 a6, INT64 a7){
  ULONG_PTR v8; 
  ULONG_PTR v9; 
  unsigned int v10; 
  INT64 *v11; 
  char v12; 
  int v13; 
  int v14; 
  ULONG_PTR BugCheckParameter4; 
  ULONG_PTR BugCheckParameter4a; 
  INT64 a6a; 
  INT64 a6b; 
  INT64 v20; 
  INT64 v21; 
  char v22[16]; 
  v8 = (unsigned int)a3;
  v9 = a2;
  v10 = (unsigned __int16)a1;
  v22[0] = 0;
  if( HalpIommuSkipPciConfigDisabled )
    goto LABEL_3;
  v11 = (INT64 *)HalpIommuList;
  v12 = 0;
  if( (INT64 *)HalpIommuList == &HalpIommuList )
    goto LABEL_3;
  do
  {
    a1 = v11;
    v11 = (INT64 *)*v11;
    v13 = *((_DWORD *)a1 + 114);
    if( (v13 & 8) != 0 && *((_DWORD *)a1 + 116) == v10 && *((_DWORD *)a1 + 117) == (_DWORD)v9 )
    {
      v14 = *((_DWORD *)a1 + 118);
      LOBYTE(v13) = v8 ^ v14;
      if( (((unsigned __int8)v8 ^ *((_BYTE *)a1 + 472)) & 0x1F) == 0
        && (((unsigned __int8)v8 ^ (unsigned __int8)v14) & 0xE0) == 0 )
      {
        v12 = 1;
      }
    }
  }
  while( v11 != &HalpIommuList );
  if( !v12 )
  {
LABEL_3:
    if( qword_140C4A208 )
    {
      LOBYTE(a1) = (_DWORD)a7 == 1;
      v13 = qword_140C4A208(a1, v10, (unsigned int)v9, v8 & 0x1F, (unsigned __int8)v8 >> 5, BugCheckParameter3, a6, a4);
      if( v13 >= 0 )
        return v13;
      if( v13 != -1073741822 )
        KeBugCheckEx(0xC0u, v9, v8, (unsigned int)BugCheckParameter3, v13);
    }
    HalpPCIAcquireConfigSpaceLock((UINT8 *)v22);
    LODWORD(v20) = a7;
    LODWORD(a6a) = a6;
    LODWORD(BugCheckParameter4) = BugCheckParameter3;
    LOBYTE(v13) = HalpPciAccessMmConfigSpace(v10, v9, v8, (INT64)a4, BugCheckParameter4, a6a, v20);
    if( !(_BYTE)v13 )
    {
      LODWORD(v21) = a7;
      LODWORD(a6b) = a6;
      LODWORD(BugCheckParameter4a) = BugCheckParameter3;
      LOBYTE(v13) = HalpPciAccessIoConfigSpace(v10, v9, v8, (INT64)a4, BugCheckParameter4a, a6b, v21);
      if( !(_BYTE)v13 && !(_DWORD)a7 )
        LOBYTE(v13) = memset((INT64)a4, 255i64);
    }
    if( !HalpDoingCrashDump )
    {
      KxReleaseSpinLock(&HalpPCIConfigLock);
      LOBYTE(v13) = v22[0];
      __writecr8((unsigned __int8)v22[0]);
    }
  }
  else if( !(_DWORD)a7 )
  {
    LOBYTE(v13) = memset((INT64)a4, 255i64);
  }
  return v13;
}

Referenced by:

HaliHandlePCIConfigSpaceAccess
HaliPciInterfaceReadConfig
HaliPciInterfaceWriteConfig
HalpKdWritePCIConfig
HalpPciHandleSecureAccess
HalpReadPCIConfig
HalpWritePCIConfig