[ros-diffs] [ion] 26704: - Move Cmlib wrapper functions to cmwraprs.c and add the file -- no code change. - Move CmCheckRegistry stub to cmcheck.c and add the file. - Move CmpInitializeHive to cminit.c and add the file. Modify it to add Cm-rewrite compatible code (but #ifed out). - Change the HiveList lock to a pushlock instead of an ERESOURCE. Rename CmiHiveListHead to CmpHiveListHead. - Get rid of Cm security functions and stub the CmpSecurityMethod in cmse.c to always return success. Key security was never really working anyway, this just removes more code.

ion at svn.reactos.org ion at svn.reactos.org
Fri May 11 23:35:57 CEST 2007


Author: ion
Date: Sat May 12 01:35:56 2007
New Revision: 26704

URL: http://svn.reactos.org/svn/reactos?rev=26704&view=rev
Log:
- Move Cmlib wrapper functions to cmwraprs.c and add the file -- no code change.
- Move CmCheckRegistry stub to cmcheck.c and add the file.
- Move CmpInitializeHive to cminit.c and add the file. Modify it to add Cm-rewrite compatible code (but #ifed out).
- Change the HiveList lock to a pushlock instead of an ERESOURCE. Rename CmiHiveListHead to CmpHiveListHead.
- Get rid of Cm security functions and stub the CmpSecurityMethod in cmse.c to always return success. Key security was never really working anyway, this just removes more code.

Added:
    trunk/reactos/ntoskrnl/config/cmcheck.c
    trunk/reactos/ntoskrnl/config/cminit.c
    trunk/reactos/ntoskrnl/config/cmwraprs.c
Modified:
    trunk/reactos/ntoskrnl/cm/cm.h
    trunk/reactos/ntoskrnl/cm/regfile.c
    trunk/reactos/ntoskrnl/cm/registry.c
    trunk/reactos/ntoskrnl/cm/regobj.c
    trunk/reactos/ntoskrnl/config/cm.h
    trunk/reactos/ntoskrnl/config/cmdata.c
    trunk/reactos/ntoskrnl/config/cmse.c
    trunk/reactos/ntoskrnl/ntoskrnl.rbuild

Modified: trunk/reactos/ntoskrnl/cm/cm.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/cm/cm.h?rev=26704&r1=26703&r2=26704&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/cm/cm.h (original)
+++ trunk/reactos/ntoskrnl/cm/cm.h Sat May 12 01:35:56 2007
@@ -110,10 +110,10 @@
 extern POBJECT_TYPE CmpKeyObjectType;
 extern KSPIN_LOCK CmiKeyListLock;
 
-extern LIST_ENTRY CmiHiveListHead;
+extern LIST_ENTRY CmpHiveListHead;
 
 extern ERESOURCE CmiRegistryLock;
-
+extern EX_PUSH_LOCK CmpHiveListHeadLock;
 
 /* Registry Callback Function */
 typedef struct _REGISTRY_CALLBACK

Modified: trunk/reactos/ntoskrnl/cm/regfile.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/cm/regfile.c?rev=26704&r1=26703&r2=26704&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/cm/regfile.c (original)
+++ trunk/reactos/ntoskrnl/cm/regfile.c Sat May 12 01:35:56 2007
@@ -22,113 +22,6 @@
 #define ABS_VALUE(V) (((V) < 0) ? -(V) : (V))
 
 /* FUNCTIONS ****************************************************************/
-
-PVOID CMAPI
-CmpAllocate(
-   ULONG Size,
-   BOOLEAN Paged)
-{
-   return ExAllocatePoolWithTag(Paged ? PagedPool : NonPagedPool,
-                                Size, TAG('R','E','G',' '));
-}
-
-VOID CMAPI
-CmpFree(
-   PVOID Ptr)
-{
-   ExFreePool(Ptr);
-}
-
-
-BOOLEAN CMAPI
-CmpFileRead(
-   PHHIVE RegistryHive,
-   ULONG FileType,
-   ULONGLONG FileOffset,
-   PVOID Buffer,
-   SIZE_T BufferLength)
-{
-   PEREGISTRY_HIVE CmHive = (PEREGISTRY_HIVE)RegistryHive;
-   HANDLE HiveHandle = FileType == HV_TYPE_PRIMARY ? CmHive->HiveHandle : CmHive->LogHandle;
-   LARGE_INTEGER _FileOffset;
-   IO_STATUS_BLOCK IoStatusBlock;
-   NTSTATUS Status;
-
-   _FileOffset.QuadPart = FileOffset;
-   Status = ZwReadFile(HiveHandle, 0, 0, 0, &IoStatusBlock,
-                       Buffer, BufferLength, &_FileOffset, 0);
-   return NT_SUCCESS(Status) ? TRUE : FALSE;
-}
-
-
-BOOLEAN CMAPI
-CmpFileWrite(
-   PHHIVE RegistryHive,
-   ULONG FileType,
-   ULONGLONG FileOffset,
-   PVOID Buffer,
-   SIZE_T BufferLength)
-{
-   PEREGISTRY_HIVE CmHive = (PEREGISTRY_HIVE)RegistryHive;
-   HANDLE HiveHandle = FileType == HV_TYPE_PRIMARY ? CmHive->HiveHandle : CmHive->LogHandle;
-   LARGE_INTEGER _FileOffset;
-   IO_STATUS_BLOCK IoStatusBlock;
-   NTSTATUS Status;
-
-   _FileOffset.QuadPart = FileOffset;
-   Status = ZwWriteFile(HiveHandle, 0, 0, 0, &IoStatusBlock,
-                       Buffer, BufferLength, &_FileOffset, 0);
-   return NT_SUCCESS(Status) ? TRUE : FALSE;
-}
-
-
-BOOLEAN CMAPI
-CmpFileSetSize(
-   PHHIVE RegistryHive,
-   ULONG FileType,
-   ULONGLONG FileSize)
-{
-   PEREGISTRY_HIVE CmHive = (PEREGISTRY_HIVE)RegistryHive;
-   HANDLE HiveHandle = FileType == HV_TYPE_PRIMARY ? CmHive->HiveHandle : CmHive->LogHandle;
-   FILE_END_OF_FILE_INFORMATION EndOfFileInfo;
-   FILE_ALLOCATION_INFORMATION FileAllocationInfo;
-   IO_STATUS_BLOCK IoStatusBlock;
-   NTSTATUS Status;
-
-   EndOfFileInfo.EndOfFile.QuadPart = FileSize;
-   Status = ZwSetInformationFile(HiveHandle, &IoStatusBlock,
-                                 &EndOfFileInfo,
-                                 sizeof(FILE_END_OF_FILE_INFORMATION),
-                                 FileEndOfFileInformation);
-   if (!NT_SUCCESS(Status))
-      return FALSE;
-
-   FileAllocationInfo.AllocationSize.QuadPart = FileSize;
-   Status = ZwSetInformationFile(HiveHandle, &IoStatusBlock,
-                                 &FileAllocationInfo,
-                                 sizeof(FILE_ALLOCATION_INFORMATION),
-                                 FileAllocationInformation);
-   if (!NT_SUCCESS(Status))
-      return FALSE;
-
-   return TRUE;
-}
-
-
-BOOLEAN CMAPI
-CmpFileFlush(
-   PHHIVE RegistryHive,
-   ULONG FileType)
-{
-   PEREGISTRY_HIVE CmHive = (PEREGISTRY_HIVE)RegistryHive;
-   HANDLE HiveHandle = FileType == HV_TYPE_PRIMARY ? CmHive->HiveHandle : CmHive->LogHandle;
-   IO_STATUS_BLOCK IoStatusBlock;
-   NTSTATUS Status;
-
-   Status = ZwFlushBuffersFile(HiveHandle, &IoStatusBlock);
-   return NT_SUCCESS(Status) ? TRUE : FALSE;
-}
-
 
 static NTSTATUS
 CmiCreateNewRegFile(HANDLE FileHandle)
@@ -319,144 +212,6 @@
   return STATUS_SUCCESS;
 }
 
-ULONG
-NTAPI
-CmCheckRegistry(IN PEREGISTRY_HIVE RegistryHive,
-                IN ULONG Flags)
-{
-    /* FIXME: HACK! */
-    return 0;
-}
-
-NTSTATUS
-NTAPI
-CmpInitializeHive(OUT PEREGISTRY_HIVE *RegistryHive,
-                  IN ULONG OperationType,
-                  IN ULONG HiveFlags,
-                  IN ULONG FileType,
-                  IN PVOID HiveData OPTIONAL,
-                  IN HANDLE Primary,
-                  IN HANDLE Log,
-                  IN HANDLE External,
-                  IN PUNICODE_STRING FileName OPTIONAL,
-                  IN ULONG CheckFlags)
-{
-    PEREGISTRY_HIVE Hive;
-    IO_STATUS_BLOCK IoStatusBlock;
-    FILE_FS_SIZE_INFORMATION FileSizeInformation;
-    NTSTATUS Status;
-    ULONG Cluster;
-
-    /* Assume failure */
-    *RegistryHive = NULL;
-
-    /*
-     * The following are invalid:
-     * An external hive that is also internal.
-     * A log hive that's not a primary hive too.
-     * A volatile hive that's linked to permanent storage.
-     * An in-memory initialization without hive data.
-     * A log hive that's not linked to a correct file type.
-     */
-    if (((External) && ((Primary) || (Log))) ||
-        ((Log) && !(Primary)) ||
-        ((HiveFlags & HIVE_VOLATILE) && ((Primary) || (External) || (Log))) ||
-        ((OperationType == HINIT_MEMORY) && (!HiveData)) ||
-        ((Log) && (FileType != HFILE_TYPE_LOG)))
-    {
-        /* Fail the request */
-        return STATUS_INVALID_PARAMETER;
-    }
-
-    /* Check if this is a primary hive */
-    if (Primary)
-    {
-        /* Get the cluster size */
-        Status = ZwQueryVolumeInformationFile(Primary,
-                                              &IoStatusBlock,
-                                              &FileSizeInformation,
-                                              sizeof(FILE_FS_SIZE_INFORMATION),
-                                              FileFsSizeInformation);
-        if (!NT_SUCCESS(Status)) return Status;
-
-        /* Make sure it's not larger then the block size */
-        if (FileSizeInformation.BytesPerSector > HBLOCK_SIZE)
-        {
-            /* Fail */
-            return STATUS_REGISTRY_IO_FAILED;
-        }
-
-        /* Otherwise, calculate the cluster */
-        Cluster = FileSizeInformation.BytesPerSector / HSECTOR_SIZE;
-        Cluster = max(1, Cluster);
-    }
-    else
-    {
-        /* Otherwise use cluster 1 */
-        Cluster = 1;
-    }
-
-    /* Allocate and clear the hive */
-    Hive = ExAllocatePoolWithTag(NonPagedPool, sizeof(EREGISTRY_HIVE), TAG_CM);
-    if (!Hive) return STATUS_INSUFFICIENT_RESOURCES;
-    RtlZeroMemory(Hive, sizeof(EREGISTRY_HIVE));
-
-    /* Initialize it */
-    Status = HvInitialize(&Hive->Hive,
-                          OperationType,
-                          HiveFlags,
-                          FileType,
-                          (ULONG_PTR)HiveData,
-                          Cluster,
-                          CmpAllocate,
-                          CmpFree,
-                          CmpFileRead,
-                          CmpFileWrite,
-                          CmpFileSetSize,
-                          CmpFileFlush,
-                          FileName);
-    if (!NT_SUCCESS(Status))
-    {
-        /* Clear allocations and fail */
-        ExFreePool(Hive);
-        return Status;
-    }
-
-    /* Set flags */
-    Hive->Flags = HiveFlags;
-
-    /* Check if we should verify the registry */
-    if ((OperationType == HINIT_FILE) ||
-        (OperationType == HINIT_MEMORY) ||
-        (OperationType == HINIT_MEMORY_INPLACE) ||
-        (OperationType == HINIT_MAPFILE))
-    {
-        /* Verify integrity */
-        if (CmCheckRegistry(Hive, TRUE))
-        {
-            /* Free all alocations */
-            ExFreePool(Hive);
-            return STATUS_REGISTRY_CORRUPT;
-        }
-    }
-
-    /* Acquire hive list lock exclusively */
-    KeEnterCriticalRegion();
-    ExAcquireResourceExclusiveLite(&CmiRegistryLock, TRUE);
-
-    /* Add the new hive to the hive list */
-    InsertTailList(&CmiHiveListHead, &Hive->HiveList);
-
-    /* Release hive list lock */
-    ExReleaseResourceLite(&CmiRegistryLock);
-    KeLeaveCriticalRegion();
-
-    /* Return the hive and success */
-    VERIFY_REGISTRY_HIVE(Hive);
-    *RegistryHive = Hive;
-    return STATUS_SUCCESS;
-}
-
 NTSTATUS
 CmiLoadHive(IN POBJECT_ATTRIBUTES KeyObjectAttributes,
 	    IN PUNICODE_STRING FileName,
@@ -493,7 +248,7 @@
     }
 
   /* Add the new hive to the hive list */
-  InsertTailList (&CmiHiveListHead,
+  InsertTailList (&CmpHiveListHead,
 		  &Hive->HiveList);
 
   VERIFY_REGISTRY_HIVE(Hive);

Modified: trunk/reactos/ntoskrnl/cm/registry.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/cm/registry.c?rev=26704&r1=26703&r2=26704&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/cm/registry.c (original)
+++ trunk/reactos/ntoskrnl/cm/registry.c Sat May 12 01:35:56 2007
@@ -32,7 +32,7 @@
 POBJECT_TYPE  CmpKeyObjectType = NULL;
 PEREGISTRY_HIVE  CmiVolatileHive = NULL;
 
-LIST_ENTRY CmiHiveListHead;
+LIST_ENTRY CmpHiveListHead;
 
 ERESOURCE CmiRegistryLock;
 
@@ -210,8 +210,9 @@
     PSECURITY_DESCRIPTOR SecurityDescriptor;
     PAGED_CODE();
 
-    /* Initialize the hive list */
-    InitializeListHead(&CmiHiveListHead);
+    /* Initialize the hive list and lock */
+    InitializeListHead(&CmpHiveListHead);
+    ExInitializePushLock((PVOID)&CmpHiveListHeadLock);
 
     /* Initialize registry lock */
     ExInitializeResourceLite(&CmiRegistryLock);
@@ -854,12 +855,11 @@
       CmiHiveSyncPending = FALSE;
     }
 
-  /* Acquire hive list lock exclusively */
-  KeEnterCriticalRegion();
-  ExAcquireResourceExclusiveLite(&CmiRegistryLock, TRUE);
-
-  Entry = CmiHiveListHead.Flink;
-  while (Entry != &CmiHiveListHead)
+      /* Lock the hive list */
+    ExAcquirePushLockExclusive(&CmpHiveListHeadLock);
+
+  Entry = CmpHiveListHead.Flink;
+  while (Entry != &CmpHiveListHead)
     {
       Hive = CONTAINING_RECORD(Entry, EREGISTRY_HIVE, HiveList);
 
@@ -872,9 +872,8 @@
       Entry = Entry->Flink;
     }
 
-  /* Release hive list lock */
-  ExReleaseResourceLite(&CmiRegistryLock);
-  KeLeaveCriticalRegion();
+    /* Release the lock */
+    ExReleasePushLock(&CmpHiveListHeadLock);
 
   DPRINT("CmShutdownRegistry() done\n");
 }
