CmEnumerateValueKey
__int64 __fastcall CmEnumerateValueKey(__int64 a1, unsigned int a2, int a3, _DWORD *a4, int a5, __int64 a6){
unsigned int *ResultLength;
_EPROCESS *Process;
__int64 v10;
_ETHREAD *CurrentThread;
_CM_KEY_CONTROL_BLOCK *v13;
__int64 v14;
__int64 v15;
unsigned int v16;
_CM_KEY_VALUE *v17;
int KeyValueData;
bool v19;
CM_TRANS *v21;
__int64 v22;
__int64 v23;
unsigned int *v24;
CM_TRANS *CmTrans;
_KAPC_STATE ApcState;
ResultLength = (unsigned int *)a6;
Process = (_EPROCESS *)*(&CmpDummyThreadEvent + 5);
v10 = a2;
v24 = (unsigned int *)a6;
CmTrans = 0i64;
v23 = 0xFFFFFFFFi64;
v22 = 0xFFFFFFFFi64;
memset(&ApcState, 0, sizeof(ApcState));
if( !*(&CmpDummyThreadEvent + 5) )
Process = KeGetCurrentThread()->ApcState.Process;
KiStackAttachProcess(Process, 0i64, &ApcState);
if( !BYTE6(NlsMbCodePageTag) )
{
PsBoostThreadIo((_ETHREAD *)KeGetCurrentThread(), 0);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
ExAcquireResourceSharedLite((UINT64)&CmpRegistryLock, 1);
}
v13 = *(_CM_KEY_CONTROL_BLOCK **)(a1 + 8);
if( v13->LayerHeight )
{
KeyValueData = CmEnumerateValueFromLayeredKey(a1, v10, a3, (__int64)a4, a5, a6);
goto LABEL_18;
}
ExAcquirePushLockSharedEx(&v13->KcbPushlock, 0i64);
_InterlockedIncrement((volatile signed __int32 *)&v13->56);
if( CmpIsKeyDeletedForKeyBody((CM_KEY_BODY *)a1, 0i64) )
{
if( (*(_DWORD *)(a1 + 48) & 1) != 0 )
KeyValueData = -1073740763;
else
KeyValueData = -1073741444;
}
else
{
if( !*(_QWORD *)(a1 + 56) && !*(_QWORD *)(a1 + 64) )
goto LABEL_9;
KeyValueData = CmpTransSearchAddTransFromKeyBody((_CM_KEY_BODY *)a1, &CmTrans);
if( KeyValueData >= 0 )
{
v21 = CmTrans;
KeyValueData = CmpPerformKeyBodyDeletionCheck((CM_KEY_BODY *)a1, CmTrans);
if( KeyValueData >= 0 )
{
ResultLength = v24;
if( v21 )
{
v14 = 280i64;
if( v21 == v13->TransValueListOwner )
{
LABEL_10:
if( (unsigned int)v10 >= *(_DWORD *)((char *)&v13->RefCount + v14) )
{
KeyValueData = -2147483622;
}
else
{
v15 = (__int64)v13->KeyHash.KeyHive->GetCellRoutine(
v13->KeyHash.KeyHive,
*(_DWORD *)((char *)&v13->RefCount + v14 + 4),
(_HV_GET_CELL_CONTEXT *)&v23);
v16 = *(_DWORD *)(v15 + 4 * v10);
v17 = (_CM_KEY_VALUE *)v13->KeyHash.KeyHive->GetCellRoutine(
v13->KeyHash.KeyHive,
v16,
(_HV_GET_CELL_CONTEXT *)&v22);
KeyValueData = CmpQueryKeyValueData(v13, v16, v17, (_KEY_VALUE_INFORMATION_CLASS)a3, a4, a5, ResultLength);
if( v17 )
v13->KeyHash.KeyHive->ReleaseCellRoutine(v13->KeyHash.KeyHive, (_HV_GET_CELL_CONTEXT *)&v22);
if( v15 )
v13->KeyHash.KeyHive->ReleaseCellRoutine(v13->KeyHash.KeyHive, (_HV_GET_CELL_CONTEXT *)&v23);
}
goto LABEL_15;
}
}
LABEL_9:
v14 = 96i64;
goto LABEL_10;
}
}
}
LABEL_15:
v19 = (v13->_bf_8 & 0x80000) != 0;
if( (struct _KTHREAD *)v13->Owner == KeGetCurrentThread() )
v13->Owner = 0i64;
else
_InterlockedDecrement((volatile signed __int32 *)&v13->56);
ExReleasePushLockEx((_DWORD)v13 + 48, 0);
if( v19 && (v13->_bf_8 & 0x80000) != 0 )
CmpFreeKeyControlBlock((UINT64)v13);
LABEL_18:
if( !BYTE6(NlsMbCodePageTag) )
{
ExReleaseResourceLite(&CmpRegistryLock);
KeLeaveCriticalRegion();
PsBoostThreadIo((_ETHREAD *)KeGetCurrentThread(), 1u);
}
KiUnstackDetachProcess(&ApcState, 0i64);
return(unsigned int)KeyValueData;
}Referenced by:
NtEnumerateValueKey