HalpAcpiGetTableFromBios
UINT64 __stdcall HalpAcpiGetTableFromBios(
_LOADER_PARAMETER_BLOCK *LoaderBlock,
UINT8 *OemId,
UINT8 *OemTableId,
_LARGE_INTEGER *TablePhysicalAddress,
_LARGE_INTEGER *TablePhysicalAddressa){
UINT64 v5;
UINT64 v6;
_LARGE_INTEGER v7;
unsigned int v10;
UINT64 result;
UINT64 v13;
__int64 v14;
__int64 v15;
unsigned __int64 v16;
unsigned int v17;
unsigned int *v18;
_LARGE_INTEGER *v19;
_LARGE_INTEGER *TableWork;
__int64 v21;
INT64 PerformChecksum;
UINT64 Size;
UINT8 *Str1;
UINT8 *OemTableIda;
_LARGE_INTEGER *v27;
OemTableIda = (UINT8 *)TablePhysicalAddress;
Str1 = OemTableId;
LODWORD(Size) = 0;
v5 = 0i64;
v6 = 0i64;
v7.QuadPart = 0i64;
v10 = (unsigned int)OemId;
if( (_DWORD)OemId == 1413763922 || (_DWORD)OemId == 1413763928 )
return v6;
if( (_DWORD)OemId == 1413763908 )
{
TableWork = HalpAcpiGetTableWork(LoaderBlock, (const UINT8 *)0x50434146, 0i64);
if( !TableWork )
return v6;
if( LOBYTE(TableWork[1].anonymous_0.LowPart) < 3u
|| (v7 = *(_LARGE_INTEGER *)((char *)TableWork + 140), !v7.QuadPart) )
{
v7.QuadPart = TableWork[5].anonymous_0.LowPart;
}
LOBYTE(PerformChecksum) = 1;
v6 = HalpAcpiCheckAndMapTable(
LoaderBlock,
v7,
(UINT8 *)0x24,
(UINT8 *)0x54445344,
OemTableId,
(UINT8 *)TablePhysicalAddress,
PerformChecksum,
&Size);
LABEL_15:
TablePhysicalAddressa->anonymous_0.LowPart = Size;
if( v6 )
*v27 = v7;
return v6;
}
result = (UINT64)HalpAcpiGetRsdt(LoaderBlock);
v13 = result;
if( result )
{
v14 = *(unsigned int *)(result + 4);
if( *(_DWORD *)result == 1413763922 )
{
v13 = 0i64;
v5 = result;
v21 = 36i64;
if( (unsigned int)v14 < 0x24 )
v21 = v14;
v16 = (unsigned __int64)(v14 - v21) >> 2;
}
else
{
v15 = 36i64;
if( (unsigned int)v14 < 0x24 )
v15 = (unsigned int)v14;
v16 = (unsigned __int64)(v14 - v15) >> 3;
}
v17 = 0;
if( (_DWORD)v16 )
{
v18 = (unsigned int *)(v5 + 36);
v19 = (_LARGE_INTEGER *)(v13 + 36);
do
{
if( v13 )
v7 = *v19;
else
v7.QuadPart = *v18;
LOBYTE(PerformChecksum) = 1;
v6 = HalpAcpiCheckAndMapTable(
LoaderBlock,
v7,
(UINT8 *)0x24,
(UINT8 *)v10,
Str1,
OemTableIda,
PerformChecksum,
&Size);
if( v6 )
break;
++v17;
++v18;
++v19;
}
while( v17 < (unsigned int)v16 );
}
goto LABEL_15;
}
return result;
}Referenced by:
HalpAcpiGetTableWork
HalpAcpiIsCachedTableCompromised