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