[ros-diffs] [fireball] 30079: - Move Nt* APIs converted to new CM into config/cmapi.c - Start removing usage of ReactOS Hive Flags and use NT Hive Flags instead. - Add CmpLockRegsitry based on CmpLockRegistryExclusive. - Add new lazy flush implementation based on the old one, but with parallel work support. Not yet in use. - Don't delete a key that's already being deleted. - Update KcbMaxNameLen after a deletion. - Set the DELETE flag in the KCB during a deletion. - Remove the KCB Key hash during a delete. - Implement CmFlushKey (not yet used).

fireball at svn.reactos.org fireball at svn.reactos.org
Sat Nov 3 00:12:22 CET 2007


Author: fireball
Date: Sat Nov  3 02:12:22 2007
New Revision: 30079

URL: http://svn.reactos.org/svn/reactos?rev=30079&view=rev
Log:
- Move Nt* APIs converted to new CM into config/cmapi.c
- Start removing usage of ReactOS Hive Flags and use NT Hive Flags instead.
- Add CmpLockRegsitry based on CmpLockRegistryExclusive.
- Add new lazy flush implementation based on the old one, but with parallel work support. Not yet in use.
- Don't delete a key that's already being deleted.
- Update KcbMaxNameLen after a deletion.
- Set the DELETE flag in the KCB during a deletion.
- Remove the KCB Key hash during a delete.
- Implement CmFlushKey (not yet used).

Added:
    trunk/reactos/ntoskrnl/config/cmlazy.c   (with props)
    trunk/reactos/ntoskrnl/config/ntapi.c   (with props)
Modified:
    trunk/reactos/ntoskrnl/cm/ntfunc.c
    trunk/reactos/ntoskrnl/cm/regfile.c
    trunk/reactos/ntoskrnl/cm/registry.c
    trunk/reactos/ntoskrnl/config/cm.h
    trunk/reactos/ntoskrnl/config/cmapi.c
    trunk/reactos/ntoskrnl/config/cmsysini.c
    trunk/reactos/ntoskrnl/include/internal/ntoskrnl.h
    trunk/reactos/ntoskrnl/ntoskrnl.rbuild

Modified: trunk/reactos/ntoskrnl/cm/ntfunc.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/cm/ntfunc.c?rev=30079&r1=30078&r2=30079&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/cm/ntfunc.c (original)
+++ trunk/reactos/ntoskrnl/cm/ntfunc.c Sat Nov  3 02:12:22 2007
@@ -382,7 +382,7 @@
     CmiCallRegisteredCallbacks(RegNtPostCreateKey, &PostCreateKeyInfo);
 
     CmiSyncHives();
-
+    
     LocalDisposition = REG_CREATED_NEW_KEY;
 
 SuccessReturn:
@@ -422,13 +422,13 @@
     PKEY_OBJECT  KeyObject;
     PCMHIVE  RegistryHive;
     KPROCESSOR_MODE  PreviousMode;
-
+    
     PAGED_CODE();
-
+    
     DPRINT("NtFlushKey (KeyHandle %lx) called\n", KeyHandle);
-
+    
     PreviousMode = ExGetPreviousMode();
-
+    
     /* Verify that the handle is valid and is a registry key */
     Status = ObReferenceObjectByHandle(KeyHandle,
                                        0,
@@ -440,15 +440,15 @@
     {
         return(Status);
     }
-
+    
     VERIFY_KEY_OBJECT(KeyObject);
-
+    
     RegistryHive = (PCMHIVE)KeyObject->KeyControlBlock->KeyHive;
-
+    
     /* Acquire hive lock */
     KeEnterCriticalRegion();
     ExAcquireResourceExclusiveLite(&CmpRegistryLock, TRUE);
-
+    
     if (IsNoFileHive(RegistryHive))
     {
         Status = STATUS_SUCCESS;
@@ -458,15 +458,14 @@
         /* Flush non-volatile hive */
         Status = CmiFlushRegistryHive(RegistryHive);
     }
-
+    
     ExReleaseResourceLite(&CmpRegistryLock);
     KeLeaveCriticalRegion();
-
+    
     ObDereferenceObject(KeyObject);
-
+    
     return STATUS_SUCCESS;
 }
-
 
 NTSTATUS
 NTAPI
@@ -674,7 +673,7 @@
 
     if (CmiRegistryInitialized == TRUE)
         return STATUS_ACCESS_DENIED;
-
+    
     /* Save boot log file */
     IopSaveBootLogToFile();
 
@@ -685,635 +684,4 @@
     return Status;
 }
 
