36 PVOID CurrentEnvironment, NewEnvironment =
NULL;
47 CurrentEnvironment =
NtCurrentPeb()->ProcessParameters->Environment;
48 if (CurrentEnvironment !=
NULL)
60 *OutEnvironment =
NULL;
75 *OutEnvironment =
NULL;
90 if (NewEnvironment ==
NULL)
105 *OutEnvironment = NewEnvironment;
151 DPRINT(
"RtlExpandEnvironmentStrings(%p, %S, %Iu, %p, %Iu, %p)\n",
158 if (*SourceBuffer !=
L'%')
160 CopyBuffer = SourceBuffer;
162 while (SourceLength != 0 && *SourceBuffer !=
L'%')
173 VariableEnd = SourceBuffer + 1;
174 Tail = SourceLength - 1;
175 while (*VariableEnd !=
L'%' && Tail != 0)
189 Value.Buffer = DestBuffer;
195 SourceBuffer = VariableEnd + 1;
196 SourceLength = Tail - 1;
213 CopyBuffer = SourceBuffer;
214 CopyLength = SourceLength - Tail + 1;
215 SourceLength -= CopyLength;
216 SourceBuffer += CopyLength;
222 CopyBuffer = SourceBuffer;
223 CopyLength = SourceLength;
231 if (DestMax < CopyLength)
233 CopyLength = DestMax;
237 DestMax -= CopyLength;
238 DestBuffer += CopyLength;
273 DPRINT(
"RtlExpandEnvironmentStrings_U %p %wZ %p %p\n",
318 DPRINT(
"NewEnvironment 0x%p OldEnvironment 0x%p\n",
319 NewEnvironment, OldEnvironment);
323 EnvPtr =
NtCurrentPeb()->ProcessParameters->Environment;
324 NtCurrentPeb()->ProcessParameters->Environment = NewEnvironment;
326 if (OldEnvironment !=
NULL)
327 *OldEnvironment = EnvPtr;
345 size_t hole_len, new_len, env_len = 0;
352 DPRINT(
"RtlSetEnvironmentVariable(Environment %p Name %wZ Value %wZ)\n",
384 env_end +=
wcslen(env_end) + 1;
387 env_len = env_end -
env;
388 DPRINT(
"environment length %lu characters\n", env_len);
402 var.MaximumLength =
var.Length;
429 hole_len =
tail - hole;
436 if (hole_len < new_len)
486 hole = new_env + (hole -
env);
491 tail = hole = new_env;
507 NtCurrentPeb()->ProcessParameters->Environment = new_env;
577 DPRINT(
"RtlQueryEnvironmentVariable_U Environment %p Variable %wZ Value %p\n",
613 varNameLen = (
wcs - varName);
618 if ((varNameLen == NameLength) &&
_wcsnicmp(varName,
Name, NameLength) == 0)
625 DPRINT(
"Return STATUS_SUCCESS\n");
632 DPRINT(
"Return STATUS_BUFFER_TOO_SMALL\n");
650 DPRINT(
"Return STATUS_VARIABLE_NOT_FOUND: %wZ\n",
Name);
_In_ PVOID _In_ ULONG _Out_ PVOID _In_ ULONG _Inout_ PULONG ReturnLength
struct outqueuenode * tail
struct outqueuenode * head
#define STATUS_NOT_IMPLEMENTED
static LPCWSTR LPCWSTR LPCWSTR env
#define NT_SUCCESS(StatCode)
_ACRTIMP size_t __cdecl wcslen(const wchar_t *)
_ACRTIMP int __cdecl _wcsnicmp(const wchar_t *, const wchar_t *, size_t)
ULONG RtlCompareUnicodeString(PUNICODE_STRING s1, PUNICODE_STRING s2, BOOLEAN UpCase)
#define ROUND_UP(n, align)
#define memcpy(s1, s2, n)
#define memmove(s1, s2, n)
PVOID PVOID PWCHAR PVOID Environment
static const UNICODE_STRING const UNICODE_STRING const UNICODE_STRING const UNICODE_STRING PWSTR
__kernel_entry _Inout_ _Inout_ PSIZE_T RegionSize
_Out_ _Inout_ POEM_STRING _In_ PCUNICODE_STRING SourceString
NTSYSAPI NTSTATUS NTAPI RtlSetEnvironmentVariable(_In_z_ PWSTR *Environment, _In_ PUNICODE_STRING Name, _In_ PUNICODE_STRING Value)
NTSYSAPI NTSTATUS NTAPI RtlCreateEnvironment(_In_ BOOLEAN Inherit, _Out_ PWSTR *Environment)
NTSYSAPI VOID NTAPI RtlDestroyEnvironment(_In_ PWSTR Environment)
_In_ PUNICODE_STRING _Inout_ PUNICODE_STRING Destination
_Out_ _Inout_ POEM_STRING DestinationString
NTSYSAPI NTSTATUS NTAPI RtlQueryEnvironmentVariable_U(_In_opt_ PWSTR Environment, _In_ PCUNICODE_STRING Name, _Out_ PUNICODE_STRING Value)
#define NtCurrentProcess()
#define UNICODE_STRING_MAX_CHARS
_In_ ULONG _In_ ULONG _In_ ULONG Length
NTSTATUS NTAPI NtFreeVirtualMemory(IN HANDLE ProcessHandle, IN PVOID *UBaseAddress, IN PSIZE_T URegionSize, IN ULONG FreeType)
NTSTATUS NTAPI NtQueryVirtualMemory(IN HANDLE ProcessHandle, IN PVOID BaseAddress, IN MEMORY_INFORMATION_CLASS MemoryInformationClass, OUT PVOID MemoryInformation, IN SIZE_T MemoryInformationLength, OUT PSIZE_T ReturnLength)
NTSTATUS NTAPI NtAllocateVirtualMemory(IN HANDLE ProcessHandle, IN OUT PVOID *UBaseAddress, IN ULONG_PTR ZeroBits, IN OUT PSIZE_T URegionSize, IN ULONG AllocationType, IN ULONG Protect)
#define STATUS_VARIABLE_NOT_FOUND
NTSTATUS NTAPI RtlQueryEnvironmentVariable(_In_opt_ PVOID Environment, _In_reads_(NameLength) PWSTR Name, _In_ SIZE_T NameLength, _Out_writes_(ValueLength) PWSTR Value, _In_ SIZE_T ValueLength, _Out_ PSIZE_T ReturnLength)
NTSTATUS NTAPI RtlSetEnvironmentStrings(_In_ PWCHAR NewEnvironment, _In_ ULONG NewEnvironmentSize)
NTSTATUS NTAPI RtlExpandEnvironmentStrings(_In_opt_ PVOID Environment, _In_reads_(SourceLength) PCWSTR SourceBuffer, _In_ SIZE_T SourceLength, _Out_writes_(DestMax) PWSTR Destination, _In_ SIZE_T DestMax, _Out_opt_ PSIZE_T Length)
NTSTATUS NTAPI RtlExpandEnvironmentStrings_U(_In_opt_ PWSTR Environment, _In_ PUNICODE_STRING SourceString, _Inout_ PUNICODE_STRING DestinationString, _In_ PULONG ReturnLength)
#define STATUS_BUFFER_TOO_SMALL
PRTL_USER_PROCESS_PARAMETERS ProcessParameters
unsigned short MaximumLength
#define RtlCopyMemory(Destination, Source, Length)
#define RtlZeroMemory(Destination, Length)
#define STATUS_INVALID_PARAMETER
#define STATUS_UNSUCCESSFUL
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY _In_ ULONG _Out_ PULONG ResultLength
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _In_ ULONG ValueLength
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
NTSYSAPI void WINAPI RtlReleasePebLock(void)
NTSYSAPI void WINAPI RtlAcquirePebLock(void)
NTSYSAPI PEB *WINAPI RtlGetCurrentPeb(void)
NTSYSAPI void WINAPI RtlSetCurrentEnvironment(PWSTR, PWSTR *)