WheaAddErrorSource

INT64 __stdcall WheaAddErrorSource(_WHEA_ERROR_SOURCE_DESCRIPTOR *Descriptor, PVOID Context){
  _WHEA_ERROR_SOURCE_DESCRIPTOR *v2; 
  __int64 v4; 
  VOID *PoolWithTag; 
  INT64 v6; 
  INT64 v7; 
  _WHEA_ERROR_SOURCE_DESCRIPTOR *v8; 
  __int64 v9; 
  __int128 v10; 
  __int64 v11; 
  int v12; 
  char *v13; 
  __int128 v14; 
  __int128 v15; 
  __int128 v16; 
  __int128 v17; 
  __int128 v18; 
  __int128 v19; 
  __int128 v20; 
  __int128 v21; 
  __int64 v22; 
  __int128 v23; 
  __int128 v24; 
  __int128 v25; 
  int Src[8]; 
  char v28; 
  int v29; 
  char v30; 
  v2 = Descriptor;
  v4 = 7i64;
  if( WheapIsNonHestErrorSource(*((unsigned int *)Descriptor + 2)) )
  {
    PoolWithTag = ExAllocatePoolWithTag(NonPagedPoolNx, 0x430ui64, 0x61656857ui64);
    v6 = (INT64)PoolWithTag;
    if( PoolWithTag )
    {
      memset((INT64)PoolWithTag, 0i64);
      v7 = v6 + 96;
      v8 = v2;
      v9 = 7i64;
      do
      {
        *(_OWORD *)v7 = *(_OWORD *)v8;
        *(_OWORD *)(v7 + 16) = *((_OWORD *)v8 + 1);
        *(_OWORD *)(v7 + 32) = *((_OWORD *)v8 + 2);
        *(_OWORD *)(v7 + 48) = *((_OWORD *)v8 + 3);
        *(_OWORD *)(v7 + 64) = *((_OWORD *)v8 + 4);
        *(_OWORD *)(v7 + 80) = *((_OWORD *)v8 + 5);
        *(_OWORD *)(v7 + 96) = *((_OWORD *)v8 + 6);
        v7 += 128i64;
        v10 = *((_OWORD *)v8 + 7);
        v8 = (_WHEA_ERROR_SOURCE_DESCRIPTOR *)((char *)v8 + 128);
        *(_OWORD *)(v7 - 16) = v10;
        --v9;
      }
      while( v9 );
      *(_OWORD *)v7 = *(_OWORD *)v8;
      *(_OWORD *)(v7 + 16) = *((_OWORD *)v8 + 1);
      *(_OWORD *)(v7 + 32) = *((_OWORD *)v8 + 2);
      *(_OWORD *)(v7 + 48) = *((_OWORD *)v8 + 3);
      *(_QWORD *)(v7 + 64) = *((_QWORD *)v8 + 8);
      *(_DWORD *)(v7 + 72) = *((_DWORD *)v8 + 18);
      v12 = WheapInitializeErrorSource((_WHEAP_ERROR_SOURCE *)v6);
      if( v12 )
      {
        ExFreePoolWithTag((PVOID)v6, 0x61656857u);
      }
      else
      {
        *(_QWORD *)(v6 + 56) = Context;
        WheapAddErrorSource(v11, v6);
        if( WheapInitializationComplete )
        {
          *(_DWORD *)(v6 + 108) = 2;
          v12 = WheapCallErrorSourceInitialize(v6, 1ui64);
          if( v12 < 0 )
            *(_DWORD *)(v6 + 108) = 1;
        }
      }
    }
    else
    {
      v12 = -1073741670;
    }
  }
  else
  {
    v12 = -1073741637;
  }
  Src[3] = 0;
  v13 = &v28;
  Src[0] = 1733060695;
  Src[1] = 1;
  Src[2] = 1009;
  Src[5] = -2147483636;
  Src[4] = 1280201291;
  Src[6] = 2;
  Src[7] = 977;
  do
  {
    v14 = *(_OWORD *)v2;
    v15 = *((_OWORD *)v2 + 1);
    v2 = (_WHEA_ERROR_SOURCE_DESCRIPTOR *)((char *)v2 + 128);
    *(_OWORD *)v13 = v14;
    v16 = *((_OWORD *)v2 - 6);
    *((_OWORD *)v13 + 1) = v15;
    v17 = *((_OWORD *)v2 - 5);
    *((_OWORD *)v13 + 2) = v16;
    v18 = *((_OWORD *)v2 - 4);
    *((_OWORD *)v13 + 3) = v17;
    v19 = *((_OWORD *)v2 - 3);
    *((_OWORD *)v13 + 4) = v18;
    v20 = *((_OWORD *)v2 - 2);
    *((_OWORD *)v13 + 5) = v19;
    v21 = *((_OWORD *)v2 - 1);
    *((_OWORD *)v13 + 6) = v20;
    v13 += 128;
    *((_OWORD *)v13 - 1) = v21;
    --v4;
  }
  while( v4 );
  v22 = *((_QWORD *)v2 + 8);
  v23 = *((_OWORD *)v2 + 1);
  *(_OWORD *)v13 = *(_OWORD *)v2;
  v24 = *((_OWORD *)v2 + 2);
  *((_OWORD *)v13 + 1) = v23;
  v25 = *((_OWORD *)v2 + 3);
  *((_OWORD *)v13 + 2) = v24;
  *((_OWORD *)v13 + 3) = v25;
  *((_QWORD *)v13 + 8) = v22;
  *((_DWORD *)v13 + 18) = *((_DWORD *)v2 + 18);
  v29 = v12;
  v30 = 0;
  WheaLogInternalEvent(Src);
  return(unsigned int)v12;
}

Referenced by:

WheaAddErrorSourceDeviceDriver