HalpHvInitMcaPcrContext

VOID __stdcall HalpHvInitMcaPcrContext(){
  KPCR *Pcr; 
  NTSTATUS CurrentProcessorNumber; 
  int v2; 
  size_t v3; 
  UINT8 *v4; 
  VOID **PoolWithTag; 
  int v6; 
  unsigned int v7; 
  int v8; 
  INT64 v9; 
  __int64 v10; 
  __int64 v11; 
  int v12; 
  unsigned int i; 
  INT64 v14; 
  __int64 v15; 
  int v16; 
  int v17; 
  __int64 v18; 
  __int64 j; 
  unsigned int v20; 
  _PROCESSOR_NUMBER ProcNumber; 
  INT64 v22; 

  v20 = 0;
  Pcr = KeGetPcr();
  ProcNumber = 0;
  if( byte_140C4A110 )
  {
    CurrentProcessorNumber = KeGetCurrentProcessorNumberEx(&ProcNumber.Group);
    if( !CurrentProcessorNumber && !*(&stru_140CF2E80 + 810) )
    {
      KeQueryMaximumProcessorCountEx(0xFFFFu);
      v3 = 184 * v2;
      v4 = HalpMmAllocCtxAlloc((_HALP_ALLOC_CONTEXT *)(unsigned int)(184 * v2), (unsigned int)(184 * v2));
      *(&stru_140CF2E80 + 810) = v4;
      if( !v4 )
        KeBugCheckEx(0xACu, (PVOID)v3, 0i64, "minkernel\\hals\\lib\\hv\\hvintel.c", (PVOID)0x49F);
      memset(v4, 0i64, v3);
    }
    if( !*(_QWORD *)&Pcr->HalReserved[6] )
    {
      PoolWithTag = 0i64;
      if( qword_140C4A190 )
        v6 = qword_140C4A190(4294967294i64, &v20, 0i64);
      else
        v6 = -1073741823;
      if( v6 == -1073741789 )
      {
        v7 = 8 * v20;
        PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 8 * v20, 543973704i64);
        if( !PoolWithTag )
          KeBugCheckEx(0xACu, (PVOID)v7, 0i64, "minkernel\\hals\\lib\\hv\\hvintel.c", (PVOID)0x4BA);
        if( qword_140C4A190 )
          v6 = qword_140C4A190(4294967294i64, &v20, PoolWithTag);
        else
          v6 = -1073741823;
      }
      if( v6 < 0 || !v20 )
        KeBugCheckEx(0x5Cu, (PVOID)0x8200, 0i64, "minkernel\\hals\\lib\\hv\\hvintel.c", (PVOID)0x4C6);
      v8 = 0;
      v22 = *(_DWORD *)PoolWithTag & 0x7FFFFFFF;
      v9 = v22;
      LODWORD(v10) = HalpGetMcaPcrContext(v22);
      v11 = v10;
      *(_QWORD *)(v10 + 176) = 0i64;
      *(_QWORD *)(v10 + 164) = v9;
      *(_QWORD *)&Pcr->HalReserved[6] = v10;
      v12 = 0;
      for( i = 1; i < v20; v11 = v15 )
      {
        v8 &= ~1u;
        HIDWORD(v22) = v8;
        v12 = v8;
        LODWORD(v22) = *((_DWORD *)PoolWithTag + i) & 0x7FFFFFFF;
        v14 = v22;
        LODWORD(v15) = HalpGetMcaPcrContext(v22);
        ++i;
        *(_QWORD *)(v15 + 176) = 0i64;
        *(_QWORD *)(v15 + 164) = v14;
        *(_QWORD *)(v11 + 176) = v15;
      }
      v16 = v12 | 1;
      v17 = CurrentProcessorNumber & 0x7FFFFFFF;
      v22 = __PAIR64__(v16, v17);
      LODWORD(v18) = HalpGetMcaPcrContext(__SPAIR64__(v16, v17));
      *(_QWORD *)(v18 + 176) = 0i64;
      *(_QWORD *)(v18 + 164) = __PAIR64__(v16, v17);
      *(_QWORD *)(v11 + 176) = v18;
      ExFreePoolWithTag(PoolWithTag, 0x206C6148u);
    }
    for( j = *(_QWORD *)&KeGetPcr()->HalReserved[6]; j; j = *(_QWORD *)(j + 176) )
    {
      if( !*(_BYTE *)(j + 152) )
      {
        *(_DWORD *)(j + 40) = 275;
        *(_QWORD *)(j + 64) = HalpCmciDeferredRoutine;
        *(_QWORD *)(j + 72) = j;
        *(_QWORD *)(j + 96) = 0i64;
        *(_QWORD *)(j + 56) = 0i64;
        KeSetTargetProcessorDpcEx((_KDPC *)(j + 40), &ProcNumber);
        *(_BYTE *)(j + 152) = 1;
      }
    }
  }
}

Referenced by:

HalpMceInit