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