@@ -890,12 +889,11 @@
 
   CmiHiveSyncPending = FALSE;
 
-  /* Acquire hive list lock exclusively */
-  KeEnterCriticalRegion();
-  ExAcquireResourceExclusiveLite(&CmiRegistryLock, TRUE);
-
-  Entry = CmiHiveListHead.Flink;
-  while (Entry != &CmiHiveListHead)
+      /* Lock the hive list */
+    ExAcquirePushLockExclusive(&CmpHiveListHeadLock);
+
+  Entry = CmpHiveListHead.Flink;
+  while (Entry != &CmpHiveListHead)
     {
       Hive = CONTAINING_RECORD(Entry, EREGISTRY_HIVE, HiveList);
 
@@ -908,9 +906,8 @@
       Entry = Entry->Flink;
     }
 
-  /* Release hive list lock */
-  ExReleaseResourceLite(&CmiRegistryLock);
-  KeLeaveCriticalRegion();
+    /* Release the lock */
+    ExReleasePushLock(&CmpHiveListHeadLock);
 
   DPRINT("DeferredContext 0x%p\n", DeferredContext);
   ExFreePool(DeferredContext);

Modified: trunk/reactos/ntoskrnl/cm/regobj.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/cm/regobj.c?rev=26704&r1=26703&r2=26704&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/cm/regobj.c (original)
+++ trunk/reactos/ntoskrnl/cm/regobj.c Sat May 12 01:35:56 2007
@@ -675,158 +675,6 @@
   CmiCallRegisteredCallbacks(RegNtPostKeyHandleClose, &PostOperationInfo);
 }
 
