From 35b1b87dc90b5d0700ec0893bc3918e15a43b07d Mon Sep 17 00:00:00 2001 From: Zebediah Figura Date: Mon, 23 Apr 2018 23:18:17 -0500 Subject: [PATCH] msi: Make MsiGetComponentState() RPC-compatible. Signed-off-by: Zebediah Figura Signed-off-by: Hans Leidekker Signed-off-by: Alexandre Julliard --- dlls/msi/install.c | 25 +++++++------------------ dlls/msi/package.c | 5 ++--- dlls/msi/tests/custom.c | 31 +++++++++++++++++++++++++++++++ dlls/msi/winemsi.idl | 2 +- 4 files changed, 41 insertions(+), 22 deletions(-) diff --git a/dlls/msi/install.c b/dlls/msi/install.c index 1ff3ad98804..b19b6471ee2 100644 --- a/dlls/msi/install.c +++ b/dlls/msi/install.c @@ -1359,33 +1359,22 @@ UINT WINAPI MsiGetComponentStateW(MSIHANDLE hInstall, LPCWSTR szComponent, TRACE("%d %s %p %p\n", hInstall, debugstr_w(szComponent), piInstalled, piAction); + if (!szComponent) + return ERROR_UNKNOWN_COMPONENT; + package = msihandle2msiinfo(hInstall, MSIHANDLETYPE_PACKAGE); if (!package) { MSIHANDLE remote; - HRESULT hr; - BSTR component; if (!(remote = msi_get_remote(hInstall))) return ERROR_INVALID_HANDLE; - component = SysAllocString(szComponent); - if (!component) - return ERROR_OUTOFMEMORY; - - hr = remote_GetComponentState(remote, component, piInstalled, piAction); - - SysFreeString(component); - - if (FAILED(hr)) - { - if (HRESULT_FACILITY(hr) == FACILITY_WIN32) - return HRESULT_CODE(hr); - - return ERROR_FUNCTION_FAILED; - } + /* FIXME: should use SEH */ + if (!piInstalled || !piAction) + return RPC_X_NULL_REF_POINTER; - return ERROR_SUCCESS; + return remote_GetComponentState(remote, szComponent, piInstalled, piAction); } ret = MSI_GetComponentStateW( package, szComponent, piInstalled, piAction); diff --git a/dlls/msi/package.c b/dlls/msi/package.c index f8b150b7aca..18b860122c5 100644 --- a/dlls/msi/package.c +++ b/dlls/msi/package.c @@ -2534,11 +2534,10 @@ UINT __cdecl remote_SetFeatureState(MSIHANDLE hinst, LPCWSTR feature, INSTALLSTA return MsiSetFeatureStateW(hinst, feature, state); } -HRESULT __cdecl remote_GetComponentState(MSIHANDLE hinst, BSTR component, +UINT __cdecl remote_GetComponentState(MSIHANDLE hinst, LPCWSTR component, INSTALLSTATE *installed, INSTALLSTATE *action) { - UINT r = MsiGetComponentStateW(hinst, component, installed, action); - return HRESULT_FROM_WIN32(r); + return MsiGetComponentStateW(hinst, component, installed, action); } HRESULT __cdecl remote_SetComponentState(MSIHANDLE hinst, BSTR component, INSTALLSTATE state) diff --git a/dlls/msi/tests/custom.c b/dlls/msi/tests/custom.c index b30953a8553..b2c9352e27d 100644 --- a/dlls/msi/tests/custom.c +++ b/dlls/msi/tests/custom.c @@ -655,6 +655,8 @@ static void test_feature_states(MSIHANDLE hinst) INSTALLSTATE state, action; UINT r; + /* test feature states */ + r = MsiGetFeatureStateA(hinst, NULL, &state, &action); ok(hinst, r == ERROR_UNKNOWN_FEATURE, "got %u\n", r); @@ -688,6 +690,35 @@ static void test_feature_states(MSIHANDLE hinst) r = MsiGetFeatureStateA(hinst, "One", &state, &action); ok(hinst, !r, "got %u\n", r); ok(hinst, action == INSTALLSTATE_LOCAL, "got action %d\n", action); + + /* test component states */ + + r = MsiGetComponentStateA(hinst, NULL, &state, &action); + ok(hinst, r == ERROR_UNKNOWN_COMPONENT, "got %u\n", r); + + r = MsiGetComponentStateA(hinst, "fake", &state, &action); + ok(hinst, r == ERROR_UNKNOWN_COMPONENT, "got %u\n", r); + + r = MsiGetComponentStateA(hinst, "One", NULL, &action); + ok(hinst, r == RPC_X_NULL_REF_POINTER, "got %u\n", r); + + r = MsiGetComponentStateA(hinst, "One", &state, NULL); + ok(hinst, r == RPC_X_NULL_REF_POINTER, "got %u\n", r); + + r = MsiGetComponentStateA(hinst, "One", &state, &action); + ok(hinst, !r, "got %u\n", r); + ok(hinst, state == INSTALLSTATE_ABSENT, "got state %d\n", state); + ok(hinst, action == INSTALLSTATE_LOCAL, "got action %d\n", action); + + r = MsiGetComponentStateA(hinst, "dangler", &state, &action); + ok(hinst, !r, "got %u\n", r); + ok(hinst, state == INSTALLSTATE_ABSENT, "got state %d\n", state); + ok(hinst, action == INSTALLSTATE_UNKNOWN, "got action %d\n", action); + + r = MsiGetComponentStateA(hinst, "component", &state, &action); + ok(hinst, !r, "got %u\n", r); + ok(hinst, state == INSTALLSTATE_UNKNOWN, "got state %d\n", state); + ok(hinst, action == INSTALLSTATE_LOCAL, "got action %d\n", action); } /* Main test. Anything that doesn't depend on a specific install configuration diff --git a/dlls/msi/winemsi.idl b/dlls/msi/winemsi.idl index 8bdc10dcddc..59964871cb3 100644 --- a/dlls/msi/winemsi.idl +++ b/dlls/msi/winemsi.idl @@ -83,7 +83,7 @@ interface IWineMsiRemote UINT remote_SetMode( [in] MSIHANDLE hinst, [in] MSIRUNMODE mode, [in] BOOL state ); UINT remote_GetFeatureState( [in] MSIHANDLE hinst, [in, string] LPCWSTR feature, [out] INSTALLSTATE *installed, [out] INSTALLSTATE *action ); UINT remote_SetFeatureState( [in] MSIHANDLE hinst, [in, string] LPCWSTR feature, [in] INSTALLSTATE state ); - HRESULT remote_GetComponentState( [in] MSIHANDLE hinst, [in] BSTR component, [out] INSTALLSTATE *installed, [out] INSTALLSTATE *action ); + UINT remote_GetComponentState( [in] MSIHANDLE hinst, [in, string] LPCWSTR component, [out] INSTALLSTATE *installed, [out] INSTALLSTATE *action ); HRESULT remote_SetComponentState( [in] MSIHANDLE hinst, [in] BSTR component, [in] INSTALLSTATE state ); HRESULT remote_GetLanguage( [in] MSIHANDLE hinst, [out] LANGID *language ); HRESULT remote_SetInstallLevel( [in] MSIHANDLE hinst, [in] int level ); -- 2.11.4.GIT