/* $Id$
- *
+ *
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* FILE: ntoskrnl/cm/ntfunc.c
IN OUT PLARGE_INTEGER Cookie)
{
PREGISTRY_CALLBACK Callback;
-
+
PAGED_CODE();
-
+
ASSERT(Function && Cookie);
-
+
Callback = ExAllocatePoolWithTag(PagedPool,
sizeof(REGISTRY_CALLBACK),
TAG('C', 'M', 'c', 'b'));
Callback->Function = Function;
Callback->Context = Context;
Callback->PendingDelete = FALSE;
-
+
/* add it to the callback list and receive a cookie for the callback */
ExAcquireFastMutex(&CmiCallbackLock);
/* FIXME - to receive a unique cookie we'll just return the pointer to the
InsertTailList(&CmiCallbackHead, &Callback->ListEntry);
ExReleaseFastMutex(&CmiCallbackLock);
-
+
*Cookie = Callback->Cookie;
return STATUS_SUCCESS;
}
CmUnRegisterCallback(IN LARGE_INTEGER Cookie)
{
PLIST_ENTRY CurrentEntry;
-
+
PAGED_CODE();
ExAcquireFastMutex(&CmiCallbackLock);
}
}
}
-
+
ExReleaseFastMutex(&CmiCallbackLock);
return STATUS_UNSUCCESSFUL;
IN PVOID Argument2)
{
PLIST_ENTRY CurrentEntry;
-
+
PAGED_CODE();
-
+
ExAcquireFastMutex(&CmiCallbackLock);
for(CurrentEntry = CmiCallbackHead.Flink;
ExAcquireRundownProtectionEx(&CurrentCallback->RundownRef, 1))
{
NTSTATUS Status;
-
+
/* don't hold locks during the callbacks! */
ExReleaseFastMutex(&CmiCallbackLock);
-
+
Status = CurrentCallback->Function(CurrentCallback->Context,
Argument1,
Argument2);
ExReleaseRundownProtectionEx(&CurrentCallback->RundownRef, 1);
}
}
-
+
ExReleaseFastMutex(&CmiCallbackLock);
-
+
return STATUS_SUCCESS;
}
PVOID Object;
PWSTR Start;
unsigned i;
-
+
PAGED_CODE();
DPRINT("NtCreateKey (Name %wZ KeyHandle %x Root %x)\n",
ExReleaseResourceLite(&CmiRegistryLock);
KeLeaveCriticalRegion();
-
+
ObDereferenceObject(Object);
if (Disposition)
KPROCESSOR_MODE PreviousMode;
PKEY_OBJECT KeyObject;
NTSTATUS Status;
-
+
PAGED_CODE();
DPRINT1("NtDeleteKey(KeyHandle %x) called\n", KeyHandle);
-
+
PreviousMode = ExGetPreviousMode();
/* Verify that the handle is valid and is a registry key */
ULONG NameSize, ClassSize;
KPROCESSOR_MODE PreviousMode;
NTSTATUS Status;
-
+
PAGED_CODE();
-
+
PreviousMode = ExGetPreviousMode();
DPRINT("KH %x I %d KIC %x KI %x L %d RL %x\n",
Status = STATUS_BUFFER_OVERFLOW;
CHECKPOINT;
}
- else if (Length - FIELD_OFFSET(KEY_NODE_INFORMATION, Name[0]) -
+ else if (Length - FIELD_OFFSET(KEY_NODE_INFORMATION, Name[0]) -
NameSize < ClassSize)
{
- ClassSize = Length - FIELD_OFFSET(KEY_NODE_INFORMATION, Name[0]) -
+ ClassSize = Length - FIELD_OFFSET(KEY_NODE_INFORMATION, Name[0]) -
NameSize;
Status = STATUS_BUFFER_OVERFLOW;
CHECKPOINT;
PKEY_VALUE_BASIC_INFORMATION ValueBasicInformation;
PKEY_VALUE_PARTIAL_INFORMATION ValuePartialInformation;
PKEY_VALUE_FULL_INFORMATION ValueFullInformation;
-
+
PAGED_CODE();
DPRINT("KH %x I %d KVIC %x KVI %x L %d RL %x\n",
}
else
{
- ValueBasicInformation = (PKEY_VALUE_BASIC_INFORMATION)
+ ValueBasicInformation = (PKEY_VALUE_BASIC_INFORMATION)
KeyValueInformation;
ValueBasicInformation->TitleIndex = 0;
ValueBasicInformation->Type = ValueCell->DataType;
case KeyValuePartialInformation:
DataSize = ValueCell->DataSize & REG_DATA_SIZE_MASK;
- *ResultLength = FIELD_OFFSET(KEY_VALUE_PARTIAL_INFORMATION, Data[0]) +
+ *ResultLength = FIELD_OFFSET(KEY_VALUE_PARTIAL_INFORMATION, Data[0]) +
DataSize;
if (Length < FIELD_OFFSET(KEY_VALUE_PARTIAL_INFORMATION, Data[0]))
Status = STATUS_BUFFER_OVERFLOW;
CHECKPOINT;
}
-
+
if (!(ValueCell->DataSize & REG_DATA_IN_OFFSET))
{
DataCell = CmiGetCell (RegistryHive, ValueCell->DataOffset, NULL);
- RtlCopyMemory(ValuePartialInformation->Data,
+ RtlCopyMemory(ValuePartialInformation->Data,
DataCell->Data,
DataSize);
}
else
{
- RtlCopyMemory(ValuePartialInformation->Data,
- &ValueCell->DataOffset,
+ RtlCopyMemory(ValuePartialInformation->Data,
+ &ValueCell->DataOffset,
DataSize);
}
}
}
else
{
- ValueFullInformation = (PKEY_VALUE_FULL_INFORMATION)
+ ValueFullInformation = (PKEY_VALUE_FULL_INFORMATION)
KeyValueInformation;
ValueFullInformation->TitleIndex = 0;
ValueFullInformation->Type = ValueCell->DataType;
ValueFullInformation->NameLength = NameSize;
- ValueFullInformation->DataOffset =
+ ValueFullInformation->DataOffset =
(ULONG_PTR)ValueFullInformation->Name -
(ULONG_PTR)ValueFullInformation +
ValueFullInformation->NameLength;
ValueFullInformation->DataOffset =
ROUND_UP(ValueFullInformation->DataOffset, sizeof(PVOID));
ValueFullInformation->DataLength = ValueCell->DataSize & REG_DATA_SIZE_MASK;
-
+
if (Length - FIELD_OFFSET(KEY_VALUE_FULL_INFORMATION, Name[0]) <
NameSize)
{
PKEY_OBJECT KeyObject;
PREGISTRY_HIVE 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 */
PVOID Object;
HANDLE hKey;
NTSTATUS Status = STATUS_SUCCESS;
-
+
PAGED_CODE();
DPRINT("NtOpenKey(KH %x DA %x OA %x OA->ON '%wZ'\n",
Status = _SEH_GetExceptionCode();
}
_SEH_END;
-
+
if(!NT_SUCCESS(Status))
{
return Status;
PKEY_CELL KeyCell;
ULONG NameSize, ClassSize;
NTSTATUS Status;
-
+
PAGED_CODE();
DPRINT("NtQueryKey(KH %x KIC %x KI %x L %d RL %x)\n",
Status = STATUS_BUFFER_OVERFLOW;
CHECKPOINT;
}
- else if (Length - FIELD_OFFSET(KEY_NODE_INFORMATION, Name[0]) -
+ else if (Length - FIELD_OFFSET(KEY_NODE_INFORMATION, Name[0]) -
NameSize < ClassSize)
{
- ClassSize = Length - FIELD_OFFSET(KEY_NODE_INFORMATION, Name[0]) -
+ ClassSize = Length - FIELD_OFFSET(KEY_NODE_INFORMATION, Name[0]) -
NameSize;
Status = STATUS_BUFFER_OVERFLOW;
CHECKPOINT;
Status = STATUS_BUFFER_OVERFLOW;
CHECKPOINT;
}
-
+
if (ClassSize)
{
ClassCell = CmiGetCell (KeyObject->RegistryHive,
PKEY_VALUE_BASIC_INFORMATION ValueBasicInformation;
PKEY_VALUE_PARTIAL_INFORMATION ValuePartialInformation;
PKEY_VALUE_FULL_INFORMATION ValueFullInformation;
-
+
PAGED_CODE();
DPRINT("NtQueryValueKey(KeyHandle %x ValueName %S Length %x)\n",
}
else
{
- ValueBasicInformation = (PKEY_VALUE_BASIC_INFORMATION)
+ ValueBasicInformation = (PKEY_VALUE_BASIC_INFORMATION)
KeyValueInformation;
ValueBasicInformation->TitleIndex = 0;
ValueBasicInformation->Type = ValueCell->DataType;
ValueFullInformation->TitleIndex = 0;
ValueFullInformation->Type = ValueCell->DataType;
ValueFullInformation->NameLength = NameSize;
- ValueFullInformation->DataOffset =
+ ValueFullInformation->DataOffset =
(ULONG_PTR)ValueFullInformation->Name -
(ULONG_PTR)ValueFullInformation +
ValueFullInformation->NameLength;
PDATA_CELL NewDataCell;
PHBIN pBin;
ULONG DesiredAccess;
-
+
PAGED_CODE();
DPRINT("NtSetValueKey(KeyHandle %x ValueName '%wZ' Type %d)\n",
{
PKEY_OBJECT KeyObject;
NTSTATUS Status;
-
+
PAGED_CODE();
/* Verify that the handle is valid and is a registry key */
ULONG BufferSize;
ULONG Length;
NTSTATUS Status;
-
+
PAGED_CODE();
DPRINT ("NtLoadKey2() called\n");
IN ULONG Length,
IN BOOLEAN Asynchronous)
{
- return NtNotifyChangeMultipleKeys(KeyHandle,
+ return NtNotifyChangeMultipleKeys(KeyHandle,
0,
NULL,
Event,
NTSTATUS Status;
PUCHAR DataPtr;
ULONG i;
-
+
PAGED_CODE();
/* Verify that the handle is valid and is a registry key */
PREGISTRY_HIVE TempHive;
PKEY_OBJECT KeyObject;
NTSTATUS Status;
-
+
PAGED_CODE();
DPRINT ("NtSaveKey() called\n");
{
PKEY_OBJECT KeyObject;
NTSTATUS Status;
-
+
PAGED_CODE();
if (KeyInformationClass != KeyWriteTimeInformation)
{
PREGISTRY_HIVE RegistryHive;
NTSTATUS Status;
-
+
PAGED_CODE();
DPRINT ("NtUnloadKey() called\n");
NtInitializeRegistry (IN BOOLEAN SetUpBoot)
{
NTSTATUS Status;
-
+
PAGED_CODE();
if (CmiRegistryInitialized == TRUE)