IopFillTriageDumpDataBlocks

int __fastcall IopFillTriageDumpDataBlocks(unsigned int *a1, int a2, __int64 a3, __int64 a4){
  __int64 v4; 
  __int64 v5; 
  __int64 v7; 
  __int64 v8; 
  char *v9; 
  unsigned int i; 
  __int64 v11; 
  ULONGLONG *v12; 
  unsigned int v13; 
  __int64 v14; 
  unsigned __int64 v15; 
  int v16; 
  char *v17; 
  size_t v18; 
  ULONGLONG pullResult; 
  char *v21; 
  __int64 v22; 
  ULONGLONG *v23; 
  __int64 v24; 
  __int64 v25; 
  __int64 v27; 

  v27 = a3;
  v4 = a4;
  LODWORD(v5) = a2;
  pullResult = 0i64;
  v7 = a4 + a1[30];
  v24 = v7;
  v8 = v7;
  v22 = v7;
  v9 = (char *)(v7 + 16i64 * a1[31]);
  v21 = v9;
  for( i = 0; i < (unsigned int)v5; ++i )
  {
    v11 = i;
    v25 = i;
    v12 = *(ULONGLONG **)(a3 + 16i64 * i + 8);
    v13 = 0;
    while( 1 )
    {
      v23 = v12;
      if( v13 >= *(_DWORD *)(a3 + 16 * v11) )
        break;
      v5 = (v8 - v7) >> 4;
      if( (unsigned int)v5 >= a1[31] )
        return v5;
      LODWORD(v5) = v8 + 16;
      if( v8 + 16 > v4 + (unsigned __int64)a1[1] )
        return v5;
      LODWORD(v5) = RtlULongLongSub(v12[1], *v12, &pullResult);
      if( (int)v5 < 0 )
        return v5;
      v17 = &v9[(unsigned int)pullResult];
      if( v17 < v9 || (unsigned __int64)v17 > v15 )
        return v5;
      *(_QWORD *)v8 = v14;
      *(_DWORD *)(v8 + 8) = (_DWORD)v9 - v16;
      v18 = *((_DWORD *)v12 + 2) - *(_DWORD *)v12;
      *(_DWORD *)(v8 + 12) = v18;
      memmove(v9, (const VOID *)*v12, v18);
      v9 += *(unsigned int *)(v8 + 12);
      v21 = v9;
      v8 += 16i64;
      v22 = v8;
      ++v13;
      v12 += 2;
      v11 = v25;
      v4 = a4;
      a3 = v27;
    }
    LODWORD(v5) = a2;
  }
  return v5;
}

Referenced by:

IoFillTriageDumpBuffer