Added registry shutdown function CmShutdownRegistry()

Updated shutdown sequence

svn path=/trunk/; revision=1379
This commit is contained in:
Eric Kohl 2000-10-05 19:15:50 +00:00
parent beaf6eac44
commit aa5a575bd0
6 changed files with 224 additions and 48 deletions

View file

@ -1,4 +1,4 @@
/* $Id: registry.c,v 1.39 2000/10/05 14:55:25 jean Exp $ /* $Id: registry.c,v 1.40 2000/10/05 19:13:48 ekohl Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -202,6 +202,11 @@ static KSPIN_LOCK CmiKeyListLock;
/* ----------------------------------------- Forward Declarations */ /* ----------------------------------------- Forward Declarations */
static NTSTATUS RtlpGetRegistryHandle(ULONG RelativeTo,
PWSTR Path,
BOOLEAN Create,
PHANDLE KeyHandle);
static NTSTATUS CmiObjectParse(PVOID ParsedObject, static NTSTATUS CmiObjectParse(PVOID ParsedObject,
PVOID *NextObject, PVOID *NextObject,
PUNICODE_STRING FullPath, PUNICODE_STRING FullPath,
@ -225,18 +230,18 @@ static ULONG CmiGetMaxValueNameLength(PREGISTRY_FILE RegistryFile,
PKEY_BLOCK KeyBlock); PKEY_BLOCK KeyBlock);
static ULONG CmiGetMaxValueDataLength(PREGISTRY_FILE RegistryFile, static ULONG CmiGetMaxValueDataLength(PREGISTRY_FILE RegistryFile,
PKEY_BLOCK KeyBlock); PKEY_BLOCK KeyBlock);
static NTSTATUS CmiScanForSubKey(IN PREGISTRY_FILE RegistryFile, static NTSTATUS CmiScanForSubKey(IN PREGISTRY_FILE RegistryFile,
IN PKEY_BLOCK KeyBlock, IN PKEY_BLOCK KeyBlock,
OUT PKEY_BLOCK *SubKeyBlock, OUT PKEY_BLOCK *SubKeyBlock,
OUT BLOCK_OFFSET *BlockOffset, OUT BLOCK_OFFSET *BlockOffset,
IN PCHAR KeyName, IN PCHAR KeyName,
IN ACCESS_MASK DesiredAccess); IN ACCESS_MASK DesiredAccess);
static NTSTATUS CmiAddSubKey(IN PREGISTRY_FILE RegistryFile, static NTSTATUS CmiAddSubKey(IN PREGISTRY_FILE RegistryFile,
IN PKEY_BLOCK CurKeyBlock, IN PKEY_BLOCK CurKeyBlock,
OUT PKEY_BLOCK *SubKeyBlock, OUT PKEY_BLOCK *SubKeyBlock,
IN PCHAR NewSubKeyName, IN PCHAR NewSubKeyName,
IN ULONG TitleIndex, IN ULONG TitleIndex,
IN PWSTR Class, IN PWSTR Class,
IN ULONG CreateOptions); IN ULONG CreateOptions);
static NTSTATUS CmiScanKeyForValue(IN PREGISTRY_FILE RegistryFile, static NTSTATUS CmiScanKeyForValue(IN PREGISTRY_FILE RegistryFile,
IN PKEY_BLOCK KeyBlock, IN PKEY_BLOCK KeyBlock,
@ -249,7 +254,7 @@ static NTSTATUS CmiGetValueFromKeyByIndex(IN PREGISTRY_FILE RegistryFile,
static NTSTATUS CmiAddValueToKey(IN PREGISTRY_FILE RegistryFile, static NTSTATUS CmiAddValueToKey(IN PREGISTRY_FILE RegistryFile,
IN PKEY_BLOCK KeyBlock, IN PKEY_BLOCK KeyBlock,
IN PCHAR ValueNameBuf, IN PCHAR ValueNameBuf,
IN ULONG Type, IN ULONG Type,
IN PVOID Data, IN PVOID Data,
IN ULONG DataSize); IN ULONG DataSize);
static NTSTATUS CmiDeleteValueFromKey(IN PREGISTRY_FILE RegistryFile, static NTSTATUS CmiDeleteValueFromKey(IN PREGISTRY_FILE RegistryFile,
@ -281,12 +286,12 @@ static NTSTATUS CmiAllocateValueBlock(IN PREGISTRY_FILE RegistryFile,
OUT PVALUE_BLOCK *ValueBlock, OUT PVALUE_BLOCK *ValueBlock,
OUT BLOCK_OFFSET *VBOffset, OUT BLOCK_OFFSET *VBOffset,
IN PCHAR ValueNameBuf, IN PCHAR ValueNameBuf,
IN ULONG Type, IN ULONG Type,
IN PVOID Data, IN PVOID Data,
IN ULONG DataSize); IN ULONG DataSize);
static NTSTATUS CmiReplaceValueData(IN PREGISTRY_FILE RegistryFile, static NTSTATUS CmiReplaceValueData(IN PREGISTRY_FILE RegistryFile,
IN PVALUE_BLOCK ValueBlock, IN PVALUE_BLOCK ValueBlock,
IN ULONG Type, IN ULONG Type,
IN PVOID Data, IN PVOID Data,
IN ULONG DataSize); IN ULONG DataSize);
static NTSTATUS CmiDestroyValueBlock(PREGISTRY_FILE RegistryFile, static NTSTATUS CmiDestroyValueBlock(PREGISTRY_FILE RegistryFile,
@ -506,19 +511,25 @@ CmInitializeRegistry2(VOID)
/* FIXME : initialize standards symbolic links */ /* FIXME : initialize standards symbolic links */
} }
VOID VOID
CmShutdownRegistry(VOID)
{
DPRINT1("CmShutdownRegistry()...\n");
}
VOID
CmImportHive(PCHAR Chunk) CmImportHive(PCHAR Chunk)
{ {
/* FIXME: implemement this */ /* FIXME: implemement this */
return; return;
} }
NTSTATUS NTSTATUS
STDCALL STDCALL
NtCreateKey ( NtCreateKey (
OUT PHANDLE KeyHandle, OUT PHANDLE KeyHandle,
IN ACCESS_MASK DesiredAccess, IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes, IN POBJECT_ATTRIBUTES ObjectAttributes,
IN ULONG TitleIndex, IN ULONG TitleIndex,
IN PUNICODE_STRING Class, IN PUNICODE_STRING Class,
IN ULONG CreateOptions, IN ULONG CreateOptions,
@ -1000,7 +1011,7 @@ CHECKPOINT;
} }
NTSTATUS NTSTATUS
STDCALL STDCALL
NtFlushKey ( NtFlushKey (
IN HANDLE KeyHandle IN HANDLE KeyHandle
@ -1010,10 +1021,10 @@ NtFlushKey (
} }
NTSTATUS NTSTATUS
STDCALL STDCALL
NtOpenKey ( NtOpenKey (
OUT PHANDLE KeyHandle, OUT PHANDLE KeyHandle,
IN ACCESS_MASK DesiredAccess, IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes IN POBJECT_ATTRIBUTES ObjectAttributes
) )
@ -1080,10 +1091,10 @@ NtOpenKey (
} }
NTSTATUS NTSTATUS
STDCALL STDCALL
NtQueryKey ( NtQueryKey (
IN HANDLE KeyHandle, IN HANDLE KeyHandle,
IN KEY_INFORMATION_CLASS KeyInformationClass, IN KEY_INFORMATION_CLASS KeyInformationClass,
OUT PVOID KeyInformation, OUT PVOID KeyInformation,
IN ULONG Length, IN ULONG Length,
@ -1227,7 +1238,7 @@ NtQueryKey (
} }
NTSTATUS NTSTATUS
STDCALL STDCALL
NtQueryValueKey ( NtQueryValueKey (
IN HANDLE KeyHandle, IN HANDLE KeyHandle,
@ -1384,13 +1395,13 @@ NtQueryValueKey (
} }
NTSTATUS NTSTATUS
STDCALL STDCALL
NtSetValueKey ( NtSetValueKey (
IN HANDLE KeyHandle, IN HANDLE KeyHandle,
IN PUNICODE_STRING ValueName, IN PUNICODE_STRING ValueName,
IN ULONG TitleIndex, IN ULONG TitleIndex,
IN ULONG Type, IN ULONG Type,
IN PVOID Data, IN PVOID Data,
IN ULONG DataSize IN ULONG DataSize
) )
@ -1495,7 +1506,7 @@ NtDeleteValueKey (
} }
NTSTATUS NTSTATUS
STDCALL STDCALL
NtLoadKey ( NtLoadKey (
PHANDLE KeyHandle, PHANDLE KeyHandle,
OBJECT_ATTRIBUTES ObjectAttributes OBJECT_ATTRIBUTES ObjectAttributes
@ -1524,11 +1535,11 @@ STDCALL
NtNotifyChangeKey ( NtNotifyChangeKey (
IN HANDLE KeyHandle, IN HANDLE KeyHandle,
IN HANDLE Event, IN HANDLE Event,
IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
IN PVOID ApcContext OPTIONAL, IN PVOID ApcContext OPTIONAL,
OUT PIO_STATUS_BLOCK IoStatusBlock, OUT PIO_STATUS_BLOCK IoStatusBlock,
IN ULONG CompletionFilter, IN ULONG CompletionFilter,
IN BOOLEAN Asynchroneous, IN BOOLEAN Asynchroneous,
OUT PVOID ChangeBuffer, OUT PVOID ChangeBuffer,
IN ULONG Length, IN ULONG Length,
IN BOOLEAN WatchSubtree IN BOOLEAN WatchSubtree
@ -1602,7 +1613,7 @@ NtSetInformationKey (
NTSTATUS NTSTATUS
STDCALL STDCALL
NtUnloadKey ( NtUnloadKey (
HANDLE KeyHandle HANDLE KeyHandle
) )
@ -1612,12 +1623,13 @@ NtUnloadKey (
NTSTATUS NTSTATUS
STDCALL STDCALL
NtInitializeRegistry ( NtInitializeRegistry (
BOOLEAN SetUpBoot BOOLEAN SetUpBoot
) )
{ {
UNIMPLEMENTED; // UNIMPLEMENTED;
return STATUS_SUCCESS;
} }
@ -1628,7 +1640,19 @@ RtlCheckRegistryKey (
IN PWSTR Path IN PWSTR Path
) )
{ {
UNIMPLEMENTED; HANDLE KeyHandle;
NTSTATUS Status;
Status = RtlpGetRegistryHandle(RelativeTo,
Path,
FALSE,
&KeyHandle);
if (!NT_SUCCESS(Status))
return Status;
NtClose(KeyHandle);
return STATUS_SUCCESS;
} }
@ -1639,7 +1663,19 @@ RtlCreateRegistryKey (
IN PWSTR Path IN PWSTR Path
) )
{ {
UNIMPLEMENTED; HANDLE KeyHandle;
NTSTATUS Status;
Status = RtlpGetRegistryHandle(RelativeTo,
Path,
TRUE,
&KeyHandle);
if (!NT_SUCCESS(Status))
return Status;
NtClose(KeyHandle);
return STATUS_SUCCESS;
} }
@ -1651,7 +1687,26 @@ RtlDeleteRegistryValue (
IN PWSTR ValueName IN PWSTR ValueName
) )
{ {
UNIMPLEMENTED; HANDLE KeyHandle;
NTSTATUS Status;
UNICODE_STRING Name;
Status = RtlpGetRegistryHandle(RelativeTo,
Path,
TRUE,
&KeyHandle);
if (!NT_SUCCESS(Status))
return Status;
RtlInitUnicodeString(&Name,
ValueName);
NtDeleteValueKey(KeyHandle,
&Name);
NtClose(KeyHandle);
return STATUS_SUCCESS;
} }
@ -1680,11 +1735,131 @@ RtlWriteRegistryValue (
IN ULONG ValueLength IN ULONG ValueLength
) )
{ {
UNIMPLEMENTED; HANDLE KeyHandle;
NTSTATUS Status;
UNICODE_STRING Name;
Status = RtlpGetRegistryHandle(RelativeTo,
Path,
TRUE,
&KeyHandle);
if (!NT_SUCCESS(Status))
return Status;
RtlInitUnicodeString(&Name,
ValueName);
NtSetValueKey(KeyHandle,
&Name,
0,
ValueType,
ValueData,
ValueLength);
NtClose(KeyHandle);
return STATUS_SUCCESS;
} }
NTSTATUS STDCALL
RtlFormatCurrentUserKeyPath(IN OUT PUNICODE_STRING KeyPath)
{
return STATUS_UNSUCCESSFUL;
}
/* ------------------------------------------ Private Implementation */ /* ------------------------------------------ Private Implementation */
static NTSTATUS RtlpGetRegistryHandle(ULONG RelativeTo,
PWSTR Path,
BOOLEAN Create,
PHANDLE KeyHandle)
{
UNICODE_STRING KeyName;
WCHAR KeyBuffer[MAX_PATH];
OBJECT_ATTRIBUTES ObjectAttributes;
NTSTATUS Status;
if (RelativeTo & RTL_REGISTRY_HANDLE)
{
*KeyHandle = (HANDLE)Path;
return STATUS_SUCCESS;
}
if (RelativeTo & RTL_REGISTRY_OPTIONAL)
RelativeTo &= ~RTL_REGISTRY_OPTIONAL;
if (RelativeTo >= RTL_REGISTRY_MAXIMUM)
return STATUS_INVALID_PARAMETER;
KeyName.Length = 0;
KeyName.MaximumLength = MAX_PATH;
KeyName.Buffer = KeyBuffer;
KeyBuffer[0] = 0;
switch (RelativeTo)
{
case RTL_REGISTRY_SERVICES:
RtlAppendUnicodeToString(&KeyName,
L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\");
break;
case RTL_REGISTRY_CONTROL:
RtlAppendUnicodeToString(&KeyName,
L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\");
break;
case RTL_REGISTRY_WINDOWS_NT:
RtlAppendUnicodeToString(&KeyName,
L"\\Registry\\Machine\\Software\\Microsoft\\Windows NT\\CurrentVersion\\");
break;
case RTL_REGISTRY_DEVICEMAP:
RtlAppendUnicodeToString(&KeyName,
L"\\Registry\\Machine\\Hardware\\DeviceMap\\");
break;
case RTL_REGISTRY_USER:
Status = RtlFormatCurrentUserKeyPath(&KeyName);
if (!NT_SUCCESS(Status))
return Status;
break;
}
if (Path[0] != L'\\')
RtlAppendUnicodeToString(&KeyName,
L"\\");
RtlAppendUnicodeToString(&KeyName,
Path);
InitializeObjectAttributes(&ObjectAttributes,
&KeyName,
OBJ_CASE_INSENSITIVE,
NULL,
NULL);
if (Create == TRUE)
{
Status = NtCreateKey(KeyHandle,
KEY_ALL_ACCESS,
&ObjectAttributes,
0,
NULL,
0,
NULL);
}
else
{
Status = NtOpenKey(KeyHandle,
KEY_ALL_ACCESS,
&ObjectAttributes);
}
return Status;
}
static NTSTATUS CmiObjectParse(PVOID ParsedObject, static NTSTATUS CmiObjectParse(PVOID ParsedObject,
PVOID *NextObject, PVOID *NextObject,
@ -1806,7 +1981,7 @@ static NTSTATUS CmiObjectCreate(PVOID ObjectBody,
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
static VOID static VOID
CmiObjectDelete(PVOID DeletedObject) CmiObjectDelete(PVOID DeletedObject)
{ {
PKEY_OBJECT KeyObject; PKEY_OBJECT KeyObject;

View file

@ -31,16 +31,18 @@ NTSTATUS STDCALL NtShutdownSystem(IN SHUTDOWN_ACTION Action)
{ {
if (Action > ShutdownPowerOff) if (Action > ShutdownPowerOff)
return STATUS_INVALID_PARAMETER; return STATUS_INVALID_PARAMETER;
IoShutdownRegisteredDevices();
CmShutdownRegistry();
IoShutdownRegisteredFileSystems();
PiShutdownProcessManager(); PiShutdownProcessManager();
MiShutdownMemoryManager(); MiShutdownMemoryManager();
IoShutdownIoManager();
if (Action == ShutdownNoReboot) if (Action == ShutdownNoReboot)
{ {
#if 0 #if 0
/* Switch off */ /* Switch off */
HalReturnToFirmware (FIRMWARE_OFF); HalReturnToFirmware (FIRMWARE_OFF);
#endif #endif
} }
else if (Action == ShutdownReboot) else if (Action == ShutdownReboot)

View file

@ -1,4 +1,4 @@
/* $Id: io.h,v 1.5 2000/09/10 13:52:55 ekohl Exp $ /* $Id: io.h,v 1.6 2000/10/05 19:12:55 ekohl Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -59,9 +59,10 @@ PIRP IoBuildSynchronousFsdRequestWithMdl(ULONG MajorFunction,
PLARGE_INTEGER StartingOffset, PLARGE_INTEGER StartingOffset,
PKEVENT Event, PKEVENT Event,
PIO_STATUS_BLOCK IoStatusBlock); PIO_STATUS_BLOCK IoStatusBlock);
VOID IoShutdownIoManager(VOID);
VOID IoInitShutdownNotification(VOID); VOID IoInitShutdownNotification(VOID);
VOID IoShutdownRegisteredDevices(VOID); VOID IoShutdownRegisteredDevices(VOID);
VOID IoShutdownRegisteredFileSystems(VOID);
NTSTATUS STDCALL IoPageRead (PFILE_OBJECT FileObject, NTSTATUS STDCALL IoPageRead (PFILE_OBJECT FileObject,
PMDL Mdl, PMDL Mdl,

View file

@ -49,6 +49,7 @@ VOID ObInit(VOID);
VOID PsInit(VOID); VOID PsInit(VOID);
VOID CmInitializeRegistry(VOID); VOID CmInitializeRegistry(VOID);
VOID CmInitializeRegistry2(VOID); VOID CmInitializeRegistry2(VOID);
VOID CmShutdownRegistry(VOID);
VOID CmImportHive(PCHAR); VOID CmImportHive(PCHAR);
VOID KdInitSystem(ULONG Reserved, PLOADER_PARAMETER_BLOCK LoaderBlock); VOID KdInitSystem(ULONG Reserved, PLOADER_PARAMETER_BLOCK LoaderBlock);

View file

@ -1,4 +1,4 @@
/* $Id: fs.c,v 1.13 2000/05/13 13:51:00 dwelch Exp $ /* $Id: fs.c,v 1.14 2000/10/05 19:15:50 ekohl Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -113,6 +113,11 @@ VOID IoInitFileSystemImplementation(VOID)
KeInitializeSpinLock(&FileSystemListLock); KeInitializeSpinLock(&FileSystemListLock);
} }
VOID IoShutdownRegisteredFileSystems(VOID)
{
DPRINT("IoShutdownRegisteredFileSystems()\n");
}
NTSTATUS IoAskFileSystemToMountDevice(PDEVICE_OBJECT DeviceObject, NTSTATUS IoAskFileSystemToMountDevice(PDEVICE_OBJECT DeviceObject,
PDEVICE_OBJECT DeviceToMount) PDEVICE_OBJECT DeviceToMount)
{ {

View file

@ -1,4 +1,4 @@
/* $Id: iomgr.c,v 1.15 2000/09/10 13:54:01 ekohl Exp $ /* $Id: iomgr.c,v 1.16 2000/10/05 19:15:50 ekohl Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -99,14 +99,6 @@ VOID IopDeleteFile(PVOID ObjectBody)
} }
} }
VOID IoShutdownIoManager(VOID)
{
/* shut down all registered devices */
IoShutdownRegisteredDevices();
}
VOID IoInit (VOID) VOID IoInit (VOID)
{ {