HalpExtInitExtensions

VOID __fastcall HalpExtInitExtensions(_LOADER_PARAMETER_BLOCK *LoaderBlock){
  int v2; 
  _LIST_ENTRY *p_HalExtensionModuleList; 
  _LIST_ENTRY *Flink; 
  size_t v5; 
  PSTR MemoryInternal; 
  _LARGE_INTEGER *Table; 
  unsigned int v8; 
  _LIST_ENTRY *v9; 
  _LIST_ENTRY *v10; 
  _LIST_ENTRY *v11; 
  _LIST_ENTRY *Blink; 
  unsigned __int64 v13; 
  _LIST_ENTRY *i; 
  __int64 v15; 
  __int64 v16; 

  qword_140C49CA8 = LoaderBlock;
  v16 = 0i64;
  v2 = 0;
  p_HalExtensionModuleList = &LoaderBlock->Extension->HalExtensionModuleList;
  dword_140C49CA0 = 0;
  Flink = p_HalExtensionModuleList->Flink;
  if( p_HalExtensionModuleList->Flink != p_HalExtensionModuleList )
  {
    do
    {
      Flink = Flink->Flink;
      ++v2;
    }
    while( Flink != p_HalExtensionModuleList );
    dword_140C49CA0 = v2;
    if( v2 )
    {
      v5 = v2 << 6;
      MemoryInternal = HalpMmAllocateMemoryInternal(v5, MmCached);
      qword_140C49C98 = (__int64)MemoryInternal;
      if( MemoryInternal )
      {
        memset(MemoryInternal, 0i64, v5);
        Table = HalpAcpiGetTable(LoaderBlock, (const UINT8 *)0x54525343, 0i64);
        if( Table )
        {
          v8 = 0;
          v9 = &LoaderBlock->Extension->HalExtensionModuleList;
          v10 = v9->Flink;
          while( v10 != v9 )
          {
            if( SLODWORD(v10[2].Blink) >= 0 )
            {
              v11 = v10[1].Flink;
              Blink = v11[3].Blink;
              v16 = 0i64;
              if( ((__int64(__fastcall *)(_QWORD, __int64 *, void **))Blink)(0i64, &v16, &HalpExtensionImports) >= 0
                && v16 )
              {
                v13 = qword_140C49C98 + ((unsigned __int64)v8 << 6);
                *(_QWORD *)(v13 + 8) = v11[3].Blink;
                *(_QWORD *)(v13 + 16) = v16;
                *(_DWORD *)(v13 + 24) = 0;
                *(_QWORD *)(v13 + 48) = v11[3].Flink;
                *(_DWORD *)(v13 + 56) = v11[4].Flink;
                *(_BYTE *)v13 = 1;
                *(_QWORD *)(v13 + 40) = v13 + 32;
                *(_QWORD *)(v13 + 32) = v13 + 32;
                for( i = v10[1].Blink; i != (_LIST_ENTRY *)&v10[1].Blink; i = i->Flink )
                  (**(void(__fastcall ***)(_QWORD, char *))(v13 + 16))(v8, (char *)Table + LODWORD(i[1].Flink));
                *(_BYTE *)v13 = 0;
              }
            }
            else
            {
              LODWORD(v15) = v10[2].Blink;
              DbgPrintEx(0x65u, 0, "HAL Extension %s failed load, status=0x%x\n", (const char *)v10[3].Flink, v15);
            }
            ++v8;
            v10 = v10->Flink;
            v9 = &LoaderBlock->Extension->HalExtensionModuleList;
          }
        }
      }
    }
  }
}

Referenced by:

HalpHalExtInitSystem