CmpRmUnDoPhase
int __fastcall CmpRmUnDoPhase(__int64 a1){
_CM_TRANS *v2;
__int64 v3;
_CM_TRANS *v4;
UINT64 v5;
_LIST_ENTRY *Flink;
_LIST_ENTRY *Blink;
int v9;
char ReadOnlyTransaction[4];
char UowCount[12];
LIST_ENTRY *ListIterator;
_OBJECT_ATTRIBUTES ObjectAttributes;
_KAPC_STATE ApcState;
memset(UowCount, 0, sizeof(UowCount));
memset(&ObjectAttributes, 0, sizeof(ObjectAttributes));
ReadOnlyTransaction[0] = 0;
memset(&ApcState, 0, sizeof(ApcState));
LABEL_2:
ListIterator = 0i64;
while( 1 )
{
LODWORD(v2) = CmListGetNextElement((LIST_ENTRY *)(a1 + 16), &ListIterator, 0i64);
v4 = v2;
if( !v2 )
return(int)v2;
if( (v2->TransState & 2) != 0 )
{
CmpTransMgrRollback(v2, (UINT64 *)UowCount);
CmpAttachToRegistryProcess(&ApcState);
v5 = 8i64;
LABEL_12:
CmpTransMgrFreeVolatileData(v4, v5);
KiUnstackDetachProcess(&ApcState, 0i64);
Flink = v4->TransactionListEntry.Flink;
if( (_CM_TRANS *)v4->TransactionListEntry.Flink->Blink != v4
|| (Blink = v4->TransactionListEntry.Blink, (_CM_TRANS *)Blink->Flink != v4) )
{
__fastfail(3u);
}
Blink->Flink = Flink;
Flink->Blink = Blink;
ExFreePoolWithTag(v4, 0x72544D43u);
goto LABEL_2;
}
ObjectAttributes.RootDirectory = (void *)((__int64)ObjectAttributes.RootDirectory & v3);
ObjectAttributes.ObjectName = (_UNICODE_STRING *)((__int64)ObjectAttributes.ObjectName & v3);
ObjectAttributes.Length = 48;
ObjectAttributes.Attributes = 512;
*(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64;
if( ZwOpenTransaction((PHANDLE)&UowCount[4], 2031679, &ObjectAttributes, (_DWORD)v2 + 88, v3 & v9) < 0 )
{
if( CmpTransMgrPrepare((_CM_RM *)a1, v4, (UINT64 *)UowCount, (UINT8 *)ReadOnlyTransaction) < 0
|| CmpTransMgrCommit((_CM_RM *)a1, v4, (UINT64 *)UowCount) < 0 )
{
v4->TransState |= 2u;
goto LABEL_2;
}
CmpAttachToRegistryProcess(&ApcState);
v5 = 4i64;
goto LABEL_12;
}
ZwClose(*(_HANDLE *)&UowCount[4]);
}
}Referenced by:
CmpStartRMLog