IopLiveDumpGenerateIptSecondaryData

NTSTATUS __stdcall IopLiveDumpGenerateIptSecondaryData(){
  _GUID *v0; 
  __int64 v1; 
  unsigned int Data1; 
  __int64 v3; 
  VOID **v4; 
  __int64 v5; 
  size_t v6; 
  VOID *v7; 
  __int64 v8; 
  unsigned int v9; 
  unsigned int *v10; 
  unsigned int v11; 
  NTSTATUS result; 
  __int64 v13; 
  __int128 v14; 
  __int128 v15; 
  _GUID v16; 
  __int64 v17; 

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

Referenced by:

IopLiveDumpEndMirroringCallback