-NTSTATUS
-NTAPI
-NtDeleteKey(IN HANDLE KeyHandle)
-{
-    PKEY_OBJECT KeyObject;
-    NTSTATUS Status;
-    REG_DELETE_KEY_INFORMATION DeleteKeyInfo;
-    REG_POST_OPERATION_INFORMATION PostOperationInfo;
-    PAGED_CODE();
-
-    DPRINT("NtDeleteKey(KH 0x%p)\n", KeyHandle);
-
-    /* Verify that the handle is valid and is a registry key */
-    Status = ObReferenceObjectByHandle(KeyHandle,
-                                       DELETE,
-                                       CmpKeyObjectType,
-                                       ExGetPreviousMode(),
-                                       (PVOID *)&KeyObject,
-                                       NULL);
-    if (!NT_SUCCESS(Status))
-    {
-        DPRINT("ObReferenceObjectByHandle() failed with Status = 0x%08X\n");
-        return Status;
-    }
-
-    /* Setup the callback */
-    PostOperationInfo.Object = (PVOID)KeyObject;
-    DeleteKeyInfo.Object = (PVOID)KeyObject;
-    Status = CmiCallRegisteredCallbacks(RegNtPreDeleteKey, &DeleteKeyInfo);
-    if (NT_SUCCESS(Status))
-    {
-        /* Call the internal API */
-        Status = CmDeleteKey(KeyObject->KeyControlBlock);
-
-        /* Remove the keep-alive reference */
-        ObDereferenceObject(KeyObject);
-        if (KeyObject->KeyControlBlock->KeyHive !=
-            KeyObject->KeyControlBlock->ParentKcb->KeyHive)
-        {
-            /* Dereference again */
-            ObDereferenceObject(KeyObject);
-        }
-
-        /* Do post callback */
-        PostOperationInfo.Status = Status;
-        CmiCallRegisteredCallbacks(RegNtPostDeleteKey, &PostOperationInfo);
-    }
-
-    /* Dereference the object */
-    ObDereferenceObject(KeyObject);
-    return Status;
-}
-
-NTSTATUS
-NTAPI
-NtEnumerateKey(IN HANDLE KeyHandle,
-               IN ULONG Index,
-               IN KEY_INFORMATION_CLASS KeyInformationClass,
-               OUT PVOID KeyInformation,
-               IN ULONG Length,
-               OUT PULONG ResultLength)
-{
-    NTSTATUS Status;
-    PKEY_OBJECT KeyObject;
-    REG_ENUMERATE_KEY_INFORMATION EnumerateKeyInfo;
-    REG_POST_OPERATION_INFORMATION PostOperationInfo;
-    PAGED_CODE();
-
-    DPRINT("NtEnumerateKey() KH 0x%x, Index 0x%x, KIC %d, Length %d\n",
-        KeyHandle, Index, KeyInformationClass, Length);
-
-    /* Verify that the handle is valid and is a registry key */
-    Status = ObReferenceObjectByHandle(KeyHandle,
-                                       KEY_ENUMERATE_SUB_KEYS,
-                                       CmpKeyObjectType,
-                                       ExGetPreviousMode(),
-                                       (PVOID *)&KeyObject,
-                                       NULL);
-    if (!NT_SUCCESS(Status))
-    {
-        DPRINT("ObReferenceObjectByHandle() failed with Status = 0x%08X\n");
-        return Status;
-    }
-
-    /* Setup the callback */
-    PostOperationInfo.Object = (PVOID)KeyObject;
-    EnumerateKeyInfo.Object = (PVOID)KeyObject;
-    EnumerateKeyInfo.Index = Index;
-    EnumerateKeyInfo.KeyInformationClass = KeyInformationClass;
-    EnumerateKeyInfo.Length = Length;
-    EnumerateKeyInfo.ResultLength = ResultLength;
-
-    /* Do the callback */
-    Status = CmiCallRegisteredCallbacks(RegNtPreEnumerateKey, &EnumerateKeyInfo);
-    if (NT_SUCCESS(Status))
-    {
-        /* Call the internal API */
-        Status = CmEnumerateKey(KeyObject->KeyControlBlock,
-                                Index,
-                                KeyInformationClass,
-                                KeyInformation,
-                                Length,
-                                ResultLength);
-
-        /* Do the post callback */
-        PostOperationInfo.Status = Status;
-        CmiCallRegisteredCallbacks(RegNtPostEnumerateKey, &PostOperationInfo);
-    }
-
-    /* Dereference and return status */
-    ObDereferenceObject(KeyObject);
-    return Status;
-}
-
-NTSTATUS
-NTAPI
-NtEnumerateValueKey(IN HANDLE KeyHandle,
-                    IN ULONG Index,
-                    IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
-                    OUT PVOID KeyValueInformation,
-                    IN ULONG Length,
-                    OUT PULONG ResultLength)
-{
-    NTSTATUS Status;
-    PKEY_OBJECT KeyObject;
-    REG_ENUMERATE_VALUE_KEY_INFORMATION EnumerateValueKeyInfo;
-    REG_POST_OPERATION_INFORMATION PostOperationInfo;
-    PAGED_CODE();
-
-    DPRINT("NtEnumerateValueKey() KH 0x%x, Index 0x%x, KVIC %d, Length %d\n",
-        KeyHandle, Index, KeyValueInformationClass, Length);
-
-    /* Verify that the handle is valid and is a registry key */
-    Status = ObReferenceObjectByHandle(KeyHandle,
-                                       KEY_QUERY_VALUE,
-                                       CmpKeyObjectType,
-                                       ExGetPreviousMode(),
-                                       (PVOID *)&KeyObject,
-                                       NULL);
-    if (!NT_SUCCESS(Status))
-    {
-        DPRINT("ObReferenceObjectByHandle() failed with Status = 0x%08X\n");
-        return Status;
-    }
-
-    /* Setup the callback */
-    PostOperationInfo.Object = (PVOID)KeyObject;
-    EnumerateValueKeyInfo.Object = (PVOID)KeyObject;
-    EnumerateValueKeyInfo.Index = Index;
-    EnumerateValueKeyInfo.KeyValueInformationClass = KeyValueInformationClass;
-    EnumerateValueKeyInfo.KeyValueInformation = KeyValueInformation;
-    EnumerateValueKeyInfo.Length = Length;
-    EnumerateValueKeyInfo.ResultLength = ResultLength;
-
-    /* Do the callback */
-    Status = CmiCallRegisteredCallbacks(RegNtPreEnumerateValueKey,
-                                        &EnumerateValueKeyInfo);
-    if (NT_SUCCESS(Status))
-    {
-        /* Call the internal API */
-        Status = CmEnumerateValueKey(KeyObject->KeyControlBlock,
-                                     Index,
-                                     KeyValueInformationClass,
-                                     KeyValueInformation,
-                                     Length,
-                                     ResultLength);
-
-        /* Do the post callback */
-        PostOperationInfo.Status = Status;
-        CmiCallRegisteredCallbacks(RegNtPostEnumerateValueKey, &PostOperationInfo);
-    }
-
-    ObDereferenceObject(KeyObject);
-    return Status;
-}
-
-NTSTATUS
-NTAPI
-NtQueryKey(IN HANDLE KeyHandle,
-           IN KEY_INFORMATION_CLASS KeyInformationClass,
-           OUT PVOID KeyInformation,
-           IN ULONG Length,
-           OUT PULONG ResultLength)
-{
-    NTSTATUS Status;
-    PKEY_OBJECT KeyObject;
-    REG_QUERY_KEY_INFORMATION QueryKeyInfo;
-    REG_POST_OPERATION_INFORMATION PostOperationInfo;
-    PAGED_CODE();
-
-    DPRINT("NtQueryKey() KH 0x%x, KIC %d, Length %d\n",
-        KeyHandle, KeyInformationClass, Length);
-
-    /* Verify that the handle is valid and is a registry key */
-    Status = ObReferenceObjectByHandle(KeyHandle,
-                                       (KeyInformationClass !=
-                                        KeyNameInformation) ?
-                                       KEY_QUERY_VALUE : 0,
-                                       CmpKeyObjectType,
-                                       ExGetPreviousMode(),
-                                       (PVOID *)&KeyObject,
-                                       NULL);
-    if (!NT_SUCCESS(Status))
-    {
-        DPRINT("ObReferenceObjectByHandle() failed with Status = 0x%08X\n");
-        return Status;
-    }
-
-    /* Setup the callback */
-    PostOperationInfo.Object = (PVOID)KeyObject;
-    QueryKeyInfo.Object = (PVOID)KeyObject;
-    QueryKeyInfo.KeyInformationClass = KeyInformationClass;
-    QueryKeyInfo.KeyInformation = KeyInformation;
-    QueryKeyInfo.Length = Length;
-    QueryKeyInfo.ResultLength = ResultLength;
-
-    /* Do the callback */
-    Status = CmiCallRegisteredCallbacks(RegNtPreQueryKey, &QueryKeyInfo);
-    if (NT_SUCCESS(Status))
-    {
-        /* Call the internal API */
-        Status = CmQueryKey(KeyObject->KeyControlBlock,
-                            KeyInformationClass,
-                            KeyInformation,
-                            Length,
-                            ResultLength);
-
-        /* Do the post callback */
-        PostOperationInfo.Status = Status;
-        CmiCallRegisteredCallbacks(RegNtPostQueryKey, &PostOperationInfo);
-    }
-
-    /* Dereference and return status */
-    ObDereferenceObject(KeyObject);
-    return Status;
-}
-
-NTSTATUS
-NTAPI
-NtQueryValueKey(IN HANDLE KeyHandle,
-                IN PUNICODE_STRING ValueName,
-                IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
-                OUT PVOID KeyValueInformation,
-                IN ULONG Length,
-                OUT PULONG ResultLength)
-{
-    NTSTATUS Status;
-    PKEY_OBJECT KeyObject;
-    REG_QUERY_VALUE_KEY_INFORMATION QueryValueKeyInfo;
-    REG_POST_OPERATION_INFORMATION PostOperationInfo;
-    PAGED_CODE();
-
-    DPRINT("NtQueryValueKey() KH 0x%x, VN '%wZ', KVIC %d, Length %d\n",
-        KeyHandle, ValueName, KeyValueInformationClass, Length);
-
-    /* Verify that the handle is valid and is a registry key */
-    Status = ObReferenceObjectByHandle(KeyHandle,
-                                       KEY_QUERY_VALUE,
-                                       CmpKeyObjectType,
-                                       ExGetPreviousMode(),
-                                       (PVOID *)&KeyObject,
-                                       NULL);
-    if (!NT_SUCCESS(Status))
-    {
-        DPRINT("ObReferenceObjectByHandle() failed with Status = 0x%08X\n");
-        return Status;
-    }
-
-    /* Setup the callback */
-    PostOperationInfo.Object = (PVOID)KeyObject;
-    QueryValueKeyInfo.Object = (PVOID)KeyObject;
-    QueryValueKeyInfo.ValueName = ValueName;
-    QueryValueKeyInfo.KeyValueInformationClass = KeyValueInformationClass;
-    QueryValueKeyInfo.Length = Length;
-    QueryValueKeyInfo.ResultLength = ResultLength;
-
-    /* Do the callback */
-    Status = CmiCallRegisteredCallbacks(RegNtPreQueryValueKey, &QueryValueKeyInfo);
-    if (NT_SUCCESS(Status))
-    {
-        /* Call the internal API */
-        Status = CmQueryValueKey(KeyObject->KeyControlBlock,
-                                 *ValueName,
-                                 KeyValueInformationClass,
-                                 KeyValueInformation,
-                                 Length,
-                                 ResultLength);
-
-        /* Do the post callback */
-        PostOperationInfo.Status = Status;
-        CmiCallRegisteredCallbacks(RegNtPostQueryValueKey, &PostOperationInfo);
-    }
-
-    DPRINT("NtQueryValueKey() returning 0x%08X\n", Status);
-
-    /* Dereference and return status */
-    ObDereferenceObject(KeyObject);
-    return Status;
-}
-
-NTSTATUS
-NTAPI
-NtSetValueKey(IN HANDLE KeyHandle,
-              IN PUNICODE_STRING ValueName,
-              IN ULONG TitleIndex,
-              IN ULONG Type,
-              IN PVOID Data,
-              IN ULONG DataSize)
-{
-    NTSTATUS Status;
-    PKEY_OBJECT KeyObject;
-    REG_SET_VALUE_KEY_INFORMATION SetValueKeyInfo;
-    REG_POST_OPERATION_INFORMATION PostOperationInfo;
-    PAGED_CODE();
-
-    DPRINT("NtSetValueKey() KH 0x%x, VN '%wZ', TI %x, T %d, DS %d\n",
-        KeyHandle, ValueName, TitleIndex, Type, DataSize);
-
-    /* Verify that the handle is valid and is a registry key */
-    Status = ObReferenceObjectByHandle(KeyHandle,
-                                       KEY_SET_VALUE,
-                                       CmpKeyObjectType,
-                                       ExGetPreviousMode(),
-                                       (PVOID *)&KeyObject,
-                                       NULL);
-    if (!NT_SUCCESS(Status))
-    {
-        DPRINT1("ObReferenceObjectByHandle() failed with Status = 0x%08X\n", Status);
-        return Status;
-    }
-
-    /* Setup callback */
-    PostOperationInfo.Object = (PVOID)KeyObject;
-    SetValueKeyInfo.Object = (PVOID)KeyObject;
-    SetValueKeyInfo.ValueName = ValueName;
-    SetValueKeyInfo.TitleIndex = TitleIndex;
-    SetValueKeyInfo.Type = Type;
-    SetValueKeyInfo.Data = Data;
-    SetValueKeyInfo.DataSize = DataSize;
-
-    /* Do the callback */
-    Status = CmiCallRegisteredCallbacks(RegNtPreSetValueKey, &SetValueKeyInfo);
-    if (NT_SUCCESS(Status))
-    {        
-        /* Call the internal API */
-        Status = CmSetValueKey(KeyObject->KeyControlBlock,
-                               ValueName,
-                               Type,
-                               Data,
-                               DataSize);
-    }
-
-    /* Do the post-callback and de-reference the key object */
-    PostOperationInfo.Status = Status;
-    CmiCallRegisteredCallbacks(RegNtPostSetValueKey, &PostOperationInfo);
-    ObDereferenceObject(KeyObject);
-
-    /* Synchronize the hives and return */
-    CmiSyncHives();
-    return Status;
-}
-
-NTSTATUS
-NTAPI
-NtDeleteValueKey(IN HANDLE KeyHandle,
-                 IN PUNICODE_STRING ValueName)
-{
-    PKEY_OBJECT KeyObject;
-    NTSTATUS Status;
-    REG_DELETE_VALUE_KEY_INFORMATION DeleteValueKeyInfo;
-    REG_POST_OPERATION_INFORMATION PostOperationInfo;
-    KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
-    PAGED_CODE();
-
-    /* Verify that the handle is valid and is a registry key */
-    Status = ObReferenceObjectByHandle(KeyHandle,
-                                       KEY_SET_VALUE,
-                                       CmpKeyObjectType,
-                                       PreviousMode,
-                                       (PVOID *)&KeyObject,
-                                       NULL);
-    if (!NT_SUCCESS(Status))
-    {
-        DPRINT("ObReferenceObjectByHandle() failed with Status = 0x%08X\n");
-        return Status;
-    }
-
-    /* Do the callback */
-    DeleteValueKeyInfo.Object = (PVOID)KeyObject;
-    DeleteValueKeyInfo.ValueName = ValueName;
-    Status = CmiCallRegisteredCallbacks(RegNtPreDeleteValueKey,
-                                        &DeleteValueKeyInfo);
-    if (NT_SUCCESS(Status))
-    {
-        /* Call the internal API */
-        Status = CmDeleteValueKey(KeyObject->KeyControlBlock, *ValueName);
-
-        /* Do the post callback */
-        PostOperationInfo.Object = (PVOID)KeyObject;
-        PostOperationInfo.Status = Status;
-        CmiCallRegisteredCallbacks(RegNtPostDeleteValueKey,
-                                   &PostOperationInfo);
-    }
-
-    /* Dereference the key body and synchronize the hives */
-    ObDereferenceObject(KeyObject);
-    CmiSyncHives();
-    return Status;
-}
-
-NTSTATUS
-NTAPI
-NtCompactKeys(IN ULONG Count,
-              IN PHANDLE KeyArray)
-{
-    UNIMPLEMENTED;
-    return STATUS_NOT_IMPLEMENTED;
-}
-
-NTSTATUS
-NTAPI
-NtCompressKey(IN HANDLE Key)
-{
-    UNIMPLEMENTED;
-    return STATUS_NOT_IMPLEMENTED;
-}
-
-NTSTATUS
-NTAPI
-NtLoadKey(IN POBJECT_ATTRIBUTES KeyObjectAttributes,
-          IN POBJECT_ATTRIBUTES FileObjectAttributes)
-{
-    return NtLoadKey2(KeyObjectAttributes, FileObjectAttributes, 0);
-}
-
-NTSTATUS
-NTAPI
-NtLoadKeyEx(IN POBJECT_ATTRIBUTES TargetKey,
-            IN POBJECT_ATTRIBUTES SourceFile,
-            IN ULONG Flags,
-            IN HANDLE TrustClassKey,
-            IN HANDLE Event,
-            IN ACCESS_MASK DesiredAccess,
-            OUT PHANDLE RootHandle)
-{
-    UNIMPLEMENTED;
-    return STATUS_NOT_IMPLEMENTED;
-}
-
-NTSTATUS
-NTAPI
-NtLockProductActivationKeys(IN PULONG pPrivateVer,
-                            IN PULONG pSafeMode)
-{
-    UNIMPLEMENTED;
-    return STATUS_NOT_IMPLEMENTED;
-}
-
-NTSTATUS
-NTAPI
-NtLockRegistryKey(IN HANDLE KeyHandle)
-{
-    UNIMPLEMENTED;
-    return STATUS_NOT_IMPLEMENTED;
-}
-
-NTSTATUS
-NTAPI
-NtNotifyChangeMultipleKeys(IN HANDLE MasterKeyHandle,
-                           IN ULONG Count,
-                           IN POBJECT_ATTRIBUTES SlaveObjects,
-                           IN HANDLE Event,
-                           IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
-                           IN PVOID ApcContext OPTIONAL,
-                           OUT PIO_STATUS_BLOCK IoStatusBlock,
-                           IN ULONG CompletionFilter,
-                           IN BOOLEAN WatchTree,
-                           OUT PVOID Buffer,
-                           IN ULONG Length,
-                           IN BOOLEAN Asynchronous)
-{
-    UNIMPLEMENTED;
-    return STATUS_NOT_IMPLEMENTED;
-}
-
-NTSTATUS
-NTAPI
-NtNotifyChangeKey(IN HANDLE KeyHandle,
-                  IN HANDLE Event,
-                  IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
-                  IN PVOID ApcContext OPTIONAL,
-                  OUT PIO_STATUS_BLOCK IoStatusBlock,
-                  IN ULONG CompletionFilter,
-                  IN BOOLEAN WatchTree,
-                  OUT PVOID Buffer,
-                  IN ULONG Length,
-                  IN BOOLEAN Asynchronous)
-{
-     return NtNotifyChangeMultipleKeys(KeyHandle,
-                                       0,
-                                       NULL,
-                                       Event,
-                                       ApcRoutine,
-                                       ApcContext,
-                                       IoStatusBlock,
-                                       CompletionFilter,
-                                       WatchTree,
-                                       Buffer,
-                                       Length,
-                                       Asynchronous);
-}
-
-NTSTATUS
-NTAPI
-NtQueryMultipleValueKey(IN HANDLE KeyHandle,
-                        IN OUT PKEY_VALUE_ENTRY ValueList,
-                        IN ULONG NumberOfValues,
-                        OUT PVOID Buffer,
-                        IN OUT PULONG Length,
-                        OUT PULONG ReturnLength)
-{
-    UNIMPLEMENTED;
-    return STATUS_NOT_IMPLEMENTED;
-}
-
-NTSTATUS
-NTAPI
-NtQueryOpenSubKeys(IN POBJECT_ATTRIBUTES TargetKey,
-                   IN ULONG HandleCount)
-{
-    UNIMPLEMENTED;
-    return STATUS_NOT_IMPLEMENTED;
-}
-
-NTSTATUS
-NTAPI
-NtQueryOpenSubKeysEx(IN POBJECT_ATTRIBUTES TargetKey,
-                     IN ULONG BufferLength,
-                     IN PVOID Buffer,
-                     IN PULONG RequiredSize)
-{
-    UNIMPLEMENTED;
-    return STATUS_NOT_IMPLEMENTED;
-}
-
-NTSTATUS
-NTAPI
-NtReplaceKey(IN POBJECT_ATTRIBUTES ObjectAttributes,
-             IN HANDLE Key,
-             IN POBJECT_ATTRIBUTES ReplacedObjectAttributes)
-{
-    UNIMPLEMENTED;
-    return STATUS_NOT_IMPLEMENTED;
-}
-
-NTSTATUS
-NTAPI
-NtRestoreKey(IN HANDLE KeyHandle,
-             IN HANDLE FileHandle,
-             IN ULONG RestoreFlags)
-{
-    UNIMPLEMENTED;
-    return STATUS_NOT_IMPLEMENTED;
-}
-
-NTSTATUS
-NTAPI
-NtSaveKey(IN HANDLE KeyHandle,
-          IN HANDLE FileHandle)
-{
-    UNIMPLEMENTED;
-    return STATUS_NOT_IMPLEMENTED;
-}
-
-NTSTATUS
-NTAPI
-NtSaveKeyEx(IN HANDLE KeyHandle,
-            IN HANDLE FileHandle,
-            IN ULONG Flags)
-{
-    UNIMPLEMENTED;
-    return STATUS_NOT_IMPLEMENTED;
-}
-
-NTSTATUS
-NTAPI
-NtSaveMergedKeys(IN HANDLE HighPrecedenceKeyHandle,
-                 IN HANDLE LowPrecedenceKeyHandle,
-                 IN HANDLE FileHandle)
-{
-    UNIMPLEMENTED;
-    return STATUS_NOT_IMPLEMENTED;
-}
-
-NTSTATUS
-NTAPI
-NtSetInformationKey(IN HANDLE KeyHandle,
-                    IN KEY_SET_INFORMATION_CLASS KeyInformationClass,
-                    IN PVOID KeyInformation,
-                    IN ULONG KeyInformationLength)
-{
-    UNIMPLEMENTED;
-    return STATUS_NOT_IMPLEMENTED;
-}
-
-NTSTATUS
-NTAPI
-NtUnloadKey(IN POBJECT_ATTRIBUTES KeyObjectAttributes)
-{
-    UNIMPLEMENTED;
-    return STATUS_NOT_IMPLEMENTED;
-}
-
-NTSTATUS
-NTAPI
-NtUnloadKey2(IN POBJECT_ATTRIBUTES TargetKey,
-             IN ULONG Flags)
-{
-    UNIMPLEMENTED;
-    return STATUS_NOT_IMPLEMENTED;
-}
-
-NTSTATUS
-NTAPI
-NtUnloadKeyEx(IN POBJECT_ATTRIBUTES TargetKey,
-              IN HANDLE Event)
-{
-    UNIMPLEMENTED;
-    return STATUS_NOT_IMPLEMENTED;
-}
-
 /* EOF */

