HalpMcUpdateInitialize

INT64 __fastcall HalpMcUpdateInitialize(INT64 a1, _QWORD *a2){
  _QWORD *DataTableEntry; 
  int v4; 
  bool v5; 
  __int64 v7[5]; 
  __int128 v8; 
  __int128 v9; 
  __int128 v10; 
  __int64 v11; 
  v11 = 0i64;
  DataTableEntry = a2;
  v7[0] = (__int64)HalMcUpdateReadPCIConfig;
  v7[1] = (__int64)MmLockPagableDataSection;
  v7[2] = (__int64)MmLockPagableDataSection;
  v7[3] = (__int64)MmLockPagableSectionByHandle;
  v7[4] = (__int64)MmUnlockPagableImageSection;
  v4 = 0;
  v8 = 0i64;
  v9 = 0i64;
  v10 = 0i64;
  if( !a1 || (unsigned __int8)HalpIsPartitionCpuManager() )
  {
    if( !DataTableEntry )
    {
LABEL_9:
      HalpMcUpdatePostUpdateFunc = 0i64;
      HalpMcUpdateUnlockFunc = 0i64;
      HalpMcUpdateLockFunc = 0i64;
      HalpMcUpdateExportDataFunc = 0i64;
      HalpMcUpdateMicrocodeFuncEx = 0i64;
      HalpMcUpdateMicrocodeFunc = 0i64;
      return(unsigned int)v4;
    }
  }
  else
  {
    DataTableEntry = HalpMcUpdateFindDataTableEntry((_QWORD *)(a1 + 16));
    v5 = (*(_DWORD *)(*(_QWORD *)(a1 + 240) + 132i64) & 0x40000000) != 0;
    HalpMcUpdateSelfHosting = (*(_DWORD *)(*(_QWORD *)(a1 + 240) + 132i64) & 0x8000000) != 0;
    HalpMcUpdateMinVerSupported = v5;
  }
  if( !DataTableEntry )
    goto LABEL_9;
  v4 = ((__int64(__fastcall *)(__int128 *, __int64 *))DataTableEntry[7])(&v8, v7);
  if( v4 < 0 )
    goto LABEL_9;
  HalpMcUpdateMicrocodeFuncEx = (__int64(__fastcall *)(_QWORD, _QWORD, _QWORD, _QWORD, _QWORD, _DWORD, _DWORD))*((_QWORD *)&v8 + 1);
  HalpMcUpdateMicrocodeFunc = (PVOID)v8;
  HalpMcUpdateExportDataFunc = (__int64(__fastcall *)(_QWORD, _QWORD, _QWORD))*((_QWORD *)&v10 + 1);
  HalpMcUpdateUnlockFunc = (__int64(*)(void))*((_QWORD *)&v9 + 1);
  HalpMcUpdateLockFunc = (__int64(__fastcall *)(_QWORD, _QWORD))v9;
  HalpMcUpdatePostUpdateFunc = v10;
  return(unsigned int)v4;
}

Referenced by:

HalpLoadMicrocode
HalpProcInitDiscard
HalpProcInitSystem