CmpRmAnalysisPhase

__int64 __fastcall CmpRmAnalysisPhase(_CM_RM *CmRm, __int64 a2){
  _LIST_ENTRY *p_TransactionListHead; 
  _LIST_ENTRY *Flink; 
  _LIST_ENTRY *v5; 
  _LIST_ENTRY *Blink; 
  NTSTATUS v7; 
  NTSTATUS v8; 
  _DWORD *v9; 
  _DWORD *v10; 
  __int64 *v11; 
  int v12; 
  __int64 *v13; 
  __int64 **v14; 
  PVOID P; 
  PVOID pvReadContext; 
  __int64 plsnPrevious; 
  __int64 plsnUndoNext; 
  __int64 v20; 
  LIST_ENTRY *ListIterator; 
  CLS_RECORD_TYPE peRecordType; 
  __int64 v23; 
  ULONG pcbBuffer; 
  PVOID ppvReadBuffer; 
  v23 = a2;
  pvReadContext = 0i64;
  p_TransactionListHead = &CmRm->TransactionListHead;
  ppvReadBuffer = 0i64;
  Flink = CmRm->TransactionListHead.Flink;
  pcbBuffer = 0;
  plsnUndoNext = 0i64;
  plsnPrevious = 0i64;
  v20 = 0i64;
  P = 0i64;
  peRecordType = 0;
  if( Flink == p_TransactionListHead )
  {
    v5 = 0i64;
    Blink = 0i64;
  }
  else
  {
    Flink->Blink = CmRm->TransactionListHead.Blink;
    CmRm->TransactionListHead.Blink->Flink = p_TransactionListHead->Flink;
    v5 = p_TransactionListHead->Flink;
    Blink = p_TransactionListHead->Flink->Blink;
    p_TransactionListHead->Blink = p_TransactionListHead;
    p_TransactionListHead->Flink = p_TransactionListHead;
  }
  v7 = ClfsReadLogRecord(
         CmRm->MarshallingContext,
         (PCLFS_LSN)&v23,
         ClfsContextForward,
         &ppvReadBuffer,
         &pcbBuffer,
         &peRecordType,
         (PCLFS_LSN)&plsnUndoNext,
         (PCLFS_LSN)&plsnPrevious,
         &pvReadContext);
  v8 = v7;
  while( v7 >= 0 )
  {
    if( (peRecordType & 1) != 0 && pcbBuffer >= 0x30 )
    {
      v8 = CmpTransSearchAddTransFromRm(CmRm, 0i64, (_GUID *)ppvReadBuffer + 1, 1ui64, (_CM_TRANS **)&P);
      if( v8 < 0 )
        break;
      v9 = P;
      if( !P )
      {
        v8 = -1072103422;
        break;
      }
      v10 = ppvReadBuffer;
      if( *((_DWORD *)ppvReadBuffer + 2) == 16 )
      {
        *((_DWORD *)P + 12) |= 4u;
        v10 = ppvReadBuffer;
        v9 = P;
      }
      if( v10[2] == 8 )
      {
        v9[12] |= 2u;
        v10 = ppvReadBuffer;
        v9 = P;
      }
      if( v10[2] == 4 )
        v9[12] |= 1u;
    }
    peRecordType = 1;
    v7 = ClfsReadNextLogRecord(
           pvReadContext,
           &ppvReadBuffer,
           &pcbBuffer,
           &peRecordType,
           0i64,
           (PCLFS_LSN)&plsnUndoNext,
           (PCLFS_LSN)&plsnPrevious,
           (PCLFS_LSN)&v20);
    v8 = v7;
    if( v7 == -1073741807 )
    {
      v8 = 0;
LABEL_18:
      ListIterator = 0i64;
      while( 1 )
      {
        LODWORD(v11) = CmListGetNextElement(p_TransactionListHead, &ListIterator, 0i64);
        P = v11;
        if( !v11 )
          goto LABEL_27;
        v12 = *((_DWORD *)v11 + 12);
        if( (v12 & 1) == 0 || (v12 & 2) != 0 || (v12 & 4) != 0 )
        {
          v13 = (__int64 *)*v11;
          if( *(__int64 **)(*v11 + 8) != v11 || (v14 = (__int64 **)v11[1], *v14 != v11) )
            __fastfail(3u);
          *v14 = v13;
          v13[1] = (__int64)v14;
          ExFreePoolWithTag(P, 0x72544D43u);
          goto LABEL_18;
        }
      }
    }
  }
LABEL_27:
  if( pvReadContext )
    ClfsTerminateReadLog(pvReadContext);
  if( v5 )
  {
    Blink->Flink = p_TransactionListHead;
    v5->Blink = CmRm->TransactionListHead.Blink;
    CmRm->TransactionListHead.Blink->Flink = v5;
    CmRm->TransactionListHead.Blink = Blink;
  }
  return(unsigned int)v8;
}

Referenced by:

CmpStartRMLog