Modified: trunk/reactos/ntoskrnl/cm/regfile.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/cm/regfile.c?rev=30079&r1=30078&r2=30079&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/cm/regfile.c (original)
+++ trunk/reactos/ntoskrnl/cm/regfile.c Sat Nov  3 02:12:22 2007
@@ -36,7 +36,7 @@
     if (Flags & ~REG_NO_LAZY_FLUSH) return STATUS_INVALID_PARAMETER;
 
     Status = CmpInitHiveFromFile(FileName,
-                                 (Flags & REG_NO_LAZY_FLUSH) ? HIVE_NO_SYNCH : 0,
+                                 (Flags & REG_NO_LAZY_FLUSH) ? HIVE_NOLAZYFLUSH : 0,
                                  &Hive,
                                  &Allocate,
                                  0);
@@ -72,7 +72,7 @@
     NTSTATUS Status;
     ULONG Disposition;
 
-    ASSERT(!IsNoFileHive(RegistryHive));
+    ASSERT(!RegistryHive->Hive.HiveFlags & HIVE_VOLATILE);
 
     if (RtlFindSetBits(&RegistryHive->Hive.DirtyVector, 1, 0) == ~0)
     {

Modified: trunk/reactos/ntoskrnl/cm/registry.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/cm/registry.c?rev=30079&r1=30078&r2=30079&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/cm/registry.c (original)
+++ trunk/reactos/ntoskrnl/cm/registry.c Sat Nov  3 02:12:22 2007
@@ -535,6 +535,7 @@
 }
 
 VOID
