HalpAcpiTableCacheInit
NTSTATUS __stdcall HalpAcpiTableCacheInit(_LOADER_PARAMETER_BLOCK *LoaderBlock){
NTSTATUS Rsdp;
char v2;
__int64 v5;
UINT64 *v6;
LARGE_INTEGER v7;
UINT64 v8;
__int64 v9;
__int64 v10;
DESCRIPTION_HEADER *v11;
DESCRIPTION_HEADER *v12;
LARGE_INTEGER *v13;
unsigned int v14;
unsigned int v15;
unsigned int v16;
UINT8 *Memory;
INT64 v18;
ULONG_PTR BugCheckParameter4;
LARGE_INTEGER *v20;
v20 = 0i64;
Rsdp = 0;
v2 = 0;
if( HalpAcpiTableCacheList )
return Rsdp;
HalpAcpiTableCacheLock.Owner = 0i64;
HalpAcpiTableCacheLock.Contention = 0;
HalpAcpiTableCacheLock.Event.Header.SignalState = 0;
HalpAcpiTableCacheLock.Event.Header.WaitListHead.Blink = &HalpAcpiTableCacheLock.Event.Header.WaitListHead;
HalpAcpiTableCacheLock.Event.Header.WaitListHead.Flink = &HalpAcpiTableCacheLock.Event.Header.WaitListHead;
qword_140CDB288 = (__int64)&HalpAcpiTableCacheList;
HalpAcpiTableCacheList = (__int64)&HalpAcpiTableCacheList;
HalpAcpiTableCacheLock.Count = 1;
LOWORD(HalpAcpiTableCacheLock.Event.Header.Lock) = 1;
HalpAcpiTableCacheLock.Event.Header.Size = 6;
Rsdp = HalpAcpiFindRsdp((__int64)LoaderBlock, (__int64 *)&v20);
if( Rsdp < 0 )
return Rsdp;
v5 = *((_QWORD *)LoaderBlock + 30);
v6 = *(UINT64 **)(v5 + 120);
if( v6 )
{
v14 = *(_DWORD *)(v5 + 128);
if( v14 )
{
v15 = HalpAcpiCalculateCacheSizeForOverrideTables(*(_QWORD *)(v5 + 120), v14);
v16 = v15;
if( v15 )
{
Memory = HalpAcpiAllocateMemory(LoaderBlock, v15);
v18 = (INT64)Memory;
if( Memory )
{
memset((INT64)Memory, 0i64);
LODWORD(BugCheckParameter4) = v14;
HalpAcpiCacheOverrideTables((INT64)LoaderBlock, v18, v16, v6, BugCheckParameter4);
}
}
}
}
if( HalpAcpiGetCachedTable(0x54445352ui64, 0i64, 0i64) || HalpAcpiGetCachedTable(0x54445358ui64, 0i64, 0i64) )
v2 = 1;
v7 = *v20;
if( v20->QuadPart == -1
|| (v8 = HalpMap(*v20, (MEMORY_CACHING_TYPE)(((v20->QuadPart & 0xFFFui64) + 4131) >> 12), 1u)) == 0 )
{
if( v2 )
return Rsdp;
DbgPrint("**** HalpAcpiTableCacheInit: Unable to map RSDT\n");
return -1073741670;
}
if( *(_DWORD *)v8 != 1413763928 && *(_DWORD *)v8 != 1413763922 )
{
if( !v2 )
{
DbgPrint("**** HalpAcpiTableCacheInit: The RSDT pointer is invalid.\n");
KeBugCheckEx(0xA5u, 0x1000Aui64, 0i64, 0i64, 0i64);
}
return Rsdp;
}
v9 = *(unsigned int *)(v8 + 4);
HalpUnmapVirtualAddress((PVOID)v8, ((v8 & 0xFFF) + 4131) >> 12, 0);
v10 = (unsigned int)v9;
v11 = (DESCRIPTION_HEADER *)HalpMap(
v7,
(MEMORY_CACHING_TYPE)((v9 + (unsigned __int64)(v7.LowPart & 0xFFF) + 4095) >> 12),
1u);
v12 = v11;
if( !v11 )
{
if( v2 )
return Rsdp;
DbgPrint("**** HalpAcpiTableCacheInit: Unable to remap RSDT.\n");
return -1073741670;
}
v13 = HalpAcpiCopyBiosTable(LoaderBlock, v11, v7);
if( v13 )
{
HalpUnmapVirtualAddress(v12, (v10 + (unsigned __int64)((unsigned __int16)v12 & 0xFFF) + 4095) >> 12, 0);
HalpAcpiCacheTable(LoaderBlock, v13);
}
else
{
if( !v2 )
{
DbgPrint("**** HalpAcpiTableCacheInit: Unable to cache RSDT.\n");
Rsdp = -1073741670;
}
HalpUnmapVirtualAddress(v12, (v10 + (unsigned __int64)((unsigned __int16)v12 & 0xFFF) + 4095) >> 12, 0);
}
return Rsdp;
}Referenced by:
HalpAcpiGetTable
HalpSetupAcpiPhase0