HalpSetPCIData
NTSTATUS __stdcall HalpSetPCIData(
INT64 SegmentNumber,
UINT64 BusNumber,
ULONG_PTR Slot,
UINT8 *Buffer,
ULONG_PTR Offset,
UINT64 Length){
ULONG_PTR v6;
ULONG_PTR v7;
UINT8 *v8;
__int64 v10;
UINT8 v11;
UINT16 v12;
size_t v14;
UINT64 v15;
UINT64 v16;
UINT64 v17;
__int128 Buffera[4];
__int128 v20[4];
v6 = Offset;
v7 = 4096;
v8 = Buffer;
if( (unsigned int)Length <= 0x1000 )
v7 = Length;
LODWORD(v10) = 0;
v11 = BusNumber;
v12 = SegmentNumber;
if( Offset < 0x40 )
{
LODWORD(v15) = 64;
HalpReadPCIConfig(SegmentNumber, BusNumber, Slot, Buffera, 0, v15);
if( LOWORD(Buffera[0]) == 0xFFFF || (BYTE14(Buffera[0]) & 0x7F) != 0 )
return 0;
v20[0] = Buffera[0];
v14 = v7;
if( 64 - Offset <= v7 )
v14 = 64 - Offset;
v20[1] = Buffera[1];
v20[2] = Buffera[2];
v20[3] = Buffera[3];
v10 = v14;
memmove((char *)v20 + Offset, Buffer, v14);
LODWORD(v17) = v10;
HalpWritePCIConfig(v12, v11, Slot, (char *)v20 + Offset, Offset, v17);
v6 = v10 + Offset;
v8 = &Buffer[v10];
v7 -= v10;
}
else
{
LODWORD(v15) = 4;
HalpReadPCIConfig(SegmentNumber, BusNumber, Slot, Buffera, 0, v15);
if( LOWORD(Buffera[0]) == 0xFFFF )
return 0;
}
if( v7 )
{
if( v6 >= 0x40 )
{
LODWORD(v16) = v7;
HalpWritePCIConfig(v12, v11, Slot, v8, v6, v16);
LODWORD(v10) = v7 + v10;
}
}
return v10;
}Referenced by:
HalSetBusDataByOffset