+NTAPI
 CmShutdownRegistry(VOID)
 {
     PCMHIVE Hive;

Modified: trunk/reactos/ntoskrnl/config/cm.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/config/cm.h?rev=30079&r1=30078&r2=30079&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/config/cm.h (original)
+++ trunk/reactos/ntoskrnl/config/cm.h Sat Nov  3 02:12:22 2007
@@ -502,7 +502,6 @@
 #define SYSTEM_LOG_FILE         L"\\SystemRoot\\System32\\Config\\SYSTEM.log"
 #define REG_SYSTEM_KEY_NAME     L"\\Registry\\Machine\\SYSTEM"
 #define REG_HARDWARE_KEY_NAME   L"\\Registry\\Machine\\HARDWARE"
-#define IsNoFileHive(Hive)      ((Hive)->Flags & HIVE_NO_FILE)
 typedef struct _KEY_OBJECT
 {
     ULONG Type;
@@ -515,16 +514,9 @@
 } KEY_OBJECT, *PKEY_OBJECT;
 extern PCMHIVE CmiVolatileHive;
 extern LIST_ENTRY CmiKeyObjectListHead, CmiConnectedHiveList;
-extern KTIMER CmiWorkerTimer;
-VOID NTAPI CmiWorkerThread(IN PVOID Param);
 PVOID NTAPI CmpRosGetHardwareHive(OUT PULONG Length);
 NTSTATUS CmiCallRegisteredCallbacks(IN REG_NOTIFY_CLASS Argument1, IN PVOID Argument2);
-ULONG CmiGetMaxNameLength(IN PHHIVE RegistryHive, IN PCM_KEY_NODE KeyCell);
-ULONG CmiGetMaxClassLength(IN PHHIVE RegistryHive, IN PCM_KEY_NODE KeyCell);
-ULONG CmiGetMaxValueNameLength(IN PHHIVE RegistryHive, IN PCM_KEY_NODE KeyCell);
-ULONG CmiGetMaxValueDataLength(IN PHHIVE RegistryHive, IN PCM_KEY_NODE KeyCell);
 VOID CmiSyncHives(VOID);
-#define HIVE_NO_FILE    0x00000002
 ///////////////////////////////////////////////////////////////////////////////
 
 //
@@ -785,6 +777,12 @@
 
 VOID
 NTAPI
+CmpLockRegistry(
+    VOID
+);
+
+VOID
+NTAPI
 CmpUnlockRegistry(
     VOID
 );
@@ -855,6 +853,12 @@
 
 VOID
 NTAPI
+CmpRemoveKeyControlBlock(
+    IN PCM_KEY_CONTROL_BLOCK Kcb
+);
+
+VOID
+NTAPI
 CmpCleanUpKcbCacheWithLock(
     IN PCM_KEY_CONTROL_BLOCK Kcb,
     IN BOOLEAN LockHeldExclusively
@@ -957,8 +961,26 @@
 //
 BOOLEAN
 NTAPI
-CmpFlushEntireRegistry(
+CmpDoFlushAll(
     IN BOOLEAN ForceFlush
+);
+
+VOID
+NTAPI
+CmpShutdownWorkers(
+    VOID
+);
+
+VOID
+NTAPI
+CmpCmdInit(
+    IN BOOLEAN SetupBoot
+);
+
+VOID
+NTAPI
+CmpLazyFlush(
+    VOID
 );
 
 //
@@ -1267,6 +1289,13 @@
 NTAPI
 CmDeleteKey(
     IN PCM_KEY_CONTROL_BLOCK Kcb
+);
+
+NTSTATUS
+NTAPI
+CmFlushKey(
+    IN PCM_KEY_CONTROL_BLOCK Kcb,
+    IN BOOLEAN EclusiveLock
 );
 
 NTSTATUS
@@ -1326,6 +1355,9 @@
 extern BOOLEAN InitIsWinPEMode;
 extern ULONG CmpHashTableSize;
 extern ULONG CmpDelayedCloseSize, CmpDelayedCloseIndex;
+extern BOOLEAN CmpNoWrite;
+extern BOOLEAN CmpForceForceFlush;
+extern BOOLEAN CmpWasSetupBoot;
 
 //
 // Inlined functions

Modified: trunk/reactos/ntoskrnl/config/cmapi.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/config/cmapi.c?rev=30079&r1=30078&r2=30079&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/config/cmapi.c (original)
+++ trunk/reactos/ntoskrnl/config/cmapi.c Sat Nov  3 02:12:22 2007
@@ -14,6 +14,59 @@
 #include "debug.h"
 
 /* FUNCTIONS *****************************************************************/
+
+BOOLEAN
+NTAPI
+CmpDoFlushAll(IN BOOLEAN ForceFlush)
+{
+    NTSTATUS Status;
+    PLIST_ENTRY NextEntry;
+    PCMHIVE Hive;
+    BOOLEAN Result = TRUE;    
+
+    /* Make sure that the registry isn't read-only now */
+    if (CmpNoWrite) return TRUE;
+    
+    /* Otherwise, acquire the hive list lock and disable force flush */
+    CmpForceForceFlush = FALSE;
+    ExAcquirePushLockShared(&CmpHiveListHeadLock);
+    
+    /* Loop the hive list */
+    NextEntry = CmpHiveListHead.Flink;
+    while (NextEntry != &CmpHiveListHead)
+    {
+        /* Get the hive */
+        Hive = CONTAINING_RECORD(NextEntry, CMHIVE, HiveList);
+        if (!(Hive->Hive.HiveFlags & HIVE_NOLAZYFLUSH))
+        {
+            /* Find out why this is needed? [Aleksey] */
+            ULONG Disposition;
+            Status = CmpOpenHiveFiles(&Hive->FileFullPath,
+                                      L".LOG",
+                                      &Hive->FileHandles[HFILE_TYPE_PRIMARY],
+                                      &Hive->FileHandles[HFILE_TYPE_LOG],
+                                      &Disposition,
+                                      &Disposition,
+                                      FALSE,
+                                      FALSE,
+                                      TRUE,
+                                      NULL);
+
+            /* Do the sync */
+            DPRINT1("Flushing: %wZ\n", &Hive->FileFullPath);
+            DPRINT1("Handle: %lx\n", Hive->FileHandles[HFILE_TYPE_PRIMARY]);
+            Status = HvSyncHive(&Hive->Hive);
+            if (!NT_SUCCESS(Status)) Result = FALSE;
+        }
+
+        /* Try the next entry */
+        NextEntry = NextEntry->Flink;
+    }
+    
+    /* Release lock and return */
+    ExReleasePushLock(&CmpHiveListHeadLock);
+    return Result;
+}
 
 NTSTATUS
 NTAPI
@@ -1029,6 +1082,17 @@
         Status = STATUS_CANNOT_DELETE;
         goto Quickie;
     }
+    
+    /* Check if we're already being deleted */
+    if (Kcb->Delete)
+    {
+        /* Don't do it twice */
+        Status = STATUS_SUCCESS;
+        goto Quickie;
+    }
+    
+    /* Sanity check */
+    ASSERT(Node->Flags == Kcb->Flags);
 
     /* Check if we don't have any children */
     if (!(Node->SubKeyCounts[Stable] + Node->SubKeyCounts[Volatile]))
@@ -1042,15 +1106,23 @@
             Parent = (PCM_KEY_NODE)HvGetCell(Hive, ParentCell);
             if (Parent)
             {
+                /* Update the maximum name length */
+                Kcb->ParentKcb->KcbMaxNameLen = Parent->MaxNameLen;
+                
                 /* Make sure we're dirty */
                 ASSERT(HvIsCellDirty(Hive, ParentCell));
 
                 /* Update the write time */
                 KeQuerySystemTime(&Parent->LastWriteTime);
+                KeQuerySystemTime(&Kcb->ParentKcb->KcbLastWriteTime);
 
                 /* Release the cell */
                 HvReleaseCell(Hive, ParentCell);
             }
+            
+            /* Set the KCB in delete mode and remove it */
+            Kcb->Delete = TRUE;
+            CmpRemoveKeyControlBlock(Kcb);
 
             /* Clear the cell */
             Kcb->KeyCell = HCELL_NIL;
@@ -1062,14 +1134,9 @@
         Status = STATUS_CANNOT_DELETE;
     }
     
-    /* Make sure we're file-backed */
-    if (!(IsNoFileHive((PCMHIVE)Kcb->KeyHive)) ||
-        !(IsNoFileHive((PCMHIVE)Kcb->ParentKcb->KeyHive)))
-    {
-        /* Sync up the hives */
-        CmiSyncHives();
-    }
-
+    /* Flush the registry */
+    CmiSyncHives();    
+    
 Quickie:
     /* Release the cell */
     HvReleaseCell(Hive, Cell);
@@ -1079,3 +1146,36 @@
     KeLeaveCriticalRegion();
     return Status;
 }
