[ros-dev] [ros-diffs] [jgardou] 63700: [NTOSKRNL] - Use ZwSetValueKey instead of NtSetValueKey - Properly probe and copy parameters when NtSetValueKey is called from UMode CORE-7738 #resolve #comment fixed in r63700
Jérôme Gardou
jerome.gardou at reactos.org
Tue Jul 8 22:39:55 UTC 2014
Please don't waste your time, I know the difference between Zw* and Nt*
calls.
What I don't know is then why the corrected version of NtSetValueKey
fails on this precise call when probing the data from kernel mode:
http://git.reactos.org/?p=reactos.git;a=blob;f=reactos/ntoskrnl/config/cmsysini.c;hb=e2cc20b12888094758ec5464c516ef150cbebd12#l561
Unless you disagree on the fact that the new code is correct.
I certainly should have investigated. Sorry about that.
Regarding code style, I'm not sure about what you are referring to.
As for reverting, I hope you will be patient enough to wait for tomorrow ;-)
Best regards
Jérôme
Le 08.07.2014 21:58, Alex Ionescu a écrit :
> Calling Nt in those functions was by design, and is how Windows does
> it as well. I can explain Nt vs Zw (for the 100th time) as needed, but
> for now, I'd kindly ask for a revert please.
>
> Second, the new code does not conform to formatting and style
> guidelines. Please fix the code before comitting.
>
> Best regards,
> Alex Ionescu
>
>
> On Tue, Jul 8, 2014 at 11:42 AM, <jgardou at svn.reactos.org
> <mailto:jgardou at svn.reactos.org>> wrote:
>
> Author: jgardou
> Date: Tue Jul 8 18:42:20 2014
> New Revision: 63700
>
> URL: http://svn.reactos.org/svn/reactos?rev=63700&view=rev
> Log:
> [NTOSKRNL]
> - Use ZwSetValueKey instead of NtSetValueKey
> - Properly probe and copy parameters when NtSetValueKey is called
> from UMode
> CORE-7738 #resolve #comment fixed in r63700
>
> Modified:
> trunk/reactos/ntoskrnl/config/cmconfig.c
> trunk/reactos/ntoskrnl/config/cmsysini.c
> trunk/reactos/ntoskrnl/config/i386/cmhardwr.c
> trunk/reactos/ntoskrnl/config/ntapi.c
> trunk/reactos/ntoskrnl/config/powerpc/cmhardwr.c
> trunk/reactos/ntoskrnl/ex/init.c
> trunk/reactos/ntoskrnl/io/iomgr/bootlog.c
>
> Modified: trunk/reactos/ntoskrnl/config/cmconfig.c
> URL:
> http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/config/cmconfig.c?rev=63700&r1=63699&r2=63700&view=diff
> ==============================================================================
> --- trunk/reactos/ntoskrnl/config/cmconfig.c [iso-8859-1]
> (original)
> +++ trunk/reactos/ntoskrnl/config/cmconfig.c [iso-8859-1] Tue
> Jul 8 18:42:20 2014
> @@ -97,7 +97,7 @@
>
> /* Setup the component information key */
> RtlInitUnicodeString(&ValueName, L"Component Information");
> - Status = NtSetValueKey(KeyHandle,
> + Status = ZwSetValueKey(KeyHandle,
> &ValueName,
> 0,
> REG_BINARY,
> @@ -124,7 +124,7 @@
> if (NT_SUCCESS(Status))
> {
> /* Save the identifier in the registry */
> - Status = NtSetValueKey(KeyHandle,
> + Status = ZwSetValueKey(KeyHandle,
> &ValueName,
> 0,
> REG_SZ,
> @@ -178,7 +178,7 @@
> CmpConfigurationData->BusNumber = BusNumber;
>
> /* Save the actual data */
> - Status = NtSetValueKey(KeyHandle,
> + Status = ZwSetValueKey(KeyHandle,
> &ValueName,
> 0,
> REG_FULL_RESOURCE_DESCRIPTOR,
>
> Modified: trunk/reactos/ntoskrnl/config/cmsysini.c
> URL:
> http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/config/cmsysini.c?rev=63700&r1=63699&r2=63700&view=diff
> ==============================================================================
> --- trunk/reactos/ntoskrnl/config/cmsysini.c [iso-8859-1]
> (original)
> +++ trunk/reactos/ntoskrnl/config/cmsysini.c [iso-8859-1] Tue
> Jul 8 18:42:20 2014
> @@ -416,7 +416,7 @@
>
> /* 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 @@
> /* 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 @@
> 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 @@
> 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;
> -
> - /* Don't need the handle */
> + if (!NT_SUCCESS(Status))
> + return Status;
> +
> + /* We don't need the handle */
> ZwClose(KeyHandle);
>
> /* Use hard-coded setting */
> @@ -533,7 +534,7 @@
> OBJ_CASE_INSENSITIVE,
> NULL,
> NULL);
> - Status = NtCreateKey(&KeyHandle,
> + Status = ZwCreateKey(&KeyHandle,
> KEY_CREATE_LINK,
> &ObjectAttributes,
> 0,
> @@ -557,7 +558,7 @@
> Status = RtlAnsiStringToUnicodeString(&KeyName, &TempString,
> FALSE);
>
> /* Set the value */
> - Status = NtSetValueKey(KeyHandle,
> + Status = ZwSetValueKey(KeyHandle,
> &CmSymbolicLinkValueName,
> 0,
> REG_LINK,
> @@ -572,7 +573,7 @@
> 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 @@
> ASSERT(STATUS_SUCCESS == Status);
>
> /* Set it */
> - Status = NtSetValueKey(KeyHandle,
> + Status = ZwSetValueKey(KeyHandle,
> &CmSymbolicLinkValueName,
> 0,
> REG_LINK,
> @@ -2180,7 +2181,7 @@
> RtlInitUnicodeString(&ValueData,
> Buffer);
>
> - NtSetValueKey(CurrentVersionKeyHandle,
> + ZwSetValueKey(CurrentVersionKeyHandle,
> &ValueName,
> 0,
> REG_SZ,
>
> Modified: trunk/reactos/ntoskrnl/config/i386/cmhardwr.c
> URL:
> http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/config/i386/cmhardwr.c?rev=63700&r1=63699&r2=63700&view=diff
> ==============================================================================
> --- trunk/reactos/ntoskrnl/config/i386/cmhardwr.c [iso-8859-1]
> (original)
> +++ trunk/reactos/ntoskrnl/config/i386/cmhardwr.c [iso-8859-1] Tue
> Jul 8 18:42:20 2014
> @@ -268,7 +268,7 @@
>
> /* Set the value */
> RtlInitUnicodeString(&ValueName,
> L"PhysicalAddressExtension");
> - NtSetValueKey(KeyHandle,
> + ZwSetValueKey(KeyHandle,
> &ValueName,
> 0,
> REG_DWORD,
> @@ -463,7 +463,7 @@
>
> /* Add it to the registry */
> RtlInitUnicodeString(&ValueName,
> L"ProcessorNameString");
> - Status = NtSetValueKey(KeyHandle,
> + Status = ZwSetValueKey(KeyHandle,
> &ValueName,
> 0,
> REG_SZ,
> @@ -486,7 +486,7 @@
>
> /* Add it to the registry */
> RtlInitUnicodeString(&ValueName,
> L"VendorIdentifier");
> - Status = NtSetValueKey(KeyHandle,
> + Status = ZwSetValueKey(KeyHandle,
> &ValueName,
> 0,
> REG_SZ,
> @@ -502,7 +502,7 @@
> {
> /* Add them to the registry */
> RtlInitUnicodeString(&ValueName, L"FeatureSet");
> - Status = NtSetValueKey(KeyHandle,
> + Status = ZwSetValueKey(KeyHandle,
> &ValueName,
> 0,
> REG_DWORD,
> @@ -515,7 +515,7 @@
> {
> /* Add it to the registry */
> RtlInitUnicodeString(&ValueName, L"~MHz");
> - Status = NtSetValueKey(KeyHandle,
> + Status = ZwSetValueKey(KeyHandle,
> &ValueName,
> 0,
> REG_DWORD,
> @@ -528,7 +528,7 @@
> {
> /* Add it to the registry */
> RtlInitUnicodeString(&ValueName, L"Update
> Signature");
> - Status = NtSetValueKey(KeyHandle,
> + Status = ZwSetValueKey(KeyHandle,
> &ValueName,
> 0,
> REG_BINARY,
> @@ -621,7 +621,7 @@
>
> /* Write the date into the registry */
> RtlInitUnicodeString(&ValueName, L"SystemBiosDate");
> - Status = NtSetValueKey(SystemHandle,
> + Status = ZwSetValueKey(SystemHandle,
> &ValueName,
> 0,
> REG_SZ,
> @@ -643,7 +643,7 @@
> if (NT_SUCCESS(Status))
> {
> /* Save it to the registry */
> - Status = NtSetValueKey(BiosHandle,
> + Status = ZwSetValueKey(BiosHandle,
> &ValueName,
> 0,
> REG_SZ,
> @@ -703,7 +703,7 @@
>
> /* 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 @@
>
> /* Write the date into the registry */
> RtlInitUnicodeString(&ValueName, L"VideoBiosDate");
> - Status = NtSetValueKey(SystemHandle,
> + Status = ZwSetValueKey(SystemHandle,
> &ValueName,
> 0,
> REG_SZ,
> @@ -801,7 +801,7 @@
>
> /* Write the BIOS Version to the registry */
> RtlInitUnicodeString(&ValueName,
> L"VideoBiosVersion");
> - Status = NtSetValueKey(SystemHandle,
> + Status = ZwSetValueKey(SystemHandle,
> &ValueName,
> 0,
> REG_MULTI_SZ,
>
> Modified: trunk/reactos/ntoskrnl/config/ntapi.c
> URL:
> http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/config/ntapi.c?rev=63700&r1=63699&r2=63700&view=diff
> ==============================================================================
> --- trunk/reactos/ntoskrnl/config/ntapi.c [iso-8859-1]
> (original)
> +++ trunk/reactos/ntoskrnl/config/ntapi.c [iso-8859-1] Tue
> Jul 8 18:42:20 2014
> @@ -33,7 +33,10 @@
> 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 @@
> sizeof(OBJECT_ATTRIBUTES),
> sizeof(ULONG));
>
> - if (Disposition) ProbeForWriteUlong(Disposition);
> + if (Disposition)
> + ProbeForWriteUlong(Disposition);
> }
> _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
> {
> @@ -101,6 +105,8 @@
> }
> _SEH2_END;
>
> + DPRINT("Returning handle %x, Status %x.\n", Handle, Status);
> +
> /* Return status */
> return Status;
> }
> @@ -116,7 +122,8 @@
> 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 @@
> _SEH2_END;
> }
>
> + DPRINT("Returning handle %x, Status %x.\n", Handle, Status);
> +
> /* Return status */
> return Status;
> }
> @@ -301,6 +310,7 @@
>
> /* Dereference and return status */
> ObDereferenceObject(KeyObject);
> + DPRINT("Returning status %x.\n", Status);
> return Status;
> }
>
> @@ -604,14 +614,52 @@
> 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 @@
> 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 @@
> (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 @@
> 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 @@
> 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;
> }
>
>
> Modified: trunk/reactos/ntoskrnl/config/powerpc/cmhardwr.c
> URL:
> http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/config/powerpc/cmhardwr.c?rev=63700&r1=63699&r2=63700&view=diff
> ==============================================================================
> --- trunk/reactos/ntoskrnl/config/powerpc/cmhardwr.c [iso-8859-1]
> (original)
> +++ trunk/reactos/ntoskrnl/config/powerpc/cmhardwr.c [iso-8859-1]
> Tue Jul 8 18:42:20 2014
> @@ -267,7 +267,7 @@
>
> /* Set the value */
> RtlInitUnicodeString(&ValueName,
> L"PhysicalAddressExtension");
> - NtSetValueKey(KeyHandle,
> + ZwSetValueKey(KeyHandle,
> &ValueName,
> 0,
> REG_DWORD,
> @@ -465,7 +465,7 @@
>
> /* Add it to the registry */
> RtlInitUnicodeString(&ValueName,
> L"ProcessorNameString");
> - Status = NtSetValueKey(KeyHandle,
> + Status = ZwSetValueKey(KeyHandle,
> &ValueName,
> 0,
> REG_SZ,
> @@ -488,7 +488,7 @@
>
> /* Add it to the registry */
> RtlInitUnicodeString(&ValueName,
> L"VendorIdentifier");
> - Status = NtSetValueKey(KeyHandle,
> + Status = ZwSetValueKey(KeyHandle,
> &ValueName,
> 0,
> REG_SZ,
> @@ -504,7 +504,7 @@
> {
> /* Add them to the registry */
> RtlInitUnicodeString(&ValueName, L"FeatureSet");
> - Status = NtSetValueKey(KeyHandle,
> + Status = ZwSetValueKey(KeyHandle,
> &ValueName,
> 0,
> REG_DWORD,
> @@ -517,7 +517,7 @@
> {
> /* Add it to the registry */
> RtlInitUnicodeString(&ValueName, L"~MHz");
> - Status = NtSetValueKey(KeyHandle,
> + Status = ZwSetValueKey(KeyHandle,
> &ValueName,
> 0,
> REG_DWORD,
> @@ -530,7 +530,7 @@
> {
> /* Add it to the registry */
> RtlInitUnicodeString(&ValueName, L"Update
> Signature");
> - Status = NtSetValueKey(KeyHandle,
> + Status = ZwSetValueKey(KeyHandle,
> &ValueName,
> 0,
> REG_BINARY,
> @@ -623,7 +623,7 @@
>
> /* Write the date into the registry */
> RtlInitUnicodeString(&ValueName, L"SystemBiosDate");
> - Status = NtSetValueKey(SystemHandle,
> + Status = ZwSetValueKey(SystemHandle,
> &ValueName,
> 0,
> REG_SZ,
> @@ -645,7 +645,7 @@
> if (NT_SUCCESS(Status))
> {
> /* Save it to the registry */
> - Status = NtSetValueKey(BiosHandle,
> + Status = ZwSetValueKey(BiosHandle,
> &ValueName,
> 0,
> REG_SZ,
> @@ -705,7 +705,7 @@
>
> /* 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 @@
>
> /* Write the date into the registry */
> RtlInitUnicodeString(&ValueName, L"VideoBiosDate");
> - Status = NtSetValueKey(SystemHandle,
> + Status = ZwSetValueKey(SystemHandle,
> &ValueName,
> 0,
> REG_SZ,
> @@ -804,7 +804,7 @@
>
> /* Write the BIOS Version to the registry */
> RtlInitUnicodeString(&ValueName,
> L"VideoBiosVersion");
> - Status = NtSetValueKey(SystemHandle,
> + Status = ZwSetValueKey(SystemHandle,
> &ValueName,
> 0,
> REG_MULTI_SZ,
>
> Modified: trunk/reactos/ntoskrnl/ex/init.c
> URL:
> http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ex/init.c?rev=63700&r1=63699&r2=63700&view=diff
> ==============================================================================
> --- trunk/reactos/ntoskrnl/ex/init.c [iso-8859-1] (original)
> +++ trunk/reactos/ntoskrnl/ex/init.c [iso-8859-1] Tue Jul 8
> 18:42:20 2014
> @@ -1853,7 +1853,7 @@
> {
> /* Write the safe boot type */
> RtlInitUnicodeString(&KeyName, L"OptionValue");
> - NtSetValueKey(OptionHandle,
> + ZwSetValueKey(OptionHandle,
> &KeyName,
> 0,
> REG_DWORD,
> @@ -1866,7 +1866,7 @@
> /* Remember this for later */
> Disposition = TRUE;
> RtlInitUnicodeString(&KeyName,
> L"UseAlternateShell");
> - NtSetValueKey(OptionHandle,
> + ZwSetValueKey(OptionHandle,
> &KeyName,
> 0,
> REG_DWORD,
>
> Modified: trunk/reactos/ntoskrnl/io/iomgr/bootlog.c
> URL:
> http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/io/iomgr/bootlog.c?rev=63700&r1=63699&r2=63700&view=diff
> ==============================================================================
> --- trunk/reactos/ntoskrnl/io/iomgr/bootlog.c [iso-8859-1]
> (original)
> +++ trunk/reactos/ntoskrnl/io/iomgr/bootlog.c [iso-8859-1] Tue
> Jul 8 18:42:20 2014
> @@ -135,7 +135,7 @@
>
> if (!NT_SUCCESS(Status))
> {
> - DPRINT1("NtSetValueKey() failed (Status %lx)\n", Status);
> + DPRINT1("ZwSetValueKey() failed (Status %lx)\n", Status);
> }
> else
> {
>
>
>
>
>
> _______________________________________________
> Ros-dev mailing list
> Ros-dev at reactos.org
> http://www.reactos.org/mailman/listinfo/ros-dev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.reactos.org/pipermail/ros-dev/attachments/20140709/622c3515/attachment-0001.html>
More information about the Ros-dev
mailing list