CmpUnlockKcbStack

VOID __fastcall CmpUnlockKcbStack(INT64 a1){
  __int16 i; 
  UINT64 v3; 
  bool v4; 

  for( i = 0; i <= *(__int16 *)(a1 + 2); ++i )
  {
    if( i >= 2 )
      v3 = *(_QWORD *)(*(_QWORD *)(a1 + 24) + 8i64 * i - 16);
    else
      v3 = *(_QWORD *)(a1 + 8i64 * i + 8);
    v4 = (*(_DWORD *)(v3 + 8) & 0x80000) != 0;
    if( *(struct _KTHREAD **)(v3 + 56) == KeGetCurrentThread() )
      *(_QWORD *)(v3 + 56) = 0i64;
    else
      _InterlockedDecrement((volatile signed __int32 *)(v3 + 56));
    ExReleasePushLockEx(v3 + 48, 0);
    if( v4 && (*(_DWORD *)(v3 + 8) & 0x80000) != 0 )
      CmpFreeKeyControlBlock(v3);
  }
}

Referenced by:

CmCallbackGetKeyObjectID
CmCallbackGetKeyObjectIDEx
CmDeleteLayeredKey
CmDeleteValueKey
CmEnumerateValueFromLayeredKey
CmQueryLayeredKey
CmQueryMultipleValueForLayeredKey
CmSaveKey
CmSetKeyFlags
CmSetLastWriteTimeKey
CmSetValueKey
CmpAssignKeySecurity
CmpDoBuildVirtualStack
CmpDoParseKey
CmpEnumerateLayeredKey
CmpGetSymbolicLinkTarget
CmpPromoteKey
CmpQueryKeySecurity
CmpSetKeySecurity
CmpStartSiloRegistryNamespace