FsRtlSplitBaseMcb

INT8 __fastcall FsRtlSplitBaseMcb(INT64 a1, UINT64 a2, INT64 a3){
  int v3; 
  int v4; 
  int v5; 
  char v7; 
  __int64 v8; 
  __int64 v9; 
  int v10; 
  __int64 v11; 
  int v12; 
  int v13; 
  int v14; 
  char v15; 
  char v16; 
  __int64 v18; 
  __int64 v19; 
  int v20; 
  __int64 v21; 
  _BYTE *WhereToAddIndex; 

  v3 = a3;
  v4 = 0;
  LODWORD(WhereToAddIndex) = 0;
  v5 = a2;
  FsRtlFindLargeIndex((_BASE_MCB *)a1, a2, (UINT64 *)&WhereToAddIndex);
  if( v7 )
  {
    v8 = (unsigned int)WhereToAddIndex;
    v9 = *(_QWORD *)(a1 + 16);
    if( *(_DWORD *)(v9 + 8i64 * (unsigned int)WhereToAddIndex + 4) == -1 )
    {
LABEL_29:
      while( (unsigned int)v8 < *(_DWORD *)(a1 + 4) )
      {
        *(_DWORD *)(*(_QWORD *)(a1 + 16) + 8i64 * (unsigned int)v8) += v3;
LABEL_28:
        LODWORD(v8) = v8 + 1;
      }
      LOBYTE(v4) = 1;
      return v4;
    }
    if( (_DWORD)WhereToAddIndex )
      v10 = *(_DWORD *)(v9 + 8i64 * (unsigned int)((_DWORD)WhereToAddIndex - 1));
    else
      v10 = 0;
    if( v10 == v5 )
    {
      if( !(_DWORD)WhereToAddIndex )
        goto LABEL_15;
      v11 = (unsigned int)((_DWORD)WhereToAddIndex - 1);
      v12 = *(_DWORD *)(v9 + 8 * v11 + 4);
      if( v12 == -1
        || ((_DWORD)WhereToAddIndex != 1 ? (v13 = *(_DWORD *)(v9 + 8i64 * (unsigned int)((_DWORD)WhereToAddIndex - 2))) : (v13 = 0),
            !(v12 + *(_DWORD *)(v9 + 8 * v11) - v13)) )
      {
        LODWORD(v8) = (_DWORD)WhereToAddIndex - 1;
        goto LABEL_29;
      }
    }
    if( (_DWORD)WhereToAddIndex )
    {
      v14 = *(_DWORD *)(v9 + 8i64 * (unsigned int)((_DWORD)WhereToAddIndex - 1));
LABEL_17:
      if( v14 == v5 )
      {
        FsRtlAddEntry((_BASE_MCB *)a1, (_BYTE *)(unsigned int)WhereToAddIndex, 1ui64);
        if( v15 )
        {
          *(_DWORD *)(*(_QWORD *)(a1 + 16) + 8 * v8 + 4) = -1;
          *(_DWORD *)(*(_QWORD *)(a1 + 16) + 8 * v8) = v3 + v5;
          goto LABEL_28;
        }
      }
      else
      {
        FsRtlAddEntry((_BASE_MCB *)a1, (_BYTE *)(unsigned int)WhereToAddIndex, 2ui64);
        if( v16 )
        {
          v18 = (unsigned int)(v8 + 1);
          v19 = (unsigned int)(v8 + 2);
          v20 = 0;
          *(_DWORD *)(*(_QWORD *)(a1 + 16) + 8 * v8 + 4) = *(_DWORD *)(*(_QWORD *)(a1 + 16) + 8 * v19 + 4);
          *(_DWORD *)(*(_QWORD *)(a1 + 16) + 8 * v8) = v5;
          *(_DWORD *)(*(_QWORD *)(a1 + 16) + 8 * v18 + 4) = -1;
          *(_DWORD *)(*(_QWORD *)(a1 + 16) + 8 * v18) = v3 + v5;
          v21 = *(_QWORD *)(a1 + 16);
          if( (_DWORD)v8 != -1 )
            v20 = *(_DWORD *)(v21 + 8 * v8);
          if( (_DWORD)v8 )
            v4 = *(_DWORD *)(v21 + 8i64 * (unsigned int)(v8 - 1));
          LODWORD(v8) = v8 + 2;
          *(_DWORD *)(v21 + 8 * v19 + 4) += v20 - v4;
          goto LABEL_29;
        }
      }
      return 0;
    }
LABEL_15:
    v14 = 0;
    goto LABEL_17;
  }
  return v4;
}

Referenced by:

FsRtlSplitLargeMcb