[ros-dev] [ros-diffs] [hbelusca] 57504: [NTOSKRNL] Rearrange the NtQuerySystemEnvironmentValue code to have successive logical checks.
Timo Kreuzer
timo.kreuzer at web.de
Sat Oct 6 20:20:40 UTC 2012
This changes the logic. I'm not sure how exact the previous version was,
but these changes should be tested.
Am 06.10.2012 21:50, schrieb hbelusca at svn.reactos.org:
> Author: hbelusca
> Date: Sat Oct 6 19:50:17 2012
> New Revision: 57504
>
> URL: http://svn.reactos.org/svn/reactos?rev=57504&view=rev
> Log:
> [NTOSKRNL]
> Rearrange the NtQuerySystemEnvironmentValue code to have successive logical checks.
>
> Modified:
> trunk/reactos/ntoskrnl/ex/sysinfo.c
>
> Modified: trunk/reactos/ntoskrnl/ex/sysinfo.c
> URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ex/sysinfo.c?rev=57504&r1=57503&r2=57504&view=diff
> ==============================================================================
> --- trunk/reactos/ntoskrnl/ex/sysinfo.c [iso-8859-1] (original)
> +++ trunk/reactos/ntoskrnl/ex/sysinfo.c [iso-8859-1] Sat Oct 6 19:50:17 2012
> @@ -235,44 +235,40 @@
> _SEH2_YIELD(return _SEH2_GetExceptionCode());
> }
> _SEH2_END;
> -
> - }
> -
> - /* Allocate a buffer for the value */
> - AnsiValueBuffer = ExAllocatePoolWithTag(NonPagedPool, ValueBufferLength, 'pmeT');
> - if (AnsiValueBuffer == NULL)
> - {
> - return STATUS_INSUFFICIENT_RESOURCES;
> - }
> -
> - /*
> - * Copy the name to kernel space if necessary and convert it to ANSI.
> - */
> + }
> +
> + /* According to NTInternals the SeSystemEnvironmentName privilege is required! */
> + if (!SeSinglePrivilegeCheck(SeSystemEnvironmentPrivilege, PreviousMode))
> + {
> + DPRINT1("NtQuerySystemEnvironmentValue: Caller requires the SeSystemEnvironmentPrivilege privilege!\n");
> + return STATUS_PRIVILEGE_NOT_HELD;
> + }
> +
> + /* Copy the name to kernel space if necessary */
> Status = ProbeAndCaptureUnicodeString(&WName, PreviousMode, VariableName);
> if (!NT_SUCCESS(Status))
> {
> return Status;
> }
>
> - /*
> - * according to ntinternals the SeSystemEnvironmentName privilege is required!
> - */
> - if (!SeSinglePrivilegeCheck(SeSystemEnvironmentPrivilege, PreviousMode))
> - {
> - ReleaseCapturedUnicodeString(&WName, PreviousMode);
> - DPRINT1("NtQuerySystemEnvironmentValue: Caller requires the SeSystemEnvironmentPrivilege privilege!\n");
> - return STATUS_PRIVILEGE_NOT_HELD;
> - }
> -
> - /* Convert the value name to ansi and release the captured unicode string */
> + /* Convert the name to ANSI and release the captured UNICODE string */
> Status = RtlUnicodeStringToAnsiString(&AName, &WName, TRUE);
> ReleaseCapturedUnicodeString(&WName, PreviousMode);
> if (!NT_SUCCESS(Status)) return Status;
>
> - /* Get the environment variable */
> + /* Allocate a buffer for the ANSI environment variable */
> + AnsiValueBuffer = ExAllocatePoolWithTag(NonPagedPool, ValueBufferLength, 'pmeT');
> + if (AnsiValueBuffer == NULL)
> + {
> + RtlFreeAnsiString(&AName);
> + return STATUS_INSUFFICIENT_RESOURCES;
> + }
> +
> + /* Get the environment variable and free the ANSI name */
> Result = HalGetEnvironmentVariable(AName.Buffer,
> (USHORT)ValueBufferLength,
> AnsiValueBuffer);
> + RtlFreeAnsiString(&AName);
>
> /* Check if we had success */
> if (Result == ESUCCESS)
> @@ -280,13 +276,13 @@
> /* Copy the result back to the caller. */
> _SEH2_TRY
> {
> - /* Initialize ansi string from the result */
> + /* Initialize ANSI string from the result */
> RtlInitAnsiString(&AValue, AnsiValueBuffer);
>
> - /* Initialize a unicode string from the callers buffer */
> + /* Initialize a UNICODE string from the callers buffer */
> RtlInitEmptyUnicodeString(&WValue, ValueBuffer, ValueBufferLength);
>
> - /* Convert the result to unicode */
> + /* Convert the result to UNICODE */
> Status = RtlAnsiStringToUnicodeString(&WValue, &AValue, FALSE);
>
> if (ReturnLength != NULL)
> @@ -305,8 +301,7 @@
> Status = STATUS_UNSUCCESSFUL;
> }
>
> - /* Cleanup allocated resources. */
> - RtlFreeAnsiString(&AName);
> + /* Free the allocated ANSI value buffer */
> ExFreePoolWithTag(AnsiValueBuffer, 'pmeT');
>
> return Status;
>
>
>
More information about the Ros-dev
mailing list