HalpExtInitExtensions
NTSTATUS __stdcall HalpExtInitExtensions(_LOADER_PARAMETER_BLOCK *LoaderBlock){
NTSTATUS v1;
int v3;
_QWORD **v4;
_QWORD *v5;
PSTR MemoryInternal;
INT64 Table;
unsigned int v9;
__int64 **v10;
__int64 *v11;
__int64 v12;
int(__fastcall *v13)(_QWORD, __int64 *, void **);
unsigned __int64 v14;
__int64 *i;
__int64 v16;
__int64 v17;
v1 = 0;
HalpExtLoaderBlock = (volatile INT64 *)LoaderBlock;
v17 = 0i64;
v3 = 0;
v4 = (_QWORD **)(*((_QWORD *)LoaderBlock + 30) + 2584i64);
HalpExtHandleCount = 0;
v5 = *v4;
if( *v4 != v4 )
{
do
{
v5 = (_QWORD *)*v5;
++v3;
}
while( v5 != v4 );
HalpExtHandleCount = v3;
if( v3 )
{
MemoryInternal = HalpMmAllocateMemoryInternal((unsigned int)(v3 << 6), MmCached);
HalpExtHandleArray = (__int64)MemoryInternal;
if( MemoryInternal )
{
memset((INT64)MemoryInternal, 0i64);
Table = HalpAcpiGetTable((volatile INT64 *)LoaderBlock);
if( Table )
{
v9 = 0;
v10 = (__int64 **)(*((_QWORD *)LoaderBlock + 30) + 2584i64);
v11 = *v10;
while( v11 != (__int64 *)v10 )
{
if( *((int *)v11 + 10) >= 0 )
{
v12 = v11[2];
v13 = *(int(__fastcall **)(_QWORD, __int64 *, void **))(v12 + 56);
v17 = 0i64;
if( v13(0i64, &v17, &HalpExtensionImports) >= 0 && v17 )
{
v14 = HalpExtHandleArray + ((unsigned __int64)v9 << 6);
*(_QWORD *)(v14 + 8) = *(_QWORD *)(v12 + 56);
*(_QWORD *)(v14 + 16) = v17;
*(_DWORD *)(v14 + 24) = 0;
*(_QWORD *)(v14 + 48) = *(_QWORD *)(v12 + 48);
*(_DWORD *)(v14 + 56) = *(_DWORD *)(v12 + 64);
*(_BYTE *)v14 = 1;
*(_QWORD *)(v14 + 40) = v14 + 32;
*(_QWORD *)(v14 + 32) = v14 + 32;
for( i = (__int64 *)v11[3]; i != v11 + 3; i = (__int64 *)*i )
(**(void(__fastcall ***)(_QWORD, INT64))(v14 + 16))(v9, Table + *((unsigned int *)i + 4));
*(_BYTE *)v14 = 0;
}
}
else
{
LODWORD(v16) = *((_DWORD *)v11 + 10);
DbgPrintEx(0x65u, 0, "HAL Extension %s failed load, status=0x%x\n", (const char *)v11[6], v16);
}
++v9;
v11 = (__int64 *)*v11;
v10 = (__int64 **)(*((_QWORD *)LoaderBlock + 30) + 2584i64);
}
}
}
else
{
return -1073741801;
}
}
}
return v1;
}Referenced by:
HalpHalExtInitSystem