IopLiveDumpGenerateIptSecondaryData

NTSTATUS __stdcall IopLiveDumpGenerateIptSecondaryData(){
  GUID *v0; 
  INT64 MillisecondCounter; 
  unsigned int Data1; 
  UINT8 **v3; 
  __int64 v4; 
  unsigned int v5; 
  UINT8 *v6; 
  __int64 v7; 
  unsigned int v8; 
  UINT8 *v9; 
  unsigned int v10; 
  NTSTATUS result; 
  INT64 v12; 
  __int128 v13; 
  __int128 v14; 
  GUID v15; 
  __int64 v16; 
  v0 = IopLiveDumpContext;
  v16 = 0i64;
  MillisecondCounter = 0i64;
  v13 = 0i64;
  Data1 = IopLiveDumpContext[5].Data1;
  v14 = 0i64;
  v15 = 0i64;
  if( (Data1 & 0x80u) != 0 )
    MillisecondCounter = IopLiveDumpGetMillisecondCounter(0);
  v3 = (UINT8 **)&v0[59];
  v4 = *(_QWORD *)&v0[59].Data1;
  if( v4 )
  {
    *(_DWORD *)v0[61].Data4 = 0;
    *(_QWORD *)&v0[61].Data1 = v4;
    (*(void(__fastcall **)(__int64, _QWORD, GUID *, __int64))(IptInterface + 40))(2i64, 0i64, v0 + 59, 48i64);
    v5 = *(_DWORD *)v0[61].Data4;
    if( v5 && *(_DWORD *)v0[59].Data4 >= v5 )
    {
      v6 = *(UINT8 **)&v0[61].Data1;
      if( *v3 != v6 )
      {
        memmove(*v3, v6, v5);
        *(_QWORD *)&v0[61].Data1 = *v3;
        v5 = *(_DWORD *)v0[61].Data4;
      }
    }
    else
    {
      *(_QWORD *)&v0[61].Data1 = 0i64;
      *(_DWORD *)v0[61].Data4 = 0;
      v5 = 0;
    }
    if( v5 )
    {
      if( *(_QWORD *)&v0[56].Data1 )
      {
        LODWORD(v14) = v0->Data1;
        *((_QWORD *)&v14 + 1) = *(_QWORD *)v0->Data4;
        v15 = v0[1];
        v16 = *(_QWORD *)&v0[2].Data1;
        HIDWORD(v13) = 0x2000000;
        (*(void(__fastcall **)(__int64, _QWORD, __int128 *, __int64))(IptInterface + 32))(7i64, 0i64, &v13, 56i64);
        v7 = v13;
        if( (_QWORD)v13 )
        {
          v8 = 16 * *(_DWORD *)(v13 + 16) + 12;
          if( v8 <= *(_DWORD *)v0[56].Data4 )
          {
            v9 = *(UINT8 **)&v0[56].Data1;
            *(_DWORD *)v0[58].Data4 = v8;
            *(_QWORD *)&v0[58].Data1 = v9;
            v0[57] = GUID_TRIAGEDUMP_DATA;
            v10 = *(_DWORD *)(v7 + 16);
            *(_DWORD *)v9 = v10;
            *((_DWORD *)v9 + 1) = 4;
            memmove(v9 + 8, (UINT8 *)(v13 + 48), 16i64 * v10);
            *(_DWORD *)&v9[16 * *(unsigned int *)v9 + 8] = 5525577;
          }
        }
      }
    }
  }
  result = v0[5].Data1;
  if( (result & 0x80u) != 0 )
  {
    v12 = IopLiveDumpGetMillisecondCounter(0);
    LOBYTE(result) = IopLiveDumpTraceCaptureGenerateIptSecondaryDataDuration(v0, v12 - MillisecondCounter);
  }
  return result;
}

Referenced by:

IopLiveDumpEndMirroringCallback