+
+NTSTATUS
+NTAPI
+CmFlushKey(IN PCM_KEY_CONTROL_BLOCK Kcb,
+           IN BOOLEAN EclusiveLock)
+{
+    PCMHIVE CmHive;
+    NTSTATUS Status;
+    PHHIVE Hive;
+    
+    /* Get the hives */
+    Hive = Kcb->KeyHive;
+    CmHive = (PCMHIVE)Hive;
+    
+    /* Check if this is the master hive */
+    if (CmHive == CmiVolatileHive)
+    {
+        /* Flush all the hives instead */
+        CmpDoFlushAll(FALSE);
+    }
+    else
+    {
+        /* Flush only this hive */
+        if (!HvSyncHive(Hive))
+        {
+            /* Fail */
+            Status = STATUS_REGISTRY_IO_FAILED;
+        }
+    }
+    
+    /* Return the status */
+    return Status;
+}

Added: trunk/reactos/ntoskrnl/config/cmlazy.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/config/cmlazy.c?rev=30079&view=auto
==============================================================================
--- trunk/reactos/ntoskrnl/config/cmlazy.c (added)
+++ trunk/reactos/ntoskrnl/config/cmlazy.c Sat Nov  3 02:12:22 2007
@@ -1,0 +1,252 @@
+/*
+ * PROJECT:         ReactOS Kernel
+ * LICENSE:         GPL - See COPYING in the top level directory
+ * FILE:            ntoskrnl/config/cmapi.c
+ * PURPOSE:         Configuration Manager - Internal Registry APIs
+ * PROGRAMMERS:     Alex Ionescu (alex.ionescu at reactos.org)
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include "ntoskrnl.h"
+#include "cm.h"
+#define NDEBUG
+#include "debug.h"
+
+/* GLOBALS ********************************************************************/
+
+KTIMER CmpLazyFlushTimer;
+KDPC CmpLazyFlushDpc;
+WORK_QUEUE_ITEM CmpLazyWorkItem;
+KTIMER CmpEnableLazyFlushTimer;
+KDPC CmpEnableLazyFlushDpc;
+BOOLEAN CmpLazyFlushPending;
+BOOLEAN CmpForceForceFlush;
+BOOLEAN CmpHoldLazyFlush = TRUE;
+ULONG CmpLazyFlushIntervalInSeconds = 5;
+ULONG CmpLazyFlushHiveCount = 7;
+ULONG CmpLazyFlushCount = 1;
+LONG CmpFlushStarveWriters;
+
+/* FUNCTIONS ******************************************************************/
+
+BOOLEAN
+NTAPI
+CmpDoFlushNextHive(IN BOOLEAN ForceFlush,
+                   OUT PBOOLEAN Error,
+                   OUT PULONG DirtyCount)
+{
+    NTSTATUS Status;
+    PLIST_ENTRY NextEntry;
+    PCMHIVE CmHive;
+    BOOLEAN Result;    
+    ULONG HiveCount = CmpLazyFlushHiveCount;
+
+    /* Set Defaults */
+    *Error = FALSE;
+    *DirtyCount = 0;
+    
+    /* Don't do anything if we're not supposed to */
+    if (CmpNoWrite) return TRUE;
+
+    /* Make sure we have to flush at least one hive */
+    if (!HiveCount) HiveCount = 1;
+
+    /* Don't force flush */
+    CmpForceForceFlush = FALSE;
+
+    /* Acquire the list lock and loop */
+    ExAcquirePushLockShared(&CmpHiveListHeadLock);
+    NextEntry = CmpHiveListHead.Flink;
+    while (NextEntry != &CmpHiveListHead)
+    {
+        /* Get the hive and check if we should flush it */
+        CmHive = CONTAINING_RECORD(NextEntry, CMHIVE, HiveList);
+        if (!(CmHive->Hive.HiveFlags & HIVE_NOLAZYFLUSH) &&
+            (CmHive->FlushCount != CmpLazyFlushCount))
+        {
+            /* Great sucess! */
+            Result = TRUE;
+            
+            /* Ignore clean or volatile hves */
+            if (!(CmHive->Hive.DirtyCount) ||
+                (CmHive->Hive.HiveFlags & HIVE_VOLATILE))
+            {
+                /* Don't do anything but do update the count */
+                CmHive->FlushCount = CmpLazyFlushCount;
+            }
+            else
+            {
+                /* Do the sync */
+                DPRINT1("Flushing: %wZ\n", CmHive->FileFullPath);
+                DPRINT1("Handle: %lx\n", CmHive->FileHandles[HFILE_TYPE_PRIMARY]);
+                Status = HvSyncHive(&CmHive->Hive);
+                if(!NT_SUCCESS(Status))
+                {
+                    /* Let them know we failed */
+                    *Error = TRUE;
+                    Result = FALSE;
+                }
+            }
+        }
+        else if ((CmHive->Hive.DirtyCount) &&
+                 (!(CmHive->Hive.HiveFlags & HIVE_VOLATILE)) &&
+                 (!(CmHive->Hive.HiveFlags & HIVE_NOLAZYFLUSH)))
+        {
+            /* Use another lazy flusher for this hive */
+            ASSERT(CmHive->FlushCount == CmpLazyFlushCount);
+            *DirtyCount += CmHive->Hive.DirtyCount;
+        }
+
+        /* Try the next one */
+        NextEntry = NextEntry->Flink;
+    }
+    
+    /* Check if we've flushed everything */
+    if (NextEntry == &CmpHiveListHead)
+    {
+        /* We have, tell the caller we're done */
+        Result = FALSE;
+    }
+    else
+    {
+        /* We need to be called again */
+        Result = TRUE;
+    }
+    
+    /* Unlock the list and return the result */
+    ExReleasePushLock(&CmpHiveListHeadLock);
+    return Result;
+}
+
+VOID
+NTAPI
+CmpEnableLazyFlushDpcRoutine(IN PKDPC Dpc,
+                             IN PVOID DeferredContext,
+                             IN PVOID SystemArgument1,
+                             IN PVOID SystemArgument2)
+{
+    /* Don't stop lazy flushing from happening anymore */
+    CmpHoldLazyFlush = FALSE;
+}
+
+VOID
+NTAPI
+CmpLazyFlushDpcRoutine(IN PKDPC Dpc,
+                       IN PVOID DeferredContext,
+                       IN PVOID SystemArgument1,
+                       IN PVOID SystemArgument2)
+{
+    /* Check if we should queue the lazy flush worker */
+    if ((!CmpLazyFlushPending) && (!CmpHoldLazyFlush))
+    {
+        CmpLazyFlushPending = TRUE;
+        ExQueueWorkItem(&CmpLazyWorkItem, DelayedWorkQueue);
+    }
+}
+
+VOID
+NTAPI
+CmpLazyFlush(VOID)
+{
+    LARGE_INTEGER DueTime;
+    PAGED_CODE();
+    
+    /* Check if we should set the lazy flush timer */
+    if ((!CmpNoWrite) && (!CmpHoldLazyFlush))
+    {
+        /* Do it */
+        DueTime.QuadPart = Int32x32To64(CmpLazyFlushIntervalInSeconds,
+                                        -10 * 1000 * 1000);
+        KeSetTimer(&CmpLazyFlushTimer, DueTime, &CmpLazyFlushDpc);
+    }
+}
+
+VOID
+NTAPI
+CmpLazyFlushWorker(IN PVOID Parameter)
+{
+    BOOLEAN ForceFlush, Result, MoreWork = FALSE;
+    ULONG DirtyCount = 0;
+    PAGED_CODE();
+
+    /* Don't do anything if lazy flushing isn't enabled yet */
+    if (CmpHoldLazyFlush) return;
+    
+    /* Check if we are forcing a flush */
+    ForceFlush = CmpForceForceFlush;
+    if (ForceFlush)
+    {
+        /* Lock the registry exclusively */
+        CmpLockRegistryExclusive();
+    }
+    else
+    {
+        /* Do a normal lock */
+        CmpLockRegistry();
+        InterlockedIncrement(&CmpFlushStarveWriters);
+    }
+    
+    /* Flush the next hive */
+    MoreWork = CmpDoFlushNextHive(ForceFlush, &Result, &DirtyCount);     
+    if (!MoreWork)
+    {
+        /* We're done */
+        InterlockedIncrement((PLONG)&CmpLazyFlushCount);
+    }
+
+    /* Check if we have starved writers */
+    if (!ForceFlush) InterlockedDecrement(&CmpFlushStarveWriters);
+
+    /* Not pending anymore, release the registry lock */
+    CmpLazyFlushPending = FALSE;
+    CmpUnlockRegistry();
+    
+    /* Check if we need to flush another hive */
+    if ((MoreWork) || (DirtyCount)) CmpLazyFlush();
+}
+
+VOID
+NTAPI
+CmpCmdInit(IN BOOLEAN SetupBoot)
+{
+    LARGE_INTEGER DueTime;  
+    PAGED_CODE();
+    
+    /* Setup the lazy DPC */
+    KeInitializeDpc(&CmpLazyFlushDpc, CmpLazyFlushDpcRoutine, NULL);
+    
+    /* Setup the lazy timer */
+    KeInitializeTimer(&CmpLazyFlushTimer);
+    
+    /* Setup the lazy worker */
+    ExInitializeWorkItem(&CmpLazyWorkItem, CmpLazyFlushWorker, NULL);
+
+    /* Setup the forced-lazy DPC and timer */
+    KeInitializeDpc(&CmpEnableLazyFlushDpc,
+                    CmpEnableLazyFlushDpcRoutine,
+                    NULL);
+    KeInitializeTimer(&CmpEnableLazyFlushTimer);
+    
+    /* Enable lazy flushing after 10 minutes */
+    DueTime.QuadPart = Int32x32To64(600, -10 * 1000 * 1000);
+    KeSetTimer(&CmpEnableLazyFlushTimer, DueTime, &CmpEnableLazyFlushDpc);
+
+    /* Setup flush variables */
+    CmpNoWrite = CmpMiniNTBoot;    
+    CmpWasSetupBoot = SetupBoot;
+    
+    /* Testing: Force Lazy Flushing */
+    CmpHoldLazyFlush = FALSE;
+}
+
+VOID
+NTAPI
+CmpShutdownWorkers(VOID)
+{
+    /* Stop lazy flushing */
+    PAGED_CODE();
+    KeCancelTimer(&CmpLazyFlushTimer);
+}
+
+/* EOF */

