CmpLazyCommitWorker
VOID __stdcall CmpLazyCommitWorker(PVOID Parameter){
char v1;
_ETHREAD *CurrentThread;
UINT8 v3;
_ETHREAD *v4;
_ETHREAD *v5;
__int64 v6;
__int64 v7;
_QWORD *v8;
_ETHREAD *v9;
__int64 *v10;
__int64 *v11;
__int64 **v12;
__int64 **v13;
__int64 **v14;
UINT64 UowCount;
LODWORD(UowCount) = 0;
v14 = (__int64 **)&v13;
v1 = 1;
v13 = (__int64 **)&v13;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
v3 = ExAcquireRundownProtection((_EX_RUNDOWN_REF *)&CmpDummyThreadEvent + 132);
v4 = (_ETHREAD *)KeGetCurrentThread();
if( v3 )
{
--v4->Tcb.KernelApcDisable;
ExAcquirePushLockSharedEx((_EX_PUSH_LOCK *)&CmpDummyThreadEvent + 339, 0i64);
LOCK_HIVE_LOAD();
while( 1 )
{
v5 = (_ETHREAD *)KeGetCurrentThread();
--v5->Tcb.KernelApcDisable;
ExAcquireFastMutexUnsafe((PFAST_MUTEX)((char *)&CmpDummyThreadEvent + 64));
v6 = *(&CmpDummyThreadEvent + 32);
if( *(_UNKNOWN **)(*(&CmpDummyThreadEvent + 32) + 8i64) != (_UNKNOWN *)((char *)&CmpDummyThreadEvent + 256)
|| (v7 = **(&CmpDummyThreadEvent + 32),
*(_QWORD *)(**(&CmpDummyThreadEvent + 32) + 8i64) != *(&CmpDummyThreadEvent + 32)) )
{
LABEL_20:
__fastfail(3u);
}
*(&CmpDummyThreadEvent + 32) = **(&CmpDummyThreadEvent + 32);
*(_QWORD *)(v7 + 8) = (char *)&CmpDummyThreadEvent + 256;
if( (_UNKNOWN *)v6 == (_UNKNOWN *)((char *)&CmpDummyThreadEvent + 256) )
break;
ExReleaseFastMutexUnsafe((PFAST_MUTEX)((char *)&CmpDummyThreadEvent + 64));
KeLeaveCriticalRegionThread(KeGetCurrentThread());
if( CmpTransMgrCommit(*(_CM_RM **)(v6 + 32), (_CM_TRANS *)(v6 - 32), &UowCount) < 0 )
{
v8 = v14;
if( *v14 != (__int64 *)&v13 )
goto LABEL_20;
*(_QWORD *)(v6 + 8) = v14;
*(_QWORD *)v6 = &v13;
v1 = 0;
*v8 = v6;
v14 = (__int64 **)v6;
}
else
{
CmpCleanupTransactionState(*(_QWORD *)(v6 + 32), v6 - 32, 4i64);
}
}
*(_BYTE *)CmpLazyCommitWorkItemActive = v1 == 0;
ExReleaseFastMutexUnsafe((PFAST_MUTEX)((char *)&CmpDummyThreadEvent + 64));
KeLeaveCriticalRegionThread(KeGetCurrentThread());
if( !v1 )
{
v9 = (_ETHREAD *)KeGetCurrentThread();
--v9->Tcb.KernelApcDisable;
ExAcquireFastMutexUnsafe((PFAST_MUTEX)((char *)&CmpDummyThreadEvent + 64));
while( 1 )
{
v10 = (__int64 *)v13;
if( v13[1] != (__int64 *)&v13 )
goto LABEL_20;
v11 = *v13;
if( (__int64 **)(*v13)[1] != v13 )
goto LABEL_20;
v13 = (__int64 **)*v13;
v11[1] = (__int64)&v13;
if( v10 == (__int64 *)&v13 )
break;
v12 = (__int64 **)*(&CmpDummyThreadEvent + 33);
if( (_UNKNOWN *)**(&CmpDummyThreadEvent + 33) != (_UNKNOWN *)((char *)&CmpDummyThreadEvent + 256) )
goto LABEL_20;
*v10 = (__int64)&CmpDummyThreadEvent + 256;
v10[1] = (__int64)v12;
*v12 = v10;
*(&CmpDummyThreadEvent + 33) = v10;
}
ExReleaseFastMutexUnsafe((PFAST_MUTEX)((char *)&CmpDummyThreadEvent + 64));
KeLeaveCriticalRegionThread(KeGetCurrentThread());
KiSetTimerEx(
(_KTIMER *)&CmpDummyThreadEvent + 3,
(_LARGE_INTEGER)-300000000i64,
0i64,
0,
(_KDPC *)((char *)&CmpDummyThreadEvent + 288));
}
UNLOCK_HIVE_LOAD();
ExReleasePushLockEx((ULONG_PTR)&CmpDummyThreadEvent + 2712, 0);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
ExReleaseRundownProtection((_EX_RUNDOWN_REF *)&CmpDummyThreadEvent + 132);
v4 = (_ETHREAD *)KeGetCurrentThread();
}
KeLeaveCriticalRegionThread(&v4->Tcb);
}Referenced by:
No references.