<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1255">
<style type="text/css">body p { margin-bottom: 0cm; margin-top: 0pt; } </style>
</head>
<body bidimailui-detected-decoding-type="preferred-charset">
<br>
<div class="moz-forward-container">Hi,</div>
<div class="moz-forward-container">thank you for the comments.</div>
<div class="moz-forward-container">I am sending this to you directly
since I do not knowif I can send to the list.</div>
<div class="moz-forward-container">I always sent then in the same
way (git send-email) and get the mail myself.</div>
<div class="moz-forward-container">sometime I can see it in the list
archive and sometime I do not, I guess it have something to do
with the DDOS attack on winehq</div>
<div class="moz-forward-container"><br>
</div>
<div class="moz-forward-container">Alon.<br>
</div>
<div class="moz-forward-container"><br>
</div>
<div class="moz-forward-container"><br>
</div>
<div class="moz-forward-container"><br>
-------- Forwarded Message --------
<table class="moz-email-headers-table" cellspacing="0" cellpadding="0" border="0">
<tbody>
<tr>
<th valign="BASELINE" nowrap="nowrap" align="RIGHT">Subject:
</th>
<td>[PATCH] Add missing RtlQueryEnvironmentVariable to ntdll
with sign Wine-Bug:
<a class="moz-txt-link-freetext" href="https://bugs.winehq.org/show_bug.cgi?id=48773">https://bugs.winehq.org/show_bug.cgi?id=48773</a>
Signed-off-by: Alon Barzilai <a class="moz-txt-link-rfc2396E" href="mailto:alon@skylinesoft.com"><alon@skylinesoft.com></a></td>
</tr>
<tr>
<th valign="BASELINE" nowrap="nowrap" align="RIGHT">Date: </th>
<td>Sun, 3 May 2020 20:33:20 +0300</td>
</tr>
<tr>
<th valign="BASELINE" nowrap="nowrap" align="RIGHT">From: </th>
<td>Alon Barzilai <a class="moz-txt-link-rfc2396E" href="mailto:alon@skylinesoft.com"><alon@skylinesoft.com></a></td>
</tr>
<tr>
<th valign="BASELINE" nowrap="nowrap" align="RIGHT">To: </th>
<td><a class="moz-txt-link-abbreviated" href="mailto:wine-devel@winehq.org">wine-devel@winehq.org</a></td>
</tr>
<tr>
<th valign="BASELINE" nowrap="nowrap" align="RIGHT">CC: </th>
<td>Alon Barzilai <a class="moz-txt-link-rfc2396E" href="mailto:alon@skylinesoft.com"><alon@skylinesoft.com></a></td>
</tr>
</tbody>
</table>
<br>
<br>
---<br>
dlls/ntdll/env.c | 38 +++++++++++++++++++++++++++++++++++++<br>
dlls/ntdll/ntdll.spec | 1 +<br>
dlls/ntdll/tests/env.c | 43
++++++++++++++++++++++++++++++++++++++++++<br>
3 files changed, 82 insertions(+)<br>
<br>
diff --git a/dlls/ntdll/env.c b/dlls/ntdll/env.c<br>
index 71ae48681d..59aac39a7b 100644<br>
--- a/dlls/ntdll/env.c<br>
+++ b/dlls/ntdll/env.c<br>
@@ -990,6 +990,44 @@ NTSTATUS WINAPI
RtlQueryEnvironmentVariable_U(PWSTR env,<br>
return nts;<br>
}<br>
+<br>
+/******************************************************************<br>
+ * RtlQueryEnvironmentVariable [NTDLL.@]<br>
+ *<br>
+ */<br>
+NTSTATUS WINAPI RtlQueryEnvironmentVariable(WCHAR* env, WCHAR*
name, SIZE_T name_length, WCHAR* value, SIZE_T value_length,
SIZE_T* return_length)<br>
+{<br>
+ UNICODE_STRING name_u;<br>
+ UNICODE_STRING value_u;<br>
+ NTSTATUS nts;<br>
+<br>
+ name_u.Length = name_length * sizeof(WCHAR);<br>
+ name_u.MaximumLength = name_u.Length;<br>
+ name_u.Buffer = name;<br>
+<br>
+ value_u.Length = 0;<br>
+ value_u.MaximumLength = value_length * sizeof(WCHAR);<br>
+ value_u.Buffer = value;<br>
+<br>
+ nts = RtlQueryEnvironmentVariable_U(env, &name_u,
&value_u);<br>
+ if (nts == STATUS_SUCCESS)<br>
+ {<br>
+ *return_length = value_u.Length / sizeof(WCHAR);<br>
+ }<br>
+ else<br>
+ {<br>
+ if (nts == STATUS_BUFFER_TOO_SMALL)<br>
+ {<br>
+ *return_length = (value_u.Length / sizeof(WCHAR)) + 1;<br>
+ }<br>
+ else<br>
+ {<br>
+ *return_length = value_u.Length / sizeof(WCHAR);<br>
+ }<br>
+ }<br>
+ return nts;<br>
+}<br>
+<br>
/******************************************************************<br>
* RtlSetCurrentEnvironment [NTDLL.@]<br>
*<br>
diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec<br>
index 4f5fa8c21d..cbc43259bd 100644<br>
--- a/dlls/ntdll/ntdll.spec<br>
+++ b/dlls/ntdll/ntdll.spec<br>
@@ -860,6 +860,7 @@<br>
@ stdcall RtlQueryDepthSList(ptr)<br>
@ stdcall RtlQueryDynamicTimeZoneInformation(ptr)<br>
@ stdcall RtlQueryEnvironmentVariable_U(ptr ptr ptr)<br>
+@ stdcall RtlQueryEnvironmentVariable(ptr ptr long ptr long ptr)<br>
@ stdcall RtlQueryHeapInformation(long long ptr long ptr)<br>
@ stdcall RtlQueryInformationAcl(ptr ptr long long)<br>
@ stdcall RtlQueryInformationActivationContext(long long ptr long
ptr long ptr)<br>
diff --git a/dlls/ntdll/tests/env.c b/dlls/ntdll/tests/env.c<br>
index 48c9ed809e..07ec0a08c6 100644<br>
--- a/dlls/ntdll/tests/env.c<br>
+++ b/dlls/ntdll/tests/env.c<br>
@@ -27,6 +27,7 @@ static NTSTATUS (WINAPI
*pRtlMultiByteToUnicodeN)( LPWSTR dst, DWORD dstlen, LPD<br>
static NTSTATUS (WINAPI *pRtlCreateEnvironment)(BOOLEAN, PWSTR*);<br>
static NTSTATUS (WINAPI *pRtlDestroyEnvironment)(PWSTR);<br>
static NTSTATUS (WINAPI *pRtlQueryEnvironmentVariable_U)(PWSTR,
PUNICODE_STRING, PUNICODE_STRING);<br>
+static NTSTATUS (WINAPI* pRtlQueryEnvironmentVariable)(WCHAR*,
WCHAR*, SIZE_T, WCHAR*, SIZE_T, SIZE_T*);<br>
static void (WINAPI *pRtlSetCurrentEnvironment)(PWSTR, PWSTR*);<br>
static NTSTATUS (WINAPI *pRtlSetEnvironmentVariable)(PWSTR*,
PUNICODE_STRING, PUNICODE_STRING);<br>
static NTSTATUS (WINAPI *pRtlExpandEnvironmentStrings_U)(LPWSTR,
PUNICODE_STRING, PUNICODE_STRING, PULONG);<br>
@@ -95,6 +96,9 @@ static void testQuery(void)<br>
UNICODE_STRING name;<br>
UNICODE_STRING value;<br>
NTSTATUS nts;<br>
+ SIZE_T name_length;<br>
+ SIZE_T value_length;<br>
+ SIZE_T return_length;<br>
unsigned int i;<br>
for (i = 0; tests[i].var; i++)<br>
@@ -130,6 +134,44 @@ static void testQuery(void)<br>
break;<br>
}<br>
}<br>
+<br>
+ if (pRtlQueryEnvironmentVariable)<br>
+ {<br>
+ for (i = 0; tests[i].var; i++)<br>
+ {<br>
+ const struct test* test = &tests[i];<br>
+ name_length = strlen(test->var);<br>
+ value_length = test->len;<br>
+ value.Buffer = bv;<br>
+ bv[test->len] = '@';<br>
+<br>
+ pRtlMultiByteToUnicodeN(bn, sizeof(bn), NULL, test->var,
strlen(test->var) + 1);<br>
+ nts = pRtlQueryEnvironmentVariable(small_env, bn, name_length,
bv, value_length, &return_length);<br>
+ ok(nts == test->status || (test->alt && nts ==
test->alt),<br>
+ "[%d]: Wrong status for '%s', expecting %x got %x\n",<br>
+ i, test->var, test->status, nts);<br>
+ if (nts == test->status) switch (nts)<br>
+ {<br>
+ case STATUS_SUCCESS:<br>
+ pRtlMultiByteToUnicodeN(bn, sizeof(bn), NULL, test->val,
strlen(test->val) + 1);<br>
+ ok(return_length == strlen(test->val), "Wrong length %d for
%s\n",<br>
+ return_length, test->var);<br>
+ ok((return_length == strlen(test->val) && memcmp(bv,
bn, return_length) == 0) ||<br>
+ lstrcmpW(bv, bn) == 0,<br>
+ "Wrong result for %s/%d\n", test->var, test->len);<br>
+ ok(bv[test->len] == '@', "Writing too far away in the buffer
for %s/%d\n", test->var, test->len);<br>
+ break;<br>
+ case STATUS_BUFFER_TOO_SMALL:<br>
+ ok(return_length == (strlen(test->val) + 1),<br>
+ "Wrong returned length %d (too small buffer) for %s\n",
return_length, test->var);<br>
+ break;<br>
+ }<br>
+ }<br>
+ }<br>
+ else<br>
+ {<br>
+ win_skip("RtlQueryEnvironmentVariable not available, skipping
tests\n");<br>
+ }<br>
}<br>
static void testSetHelper(LPWSTR* env, const char* var, const
char* val, NTSTATUS ret, NTSTATUS alt)<br>
@@ -525,6 +567,7 @@ START_TEST(env)<br>
pRtlCreateEnvironment = (void*)GetProcAddress(mod,
"RtlCreateEnvironment");<br>
pRtlDestroyEnvironment = (void*)GetProcAddress(mod,
"RtlDestroyEnvironment");<br>
pRtlQueryEnvironmentVariable_U = (void*)GetProcAddress(mod,
"RtlQueryEnvironmentVariable_U");<br>
+ pRtlQueryEnvironmentVariable = (void*)GetProcAddress(mod,
"RtlQueryEnvironmentVariable");<br>
pRtlSetCurrentEnvironment = (void*)GetProcAddress(mod,
"RtlSetCurrentEnvironment");<br>
pRtlSetEnvironmentVariable = (void*)GetProcAddress(mod,
"RtlSetEnvironmentVariable");<br>
pRtlExpandEnvironmentStrings_U = (void*)GetProcAddress(mod,
"RtlExpandEnvironmentStrings_U");<br>
<pre class="moz-signature">--
2.17.1
</pre>
</div>
</body>
</html>