Propchange: trunk/reactos/ntoskrnl/config/cmlazy.c
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: trunk/reactos/ntoskrnl/config/cmsysini.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/config/cmsysini.c?rev=30079&r1=30078&r2=30079&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/config/cmsysini.c (original)
+++ trunk/reactos/ntoskrnl/config/cmsysini.c Sat Nov  3 02:12:22 2007
@@ -23,6 +23,7 @@
 BOOLEAN CmpSpecialBootCondition;
 BOOLEAN CmpNoWrite;
 BOOLEAN CmpForceForceFlush;
+BOOLEAN CmpWasSetupBoot;
 
 /* FUNCTIONS *****************************************************************/
 
@@ -810,7 +811,7 @@
     /* Build the master hive */
     Status = CmpInitializeHive((PCMHIVE*)&CmiVolatileHive,
                                HINIT_CREATE,
-                               HIVE_VOLATILE | HIVE_NO_FILE,
+                               HIVE_VOLATILE,
                                HFILE_TYPE_PRIMARY,
                                NULL,
                                NULL,
@@ -900,7 +901,7 @@
     ((PHBASE_BLOCK)BaseAddress)->Length = Length;
     Status = CmpInitializeHive((PCMHIVE*)&HardwareHive,
                                HINIT_MEMORY, //HINIT_CREATE,
-                               HIVE_NO_FILE, //HIVE_VOLATILE,
+                               HIVE_VOLATILE,
                                HFILE_TYPE_PRIMARY,
                                BaseAddress, // NULL,
                                NULL,
@@ -972,6 +973,26 @@
     RtlGetCallersAddress(&CmpRegistryLockCaller, &CmpRegistryLockCallerCaller);
 }
 
+VOID
+NTAPI
+CmpLockRegistry(VOID)
+{
+    /* Enter a critical region */
+    KeEnterCriticalRegion();
+    
+    /* Check if we have to starve writers */
+    if (CmpFlushStarveWriters)
+    {
+        /* Starve exlusive waiters */
+        ExAcquireSharedStarveExclusive(&CmpRegistryLock, TRUE);
+    }
+    else
+    {
+        /* Just grab the lock */
+        ExAcquireResourceSharedLite(&CmpRegistryLock, TRUE);
+    }
+}
+
 BOOLEAN
 NTAPI
 CmpTestRegistryLock(VOID)
@@ -1002,7 +1023,7 @@
         CMP_ASSERT_EXCLUSIVE_REGISTRY_LOCK();
         
         /* Flush the registry */
-        CmpFlushEntireRegistry(TRUE);
+        CmpDoFlushAll(TRUE);
         CmpFlushOnLockRelease = FALSE;
     }
     
@@ -1011,27 +1032,11 @@
     KeLeaveCriticalRegion();
 }
 
-BOOLEAN
-NTAPI
-CmpFlushEntireRegistry(IN BOOLEAN ForceFlush)
-{
-    BOOLEAN Flushed = TRUE;
-    
-    /* Make sure that the registry isn't read-only now */
-    if (CmpNoWrite) return TRUE;
-    
-    /* Otherwise, acquire the hive list lock and disable force flush */
-    CmpForceForceFlush = FALSE;
-    ExAcquirePushLockShared(&CmpHiveListHeadLock);
-    
-    /* Check if the hive list isn't empty */
-    if (!IsListEmpty(&CmpHiveListHead))
-    {
-        /* FIXME: TODO */
-        ASSERT(FALSE);
-    }
-    
-    /* Release the lock and return the flush state */
-    ExReleasePushLock(&CmpHiveListHeadLock);
-    return Flushed;
-}
+VOID
+NTAPI
+CmShutdownSystem(VOID)
+{
+    /* Kill the workers and fush all hives */
+    CmpShutdownWorkers();
+    CmpDoFlushAll(TRUE);
+}