-
-static NTSTATUS
-CmiQuerySecurityDescriptor(PKEY_OBJECT KeyObject,
-			   SECURITY_INFORMATION SecurityInformation,
-			   PISECURITY_DESCRIPTOR SecurityDescriptor,
-			   PULONG BufferLength)
-{
-  ULONG_PTR Current;
-  ULONG SidSize;
-  ULONG SdSize;
-  NTSTATUS Status;
-
-  DPRINT("CmiQuerySecurityDescriptor() called\n");
-
-  /*
-   * FIXME:
-   * This is a big hack!!
-   * We need to retrieve the security descriptor from the keys security cell!
-   */
-
-  if (SecurityInformation == 0)
-    {
-      return STATUS_ACCESS_DENIED;
-    }
-
-  SidSize = RtlLengthSid(SeWorldSid);
-  SdSize = sizeof(SECURITY_DESCRIPTOR) + (2 * SidSize);
-
-  if (*BufferLength < SdSize)
-    {
-      *BufferLength = SdSize;
-      return STATUS_BUFFER_TOO_SMALL;
-    }
-
-  *BufferLength = SdSize;
-
-  Status = RtlCreateSecurityDescriptor(SecurityDescriptor,
-				       SECURITY_DESCRIPTOR_REVISION);
-  if (!NT_SUCCESS(Status))
-    {
-      return Status;
-    }
-
-  SecurityDescriptor->Control |= SE_SELF_RELATIVE;
-  Current = (ULONG_PTR)SecurityDescriptor + sizeof(SECURITY_DESCRIPTOR);
-
-  if (SecurityInformation & OWNER_SECURITY_INFORMATION)
-    {
-      RtlCopyMemory((PVOID)Current,
-		    SeWorldSid,
-		    SidSize);
-      SecurityDescriptor->Owner = (PSID)((ULONG_PTR)Current - (ULONG_PTR)SecurityDescriptor);
-      Current += SidSize;
-    }
-
-  if (SecurityInformation & GROUP_SECURITY_INFORMATION)
-    {
-      RtlCopyMemory((PVOID)Current,
-		    SeWorldSid,
-		    SidSize);
-      SecurityDescriptor->Group = (PSID)((ULONG_PTR)Current - (ULONG_PTR)SecurityDescriptor);
-      Current += SidSize;
-    }
-
-  if (SecurityInformation & DACL_SECURITY_INFORMATION)
-    {
-      SecurityDescriptor->Control |= SE_DACL_PRESENT;
-    }
-
-  if (SecurityInformation & SACL_SECURITY_INFORMATION)
-    {
-      SecurityDescriptor->Control |= SE_SACL_PRESENT;
-    }
-
-  return STATUS_SUCCESS;
-}
-
-
-static NTSTATUS
-CmiAssignSecurityDescriptor(PKEY_OBJECT KeyObject,
-			    PSECURITY_DESCRIPTOR SecurityDescriptor)
-{
-#if 0
-  PEREGISTRY_HIVE Hive;
-
-  DPRINT1("CmiAssignSecurityDescriptor() callled\n");
-
-  DPRINT1("KeyObject %p\n", KeyObject);
-  DPRINT1("KeyObject->RegistryHive %p\n", KeyObject->RegistryHive);
-
-  Hive = KeyObject->RegistryHive;
-  if (Hive == NULL)
-    {
-      DPRINT1("Create new root security cell\n");
-      return STATUS_SUCCESS;
-    }
-
-  if (Hive->RootSecurityCell == NULL)
-    {
-      DPRINT1("Create new root security cell\n");
-
-    }
-  else
-    {
-      DPRINT1("Search for security cell\n");
-
-    }
-#endif
-
-  return STATUS_SUCCESS;
-}
-
-
-NTSTATUS STDCALL
-CmpSecurityMethod(PVOID ObjectBody,
-		  SECURITY_OPERATION_CODE OperationCode,
-		  PSECURITY_INFORMATION SecurityInformation,
-		  PSECURITY_DESCRIPTOR SecurityDescriptor,
-		  PULONG BufferLength,
-		  PSECURITY_DESCRIPTOR *OldSecurityDescriptor,
-		  POOL_TYPE PoolType,
-		  PGENERIC_MAPPING GenericMapping)
-{
-  DPRINT("CmpSecurityMethod() called\n");
-
-  switch (OperationCode)
-    {
-      case SetSecurityDescriptor:
-        DPRINT("Set security descriptor\n");
-        return STATUS_SUCCESS;
-
-      case QuerySecurityDescriptor:
-        DPRINT("Query security descriptor\n");
-        return CmiQuerySecurityDescriptor((PKEY_OBJECT)ObjectBody,
-					  *SecurityInformation,
-					  SecurityDescriptor,
-					  BufferLength);
-
-      case DeleteSecurityDescriptor:
-        DPRINT("Delete security descriptor\n");
-        return STATUS_SUCCESS;
-
-      case AssignSecurityDescriptor:
-        DPRINT("Assign security descriptor\n");
-        return CmiAssignSecurityDescriptor((PKEY_OBJECT)ObjectBody,
-					   SecurityDescriptor);
-    }
-
-  return STATUS_UNSUCCESSFUL;
-}
-
-
 NTSTATUS STDCALL
 CmpQueryKeyName (PVOID ObjectBody,
             IN BOOLEAN HasName,

Modified: trunk/reactos/ntoskrnl/config/cm.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/config/cm.h?rev=26704&r1=26703&r2=26704&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/config/cm.h (original)
+++ trunk/reactos/ntoskrnl/config/cm.h Sat May 12 01:35:56 2007
@@ -696,11 +696,11 @@
 //
 // Registry Validation Functions
 //
-BOOLEAN
+ULONG
 NTAPI
 CmCheckRegistry(
     IN PCMHIVE Hive,
-    IN BOOLEAN CleanFlag
+    IN ULONG Flags
 );
 
 //
@@ -1002,6 +1002,57 @@
     IN INTERFACE_TYPE InterfaceType,
     IN ULONG BusNumber,
     IN PUSHORT DeviceIndexTable
+);
+
+//
+// Wrapper Routines
+//
+PVOID
+NTAPI
+CmpAllocate(
+    IN ULONG Size,
+    IN BOOLEAN Paged
+);
+
+VOID
+NTAPI
+CmpFree(
+    IN PVOID Ptr
+);
+
+BOOLEAN
+NTAPI
+CmpFileRead(
+    IN PHHIVE RegistryHive,
+    IN ULONG FileType,
+    IN ULONGLONG FileOffset,
+    OUT PVOID Buffer,
+    IN SIZE_T BufferLength
+);
+
+BOOLEAN
+NTAPI
+CmpFileWrite(
+    IN PHHIVE RegistryHive,
+    IN ULONG FileType,
+    IN ULONGLONG FileOffset,
+    IN PVOID Buffer,
+    IN SIZE_T BufferLength
+);
+
+BOOLEAN
+NTAPI
+CmpFileSetSize(
+    IN PHHIVE RegistryHive,
+    IN ULONG FileType,
+    IN ULONGLONG FileSize
+);
+
+BOOLEAN
+NTAPI
+CmpFileFlush(
+   IN PHHIVE RegistryHive,
+   IN ULONG FileType
 );
 
 //

