HalInitializeBios
VOID __stdcall HalInitializeBios(INT64 a1, INT64 a2){
int v2;
char *v3;
char *v5;
CHAR v6;
__int64 v7;
VOID **PoolWithTag;
_MDL *v9;
__int64 *v10;
unsigned int v11;
__int64 v12;
__int64 v13;
__int64 ***v14;
__int64 **i;
unsigned __int64 v16;
_HALP_ALLOC_CONTEXT *v17;
VOID *v18;
UINT8 *v19;
INT64 v20;
VOID *v21;
INT64 *v22;
unsigned __int64 v23;
__int64 v24;
unsigned int v25;
unsigned __int64 v26;
INT64 *v27;
UINT64 v28;
UINT64 Priority;
v2 = a1;
v3 = *(char **)(a2 + 216);
if( !v3 || (v5 = strupr(v3), strstr((UINT8 *)v5, (UINT8 *)"NOVGA", v6), !v7) )
{
if( v2 != -1 )
{
PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 0x830ui64, 543973704i64);
v9 = (_MDL *)PoolWithTag;
if( !PoolWithTag )
return;
*PoolWithTag = 0i64;
v10 = (__int64 *)(PoolWithTag + 6);
PoolWithTag[4] = 0i64;
v11 = 0;
*((_DWORD *)PoolWithTag + 11) = 0;
*((_WORD *)PoolWithTag + 4) = 2096;
v12 = 0i64;
*((_DWORD *)PoolWithTag + 10) = 0x100000;
*((_WORD *)PoolWithTag + 5) = 2050;
do
{
v13 = v12;
if( v11 - 160 <= 0x1F )
v13 = 240i64;
++v11;
++v12;
*v10++ = v13;
}
while( v11 < 0x100 );
v14 = (__int64 ***)(a2 + 32);
for( i = *v14; i != (__int64 **)v14; i = (__int64 **)*i )
{
v16 = (unsigned __int64)i[3];
if( v16 < 0x100 )
{
v23 = *((int *)i + 4);
if( (unsigned int)v23 > 0x23 || (v24 = 0xBC0400040i64, !_bittest64(&v24, v23)) )
{
v25 = (unsigned int)i[3];
v26 = (unsigned __int64)i[4] + v16 - 1;
v16 = (unsigned int)v16;
if( v26 > 0xFF )
v26 = 255i64;
if( (unsigned int)v16 <= v26 )
{
do
{
++v25;
*((_QWORD *)&v9[1].Next + v16) = 240i64;
v16 = v25;
}
while( v25 <= v26 );
}
}
}
}
LODWORD(Priority) = 1073741856;
LODWORD(v28) = 0;
HalpIoMemoryBase = (INT64)MmMapLockedPagesSpecifyCache(v9, 0, MmCached, 0i64, v28, Priority);
if( !HalpIoMemoryBase )
goto LABEL_17;
v18 = MmMapIoSpaceEx((_LARGE_INTEGER)655360i64, 0x20000ui64, 0x204ui64);
if( v18 )
{
v19 = HalpMmAllocCtxAlloc(v17, 0x2000ui64);
if( v19 )
{
HalpFrameBufferBase = (__int64)v18 - 655360;
x86BiosInitializeBiosEx(v20, HalpIoMemoryBase, (INT64)v18 - 655360, (INT64)v19);
v21 = MmMapIoSpaceEx(0i64, 0x800ui64, 4ui64);
if( v21 )
{
v22 = x86BiosTranslateAddress(0, 0);
memmove(v22, v21, 0x800u);
MmUnmapIoSpace(v21, 0x800ui64);
byte_140C50504 = 1;
qword_140C005E8 = (__int64)HalpBiosDisplayReset;
LABEL_17:
ExFreePoolWithTag(v9, 0);
return;
}
}
MmUnmapIoSpace(v18, 0x20000ui64);
HalpFrameBufferBase = 0i64;
}
if( HalpIoMemoryBase )
{
MmUnmapLockedPages((VOID *)HalpIoMemoryBase, v9);
HalpIoMemoryBase = 0i64;
}
goto LABEL_17;
}
if( (*(_BYTE *)(*(_QWORD *)(a2 + 240) + 2624i64) & 4) == 0 )
{
HalpIoMemoryBase = 0i64;
HalpFrameBufferBase = 0i64;
qword_140C005E8 = (__int64)HalpBiosDisplayReset;
byte_140C50504 = 1;
x86BiosInitializeBiosEx((INT64)v3, 0i64, 0i64, 0x20000i64);
v27 = x86BiosTranslateAddress(0, 0);
memmove(v27, 0i64, 0x800u);
}
}
}Referenced by:
InitBootProcessor
KiInitializeBootStructures