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