[NTOSKRNL]

- Use ZwSetValueKey instead of NtSetValueKey
 - Properly probe and copy parameters when NtSetValueKey is called from UMode
CORE-7738 #resolve #comment fixed in r63700

svn path=/trunk/; revision=63700
This commit is contained in:
Jérôme Gardou 2014-07-08 18:42:20 +00:00
parent d331e1725b
commit 3eaff9c2bc
7 changed files with 108 additions and 53 deletions

View file

@ -97,7 +97,7 @@ CmpInitializeRegistryNode(IN PCONFIGURATION_COMPONENT_DATA CurrentEntry,
/* Setup the component information key */
RtlInitUnicodeString(&ValueName, L"Component Information");
Status = NtSetValueKey(KeyHandle,
Status = ZwSetValueKey(KeyHandle,
&ValueName,
0,
REG_BINARY,
@ -124,7 +124,7 @@ CmpInitializeRegistryNode(IN PCONFIGURATION_COMPONENT_DATA CurrentEntry,
if (NT_SUCCESS(Status))
{
/* Save the identifier in the registry */
Status = NtSetValueKey(KeyHandle,
Status = ZwSetValueKey(KeyHandle,
&ValueName,
0,
REG_SZ,
@ -178,7 +178,7 @@ CmpInitializeRegistryNode(IN PCONFIGURATION_COMPONENT_DATA CurrentEntry,
CmpConfigurationData->BusNumber = BusNumber;
/* Save the actual data */
Status = NtSetValueKey(KeyHandle,
Status = ZwSetValueKey(KeyHandle,
&ValueName,
0,
REG_FULL_RESOURCE_DESCRIPTOR,

View file

@ -416,7 +416,7 @@ CmpSetSystemValues(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
/* Key opened, now write to the key */
RtlInitUnicodeString(&KeyName, L"SystemStartOptions");
Status = NtSetValueKey(KeyHandle,
Status = ZwSetValueKey(KeyHandle,
&KeyName,
0,
REG_SZ,
@ -427,7 +427,7 @@ CmpSetSystemValues(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
/* Setup value name for system boot device in ARC format */
RtlInitUnicodeString(&KeyName, L"SystemBootDevice");
RtlCreateUnicodeStringFromAsciiz(&ValueName, LoaderBlock->ArcBootDeviceName);
Status = NtSetValueKey(KeyHandle,
Status = ZwSetValueKey(KeyHandle,
&KeyName,
0,
REG_SZ,
@ -474,7 +474,7 @@ CmpCreateControlSet(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
OBJ_CASE_INSENSITIVE,
NULL,
NULL);
Status = NtOpenKey(&SelectHandle, KEY_READ, &ObjectAttributes);
Status = ZwOpenKey(&SelectHandle, KEY_READ, &ObjectAttributes);
if (!NT_SUCCESS(Status))
{
/* ReactOS Hack: Hard-code current to 001 for SetupLdr */
@ -488,16 +488,17 @@ CmpCreateControlSet(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
OBJ_CASE_INSENSITIVE,
NULL,
NULL);
Status = NtCreateKey(&KeyHandle,
Status = ZwCreateKey(&KeyHandle,
KEY_ALL_ACCESS,
&ObjectAttributes,
0,
NULL,
0,
&Disposition);
if (!NT_SUCCESS(Status)) return Status;
if (!NT_SUCCESS(Status))
return Status;
/* Don't need the handle */
/* We don't need the handle */
ZwClose(KeyHandle);
/* Use hard-coded setting */
@ -533,7 +534,7 @@ UseSet:
OBJ_CASE_INSENSITIVE,
NULL,
NULL);
Status = NtCreateKey(&KeyHandle,
Status = ZwCreateKey(&KeyHandle,
KEY_CREATE_LINK,
&ObjectAttributes,
0,
@ -557,7 +558,7 @@ UseSet:
Status = RtlAnsiStringToUnicodeString(&KeyName, &TempString, FALSE);
/* Set the value */
Status = NtSetValueKey(KeyHandle,
Status = ZwSetValueKey(KeyHandle,
&CmSymbolicLinkValueName,
0,
REG_LINK,
@ -572,7 +573,7 @@ UseSet:
KeyHandle,
NULL);
Status = NtOpenKey(&ConfigHandle, KEY_READ, &ObjectAttributes);
NtClose(KeyHandle);
ZwClose(KeyHandle);
/* Check if we don't have one */
if (!NT_SUCCESS(Status))
@ -689,7 +690,7 @@ UseSet:
ASSERT(STATUS_SUCCESS == Status);
/* Set it */
Status = NtSetValueKey(KeyHandle,
Status = ZwSetValueKey(KeyHandle,
&CmSymbolicLinkValueName,
0,
REG_LINK,
@ -2180,7 +2181,7 @@ CmpSetVersionData(VOID)
RtlInitUnicodeString(&ValueData,
Buffer);
NtSetValueKey(CurrentVersionKeyHandle,
ZwSetValueKey(CurrentVersionKeyHandle,
&ValueName,
0,
REG_SZ,

View file

@ -268,7 +268,7 @@ CmpInitializeMachineDependentConfiguration(IN PLOADER_PARAMETER_BLOCK LoaderBloc
/* Set the value */
RtlInitUnicodeString(&ValueName, L"PhysicalAddressExtension");
NtSetValueKey(KeyHandle,
ZwSetValueKey(KeyHandle,
&ValueName,
0,
REG_DWORD,
@ -463,7 +463,7 @@ CmpInitializeMachineDependentConfiguration(IN PLOADER_PARAMETER_BLOCK LoaderBloc
/* Add it to the registry */
RtlInitUnicodeString(&ValueName, L"ProcessorNameString");
Status = NtSetValueKey(KeyHandle,
Status = ZwSetValueKey(KeyHandle,
&ValueName,
0,
REG_SZ,
@ -486,7 +486,7 @@ CmpInitializeMachineDependentConfiguration(IN PLOADER_PARAMETER_BLOCK LoaderBloc
/* Add it to the registry */
RtlInitUnicodeString(&ValueName, L"VendorIdentifier");
Status = NtSetValueKey(KeyHandle,
Status = ZwSetValueKey(KeyHandle,
&ValueName,
0,
REG_SZ,
@ -502,7 +502,7 @@ CmpInitializeMachineDependentConfiguration(IN PLOADER_PARAMETER_BLOCK LoaderBloc
{
/* Add them to the registry */
RtlInitUnicodeString(&ValueName, L"FeatureSet");
Status = NtSetValueKey(KeyHandle,
Status = ZwSetValueKey(KeyHandle,
&ValueName,
0,
REG_DWORD,
@ -515,7 +515,7 @@ CmpInitializeMachineDependentConfiguration(IN PLOADER_PARAMETER_BLOCK LoaderBloc
{
/* Add it to the registry */
RtlInitUnicodeString(&ValueName, L"~MHz");
Status = NtSetValueKey(KeyHandle,
Status = ZwSetValueKey(KeyHandle,
&ValueName,
0,
REG_DWORD,
@ -528,7 +528,7 @@ CmpInitializeMachineDependentConfiguration(IN PLOADER_PARAMETER_BLOCK LoaderBloc
{
/* Add it to the registry */
RtlInitUnicodeString(&ValueName, L"Update Signature");
Status = NtSetValueKey(KeyHandle,
Status = ZwSetValueKey(KeyHandle,
&ValueName,
0,
REG_BINARY,
@ -621,7 +621,7 @@ CmpInitializeMachineDependentConfiguration(IN PLOADER_PARAMETER_BLOCK LoaderBloc
/* Write the date into the registry */
RtlInitUnicodeString(&ValueName, L"SystemBiosDate");
Status = NtSetValueKey(SystemHandle,
Status = ZwSetValueKey(SystemHandle,
&ValueName,
0,
REG_SZ,
@ -643,7 +643,7 @@ CmpInitializeMachineDependentConfiguration(IN PLOADER_PARAMETER_BLOCK LoaderBloc
if (NT_SUCCESS(Status))
{
/* Save it to the registry */
Status = NtSetValueKey(BiosHandle,
Status = ZwSetValueKey(BiosHandle,
&ValueName,
0,
REG_SZ,
@ -703,7 +703,7 @@ CmpInitializeMachineDependentConfiguration(IN PLOADER_PARAMETER_BLOCK LoaderBloc
/* Write the BIOS Version to the registry */
RtlInitUnicodeString(&ValueName, L"SystemBiosVersion");
Status = NtSetValueKey(SystemHandle,
Status = ZwSetValueKey(SystemHandle,
&ValueName,
0,
REG_MULTI_SZ,
@ -746,7 +746,7 @@ CmpInitializeMachineDependentConfiguration(IN PLOADER_PARAMETER_BLOCK LoaderBloc
/* Write the date into the registry */
RtlInitUnicodeString(&ValueName, L"VideoBiosDate");
Status = NtSetValueKey(SystemHandle,
Status = ZwSetValueKey(SystemHandle,
&ValueName,
0,
REG_SZ,
@ -801,7 +801,7 @@ CmpInitializeMachineDependentConfiguration(IN PLOADER_PARAMETER_BLOCK LoaderBloc
/* Write the BIOS Version to the registry */
RtlInitUnicodeString(&ValueName, L"VideoBiosVersion");
Status = NtSetValueKey(SystemHandle,
Status = ZwSetValueKey(SystemHandle,
&ValueName,
0,
REG_MULTI_SZ,

View file

@ -33,7 +33,10 @@ NtCreateKey(OUT PHANDLE KeyHandle,
CM_PARSE_CONTEXT ParseContext = {0};
HANDLE Handle;
PAGED_CODE();
DPRINT("NtCreateKey(OB name %wZ)\n", ObjectAttributes->ObjectName);
DPRINT("NtCreateKey(Path: %wZ, Root %x, Access: %x, CreateOptions %x)\n",
ObjectAttributes->ObjectName, ObjectAttributes->RootDirectory,
DesiredAccess, CreateOptions);
/* Check for user-mode caller */
if (PreviousMode != KernelMode)
@ -60,7 +63,8 @@ NtCreateKey(OUT PHANDLE KeyHandle,
sizeof(OBJECT_ATTRIBUTES),
sizeof(ULONG));
if (Disposition) ProbeForWriteUlong(Disposition);
if (Disposition)
ProbeForWriteUlong(Disposition);
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
@ -101,6 +105,8 @@ NtCreateKey(OUT PHANDLE KeyHandle,
}
_SEH2_END;
DPRINT("Returning handle %x, Status %x.\n", Handle, Status);
/* Return status */
return Status;
}
@ -116,7 +122,8 @@ NtOpenKey(OUT PHANDLE KeyHandle,
NTSTATUS Status;
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
PAGED_CODE();
DPRINT("NtOpenKey(OB 0x%wZ)\n", ObjectAttributes->ObjectName);
DPRINT("NtOpenKey(Path: %wZ, Root %x, Access: %x)\n",
ObjectAttributes->ObjectName, ObjectAttributes->RootDirectory, DesiredAccess);
/* Check for user-mode caller */
if (PreviousMode != KernelMode)
@ -166,6 +173,8 @@ NtOpenKey(OUT PHANDLE KeyHandle,
_SEH2_END;
}
DPRINT("Returning handle %x, Status %x.\n", Handle, Status);
/* Return status */
return Status;
}
@ -301,6 +310,7 @@ NtEnumerateKey(IN HANDLE KeyHandle,
/* Dereference and return status */
ObDereferenceObject(KeyObject);
DPRINT("Returning status %x.\n", Status);
return Status;
}
@ -604,14 +614,52 @@ NtSetValueKey(IN HANDLE KeyHandle,
IN PVOID Data,
IN ULONG DataSize)
{
NTSTATUS Status;
PCM_KEY_BODY KeyObject;
NTSTATUS Status = STATUS_SUCCESS;
PCM_KEY_BODY KeyObject = NULL;
REG_SET_VALUE_KEY_INFORMATION SetValueKeyInfo;
REG_POST_OPERATION_INFORMATION PostOperationInfo;
UNICODE_STRING ValueNameCopy = *ValueName;
UNICODE_STRING ValueNameCopy;
KPROCESSOR_MODE PreviousMode;
PAGED_CODE();
PreviousMode = ExGetPreviousMode();
if (Data && !DataSize)
return STATUS_INVALID_PARAMETER;
/* Probe and copy the data */
if ((PreviousMode != KernelMode) && Data)
{
PVOID DataCopy = ExAllocatePoolWithTag(PagedPool, DataSize, TAG_CM);
if (!DataCopy)
return STATUS_NO_MEMORY;
_SEH2_TRY
{
ProbeForRead(Data, DataSize, 1);
RtlCopyMemory(DataCopy, Data, DataSize);
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
Status = _SEH2_GetExceptionCode();
}
_SEH2_END;
if (!NT_SUCCESS(Status))
{
ExFreePoolWithTag(DataCopy, TAG_CM);
return Status;
}
Data = DataCopy;
}
/* Capture the string */
Status = ProbeAndCaptureUnicodeString(&ValueNameCopy, PreviousMode, ValueName);
if (!NT_SUCCESS(Status))
goto end;
DPRINT("NtSetValueKey() KH 0x%p, VN '%wZ', TI %x, T %lu, DS %lu\n",
KeyHandle, ValueName, TitleIndex, Type, DataSize);
KeyHandle, &ValueNameCopy, TitleIndex, Type, DataSize);
/* Verify that the handle is valid and is a registry key */
Status = ObReferenceObjectByHandle(KeyHandle,
@ -620,7 +668,8 @@ NtSetValueKey(IN HANDLE KeyHandle,
ExGetPreviousMode(),
(PVOID*)&KeyObject,
NULL);
if (!NT_SUCCESS(Status)) return Status;
if (!NT_SUCCESS(Status))
goto end;
/* Make sure the name is aligned, not too long, and the data under 4GB */
if ( (ValueNameCopy.Length > 32767) ||
@ -628,8 +677,8 @@ NtSetValueKey(IN HANDLE KeyHandle,
(DataSize > 0x80000000))
{
/* Fail */
ObDereferenceObject(KeyObject);
return STATUS_INVALID_PARAMETER;
Status = STATUS_INVALID_PARAMETER;
goto end;
}
/* Ignore any null characters at the end */
@ -644,14 +693,14 @@ NtSetValueKey(IN HANDLE KeyHandle,
if (KeyObject->KeyControlBlock->ExtFlags & CM_KCB_READ_ONLY_KEY)
{
/* Fail */
ObDereferenceObject(KeyObject);
return STATUS_ACCESS_DENIED;
Status = STATUS_ACCESS_DENIED;
goto end;
}
/* Setup callback */
PostOperationInfo.Object = (PVOID)KeyObject;
SetValueKeyInfo.Object = (PVOID)KeyObject;
SetValueKeyInfo.ValueName = ValueName;
SetValueKeyInfo.ValueName = &ValueNameCopy;
SetValueKeyInfo.TitleIndex = TitleIndex;
SetValueKeyInfo.Type = Type;
SetValueKeyInfo.Data = Data;
@ -673,8 +722,13 @@ NtSetValueKey(IN HANDLE KeyHandle,
PostOperationInfo.Status = Status;
CmiCallRegisteredCallbacks(RegNtPostSetValueKey, &PostOperationInfo);
end:
/* Dereference and return status */
ObDereferenceObject(KeyObject);
if (KeyObject)
ObDereferenceObject(KeyObject);
ReleaseCapturedUnicodeString(&ValueNameCopy, PreviousMode);
if ((PreviousMode != KernelMode) && Data)
ExFreePoolWithTag(Data, TAG_CM);
return Status;
}

View file

@ -267,7 +267,7 @@ CmpInitializeMachineDependentConfiguration(IN PLOADER_PARAMETER_BLOCK LoaderBloc
/* Set the value */
RtlInitUnicodeString(&ValueName, L"PhysicalAddressExtension");
NtSetValueKey(KeyHandle,
ZwSetValueKey(KeyHandle,
&ValueName,
0,
REG_DWORD,
@ -465,7 +465,7 @@ CmpInitializeMachineDependentConfiguration(IN PLOADER_PARAMETER_BLOCK LoaderBloc
/* Add it to the registry */
RtlInitUnicodeString(&ValueName, L"ProcessorNameString");
Status = NtSetValueKey(KeyHandle,
Status = ZwSetValueKey(KeyHandle,
&ValueName,
0,
REG_SZ,
@ -488,7 +488,7 @@ CmpInitializeMachineDependentConfiguration(IN PLOADER_PARAMETER_BLOCK LoaderBloc
/* Add it to the registry */
RtlInitUnicodeString(&ValueName, L"VendorIdentifier");
Status = NtSetValueKey(KeyHandle,
Status = ZwSetValueKey(KeyHandle,
&ValueName,
0,
REG_SZ,
@ -504,7 +504,7 @@ CmpInitializeMachineDependentConfiguration(IN PLOADER_PARAMETER_BLOCK LoaderBloc
{
/* Add them to the registry */
RtlInitUnicodeString(&ValueName, L"FeatureSet");
Status = NtSetValueKey(KeyHandle,
Status = ZwSetValueKey(KeyHandle,
&ValueName,
0,
REG_DWORD,
@ -517,7 +517,7 @@ CmpInitializeMachineDependentConfiguration(IN PLOADER_PARAMETER_BLOCK LoaderBloc
{
/* Add it to the registry */
RtlInitUnicodeString(&ValueName, L"~MHz");
Status = NtSetValueKey(KeyHandle,
Status = ZwSetValueKey(KeyHandle,
&ValueName,
0,
REG_DWORD,
@ -530,7 +530,7 @@ CmpInitializeMachineDependentConfiguration(IN PLOADER_PARAMETER_BLOCK LoaderBloc
{
/* Add it to the registry */
RtlInitUnicodeString(&ValueName, L"Update Signature");
Status = NtSetValueKey(KeyHandle,
Status = ZwSetValueKey(KeyHandle,
&ValueName,
0,
REG_BINARY,
@ -623,7 +623,7 @@ CmpInitializeMachineDependentConfiguration(IN PLOADER_PARAMETER_BLOCK LoaderBloc
/* Write the date into the registry */
RtlInitUnicodeString(&ValueName, L"SystemBiosDate");
Status = NtSetValueKey(SystemHandle,
Status = ZwSetValueKey(SystemHandle,
&ValueName,
0,
REG_SZ,
@ -645,7 +645,7 @@ CmpInitializeMachineDependentConfiguration(IN PLOADER_PARAMETER_BLOCK LoaderBloc
if (NT_SUCCESS(Status))
{
/* Save it to the registry */
Status = NtSetValueKey(BiosHandle,
Status = ZwSetValueKey(BiosHandle,
&ValueName,
0,
REG_SZ,
@ -705,7 +705,7 @@ CmpInitializeMachineDependentConfiguration(IN PLOADER_PARAMETER_BLOCK LoaderBloc
/* Write the BIOS Version to the registry */
RtlInitUnicodeString(&ValueName, L"SystemBiosVersion");
Status = NtSetValueKey(SystemHandle,
Status = ZwSetValueKey(SystemHandle,
&ValueName,
0,
REG_MULTI_SZ,
@ -749,7 +749,7 @@ CmpInitializeMachineDependentConfiguration(IN PLOADER_PARAMETER_BLOCK LoaderBloc
/* Write the date into the registry */
RtlInitUnicodeString(&ValueName, L"VideoBiosDate");
Status = NtSetValueKey(SystemHandle,
Status = ZwSetValueKey(SystemHandle,
&ValueName,
0,
REG_SZ,
@ -804,7 +804,7 @@ CmpInitializeMachineDependentConfiguration(IN PLOADER_PARAMETER_BLOCK LoaderBloc
/* Write the BIOS Version to the registry */
RtlInitUnicodeString(&ValueName, L"VideoBiosVersion");
Status = NtSetValueKey(SystemHandle,
Status = ZwSetValueKey(SystemHandle,
&ValueName,
0,
REG_MULTI_SZ,

View file

@ -1853,7 +1853,7 @@ Phase1InitializationDiscard(IN PVOID Context)
{
/* Write the safe boot type */
RtlInitUnicodeString(&KeyName, L"OptionValue");
NtSetValueKey(OptionHandle,
ZwSetValueKey(OptionHandle,
&KeyName,
0,
REG_DWORD,
@ -1866,7 +1866,7 @@ Phase1InitializationDiscard(IN PVOID Context)
/* Remember this for later */
Disposition = TRUE;
RtlInitUnicodeString(&KeyName, L"UseAlternateShell");
NtSetValueKey(OptionHandle,
ZwSetValueKey(OptionHandle,
&KeyName,
0,
REG_DWORD,

View file

@ -135,7 +135,7 @@ IopBootLog(PUNICODE_STRING DriverName,
if (!NT_SUCCESS(Status))
{
DPRINT1("NtSetValueKey() failed (Status %lx)\n", Status);
DPRINT1("ZwSetValueKey() failed (Status %lx)\n", Status);
}
else
{