CmpDelayCloseWorker

VOID __stdcall CmpDelayCloseWorker(PVOID Parameter){
  bool v1; 
  unsigned int v2; 
  char *v3; 
  int v4; 
  unsigned int v5; 
  char *v6; 
  char *v7; 
  unsigned int v8; 
  char *v9; 
  _CM_KEY_CONTROL_BLOCK *v10; 
  _CM_KEY_CONTROL_BLOCK *v11; 
  __int64 v12; 
  __int64 v13; 
  _QWORD *v14; 
  __int64 v15; 
  __int64 v16; 
  bool v17; 
  INT64 RegLockHeldEx[2]; 
  _KAPC_STATE ApcState; 
  char v20; 
  char v21[12]; 
  char v22; 

  v1 = Parameter != 0i64;
  v17 = Parameter != 0i64;
  *(_OWORD *)RegLockHeldEx = 0i64;
  memset(&ApcState, 0, sizeof(ApcState));
  CmpAttachToRegistryProcess(&ApcState);
  CmpInitializeDelayDerefContext(RegLockHeldEx);
  CmpLockRegistry();
  do
  {
    if( !v1 )
      _InterlockedExchange((_DWORD *)&WheapErrorSourceTable + 202, 2);
    do
    {
      v2 = 0;
      ExAcquireFastMutex((PFAST_MUTEX)((char *)&CmpDummyThreadEvent + 640));
      v3 = v21;
      do
      {
        v4 = CmpDelayedCloseElements;
        if( CmpDelayedCloseElements <= (unsigned int)CmpDelayedCloseSize && (!v1 || !CmpDelayedCloseElements) )
          break;
        v13 = *(&CmpDummyThreadEvent + 89) - 224i64;
        if( (_UNKNOWN *)**(&CmpDummyThreadEvent + 89) == (_UNKNOWN *)((char *)&CmpDummyThreadEvent + 704) )
        {
          v14 = *(_QWORD **)(*(&CmpDummyThreadEvent + 89) + 8i64);
          if( *v14 == *(&CmpDummyThreadEvent + 89) )
            continue;
        }
        __fastfail(3u);
        *(&CmpDummyThreadEvent + 89) = *(_QWORD *)(*(&CmpDummyThreadEvent + 89) + 8i64);
        *v14 = (char *)&CmpDummyThreadEvent + 704;
        --qword_140D2DF88;
        CmpDelayedCloseElements = v4 - 1;
        *((_QWORD *)v3 - 1) = *(_QWORD *)(v13 + 32);
        *(_QWORD *)v3 = v13;
        v15 = v2++;
        v21[24 * v15 + 8] = 0;
        *((_DWORD *)v3 + 3) = *(_DWORD *)(v13 + 16);
        v3 += 24;
        *(_BYTE *)(v13 + 64) |= 4u;
        *(_QWORD *)(v13 + 224) = &v21[24 * v15 + 8];
      }
      while( v2 < 4 );
      KeReleaseGuardedMutex((PKGUARDED_MUTEX)((char *)&CmpDummyThreadEvent + 640));
      v5 = 0;
      if( v2 )
      {
        v6 = &v20;
        v7 = &v22;
        do
        {
          CmpLockHashEntryExclusive(*(_QWORD *)v6, *(unsigned int *)v7);
          v8 = v5;
          if( v5 < v2 )
          {
            v9 = v7 - 12;
            do
            {
              if( *((_DWORD *)v9 + 3) == *((_DWORD *)v6 + 5) && *((_QWORD *)v9 - 1) == *(_QWORD *)v6 && !v9[8] )
              {
                CmpLockKcbExclusive(*(_QWORD *)v9);
                v10 = 0i64;
                v11 = *(_CM_KEY_CONTROL_BLOCK **)v9;
                v12 = *(_QWORD *)(*(_QWORD *)v9 + 192i64);
                if( v12 )
                {
                  v16 = *(_QWORD *)(v12 + 24);
                  if( v16 )
                  {
                    v10 = *(_CM_KEY_CONTROL_BLOCK **)(v16 + 16);
                    CmpUnlockKcb(*(_CM_KEY_CONTROL_BLOCK **)v9);
                    CmpLockKcbExclusive((INT64)v10);
                    CmpLockKcbExclusive(*(_QWORD *)v9);
                    v11 = *(_CM_KEY_CONTROL_BLOCK **)v9;
                  }
                }
                CmpCleanUpKcbCacheWithLock(v11, (INT64)RegLockHeldEx);
                CmpUnlockKcb(*(_CM_KEY_CONTROL_BLOCK **)v9);
                if( v10 )
                  CmpUnlockKcb(v10);
                v21[24 * v8 + 8] = 1;
              }
              ++v8;
              v9 += 24;
            }
            while( v8 < v2 );
          }
          CmpUnlockHashEntry(*(_QWORD *)v6, *(unsigned int *)v7);
          ++v5;
          v7 += 24;
          v6 += 24;
        }
        while( v5 < v2 );
        v1 = v17;
      }
    }
    while( v2 == 4 );
  }
  while( !v1 && _InterlockedCompareExchange((_DWORD *)&WheapErrorSourceTable + 202, 0, 2) != 2 );
  CmpDrainDelayDerefContext((UINT64 **)RegLockHeldEx);
  CmpUnlockRegistry();
  KiUnstackDetachProcess(&ApcState, 0i64);
}

Referenced by:

No references.