WheapInitErrorReportDeviceDriver

NTSTATUS __stdcall WheapInitErrorReportDeviceDriver(UINT64 ErrorSourceId, VOID **a2){
  unsigned int v3; 
  char v4; 
  NTSTATUS v5; 
  char *PreallocatedPacketBuffer; 
  INT64 v7; 
  UINT64 v8; 
  _WHEAP_ERROR_SOURCE *ErrorSource; 
  _WHEA_ERROR_SOURCE_DESCRIPTOR *p_Descriptor; 
  __int64 v11; 
  __int64 v12; 
  signed __int32 v13; 
  unsigned int v14; 
  signed __int32 v15; 
  unsigned int v16; 
  unsigned int v17; 
  VOID *PoolWithTag; 
  char v20; 
  unsigned int ErrorSourceIda; 
  int Src[16]; 

  ErrorSourceIda = ErrorSourceId;
  v3 = ErrorSourceId;
  memset(Src, 0i64, sizeof(Src));
  v4 = 0;
  *a2 = 0i64;
  v5 = 0;
  v20 = 0;
  PreallocatedPacketBuffer = 0i64;
  ErrorSource = WheapGetErrorSource((_WHEAP_ERROR_SOURCE_TABLE *)&WheapErrorSourceTable, v3, v7, v8);
  p_Descriptor = &ErrorSource->Descriptor;
  v11 = -(__int64)ErrorSource;
  v12 = (unsigned __int64)p_Descriptor & -(__int64)(v11 != 0);
  if( !v12 || (v13 = *(_DWORD *)(((unsigned __int64)p_Descriptor & -(__int64)(v11 != 0)) + 0x98), v13 == -1) )
  {
    Src[5] = -2147483605;
LABEL_21:
    Src[0] = 1733060695;
    Src[7] = 32;
    Src[1] = 1;
    Src[2] = 64;
    Src[3] = 1;
    Src[4] = 1280201291;
    Src[6] = 2;
    RtlStringCchCopyA((CHAR *)&Src[8], 0x20ui64, (CHAR *)"InitErrorReportDeviceDriver");
    WheaLogInternalEvent(Src);
    v5 = -1073741811;
LABEL_22:
    if( v20 )
      _InterlockedDecrement((volatile signed __int32 *)(v12 + 152));
    if( PreallocatedPacketBuffer )
      ExFreePoolWithTag(PreallocatedPacketBuffer, 0x41454857u);
LABEL_26:
    if( *a2 )
      ExFreePoolWithTag(*a2, 0x41454857u);
  }
  else
  {
    v14 = 0;
    while( 1 )
    {
      v15 = v13;
      if( v13 == -1 )
      {
        v5 = -1073741811;
        goto LABEL_26;
      }
      v13 = _InterlockedCompareExchange((volatile signed __int32 *)(v12 + 152), v13 + 1, v13);
      if( v15 == v13 )
        break;
      if( ++v14 >= 0xA )
        goto LABEL_9;
    }
    v20 = 1;
LABEL_9:
    if( v14 >= 0xA )
    {
      Src[5] = -2147483604;
      goto LABEL_21;
    }
    v16 = *(_DWORD *)(v12 + 16);
    if( KeGetCurrentIrql() >= 2u )
    {
      PreallocatedPacketBuffer = (char *)WheapGetPreallocatedPacketBuffer(ErrorSourceIda);
      if( !PreallocatedPacketBuffer )
      {
LABEL_13:
        v5 = -1073741670;
        goto LABEL_22;
      }
      PoolWithTag = *a2;
      v4 = 1;
      v17 = v16;
    }
    else
    {
      v17 = *(_DWORD *)(v12 + 16);
      PreallocatedPacketBuffer = (char *)ExAllocatePoolWithTag(0x200ui64, v16, 1095059543i64);
      if( !PreallocatedPacketBuffer )
        goto LABEL_13;
      PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 0x68ui64, 1095059543i64);
      *a2 = PoolWithTag;
      if( !PoolWithTag )
        goto LABEL_13;
    }
    memset(PoolWithTag, 0i64, 0x68u);
    *(_DWORD *)*a2 = 1095059543;
    *((_DWORD *)*a2 + 3) = ErrorSourceIda;
    *((_DWORD *)*a2 + 13) = 2;
    *((_BYTE *)*a2 + 48) = v4;
    *((_QWORD *)*a2 + 5) = PreallocatedPacketBuffer + 8;
    *((_QWORD *)*a2 + 4) = PreallocatedPacketBuffer;
    memset(PreallocatedPacketBuffer + 8, 0i64, v17 - 8);
    *((_DWORD *)PreallocatedPacketBuffer + 2) = 1095059543;
    *((_DWORD *)PreallocatedPacketBuffer + 3) = 3;
    *((_DWORD *)PreallocatedPacketBuffer + 4) = v16 - 112;
    *((_DWORD *)PreallocatedPacketBuffer + 19) = v16 - 192;
    *((_DWORD *)PreallocatedPacketBuffer + 6) = 6;
    *((_DWORD *)PreallocatedPacketBuffer + 7) = -2147483646;
    *((_DWORD *)PreallocatedPacketBuffer + 8) = ErrorSourceIda;
    *((_DWORD *)PreallocatedPacketBuffer + 9) = 12;
    *(_OWORD *)(PreallocatedPacketBuffer + 40) = DEVICE_DRIVER_NOTIFY_TYPE_GUID;
    *((_DWORD *)PreallocatedPacketBuffer + 16) = 7;
    *((_DWORD *)PreallocatedPacketBuffer + 18) = 80;
    *((_QWORD *)*a2 + 2) = PreallocatedPacketBuffer + 88;
    *((_DWORD *)PreallocatedPacketBuffer + 22) &= 0xFFFFC00F;
    *((_DWORD *)PreallocatedPacketBuffer + 26) = 2;
    *((_DWORD *)PreallocatedPacketBuffer + 25) = *((_DWORD *)PreallocatedPacketBuffer + 4) - 100;
    *((_QWORD *)*a2 + 3) = PreallocatedPacketBuffer + 108;
    *((_DWORD *)*a2 + 2) += 100;
  }
  return v5;
}

Referenced by:

WheaCreateHwErrorReportDeviceDriver