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.