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.