HalpHvInitMcaPcrContext

VOID __stdcall HalpHvInitMcaPcrContext(){
  KPCR *Pcr; 
  int v1; 
  int v2; 
  unsigned int v3; 
  __int64 v4; 
  _DWORD *PoolWithTag; 
  int v6; 
  unsigned int v7; 
  int v8; 
  INT64 v9; 
  INT64 McaPcrContext; 
  int v11; 
  unsigned int i; 
  INT64 v13; 
  INT64 v14; 
  int v15; 
  int v16; 
  INT64 v17; 
  __int64 j; 
  unsigned int v19; 
  struct _PROCESSOR_NUMBER ProcNumber; 
  INT64 v21; 
  v19 = 0;
  Pcr = KeGetPcr();
  ProcNumber = 0;
  if( HalpHvWheaEnlightenedCpuManager )
  {
    KeGetCurrentProcessorNumberEx(&ProcNumber);
    v2 = v1;
    if( !v1 && !HalpHvVpMcaPcrContextData )
    {
      v3 = 184 * KeQueryMaximumProcessorCountEx(0xFFFFu);
      v4 = HalpMmAllocCtxAlloc(v3, v3);
      HalpHvVpMcaPcrContextData = v4;
      if( !v4 )
        KeBugCheckEx(0xACu, v3, 0i64, (ULONG_PTR)"minkernel\\hals\\lib\\hv\\hvintel.c", 0x49Fui64);
      memset(v4, 0i64);
    }
    if( !*((_QWORD *)Pcr + 27) )
    {
      PoolWithTag = 0i64;
      if( qword_140C4A190 )
        v6 = qword_140C4A190(4294967294i64, &v19, 0i64);
      else
        v6 = -1073741823;
      if( v6 == -1073741789 )
      {
        v7 = 8 * v19;
        PoolWithTag = ExAllocatePoolWithTag(NonPagedPoolNx, 8 * v19, 0x206C6148ui64);
        if( !PoolWithTag )
          KeBugCheckEx(0xACu, v7, 0i64, (ULONG_PTR)"minkernel\\hals\\lib\\hv\\hvintel.c", 0x4BAui64);
        if( qword_140C4A190 )
          v6 = qword_140C4A190(4294967294i64, &v19, PoolWithTag);
        else
          v6 = -1073741823;
      }
      if( v6 < 0 || !v19 )
        KeBugCheckEx(0x5Cu, 0x8200ui64, 0i64, (ULONG_PTR)"minkernel\\hals\\lib\\hv\\hvintel.c", 0x4C6ui64);
      v8 = 0;
      v21 = *PoolWithTag & 0x7FFFFFFF;
      v9 = v21;
      McaPcrContext = HalpGetMcaPcrContext(v21);
      *(_QWORD *)(McaPcrContext + 176) = 0i64;
      *(_QWORD *)(McaPcrContext + 164) = v9;
      *((_QWORD *)Pcr + 27) = McaPcrContext;
      v11 = 0;
      for( i = 1; i < v19; McaPcrContext = v14 )
      {
        v8 &= ~1u;
        HIDWORD(v21) = v8;
        v11 = v8;
        LODWORD(v21) = PoolWithTag[i] & 0x7FFFFFFF;
        v13 = v21;
        v14 = HalpGetMcaPcrContext(v21);
        ++i;
        *(_QWORD *)(v14 + 176) = 0i64;
        *(_QWORD *)(v14 + 164) = v13;
        *(_QWORD *)(McaPcrContext + 176) = v14;
      }
      v15 = v11 | 1;
      v16 = v2 & 0x7FFFFFFF;
      v21 = __PAIR64__(v15, v16);
      v17 = HalpGetMcaPcrContext(__SPAIR64__(v15, v16));
      *(_QWORD *)(v17 + 176) = 0i64;
      *(_QWORD *)(v17 + 164) = __PAIR64__(v15, v16);
      *(_QWORD *)(McaPcrContext + 176) = v17;
      ExFreePoolWithTag(PoolWithTag, 0x206C6148u);
    }
    for( j = *((_QWORD *)KeGetPcr() + 27); 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