Author: ion
Date: Sat May 12 10:47:39 2007
New Revision: 26714
URL:
http://svn.reactos.org/svn/reactos?rev=26714&view=rev
Log:
- Change CmiInitNonVolatileRegistry hive to use CmpOpenHiveFiles and CmpInitializeHive.
Required a lot of hacking to get to work right, but at least it does, and uses our new
code paths.
- Update CmpInitializeHive with the HINIT_FILE hack required for current cmlib
functionality.
Modified:
trunk/reactos/ntoskrnl/cm/regfile.c
trunk/reactos/ntoskrnl/config/cminit.c
Modified: trunk/reactos/ntoskrnl/cm/regfile.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/cm/regfile.c?rev=…
==============================================================================
--- trunk/reactos/ntoskrnl/cm/regfile.c (original)
+++ trunk/reactos/ntoskrnl/cm/regfile.c Sat May 12 10:47:39 2007
@@ -23,6 +23,19 @@
/* FUNCTIONS ****************************************************************/
+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);
+
static NTSTATUS
CmiCreateNewRegFile(HANDLE FileHandle)
{
@@ -57,95 +70,66 @@
}
static NTSTATUS
-CmiInitNonVolatileRegistryHive (PEREGISTRY_HIVE RegistryHive,
- PWSTR Filename)
-{
- OBJECT_ATTRIBUTES ObjectAttributes;
- ULONG CreateDisposition;
- IO_STATUS_BLOCK IoSB;
- HANDLE FileHandle;
- NTSTATUS Status;
- FILE_STANDARD_INFORMATION FileInformation;
-
- DPRINT("CmiInitNonVolatileRegistryHive(%p, %S) called\n",
- RegistryHive, Filename);
-
- /* Duplicate Filename */
- Status = RtlCreateUnicodeString(&RegistryHive->HiveFileName,
- Filename);
- if (!NT_SUCCESS(Status))
- {
- DPRINT("RtlCreateUnicodeString() failed (Status %lx)\n", Status);
- return(Status);
- }
-
- InitializeObjectAttributes(&ObjectAttributes,
- &RegistryHive->HiveFileName,
- OBJ_CASE_INSENSITIVE,
- NULL,
- NULL);
-
- CreateDisposition = FILE_OPEN_IF;
- Status = ZwCreateFile(&FileHandle,
- FILE_ALL_ACCESS,
- &ObjectAttributes,
- &IoSB,
- NULL,
- FILE_ATTRIBUTE_NORMAL,
- 0,
- CreateDisposition,
- FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT,
- NULL,
- 0);
- if (!NT_SUCCESS(Status))
- {
- RtlFreeUnicodeString(&RegistryHive->HiveFileName);
- DPRINT("ZwCreateFile() failed (Status %lx)\n", Status);
- return(Status);
- }
-
- if (IoSB.Information != FILE_OPENED)
- {
- Status = CmiCreateNewRegFile(FileHandle);
- if (!NT_SUCCESS(Status))
- {
- DPRINT("CmiCreateNewRegFile() failed (Status %lx)\n", Status);
- ZwClose(FileHandle);
- RtlFreeUnicodeString(&RegistryHive->HiveFileName);
- return(Status);
- }
- }
-
- RegistryHive->HiveHandle = FileHandle;
-
- /* Check how large the file is */
- ZwQueryInformationFile(FileHandle,
- &IoSB,
- &FileInformation,
- sizeof(FileInformation),
- FileStandardInformation);
- Status = HvInitialize(&RegistryHive->Hive, HINIT_FILE, 0, 0,
- 0, FileInformation.EndOfFile.LowPart,
- CmpAllocate, CmpFree,
- CmpFileRead, CmpFileWrite, CmpFileSetSize,
- CmpFileFlush, NULL);
- if (!NT_SUCCESS(Status))
- {
- DPRINT1("Failed to open hive\n");
- RtlFreeUnicodeString(&RegistryHive->HiveFileName);
- ZwClose(FileHandle);
- return Status;
- }
-
- CmPrepareHive(&RegistryHive->Hive);
-
- /* Close the hive file */
- ZwClose(FileHandle);
-
- DPRINT("CmiInitNonVolatileRegistryHive(%p, %S) - Finished.\n",
- RegistryHive, Filename);
-
- return STATUS_SUCCESS;
+CmiInitNonVolatileRegistryHive (IN ULONG HiveFlags,
+ IN PUNICODE_STRING HiveName,
+ OUT PEREGISTRY_HIVE *Hive)
+{
+ ULONG CreateDisposition, LogDisposition;
+ HANDLE FileHandle, LogHandle;
+ NTSTATUS Status;
+ //ULONG Operation;
+ PEREGISTRY_HIVE NewHive;
+
+ *Hive = NULL;
+
+ Status = CmpOpenHiveFiles(HiveName,
+ NULL, //L".LOG",
+ &FileHandle,
+ &LogHandle,
+ &CreateDisposition,
+ &LogDisposition,
+ TRUE,
+ FALSE,
+ TRUE,
+ NULL);
+ if (CreateDisposition == FILE_CREATED)
+ {
+ Status = CmiCreateNewRegFile(FileHandle);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT("CmiCreateNewRegFile() failed (Status %lx)\n", Status);
+ ZwClose(FileHandle);
+ return(Status);
+ }
+ }
+
+ Status = CmpInitializeHive(&NewHive,
+ HINIT_FILE,
+ HiveFlags,
+ HFILE_TYPE_PRIMARY,
+ NULL,
+ FileHandle,
+ NULL,
+ NULL,
+ HiveName,
+ 0);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("Failed to open hive\n");
+ ZwClose(FileHandle);
+ return Status;
+ }
+
+ CmPrepareHive(&NewHive->Hive);
+ NewHive->Flags = HiveFlags;
+
+ RtlCreateUnicodeString(&NewHive->HiveFileName, HiveName->Buffer);
+
+ /* Close the hive file */
+ ZwClose(FileHandle);
+
+ *Hive = NewHive;
+ return Status;
}
NTSTATUS
@@ -161,33 +145,15 @@
if (Flags & ~REG_NO_LAZY_FLUSH)
return STATUS_INVALID_PARAMETER;
- Hive = ExAllocatePool (NonPagedPool,
- sizeof(EREGISTRY_HIVE));
- if (Hive == NULL)
- {
- DPRINT1 ("Failed to allocate hive header.\n");
- return STATUS_INSUFFICIENT_RESOURCES;
- }
- RtlZeroMemory (Hive,
- sizeof(EREGISTRY_HIVE));
-
- DPRINT ("Hive 0x%p\n", Hive);
- Hive->Flags = (Flags & REG_NO_LAZY_FLUSH) ? HIVE_NO_SYNCH : 0;
-
- Status = CmiInitNonVolatileRegistryHive (Hive,
- FileName->Buffer);
+ Status = CmiInitNonVolatileRegistryHive ((Flags & REG_NO_LAZY_FLUSH) ?
HIVE_NO_SYNCH : 0,
+ FileName,
+ &Hive);
if (!NT_SUCCESS (Status))
{
DPRINT1 ("CmiInitNonVolatileRegistryHive() failed (Status %lx)\n",
Status);
ExFreePool (Hive);
return Status;
}
-
- /* Add the new hive to the hive list */
- InsertTailList (&CmpHiveListHead,
- &Hive->HiveList);
-
- VERIFY_REGISTRY_HIVE(Hive);
Status = CmiConnectHive (KeyObjectAttributes,
Hive);
Modified: trunk/reactos/ntoskrnl/config/cminit.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/config/cminit.c?r…
==============================================================================
--- trunk/reactos/ntoskrnl/config/cminit.c (original)
+++ trunk/reactos/ntoskrnl/config/cminit.c Sat May 12 10:47:39 2007
@@ -32,6 +32,7 @@
PCMHIVE Hive;
#else
PEREGISTRY_HIVE Hive;
+ FILE_STANDARD_INFORMATION FileInformation;
#endif
IO_STATUS_BLOCK IoStatusBlock;
FILE_FS_SIZE_INFORMATION FileSizeInformation;
@@ -167,6 +168,15 @@
/* Set flags */
Hive->Flags = HiveFlags;
+ Hive->HiveHandle = Primary;
+
+ /* Check how large the file is */
+ ZwQueryInformationFile(Primary,
+ &IoStatusBlock,
+ &FileInformation,
+ sizeof(FileInformation),
+ FileStandardInformation);
+ Cluster = FileInformation.EndOfFile.LowPart;
#endif
/* Initialize it */