WheaAddErrorSource

NTSTATUS __stdcall WheaAddErrorSource(_WHEA_ERROR_SOURCE_DESCRIPTOR *Descriptor, VOID *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->Type) )
  {
    PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 0x430ui64, 1634035799i64);
    v6 = (INT64)PoolWithTag;
    if( PoolWithTag )
    {
      memset(PoolWithTag, 0i64, 0x430u);
      v7 = v6 + 96;
      v8 = v2;
      v9 = 7i64;
      do
      {
        *(_OWORD *)v7 = *(_OWORD *)&v8->Length;
        *(_OWORD *)(v7 + 16) = *(_OWORD *)&v8->MaxRawDataLength;
        *(_OWORD *)(v7 + 32) = *(_OWORD *)&v8->PlatformErrorSourceId;
        *(_OWORD *)(v7 + 48) = *(_OWORD *)&v8->Info.AerEndpointDescriptor.Slot.u;
        *(_OWORD *)(v7 + 64) = *(_OWORD *)&v8->Info.DeviceDriverDescriptor.PacketLength;
        *(_OWORD *)(v7 + 80) = *(_OWORD *)&v8->Info.DeviceDriverDescriptor.Config.Initialize;
        *(_OWORD *)(v7 + 96) = *(_OWORD *)&v8->Info.DeviceDriverDescriptor.Config.Correct;
        v7 += 128i64;
        v10 = *(_OWORD *)v8->Info.DeviceDriverDescriptor.CreatorId.Data4;
        v8 = (_WHEA_ERROR_SOURCE_DESCRIPTOR *)((char *)v8 + 128);
        *(_OWORD *)(v7 - 16) = v10;
        --v9;
      }
      while( v9 );
      *(_OWORD *)v7 = *(_OWORD *)&v8->Length;
      *(_OWORD *)(v7 + 16) = *(_OWORD *)&v8->MaxRawDataLength;
      *(_OWORD *)(v7 + 32) = *(_OWORD *)&v8->PlatformErrorSourceId;
      *(_OWORD *)(v7 + 48) = *(_OWORD *)&v8->Info.AerEndpointDescriptor.Slot.u;
      *(_QWORD *)(v7 + 64) = *(_QWORD *)&v8->Info.DeviceDriverDescriptor.PacketLength;
      *(_DWORD *)(v7 + 72) = v8->Info.XpfMceDescriptor.Banks[0].StatusMsr;
      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->Length;
    v15 = *(_OWORD *)&v2->MaxRawDataLength;
    v2 = (_WHEA_ERROR_SOURCE_DESCRIPTOR *)((char *)v2 + 128);
    *(_OWORD *)v13 = v14;
    v16 = *(_OWORD *)((char *)&v2[-1].Info.DeviceDriverDescriptor + 836);
    *((_OWORD *)v13 + 1) = v15;
    v17 = *(_OWORD *)((char *)&v2[-1].Info.DeviceDriverDescriptor + 852);
    *((_OWORD *)v13 + 2) = v16;
    v18 = *(_OWORD *)((char *)&v2[-1].Info.DeviceDriverDescriptor + 868);
    *((_OWORD *)v13 + 3) = v17;
    v19 = *(_OWORD *)((char *)&v2[-1].Info.DeviceDriverDescriptor + 884);
    *((_OWORD *)v13 + 4) = v18;
    v20 = *(_OWORD *)((char *)&v2[-1].Info.DeviceDriverDescriptor + 900);
    *((_OWORD *)v13 + 5) = v19;
    v21 = *(_OWORD *)((char *)&v2[-1].Info.DeviceDriverDescriptor + 916);
    *((_OWORD *)v13 + 6) = v20;
    v13 += 128;
    *((_OWORD *)v13 - 1) = v21;
    --v4;
  }
  while( v4 );
  v22 = *(_QWORD *)&v2->Info.DeviceDriverDescriptor.PacketLength;
  v23 = *(_OWORD *)&v2->MaxRawDataLength;
  *(_OWORD *)v13 = *(_OWORD *)&v2->Length;
  v24 = *(_OWORD *)&v2->PlatformErrorSourceId;
  *((_OWORD *)v13 + 1) = v23;
  v25 = *(_OWORD *)&v2->Info.AerEndpointDescriptor.Slot.u;
  *((_OWORD *)v13 + 2) = v24;
  *((_OWORD *)v13 + 3) = v25;
  *((_QWORD *)v13 + 8) = v22;
  *((_DWORD *)v13 + 18) = v2->Info.XpfMceDescriptor.Banks[0].StatusMsr;
  v29 = v12;
  v30 = 0;
  WheaLogInternalEvent(Src);
  return v12;
}

Referenced by:

WheaAddErrorSourceDeviceDriver