HalpMcRecordProcessorInfo

INT64 __fastcall HalpMcRecordProcessorInfo(INT64 a1){
  int v1; 
  PVOID *v3; 
  PVOID v4; 
  _QWORD *PoolWithTag; 
  _QWORD *v7; 
  _QWORD *v8; 
  v1 = *(_DWORD *)(a1 + 16);
  if( v1 == -2 )
  {
    HalpMcSetUpdateInfoInvalid();
    HalpMcUpdateRecordingSupported = 0;
    return 0i64;
  }
  if( !HalpMcUpdateInfoValid || v1 == -1 )
    return 0i64;
  v3 = (PVOID *)HalpMcUpdateInfoHead;
  if( HalpMcUpdateInfoHead != &HalpMcUpdateInfoHead )
  {
    v4 = *(PVOID *)(a1 + 24);
    while( v3[3] != v4 )
    {
      v3 = (PVOID *)*v3;
      if( v3 == &HalpMcUpdateInfoHead )
        goto LABEL_8;
    }
    return 0i64;
  }
LABEL_8:
  PoolWithTag = ExAllocatePoolWithTag(PagedPool, 0x30ui64, 0x206C6148ui64);
  v7 = PoolWithTag;
  if( PoolWithTag )
  {
    *(_OWORD *)PoolWithTag = 0i64;
    *((_OWORD *)PoolWithTag + 1) = 0i64;
    *((_OWORD *)PoolWithTag + 2) = 0i64;
    PoolWithTag[3] = *(_QWORD *)(a1 + 24);
    v8 = HalpMcUpdateInfoHead;
    if( *((PVOID **)HalpMcUpdateInfoHead + 1) != &HalpMcUpdateInfoHead )
      __fastfail(3u);
    *v7 = HalpMcUpdateInfoHead;
    v7[1] = &HalpMcUpdateInfoHead;
    v8[1] = v7;
    HalpMcUpdateInfoHead = v7;
    return 0i64;
  }
  HalpMcSetUpdateInfoInvalid();
  return 3221225495i64;
}

Referenced by:

HalpMcInitializeMicrocodeInfo
HalpMcUpdateMicrocode