mirror of
https://github.com/reactos/reactos.git
synced 2024-12-27 09:34:43 +00:00
[WINMM] PlaySound: Fix user-specific environment variables handling (#7536)
Correctly retrieve user-specific environment variables when impersonating.
Addendum to commit f18111b641
.
CORE-13951
This commit is contained in:
parent
e6c18b4497
commit
92231340ec
2 changed files with 59 additions and 3 deletions
|
@ -30,7 +30,7 @@ endif()
|
||||||
|
|
||||||
set_module_type(winmm win32dll)
|
set_module_type(winmm win32dll)
|
||||||
target_link_libraries(winmm wine ${PSEH_LIB} oldnames)
|
target_link_libraries(winmm wine ${PSEH_LIB} oldnames)
|
||||||
add_importlibs(winmm advapi32 user32 msvcrt kernel32 ntdll)
|
add_importlibs(winmm userenv advapi32 user32 msvcrt kernel32 ntdll)
|
||||||
add_pch(winmm winemm.h SOURCE)
|
add_pch(winmm winemm.h SOURCE)
|
||||||
add_cd_file(TARGET winmm DESTINATION reactos/system32 FOR all)
|
add_cd_file(TARGET winmm DESTINATION reactos/system32 FOR all)
|
||||||
|
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
#include "winemm.h"
|
#include "winemm.h"
|
||||||
|
|
||||||
#include <winternl.h>
|
#include <winternl.h>
|
||||||
|
#include <userenv.h>
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(winmm);
|
WINE_DEFAULT_DEBUG_CHANNEL(winmm);
|
||||||
|
|
||||||
|
@ -39,6 +40,61 @@ typedef struct tagWINE_PLAYSOUND
|
||||||
static WINE_PLAYSOUND *PlaySoundCurrent;
|
static WINE_PLAYSOUND *PlaySoundCurrent;
|
||||||
static BOOL bPlaySoundStop;
|
static BOOL bPlaySoundStop;
|
||||||
|
|
||||||
|
/* An impersonation-aware equivalent of ExpandEnvironmentStringsW */
|
||||||
|
static DWORD PlaySound_ExpandEnvironmentStrings(LPCWSTR lpSrc, LPWSTR lpDst, DWORD nSize)
|
||||||
|
{
|
||||||
|
HANDLE hToken;
|
||||||
|
DWORD dwError;
|
||||||
|
DWORD dwLength = 0;
|
||||||
|
|
||||||
|
if (!OpenThreadToken(GetCurrentThread(),
|
||||||
|
TOKEN_QUERY | TOKEN_IMPERSONATE | TOKEN_DUPLICATE,
|
||||||
|
TRUE,
|
||||||
|
&hToken))
|
||||||
|
{
|
||||||
|
dwError = GetLastError();
|
||||||
|
|
||||||
|
if (dwError == ERROR_NO_TOKEN)
|
||||||
|
{
|
||||||
|
/* We are not impersonating, forward this to ExpandEnvironmentStrings */
|
||||||
|
return ExpandEnvironmentStringsW(lpSrc, lpDst, nSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
ERR("OpenThreadToken failed (0x%x)\n", dwError);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ExpandEnvironmentStringsForUserW(hToken, lpSrc, lpDst, nSize))
|
||||||
|
{
|
||||||
|
dwError = GetLastError();
|
||||||
|
|
||||||
|
if (dwError == ERROR_INSUFFICIENT_BUFFER || nSize == 0)
|
||||||
|
{
|
||||||
|
/* The buffer is too small, find the required buffer size.
|
||||||
|
* NOTE: ExpandEnvironmentStringsForUser doesn't support retrieving buffer size. */
|
||||||
|
WCHAR szExpanded[1024];
|
||||||
|
|
||||||
|
if (ExpandEnvironmentStringsForUserW(hToken, lpSrc, szExpanded, ARRAY_SIZE(szExpanded)))
|
||||||
|
{
|
||||||
|
/* We success, return the required buffer size */
|
||||||
|
dwLength = lstrlenW(szExpanded) + 1;
|
||||||
|
goto Cleanup;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ERR("ExpandEnvironmentStringsForUser failed (0x%x)\n", dwError);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* We success, return the size of the string */
|
||||||
|
dwLength = lstrlenW(lpDst) + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
Cleanup:
|
||||||
|
CloseHandle(hToken);
|
||||||
|
return dwLength;
|
||||||
|
}
|
||||||
|
|
||||||
static HMMIO get_mmioFromFile(LPCWSTR lpszName)
|
static HMMIO get_mmioFromFile(LPCWSTR lpszName)
|
||||||
{
|
{
|
||||||
HMMIO ret;
|
HMMIO ret;
|
||||||
|
@ -158,7 +214,7 @@ Next:
|
||||||
|
|
||||||
if (type == REG_EXPAND_SZ)
|
if (type == REG_EXPAND_SZ)
|
||||||
{
|
{
|
||||||
count = ExpandEnvironmentStringsW(str, NULL, 0);
|
count = PlaySound_ExpandEnvironmentStrings(str, NULL, 0);
|
||||||
if (count == 0)
|
if (count == 0)
|
||||||
goto None;
|
goto None;
|
||||||
|
|
||||||
|
@ -166,7 +222,7 @@ Next:
|
||||||
if (!pszSnd)
|
if (!pszSnd)
|
||||||
goto None;
|
goto None;
|
||||||
|
|
||||||
if (ExpandEnvironmentStringsW(str, pszSnd, count) == 0)
|
if (PlaySound_ExpandEnvironmentStrings(str, pszSnd, count) == 0)
|
||||||
{
|
{
|
||||||
HeapFree(GetProcessHeap(), 0, pszSnd);
|
HeapFree(GetProcessHeap(), 0, pszSnd);
|
||||||
goto None;
|
goto None;
|
||||||
|
|
Loading…
Reference in a new issue