IopLiveDumpEndMirroringCallback

NTSTATUS __stdcall IopLiveDumpEndMirroringCallback(UINT64 PassNumber){
  _GUID *v1; 
  __int64 v2; 
  int v3; 
  unsigned int Data1; 
  __int64 v5; 
  __int64 v6; 
  struct _KPRCB *CurrentPrcb; 
  struct _KPRCB *v8; 
  __int64 v9; 
  _OWORD *v10; 
  _CONTEXT *Context; 
  __int64 v12; 
  __int128 v13; 
  unsigned int v14; 
  __int64 v15; 
  UINT64 *p_Data1; 
  UINT64 v17; 
  unsigned int v18; 
  __int64 v19; 
  __int64 v20; 
  __int64 v21; 
  __int64 v22; 
  __int64 v23; 
  __int64 v24; 

  v1 = IopLiveDumpContext;
  v2 = 0i64;
  if( (_DWORD)PassNumber )
  {
    if( (_DWORD)PassNumber == 1 )
    {
      IopLiveDumpTraceMirroringPhase1End((_LIVEDUMP_CONTEXT *)IopLiveDumpContext);
      Data1 = v1[5].Data1;
      if( (Data1 & 0x80u) != 0 )
      {
        LODWORD(v5) = IopLiveDumpGetMillisecondCounter(0);
        Data1 = v1[5].Data1;
        v2 = v5;
        v6 = v5 - qword_140CF50C0;
        if( (Data1 & 1) != 0 )
          *(_QWORD *)&v1[28].Data1 = v6;
        else
          *(_QWORD *)&v1[31].Data1 = v6;
      }
      if( (Data1 & 1) != 0 )
      {
        CurrentPrcb = KeGetCurrentPrcb();
        RtlCaptureContext(CurrentPrcb->Context);
        KiSaveProcessorControlState(&CurrentPrcb->ProcessorState);
      }
      else
      {
        v8 = KeGetCurrentPrcb();
        v9 = *(_QWORD *)&v1[35].Data1;
        RtlCaptureContext(v8->Context);
        KiSaveProcessorControlState(&v8->ProcessorState);
        v10 = (_OWORD *)(v9 + 840);
        if( v10 )
        {
          memset(v10, 0i64, 0xBB8u);
          Context = v8->Context;
          v12 = 9i64;
          do
          {
            v13 = *(_OWORD *)&Context->P1Home;
            Context = (_CONTEXT *)((char *)Context + 128);
            *v10 = v13;
            v10 += 8;
            *(v10 - 7) = Context[-1].VectorRegister[22];
            *(v10 - 6) = Context[-1].VectorRegister[23];
            *(v10 - 5) = Context[-1].VectorRegister[24];
            *(v10 - 4) = Context[-1].VectorRegister[25];
            *(v10 - 3) = *(_OWORD *)&Context[-1].VectorControl;
            *(v10 - 2) = *(_OWORD *)&Context[-1].LastBranchToRip;
            *(v10 - 1) = *(_OWORD *)&Context[-1].LastExceptionToRip;
            --v12;
          }
          while( v12 );
          *v10 = *(_OWORD *)&Context->P1Home;
          v10[1] = *(_OWORD *)&Context->P3Home;
          v10[2] = *(_OWORD *)&Context->P5Home;
          v10[3] = *(_OWORD *)&Context->ContextFlags;
          v10[4] = *(_OWORD *)&Context->SegGs;
        }
        if( SaveSupervisorState )
        {
          KeSaveSupervisorState(
            (INT64)KeGetCurrentPrcb()->ExtendedSupervisorState,
            KUSER_SHARED_DATA.XState.EnabledSupervisorFeatures | 0x100);
          v1[26].Data4[1] = 1;
        }
      }
      v14 = v1[5].Data1;
      if( (v14 & 0x80u) != 0 )
      {
        LODWORD(v15) = IopLiveDumpGetMillisecondCounter(0);
        IopLiveDumpTraceCaptureProcessorContextDuration(v1, v15 - v2);
        v14 = v1[5].Data1;
      }
      p_Data1 = 0i64;
      if( (v14 & 1) == 0 )
        p_Data1 = (UINT64 *)&v1[43].Data1;
      v3 = IopLiveDumpMarkRequiredDumpData((_LIVEDUMP_CONTEXT *)v1, p_Data1);
      if( v3 >= 0 )
      {
        if( (v1[5].Data1 & 1) != 0
          && (v17 = RtlNumberOfSetBitsEx((_RTL_BITMAP_EX *)&v1[34]),
              v18 = v1[5].Data1,
              *(_QWORD *)v1[6].Data4 = v17,
              (v18 & 0x200) != 0)
          && v17 > (*(_QWORD *)v1[65].Data4 >> 12) + (unsigned __int64)((*(_QWORD *)v1[65].Data4 & 0xFFFi64) != 0) )
        {
          v3 = -1073741670;
          v1[5].Data1 = v18 | 0x400;
        }
        else
        {
          v3 = IopLiveDumpMarkImportantDumpData((_RTL_BITMAP_EX *)v1, p_Data1);
          if( v3 >= 0 )
          {
            if( (v1[5].Data1 & 1) != 0 )
            {
              IopLiveDumpPopulateBitmapForDump((_LIVEDUMP_CONTEXT *)v1);
            }
            else
            {
              IoFillDumpHeader(
                *(VOID **)&v1[35].Data1,
                6ui64,
                v1->Data1,
                *(_QWORD *)v1->Data4,
                *(_QWORD *)&v1[1].Data1,
                *(_QWORD *)v1[1].Data4,
                *(_QWORD *)&v1[2].Data1,
                KeGetCurrentThread());
              if( *(_QWORD *)v1[43].Data4 || *(_QWORD *)&v1[44].Data1 )
              {
                if( (v1[5].Data1 & 0x80u) != 0 )
                {
                  LODWORD(v20) = IopLiveDumpGetMillisecondCounter(0);
                  v2 = v20;
                }
                HvlCollectLivedump(v19, *(_QWORD *)&v1[13].Data1, &v1[12].Data1, (__int64)&v1[9]);
                if( (v1[5].Data1 & 0x80u) != 0 )
                {
                  LODWORD(v21) = IopLiveDumpGetMillisecondCounter(0);
                  *(_QWORD *)&v1[33].Data1 = v21 - v2;
                  IopLiveDumpTraceCaptureHvlCollectLiveDumpDuration(v1);
                }
              }
              IopLiveDumpGenerateIptSecondaryData();
              IopLiveDumpPopulateBitmapForDump((_LIVEDUMP_CONTEXT *)v1);
              IopLiveDumpStartDumpDataBuffering((_LIVEDUMP_CORRAL_CONTEXT *)v1);
            }
            v3 = 0;
          }
        }
      }
      IopLiveDumpUncorralProcessors((_LIVEDUMP_CORRAL_CONTEXT *)&v1[19], 0);
      if( (v1[5].Data1 & 0x80u) != 0 )
      {
        LODWORD(v22) = IopLiveDumpGetMillisecondCounter(0);
        v23 = v22 - qword_140CF50C0;
        if( (v1[5].Data1 & 1) != 0 )
          *(_QWORD *)v1[27].Data4 = v23;
        else
          *(_QWORD *)v1[30].Data4 = v23;
      }
    }
    else
    {
      return -1073741595;
    }
  }
  else
  {
    IopLiveDumpTraceMirroringPhase0End((_LIVEDUMP_CONTEXT *)IopLiveDumpContext);
    *(_QWORD *)&v1[12].Data1 = 0i64;
    *(_QWORD *)v1[12].Data4 = 0i64;
    IopLiveDumpCorralProcessors((_LIVEDUMP_CORRAL_CONTEXT *)&v1[19]);
    v3 = 0;
    if( (v1[5].Data1 & 0x80u) != 0 )
    {
      LODWORD(v24) = IopLiveDumpGetMillisecondCounter(0);
      qword_140CF50C0 = v24;
    }
  }
  return v3;
}

Referenced by:

No references.