Added: trunk/reactos/ntoskrnl/config/ntapi.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/config/ntapi.c?rev=30079&view=auto
==============================================================================
--- trunk/reactos/ntoskrnl/config/ntapi.c (added)
+++ trunk/reactos/ntoskrnl/config/ntapi.c Sat Nov  3 02:12:22 2007
@@ -1,0 +1,649 @@
+/*
+ * PROJECT:         ReactOS Kernel
+ * LICENSE:         GPL - See COPYING in the top level directory
+ * FILE:            ntoskrnl/config/cmapi.c
+ * PURPOSE:         Configuration Manager - Internal Registry APIs
+ * PROGRAMMERS:     Alex Ionescu (alex.ionescu at reactos.org)
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include "ntoskrnl.h"
+#include "cm.h"
+#define NDEBUG
+#include "debug.h"
+
+/* FUNCTIONS *****************************************************************/
+
+NTSTATUS
+NTAPI
+NtDeleteKey(IN HANDLE KeyHandle)
+{
+    PKEY_OBJECT KeyObject;
+    NTSTATUS Status;
+    REG_DELETE_KEY_INFORMATION DeleteKeyInfo;
+    REG_POST_OPERATION_INFORMATION PostOperationInfo;
+    PAGED_CODE();
+
+    DPRINT("NtDeleteKey(KH 0x%p)\n", KeyHandle);
+
+    /* Verify that the handle is valid and is a registry key */
+    Status = ObReferenceObjectByHandle(KeyHandle,
+                                       DELETE,
+                                       CmpKeyObjectType,
+                                       ExGetPreviousMode(),
+                                       (PVOID *)&KeyObject,
+                                       NULL);
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT("ObReferenceObjectByHandle() failed with Status = 0x%08X\n");
+        return Status;
+    }
+
+    /* Setup the callback */
+    PostOperationInfo.Object = (PVOID)KeyObject;
+    DeleteKeyInfo.Object = (PVOID)KeyObject;
+    Status = CmiCallRegisteredCallbacks(RegNtPreDeleteKey, &DeleteKeyInfo);
+    if (NT_SUCCESS(Status))
+    {
+        /* Call the internal API */
+        Status = CmDeleteKey(KeyObject->KeyControlBlock);
+
+        /* Remove the keep-alive reference */
+        ObDereferenceObject(KeyObject);
+        if (KeyObject->KeyControlBlock->KeyHive !=
+            KeyObject->KeyControlBlock->ParentKcb->KeyHive)
+        {
+            /* Dereference again */
+            ObDereferenceObject(KeyObject);
+        }
+
+        /* Do post callback */
+        PostOperationInfo.Status = Status;
+        CmiCallRegisteredCallbacks(RegNtPostDeleteKey, &PostOperationInfo);
+    }
+
+    /* Dereference the object */
+    ObDereferenceObject(KeyObject);
+    return Status;
+}
+
+NTSTATUS
+NTAPI
+NtEnumerateKey(IN HANDLE KeyHandle,
+               IN ULONG Index,
+               IN KEY_INFORMATION_CLASS KeyInformationClass,
+               OUT PVOID KeyInformation,
+               IN ULONG Length,
+               OUT PULONG ResultLength)
+{
+    NTSTATUS Status;
+    PKEY_OBJECT KeyObject;
+    REG_ENUMERATE_KEY_INFORMATION EnumerateKeyInfo;
+    REG_POST_OPERATION_INFORMATION PostOperationInfo;
+    PAGED_CODE();
+
+    DPRINT("NtEnumerateKey() KH 0x%x, Index 0x%x, KIC %d, Length %d\n",
+        KeyHandle, Index, KeyInformationClass, Length);
+
+    /* Verify that the handle is valid and is a registry key */
+    Status = ObReferenceObjectByHandle(KeyHandle,
+                                       KEY_ENUMERATE_SUB_KEYS,
+                                       CmpKeyObjectType,
+                                       ExGetPreviousMode(),
+                                       (PVOID *)&KeyObject,
+                                       NULL);
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT("ObReferenceObjectByHandle() failed with Status = 0x%08X\n");
+        return Status;
+    }
+
+    /* Setup the callback */
+    PostOperationInfo.Object = (PVOID)KeyObject;
+    EnumerateKeyInfo.Object = (PVOID)KeyObject;
+    EnumerateKeyInfo.Index = Index;
+    EnumerateKeyInfo.KeyInformationClass = KeyInformationClass;
+    EnumerateKeyInfo.Length = Length;
+    EnumerateKeyInfo.ResultLength = ResultLength;
+
+    /* Do the callback */
+    Status = CmiCallRegisteredCallbacks(RegNtPreEnumerateKey, &EnumerateKeyInfo);
+    if (NT_SUCCESS(Status))
+    {
+        /* Call the internal API */
+        Status = CmEnumerateKey(KeyObject->KeyControlBlock,
+                                Index,
+                                KeyInformationClass,
+                                KeyInformation,
+                                Length,
+                                ResultLength);
+
+        /* Do the post callback */
+        PostOperationInfo.Status = Status;
+        CmiCallRegisteredCallbacks(RegNtPostEnumerateKey, &PostOperationInfo);
+    }
+
+    /* Dereference and return status */
+    ObDereferenceObject(KeyObject);
+    return Status;
+}
+
+NTSTATUS
+NTAPI
+NtEnumerateValueKey(IN HANDLE KeyHandle,
+                    IN ULONG Index,
+                    IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
+                    OUT PVOID KeyValueInformation,
+                    IN ULONG Length,
+                    OUT PULONG ResultLength)
+{
+    NTSTATUS Status;
+    PKEY_OBJECT KeyObject;
+    REG_ENUMERATE_VALUE_KEY_INFORMATION EnumerateValueKeyInfo;
+    REG_POST_OPERATION_INFORMATION PostOperationInfo;
+    PAGED_CODE();
+
+    DPRINT("NtEnumerateValueKey() KH 0x%x, Index 0x%x, KVIC %d, Length %d\n",
+        KeyHandle, Index, KeyValueInformationClass, Length);
+
+    /* Verify that the handle is valid and is a registry key */
+    Status = ObReferenceObjectByHandle(KeyHandle,
+                                       KEY_QUERY_VALUE,
+                                       CmpKeyObjectType,
+                                       ExGetPreviousMode(),
+                                       (PVOID *)&KeyObject,
+                                       NULL);
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT("ObReferenceObjectByHandle() failed with Status = 0x%08X\n");
+        return Status;
+    }
+
+    /* Setup the callback */
+    PostOperationInfo.Object = (PVOID)KeyObject;
+    EnumerateValueKeyInfo.Object = (PVOID)KeyObject;
+    EnumerateValueKeyInfo.Index = Index;
+    EnumerateValueKeyInfo.KeyValueInformationClass = KeyValueInformationClass;
+    EnumerateValueKeyInfo.KeyValueInformation = KeyValueInformation;
+    EnumerateValueKeyInfo.Length = Length;
+    EnumerateValueKeyInfo.ResultLength = ResultLength;
+
+    /* Do the callback */
+    Status = CmiCallRegisteredCallbacks(RegNtPreEnumerateValueKey,
+                                        &EnumerateValueKeyInfo);
+    if (NT_SUCCESS(Status))
+    {
+        /* Call the internal API */
+        Status = CmEnumerateValueKey(KeyObject->KeyControlBlock,
+                                     Index,
+                                     KeyValueInformationClass,
+                                     KeyValueInformation,
+                                     Length,
+                                     ResultLength);
+
+        /* Do the post callback */
+        PostOperationInfo.Status = Status;
+        CmiCallRegisteredCallbacks(RegNtPostEnumerateValueKey, &PostOperationInfo);
+    }
+
+    ObDereferenceObject(KeyObject);
+    return Status;
+}
+
+NTSTATUS
+NTAPI
+NtQueryKey(IN HANDLE KeyHandle,
+           IN KEY_INFORMATION_CLASS KeyInformationClass,
+           OUT PVOID KeyInformation,
+           IN ULONG Length,
+           OUT PULONG ResultLength)
+{
+    NTSTATUS Status;
+    PKEY_OBJECT KeyObject;
+    REG_QUERY_KEY_INFORMATION QueryKeyInfo;
+    REG_POST_OPERATION_INFORMATION PostOperationInfo;
+    PAGED_CODE();
+
+    DPRINT("NtQueryKey() KH 0x%x, KIC %d, Length %d\n",
+        KeyHandle, KeyInformationClass, Length);
+
+    /* Verify that the handle is valid and is a registry key */
+    Status = ObReferenceObjectByHandle(KeyHandle,
+                                       (KeyInformationClass !=
+                                        KeyNameInformation) ?
+                                       KEY_QUERY_VALUE : 0,
+                                       CmpKeyObjectType,
+                                       ExGetPreviousMode(),
+                                       (PVOID *)&KeyObject,
+                                       NULL);
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT("ObReferenceObjectByHandle() failed with Status = 0x%08X\n");
+        return Status;
+    }
+
+    /* Setup the callback */
+    PostOperationInfo.Object = (PVOID)KeyObject;
+    QueryKeyInfo.Object = (PVOID)KeyObject;
+    QueryKeyInfo.KeyInformationClass = KeyInformationClass;
+    QueryKeyInfo.KeyInformation = KeyInformation;
+    QueryKeyInfo.Length = Length;
+    QueryKeyInfo.ResultLength = ResultLength;
+
+    /* Do the callback */
+    Status = CmiCallRegisteredCallbacks(RegNtPreQueryKey, &QueryKeyInfo);
+    if (NT_SUCCESS(Status))
+    {
+        /* Call the internal API */
+        Status = CmQueryKey(KeyObject->KeyControlBlock,
+                            KeyInformationClass,
+                            KeyInformation,
+                            Length,
+                            ResultLength);
+
+        /* Do the post callback */
+        PostOperationInfo.Status = Status;
+        CmiCallRegisteredCallbacks(RegNtPostQueryKey, &PostOperationInfo);
+    }
+
+    /* Dereference and return status */
+    ObDereferenceObject(KeyObject);
+    return Status;
+}
+
+NTSTATUS
+NTAPI
+NtQueryValueKey(IN HANDLE KeyHandle,
+                IN PUNICODE_STRING ValueName,
+                IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
+                OUT PVOID KeyValueInformation,
+                IN ULONG Length,
+                OUT PULONG ResultLength)
+{
+    NTSTATUS Status;
+    PKEY_OBJECT KeyObject;
+    REG_QUERY_VALUE_KEY_INFORMATION QueryValueKeyInfo;
+    REG_POST_OPERATION_INFORMATION PostOperationInfo;
+    PAGED_CODE();
+
+    DPRINT("NtQueryValueKey() KH 0x%x, VN '%wZ', KVIC %d, Length %d\n",
+        KeyHandle, ValueName, KeyValueInformationClass, Length);
+
+    /* Verify that the handle is valid and is a registry key */
+    Status = ObReferenceObjectByHandle(KeyHandle,
+                                       KEY_QUERY_VALUE,
+                                       CmpKeyObjectType,
+                                       ExGetPreviousMode(),
+                                       (PVOID *)&KeyObject,
+                                       NULL);
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT("ObReferenceObjectByHandle() failed with Status = 0x%08X\n");
+        return Status;
+    }
+
+    /* Setup the callback */
+    PostOperationInfo.Object = (PVOID)KeyObject;
+    QueryValueKeyInfo.Object = (PVOID)KeyObject;
+    QueryValueKeyInfo.ValueName = ValueName;
+    QueryValueKeyInfo.KeyValueInformationClass = KeyValueInformationClass;
+    QueryValueKeyInfo.Length = Length;
+    QueryValueKeyInfo.ResultLength = ResultLength;
+
+    /* Do the callback */
+    Status = CmiCallRegisteredCallbacks(RegNtPreQueryValueKey, &QueryValueKeyInfo);
+    if (NT_SUCCESS(Status))
+    {
+        /* Call the internal API */
+        Status = CmQueryValueKey(KeyObject->KeyControlBlock,
+                                 *ValueName,
+                                 KeyValueInformationClass,
+                                 KeyValueInformation,
+                                 Length,
+                                 ResultLength);
+
+        /* Do the post callback */
+        PostOperationInfo.Status = Status;
+        CmiCallRegisteredCallbacks(RegNtPostQueryValueKey, &PostOperationInfo);
+    }
+
+    DPRINT("NtQueryValueKey() returning 0x%08X\n", Status);
+
+    /* Dereference and return status */
+    ObDereferenceObject(KeyObject);
+    return Status;
+}
+
+NTSTATUS
+NTAPI
+NtSetValueKey(IN HANDLE KeyHandle,
+              IN PUNICODE_STRING ValueName,
+              IN ULONG TitleIndex,
+              IN ULONG Type,
+              IN PVOID Data,
+              IN ULONG DataSize)
+{
+    NTSTATUS Status;
+    PKEY_OBJECT KeyObject;
+    REG_SET_VALUE_KEY_INFORMATION SetValueKeyInfo;
+    REG_POST_OPERATION_INFORMATION PostOperationInfo;
+    PAGED_CODE();
+
+    DPRINT("NtSetValueKey() KH 0x%x, VN '%wZ', TI %x, T %d, DS %d\n",
+        KeyHandle, ValueName, TitleIndex, Type, DataSize);
+
+    /* Verify that the handle is valid and is a registry key */
+    Status = ObReferenceObjectByHandle(KeyHandle,
+                                       KEY_SET_VALUE,
+                                       CmpKeyObjectType,
+                                       ExGetPreviousMode(),
+                                       (PVOID *)&KeyObject,
+                                       NULL);
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT1("ObReferenceObjectByHandle() failed with Status = 0x%08X\n", Status);
+        return Status;
+    }
+
+    /* Setup callback */
+    PostOperationInfo.Object = (PVOID)KeyObject;
+    SetValueKeyInfo.Object = (PVOID)KeyObject;
+    SetValueKeyInfo.ValueName = ValueName;
+    SetValueKeyInfo.TitleIndex = TitleIndex;
+    SetValueKeyInfo.Type = Type;
+    SetValueKeyInfo.Data = Data;
+    SetValueKeyInfo.DataSize = DataSize;
+
+    /* Do the callback */
+    Status = CmiCallRegisteredCallbacks(RegNtPreSetValueKey, &SetValueKeyInfo);
+    if (NT_SUCCESS(Status))
+    {        
+        /* Call the internal API */
+        Status = CmSetValueKey(KeyObject->KeyControlBlock,
+                               ValueName,
+                               Type,
+                               Data,
+                               DataSize);
+    }
+
+    /* Do the post-callback and de-reference the key object */
+    PostOperationInfo.Status = Status;
+    CmiCallRegisteredCallbacks(RegNtPostSetValueKey, &PostOperationInfo);
+    ObDereferenceObject(KeyObject);
+
+    /* Synchronize the hives and return */
+    CmiSyncHives();
+    return Status;
+}
+
+NTSTATUS
+NTAPI
+NtDeleteValueKey(IN HANDLE KeyHandle,
+                 IN PUNICODE_STRING ValueName)
+{
+    PKEY_OBJECT KeyObject;
+    NTSTATUS Status;
+    REG_DELETE_VALUE_KEY_INFORMATION DeleteValueKeyInfo;
+    REG_POST_OPERATION_INFORMATION PostOperationInfo;
+    KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
+    PAGED_CODE();
+
+    /* Verify that the handle is valid and is a registry key */
+    Status = ObReferenceObjectByHandle(KeyHandle,
+                                       KEY_SET_VALUE,
+                                       CmpKeyObjectType,
+                                       PreviousMode,
+                                       (PVOID *)&KeyObject,
+                                       NULL);
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT("ObReferenceObjectByHandle() failed with Status = 0x%08X\n");
+        return Status;
+    }
+
+    /* Do the callback */
+    DeleteValueKeyInfo.Object = (PVOID)KeyObject;
+    DeleteValueKeyInfo.ValueName = ValueName;
+    Status = CmiCallRegisteredCallbacks(RegNtPreDeleteValueKey,
+                                        &DeleteValueKeyInfo);
+    if (NT_SUCCESS(Status))
+    {
+        /* Call the internal API */
+        Status = CmDeleteValueKey(KeyObject->KeyControlBlock, *ValueName);
+
+        /* Do the post callback */
+        PostOperationInfo.Object = (PVOID)KeyObject;
+        PostOperationInfo.Status = Status;
+        CmiCallRegisteredCallbacks(RegNtPostDeleteValueKey,
+                                   &PostOperationInfo);
+    }
+
+    /* Dereference the key body and synchronize the hives */
+    ObDereferenceObject(KeyObject);
+    CmiSyncHives();
+    return Status;
+}
+
+NTSTATUS
+NTAPI
+NtCompactKeys(IN ULONG Count,
+              IN PHANDLE KeyArray)
+{
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+NTAPI
+NtCompressKey(IN HANDLE Key)
+{
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+NTAPI
+NtLoadKey(IN POBJECT_ATTRIBUTES KeyObjectAttributes,
+          IN POBJECT_ATTRIBUTES FileObjectAttributes)
+{
+    return NtLoadKey2(KeyObjectAttributes, FileObjectAttributes, 0);
+}
+
+NTSTATUS
+NTAPI
+NtLoadKeyEx(IN POBJECT_ATTRIBUTES TargetKey,
+            IN POBJECT_ATTRIBUTES SourceFile,
+            IN ULONG Flags,
+            IN HANDLE TrustClassKey,
+            IN HANDLE Event,
+            IN ACCESS_MASK DesiredAccess,
+            OUT PHANDLE RootHandle)
+{
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+NTAPI
+NtLockProductActivationKeys(IN PULONG pPrivateVer,
+                            IN PULONG pSafeMode)
+{
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+NTAPI
+NtLockRegistryKey(IN HANDLE KeyHandle)
+{
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+NTAPI
+NtNotifyChangeMultipleKeys(IN HANDLE MasterKeyHandle,
+                           IN ULONG Count,
+                           IN POBJECT_ATTRIBUTES SlaveObjects,
+                           IN HANDLE Event,
+                           IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
+                           IN PVOID ApcContext OPTIONAL,
+                           OUT PIO_STATUS_BLOCK IoStatusBlock,
+                           IN ULONG CompletionFilter,
+                           IN BOOLEAN WatchTree,
+                           OUT PVOID Buffer,
+                           IN ULONG Length,
+                           IN BOOLEAN Asynchronous)
+{
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+NTAPI
+NtNotifyChangeKey(IN HANDLE KeyHandle,
+                  IN HANDLE Event,
+                  IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
+                  IN PVOID ApcContext OPTIONAL,
+                  OUT PIO_STATUS_BLOCK IoStatusBlock,
+                  IN ULONG CompletionFilter,
+                  IN BOOLEAN WatchTree,
+                  OUT PVOID Buffer,
+                  IN ULONG Length,
+                  IN BOOLEAN Asynchronous)
+{
+     return NtNotifyChangeMultipleKeys(KeyHandle,
+                                       0,
+                                       NULL,
+                                       Event,
+                                       ApcRoutine,
+                                       ApcContext,
+                                       IoStatusBlock,
+                                       CompletionFilter,
+                                       WatchTree,
+                                       Buffer,
+                                       Length,
+                                       Asynchronous);
+}
+
+NTSTATUS
+NTAPI
+NtQueryMultipleValueKey(IN HANDLE KeyHandle,
+                        IN OUT PKEY_VALUE_ENTRY ValueList,
+                        IN ULONG NumberOfValues,
+                        OUT PVOID Buffer,
+                        IN OUT PULONG Length,
+                        OUT PULONG ReturnLength)
+{
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+NTAPI
+NtQueryOpenSubKeys(IN POBJECT_ATTRIBUTES TargetKey,
+                   IN ULONG HandleCount)
+{
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+NTAPI
+NtQueryOpenSubKeysEx(IN POBJECT_ATTRIBUTES TargetKey,
+                     IN ULONG BufferLength,
+                     IN PVOID Buffer,
+                     IN PULONG RequiredSize)
+{
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+NTAPI
+NtReplaceKey(IN POBJECT_ATTRIBUTES ObjectAttributes,
+             IN HANDLE Key,
+             IN POBJECT_ATTRIBUTES ReplacedObjectAttributes)
+{
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+NTAPI
+NtRestoreKey(IN HANDLE KeyHandle,
+             IN HANDLE FileHandle,
+             IN ULONG RestoreFlags)
+{
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+NTAPI
+NtSaveKey(IN HANDLE KeyHandle,
+          IN HANDLE FileHandle)
+{
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+NTAPI
+NtSaveKeyEx(IN HANDLE KeyHandle,
+            IN HANDLE FileHandle,
+            IN ULONG Flags)
+{
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+NTAPI
+NtSaveMergedKeys(IN HANDLE HighPrecedenceKeyHandle,
+                 IN HANDLE LowPrecedenceKeyHandle,
+                 IN HANDLE FileHandle)
+{
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+NTAPI
+NtSetInformationKey(IN HANDLE KeyHandle,
+                    IN KEY_SET_INFORMATION_CLASS KeyInformationClass,
+                    IN PVOID KeyInformation,
+                    IN ULONG KeyInformationLength)
+{
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+NTAPI
+NtUnloadKey(IN POBJECT_ATTRIBUTES KeyObjectAttributes)
+{
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+NTAPI
+NtUnloadKey2(IN POBJECT_ATTRIBUTES TargetKey,
+             IN ULONG Flags)
+{
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+NTAPI
+NtUnloadKeyEx(IN POBJECT_ATTRIBUTES TargetKey,
+              IN HANDLE Event)
+{
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+/* EOF */

Propchange: trunk/reactos/ntoskrnl/config/ntapi.c
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: trunk/reactos/ntoskrnl/include/internal/ntoskrnl.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/include/internal/ntoskrnl.h?rev=30079&r1=30078&r2=30079&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/include/internal/ntoskrnl.h (original)
+++ trunk/reactos/ntoskrnl/include/internal/ntoskrnl.h Sat Nov  3 02:12:22 2007
@@ -72,7 +72,7 @@
  */
 BOOLEAN NTAPI ObInit(VOID);
 BOOLEAN NTAPI CmInitSystem1(VOID);
-VOID CmShutdownRegistry(VOID);
+VOID NTAPI CmShutdownRegistry(VOID);
 //BOOLEAN CmImportSystemHive(PCHAR ChunkBase, ULONG ChunkSize);
 //BOOLEAN CmImportHardwareHive(PCHAR ChunkBase, ULONG ChunkSize);
 BOOLEAN NTAPI KdInitSystem(ULONG Reserved, PLOADER_PARAMETER_BLOCK LoaderBlock);

Modified: trunk/reactos/ntoskrnl/ntoskrnl.rbuild
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ntoskrnl.rbuild?rev=30079&r1=30078&r2=30079&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/ntoskrnl.rbuild (original)
+++ trunk/reactos/ntoskrnl/ntoskrnl.rbuild Sat Nov  3 02:12:22 2007
@@ -123,6 +123,7 @@
 		<file>cmhook.c</file>
 		<file>cmkcbncb.c</file>
 		<file>cmkeydel.c</file>
+		<file>cmlazy.c</file>
 		<file>cmmapvw.c</file>
 		<file>cmname.c</file>
 		<file>cmparse.c</file>
@@ -132,6 +133,7 @@
 		<file>cmvalue.c</file>
 		<file>cmvalche.c</file>
 		<file>cmwraprs.c</file>
+		<file>ntapi.c</file>
 	</directory>
 	<directory name="cm">
 		<file>ntfunc.c</file>




More information about the Ros-diffs mailing list