Author: ion Date: Tue Jan 5 01:51:54 2016 New Revision: 70489
URL: http://svn.reactos.org/svn/reactos?rev=70489&view=rev Log: [CMLIB]: Move Value functions to CMLIB as well, so that they can be shared with the new boot code.
Added: trunk/reactos/lib/cmlib/cmvalue.c - copied, changed from r70480, trunk/reactos/ntoskrnl/config/cmvalue.c Removed: trunk/reactos/ntoskrnl/config/cmvalue.c Modified: trunk/reactos/boot/environ/app/bootmgr/rtlcompat.c trunk/reactos/lib/cmlib/CMakeLists.txt trunk/reactos/lib/cmlib/cmdata.h trunk/reactos/lib/cmlib/cmlib.h trunk/reactos/ntoskrnl/config/cmapi.c trunk/reactos/ntoskrnl/include/internal/cm_x.h trunk/reactos/ntoskrnl/ntos.cmake
Modified: trunk/reactos/boot/environ/app/bootmgr/rtlcompat.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/environ/app/bootmgr/rt... ============================================================================== --- trunk/reactos/boot/environ/app/bootmgr/rtlcompat.c [iso-8859-1] (original) +++ trunk/reactos/boot/environ/app/bootmgr/rtlcompat.c [iso-8859-1] Tue Jan 5 01:51:54 2016 @@ -75,3 +75,15 @@ { return 0; } + +VOID +NTAPI +KeBugCheckEx( + _In_ ULONG BugCheckCode, + _In_ ULONG_PTR BugCheckParameter1, + _In_ ULONG_PTR BugCheckParameter2, + _In_ ULONG_PTR BugCheckParameter3, + _In_ ULONG_PTR BugCheckParameter4) +{ + __assume(0); +}
Modified: trunk/reactos/lib/cmlib/CMakeLists.txt URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/cmlib/CMakeLists.txt?re... ============================================================================== --- trunk/reactos/lib/cmlib/CMakeLists.txt [iso-8859-1] (original) +++ trunk/reactos/lib/cmlib/CMakeLists.txt [iso-8859-1] Tue Jan 5 01:51:54 2016 @@ -9,6 +9,7 @@ cmindex.c cmname.c cmtools.c + cmvalue.c hivebin.c hivecell.c hiveinit.c
Modified: trunk/reactos/lib/cmlib/cmdata.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/cmlib/cmdata.h?rev=7048... ============================================================================== --- trunk/reactos/lib/cmlib/cmdata.h [iso-8859-1] (original) +++ trunk/reactos/lib/cmlib/cmdata.h [iso-8859-1] Tue Jan 5 01:51:54 2016 @@ -47,6 +47,13 @@ // CM_KEY_VALUE Flags // #define VALUE_COMP_NAME 0x0001 + +// +// CM_KEY_VALUE Types +// +#define CM_KEY_VALUE_SMALL 0x4 +#define CM_KEY_VALUE_BIG 0x3FD8 +#define CM_KEY_VALUE_SPECIAL_SIZE 0x80000000
#include <pshpack1.h>
Modified: trunk/reactos/lib/cmlib/cmlib.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/cmlib/cmlib.h?rev=70489... ============================================================================== --- trunk/reactos/lib/cmlib/cmlib.h [iso-8859-1] (original) +++ trunk/reactos/lib/cmlib/cmlib.h [iso-8859-1] Tue Jan 5 01:51:54 2016 @@ -160,6 +160,7 @@ #include <wchar.h> #include "hivedata.h" #include "cmdata.h" +#include "bugcodes.h"
#if defined(_TYPEDEFS_HOST_H) || defined(__FREELDR_H)
@@ -253,6 +254,56 @@
extern ULONG CmlibTraceLevel;
+// +// Hack since bigkeys are not yet supported +// +#define ASSERT_VALUE_BIG(h, s) \ + ASSERTMSG("Big keys not supported!", !CmpIsKeyValueBig(h, s)); + +// +// Returns whether or not this is a small valued key +// +static inline +BOOLEAN +CmpIsKeyValueSmall(OUT PULONG RealLength, + IN ULONG Length) +{ + /* Check if the length has the special size value */ + if (Length >= CM_KEY_VALUE_SPECIAL_SIZE) + { + /* It does, so this is a small key: return the real length */ + *RealLength = Length - CM_KEY_VALUE_SPECIAL_SIZE; + return TRUE; + } + + /* This is not a small key, return the length we read */ + *RealLength = Length; + return FALSE; +} + +// +// Returns whether or not this is a big valued key +// +static inline +BOOLEAN +CmpIsKeyValueBig(IN PHHIVE Hive, + IN ULONG Length) +{ + /* Check if the hive is XP Beta 1 or newer */ + if (Hive->Version >= HSYS_WHISTLER_BETA1) + { + /* Check if the key length is valid for a big value key */ + if ((Length < CM_KEY_VALUE_SPECIAL_SIZE) && (Length > CM_KEY_VALUE_BIG)) + { + /* Yes, this value is big */ + return TRUE; + } + } + + /* Not a big value key */ + return FALSE; +} + /* * Public Hive functions. */
Copied: trunk/reactos/lib/cmlib/cmvalue.c (from r70480, trunk/reactos/ntoskrnl/config/cmvalue.c) URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/cmlib/cmvalue.c?p2=trun... ============================================================================== --- trunk/reactos/ntoskrnl/config/cmvalue.c [iso-8859-1] (original) +++ trunk/reactos/lib/cmlib/cmvalue.c [iso-8859-1] Tue Jan 5 01:51:54 2016 @@ -1,16 +1,16 @@ /* * PROJECT: ReactOS Kernel * LICENSE: GPL - See COPYING in the top level directory - * FILE: ntoskrnl/config/cmvalue.c - * PURPOSE: Configuration Manager - Cell Values + * FILE: lib/cmlib/cmvalue.c + * PURPOSE: Configuration Manager Library - Cell Values * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org) */
/* INCLUDES ******************************************************************/
-#include "ntoskrnl.h" +#include "cmlib.h" #define NDEBUG -#include "debug.h" +#include <debug.h>
/* FUNCTIONS *****************************************************************/
@@ -362,6 +362,46 @@ return STATUS_SUCCESS; }
+HCELL_INDEX +NTAPI +CmpCopyCell(IN PHHIVE SourceHive, + IN HCELL_INDEX SourceCell, + IN PHHIVE DestinationHive, + IN HSTORAGE_TYPE StorageType) +{ + PCELL_DATA SourceData; + PCELL_DATA DestinationData = NULL; + HCELL_INDEX DestinationCell = HCELL_NIL; + LONG DataSize; + PAGED_CODE(); + + /* Get the data and the size of the source cell */ + SourceData = HvGetCell(SourceHive, SourceCell); + DataSize = HvGetCellSize(SourceHive, SourceData); + + /* Allocate a new cell in the destination hive */ + DestinationCell = HvAllocateCell(DestinationHive, + DataSize, + StorageType, + HCELL_NIL); + if (DestinationCell == HCELL_NIL) goto Cleanup; + + /* Get the data of the destination cell */ + DestinationData = HvGetCell(DestinationHive, DestinationCell); + + /* Copy the data from the source cell to the destination cell */ + RtlMoveMemory(DestinationData, SourceData, DataSize); + +Cleanup: + + /* Release the cells */ + if (SourceData) HvReleaseCell(SourceHive, SourceCell); + if (DestinationData) HvReleaseCell(DestinationHive, DestinationCell); + + /* Return the destination cell index */ + return DestinationCell; +} + NTSTATUS NTAPI CmpCopyKeyValueList(IN PHHIVE SourceHive,
Modified: trunk/reactos/ntoskrnl/config/cmapi.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/config/cmapi.c?rev... ============================================================================== --- trunk/reactos/ntoskrnl/config/cmapi.c [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/config/cmapi.c [iso-8859-1] Tue Jan 5 01:51:54 2016 @@ -2345,46 +2345,6 @@ return SubKeys; }
-HCELL_INDEX -NTAPI -CmpCopyCell(IN PHHIVE SourceHive, - IN HCELL_INDEX SourceCell, - IN PHHIVE DestinationHive, - IN HSTORAGE_TYPE StorageType) -{ - PCELL_DATA SourceData; - PCELL_DATA DestinationData = NULL; - HCELL_INDEX DestinationCell = HCELL_NIL; - LONG DataSize; - PAGED_CODE(); - - /* Get the data and the size of the source cell */ - SourceData = HvGetCell(SourceHive, SourceCell); - DataSize = HvGetCellSize(SourceHive, SourceData); - - /* Allocate a new cell in the destination hive */ - DestinationCell = HvAllocateCell(DestinationHive, - DataSize, - StorageType, - HCELL_NIL); - if (DestinationCell == HCELL_NIL) goto Cleanup; - - /* Get the data of the destination cell */ - DestinationData = HvGetCell(DestinationHive, DestinationCell); - - /* Copy the data from the source cell to the destination cell */ - RtlMoveMemory(DestinationData, SourceData, DataSize); - -Cleanup: - - /* Release the cells */ - if (SourceData) HvReleaseCell(SourceHive, SourceCell); - if (DestinationData) HvReleaseCell(DestinationHive, DestinationCell); - - /* Return the destination cell index */ - return DestinationCell; -} - static NTSTATUS NTAPI
Removed: trunk/reactos/ntoskrnl/config/cmvalue.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/config/cmvalue.c?r... ============================================================================== --- trunk/reactos/ntoskrnl/config/cmvalue.c [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/config/cmvalue.c (removed) @@ -1,422 +0,0 @@ -/* - * PROJECT: ReactOS Kernel - * LICENSE: GPL - See COPYING in the top level directory - * FILE: ntoskrnl/config/cmvalue.c - * PURPOSE: Configuration Manager - Cell Values - * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org) - */ - -/* INCLUDES ******************************************************************/ - -#include "ntoskrnl.h" -#define NDEBUG -#include "debug.h" - -/* FUNCTIONS *****************************************************************/ - -BOOLEAN -NTAPI -CmpMarkValueDataDirty(IN PHHIVE Hive, - IN PCM_KEY_VALUE Value) -{ - ULONG KeySize; - PAGED_CODE(); - - /* Make sure there's actually any data */ - if (Value->Data != HCELL_NIL) - { - /* If this is a small key, there's no need to have it dirty */ - if (CmpIsKeyValueSmall(&KeySize, Value->DataLength)) return TRUE; - - /* Check if this is a big key */ - ASSERT_VALUE_BIG(Hive, KeySize); - - /* Normal value, just mark it dirty */ - HvMarkCellDirty(Hive, Value->Data, FALSE); - } - - /* Operation complete */ - return TRUE; -} - -BOOLEAN -NTAPI -CmpFreeValueData(IN PHHIVE Hive, - IN HCELL_INDEX DataCell, - IN ULONG DataLength) -{ - ULONG KeySize; - PAGED_CODE(); - - /* If this is a small key, the data is built-in */ - if (!CmpIsKeyValueSmall(&KeySize, DataLength)) - { - /* If there's no data cell, there's nothing to do */ - if (DataCell == HCELL_NIL) return TRUE; - - /* Make sure the data cell is allocated */ - //ASSERT(HvIsCellAllocated(Hive, DataCell)); - - /* Unsupported value type */ - ASSERT_VALUE_BIG(Hive, KeySize); - - /* Normal value, just free the data cell */ - HvFreeCell(Hive, DataCell); - } - - /* Operation complete */ - return TRUE; -} - -BOOLEAN -NTAPI -CmpFreeValue(IN PHHIVE Hive, - IN HCELL_INDEX Cell) -{ - PCM_KEY_VALUE Value; - PAGED_CODE(); - - /* Get the cell data */ - Value = (PCM_KEY_VALUE)HvGetCell(Hive, Cell); - if (!Value) ASSERT(FALSE); - - /* Free it */ - if (!CmpFreeValueData(Hive, Value->Data, Value->DataLength)) - { - /* We failed to free the data, return failure */ - HvReleaseCell(Hive, Cell); - return FALSE; - } - - /* Release the cell and free it */ - HvReleaseCell(Hive, Cell); - HvFreeCell(Hive, Cell); - return TRUE; -} - -HCELL_INDEX -NTAPI -CmpFindValueByName(IN PHHIVE Hive, - IN PCM_KEY_NODE KeyNode, - IN PUNICODE_STRING Name) -{ - HCELL_INDEX CellIndex; - - /* Call the main function */ - if (!CmpFindNameInList(Hive, - &KeyNode->ValueList, - Name, - NULL, - &CellIndex)) - { - /* Santy check */ - ASSERT(CellIndex == HCELL_NIL); - } - - /* Return the index */ - return CellIndex; -} - -BOOLEAN -NTAPI -CmpGetValueData(IN PHHIVE Hive, - IN PCM_KEY_VALUE Value, - IN PULONG Length, - OUT PVOID *Buffer, - OUT PBOOLEAN BufferAllocated, - OUT PHCELL_INDEX CellToRelease) -{ - PAGED_CODE(); - - /* Sanity check */ - ASSERT(Value->Signature == CM_KEY_VALUE_SIGNATURE); - - /* Set failure defaults */ - *BufferAllocated = FALSE; - *Buffer = NULL; - *CellToRelease = HCELL_NIL; - - /* Check if this is a small key */ - if (CmpIsKeyValueSmall(Length, Value->DataLength)) - { - /* Return the data immediately */ - *Buffer = &Value->Data; - return TRUE; - } - - /* Unsupported */ - ASSERT_VALUE_BIG(Hive, *Length); - - /* Get the data from the cell */ - *Buffer = HvGetCell(Hive, Value->Data); - if (!(*Buffer)) return FALSE; - - /* Return success and the cell to be released */ - *CellToRelease = Value->Data; - return TRUE; -} - -PCELL_DATA -NTAPI -CmpValueToData(IN PHHIVE Hive, - IN PCM_KEY_VALUE Value, - OUT PULONG Length) -{ - PCELL_DATA Buffer; - BOOLEAN BufferAllocated; - HCELL_INDEX CellToRelease; - PAGED_CODE(); - - /* Sanity check */ - ASSERT(Hive->ReleaseCellRoutine == NULL); - - /* Get the actual data */ - if (!CmpGetValueData(Hive, - Value, - Length, - (PVOID)&Buffer, - &BufferAllocated, - &CellToRelease)) - { - /* We failed */ - ASSERT(BufferAllocated == FALSE); - ASSERT(Buffer == NULL); - return NULL; - } - - /* This should never happen!*/ - if (BufferAllocated) - { - /* Free the buffer and bugcheck */ - CmpFree(Buffer, 0); - KeBugCheckEx(REGISTRY_ERROR, 8, 0, (ULONG_PTR)Hive, (ULONG_PTR)Value); - } - - /* Otherwise, return the cell data */ - return Buffer; -} - -NTSTATUS -NTAPI -CmpAddValueToList(IN PHHIVE Hive, - IN HCELL_INDEX ValueCell, - IN ULONG Index, - IN ULONG Type, - IN OUT PCHILD_LIST ChildList) -{ - HCELL_INDEX ListCell; - ULONG ChildCount, Length, i; - PCELL_DATA CellData; - PAGED_CODE(); - - /* Sanity check */ - ASSERT((((LONG)Index) >= 0) && (Index <= ChildList->Count)); - - /* Get the number of entries in the child list */ - ChildCount = ChildList->Count; - ChildCount++; - if (ChildCount > 1) - { - /* The cell should be dirty at this point */ - ASSERT(HvIsCellDirty(Hive, ChildList->List)); - - /* Check if we have less then 100 children */ - if (ChildCount < 100) - { - /* Allocate just enough as requested */ - Length = ChildCount * sizeof(HCELL_INDEX); - } - else - { - /* Otherwise, we have quite a few, so allocate a batch */ - Length = ROUND_UP(ChildCount, 100) * sizeof(HCELL_INDEX); - if (Length > HBLOCK_SIZE) - { - /* But make sure we don't allocate beyond our block size */ - Length = ROUND_UP(Length, HBLOCK_SIZE); - } - } - - /* Perform the allocation */ - ListCell = HvReallocateCell(Hive, ChildList->List, Length); - } - else - { - /* This is our first child, so allocate a single cell */ - ListCell = HvAllocateCell(Hive, sizeof(HCELL_INDEX), Type, HCELL_NIL); - } - - /* Fail if we couldn't get a cell */ - if (ListCell == HCELL_NIL) return STATUS_INSUFFICIENT_RESOURCES; - - /* Set this cell as the child list's list cell */ - ChildList->List = ListCell; - - /* Get the actual key list memory */ - CellData = HvGetCell(Hive, ListCell); - ASSERT(CellData != NULL); - - /* Loop all the children */ - for (i = ChildCount - 1; i > Index; i--) - { - /* Move them all down */ - CellData->u.KeyList[i] = CellData->u.KeyList[i - 1]; - } - - /* Insert us on top now */ - CellData->u.KeyList[Index] = ValueCell; - ChildList->Count = ChildCount; - - /* Release the list cell and make sure the value cell is dirty */ - HvReleaseCell(Hive, ListCell); - ASSERT(HvIsCellDirty(Hive, ValueCell)); - - /* We're done here */ - return STATUS_SUCCESS; -} - -NTSTATUS -NTAPI -CmpSetValueDataNew(IN PHHIVE Hive, - IN PVOID Data, - IN ULONG DataSize, - IN ULONG StorageType, - IN HCELL_INDEX ValueCell, - OUT PHCELL_INDEX DataCell) -{ - PCELL_DATA CellData; - PAGED_CODE(); - ASSERT(DataSize > CM_KEY_VALUE_SMALL); - - /* Check if this is a big key */ - ASSERT_VALUE_BIG(Hive, DataSize); - - /* Allocate a data cell */ - *DataCell = HvAllocateCell(Hive, DataSize, StorageType, HCELL_NIL); - if (*DataCell == HCELL_NIL) return STATUS_INSUFFICIENT_RESOURCES; - - /* Get the actual data */ - CellData = HvGetCell(Hive, *DataCell); - if (!CellData) ASSERT(FALSE); - - /* Copy our buffer into it */ - RtlCopyMemory(CellData, Data, DataSize); - - /* All done */ - return STATUS_SUCCESS; -} - -NTSTATUS -NTAPI -CmpRemoveValueFromList(IN PHHIVE Hive, - IN ULONG Index, - IN OUT PCHILD_LIST ChildList) -{ - ULONG Count; - PCELL_DATA CellData; - HCELL_INDEX NewCell; - PAGED_CODE(); - - /* Sanity check */ - ASSERT((((LONG)Index) >= 0) && (Index <= ChildList->Count)); - - /* Get the new count after removal */ - Count = ChildList->Count - 1; - if (Count > 0) - { - /* Get the actual list array */ - CellData = HvGetCell(Hive, ChildList->List); - if (!CellData) return STATUS_INSUFFICIENT_RESOURCES; - - /* Make sure cells data have been made dirty */ - ASSERT(HvIsCellDirty(Hive, ChildList->List)); - ASSERT(HvIsCellDirty(Hive, CellData->u.KeyList[Index])); - - /* Loop the list */ - while (Index < Count) - { - /* Move everything up */ - CellData->u.KeyList[Index] = CellData->u.KeyList[Index + 1]; - Index++; - } - - /* Re-allocate the cell for the list by decreasing the count */ - NewCell = HvReallocateCell(Hive, - ChildList->List, - Count * sizeof(HCELL_INDEX)); - ASSERT(NewCell != HCELL_NIL); - HvReleaseCell(Hive,ChildList->List); - - /* Update the list cell */ - ChildList->List = NewCell; - } - else - { - /* Otherwise, we were the last entry, so free the list entirely */ - HvFreeCell(Hive, ChildList->List); - ChildList->List = HCELL_NIL; - } - - /* Update the child list with the new count */ - ChildList->Count = Count; - return STATUS_SUCCESS; -} - -NTSTATUS -NTAPI -CmpCopyKeyValueList(IN PHHIVE SourceHive, - IN PCHILD_LIST SrcValueList, - IN PHHIVE DestinationHive, - IN OUT PCHILD_LIST DestValueList, - IN HSTORAGE_TYPE StorageType) - -{ - NTSTATUS Status = STATUS_SUCCESS; - HCELL_INDEX CellIndex = HCELL_NIL; - ULONG Index; - PCELL_DATA SrcListData = NULL; - PCELL_DATA DestListData = NULL; - - PAGED_CODE(); - - /* Set the count */ - DestValueList->Count = SrcValueList->Count; - - /* Check if the list is empty */ - if (!DestValueList->Count) - { - DestValueList->List = HCELL_NIL; - return STATUS_SUCCESS; - } - - /* Create a simple copy of the list */ - CellIndex = CmpCopyCell(SourceHive, - SrcValueList->List, - DestinationHive, - StorageType); - if (CellIndex == HCELL_NIL) return STATUS_INSUFFICIENT_RESOURCES; - - /* Get the source and the destination value list */ - SrcListData = HvGetCell(SourceHive, SrcValueList->List); - DestListData = HvGetCell(DestinationHive, CellIndex); - - /* Copy the actual values */ - for (Index = 0; Index < SrcValueList->Count; Index++) - { - DestListData->u.KeyList[Index] = CmpCopyCell(SourceHive, - SrcListData->u.KeyList[Index], - DestinationHive, - StorageType); - if (DestListData->u.KeyList[Index] == HCELL_NIL) - { - Status = STATUS_INSUFFICIENT_RESOURCES; - break; - } - } - - /* Release the cells */ - if (SrcListData) HvReleaseCell(SourceHive, SrcValueList->List); - if (DestListData) HvReleaseCell(DestinationHive, CellIndex); - - return Status; -}
Modified: trunk/reactos/ntoskrnl/include/internal/cm_x.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/include/internal/c... ============================================================================== --- trunk/reactos/ntoskrnl/include/internal/cm_x.h [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/include/internal/cm_x.h [iso-8859-1] Tue Jan 5 01:51:54 2016 @@ -5,50 +5,6 @@ * PURPOSE: Inlined Functions for the Configuration Manager * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org) */ - -// -// Returns whether or not this is a small valued key -// -FORCEINLINE -BOOLEAN -CmpIsKeyValueSmall(OUT PULONG RealLength, - IN ULONG Length) -{ - /* Check if the length has the special size value */ - if (Length >= CM_KEY_VALUE_SPECIAL_SIZE) - { - /* It does, so this is a small key: return the real length */ - *RealLength = Length - CM_KEY_VALUE_SPECIAL_SIZE; - return TRUE; - } - - /* This is not a small key, return the length we read */ - *RealLength = Length; - return FALSE; -} - -// -// Returns whether or not this is a big valued key -// -FORCEINLINE -BOOLEAN -CmpIsKeyValueBig(IN PHHIVE Hive, - IN ULONG Length) -{ - /* Check if the hive is XP Beta 1 or newer */ - if (Hive->Version >= HSYS_WHISTLER_BETA1) - { - /* Check if the key length is valid for a big value key */ - if ((Length < CM_KEY_VALUE_SPECIAL_SIZE) && (Length > CM_KEY_VALUE_BIG)) - { - /* Yes, this value is big */ - return TRUE; - } - } - - /* Not a big value key */ - return FALSE; -}
// // Returns the hashkey corresponding to a convkey
Modified: trunk/reactos/ntoskrnl/ntos.cmake URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ntos.cmake?rev=704... ============================================================================== --- trunk/reactos/ntoskrnl/ntos.cmake [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/ntos.cmake [iso-8859-1] Tue Jan 5 01:51:54 2016 @@ -68,7 +68,6 @@ ${REACTOS_SOURCE_DIR}/ntoskrnl/config/cmsecach.c ${REACTOS_SOURCE_DIR}/ntoskrnl/config/cmsysini.c ${REACTOS_SOURCE_DIR}/ntoskrnl/config/cmvalche.c - ${REACTOS_SOURCE_DIR}/ntoskrnl/config/cmvalue.c ${REACTOS_SOURCE_DIR}/ntoskrnl/config/cmwraprs.c ${REACTOS_SOURCE_DIR}/ntoskrnl/config/ntapi.c ${REACTOS_SOURCE_DIR}/ntoskrnl/dbgk/dbgkobj.c