From a5e210012b47ce77f04c0ff977a1afc8fb4d288d Mon Sep 17 00:00:00 2001 From: winesync Date: Sat, 12 Mar 2022 15:11:59 +0100 Subject: [PATCH] [WINESYNC] msi: Make MsiSetTargetPath() RPC-compatible. Signed-off-by: Zebediah Figura Signed-off-by: Hans Leidekker Signed-off-by: Alexandre Julliard wine commit id e5fba6d23ee82229582a0cf19a455b3c5ca43776 by Zebediah Figura --- dll/win32/msi/install.c | 26 +------------------------ dll/win32/msi/package.c | 5 ++--- dll/win32/msi/winemsi.idl | 2 +- modules/rostests/winetests/msi/custom.c | 16 +++++++++++++++ 4 files changed, 20 insertions(+), 29 deletions(-) diff --git a/dll/win32/msi/install.c b/dll/win32/msi/install.c index 68d8eb573aa..ba329eb8f80 100644 --- a/dll/win32/msi/install.c +++ b/dll/win32/msi/install.c @@ -535,36 +535,12 @@ UINT WINAPI MsiSetTargetPathW(MSIHANDLE hInstall, LPCWSTR szFolder, package = msihandle2msiinfo(hInstall, MSIHANDLETYPE_PACKAGE); if (!package) { - HRESULT hr; - BSTR folder, path; MSIHANDLE remote; if (!(remote = msi_get_remote(hInstall))) return ERROR_INVALID_HANDLE; - folder = SysAllocString( szFolder ); - path = SysAllocString( szFolderPath ); - if (!folder || !path) - { - SysFreeString(folder); - SysFreeString(path); - return ERROR_OUTOFMEMORY; - } - - hr = remote_SetTargetPath(remote, folder, path); - - SysFreeString(folder); - SysFreeString(path); - - if (FAILED(hr)) - { - if (HRESULT_FACILITY(hr) == FACILITY_WIN32) - return HRESULT_CODE(hr); - - return ERROR_FUNCTION_FAILED; - } - - return ERROR_SUCCESS; + return remote_SetTargetPath(remote, szFolder, szFolderPath); } ret = MSI_SetTargetPathW( package, szFolder, szFolderPath ); diff --git a/dll/win32/msi/package.c b/dll/win32/msi/package.c index f4d93e047a0..89ac2ce3a6f 100644 --- a/dll/win32/msi/package.c +++ b/dll/win32/msi/package.c @@ -2498,10 +2498,9 @@ UINT __cdecl remote_GetTargetPath(MSIHANDLE hinst, LPCWSTR folder, LPWSTR *value return r; } -HRESULT __cdecl remote_SetTargetPath(MSIHANDLE hinst, BSTR folder, BSTR value) +UINT __cdecl remote_SetTargetPath(MSIHANDLE hinst, LPCWSTR folder, LPCWSTR value) { - UINT r = MsiSetTargetPathW(hinst, folder, value); - return HRESULT_FROM_WIN32(r); + return MsiSetTargetPathW(hinst, folder, value); } HRESULT __cdecl remote_GetSourcePath(MSIHANDLE hinst, BSTR folder, BSTR value, DWORD *size) diff --git a/dll/win32/msi/winemsi.idl b/dll/win32/msi/winemsi.idl index 5e09c85b6cd..a0e1ddbb840 100644 --- a/dll/win32/msi/winemsi.idl +++ b/dll/win32/msi/winemsi.idl @@ -77,7 +77,7 @@ interface IWineMsiRemote UINT remote_DoAction( [in] MSIHANDLE hinst, [in, string] LPCWSTR action ); UINT remote_Sequence( [in] MSIHANDLE hinst, [in, string] LPCWSTR table, [in] int sequence ); UINT remote_GetTargetPath( [in] MSIHANDLE hinst, [in, string] LPCWSTR folder, [out, string] LPWSTR *value ); - HRESULT remote_SetTargetPath( [in] MSIHANDLE hinst, [in] BSTR folder, [in] BSTR value ); + UINT remote_SetTargetPath( [in] MSIHANDLE hinst, [in, string] LPCWSTR folder, [in, string] LPCWSTR value ); HRESULT remote_GetSourcePath( [in] MSIHANDLE hinst, [in] BSTR folder, [out, size_is(*size)] BSTR value, [in, out] DWORD *size ); HRESULT remote_GetMode( [in] MSIHANDLE hinst, [in] MSIRUNMODE mode, [out] BOOL *ret ); HRESULT remote_SetMode( [in] MSIHANDLE hinst, [in] MSIRUNMODE mode, [in] BOOL state ); diff --git a/modules/rostests/winetests/msi/custom.c b/modules/rostests/winetests/msi/custom.c index 5062ecd77f2..111032c37a4 100644 --- a/modules/rostests/winetests/msi/custom.c +++ b/modules/rostests/winetests/msi/custom.c @@ -541,6 +541,22 @@ static void test_targetpath(MSIHANDLE hinst) ok(hinst, !r, "got %u\n", r); ok(hinst, !lstrcmpW(bufferW, xyzW), "got %s\n", dbgstr_w(bufferW)); ok(hinst, sz == 3, "got size %u\n", sz); + + r = MsiSetTargetPathA(hinst, NULL, "C:\\subdir"); + ok(hinst, r == ERROR_INVALID_PARAMETER, "got %u\n", r); + + r = MsiSetTargetPathA(hinst, "TARGETDIR", NULL); + ok(hinst, r == ERROR_INVALID_PARAMETER, "got %u\n", r); + + r = MsiSetTargetPathA(hinst, "TARGETDIR", "C:\\subdir"); + ok(hinst, !r, "got %u\n", r); + + sz = sizeof(buffer); + r = MsiGetTargetPathA(hinst, "TARGETDIR", buffer, &sz); + ok(hinst, !r, "got %u\n", r); + ok(hinst, !strcmp(buffer, "C:\\subdir\\"), "got \"%s\"\n", buffer); + + r = MsiSetTargetPathA(hinst, "TARGETDIR", "C:\\"); } /* Main test. Anything that doesn't depend on a specific install configuration