WheapInitializeErrorSourceTable

INT64 __fastcall WheapInitializeErrorSourceTable(UINT64 Count, _WHEA_ERROR_SOURCE_DESCRIPTOR *Buffer){
  int v2; 
  unsigned int v4; 
  _WHEAP_ERROR_SOURCE *PoolWithTag; 
  _WHEAP_ERROR_SOURCE *v6; 
  char *v7; 
  _WHEA_ERROR_SOURCE_DESCRIPTOR *v8; 
  __int64 v9; 
  __int128 v10; 
  __int64 *v11; 
  int v12; 
  v2 = 0;
  v4 = Count;
  if( !(_DWORD)Count )
    return 0i64;
  while( 1 )
  {
    if( *((_DWORD *)Buffer + 2) > 0x10u )
      goto LABEL_11;
    PoolWithTag = (_WHEAP_ERROR_SOURCE *)ExAllocatePoolWithTag(NonPagedPoolNx, 0x430ui64, 0x61656857ui64);
    v6 = PoolWithTag;
    if( !PoolWithTag )
      return 3221225626i64;
    memset((INT64)PoolWithTag, 0i64);
    v7 = (char *)v6 + 96;
    v8 = Buffer;
    v9 = 7i64;
    do
    {
      v10 = *(_OWORD *)v8;
      v8 = (_WHEA_ERROR_SOURCE_DESCRIPTOR *)((char *)v8 + 128);
      *(_OWORD *)v7 = v10;
      v7 += 128;
      *((_OWORD *)v7 - 7) = *((_OWORD *)v8 - 7);
      *((_OWORD *)v7 - 6) = *((_OWORD *)v8 - 6);
      *((_OWORD *)v7 - 5) = *((_OWORD *)v8 - 5);
      *((_OWORD *)v7 - 4) = *((_OWORD *)v8 - 4);
      *((_OWORD *)v7 - 3) = *((_OWORD *)v8 - 3);
      *((_OWORD *)v7 - 2) = *((_OWORD *)v8 - 2);
      *((_OWORD *)v7 - 1) = *((_OWORD *)v8 - 1);
      --v9;
    }
    while( v9 );
    *(_OWORD *)v7 = *(_OWORD *)v8;
    *((_OWORD *)v7 + 1) = *((_OWORD *)v8 + 1);
    *((_OWORD *)v7 + 2) = *((_OWORD *)v8 + 2);
    *((_OWORD *)v7 + 3) = *((_OWORD *)v8 + 3);
    *((_QWORD *)v7 + 8) = *((_QWORD *)v8 + 8);
    *((_DWORD *)v7 + 18) = *((_DWORD *)v8 + 18);
    v11 = qword_140CF4348;
    if( LOBYTE(qword_140CF4348[8 * (__int64)*((int *)Buffer + 2)]) )
    {
      v12 = WheapInitializeErrorSource(v6);
      if( v12 < 0 )
      {
        ExFreeHeapPool(v6);
        return(unsigned int)v12;
      }
    }
    else
    {
      *((_DWORD *)v6 + 10) = *((_DWORD *)Buffer + 2);
      *((_BYTE *)v6 + 88) = 1;
    }
    if( *((_DWORD *)v6 + 26) != 5 || *((_DWORD *)v6 + 36) == 0xFFFF )
      WheapAddErrorSource(v11, v6);
    Buffer = (_WHEA_ERROR_SOURCE_DESCRIPTOR *)((char *)Buffer + *(_DWORD *)Buffer);
LABEL_11:
    if( ++v2 >= v4 )
      return 0i64;
  }
}

Referenced by:

WheaInitialize