Added: trunk/reactos/ntoskrnl/config/cmcheck.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/config/cmcheck.c?rev=26704&view=auto
==============================================================================
--- trunk/reactos/ntoskrnl/config/cmcheck.c (added)
+++ trunk/reactos/ntoskrnl/config/cmcheck.c Sat May 12 01:35:56 2007
@@ -1,0 +1,27 @@
+/*
+ * PROJECT:         ReactOS Kernel
+ * LICENSE:         GPL - See COPYING in the top level directory
+ * FILE:            ntoskrnl/config/cmcheck.c
+ * PURPOSE:         Configuration Manager - Hive and Key Validation
+ * PROGRAMMERS:     Alex Ionescu (alex.ionescu at reactos.org)
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include "ntoskrnl.h"
+#include "cm.h"
+#define NDEBUG
+#include "debug.h"
+
+/* GLOBALS *******************************************************************/
+
+/* FUNCTIONS *****************************************************************/
+
+ULONG
+NTAPI
+CmCheckRegistry(IN PCMHIVE RegistryHive,
+                IN ULONG Flags)
+{
+    /* FIXME: HACK! */
+    return 0;
+}

Modified: trunk/reactos/ntoskrnl/config/cmdata.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/config/cmdata.c?rev=26704&r1=26703&r2=26704&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/config/cmdata.c (original)
+++ trunk/reactos/ntoskrnl/config/cmdata.c Sat May 12 01:35:56 2007
@@ -35,6 +35,8 @@
 
 ULONG CmpConfigurationAreaSize = PAGE_SIZE * 4;
 PCM_FULL_RESOURCE_DESCRIPTOR CmpConfigurationData;
