HalpInitializeGenericErrorSource

NTSTATUS __stdcall HalpInitializeGenericErrorSource(UINT64 Phase, WHEA_ERROR_SOURCE_DESCRIPTOR *ErrorSource){
  NTSTATUS v4; 
  int v5; 
  _QWORD *v6; 
  _QWORD *v7; 
  int v8; 
  _QWORD *v9; 
  _QWORD *v10; 
  int v11; 
  _QWORD *v12; 
  _QWORD *v13; 
  int v14; 
  _QWORD *v15; 
  _LARGE_INTEGER *v16; 
  __int64 v17; 
  _QWORD *v18; 
  int inited; 
  _QWORD *v20; 
  _QWORD *v21; 
  bool v22; 
  PVOID P; 
  P = 0i64;
  if( !(_DWORD)Phase )
    return 0;
  if( !HalpGenericInitDone )
  {
    qword_140C49988 = (__int64)&HalpGenericPeiErrorSourceListHead;
    HalpGenericPeiErrorSourceListHead = (__int64)&HalpGenericPeiErrorSourceListHead;
    qword_140C49AF8 = (__int64)&HalpGenericAssistErrorSourceListHead;
    HalpGenericAssistErrorSourceListHead = (__int64)&HalpGenericAssistErrorSourceListHead;
    qword_140C49AD8 = (__int64)&HalpGenericSdeiErrorSourceListHead;
    HalpGenericSdeiErrorSourceListHead = (__int64)&HalpGenericSdeiErrorSourceListHead;
    HalpGenericInitDone = 1;
    qword_140C49AC8 = (__int64)&HalpGenericPolledErrorSourceListHead;
    HalpGenericPolledErrorSourceListHead = (INT64)&HalpGenericPolledErrorSourceListHead;
    qword_140C49AE8 = (__int64)&HalpGenericNmiErrorSourceListHead;
    HalpGenericNmiErrorSourceListHead = (INT64)&HalpGenericNmiErrorSourceListHead;
    qword_140C499A8 = (__int64)&HalpGenericSeaErrorSourceListHead;
    HalpGenericSeaErrorSourceListHead = (__int64)&HalpGenericSeaErrorSourceListHead;
    qword_140C49998 = (__int64)&HalpGenericSeiErrorSourceListHead;
    HalpGenericSeiErrorSourceListHead = (__int64)&HalpGenericSeiErrorSourceListHead;
  }
  switch( *((_BYTE *)ErrorSource + 64) )
  {
    case 0:
      if( *((_DWORD *)ErrorSource + 2) == 12 )
        inited = HalpInitGenericErrorSourceEntryV2((__int64)ErrorSource, &P);
      else
        inited = HalpInitGenericErrorSourceEntry((__int64)ErrorSource, &P);
      v4 = inited;
      v20 = P;
      *((_QWORD *)P + 2) = KUSER_SHARED_DATA.TickCountQuad;
      if( inited < 0 )
        return v4;
      v21 = (_QWORD *)qword_140C49AC8;
      if( *(INT64 **)qword_140C49AC8 == &HalpGenericPolledErrorSourceListHead )
      {
        v22 = HalpGenericPollingInitDone == 0;
        *v20 = &HalpGenericPolledErrorSourceListHead;
        v20[1] = v21;
        *v21 = v20;
        qword_140C49AC8 = (__int64)v20;
        if( v22 )
        {
          HalpGenericPollingInitDone = 1;
          HalpInitGenericErrorSourcePollingRoutine();
        }
        goto LABEL_55;
      }
      goto LABEL_52;
    case 4:
      if( *((_DWORD *)ErrorSource + 2) == 12 )
        v14 = HalpInitGenericErrorSourceEntryV2((__int64)ErrorSource, &P);
      else
        v14 = HalpInitGenericErrorSourceEntry((__int64)ErrorSource, &P);
      v4 = v14;
      if( v14 >= 0 )
      {
        v15 = P;
        v16 = (_LARGE_INTEGER *)*((_QWORD *)P + 5);
        if( v16->QuadPart == -1 || (MmMapIoSpaceEx(*v16, *((unsigned int *)P + 12), 0x204ui64), (v15[7] = v17) == 0i64) )
        {
          ExFreePoolWithTag(v15, 0x206C6148u);
          return -1073741823;
        }
        v18 = (_QWORD *)qword_140C49AE8;
        if( *(INT64 **)qword_140C49AE8 != &HalpGenericNmiErrorSourceListHead )
          goto LABEL_52;
        *v15 = &HalpGenericNmiErrorSourceListHead;
        v15[1] = v18;
        *v18 = v15;
        qword_140C49AE8 = (__int64)v15;
      }
      if( !HalpGenericNmiInitDone )
        HalpGenericNmiInitDone = 1;
      goto LABEL_55;
    case 8:
      if( *((_DWORD *)ErrorSource + 2) == 12 )
        v11 = HalpInitGenericErrorSourceEntryV2((__int64)ErrorSource, &P);
      else
        v11 = HalpInitGenericErrorSourceEntry((__int64)ErrorSource, &P);
      v4 = v11;
      if( v11 >= 0 )
      {
        v12 = (_QWORD *)qword_140C499A8;
        if( *(__int64 **)qword_140C499A8 != &HalpGenericSeaErrorSourceListHead )
          goto LABEL_52;
        v13 = P;
        *(_QWORD *)P = &HalpGenericSeaErrorSourceListHead;
        v13[1] = v12;
        *v12 = v13;
        qword_140C499A8 = (__int64)v13;
      }
      if( !HalpGenericSeaInitDone )
        HalpGenericSeaInitDone = 1;
      goto LABEL_55;
    case 9:
      if( *((_DWORD *)ErrorSource + 2) == 12 )
        v8 = HalpInitGenericErrorSourceEntryV2((__int64)ErrorSource, &P);
      else
        v8 = HalpInitGenericErrorSourceEntry((__int64)ErrorSource, &P);
      v4 = v8;
      if( v8 >= 0 )
      {
        v9 = (_QWORD *)qword_140C49998;
        if( *(__int64 **)qword_140C49998 != &HalpGenericSeiErrorSourceListHead )
          goto LABEL_52;
        v10 = P;
        *(_QWORD *)P = &HalpGenericSeiErrorSourceListHead;
        v10[1] = v9;
        *v9 = v10;
        qword_140C49998 = (__int64)v10;
      }
      if( !HalpGenericSeiInitDone )
        HalpGenericSeiInitDone = 1;
      goto LABEL_55;
    case 0xA:
      if( *((_DWORD *)ErrorSource + 2) == 12 )
        v5 = HalpInitGenericErrorSourceEntryV2((__int64)ErrorSource, &P);
      else
        v5 = HalpInitGenericErrorSourceEntry((__int64)ErrorSource, &P);
      v4 = v5;
      if( !HalpGenericPeiInitDone )
        HalpGenericPeiInitDone = 1;
      if( v5 < 0 )
        return v4;
      v6 = P;
      v4 = HalpRegisterPeiErrorSource(P);
      if( v4 < 0 )
        return v4;
      v7 = (_QWORD *)qword_140C49988;
      if( *(__int64 **)qword_140C49988 == &HalpGenericPeiErrorSourceListHead )
      {
        *v6 = &HalpGenericPeiErrorSourceListHead;
        v6[1] = v7;
        *v7 = v6;
        qword_140C49988 = (__int64)v6;
LABEL_55:
        if( v4 >= 0 )
          HalpGenInitialRead((INT64)ErrorSource);
        return v4;
      }
LABEL_52:
      __fastfail(3u);
  }
  return -1073741637;
}

Referenced by:

HalpInitializeErrSrc