CmpGetKeyNodeForKcb
INT64 __fastcall CmpGetKeyNodeForKcb(INT64 a1, INT64 a2, CHAR a3){
_CM_KEY_NODE *v6;
_HHIVE *v7;
_CM_KEY_NODE *v8;
__int64 v10;
_EX_PUSH_LOCK *v11;
v6 = (_CM_KEY_NODE *)(*(__int64(__fastcall **)(_QWORD, _QWORD, INT64))(*(_QWORD *)(a1 + 32) + 8i64))(
*(_QWORD *)(a1 + 32),
*(unsigned int *)(a1 + 40),
a2);
v7 = *(_HHIVE **)(a1 + 32);
v8 = v6;
if( a3 )
{
CmpUpdateKeyNodeAccessBits(v7, v6, *(unsigned int *)(a1 + 40));
}
else if( CmpKeyNodeNeedsAccessBitUpdate((INT64)v7, (INT64)v6) )
{
(*(void(__fastcall **)(__int64, INT64))(v10 + 16))(v10, a2);
ExAcquirePushLockSharedEx((_EX_PUSH_LOCK *)(*(_QWORD *)(a1 + 32) + 72i64), 0i64);
v8 = (_CM_KEY_NODE *)(*(__int64(__fastcall **)(_QWORD, _QWORD, INT64))(*(_QWORD *)(a1 + 32) + 8i64))(
*(_QWORD *)(a1 + 32),
*(unsigned int *)(a1 + 40),
a2);
CmpUpdateKeyNodeAccessBits(*(_HHIVE **)(a1 + 32), v8, *(unsigned int *)(a1 + 40));
v11 = *(_EX_PUSH_LOCK **)(a1 + 32);
if( _InterlockedCompareExchange64(&v11[9]._bf_0, 0i64, 17i64) != 17 )
ExfReleasePushLockShared(v11 + 9);
KeAbPostRelease(&v11[9]);
}
return(INT64)v8;
}Referenced by:
CmEnumerateValueFromLayeredKey
CmQueryMultipleValueForLayeredKey
CmRenameKey
CmSetKeyFlags
CmSetLastWriteTimeKey
CmpAssignKeySecurity
CmpCommitDeleteKeyUoW
CmpDoParseKey
CmpEnumerateLayeredKey
CmpSetKeySecurity