+
+EX_PUSH_LOCK CmpHiveListHeadLock;
 
 UNICODE_STRING CmTypeName[MaximumType + 1] =
 {

Added: trunk/reactos/ntoskrnl/config/cminit.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/config/cminit.c?rev=26704&view=auto
==============================================================================
--- trunk/reactos/ntoskrnl/config/cminit.c (added)
+++ trunk/reactos/ntoskrnl/config/cminit.c Sat May 12 01:35:56 2007
@@ -1,0 +1,228 @@
+/*
+ * PROJECT:         ReactOS Kernel
+ * LICENSE:         GPL - See COPYING in the top level directory
+ * FILE:            ntoskrnl/config/cminit.c
+ * PURPOSE:         Configuration Manager - Hive Initialization
+ * PROGRAMMERS:     Alex Ionescu (alex.ionescu at reactos.org)
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include "ntoskrnl.h"
+#include "cm.h"
+#define NDEBUG
+#include "debug.h"
+
+/* FUNCTIONS *****************************************************************/
+
+NTSTATUS
+NTAPI
+CmpInitializeHive(OUT PCMHIVE *RegistryHive,
+                  IN ULONG OperationType,
+                  IN ULONG HiveFlags,
+                  IN ULONG FileType,
+                  IN PVOID HiveData OPTIONAL,
+                  IN HANDLE Primary,
+                  IN HANDLE Log,
+                  IN HANDLE External,
+                  IN PUNICODE_STRING FileName OPTIONAL,
+                  IN ULONG CheckFlags)
+{
+#if 0
+    PCMHIVE Hive;
+#else
+    PEREGISTRY_HIVE Hive;
+#endif
+    IO_STATUS_BLOCK IoStatusBlock;
+    FILE_FS_SIZE_INFORMATION FileSizeInformation;
+    NTSTATUS Status;
+    ULONG Cluster;
+
+    /* Assume failure */
+    *RegistryHive = NULL;
+
+    /*
+     * The following are invalid:
+     * An external hive that is also internal.
+     * A log hive that's not a primary hive too.
+     * A volatile hive that's linked to permanent storage.
+     * An in-memory initialization without hive data.
+     * A log hive that's not linked to a correct file type.
+     */
+    if (((External) && ((Primary) || (Log))) ||
+        ((Log) && !(Primary)) ||
+        ((HiveFlags & HIVE_VOLATILE) && ((Primary) || (External) || (Log))) ||
+        ((OperationType == HINIT_MEMORY) && (!HiveData)) ||
+        ((Log) && (FileType != HFILE_TYPE_LOG)))
+    {
+        /* Fail the request */
+        return STATUS_INVALID_PARAMETER;
+    }
+
+    /* Check if this is a primary hive */
+    if (Primary)
+    {
+        /* Get the cluster size */
+        Status = ZwQueryVolumeInformationFile(Primary,
+                                              &IoStatusBlock,
+                                              &FileSizeInformation,
+                                              sizeof(FILE_FS_SIZE_INFORMATION),
+                                              FileFsSizeInformation);
+        if (!NT_SUCCESS(Status)) return Status;
+
+        /* Make sure it's not larger then the block size */
+        if (FileSizeInformation.BytesPerSector > HBLOCK_SIZE)
+        {
+            /* Fail */
+            return STATUS_REGISTRY_IO_FAILED;
+        }
+
+        /* Otherwise, calculate the cluster */
+        Cluster = FileSizeInformation.BytesPerSector / HSECTOR_SIZE;
+        Cluster = max(1, Cluster);
+    }
+    else
+    {
+        /* Otherwise use cluster 1 */
+        Cluster = 1;
+    }
+
+    /* Allocate the hive */
+    Hive = ExAllocatePoolWithTag(NonPagedPool, sizeof(EREGISTRY_HIVE), TAG_CM);
+    if (!Hive) return STATUS_INSUFFICIENT_RESOURCES;
+#if 0
+    /* Setup null fields */
+    Hive->UnloadEvent = NULL;
+    Hive->RootKcb = NULL;
+    Hive->Frozen = FALSE;
+    Hive->UnloadWorkItem = NULL;
+    Hive->GrowOnlyMode = FALSE;
+    Hive->GrowOffset = 0;
+    Hive->CellRemapArray = NULL;
+    Hive->UseCountLog.Next = 0;
+    Hive->LockHiveLog.Next = 0;
+    Hive->FileObject = NULL;
+    Hive->NotifyList.Flink = NULL;
+    Hive->NotifyList.Blink = NULL;
+
+    /* Set loading flag */
+    Hive->HiveIsLoading = TRUE;
+
+    /* Set the current thread as creator */
+    Hive->CreatorOwner = KeGetCurrentThread();
+
+    /* Initialize lists */
+    InitializeListHead(&Hive->KcbConvertListHead);
+    InitializeListHead(&Hive->KnodeConvertListHead);
+    InitializeListHead(&Hive->TrustClassEntry);
+
+    /* Allocate the view log */
+    Hive->ViewLock = ExAllocatePoolWithTag(NonPagedPool,
+                                           sizeof(KGUARDED_MUTEX),
+                                           TAG_CM);
+    if (!Hive->ViewLock) return STATUS_INSUFFICIENT_RESOURCES;
+
+    /* Allocate the flush lock */
+    Hive->FlusherLock = ExAllocatePoolWithTag(NonPagedPool,
+                                              sizeof(ERESOURCE),
+                                              TAG_CM);
+    if (!Hive->FlusherLock) return STATUS_INSUFFICIENT_RESOURCES;
+
+    /* Setup the handles */
+    Hive->FileHandles[HFILE_TYPE_PRIMARY] = Primary;
+    Hive->FileHandles[HFILE_TYPE_LOG] = Log;
+    Hive->FileHandles[HFILE_TYPE_EXTERNAL] = External;
+
+    /* Initailize the guarded mutex */
+    KeInitializeGuardedMutex(Hive->ViewLock);
+    Hive->ViewLockOwner = NULL;
+
+    /* Initialize the flush lock */
+    ExInitializeResourceLite(Hive->FlusherLock);
+
+    /* Setup hive locks */
+    ExInitializePushLock(&Hive->HiveLock);
+    Hive->HiveLockOwner = NULL;
+    ExInitializePushLock(&Hive->WriterLock);
+    Hive->WriterLockOwner = NULL;
+    ExInitializePushLock(&Hive->SecurityLock);
+    Hive->HiveSecurityLockOwner = NULL;
+
+    /* Clear file names */
+    RtlInitEmptyUnicodeString(&Hive->FileUserName, NULL, 0);
+    RtlInitEmptyUnicodeString(&Hive->FileFullPath, NULL, 0);
+
+    /* Initialize the view list */
+    CmpInitializeHiveViewList(Hive);
+
+    /* Initailize the security cache */
+    CmpInitializeSecurityCache(Hive);
+
+    /* Setup flags */
+    Hive->Flags = 0;
+    Hive->FlushCount = 0;
+#else
+    /* Clear it */
+    RtlZeroMemory(Hive, sizeof(EREGISTRY_HIVE));
+
+    /* Set flags */
+    Hive->Flags = HiveFlags;
+#endif
+
+    /* Initialize it */
+    Status = HvInitialize(&Hive->Hive,
+                          OperationType,
+                          HiveFlags,
+                          FileType,
+                          (ULONG_PTR)HiveData,
+                          Cluster,
+                          CmpAllocate,
+                          CmpFree,
+                          CmpFileRead,
+                          CmpFileWrite,
+                          CmpFileSetSize,
+                          CmpFileFlush,
+                          FileName);
+    if (!NT_SUCCESS(Status))
+    {
+        /* Clear allocations and fail */
+#if 0
+        ExFreePool(Hive->ViewLock);
+        ExFreePool(Hive->FlusherLock);
+#endif
+        ExFreePool(Hive);
+        return Status;
+    }
+
+    /* Check if we should verify the registry */
+    if ((OperationType == HINIT_FILE) ||
+        (OperationType == HINIT_MEMORY) ||
+        (OperationType == HINIT_MEMORY_INPLACE) ||
+        (OperationType == HINIT_MAPFILE))
+    {
+        /* Verify integrity */
+        if (CmCheckRegistry((PCMHIVE)Hive, TRUE))
+        {
+            /* Free all alocations */
+#if 0
+            ExFreePool(Hive->ViewLock);
+            ExFreePool(Hive->FlusherLock);
+#endif
+            ExFreePool(Hive);
+            return STATUS_REGISTRY_CORRUPT;
+        }
+    }
+
+    /* Lock the hive list */
+    ExAcquirePushLockExclusive(&CmpHiveListHeadLock);
+
+    /* Insert this hive */
+    InsertHeadList(&CmpHiveListHead, &Hive->HiveList);
+
+    /* Release the lock */
+    ExReleasePushLock(&CmpHiveListHeadLock);
+
+    /* Return the hive and success */
+    *RegistryHive = (PCMHIVE)Hive;
+    return STATUS_SUCCESS;
+}

Modified: trunk/reactos/ntoskrnl/config/cmse.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/config/cmse.c?rev=26704&r1=26703&r2=26704&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/config/cmse.c (original)
+++ trunk/reactos/ntoskrnl/config/cmse.c Sat May 12 01:35:56 2007
@@ -136,3 +136,18 @@
     /* Return the security descriptor */
     return SecurityDescriptor;
 }
