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