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