+
+NTSTATUS
+NTAPI
+CmpSecurityMethod(IN PVOID ObjectBody,
+                  IN SECURITY_OPERATION_CODE OperationCode,
+                  IN PSECURITY_INFORMATION SecurityInformation,
+                  IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
+                  IN OUT PULONG BufferLength,
+                  IN OUT PSECURITY_DESCRIPTOR *OldSecurityDescriptor,
+                  IN POOL_TYPE PoolType,
+                  IN PGENERIC_MAPPING GenericMapping)
+{
+    /* HACK */
+    return STATUS_SUCCESS;
+}

Added: trunk/reactos/ntoskrnl/config/cmwraprs.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/config/cmwraprs.c?rev=26704&view=auto
==============================================================================
--- trunk/reactos/ntoskrnl/config/cmwraprs.c (added)
+++ trunk/reactos/ntoskrnl/config/cmwraprs.c Sat May 12 01:35:56 2007
@@ -1,0 +1,119 @@
+/*
+ * PROJECT:         ReactOS Kernel
+ * LICENSE:         GPL - See COPYING in the top level directory
+ * FILE:            ntoskrnl/config/cmwraprs.c
+ * PURPOSE:         Configuration Manager - Wrappers for Hive Operations
+ * PROGRAMMERS:     Alex Ionescu (alex.ionescu at reactos.org)
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include "ntoskrnl.h"
+#include "cm.h"
+#define NDEBUG
+#include "debug.h"
+
+/* FUNCTIONS *****************************************************************/
+
+PVOID
+NTAPI
+CmpAllocate(IN ULONG Size,
+            IN BOOLEAN Paged)
+{
+    return ExAllocatePoolWithTag(Paged ? PagedPool : NonPagedPool,
+                                 Size,
+                                 TAG('R','E','G',' '));
+}
+
+VOID
+NTAPI
+CmpFree(IN PVOID Ptr)
+{
+    ExFreePool(Ptr);
+}
+
+BOOLEAN
+NTAPI
+CmpFileRead(IN PHHIVE RegistryHive,
+            IN ULONG FileType,
+            IN ULONGLONG FileOffset,
+            OUT PVOID Buffer,
+            IN SIZE_T BufferLength)
+{
+    PEREGISTRY_HIVE CmHive = (PEREGISTRY_HIVE)RegistryHive;
+    HANDLE HiveHandle = FileType == HV_TYPE_PRIMARY ? CmHive->HiveHandle : CmHive->LogHandle;
+    LARGE_INTEGER _FileOffset;
+    IO_STATUS_BLOCK IoStatusBlock;
+    NTSTATUS Status;
+
+    _FileOffset.QuadPart = FileOffset;
+    Status = ZwReadFile(HiveHandle, 0, 0, 0, &IoStatusBlock,
+                       Buffer, BufferLength, &_FileOffset, 0);
+    return NT_SUCCESS(Status) ? TRUE : FALSE;
+}
+
+BOOLEAN
+NTAPI
+CmpFileWrite(IN PHHIVE RegistryHive,
+             IN ULONG FileType,
+             IN ULONGLONG FileOffset,
+             IN PVOID Buffer,
+             IN SIZE_T BufferLength)
+{
+    PEREGISTRY_HIVE CmHive = (PEREGISTRY_HIVE)RegistryHive;
+    HANDLE HiveHandle = FileType == HV_TYPE_PRIMARY ? CmHive->HiveHandle : CmHive->LogHandle;
+    LARGE_INTEGER _FileOffset;
+    IO_STATUS_BLOCK IoStatusBlock;
+    NTSTATUS Status;
+
+    _FileOffset.QuadPart = FileOffset;
+    Status = ZwWriteFile(HiveHandle, 0, 0, 0, &IoStatusBlock,
+                       Buffer, BufferLength, &_FileOffset, 0);
+    return NT_SUCCESS(Status) ? TRUE : FALSE;
+}
+
+BOOLEAN
+NTAPI
+CmpFileSetSize(IN PHHIVE RegistryHive,
+               IN ULONG FileType,
+               IN ULONGLONG FileSize)
+{
+    PEREGISTRY_HIVE CmHive = (PEREGISTRY_HIVE)RegistryHive;
+    HANDLE HiveHandle = FileType == HV_TYPE_PRIMARY ? CmHive->HiveHandle : CmHive->LogHandle;
+    FILE_END_OF_FILE_INFORMATION EndOfFileInfo;
+    FILE_ALLOCATION_INFORMATION FileAllocationInfo;
+    IO_STATUS_BLOCK IoStatusBlock;
+    NTSTATUS Status;
+
+    EndOfFileInfo.EndOfFile.QuadPart = FileSize;
+    Status = ZwSetInformationFile(HiveHandle,
+                                  &IoStatusBlock,
+                                  &EndOfFileInfo,
+                                  sizeof(FILE_END_OF_FILE_INFORMATION),
+                                  FileEndOfFileInformation);
+    if (!NT_SUCCESS(Status)) return FALSE;
+
+    FileAllocationInfo.AllocationSize.QuadPart = FileSize;
+    Status = ZwSetInformationFile(HiveHandle,
+                                  &IoStatusBlock,
+                                  &FileAllocationInfo,
+                                  sizeof(FILE_ALLOCATION_INFORMATION),
+                                  FileAllocationInformation);
+    if (!NT_SUCCESS(Status)) return FALSE;
+
+    return TRUE;
+}
+
+BOOLEAN
+NTAPI
+CmpFileFlush(IN PHHIVE RegistryHive,
+             IN ULONG FileType)
+{
+    PEREGISTRY_HIVE CmHive = (PEREGISTRY_HIVE)RegistryHive;
+    HANDLE HiveHandle = FileType == HV_TYPE_PRIMARY ? CmHive->HiveHandle : CmHive->LogHandle;
+    IO_STATUS_BLOCK IoStatusBlock;
+    NTSTATUS Status;
+
+    Status = ZwFlushBuffersFile(HiveHandle, &IoStatusBlock);
+    return NT_SUCCESS(Status) ? TRUE : FALSE;
+}

Modified: trunk/reactos/ntoskrnl/ntoskrnl.rbuild
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ntoskrnl.rbuild?rev=26704&r1=26703&r2=26704&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/ntoskrnl.rbuild (original)
+++ trunk/reactos/ntoskrnl/ntoskrnl.rbuild Sat May 12 01:35:56 2007
@@ -90,10 +90,12 @@
                 </directory>
             </if>
             <file>cmboot.c</file>
+            <file>cmcheck.c</file>
             <file>cmcontrl.c</file>
             <file>cmconfig.c</file>
             <file>cmdata.c</file>
             <file>cmindex.c</file>
+            <file>cminit.c</file>
             <file>cmhook.c</file>
             <file>cmkcbncb.c</file>
             <file>cmmapvw.c</file>
@@ -103,6 +105,7 @@
             <file>cmsecach.c</file>
             <file>cmsysini.c</file>
             <file>cmvalue.c</file>
+            <file>cmwraprs.c</file>
     </directory>
     <directory name="cm">
             <file>ntfunc.c</file>




More information about the Ros-diffs mailing list