mirror of
https://github.com/reactos/reactos.git
synced 2025-06-01 07:28:19 +00:00
[NTOSKRNL]
Implement NtUnloadKey2. TODO: Destroy the unlinked hive. CORE-3094 svn path=/trunk/; revision=68295
This commit is contained in:
parent
bc5c68db6d
commit
3507ef2ac6
5 changed files with 139 additions and 19 deletions
|
@ -2127,13 +2127,123 @@ CmLoadKey(IN POBJECT_ATTRIBUTES TargetKey,
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
BOOLEAN
|
||||||
|
NTAPI
|
||||||
|
CmpUnlinkHiveFromMaster(IN PHHIVE Hive,
|
||||||
|
IN HCELL_INDEX Cell)
|
||||||
|
{
|
||||||
|
PCELL_DATA CellData;
|
||||||
|
HCELL_INDEX LinkCell;
|
||||||
|
NTSTATUS Status;
|
||||||
|
|
||||||
|
DPRINT("CmpUnlinkHiveFromMaster()\n");
|
||||||
|
|
||||||
|
/* Get the cell data */
|
||||||
|
CellData = HvGetCell(Hive, Cell);
|
||||||
|
if (CellData == NULL)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
/* Get the link cell and release the current cell */
|
||||||
|
LinkCell = CellData->u.KeyNode.Parent;
|
||||||
|
HvReleaseCell(Hive, Cell);
|
||||||
|
|
||||||
|
/* Remove the link cell from the master hive */
|
||||||
|
CmpLockHiveFlusherExclusive(CmiVolatileHive);
|
||||||
|
Status = CmpFreeKeyByCell((PHHIVE)CmiVolatileHive,
|
||||||
|
LinkCell,
|
||||||
|
TRUE);
|
||||||
|
CmpUnlockHiveFlusher(CmiVolatileHive);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
DPRINT1("CmpFreeKeyByCell() failed (Status 0x%08lx)\n", Status);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Lock the hive list */
|
||||||
|
ExAcquirePushLockExclusive(&CmpHiveListHeadLock);
|
||||||
|
|
||||||
|
/* Remove this hive */
|
||||||
|
RemoveEntryList(&((PCMHIVE)Hive)->HiveList);
|
||||||
|
|
||||||
|
/* Release the lock */
|
||||||
|
ExReleasePushLock(&CmpHiveListHeadLock);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
NTAPI
|
NTAPI
|
||||||
CmUnloadKey(IN PCM_KEY_CONTROL_BLOCK Kcb,
|
CmUnloadKey(IN PCM_KEY_CONTROL_BLOCK Kcb,
|
||||||
IN ULONG Flags)
|
IN ULONG Flags)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
PHHIVE Hive;
|
||||||
return STATUS_NOT_IMPLEMENTED;
|
PCMHIVE CmHive;
|
||||||
|
HCELL_INDEX Cell;
|
||||||
|
|
||||||
|
DPRINT("CmUnloadKey(%p, %lx)\n", Kcb, Flags);
|
||||||
|
|
||||||
|
/* Get the hive */
|
||||||
|
Hive = Kcb->KeyHive;
|
||||||
|
Cell = Kcb->KeyCell;
|
||||||
|
CmHive = (PCMHIVE)Hive;
|
||||||
|
|
||||||
|
/* Fail if the key is no a hive root key */
|
||||||
|
if (Cell != Hive->BaseBlock->RootCell)
|
||||||
|
{
|
||||||
|
DPRINT1("Key is not a hive root key!\n");
|
||||||
|
return STATUS_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Fail if we try to unload the master hive */
|
||||||
|
if (CmHive == CmiVolatileHive)
|
||||||
|
{
|
||||||
|
DPRINT1("Do not try to unload the master hive!\n");
|
||||||
|
return STATUS_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Flush the hive */
|
||||||
|
CmFlushKey(Kcb, TRUE);
|
||||||
|
|
||||||
|
/* Unlink the hive from the master hive */
|
||||||
|
if (!CmpUnlinkHiveFromMaster(Hive, Cell))
|
||||||
|
{
|
||||||
|
DPRINT("CmpUnlinkHiveFromMaster() failed!\n");
|
||||||
|
|
||||||
|
/* Remove the unloading flag */
|
||||||
|
Hive->HiveFlags &= ~HIVE_IS_UNLOADING;
|
||||||
|
|
||||||
|
return STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Clean up information we have on the subkey */
|
||||||
|
CmpCleanUpSubKeyInfo(Kcb->ParentKcb);
|
||||||
|
|
||||||
|
/* Set the KCB in delete mode and remove it */
|
||||||
|
Kcb->Delete = TRUE;
|
||||||
|
CmpRemoveKeyControlBlock(Kcb);
|
||||||
|
|
||||||
|
if (Flags != REG_FORCE_UNLOAD)
|
||||||
|
{
|
||||||
|
/* Release the KCB locks */
|
||||||
|
CmpReleaseTwoKcbLockByKey(Kcb->ConvKey, Kcb->ParentKcb->ConvKey);
|
||||||
|
|
||||||
|
/* Release the hive loading lock */
|
||||||
|
ExReleasePushLockExclusive(&CmpLoadHiveLock);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Release hive lock */
|
||||||
|
CmpUnlockRegistry();
|
||||||
|
|
||||||
|
/* Close file handles */
|
||||||
|
CmpCloseHiveFiles(CmHive);
|
||||||
|
|
||||||
|
/* Remove the hive from the hive file list */
|
||||||
|
CmpRemoveFromHiveFileList(CmHive);
|
||||||
|
|
||||||
|
/* FIXME: Destroy the hive */
|
||||||
|
|
||||||
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
ULONG
|
ULONG
|
||||||
|
|
|
@ -626,3 +626,19 @@ CmpOpenHiveFiles(IN PCUNICODE_STRING BaseName,
|
||||||
ZwClose(EventHandle);
|
ZwClose(EventHandle);
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
NTAPI
|
||||||
|
CmpCloseHiveFiles(IN PCMHIVE Hive)
|
||||||
|
{
|
||||||
|
ULONG i;
|
||||||
|
|
||||||
|
for (i = 0; i < HFILE_TYPE_MAX; i++)
|
||||||
|
{
|
||||||
|
if (Hive->FileHandles[i] != NULL)
|
||||||
|
{
|
||||||
|
ZwClose(Hive->FileHandles[i]);
|
||||||
|
Hive->FileHandles[i] = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -2138,7 +2138,6 @@ CmShutdownSystem(VOID)
|
||||||
{
|
{
|
||||||
PLIST_ENTRY ListEntry;
|
PLIST_ENTRY ListEntry;
|
||||||
PCMHIVE Hive;
|
PCMHIVE Hive;
|
||||||
ULONG i;
|
|
||||||
|
|
||||||
/* Kill the workers */
|
/* Kill the workers */
|
||||||
if (!CmFirstTime) CmpShutdownWorkers();
|
if (!CmFirstTime) CmpShutdownWorkers();
|
||||||
|
@ -2153,14 +2152,7 @@ CmShutdownSystem(VOID)
|
||||||
{
|
{
|
||||||
Hive = CONTAINING_RECORD(ListEntry, CMHIVE, HiveList);
|
Hive = CONTAINING_RECORD(ListEntry, CMHIVE, HiveList);
|
||||||
|
|
||||||
for (i = 0; i < HFILE_TYPE_MAX; i++)
|
CmpCloseHiveFiles(Hive);
|
||||||
{
|
|
||||||
if (Hive->FileHandles[i] != NULL)
|
|
||||||
{
|
|
||||||
ZwClose(Hive->FileHandles[i]);
|
|
||||||
Hive->FileHandles[i] = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ListEntry = ListEntry->Flink;
|
ListEntry = ListEntry->Flink;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1372,7 +1372,6 @@ NTAPI
|
||||||
NtUnloadKey2(IN POBJECT_ATTRIBUTES TargetKey,
|
NtUnloadKey2(IN POBJECT_ATTRIBUTES TargetKey,
|
||||||
IN ULONG Flags)
|
IN ULONG Flags)
|
||||||
{
|
{
|
||||||
#if 0
|
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
OBJECT_ATTRIBUTES ObjectAttributes;
|
OBJECT_ATTRIBUTES ObjectAttributes;
|
||||||
UNICODE_STRING ObjectName;
|
UNICODE_STRING ObjectName;
|
||||||
|
@ -1381,6 +1380,7 @@ NtUnloadKey2(IN POBJECT_ATTRIBUTES TargetKey,
|
||||||
PCM_KEY_BODY KeyBody = NULL;
|
PCM_KEY_BODY KeyBody = NULL;
|
||||||
ULONG ParentConv = 0, ChildConv = 0;
|
ULONG ParentConv = 0, ChildConv = 0;
|
||||||
HANDLE Handle;
|
HANDLE Handle;
|
||||||
|
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
/* Validate privilege */
|
/* Validate privilege */
|
||||||
|
@ -1515,11 +1515,11 @@ NtUnloadKey2(IN POBJECT_ATTRIBUTES TargetKey,
|
||||||
{
|
{
|
||||||
if (Flags != REG_FORCE_UNLOAD)
|
if (Flags != REG_FORCE_UNLOAD)
|
||||||
{
|
{
|
||||||
/* Release the hive loading lock */
|
|
||||||
ExReleasePushLockExclusive(&CmpLoadHiveLock);
|
|
||||||
|
|
||||||
/* Release two KCBs lock */
|
/* Release two KCBs lock */
|
||||||
CmpReleaseTwoKcbLockByKey(ChildConv, ParentConv);
|
CmpReleaseTwoKcbLockByKey(ChildConv, ParentConv);
|
||||||
|
|
||||||
|
/* Release the hive loading lock */
|
||||||
|
ExReleasePushLockExclusive(&CmpLoadHiveLock);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Unlock the registry */
|
/* Unlock the registry */
|
||||||
|
@ -1532,10 +1532,6 @@ Quickie:
|
||||||
|
|
||||||
/* Return status */
|
/* Return status */
|
||||||
return Status;
|
return Status;
|
||||||
#else
|
|
||||||
UNIMPLEMENTED;
|
|
||||||
return STATUS_NOT_IMPLEMENTED;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
|
|
|
@ -828,6 +828,12 @@ CmpOpenHiveFiles(
|
||||||
OUT PULONG ClusterSize OPTIONAL
|
OUT PULONG ClusterSize OPTIONAL
|
||||||
);
|
);
|
||||||
|
|
||||||
|
VOID
|
||||||
|
NTAPI
|
||||||
|
CmpCloseHiveFiles(
|
||||||
|
IN PCMHIVE Hive
|
||||||
|
);
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
NTAPI
|
NTAPI
|
||||||
CmpInitHiveFromFile(
|
CmpInitHiveFromFile(
|
||||||
|
|
Loading…
Reference in a new issue