CmpRmAnalysisPhase

__int64 __fastcall CmpRmAnalysisPhase(__int64 a1, _CLS_LSN a2){
  LIST_ENTRY *v2; 
  LIST_ENTRY *v4; 
  _LIST_ENTRY *Flink; 
  _LIST_ENTRY *Blink; 
  NTSTATUS v7; 
  int v8; 
  _CLS_LSN v9; 
  _DWORD *v10; 
  _CLS_LSN v11; 
  int v12; 
  __int64 v13; 
  _QWORD *v14; 
  _CLS_LSN plsnUser; 
  PVOID pvReadContext; 
  _CLS_LSN plsnPrevious; 
  _CLS_LSN plsnUndoNext; 
  _CLS_LSN plsnRecord; 
  LIST_ENTRY *ListIterator; 
  unsigned __int8 peRecordType; 
  _CLS_LSN plsnFirst; 
  unsigned int pcbBuffer; 
  PVOID ppvReadBuffer; 

  plsnFirst = a2;
  pvReadContext = 0i64;
  v2 = (LIST_ENTRY *)(a1 + 16);
  ppvReadBuffer = 0i64;
  v4 = *(LIST_ENTRY **)(a1 + 16);
  pcbBuffer = 0;
  plsnUndoNext.ullOffset = 0i64;
  plsnPrevious.ullOffset = 0i64;
  plsnRecord.ullOffset = 0i64;
  plsnUser.ullOffset = 0i64;
  peRecordType = 0;
  if( v4 == v2 )
  {
    Flink = 0i64;
    Blink = 0i64;
  }
  else
  {
    v4->Blink = *(_LIST_ENTRY **)(a1 + 24);
    **(_QWORD **)(a1 + 24) = v2->Flink;
    Flink = v2->Flink;
    Blink = v2->Flink->Blink;
    v2->Blink = v2;
    v2->Flink = v2;
  }
  v7 = ClfsReadLogRecord(
         *(PVOID *)(a1 + 96),
         &plsnFirst,
         ClfsContextForward,
         &ppvReadBuffer,
         &pcbBuffer,
         &peRecordType,
         &plsnUndoNext,
         &plsnPrevious,
         &pvReadContext);
  v8 = v7;
  while( v7 >= 0 )
  {
    if( (peRecordType & 1) != 0 && pcbBuffer >= 0x30 )
    {
      v8 = CmpTransSearchAddTransFromRm((_CM_RM *)a1, 0i64, (_GUID *)ppvReadBuffer + 1, 1ui64, (_CM_TRANS **)&plsnUser);
      if( v8 < 0 )
        break;
      v9 = plsnUser;
      if( !plsnUser.ullOffset )
      {
        v8 = -1072103422;
        break;
      }
      v10 = ppvReadBuffer;
      if( *((_DWORD *)ppvReadBuffer + 2) == 16 )
      {
        *(_DWORD *)(plsnUser.ullOffset + 48) |= 4u;
        v10 = ppvReadBuffer;
        v9 = plsnUser;
      }
      if( v10[2] == 8 )
      {
        *(_DWORD *)(v9.ullOffset + 48) |= 2u;
        v10 = ppvReadBuffer;
        v9 = plsnUser;
      }
      if( v10[2] == 4 )
        *(_DWORD *)(v9.ullOffset + 48) |= 1u;
    }
    peRecordType = 1;
    v7 = ClfsReadNextLogRecord(
           pvReadContext,
           &ppvReadBuffer,
           &pcbBuffer,
           &peRecordType,
           0i64,
           &plsnUndoNext,
           &plsnPrevious,
           &plsnRecord);
    v8 = v7;
    if( v7 == -1073741807 )
    {
      v8 = 0;
LABEL_18:
      ListIterator = 0i64;
      while( 1 )
      {
        v11.offset.idxRecord = CmListGetNextElement(v2, &ListIterator, 0i64);
        plsnUser = v11;
        if( !v11.ullOffset )
          goto LABEL_27;
        v12 = *(_DWORD *)(v11.ullOffset + 48);
        if( (v12 & 1) == 0 || (v12 & 2) != 0 || (v12 & 4) != 0 )
        {
          v13 = *(_QWORD *)v11.ullOffset;
          if( *(_QWORD *)(*(_QWORD *)v11.ullOffset + 8i64) != v11.ullOffset
            || (v14 = *(_QWORD **)(v11.ullOffset + 8), *v14 != v11.ullOffset) )
          {
            __fastfail(3u);
          }
          *v14 = v13;
          *(_QWORD *)(v13 + 8) = v14;
          ExFreePoolWithTag((PVOID)plsnUser.ullOffset, 0x72544D43u);
          goto LABEL_18;
        }
      }
    }
  }
LABEL_27:
  if( pvReadContext )
    ClfsTerminateReadLog(pvReadContext);
  if( Flink )
  {
    Blink->Flink = v2;
    Flink->Blink = *(_LIST_ENTRY **)(a1 + 24);
    **(_QWORD **)(a1 + 24) = Flink;
    *(_QWORD *)(a1 + 24) = Blink;
  }
  return(unsigned int)v8;
}

Referenced by:

CmpStartRMLog