[PATCH] Add RtlQueryEnvironmentVariable to ntdll

Zebediah Figura z.figura12 at gmail.com
Thu Apr 30 09:14:14 CDT 2020


On 4/29/20 10:06 AM, Alon Barzilai wrote:
> Hi,
> 
> 
> the testbot  failed the test for windows XP.
> 
> I checked an indeed this function do not exist windows XP and server2003.
> I can run the test only if the function exists, but then if the function 
> do not exist from some reason, I will know know about it.

That's the usual pattern, yes. See uses of win_skip() in other tests.

> 
> 
> Alon.
> 
> 
> 
> On 4/27/2020 5:02 PM, Alon Barzilai wrote:
>> ---
>>   dlls/ntdll/env.c       | 42 ++++++++++++++++++++++++++++++++++++++++++
>>   dlls/ntdll/ntdll.spec  |  1 +
>>   dlls/ntdll/tests/env.c | 38 ++++++++++++++++++++++++++++++++++++++
>>   3 files changed, 81 insertions(+)
>>
>> diff --git a/dlls/ntdll/env.c b/dlls/ntdll/env.c
>> index 6670786def..db8abd04aa 100644
>> --- a/dlls/ntdll/env.c
>> +++ b/dlls/ntdll/env.c
>> @@ -976,6 +976,48 @@ NTSTATUS WINAPI RtlQueryEnvironmentVariable_U(PWSTR env,
>>       return nts;
>>   }
>>   
>> +
>> +/******************************************************************
>> + *		RtlQueryEnvironmentVariable   [NTDLL.@]
>> + *
>> + */
>> +NTSTATUS WINAPI RtlQueryEnvironmentVariable(PWSTR env,
>> +                                            PWSTR name,
>> +                                            size_t name_length,
>> +                                            PWSTR value,
>> +                                            size_t value_length,
>> +                                            PSIZE_T return_length)
>> +{
>> +    UNICODE_STRING name_u;
>> +    UNICODE_STRING value_u;
>> +
>> +    name_u.Length = name_length * sizeof(WCHAR);
>> +    name_u.MaximumLength = name_u.Length;
>> +    name_u.Buffer = name;
>> +
>> +    value_u.Length = 0;
>> +    value_u.MaximumLength = value_length * sizeof(WCHAR);
>> +    value_u.Buffer = value;
>> +
>> +    NTSTATUS nts = RtlQueryEnvironmentVariable_U(env, &name_u, &value_u);
>> +    switch (nts)
>> +    {
>> +        case STATUS_SUCCESS:
>> +        *return_length = value_u.Length / sizeof(WCHAR);
>> +        break;
>> +
>> +        case STATUS_BUFFER_TOO_SMALL:
>> +        *return_length = (value_u.Length / sizeof(WCHAR)) + 1;
>> +        break;
>> +
>> +        case STATUS_VARIABLE_NOT_FOUND:
>> +        default:
>> +        *return_length = 0;
>> +        break;
>> +    }
>> +    return nts;
>> +}
>> +
>>   /******************************************************************
>>    *		RtlSetCurrentEnvironment        [NTDLL.@]
>>    *
>> diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec
>> index 4f5fa8c21d..cbc43259bd 100644
>> --- a/dlls/ntdll/ntdll.spec
>> +++ b/dlls/ntdll/ntdll.spec
>> @@ -860,6 +860,7 @@
>>   @ stdcall RtlQueryDepthSList(ptr)
>>   @ stdcall RtlQueryDynamicTimeZoneInformation(ptr)
>>   @ stdcall RtlQueryEnvironmentVariable_U(ptr ptr ptr)
>> +@ stdcall RtlQueryEnvironmentVariable(ptr ptr long ptr long ptr)
>>   @ stdcall RtlQueryHeapInformation(long long ptr long ptr)
>>   @ stdcall RtlQueryInformationAcl(ptr ptr long long)
>>   @ stdcall RtlQueryInformationActivationContext(long long ptr long ptr long ptr)
>> diff --git a/dlls/ntdll/tests/env.c b/dlls/ntdll/tests/env.c
>> index 48c9ed809e..c1f602d423 100644
>> --- a/dlls/ntdll/tests/env.c
>> +++ b/dlls/ntdll/tests/env.c
>> @@ -27,6 +27,7 @@ static NTSTATUS (WINAPI *pRtlMultiByteToUnicodeN)( LPWSTR dst, DWORD dstlen, LPD
>>   static NTSTATUS (WINAPI *pRtlCreateEnvironment)(BOOLEAN, PWSTR*);
>>   static NTSTATUS (WINAPI *pRtlDestroyEnvironment)(PWSTR);
>>   static NTSTATUS (WINAPI *pRtlQueryEnvironmentVariable_U)(PWSTR, PUNICODE_STRING, PUNICODE_STRING);
>> +static NTSTATUS (WINAPI* pRtlQueryEnvironmentVariable)(PWSTR, PWSTR, size_t, PWSTR, size_t, PSIZE_T);
>>   static void     (WINAPI *pRtlSetCurrentEnvironment)(PWSTR, PWSTR*);
>>   static NTSTATUS (WINAPI *pRtlSetEnvironmentVariable)(PWSTR*, PUNICODE_STRING, PUNICODE_STRING);
>>   static NTSTATUS (WINAPI *pRtlExpandEnvironmentStrings_U)(LPWSTR, PUNICODE_STRING, PUNICODE_STRING, PULONG);
>> @@ -95,6 +96,9 @@ static void testQuery(void)
>>       UNICODE_STRING      name;
>>       UNICODE_STRING      value;
>>       NTSTATUS            nts;
>> +    size_t              name_length;
>> +    size_t              value_length;
>> +    size_t              return_length;
>>       unsigned int i;
>>   
>>       for (i = 0; tests[i].var; i++)
>> @@ -130,6 +134,39 @@ static void testQuery(void)
>>               break;
>>           }
>>       }
>> +
>> +    //test RtlQueryEnvironmentVariable
>> +    for (i = 0; tests[i].var; i++)
>> +    {
>> +        const struct test* test = &tests[i];
>> +        name_length = strlen(test->var);
>> +        value_length = test->len;
>> +        value.Buffer = bv;
>> +        bv[test->len] = '@';
>> +
>> +        pRtlMultiByteToUnicodeN(bn, sizeof(bn), NULL, test->var, strlen(test->var) + 1);
>> +        nts = pRtlQueryEnvironmentVariable(small_env, bn, name_length, bv, value_length, &return_length);
>> +        ok(nts == test->status || (test->alt && nts == test->alt),
>> +            "[%d]: Wrong status for '%s', expecting %x got %x\n",
>> +            i, test->var, test->status, nts);
>> +        if (nts == test->status) switch (nts)
>> +        {
>> +        case STATUS_SUCCESS:
>> +            pRtlMultiByteToUnicodeN(bn, sizeof(bn), NULL, test->val, strlen(test->val) + 1);
>> +            ok(return_length == strlen(test->val) , "Wrong length %d for %s\n",
>> +                return_length, test->var);
>> +            ok((return_length == strlen(test->val) && memcmp(bv, bn, return_length) == 0) ||
>> +                lstrcmpW(bv, bn) == 0,
>> +                "Wrong result for %s/%d\n", test->var, test->len);
>> +            ok(bv[test->len] == '@', "Writing too far away in the buffer for %s/%d\n", test->var, test->len);
>> +            break;
>> +        case STATUS_BUFFER_TOO_SMALL:
>> +            ok(return_length == (strlen(test->val) + 1),
>> +                "Wrong returned length %d (too small buffer) for %s\n", return_length, test->var);
>> +            break;
>> +        }
>> +    }
>> +
>>   }
>>   
>>   static void testSetHelper(LPWSTR* env, const char* var, const char* val, NTSTATUS ret, NTSTATUS alt)
>> @@ -525,6 +562,7 @@ START_TEST(env)
>>       pRtlCreateEnvironment = (void*)GetProcAddress(mod, "RtlCreateEnvironment");
>>       pRtlDestroyEnvironment = (void*)GetProcAddress(mod, "RtlDestroyEnvironment");
>>       pRtlQueryEnvironmentVariable_U = (void*)GetProcAddress(mod, "RtlQueryEnvironmentVariable_U");
>> +    pRtlQueryEnvironmentVariable = (void*)GetProcAddress(mod, "RtlQueryEnvironmentVariable");
>>       pRtlSetCurrentEnvironment = (void*)GetProcAddress(mod, "RtlSetCurrentEnvironment");
>>       pRtlSetEnvironmentVariable = (void*)GetProcAddress(mod, "RtlSetEnvironmentVariable");
>>       pRtlExpandEnvironmentStrings_U = (void*)GetProcAddress(mod, "RtlExpandEnvironmentStrings_U");




More information about the wine-devel mailing list