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