HalpAcpiTableCacheInit
VOID __fastcall HalpAcpiTableCacheInit(_LOADER_PARAMETER_BLOCK *LoaderBlock){
char v1;
_LOADER_PARAMETER_EXTENSION *Extension;
UINT64 *AcpiTable;
_LARGE_INTEGER v5;
unsigned int *v6;
__int64 v7;
__int64 v8;
_DESCRIPTION_HEADER *v9;
_DESCRIPTION_HEADER *v10;
_LARGE_INTEGER *v11;
unsigned int AcpiTableSize;
unsigned int v13;
size_t v14;
UINT8 *Memory;
INT64 v16;
UINT64 Protection;
UINT64 Protectiona;
UINT8 *a2;
a2 = 0i64;
v1 = 0;
if( !*(&WheapErrorSourceTable + 133) )
{
HalpAcpiTableCacheLock.Owner = 0i64;
HalpAcpiTableCacheLock.Contention = 0;
*(_DWORD *)&HalpAcpiTableCacheLock.gap14[8] = 0;
*(_QWORD *)&HalpAcpiTableCacheLock.gap14[20] = &HalpAcpiTableCacheLock.gap14[12];
*(_QWORD *)&HalpAcpiTableCacheLock.gap14[12] = &HalpAcpiTableCacheLock.gap14[12];
*(&WheapErrorSourceTable + 134) = (char *)&WheapErrorSourceTable + 1064;
*(&WheapErrorSourceTable + 133) = (char *)&WheapErrorSourceTable + 1064;
HalpAcpiTableCacheLock.Count = 1;
*(_WORD *)&HalpAcpiTableCacheLock.gap14[4] = 1;
HalpAcpiTableCacheLock.gap14[6] = 6;
if( HalpAcpiFindRsdp(LoaderBlock, &a2) >= 0 )
{
Extension = LoaderBlock->Extension;
AcpiTable = (UINT64 *)Extension->AcpiTable;
if( AcpiTable )
{
AcpiTableSize = Extension->AcpiTableSize;
if( AcpiTableSize )
{
v13 = HalpAcpiCalculateCacheSizeForOverrideTables((INT64)Extension->AcpiTable, AcpiTableSize);
v14 = v13;
if( v13 )
{
Memory = HalpAcpiAllocateMemory(LoaderBlock, v13);
v16 = (INT64)Memory;
if( Memory )
{
memset(Memory, 0i64, v14);
LODWORD(Protection) = AcpiTableSize;
HalpAcpiCacheOverrideTables((INT64)LoaderBlock, v16, v14, AcpiTable, Protection);
}
}
}
}
if( HalpAcpiGetCachedTable(0x54445352ui64, 0i64, 0i64) || HalpAcpiGetCachedTable(0x54445358ui64, 0i64, 0i64) )
v1 = 1;
v5 = *(_LARGE_INTEGER *)a2;
if( *(_QWORD *)a2 == -1i64
|| (LODWORD(Protection) = 4,
(v6 = (unsigned int *)HalpMap(
*(_LARGE_INTEGER *)a2,
(_MEMORY_CACHING_TYPE)(((*(_QWORD *)a2 & 0xFFFui64) + 4131) >> 12),
MmCached,
0,
Protection)) == 0i64) )
{
if( !v1 )
DbgPrint("**** HalpAcpiTableCacheInit: Unable to map RSDT\n");
}
else if( *v6 == 1413763928 || *v6 == 1413763922 )
{
v7 = v6[1];
HalpUnmapVirtualAddress(v6, ((unsigned __int64)((unsigned __int16)v6 & 0xFFF) + 4131) >> 12, 0);
LODWORD(Protectiona) = 4;
v8 = (unsigned int)v7;
v9 = (_DESCRIPTION_HEADER *)HalpMap(
v5,
(_MEMORY_CACHING_TYPE)((v7
+ (unsigned __int64)(v5.anonymous_0.LowPart & 0xFFF)
+ 4095) >> 12),
MmCached,
0,
Protectiona);
v10 = v9;
if( v9 )
{
v11 = HalpAcpiCopyBiosTable(LoaderBlock, v9, v5);
if( v11 )
{
HalpUnmapVirtualAddress(v10, (v8 + (unsigned __int64)((unsigned __int16)v10 & 0xFFF) + 4095) >> 12, 0);
HalpAcpiCacheTable(LoaderBlock, v11);
}
else
{
if( !v1 )
DbgPrint("**** HalpAcpiTableCacheInit: Unable to cache RSDT.\n");
HalpUnmapVirtualAddress(v10, (v8 + (unsigned __int64)((unsigned __int16)v10 & 0xFFF) + 4095) >> 12, 0);
}
}
else if( !v1 )
{
DbgPrint("**** HalpAcpiTableCacheInit: Unable to remap RSDT.\n");
}
}
else if( !v1 )
{
DbgPrint("**** HalpAcpiTableCacheInit: The RSDT pointer is invalid.\n");
KeBugCheckEx(0xA5u, (PVOID)0x1000A, 0i64, 0i64, 0i64);
}
}
}
}Referenced by:
HalpAcpiGetTable
HalpSetupAcpiPhase0