<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>