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