"That's ugly, please let's fix this the right way, we have all the necessary infrastructure now." -- Alexandre Julliard, 2009 [1]
This patchset is dedicated to Alexandre, who, to be fair, wasn't wrong, but wasn't exactly right either ;-)
This patchset fixes bug 18070. It also lays the groundwork to fix bugs 31741 and 37856. It can be viewed in full at [2].
The series is divided into roughly three major changes. The first (patches 0001-0003) replaces the method of IPC used (or at least intended to be used) from COM to RPC. This is necessary because the custom action might change the threading model and break our COM proxies, see [3] for more details. I chose RPC over one of the mentioned workarounds since it seemed a much cleaner solution, and additionally made the remote API much simpler (since e.g. we don't have to convert to and from HRESULTs).
The bulk of the series (patches 0004-0040) fix individual functions so that they can be used from a custom action. I use the subject "Make Msi*() RPC-compatible." for consistency's sake, but the changes made vary from tweaking IDL annotations and return types to implementing the entire function (as in MsiView*() which previously blithely returned a local handle).
The last part (patch 0041) performs the actual change, i.e. segregating ACTION_CallDllFunction() into a separate process and building the actual RPC stubs. With a bit of manual fixing this patch should be able to be applied directly on top of any other patch in the series, if it is desired for review purposes to be able to test a change in the "real-world" environment; this is how I did most of my debugging while building the series.
This patchset has been tested for regressions against all installers available through winetricks, plus a few various installers I have on my system. I also tested it against several installers mentioned in bug 18070 or duplicates thereof, including Adobe Acrobat X Pro, so I can confirm that the bug is indeed fixed.
[1] https://www.winehq.org/pipermail/wine-devel/2009-July/077148.html [2] https://github.com/zfigura/wine/tree/newmsi [3] https://www.winehq.org/pipermail/wine-devel/2018-April/125484.html
Zebediah Figura (41): msi: Stop vending WineMsiRemotePackage. msi: Allocate the remote handle on the server side. msi: Convert the IWineMsiRemote* remote interfaces to RPC stubs. msi: Make MsiGetProperty() RPC-compatible. msi: Make MsiSetProperty() RPC-compatible. msi/tests: Clean up property tests. msi: Also null-terminate WCHAR strings. msi/tests: Test properties from custom actions. msi: Make MsiProcessMessage() RPC-compatible. msi/tests: Improve COM test. msi: Make MsiGetActiveDatabase() RPC-compatible. msi: Make MsiDatabaseIsTablePersistent() RPC-compatible. msi: Make MsiDatabaseOpenView() RPC-compatible. msi: Make MsiViewExecute() RPC-compatible. msi: Make MsiViewFetch() RPC-compatible. msi: Make MsiViewClose() RPC-compatible. msi: Make MsiViewGetColumnInfo() RPC-compatible. msi: Make MsiViewModify() RPC-compatible. msi/tests: Add tests for MsiDatabaseGetPrimaryKeys(). msi: Make MsiDatabaseGetPrimaryKeys() RPC-compatible. msi: Make MsiGetSummaryInformation() RPC-compatible. msi: Make MsiDoAction() RPC-compatible. msi: Make MsiSequence() RPC-compatible. msi: Make MsiGetTargetPath() RPC-compatible. msi: Make MsiSetTargetPath() RPC-compatible. msi: Make MsiGetSourcePath() RPC-compatible. msi: Make MsiGetMode() RPC-compatible. msi: Make MsiSetMode() RPC-compatible. msi: Make MsiGetFeatureState() RPC-compatible. msi: Make MsiSetFeatureState() RPC-compatible. msi: Make MsiGetComponentState() RPC-compatible. msi: Make MsiSetComponentState() RPC-compatible. msi: Make MsiGetMode() RPC-compatible. msi: Make MsiSetInstallLevel() RPC-compatible. msi: Make MsiFormatRecord() RPC-compatible. msi: Make MsiEvaluateCondition() RPC-compatible. msi: Handle some invalid parameters in MsiGetFeatureCost(). msi: Make MsiGetFeatureCost() RPC-compatible. msi: Make MsiEnumComponentCosts RPC-compatible. msi: Make remote_GetActionInfo() RPC-compatible. msi: Execute custom actions in a separate process.
dlls/msi/Makefile.in | 8 +- dlls/msi/cond.y | 32 +- dlls/msi/custom.c | 292 ++++++-------- dlls/msi/database.c | 129 +------ dlls/msi/dialog.c | 5 +- dlls/msi/format.c | 43 +-- dlls/msi/handle.c | 30 +- dlls/msi/install.c | 447 +++++----------------- dlls/msi/msi.c | 31 +- dlls/msi/msi.spec | 2 + dlls/msi/msi_main.c | 14 - dlls/msi/msipriv.h | 13 +- dlls/msi/msiquery.c | 236 ++++++++---- dlls/msi/msiserver.idl | 70 ---- dlls/msi/package.c | 506 ++++++++----------------- dlls/msi/record.c | 106 ++++++ dlls/msi/suminfo.c | 27 +- dlls/msi/tests/custom.c | 922 ++++++++++++++++++++++++++++++++++++++++++++- dlls/msi/tests/custom.spec | 1 + dlls/msi/tests/db.c | 41 ++ dlls/msi/tests/install.c | 37 ++ dlls/msi/tests/package.c | 265 ++++++------- dlls/msi/winemsi.idl | 102 +++++ programs/msiexec/msiexec.c | 9 +- 24 files changed, 1938 insertions(+), 1430 deletions(-) create mode 100644 dlls/msi/winemsi.idl
Since we return it from WineMsiRemoteCustomAction::GetActionInfo().
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/msi/msi_main.c | 7 ------- dlls/msi/msiserver.idl | 5 ----- 2 files changed, 12 deletions(-)
diff --git a/dlls/msi/msi_main.c b/dlls/msi/msi_main.c index 3143118..9f5b2c4 100644 --- a/dlls/msi/msi_main.c +++ b/dlls/msi/msi_main.c @@ -167,7 +167,6 @@ static const IClassFactoryVtbl MsiCF_Vtbl =
static IClassFactoryImpl MsiServer_CF = { { &MsiCF_Vtbl }, create_msiserver }; static IClassFactoryImpl WineMsiCustomRemote_CF = { { &MsiCF_Vtbl }, create_msi_custom_remote }; -static IClassFactoryImpl WineMsiRemotePackage_CF = { { &MsiCF_Vtbl }, create_msi_remote_package };
/****************************************************************** * DllGetClassObject [MSI.@] @@ -188,12 +187,6 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv) return S_OK; }
- if ( IsEqualCLSID (rclsid, &CLSID_WineMsiRemotePackage) ) - { - *ppv = &WineMsiRemotePackage_CF; - return S_OK; - } - if( IsEqualCLSID (rclsid, &CLSID_MsiServerMessage) || IsEqualCLSID (rclsid, &CLSID_MsiServer) || IsEqualCLSID (rclsid, &CLSID_PSFactoryBuffer) || diff --git a/dlls/msi/msiserver.idl b/dlls/msi/msiserver.idl index 5052602..e734690 100644 --- a/dlls/msi/msiserver.idl +++ b/dlls/msi/msiserver.idl @@ -187,11 +187,6 @@ coclass MsiServerX3 { interface IMsiServer; } ] coclass WineMsiRemoteCustomAction { interface WineMsiRemoteCustomAction; }
-[ - uuid(902b3592-9d08-4dfd-a593-d07c52546421) -] -coclass WineMsiRemotePackage { interface WineMsiRemotePackage; } - [ uuid(000C1092-0000-0000-C000-000000000046), version(1.0) ] library WindowsInstaller {
Signed-off-by: Hans Leidekker hans@codeweavers.com
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/msi/custom.c | 17 ++++++++--------- dlls/msi/msipriv.h | 4 +++- dlls/msi/msiserver.idl | 3 +-- dlls/msi/package.c | 12 ++---------- 4 files changed, 14 insertions(+), 22 deletions(-)
diff --git a/dlls/msi/custom.c b/dlls/msi/custom.c index 851c503..def36e3 100644 --- a/dlls/msi/custom.c +++ b/dlls/msi/custom.c @@ -490,7 +490,7 @@ static void handle_msi_break( LPCWSTR target ) DebugBreak(); }
-static UINT get_action_info( const GUID *guid, INT *type, MSIHANDLE *handle, +static UINT get_action_info( const GUID *guid, INT *type, BSTR *dll, BSTR *funcname, IWineMsiRemotePackage **package ) { @@ -513,7 +513,7 @@ static UINT get_action_info( const GUID *guid, INT *type, MSIHANDLE *handle, return ERROR_FUNCTION_FAILED; }
- r = IWineMsiRemoteCustomAction_GetActionInfo( rca, guid, type, handle, dll, funcname, package ); + r = IWineMsiRemoteCustomAction_GetActionInfo( rca, guid, type, dll, funcname, package ); IWineMsiRemoteCustomAction_Release( rca ); if (FAILED(r)) { @@ -550,7 +550,7 @@ static inline UINT CUSTOMPROC_wrapper( MsiCustomActionEntryPoint proc, MSIHANDLE static DWORD ACTION_CallDllFunction( const GUID *guid ) { MsiCustomActionEntryPoint fn; - MSIHANDLE hPackage, handle; + MSIHANDLE hPackage; HANDLE hModule; LPSTR proc; UINT r = ERROR_FUNCTION_FAILED; @@ -560,7 +560,7 @@ static DWORD ACTION_CallDllFunction( const GUID *guid )
TRACE("%s\n", debugstr_guid( guid ));
- r = get_action_info( guid, &type, &handle, &dll, &function, &remote_package ); + r = get_action_info( guid, &type, &dll, &function, &remote_package ); if (r != ERROR_SUCCESS) return r;
@@ -579,7 +579,6 @@ static DWORD ACTION_CallDllFunction( const GUID *guid ) hPackage = alloc_msi_remote_handle( (IUnknown *)remote_package ); if (hPackage) { - IWineMsiRemotePackage_SetMsiHandle( remote_package, handle ); TRACE("calling %s\n", debugstr_w( function ) ); handle_msi_break( function );
@@ -608,7 +607,6 @@ static DWORD ACTION_CallDllFunction( const GUID *guid ) IWineMsiRemotePackage_Release( remote_package ); SysFreeString( dll ); SysFreeString( function ); - MsiCloseHandle( handle );
return r; } @@ -1428,21 +1426,22 @@ static ULONG WINAPI mcr_Release( IWineMsiRemoteCustomAction *iface ) }
static HRESULT WINAPI mcr_GetActionInfo( IWineMsiRemoteCustomAction *iface, LPCGUID custom_action_guid, - INT *type, MSIHANDLE *handle, BSTR *dll, BSTR *func, IWineMsiRemotePackage **remote_package ) + INT *type, BSTR *dll, BSTR *func, IWineMsiRemotePackage **remote_package ) { msi_custom_action_info *info; + MSIHANDLE handle;
info = find_action_by_guid( custom_action_guid ); if (!info) return E_FAIL;
*type = info->type; - *handle = alloc_msihandle( &info->package->hdr ); + handle = alloc_msihandle( &info->package->hdr ); *dll = SysAllocString( info->source ); *func = SysAllocString( info->target );
release_custom_action_data( info ); - return create_msi_remote_package( NULL, (LPVOID *)remote_package ); + return create_msi_remote_package( handle, remote_package ); }
static const IWineMsiRemoteCustomActionVtbl msi_custom_remote_vtbl = diff --git a/dlls/msi/msipriv.h b/dlls/msi/msipriv.h index ea65e2a..54acbc7 100644 --- a/dlls/msi/msipriv.h +++ b/dlls/msi/msipriv.h @@ -38,6 +38,8 @@ #include "wine/list.h" #include "wine/debug.h"
+#include "msiserver.h" + static const BOOL is_64bit = sizeof(void *) > sizeof(int); BOOL is_wow64 DECLSPEC_HIDDEN;
@@ -733,7 +735,7 @@ UINT msi_strcpy_to_awstring(const WCHAR *, int, awstring *, DWORD *) DECLSPEC_HI
/* msi server interface */ extern HRESULT create_msi_custom_remote( IUnknown *pOuter, LPVOID *ppObj ) DECLSPEC_HIDDEN; -extern HRESULT create_msi_remote_package( IUnknown *pOuter, LPVOID *ppObj ) DECLSPEC_HIDDEN; +extern HRESULT create_msi_remote_package( MSIHANDLE handle, IWineMsiRemotePackage **package ) DECLSPEC_HIDDEN; extern HRESULT create_msi_remote_database( IUnknown *pOuter, LPVOID *ppObj ) DECLSPEC_HIDDEN; extern IUnknown *msi_get_remote(MSIHANDLE handle) DECLSPEC_HIDDEN;
diff --git a/dlls/msi/msiserver.idl b/dlls/msi/msiserver.idl index e734690..704f6ea 100644 --- a/dlls/msi/msiserver.idl +++ b/dlls/msi/msiserver.idl @@ -56,7 +56,6 @@ interface IWineMsiRemoteDatabase : IUnknown ] interface IWineMsiRemotePackage : IUnknown { - HRESULT SetMsiHandle( [in] MSIHANDLE handle ); HRESULT GetActiveDatabase( [out] MSIHANDLE *handle ); HRESULT GetProperty( [in] BSTR property, [out, size_is(*size)] BSTR value, [in, out] DWORD *size ); HRESULT SetProperty( [in] BSTR property, [in] BSTR value ); @@ -88,7 +87,7 @@ interface IWineMsiRemotePackage : IUnknown ] interface IWineMsiRemoteCustomAction : IUnknown { - HRESULT GetActionInfo( [in] LPCGUID guid, [out] INT *type, [out] MSIHANDLE *handle, [out] BSTR *dllname, + HRESULT GetActionInfo( [in] LPCGUID guid, [out] INT *type, [out] BSTR *dllname, [out] BSTR *function, [out] IWineMsiRemotePackage **package ); }
diff --git a/dlls/msi/package.c b/dlls/msi/package.c index 5aa3dd0..2d11ea8 100644 --- a/dlls/msi/package.c +++ b/dlls/msi/package.c @@ -2561,13 +2561,6 @@ static ULONG WINAPI mrp_Release( IWineMsiRemotePackage *iface ) return r; }
-static HRESULT WINAPI mrp_SetMsiHandle( IWineMsiRemotePackage *iface, MSIHANDLE handle ) -{ - msi_remote_package_impl* This = impl_from_IWineMsiRemotePackage( iface ); - This->package = handle; - return S_OK; -} - static HRESULT WINAPI mrp_GetActiveDatabase( IWineMsiRemotePackage *iface, MSIHANDLE *handle ) { msi_remote_package_impl* This = impl_from_IWineMsiRemotePackage( iface ); @@ -2756,7 +2749,6 @@ static const IWineMsiRemotePackageVtbl msi_remote_package_vtbl = mrp_QueryInterface, mrp_AddRef, mrp_Release, - mrp_SetMsiHandle, mrp_GetActiveDatabase, mrp_GetProperty, mrp_SetProperty, @@ -2780,7 +2772,7 @@ static const IWineMsiRemotePackageVtbl msi_remote_package_vtbl = mrp_EnumComponentCosts };
-HRESULT create_msi_remote_package( IUnknown *pOuter, LPVOID *ppObj ) +HRESULT create_msi_remote_package( MSIHANDLE handle, IWineMsiRemotePackage **ppObj ) { msi_remote_package_impl* This;
@@ -2789,7 +2781,7 @@ HRESULT create_msi_remote_package( IUnknown *pOuter, LPVOID *ppObj ) return E_OUTOFMEMORY;
This->IWineMsiRemotePackage_iface.lpVtbl = &msi_remote_package_vtbl; - This->package = 0; + This->package = handle; This->refs = 1;
*ppObj = &This->IWineMsiRemotePackage_iface;
Signed-off-by: Hans Leidekker hans@codeweavers.com
This patch is large, so I'll try to provide a summary of what it's doing:
1. Move the COM interface declarations from msiserver.idl to a private winemsi.idl. Currently this file isn't doing anything besides providing a header, but once all further preparation is made it'll provide the client and server stubs.
2. Change usage of IWineMsiRemote* interfaces to plain MSIHANDLEs. That is, an MSIHANDLE on the client side gets translated into a different MSIHANDLE on the server side. This means: a) adding a MSIHANDLE parameter as a first argument to most remote APIs, corresponding to the This parameter b) changing other IWineMsiRemote* parameters to MSIHANDLE c) changing msi_get_remote() and msi_alloc_remote_handle() to deal in MSIHANDLEs
3. As a result, get rid of the reference counting and IUnknown methods of the server-side interfaces.
4. Add a remote_CloseHandle() method replacing IWineMsiRemote*::Release().
5. Stop vending the WineMsiRemoteCustomAction class since it doesn't exist anymore.
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/msi/Makefile.in | 4 +- dlls/msi/cond.y | 13 +-- dlls/msi/custom.c | 117 ++------------------ dlls/msi/database.c | 121 ++------------------- dlls/msi/dialog.c | 5 +- dlls/msi/format.c | 11 +- dlls/msi/handle.c | 30 +++--- dlls/msi/install.c | 149 ++++++++------------------ dlls/msi/msi.c | 17 ++- dlls/msi/msi_main.c | 7 -- dlls/msi/msipriv.h | 7 +- dlls/msi/msiquery.c | 41 +++----- dlls/msi/msiserver.idl | 64 ----------- dlls/msi/package.c | 281 +++++++++++-------------------------------------- dlls/msi/suminfo.c | 14 ++- dlls/msi/winemsi.idl | 68 ++++++++++++ 16 files changed, 256 insertions(+), 693 deletions(-) create mode 100644 dlls/msi/winemsi.idl
diff --git a/dlls/msi/Makefile.in b/dlls/msi/Makefile.in index 79704ad..37c9a7a 100644 --- a/dlls/msi/Makefile.in +++ b/dlls/msi/Makefile.in @@ -44,7 +44,9 @@ C_SRCS = \ upgrade.c \ where.c
-IDL_SRCS = msiserver.idl +IDL_SRCS = \ + msiserver.idl \ + winemsi.idl
BISON_SRCS = \ cond.y \ diff --git a/dlls/msi/cond.y b/dlls/msi/cond.y index 6ee6ab9..8a3373f 100644 --- a/dlls/msi/cond.y +++ b/dlls/msi/cond.y @@ -37,7 +37,7 @@ #include "oleauto.h"
#include "msipriv.h" -#include "msiserver.h" +#include "winemsi.h" #include "wine/debug.h" #include "wine/unicode.h" #include "wine/list.h" @@ -850,25 +850,20 @@ MSICONDITION WINAPI MsiEvaluateConditionW( MSIHANDLE hInstall, LPCWSTR szConditi package = msihandle2msiinfo( hInstall, MSIHANDLETYPE_PACKAGE); if( !package ) { + MSIHANDLE remote; HRESULT hr; BSTR condition; - IWineMsiRemotePackage *remote_package;
- remote_package = (IWineMsiRemotePackage *)msi_get_remote( hInstall ); - if (!remote_package) + if (!(remote = msi_get_remote(hInstall))) return MSICONDITION_ERROR;
condition = SysAllocString( szCondition ); if (!condition) - { - IWineMsiRemotePackage_Release( remote_package ); return ERROR_OUTOFMEMORY; - }
- hr = IWineMsiRemotePackage_EvaluateCondition( remote_package, condition ); + hr = remote_EvaluateCondition(remote, condition);
SysFreeString( condition ); - IWineMsiRemotePackage_Release( remote_package );
if (FAILED(hr)) { diff --git a/dlls/msi/custom.c b/dlls/msi/custom.c index def36e3..e2ed5a4 100644 --- a/dlls/msi/custom.c +++ b/dlls/msi/custom.c @@ -33,7 +33,7 @@ #include "oleauto.h"
#include "msipriv.h" -#include "msiserver.h" +#include "winemsi.h" #include "wine/debug.h" #include "wine/unicode.h" #include "wine/exception.h" @@ -490,40 +490,6 @@ static void handle_msi_break( LPCWSTR target ) DebugBreak(); }
-static UINT get_action_info( const GUID *guid, INT *type, - BSTR *dll, BSTR *funcname, - IWineMsiRemotePackage **package ) -{ - IClassFactory *cf = NULL; - IWineMsiRemoteCustomAction *rca = NULL; - HRESULT r; - - r = DllGetClassObject( &CLSID_WineMsiRemoteCustomAction, - &IID_IClassFactory, (LPVOID *)&cf ); - if (FAILED(r)) - { - ERR("failed to get IClassFactory interface\n"); - return ERROR_FUNCTION_FAILED; - } - - r = IClassFactory_CreateInstance( cf, NULL, &IID_IWineMsiRemoteCustomAction, (LPVOID *)&rca ); - if (FAILED(r)) - { - ERR("failed to get IWineMsiRemoteCustomAction interface\n"); - return ERROR_FUNCTION_FAILED; - } - - r = IWineMsiRemoteCustomAction_GetActionInfo( rca, guid, type, dll, funcname, package ); - IWineMsiRemoteCustomAction_Release( rca ); - if (FAILED(r)) - { - ERR("GetActionInfo failed\n"); - return ERROR_FUNCTION_FAILED; - } - - return ERROR_SUCCESS; -} - #ifdef __i386__ extern UINT CUSTOMPROC_wrapper( MsiCustomActionEntryPoint proc, MSIHANDLE handle ); __ASM_GLOBAL_FUNC( CUSTOMPROC_wrapper, @@ -550,17 +516,17 @@ static inline UINT CUSTOMPROC_wrapper( MsiCustomActionEntryPoint proc, MSIHANDLE static DWORD ACTION_CallDllFunction( const GUID *guid ) { MsiCustomActionEntryPoint fn; + MSIHANDLE remote_package = 0; MSIHANDLE hPackage; HANDLE hModule; LPSTR proc; UINT r = ERROR_FUNCTION_FAILED; BSTR dll = NULL, function = NULL; INT type; - IWineMsiRemotePackage *remote_package = NULL;
TRACE("%s\n", debugstr_guid( guid ));
- r = get_action_info( guid, &type, &dll, &function, &remote_package ); + r = remote_GetActionInfo( guid, &type, &dll, &function, &remote_package ); if (r != ERROR_SUCCESS) return r;
@@ -576,7 +542,7 @@ static DWORD ACTION_CallDllFunction( const GUID *guid ) msi_free( proc ); if (fn) { - hPackage = alloc_msi_remote_handle( (IUnknown *)remote_package ); + hPackage = alloc_msi_remote_handle( remote_package ); if (hPackage) { TRACE("calling %s\n", debugstr_w( function ) ); @@ -597,14 +563,14 @@ static DWORD ACTION_CallDllFunction( const GUID *guid ) MsiCloseHandle( hPackage ); } else - ERR("failed to create handle for %p\n", remote_package ); + ERR("failed to create handle for %x\n", remote_package ); } else ERR("GetProcAddress(%s) failed\n", debugstr_w( function ) );
FreeLibrary(hModule);
- IWineMsiRemotePackage_Release( remote_package ); + MsiCloseHandle(hPackage); SysFreeString( dll ); SysFreeString( function );
@@ -1383,50 +1349,8 @@ void ACTION_FinishCustomActions(const MSIPACKAGE* package) LeaveCriticalSection( &msi_custom_action_cs ); }
-typedef struct _msi_custom_remote_impl { - IWineMsiRemoteCustomAction IWineMsiRemoteCustomAction_iface; - LONG refs; -} msi_custom_remote_impl; - -static inline msi_custom_remote_impl *impl_from_IWineMsiRemoteCustomAction( IWineMsiRemoteCustomAction *iface ) -{ - return CONTAINING_RECORD(iface, msi_custom_remote_impl, IWineMsiRemoteCustomAction_iface); -} - -static HRESULT WINAPI mcr_QueryInterface( IWineMsiRemoteCustomAction *iface, - REFIID riid,LPVOID *ppobj) -{ - if( IsEqualCLSID( riid, &IID_IUnknown ) || - IsEqualCLSID( riid, &IID_IWineMsiRemoteCustomAction ) ) - { - IWineMsiRemoteCustomAction_AddRef( iface ); - *ppobj = iface; - return S_OK; - } - - return E_NOINTERFACE; -} - -static ULONG WINAPI mcr_AddRef( IWineMsiRemoteCustomAction *iface ) -{ - msi_custom_remote_impl* This = impl_from_IWineMsiRemoteCustomAction( iface ); - - return InterlockedIncrement( &This->refs ); -} - -static ULONG WINAPI mcr_Release( IWineMsiRemoteCustomAction *iface ) -{ - msi_custom_remote_impl* This = impl_from_IWineMsiRemoteCustomAction( iface ); - ULONG r; - - r = InterlockedDecrement( &This->refs ); - if (r == 0) - msi_free( This ); - return r; -} - -static HRESULT WINAPI mcr_GetActionInfo( IWineMsiRemoteCustomAction *iface, LPCGUID custom_action_guid, - INT *type, BSTR *dll, BSTR *func, IWineMsiRemotePackage **remote_package ) +HRESULT __cdecl remote_GetActionInfo( const GUID *custom_action_guid, + INT *type, BSTR *dll, BSTR *func, MSIHANDLE *remote_package ) { msi_custom_action_info *info; MSIHANDLE handle; @@ -1441,29 +1365,6 @@ static HRESULT WINAPI mcr_GetActionInfo( IWineMsiRemoteCustomAction *iface, LPCG *func = SysAllocString( info->target );
release_custom_action_data( info ); - return create_msi_remote_package( handle, remote_package ); -} - -static const IWineMsiRemoteCustomActionVtbl msi_custom_remote_vtbl = -{ - mcr_QueryInterface, - mcr_AddRef, - mcr_Release, - mcr_GetActionInfo, -}; - -HRESULT create_msi_custom_remote( IUnknown *pOuter, LPVOID *ppObj ) -{ - msi_custom_remote_impl* This; - - This = msi_alloc( sizeof *This ); - if (!This) - return E_OUTOFMEMORY; - - This->IWineMsiRemoteCustomAction_iface.lpVtbl = &msi_custom_remote_vtbl; - This->refs = 1; - - *ppObj = &This->IWineMsiRemoteCustomAction_iface; - + *remote_package = handle; return S_OK; } diff --git a/dlls/msi/database.c b/dlls/msi/database.c index 85e8306..d3eb910 100644 --- a/dlls/msi/database.c +++ b/dlls/msi/database.c @@ -873,13 +873,10 @@ UINT WINAPI MsiDatabaseImportW(MSIHANDLE handle, LPCWSTR szFolder, LPCWSTR szFil db = msihandle2msiinfo( handle, MSIHANDLETYPE_DATABASE ); if( !db ) { - IWineMsiRemoteDatabase *remote_database; - - remote_database = (IWineMsiRemoteDatabase *)msi_get_remote( handle ); + MSIHANDLE remote_database = msi_get_remote( handle ); if ( !remote_database ) return ERROR_INVALID_HANDLE;
- IWineMsiRemoteDatabase_Release( remote_database ); WARN("MsiDatabaseImport not allowed during a custom action!\n");
return ERROR_SUCCESS; @@ -1094,13 +1091,10 @@ UINT WINAPI MsiDatabaseExportW( MSIHANDLE handle, LPCWSTR szTable, db = msihandle2msiinfo( handle, MSIHANDLETYPE_DATABASE ); if( !db ) { - IWineMsiRemoteDatabase *remote_database; - - remote_database = (IWineMsiRemoteDatabase *)msi_get_remote( handle ); + MSIHANDLE remote_database = msi_get_remote(handle); if ( !remote_database ) return ERROR_INVALID_HANDLE;
- IWineMsiRemoteDatabase_Release( remote_database ); WARN("MsiDatabaseExport not allowed during a custom action!\n");
return ERROR_SUCCESS; @@ -1896,13 +1890,10 @@ MSIDBSTATE WINAPI MsiGetDatabaseState( MSIHANDLE handle ) db = msihandle2msiinfo( handle, MSIHANDLETYPE_DATABASE ); if( !db ) { - IWineMsiRemoteDatabase *remote_database; - - remote_database = (IWineMsiRemoteDatabase *)msi_get_remote( handle ); + MSIHANDLE remote_database = msi_get_remote(handle); if ( !remote_database ) return MSIDBSTATE_ERROR;
- IWineMsiRemoteDatabase_Release( remote_database ); WARN("MsiGetDatabaseState not allowed during a custom action!\n");
return MSIDBSTATE_READ; @@ -1915,116 +1906,26 @@ MSIDBSTATE WINAPI MsiGetDatabaseState( MSIHANDLE handle ) return ret; }
-typedef struct _msi_remote_database_impl { - IWineMsiRemoteDatabase IWineMsiRemoteDatabase_iface; - MSIHANDLE database; - LONG refs; -} msi_remote_database_impl; - -static inline msi_remote_database_impl *impl_from_IWineMsiRemoteDatabase( IWineMsiRemoteDatabase *iface ) +HRESULT __cdecl remote_DatabaseIsTablePersistent(MSIHANDLE db, LPCWSTR table, MSICONDITION *persistent) { - return CONTAINING_RECORD(iface, msi_remote_database_impl, IWineMsiRemoteDatabase_iface); -} - -static HRESULT WINAPI mrd_QueryInterface( IWineMsiRemoteDatabase *iface, - REFIID riid,LPVOID *ppobj) -{ - if( IsEqualCLSID( riid, &IID_IUnknown ) || - IsEqualCLSID( riid, &IID_IWineMsiRemoteDatabase ) ) - { - IWineMsiRemoteDatabase_AddRef( iface ); - *ppobj = iface; - return S_OK; - } - - return E_NOINTERFACE; -} - -static ULONG WINAPI mrd_AddRef( IWineMsiRemoteDatabase *iface ) -{ - msi_remote_database_impl* This = impl_from_IWineMsiRemoteDatabase( iface ); - - return InterlockedIncrement( &This->refs ); -} - -static ULONG WINAPI mrd_Release( IWineMsiRemoteDatabase *iface ) -{ - msi_remote_database_impl* This = impl_from_IWineMsiRemoteDatabase( iface ); - ULONG r; - - r = InterlockedDecrement( &This->refs ); - if (r == 0) - { - MsiCloseHandle( This->database ); - msi_free( This ); - } - return r; -} - -static HRESULT WINAPI mrd_IsTablePersistent( IWineMsiRemoteDatabase *iface, - LPCWSTR table, MSICONDITION *persistent ) -{ - msi_remote_database_impl *This = impl_from_IWineMsiRemoteDatabase( iface ); - *persistent = MsiDatabaseIsTablePersistentW(This->database, table); + *persistent = MsiDatabaseIsTablePersistentW(db, table); return S_OK; }
-static HRESULT WINAPI mrd_GetPrimaryKeys( IWineMsiRemoteDatabase *iface, - LPCWSTR table, MSIHANDLE *keys ) +HRESULT __cdecl remote_DatabaseGetPrimaryKeys(MSIHANDLE db, LPCWSTR table, MSIHANDLE *keys) { - msi_remote_database_impl *This = impl_from_IWineMsiRemoteDatabase( iface ); - UINT r = MsiDatabaseGetPrimaryKeysW(This->database, table, keys); + UINT r = MsiDatabaseGetPrimaryKeysW(db, table, keys); return HRESULT_FROM_WIN32(r); }
-static HRESULT WINAPI mrd_GetSummaryInformation( IWineMsiRemoteDatabase *iface, - UINT updatecount, MSIHANDLE *suminfo ) +HRESULT __cdecl remote_DatabaseGetSummaryInformation(MSIHANDLE db, UINT updatecount, MSIHANDLE *suminfo) { - msi_remote_database_impl *This = impl_from_IWineMsiRemoteDatabase( iface ); - UINT r = MsiGetSummaryInformationW(This->database, NULL, updatecount, suminfo); + UINT r = MsiGetSummaryInformationW(db, NULL, updatecount, suminfo); return HRESULT_FROM_WIN32(r); }
-static HRESULT WINAPI mrd_OpenView( IWineMsiRemoteDatabase *iface, - LPCWSTR query, MSIHANDLE *view ) +HRESULT __cdecl remote_DatabaseOpenView(MSIHANDLE db, LPCWSTR query, MSIHANDLE *view) { - msi_remote_database_impl *This = impl_from_IWineMsiRemoteDatabase( iface ); - UINT r = MsiDatabaseOpenViewW(This->database, query, view); + UINT r = MsiDatabaseOpenViewW(db, query, view); return HRESULT_FROM_WIN32(r); } - -static HRESULT WINAPI mrd_SetMsiHandle( IWineMsiRemoteDatabase *iface, MSIHANDLE handle ) -{ - msi_remote_database_impl* This = impl_from_IWineMsiRemoteDatabase( iface ); - This->database = handle; - return S_OK; -} - -static const IWineMsiRemoteDatabaseVtbl msi_remote_database_vtbl = -{ - mrd_QueryInterface, - mrd_AddRef, - mrd_Release, - mrd_IsTablePersistent, - mrd_GetPrimaryKeys, - mrd_GetSummaryInformation, - mrd_OpenView, - mrd_SetMsiHandle, -}; - -HRESULT create_msi_remote_database( IUnknown *pOuter, LPVOID *ppObj ) -{ - msi_remote_database_impl *This; - - This = msi_alloc( sizeof *This ); - if (!This) - return E_OUTOFMEMORY; - - This->IWineMsiRemoteDatabase_iface.lpVtbl = &msi_remote_database_vtbl; - This->database = 0; - This->refs = 1; - - *ppObj = &This->IWineMsiRemoteDatabase_iface; - - return S_OK; -} diff --git a/dlls/msi/dialog.c b/dlls/msi/dialog.c index 8825c28..ec32581 100644 --- a/dlls/msi/dialog.c +++ b/dlls/msi/dialog.c @@ -4138,15 +4138,12 @@ UINT WINAPI MsiEnableUIPreview( MSIHANDLE hdb, MSIHANDLE *phPreview ) db = msihandle2msiinfo( hdb, MSIHANDLETYPE_DATABASE ); if (!db) { - IWineMsiRemoteDatabase *remote_database; - - remote_database = (IWineMsiRemoteDatabase *)msi_get_remote( hdb ); + MSIHANDLE remote_database = msi_get_remote( hdb ); if (!remote_database) return ERROR_INVALID_HANDLE;
*phPreview = 0;
- IWineMsiRemoteDatabase_Release( remote_database ); WARN("MsiEnableUIPreview not allowed during a custom action!\n");
return ERROR_FUNCTION_FAILED; diff --git a/dlls/msi/format.c b/dlls/msi/format.c index 3bcd0b8..f15c4ce 100644 --- a/dlls/msi/format.c +++ b/dlls/msi/format.c @@ -34,7 +34,7 @@ #include "oleauto.h"
#include "msipriv.h" -#include "msiserver.h" +#include "winemsi.h" #include "wine/unicode.h"
WINE_DEFAULT_DEBUG_CHANNEL(msi); @@ -911,15 +911,13 @@ UINT WINAPI MsiFormatRecordW( MSIHANDLE hInstall, MSIHANDLE hRecord, if (!package) { HRESULT hr; - IWineMsiRemotePackage *remote_package; + MSIHANDLE remote; BSTR value = NULL; awstring wstr;
- remote_package = (IWineMsiRemotePackage *)msi_get_remote( hInstall ); - if (remote_package) + if ((remote = msi_get_remote(hInstall))) { - hr = IWineMsiRemotePackage_FormatRecord( remote_package, hRecord, - &value ); + hr = remote_FormatRecord(remote, hRecord, &value); if (FAILED(hr)) goto done;
@@ -928,7 +926,6 @@ UINT WINAPI MsiFormatRecordW( MSIHANDLE hInstall, MSIHANDLE hRecord, r = msi_strcpy_to_awstring( value, SysStringLen(value), &wstr, sz );
done: - IWineMsiRemotePackage_Release( remote_package ); SysFreeString( value );
if (FAILED(hr)) diff --git a/dlls/msi/handle.c b/dlls/msi/handle.c index 80c6873..1002f9d 100644 --- a/dlls/msi/handle.c +++ b/dlls/msi/handle.c @@ -29,7 +29,9 @@ #include "wine/debug.h" #include "msi.h" #include "msiquery.h" + #include "msipriv.h" +#include "winemsi.h"
WINE_DEFAULT_DEBUG_CHANNEL(msi);
@@ -58,7 +60,7 @@ typedef struct msi_handle_info_t BOOL remote; union { MSIOBJECTHDR *obj; - IUnknown *unk; + MSIHANDLE rem; } u; DWORD dwThreadId; } msi_handle_info; @@ -81,7 +83,7 @@ static MSIHANDLE alloc_handle_table_entry(void)
/* find a slot */ for(i=0; i<msihandletable_size; i++) - if( !msihandletable[i].u.obj && !msihandletable[i].u.unk ) + if( !msihandletable[i].u.obj && !msihandletable[i].u.rem ) break; if( i==msihandletable_size ) { @@ -130,7 +132,7 @@ MSIHANDLE alloc_msihandle( MSIOBJECTHDR *obj ) return ret; }
-MSIHANDLE alloc_msi_remote_handle( IUnknown *unk ) +MSIHANDLE alloc_msi_remote_handle(MSIHANDLE remote) { msi_handle_info *entry; MSIHANDLE ret; @@ -141,15 +143,14 @@ MSIHANDLE alloc_msi_remote_handle( IUnknown *unk ) if (ret) { entry = &msihandletable[ ret - 1 ]; - IUnknown_AddRef( unk ); - entry->u.unk = unk; + entry->u.rem = remote; entry->dwThreadId = GetCurrentThreadId(); entry->remote = TRUE; }
LeaveCriticalSection( &MSI_handle_cs );
- TRACE("%p -> %d\n", unk, ret); + TRACE("%d -> %d\n", remote, ret);
return ret; } @@ -179,9 +180,9 @@ out: return ret; }
-IUnknown *msi_get_remote( MSIHANDLE handle ) +MSIHANDLE msi_get_remote( MSIHANDLE handle ) { - IUnknown *unk = NULL; + MSIHANDLE ret = 0;
EnterCriticalSection( &MSI_handle_cs ); handle--; @@ -189,14 +190,12 @@ IUnknown *msi_get_remote( MSIHANDLE handle ) goto out; if( !msihandletable[handle].remote) goto out; - unk = msihandletable[handle].u.unk; - if( unk ) - IUnknown_AddRef( unk ); + ret = msihandletable[handle].u.rem;
out: LeaveCriticalSection( &MSI_handle_cs );
- return unk; + return ret; }
void *alloc_msiobject(UINT type, UINT size, msihandledestructor destroy ) @@ -285,7 +284,7 @@ UINT WINAPI MsiCloseHandle(MSIHANDLE handle)
if (msihandletable[handle].remote) { - IUnknown_Release( msihandletable[handle].u.unk ); + remote_CloseHandle( msihandletable[handle].u.rem ); } else { @@ -344,3 +343,8 @@ UINT WINAPI MsiCloseAllHandles(void)
return n; } + +UINT __cdecl remote_CloseHandle(MSIHANDLE handle) +{ + return MsiCloseHandle(handle); +} diff --git a/dlls/msi/install.c b/dlls/msi/install.c index 261a259..65840e2 100644 --- a/dlls/msi/install.c +++ b/dlls/msi/install.c @@ -34,7 +34,7 @@ #include "oleauto.h"
#include "msipriv.h" -#include "msiserver.h" +#include "winemsi.h" #include "wine/unicode.h"
WINE_DEFAULT_DEBUG_CHANNEL(msi); @@ -74,25 +74,20 @@ UINT WINAPI MsiDoActionW( MSIHANDLE hInstall, LPCWSTR szAction ) package = msihandle2msiinfo( hInstall, MSIHANDLETYPE_PACKAGE ); if (!package) { + MSIHANDLE remote; HRESULT hr; BSTR action; - IWineMsiRemotePackage *remote_package;
- remote_package = (IWineMsiRemotePackage *)msi_get_remote( hInstall ); - if (!remote_package) + if (!(remote = msi_get_remote(hInstall))) return ERROR_INVALID_HANDLE;
action = SysAllocString( szAction ); if (!action) - { - IWineMsiRemotePackage_Release( remote_package ); return ERROR_OUTOFMEMORY; - }
- hr = IWineMsiRemotePackage_DoAction( remote_package, action ); + hr = remote_DoAction(remote, action);
SysFreeString( action ); - IWineMsiRemotePackage_Release( remote_package );
if (FAILED(hr)) { @@ -143,25 +138,20 @@ UINT WINAPI MsiSequenceW( MSIHANDLE hInstall, LPCWSTR szTable, INT iSequenceMode package = msihandle2msiinfo( hInstall, MSIHANDLETYPE_PACKAGE ); if (!package) { + MSIHANDLE remote; HRESULT hr; BSTR table; - IWineMsiRemotePackage *remote_package;
- remote_package = (IWineMsiRemotePackage *)msi_get_remote( hInstall ); - if (!remote_package) + if (!(remote = msi_get_remote(hInstall))) return ERROR_INVALID_HANDLE;
table = SysAllocString( szTable ); if (!table) - { - IWineMsiRemotePackage_Release( remote_package ); return ERROR_OUTOFMEMORY; - }
- hr = IWineMsiRemotePackage_Sequence( remote_package, table, iSequenceMode ); + hr = remote_Sequence(remote, table, iSequenceMode);
SysFreeString( table ); - IWineMsiRemotePackage_Release( remote_package );
if (FAILED(hr)) { @@ -239,25 +229,21 @@ static UINT MSI_GetTargetPath( MSIHANDLE hInstall, LPCWSTR szFolder, package = msihandle2msiinfo( hInstall, MSIHANDLETYPE_PACKAGE ); if (!package) { + MSIHANDLE remote; HRESULT hr; - IWineMsiRemotePackage *remote_package; LPWSTR value = NULL; BSTR folder; DWORD len;
- remote_package = (IWineMsiRemotePackage *)msi_get_remote( hInstall ); - if (!remote_package) + if (!(remote = msi_get_remote(hInstall))) return ERROR_INVALID_HANDLE;
folder = SysAllocString( szFolder ); if (!folder) - { - IWineMsiRemotePackage_Release( remote_package ); return ERROR_OUTOFMEMORY; - }
len = 0; - hr = IWineMsiRemotePackage_GetTargetPath( remote_package, folder, NULL, &len ); + hr = remote_GetTargetPath(remote, folder, NULL, &len); if (FAILED(hr)) goto done;
@@ -269,14 +255,13 @@ static UINT MSI_GetTargetPath( MSIHANDLE hInstall, LPCWSTR szFolder, goto done; }
- hr = IWineMsiRemotePackage_GetTargetPath( remote_package, folder, value, &len ); + hr = remote_GetTargetPath(remote, folder, value, &len); if (FAILED(hr)) goto done;
r = msi_strcpy_to_awstring( value, len, szPathBuf, pcchPathBuf );
done: - IWineMsiRemotePackage_Release( remote_package ); SysFreeString( folder ); msi_free( value );
@@ -409,24 +394,20 @@ static UINT MSI_GetSourcePath( MSIHANDLE hInstall, LPCWSTR szFolder, if (!package) { HRESULT hr; - IWineMsiRemotePackage *remote_package; LPWSTR value = NULL; + MSIHANDLE remote; BSTR folder; DWORD len;
- remote_package = (IWineMsiRemotePackage *)msi_get_remote( hInstall ); - if (!remote_package) + if (!(remote = msi_get_remote(hInstall))) return ERROR_INVALID_HANDLE;
folder = SysAllocString( szFolder ); if (!folder) - { - IWineMsiRemotePackage_Release( remote_package ); return ERROR_OUTOFMEMORY; - }
len = 0; - hr = IWineMsiRemotePackage_GetSourcePath( remote_package, folder, NULL, &len ); + hr = remote_GetSourcePath(remote, folder, NULL, &len); if (FAILED(hr)) goto done;
@@ -438,14 +419,13 @@ static UINT MSI_GetSourcePath( MSIHANDLE hInstall, LPCWSTR szFolder, goto done; }
- hr = IWineMsiRemotePackage_GetSourcePath( remote_package, folder, value, &len ); + hr = remote_GetSourcePath(remote, folder, value, &len); if (FAILED(hr)) goto done;
r = msi_strcpy_to_awstring( value, len, szPathBuf, pcchPathBuf );
done: - IWineMsiRemotePackage_Release( remote_package ); SysFreeString( folder ); msi_free( value );
@@ -616,10 +596,9 @@ UINT WINAPI MsiSetTargetPathW(MSIHANDLE hInstall, LPCWSTR szFolder, { HRESULT hr; BSTR folder, path; - IWineMsiRemotePackage *remote_package; + MSIHANDLE remote;
- remote_package = (IWineMsiRemotePackage *)msi_get_remote( hInstall ); - if (!remote_package) + if (!(remote = msi_get_remote(hInstall))) return ERROR_INVALID_HANDLE;
folder = SysAllocString( szFolder ); @@ -628,15 +607,13 @@ UINT WINAPI MsiSetTargetPathW(MSIHANDLE hInstall, LPCWSTR szFolder, { SysFreeString(folder); SysFreeString(path); - IWineMsiRemotePackage_Release( remote_package ); return ERROR_OUTOFMEMORY; }
- hr = IWineMsiRemotePackage_SetTargetPath( remote_package, folder, path ); + hr = remote_SetTargetPath(remote, folder, path);
SysFreeString(folder); SysFreeString(path); - IWineMsiRemotePackage_Release( remote_package );
if (FAILED(hr)) { @@ -697,16 +674,14 @@ BOOL WINAPI MsiGetMode(MSIHANDLE hInstall, MSIRUNMODE iRunMode) package = msihandle2msiinfo(hInstall, MSIHANDLETYPE_PACKAGE); if (!package) { + MSIHANDLE remote; BOOL ret; HRESULT hr; - IWineMsiRemotePackage *remote_package;
- remote_package = (IWineMsiRemotePackage *)msi_get_remote(hInstall); - if (!remote_package) + if (!(remote = msi_get_remote(hInstall))) return FALSE;
- hr = IWineMsiRemotePackage_GetMode(remote_package, iRunMode, &ret); - IWineMsiRemotePackage_Release(remote_package); + hr = remote_GetMode(remote, iRunMode, &ret);
if (hr == S_OK) return ret; @@ -789,15 +764,13 @@ UINT WINAPI MsiSetMode(MSIHANDLE hInstall, MSIRUNMODE iRunMode, BOOL fState) package = msihandle2msiinfo( hInstall, MSIHANDLETYPE_PACKAGE ); if (!package) { + MSIHANDLE remote; HRESULT hr; - IWineMsiRemotePackage *remote_package;
- remote_package = (IWineMsiRemotePackage *)msi_get_remote( hInstall ); - if (!remote_package) + if (!(remote = msi_get_remote(hInstall))) return FALSE;
- hr = IWineMsiRemotePackage_SetMode( remote_package, iRunMode, fState ); - IWineMsiRemotePackage_Release( remote_package ); + hr = remote_SetMode(remote, iRunMode, fState);
if (FAILED(hr)) { @@ -980,25 +953,20 @@ UINT WINAPI MsiSetFeatureStateW(MSIHANDLE hInstall, LPCWSTR szFeature, package = msihandle2msiinfo(hInstall, MSIHANDLETYPE_PACKAGE); if (!package) { + MSIHANDLE remote; HRESULT hr; BSTR feature; - IWineMsiRemotePackage *remote_package;
- remote_package = (IWineMsiRemotePackage *)msi_get_remote(hInstall); - if (!remote_package) + if (!(remote = msi_get_remote(hInstall))) return ERROR_INVALID_HANDLE;
feature = SysAllocString(szFeature); if (!feature) - { - IWineMsiRemotePackage_Release(remote_package); return ERROR_OUTOFMEMORY; - }
- hr = IWineMsiRemotePackage_SetFeatureState(remote_package, feature, iState); + hr = remote_SetFeatureState(remote, feature, iState);
SysFreeString(feature); - IWineMsiRemotePackage_Release(remote_package);
if (FAILED(hr)) { @@ -1131,26 +1099,20 @@ UINT WINAPI MsiGetFeatureStateW(MSIHANDLE hInstall, LPCWSTR szFeature, package = msihandle2msiinfo(hInstall, MSIHANDLETYPE_PACKAGE); if (!package) { + MSIHANDLE remote; HRESULT hr; BSTR feature; - IWineMsiRemotePackage *remote_package;
- remote_package = (IWineMsiRemotePackage *)msi_get_remote(hInstall); - if (!remote_package) + if (!(remote = msi_get_remote(hInstall))) return ERROR_INVALID_HANDLE;
feature = SysAllocString(szFeature); if (!feature) - { - IWineMsiRemotePackage_Release(remote_package); return ERROR_OUTOFMEMORY; - }
- hr = IWineMsiRemotePackage_GetFeatureState(remote_package, feature, - piInstalled, piAction); + hr = remote_GetFeatureState(remote, feature, piInstalled, piAction);
SysFreeString(feature); - IWineMsiRemotePackage_Release(remote_package);
if (FAILED(hr)) { @@ -1263,26 +1225,20 @@ UINT WINAPI MsiGetFeatureCostW(MSIHANDLE hInstall, LPCWSTR szFeature, package = msihandle2msiinfo(hInstall, MSIHANDLETYPE_PACKAGE); if (!package) { + MSIHANDLE remote; HRESULT hr; BSTR feature; - IWineMsiRemotePackage *remote_package;
- remote_package = (IWineMsiRemotePackage *)msi_get_remote(hInstall); - if (!remote_package) + if (!(remote = msi_get_remote(hInstall))) return ERROR_INVALID_HANDLE;
feature = SysAllocString(szFeature); if (!feature) - { - IWineMsiRemotePackage_Release(remote_package); return ERROR_OUTOFMEMORY; - }
- hr = IWineMsiRemotePackage_GetFeatureCost(remote_package, feature, - iCostTree, iState, piCost); + hr = remote_GetFeatureCost(remote, feature, iCostTree, iState, piCost);
SysFreeString(feature); - IWineMsiRemotePackage_Release(remote_package);
if (FAILED(hr)) { @@ -1521,25 +1477,20 @@ UINT WINAPI MsiSetComponentStateW(MSIHANDLE hInstall, LPCWSTR szComponent, package = msihandle2msiinfo(hInstall, MSIHANDLETYPE_PACKAGE); if (!package) { + MSIHANDLE remote; HRESULT hr; BSTR component; - IWineMsiRemotePackage *remote_package;
- remote_package = (IWineMsiRemotePackage *)msi_get_remote(hInstall); - if (!remote_package) + if (!(remote = msi_get_remote(hInstall))) return ERROR_INVALID_HANDLE;
component = SysAllocString(szComponent); if (!component) - { - IWineMsiRemotePackage_Release(remote_package); return ERROR_OUTOFMEMORY; - }
- hr = IWineMsiRemotePackage_SetComponentState(remote_package, component, iState); + hr = remote_SetComponentState(remote, component, iState);
SysFreeString(component); - IWineMsiRemotePackage_Release(remote_package);
if (FAILED(hr)) { @@ -1572,26 +1523,20 @@ UINT WINAPI MsiGetComponentStateW(MSIHANDLE hInstall, LPCWSTR szComponent, package = msihandle2msiinfo(hInstall, MSIHANDLETYPE_PACKAGE); if (!package) { + MSIHANDLE remote; HRESULT hr; BSTR component; - IWineMsiRemotePackage *remote_package;
- remote_package = (IWineMsiRemotePackage *)msi_get_remote(hInstall); - if (!remote_package) + if (!(remote = msi_get_remote(hInstall))) return ERROR_INVALID_HANDLE;
component = SysAllocString(szComponent); if (!component) - { - IWineMsiRemotePackage_Release(remote_package); return ERROR_OUTOFMEMORY; - }
- hr = IWineMsiRemotePackage_GetComponentState(remote_package, component, - piInstalled, piAction); + hr = remote_GetComponentState(remote, component, piInstalled, piAction);
SysFreeString(component); - IWineMsiRemotePackage_Release(remote_package);
if (FAILED(hr)) { @@ -1620,15 +1565,14 @@ LANGID WINAPI MsiGetLanguage(MSIHANDLE hInstall) package = msihandle2msiinfo(hInstall, MSIHANDLETYPE_PACKAGE); if (!package) { + MSIHANDLE remote; HRESULT hr; LANGID lang; - IWineMsiRemotePackage *remote_package;
- remote_package = (IWineMsiRemotePackage *)msi_get_remote(hInstall); - if (!remote_package) + if (!(remote = msi_get_remote(hInstall))) return ERROR_INVALID_HANDLE;
- hr = IWineMsiRemotePackage_GetLanguage(remote_package, &lang); + hr = remote_GetLanguage(remote, &lang);
if (SUCCEEDED(hr)) return lang; @@ -1677,16 +1621,13 @@ UINT WINAPI MsiSetInstallLevel(MSIHANDLE hInstall, int iInstallLevel) package = msihandle2msiinfo(hInstall, MSIHANDLETYPE_PACKAGE); if (!package) { + MSIHANDLE remote; HRESULT hr; - IWineMsiRemotePackage *remote_package;
- remote_package = (IWineMsiRemotePackage *)msi_get_remote(hInstall); - if (!remote_package) + if (!(remote = msi_get_remote(hInstall))) return ERROR_INVALID_HANDLE;
- hr = IWineMsiRemotePackage_SetInstallLevel(remote_package, iInstallLevel); - - IWineMsiRemotePackage_Release(remote_package); + hr = remote_SetInstallLevel(remote, iInstallLevel);
if (FAILED(hr)) { diff --git a/dlls/msi/msi.c b/dlls/msi/msi.c index 7e5e23f..c0af7f5 100644 --- a/dlls/msi/msi.c +++ b/dlls/msi/msi.c @@ -31,8 +31,6 @@ #include "msi.h" #include "msidefs.h" #include "msiquery.h" -#include "msipriv.h" -#include "msiserver.h" #include "wincrypt.h" #include "winver.h" #include "winuser.h" @@ -42,6 +40,9 @@ #include "wintrust.h" #include "softpub.h"
+#include "msipriv.h" +#include "winemsi.h" + #include "initguid.h" #include "msxml2.h"
@@ -2004,20 +2005,18 @@ UINT WINAPI MsiEnumComponentCostsW( MSIHANDLE handle, LPCWSTR component, DWORD i if (!drive || !buflen || !cost || !temp) return ERROR_INVALID_PARAMETER; if (!(package = msihandle2msiinfo( handle, MSIHANDLETYPE_PACKAGE ))) { + MSIHANDLE remote; HRESULT hr; - IWineMsiRemotePackage *remote_package; BSTR bname = NULL;
- if (!(remote_package = (IWineMsiRemotePackage *)msi_get_remote( handle ))) + if (!(remote = msi_get_remote(handle))) return ERROR_INVALID_HANDLE;
if (component && !(bname = SysAllocString( component ))) - { - IWineMsiRemotePackage_Release( remote_package ); return ERROR_OUTOFMEMORY; - } - hr = IWineMsiRemotePackage_EnumComponentCosts( remote_package, bname, index, state, drive, buflen, cost, temp ); - IWineMsiRemotePackage_Release( remote_package ); + + hr = remote_EnumComponentCosts(remote, bname, index, state, drive, buflen, cost, temp); + SysFreeString( bname ); if (FAILED(hr)) { diff --git a/dlls/msi/msi_main.c b/dlls/msi/msi_main.c index 9f5b2c4..0e436b0 100644 --- a/dlls/msi/msi_main.c +++ b/dlls/msi/msi_main.c @@ -166,7 +166,6 @@ static const IClassFactoryVtbl MsiCF_Vtbl = };
static IClassFactoryImpl MsiServer_CF = { { &MsiCF_Vtbl }, create_msiserver }; -static IClassFactoryImpl WineMsiCustomRemote_CF = { { &MsiCF_Vtbl }, create_msi_custom_remote };
/****************************************************************** * DllGetClassObject [MSI.@] @@ -181,12 +180,6 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv) return S_OK; }
- if ( IsEqualCLSID (rclsid, &CLSID_WineMsiRemoteCustomAction) ) - { - *ppv = &WineMsiCustomRemote_CF; - return S_OK; - } - if( IsEqualCLSID (rclsid, &CLSID_MsiServerMessage) || IsEqualCLSID (rclsid, &CLSID_MsiServer) || IsEqualCLSID (rclsid, &CLSID_PSFactoryBuffer) || diff --git a/dlls/msi/msipriv.h b/dlls/msi/msipriv.h index 54acbc7..b2b3e7c 100644 --- a/dlls/msi/msipriv.h +++ b/dlls/msi/msipriv.h @@ -734,15 +734,12 @@ typedef struct { UINT msi_strcpy_to_awstring(const WCHAR *, int, awstring *, DWORD *) DECLSPEC_HIDDEN;
/* msi server interface */ -extern HRESULT create_msi_custom_remote( IUnknown *pOuter, LPVOID *ppObj ) DECLSPEC_HIDDEN; -extern HRESULT create_msi_remote_package( MSIHANDLE handle, IWineMsiRemotePackage **package ) DECLSPEC_HIDDEN; -extern HRESULT create_msi_remote_database( IUnknown *pOuter, LPVOID *ppObj ) DECLSPEC_HIDDEN; -extern IUnknown *msi_get_remote(MSIHANDLE handle) DECLSPEC_HIDDEN; +extern MSIHANDLE msi_get_remote(MSIHANDLE handle) DECLSPEC_HIDDEN;
/* handle functions */ extern void *msihandle2msiinfo(MSIHANDLE handle, UINT type) DECLSPEC_HIDDEN; extern MSIHANDLE alloc_msihandle( MSIOBJECTHDR * ) DECLSPEC_HIDDEN; -extern MSIHANDLE alloc_msi_remote_handle( IUnknown *unk ) DECLSPEC_HIDDEN; +extern MSIHANDLE alloc_msi_remote_handle(MSIHANDLE remote) DECLSPEC_HIDDEN; extern void *alloc_msiobject(UINT type, UINT size, msihandledestructor destroy ) DECLSPEC_HIDDEN; extern void msiobj_addref(MSIOBJECTHDR *) DECLSPEC_HIDDEN; extern int msiobj_release(MSIOBJECTHDR *) DECLSPEC_HIDDEN; diff --git a/dlls/msi/msiquery.c b/dlls/msi/msiquery.c index d73e5fe..f8ed4ce 100644 --- a/dlls/msi/msiquery.c +++ b/dlls/msi/msiquery.c @@ -31,11 +31,11 @@ #include "msiquery.h" #include "objbase.h" #include "objidl.h" -#include "msipriv.h" #include "winnls.h"
+#include "msipriv.h" #include "query.h" -#include "msiserver.h" +#include "winemsi.h"
#include "initguid.h"
@@ -250,15 +250,13 @@ UINT WINAPI MsiDatabaseOpenViewW(MSIHANDLE hdb, db = msihandle2msiinfo( hdb, MSIHANDLETYPE_DATABASE ); if( !db ) { + MSIHANDLE remote; HRESULT hr; - IWineMsiRemoteDatabase *remote_database;
- remote_database = (IWineMsiRemoteDatabase *)msi_get_remote( hdb ); - if ( !remote_database ) + if (!(remote = msi_get_remote(hdb))) return ERROR_INVALID_HANDLE;
- hr = IWineMsiRemoteDatabase_OpenView( remote_database, szQuery, phView ); - IWineMsiRemoteDatabase_Release( remote_database ); + hr = remote_DatabaseOpenView(remote, szQuery, phView);
if (FAILED(hr)) { @@ -758,13 +756,11 @@ UINT WINAPI MsiDatabaseApplyTransformW( MSIHANDLE hdb, db = msihandle2msiinfo( hdb, MSIHANDLETYPE_DATABASE ); if( !db ) { - IWineMsiRemoteDatabase *remote_database; + MSIHANDLE remote;
- remote_database = (IWineMsiRemoteDatabase *)msi_get_remote( hdb ); - if ( !remote_database ) + if (!(remote = msi_get_remote(hdb))) return ERROR_INVALID_HANDLE;
- IWineMsiRemoteDatabase_Release( remote_database ); WARN("MsiDatabaseApplyTransform not allowed during a custom action!\n");
return ERROR_SUCCESS; @@ -820,13 +816,11 @@ UINT WINAPI MsiDatabaseCommit( MSIHANDLE hdb ) db = msihandle2msiinfo( hdb, MSIHANDLETYPE_DATABASE ); if( !db ) { - IWineMsiRemoteDatabase *remote_database; + MSIHANDLE remote;
- remote_database = (IWineMsiRemoteDatabase *)msi_get_remote( hdb ); - if ( !remote_database ) + if (!(remote = msi_get_remote(hdb))) return ERROR_INVALID_HANDLE;
- IWineMsiRemoteDatabase_Release( remote_database ); WARN("not allowed during a custom action!\n");
return ERROR_SUCCESS; @@ -946,15 +940,13 @@ UINT WINAPI MsiDatabaseGetPrimaryKeysW( MSIHANDLE hdb, db = msihandle2msiinfo( hdb, MSIHANDLETYPE_DATABASE ); if( !db ) { + MSIHANDLE remote; HRESULT hr; - IWineMsiRemoteDatabase *remote_database;
- remote_database = (IWineMsiRemoteDatabase *)msi_get_remote( hdb ); - if ( !remote_database ) + if (!(remote = msi_get_remote(hdb))) return ERROR_INVALID_HANDLE;
- hr = IWineMsiRemoteDatabase_GetPrimaryKeys( remote_database, table, phRec ); - IWineMsiRemoteDatabase_Release( remote_database ); + hr = remote_DatabaseGetPrimaryKeys(remote, table, phRec);
if (FAILED(hr)) { @@ -1033,15 +1025,12 @@ MSICONDITION WINAPI MsiDatabaseIsTablePersistentW( { HRESULT hr; MSICONDITION condition; - IWineMsiRemoteDatabase *remote_database; + MSIHANDLE remote;
- remote_database = (IWineMsiRemoteDatabase *)msi_get_remote( hDatabase ); - if ( !remote_database ) + if (!(remote = msi_get_remote(hDatabase))) return MSICONDITION_ERROR;
- hr = IWineMsiRemoteDatabase_IsTablePersistent( remote_database, - szTableName, &condition ); - IWineMsiRemoteDatabase_Release( remote_database ); + hr = remote_DatabaseIsTablePersistent(remote, szTableName, &condition);
if (FAILED(hr)) return MSICONDITION_ERROR; diff --git a/dlls/msi/msiserver.idl b/dlls/msi/msiserver.idl index 704f6ea..4eb33fe 100644 --- a/dlls/msi/msiserver.idl +++ b/dlls/msi/msiserver.idl @@ -27,70 +27,6 @@ import "wtypes.idl"; import "objidl.idl"; import "oaidl.idl";
-cpp_quote("#if 0") -typedef unsigned long MSIHANDLE; -typedef int INSTALLMESSAGE; -typedef int MSICONDITION; -typedef int MSIRUNMODE; -typedef int INSTALLSTATE; -cpp_quote("#endif") - -[ - uuid(7BDE2046-D03B-4ffc-B84C-A098F38CFF0B), - oleautomation, - object -] -interface IWineMsiRemoteDatabase : IUnknown -{ - HRESULT IsTablePersistent( [in] LPCWSTR table, [out] MSICONDITION *persistent ); - HRESULT GetPrimaryKeys( [in] LPCWSTR table, [out] MSIHANDLE *keys ); - HRESULT GetSummaryInformation( [in] UINT updatecount, [out] MSIHANDLE *suminfo ); - HRESULT OpenView( [in] LPCWSTR query, [out] MSIHANDLE *view ); - HRESULT SetMsiHandle( [in] MSIHANDLE handle ); -} - -[ - uuid(902B3592-9D08-4dfd-A593-D07C52546421), - oleautomation, - object -] -interface IWineMsiRemotePackage : IUnknown -{ - HRESULT GetActiveDatabase( [out] MSIHANDLE *handle ); - HRESULT GetProperty( [in] BSTR property, [out, size_is(*size)] BSTR value, [in, out] DWORD *size ); - HRESULT SetProperty( [in] BSTR property, [in] BSTR value ); - HRESULT ProcessMessage( [in] INSTALLMESSAGE message, [in] MSIHANDLE record ); - HRESULT DoAction( [in] BSTR action ); - HRESULT Sequence( [in] BSTR table, [in] int sequence ); - HRESULT GetTargetPath( [in] BSTR folder, [out, size_is(*size)] BSTR value, [in, out] DWORD *size ); - HRESULT SetTargetPath( [in] BSTR folder, [in] BSTR value ); - HRESULT GetSourcePath( [in] BSTR folder, [out, size_is(*size)] BSTR value, [in, out] DWORD *size ); - HRESULT GetMode( [in] MSIRUNMODE mode, [out] BOOL *ret ); - HRESULT SetMode( [in] MSIRUNMODE mode, [in] BOOL state ); - HRESULT GetFeatureState( [in] BSTR feature, [out] INSTALLSTATE *installed, [out] INSTALLSTATE *action ); - HRESULT SetFeatureState( [in] BSTR feature, [in] INSTALLSTATE state ); - HRESULT GetComponentState( [in] BSTR component, [out] INSTALLSTATE *installed, [out] INSTALLSTATE *action ); - HRESULT SetComponentState( [in] BSTR component, [in] INSTALLSTATE state ); - HRESULT GetLanguage( [out] LANGID *language ); - HRESULT SetInstallLevel( [in] int level ); - HRESULT FormatRecord( [in] MSIHANDLE record, [out] BSTR *value ); - HRESULT EvaluateCondition( [in] BSTR condition ); - HRESULT GetFeatureCost( [in] BSTR feature, [in] INT cost_tree, [in] INSTALLSTATE state, [out] INT *cost ); - HRESULT EnumComponentCosts( [in] BSTR component, [in] DWORD index, [in] INSTALLSTATE state, - [out, size_is(*buflen)] BSTR drive, [in, out] DWORD *buflen, [out] INT *cost, [out] INT *temp ); -} - -[ - uuid(56D58B64-8780-4c22-A8BC-8B0B29E4A9F8), - oleautomation, - object -] -interface IWineMsiRemoteCustomAction : IUnknown -{ - HRESULT GetActionInfo( [in] LPCGUID guid, [out] INT *type, [out] BSTR *dllname, - [out] BSTR *function, [out] IWineMsiRemotePackage **package ); -} - [ uuid(000c101c-0000-0000-c000-000000000046), oleautomation, diff --git a/dlls/msi/package.c b/dlls/msi/package.c index 2d11ea8..4e1ac2f 100644 --- a/dlls/msi/package.c +++ b/dlls/msi/package.c @@ -45,7 +45,7 @@ #include "sddl.h"
#include "msipriv.h" -#include "msiserver.h" +#include "winemsi.h" #include "resource.h"
WINE_DEFAULT_DEBUG_CHANNEL(msi); @@ -1466,13 +1466,11 @@ UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE **pPackage) db = msihandle2msiinfo( handle, MSIHANDLETYPE_DATABASE ); if( !db ) { - IWineMsiRemoteDatabase *remote_database; + MSIHANDLE remote;
- remote_database = (IWineMsiRemoteDatabase *)msi_get_remote( handle ); - if ( !remote_database ) + if (!(remote = msi_get_remote(handle))) return ERROR_INVALID_HANDLE;
- IWineMsiRemoteDatabase_Release( remote_database ); WARN("MsiOpenPackage not allowed during a custom action!\n");
return ERROR_FUNCTION_FAILED; @@ -1693,8 +1691,7 @@ MSIHANDLE WINAPI MsiGetActiveDatabase(MSIHANDLE hInstall) { MSIPACKAGE *package; MSIHANDLE handle = 0; - IUnknown *remote_unk; - IWineMsiRemotePackage *remote_package; + MSIHANDLE remote;
TRACE("(%d)\n",hInstall);
@@ -1704,19 +1701,9 @@ MSIHANDLE WINAPI MsiGetActiveDatabase(MSIHANDLE hInstall) handle = alloc_msihandle( &package->db->hdr ); msiobj_release( &package->hdr ); } - else if ((remote_unk = msi_get_remote(hInstall))) + else if ((remote = msi_get_remote(hInstall))) { - if (IUnknown_QueryInterface(remote_unk, &IID_IWineMsiRemotePackage, - (LPVOID *)&remote_package) == S_OK) - { - IWineMsiRemotePackage_GetActiveDatabase(remote_package, &handle); - IWineMsiRemotePackage_Release(remote_package); - } - else - { - WARN("remote handle %d is not a package\n", hInstall); - } - IUnknown_Release(remote_unk); + remote_GetActiveDatabase(remote, &handle); }
return handle; @@ -2067,16 +2054,13 @@ INT WINAPI MsiProcessMessage( MSIHANDLE hInstall, INSTALLMESSAGE eMessageType, package = msihandle2msiinfo( hInstall, MSIHANDLETYPE_PACKAGE ); if( !package ) { + MSIHANDLE remote; HRESULT hr; - IWineMsiRemotePackage *remote_package;
- remote_package = (IWineMsiRemotePackage *)msi_get_remote( hInstall ); - if (!remote_package) + if (!(remote = msi_get_remote(hInstall))) return ERROR_INVALID_HANDLE;
- hr = IWineMsiRemotePackage_ProcessMessage( remote_package, eMessageType, hRecord ); - - IWineMsiRemotePackage_Release( remote_package ); + hr = remote_ProcessMessage(remote, eMessageType, hRecord);
if (FAILED(hr)) { @@ -2216,12 +2200,11 @@ UINT WINAPI MsiSetPropertyW( MSIHANDLE hInstall, LPCWSTR szName, LPCWSTR szValue package = msihandle2msiinfo( hInstall, MSIHANDLETYPE_PACKAGE); if( !package ) { + MSIHANDLE remote; HRESULT hr; BSTR name = NULL, value = NULL; - IWineMsiRemotePackage *remote_package;
- remote_package = (IWineMsiRemotePackage *)msi_get_remote( hInstall ); - if (!remote_package) + if (!(remote = msi_get_remote(hInstall))) return ERROR_INVALID_HANDLE;
name = SysAllocString( szName ); @@ -2230,15 +2213,13 @@ UINT WINAPI MsiSetPropertyW( MSIHANDLE hInstall, LPCWSTR szName, LPCWSTR szValue { SysFreeString( name ); SysFreeString( value ); - IWineMsiRemotePackage_Release( remote_package ); return ERROR_OUTOFMEMORY; }
- hr = IWineMsiRemotePackage_SetProperty( remote_package, name, value ); + hr = remote_SetProperty(remote, name, value);
SysFreeString( name ); SysFreeString( value ); - IWineMsiRemotePackage_Release( remote_package );
if (FAILED(hr)) { @@ -2416,22 +2397,18 @@ static UINT MSI_GetProperty( MSIHANDLE handle, LPCWSTR name, if (!package) { HRESULT hr; - IWineMsiRemotePackage *remote_package; LPWSTR value = NULL; + MSIHANDLE remote; BSTR bname;
- remote_package = (IWineMsiRemotePackage *)msi_get_remote( handle ); - if (!remote_package) + if (!(remote = msi_get_remote(handle))) return ERROR_INVALID_HANDLE;
bname = SysAllocString( name ); if (!bname) - { - IWineMsiRemotePackage_Release( remote_package ); return ERROR_OUTOFMEMORY; - }
- hr = IWineMsiRemotePackage_GetProperty( remote_package, bname, NULL, &len ); + hr = remote_GetProperty(remote, bname, NULL, &len); if (FAILED(hr)) goto done;
@@ -2443,7 +2420,7 @@ static UINT MSI_GetProperty( MSIHANDLE handle, LPCWSTR name, goto done; }
- hr = IWineMsiRemotePackage_GetProperty( remote_package, bname, value, &len ); + hr = remote_GetProperty(remote, bname, value, &len); if (FAILED(hr)) goto done;
@@ -2454,7 +2431,6 @@ static UINT MSI_GetProperty( MSIHANDLE handle, LPCWSTR name, *pchValueBuf *= sizeof(WCHAR);
done: - IWineMsiRemotePackage_Release(remote_package); SysFreeString(bname); msi_free(value);
@@ -2515,280 +2491,149 @@ UINT WINAPI MsiGetPropertyW( MSIHANDLE hInstall, LPCWSTR szName, return MSI_GetProperty( hInstall, szName, &val, pchValueBuf ); }
-typedef struct _msi_remote_package_impl { - IWineMsiRemotePackage IWineMsiRemotePackage_iface; - MSIHANDLE package; - LONG refs; -} msi_remote_package_impl; - -static inline msi_remote_package_impl *impl_from_IWineMsiRemotePackage( IWineMsiRemotePackage *iface ) +HRESULT __cdecl remote_GetActiveDatabase(MSIHANDLE hinst, MSIHANDLE *handle) { - return CONTAINING_RECORD(iface, msi_remote_package_impl, IWineMsiRemotePackage_iface); -} + *handle = MsiGetActiveDatabase(hinst);
-static HRESULT WINAPI mrp_QueryInterface( IWineMsiRemotePackage *iface, - REFIID riid,LPVOID *ppobj) -{ - if( IsEqualCLSID( riid, &IID_IUnknown ) || - IsEqualCLSID( riid, &IID_IWineMsiRemotePackage ) ) - { - IWineMsiRemotePackage_AddRef( iface ); - *ppobj = iface; - return S_OK; - } - - return E_NOINTERFACE; -} - -static ULONG WINAPI mrp_AddRef( IWineMsiRemotePackage *iface ) -{ - msi_remote_package_impl* This = impl_from_IWineMsiRemotePackage( iface ); - - return InterlockedIncrement( &This->refs ); -} - -static ULONG WINAPI mrp_Release( IWineMsiRemotePackage *iface ) -{ - msi_remote_package_impl* This = impl_from_IWineMsiRemotePackage( iface ); - ULONG r; - - r = InterlockedDecrement( &This->refs ); - if (r == 0) - { - MsiCloseHandle( This->package ); - msi_free( This ); - } - return r; -} - -static HRESULT WINAPI mrp_GetActiveDatabase( IWineMsiRemotePackage *iface, MSIHANDLE *handle ) -{ - msi_remote_package_impl* This = impl_from_IWineMsiRemotePackage( iface ); - IWineMsiRemoteDatabase *rdb = NULL; - HRESULT hr; - MSIHANDLE hdb; - - hr = create_msi_remote_database( NULL, (LPVOID *)&rdb ); - if (FAILED(hr) || !rdb) - { - ERR("Failed to create remote database\n"); - return hr; - } - - hdb = MsiGetActiveDatabase(This->package); - - hr = IWineMsiRemoteDatabase_SetMsiHandle( rdb, hdb ); - if (FAILED(hr)) - { - ERR("Failed to set the database handle\n"); - return hr; - } - - *handle = alloc_msi_remote_handle( (IUnknown *)rdb ); return S_OK; }
-static HRESULT WINAPI mrp_GetProperty( IWineMsiRemotePackage *iface, BSTR property, BSTR value, DWORD *size ) +HRESULT __cdecl remote_GetProperty(MSIHANDLE hinst, BSTR property, BSTR value, DWORD *size) { - msi_remote_package_impl* This = impl_from_IWineMsiRemotePackage( iface ); - UINT r = MsiGetPropertyW(This->package, property, value, size); + UINT r = MsiGetPropertyW(hinst, property, value, size); if (r != ERROR_SUCCESS) return HRESULT_FROM_WIN32(r); return S_OK; }
-static HRESULT WINAPI mrp_SetProperty( IWineMsiRemotePackage *iface, BSTR property, BSTR value ) +HRESULT __cdecl remote_SetProperty(MSIHANDLE hinst, BSTR property, BSTR value) { - msi_remote_package_impl* This = impl_from_IWineMsiRemotePackage( iface ); - UINT r = MsiSetPropertyW(This->package, property, value); + UINT r = MsiSetPropertyW(hinst, property, value); return HRESULT_FROM_WIN32(r); }
-static HRESULT WINAPI mrp_ProcessMessage( IWineMsiRemotePackage *iface, INSTALLMESSAGE message, MSIHANDLE record ) +HRESULT __cdecl remote_ProcessMessage(MSIHANDLE hinst, INSTALLMESSAGE message, MSIHANDLE record) { - msi_remote_package_impl* This = impl_from_IWineMsiRemotePackage( iface ); - UINT r = MsiProcessMessage(This->package, message, record); + UINT r = MsiProcessMessage(hinst, message, record); return HRESULT_FROM_WIN32(r); }
-static HRESULT WINAPI mrp_DoAction( IWineMsiRemotePackage *iface, BSTR action ) +HRESULT __cdecl remote_DoAction(MSIHANDLE hinst, BSTR action) { - msi_remote_package_impl* This = impl_from_IWineMsiRemotePackage( iface ); - UINT r = MsiDoActionW(This->package, action); + UINT r = MsiDoActionW(hinst, action); return HRESULT_FROM_WIN32(r); }
-static HRESULT WINAPI mrp_Sequence( IWineMsiRemotePackage *iface, BSTR table, int sequence ) +HRESULT __cdecl remote_Sequence(MSIHANDLE hinst, BSTR table, int sequence) { - msi_remote_package_impl* This = impl_from_IWineMsiRemotePackage( iface ); - UINT r = MsiSequenceW(This->package, table, sequence); + UINT r = MsiSequenceW(hinst, table, sequence); return HRESULT_FROM_WIN32(r); }
-static HRESULT WINAPI mrp_GetTargetPath( IWineMsiRemotePackage *iface, BSTR folder, BSTR value, DWORD *size ) +HRESULT __cdecl remote_GetTargetPath(MSIHANDLE hinst, BSTR folder, BSTR value, DWORD *size) { - msi_remote_package_impl* This = impl_from_IWineMsiRemotePackage( iface ); - UINT r = MsiGetTargetPathW(This->package, folder, value, size); + UINT r = MsiGetTargetPathW(hinst, folder, value, size); return HRESULT_FROM_WIN32(r); }
-static HRESULT WINAPI mrp_SetTargetPath( IWineMsiRemotePackage *iface, BSTR folder, BSTR value) +HRESULT __cdecl remote_SetTargetPath(MSIHANDLE hinst, BSTR folder, BSTR value) { - msi_remote_package_impl* This = impl_from_IWineMsiRemotePackage( iface ); - UINT r = MsiSetTargetPathW(This->package, folder, value); + UINT r = MsiSetTargetPathW(hinst, folder, value); return HRESULT_FROM_WIN32(r); }
-static HRESULT WINAPI mrp_GetSourcePath( IWineMsiRemotePackage *iface, BSTR folder, BSTR value, DWORD *size ) +HRESULT __cdecl remote_GetSourcePath(MSIHANDLE hinst, BSTR folder, BSTR value, DWORD *size) { - msi_remote_package_impl* This = impl_from_IWineMsiRemotePackage( iface ); - UINT r = MsiGetSourcePathW(This->package, folder, value, size); + UINT r = MsiGetSourcePathW(hinst, folder, value, size); return HRESULT_FROM_WIN32(r); }
-static HRESULT WINAPI mrp_GetMode( IWineMsiRemotePackage *iface, MSIRUNMODE mode, BOOL *ret ) +HRESULT __cdecl remote_GetMode(MSIHANDLE hinst, MSIRUNMODE mode, BOOL *ret) { - msi_remote_package_impl* This = impl_from_IWineMsiRemotePackage( iface ); - *ret = MsiGetMode(This->package, mode); + *ret = MsiGetMode(hinst, mode); return S_OK; }
-static HRESULT WINAPI mrp_SetMode( IWineMsiRemotePackage *iface, MSIRUNMODE mode, BOOL state ) +HRESULT __cdecl remote_SetMode(MSIHANDLE hinst, MSIRUNMODE mode, BOOL state) { - msi_remote_package_impl* This = impl_from_IWineMsiRemotePackage( iface ); - UINT r = MsiSetMode(This->package, mode, state); + UINT r = MsiSetMode(hinst, mode, state); return HRESULT_FROM_WIN32(r); }
-static HRESULT WINAPI mrp_GetFeatureState( IWineMsiRemotePackage *iface, BSTR feature, - INSTALLSTATE *installed, INSTALLSTATE *action ) +HRESULT __cdecl remote_GetFeatureState(MSIHANDLE hinst, BSTR feature, + INSTALLSTATE *installed, INSTALLSTATE *action) { - msi_remote_package_impl* This = impl_from_IWineMsiRemotePackage( iface ); - UINT r = MsiGetFeatureStateW(This->package, feature, installed, action); + UINT r = MsiGetFeatureStateW(hinst, feature, installed, action); return HRESULT_FROM_WIN32(r); }
-static HRESULT WINAPI mrp_SetFeatureState( IWineMsiRemotePackage *iface, BSTR feature, INSTALLSTATE state ) +HRESULT __cdecl remote_SetFeatureState(MSIHANDLE hinst, BSTR feature, INSTALLSTATE state) { - msi_remote_package_impl* This = impl_from_IWineMsiRemotePackage( iface ); - UINT r = MsiSetFeatureStateW(This->package, feature, state); + UINT r = MsiSetFeatureStateW(hinst, feature, state); return HRESULT_FROM_WIN32(r); }
-static HRESULT WINAPI mrp_GetComponentState( IWineMsiRemotePackage *iface, BSTR component, - INSTALLSTATE *installed, INSTALLSTATE *action ) +HRESULT __cdecl remote_GetComponentState(MSIHANDLE hinst, BSTR component, + INSTALLSTATE *installed, INSTALLSTATE *action) { - msi_remote_package_impl* This = impl_from_IWineMsiRemotePackage( iface ); - UINT r = MsiGetComponentStateW(This->package, component, installed, action); + UINT r = MsiGetComponentStateW(hinst, component, installed, action); return HRESULT_FROM_WIN32(r); }
-static HRESULT WINAPI mrp_SetComponentState( IWineMsiRemotePackage *iface, BSTR component, INSTALLSTATE state ) +HRESULT __cdecl remote_SetComponentState(MSIHANDLE hinst, BSTR component, INSTALLSTATE state) { - msi_remote_package_impl* This = impl_from_IWineMsiRemotePackage( iface ); - UINT r = MsiSetComponentStateW(This->package, component, state); + UINT r = MsiSetComponentStateW(hinst, component, state); return HRESULT_FROM_WIN32(r); }
-static HRESULT WINAPI mrp_GetLanguage( IWineMsiRemotePackage *iface, LANGID *language ) +HRESULT __cdecl remote_GetLanguage(MSIHANDLE hinst, LANGID *language) { - msi_remote_package_impl* This = impl_from_IWineMsiRemotePackage( iface ); - *language = MsiGetLanguage(This->package); + *language = MsiGetLanguage(hinst); return S_OK; }
-static HRESULT WINAPI mrp_SetInstallLevel( IWineMsiRemotePackage *iface, int level ) +HRESULT __cdecl remote_SetInstallLevel(MSIHANDLE hinst, int level) { - msi_remote_package_impl* This = impl_from_IWineMsiRemotePackage( iface ); - UINT r = MsiSetInstallLevel(This->package, level); + UINT r = MsiSetInstallLevel(hinst, level); return HRESULT_FROM_WIN32(r); }
-static HRESULT WINAPI mrp_FormatRecord( IWineMsiRemotePackage *iface, MSIHANDLE record, +HRESULT __cdecl remote_FormatRecord(MSIHANDLE hinst, MSIHANDLE record, BSTR *value) { DWORD size = 0; - msi_remote_package_impl* This = impl_from_IWineMsiRemotePackage( iface ); - UINT r = MsiFormatRecordW(This->package, record, NULL, &size); + UINT r = MsiFormatRecordW(hinst, record, NULL, &size); if (r == ERROR_SUCCESS) { *value = SysAllocStringLen(NULL, size); if (!*value) return E_OUTOFMEMORY; size++; - r = MsiFormatRecordW(This->package, record, *value, &size); + r = MsiFormatRecordW(hinst, record, *value, &size); } return HRESULT_FROM_WIN32(r); }
-static HRESULT WINAPI mrp_EvaluateCondition( IWineMsiRemotePackage *iface, BSTR condition ) +HRESULT __cdecl remote_EvaluateCondition(MSIHANDLE hinst, BSTR condition) { - msi_remote_package_impl* This = impl_from_IWineMsiRemotePackage( iface ); - UINT r = MsiEvaluateConditionW(This->package, condition); + UINT r = MsiEvaluateConditionW(hinst, condition); return HRESULT_FROM_WIN32(r); }
-static HRESULT WINAPI mrp_GetFeatureCost( IWineMsiRemotePackage *iface, BSTR feature, - INT cost_tree, INSTALLSTATE state, INT *cost ) +HRESULT __cdecl remote_GetFeatureCost(MSIHANDLE hinst, BSTR feature, + INT cost_tree, INSTALLSTATE state, INT *cost) { - msi_remote_package_impl* This = impl_from_IWineMsiRemotePackage( iface ); - UINT r = MsiGetFeatureCostW(This->package, feature, cost_tree, state, cost); + UINT r = MsiGetFeatureCostW(hinst, feature, cost_tree, state, cost); return HRESULT_FROM_WIN32(r); }
-static HRESULT WINAPI mrp_EnumComponentCosts( IWineMsiRemotePackage *iface, BSTR component, +HRESULT __cdecl remote_EnumComponentCosts(MSIHANDLE hinst, BSTR component, DWORD index, INSTALLSTATE state, BSTR drive, - DWORD *buflen, INT *cost, INT *temp ) + DWORD *buflen, INT *cost, INT *temp) { - msi_remote_package_impl* This = impl_from_IWineMsiRemotePackage( iface ); - UINT r = MsiEnumComponentCostsW(This->package, component, index, state, drive, buflen, cost, temp); + UINT r = MsiEnumComponentCostsW(hinst, component, index, state, drive, buflen, cost, temp); return HRESULT_FROM_WIN32(r); }
-static const IWineMsiRemotePackageVtbl msi_remote_package_vtbl = -{ - mrp_QueryInterface, - mrp_AddRef, - mrp_Release, - mrp_GetActiveDatabase, - mrp_GetProperty, - mrp_SetProperty, - mrp_ProcessMessage, - mrp_DoAction, - mrp_Sequence, - mrp_GetTargetPath, - mrp_SetTargetPath, - mrp_GetSourcePath, - mrp_GetMode, - mrp_SetMode, - mrp_GetFeatureState, - mrp_SetFeatureState, - mrp_GetComponentState, - mrp_SetComponentState, - mrp_GetLanguage, - mrp_SetInstallLevel, - mrp_FormatRecord, - mrp_EvaluateCondition, - mrp_GetFeatureCost, - mrp_EnumComponentCosts -}; - -HRESULT create_msi_remote_package( MSIHANDLE handle, IWineMsiRemotePackage **ppObj ) -{ - msi_remote_package_impl* This; - - This = msi_alloc( sizeof *This ); - if (!This) - return E_OUTOFMEMORY; - - This->IWineMsiRemotePackage_iface.lpVtbl = &msi_remote_package_vtbl; - This->package = handle; - This->refs = 1; - - *ppObj = &This->IWineMsiRemotePackage_iface; - - return S_OK; -} - UINT msi_package_add_info(MSIPACKAGE *package, DWORD context, DWORD options, LPCWSTR property, LPWSTR value) { diff --git a/dlls/msi/suminfo.c b/dlls/msi/suminfo.c index 451fd16b..782ad6e 100644 --- a/dlls/msi/suminfo.c +++ b/dlls/msi/suminfo.c @@ -33,10 +33,11 @@ #include "msi.h" #include "msiquery.h" #include "msidefs.h" -#include "msipriv.h" #include "objidl.h" #include "propvarutil.h" -#include "msiserver.h" + +#include "msipriv.h" +#include "winemsi.h"
WINE_DEFAULT_DEBUG_CHANNEL(msi);
@@ -522,16 +523,13 @@ UINT WINAPI MsiGetSummaryInformationW( MSIHANDLE hDatabase, db = msihandle2msiinfo( hDatabase, MSIHANDLETYPE_DATABASE ); if( !db ) { + MSIHANDLE remote; HRESULT hr; - IWineMsiRemoteDatabase *remote_database;
- remote_database = (IWineMsiRemoteDatabase *)msi_get_remote( hDatabase ); - if ( !remote_database ) + if (!(remote = msi_get_remote(hDatabase))) return ERROR_INVALID_HANDLE;
- hr = IWineMsiRemoteDatabase_GetSummaryInformation( remote_database, - uiUpdateCount, pHandle ); - IWineMsiRemoteDatabase_Release( remote_database ); + hr = remote_DatabaseGetSummaryInformation(remote, uiUpdateCount, pHandle);
if (FAILED(hr)) { diff --git a/dlls/msi/winemsi.idl b/dlls/msi/winemsi.idl new file mode 100644 index 0000000..706eb99 --- /dev/null +++ b/dlls/msi/winemsi.idl @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2007 James Hawkins + * Copyright (C) 2018 Zebediah Figura + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +import "objidl.idl"; + +cpp_quote("#if 0") +typedef unsigned long MSIHANDLE; +typedef int INSTALLMESSAGE; +typedef int MSICONDITION; +typedef int MSIRUNMODE; +typedef int INSTALLSTATE; + +cpp_quote("#endif") +cpp_quote("#include "msiquery.h"") + +[ + uuid(56D58B64-8780-4c22-A8BC-8B0B29E4A9F8) +] +interface IWineMsiRemote +{ + HRESULT remote_DatabaseIsTablePersistent( [in] MSIHANDLE db, [in] LPCWSTR table, [out] MSICONDITION *persistent ); + HRESULT remote_DatabaseGetPrimaryKeys( [in] MSIHANDLE db, [in] LPCWSTR table, [out] MSIHANDLE *keys ); + HRESULT remote_DatabaseGetSummaryInformation( [in] MSIHANDLE db, [in] UINT updatecount, [out] MSIHANDLE *suminfo ); + HRESULT remote_DatabaseOpenView( [in] MSIHANDLE db, [in] LPCWSTR query, [out] MSIHANDLE *view ); + + HRESULT remote_GetActiveDatabase( [in] MSIHANDLE hinst, [out] MSIHANDLE *handle ); + HRESULT remote_GetProperty( [in] MSIHANDLE hinst, [in] BSTR property, [out, size_is(*size)] BSTR value, [in, out] DWORD *size ); + HRESULT remote_SetProperty( [in] MSIHANDLE hinst, [in] BSTR property, [in] BSTR value ); + HRESULT remote_ProcessMessage( [in] MSIHANDLE hinst, [in] INSTALLMESSAGE message, [in] MSIHANDLE record ); + HRESULT remote_DoAction( [in] MSIHANDLE hinst, [in] BSTR action ); + HRESULT remote_Sequence( [in] MSIHANDLE hinst, [in] BSTR table, [in] int sequence ); + HRESULT remote_GetTargetPath( [in] MSIHANDLE hinst, [in] BSTR folder, [out, size_is(*size)] BSTR value, [in, out] DWORD *size ); + HRESULT remote_SetTargetPath( [in] MSIHANDLE hinst, [in] BSTR folder, [in] BSTR 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 ); + HRESULT remote_GetFeatureState( [in] MSIHANDLE hinst, [in] BSTR feature, [out] INSTALLSTATE *installed, [out] INSTALLSTATE *action ); + HRESULT remote_SetFeatureState( [in] MSIHANDLE hinst, [in] BSTR feature, [in] INSTALLSTATE state ); + HRESULT remote_GetComponentState( [in] MSIHANDLE hinst, [in] BSTR 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 ); + HRESULT remote_FormatRecord( [in] MSIHANDLE hinst, [in] MSIHANDLE record, [out] BSTR *value ); + HRESULT remote_EvaluateCondition( [in] MSIHANDLE hinst, [in] BSTR condition ); + HRESULT remote_GetFeatureCost( [in] MSIHANDLE hinst, [in] BSTR feature, [in] INT cost_tree, [in] INSTALLSTATE state, [out] INT *cost ); + HRESULT remote_EnumComponentCosts( [in] MSIHANDLE hinst, [in] BSTR component, [in] DWORD index, [in] INSTALLSTATE state, + [out, size_is(*buflen)] BSTR drive, [in, out] DWORD *buflen, [out] INT *cost, [out] INT *temp ); + + HRESULT remote_GetActionInfo( [in] LPCGUID guid, [out] INT *type, [out] BSTR *dllname, + [out] BSTR *function, [out] MSIHANDLE *package ); + UINT remote_CloseHandle( [in] MSIHANDLE handle ); +}
Zebediah Figura z.figura12@gmail.com wrote:
+[
- uuid(56D58B64-8780-4c22-A8BC-8B0B29E4A9F8)
+] +interface IWineMsiRemote +{
- HRESULT remote_DatabaseIsTablePersistent( [in] MSIHANDLE db, [in] LPCWSTR table, [out] MSICONDITION *persistent );
- HRESULT remote_DatabaseGetPrimaryKeys( [in] MSIHANDLE db, [in] LPCWSTR table, [out] MSIHANDLE *keys );
- HRESULT remote_DatabaseGetSummaryInformation( [in] MSIHANDLE db, [in] UINT updatecount, [out] MSIHANDLE *suminfo );
- HRESULT remote_DatabaseOpenView( [in] MSIHANDLE db, [in] LPCWSTR query, [out] MSIHANDLE *view );
- HRESULT remote_GetActiveDatabase( [in] MSIHANDLE hinst, [out] MSIHANDLE *handle );
- HRESULT remote_GetProperty( [in] MSIHANDLE hinst, [in] BSTR property, [out, size_is(*size)] BSTR value, [in, out] DWORD *size );
- HRESULT remote_SetProperty( [in] MSIHANDLE hinst, [in] BSTR property, [in] BSTR value );
- HRESULT remote_ProcessMessage( [in] MSIHANDLE hinst, [in] INSTALLMESSAGE message, [in] MSIHANDLE record );
- HRESULT remote_DoAction( [in] MSIHANDLE hinst, [in] BSTR action );
- HRESULT remote_Sequence( [in] MSIHANDLE hinst, [in] BSTR table, [in] int sequence );
- HRESULT remote_GetTargetPath( [in] MSIHANDLE hinst, [in] BSTR folder, [out, size_is(*size)] BSTR value, [in, out] DWORD *size );
- HRESULT remote_SetTargetPath( [in] MSIHANDLE hinst, [in] BSTR folder, [in] BSTR 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 );
- HRESULT remote_GetFeatureState( [in] MSIHANDLE hinst, [in] BSTR feature, [out] INSTALLSTATE *installed, [out] INSTALLSTATE *action );
- HRESULT remote_SetFeatureState( [in] MSIHANDLE hinst, [in] BSTR feature, [in] INSTALLSTATE state );
- HRESULT remote_GetComponentState( [in] MSIHANDLE hinst, [in] BSTR 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 );
- HRESULT remote_FormatRecord( [in] MSIHANDLE hinst, [in] MSIHANDLE record, [out] BSTR *value );
- HRESULT remote_EvaluateCondition( [in] MSIHANDLE hinst, [in] BSTR condition );
- HRESULT remote_GetFeatureCost( [in] MSIHANDLE hinst, [in] BSTR feature, [in] INT cost_tree, [in] INSTALLSTATE state, [out] INT *cost );
- HRESULT remote_EnumComponentCosts( [in] MSIHANDLE hinst, [in] BSTR component, [in] DWORD index, [in] INSTALLSTATE state,
[out, size_is(*buflen)] BSTR drive, [in, out] DWORD *buflen, [out] INT *cost, [out] INT *temp );
- HRESULT remote_GetActionInfo( [in] LPCGUID guid, [out] INT *type, [out] BSTR *dllname,
[out] BSTR *function, [out] MSIHANDLE *package );
- UINT remote_CloseHandle( [in] MSIHANDLE handle );
+}
Did you consider using [in,string] const WCHAR *param and [out,string] WCHAR **ret instead of passing BSTRs with [out,size_is(*size)] around? That way you'd avoid casting away 'const' and manually managing sizing.
On 15/04/18 21:41, Dmitry Timoshkov wrote:
Zebediah Figura z.figura12@gmail.com wrote:
+[
- uuid(56D58B64-8780-4c22-A8BC-8B0B29E4A9F8)
+] +interface IWineMsiRemote +{
- HRESULT remote_DatabaseIsTablePersistent( [in] MSIHANDLE db, [in] LPCWSTR table, [out] MSICONDITION *persistent );
- HRESULT remote_DatabaseGetPrimaryKeys( [in] MSIHANDLE db, [in] LPCWSTR table, [out] MSIHANDLE *keys );
- HRESULT remote_DatabaseGetSummaryInformation( [in] MSIHANDLE db, [in] UINT updatecount, [out] MSIHANDLE *suminfo );
- HRESULT remote_DatabaseOpenView( [in] MSIHANDLE db, [in] LPCWSTR query, [out] MSIHANDLE *view );
- HRESULT remote_GetActiveDatabase( [in] MSIHANDLE hinst, [out] MSIHANDLE *handle );
- HRESULT remote_GetProperty( [in] MSIHANDLE hinst, [in] BSTR property, [out, size_is(*size)] BSTR value, [in, out] DWORD *size );
- HRESULT remote_SetProperty( [in] MSIHANDLE hinst, [in] BSTR property, [in] BSTR value );
- HRESULT remote_ProcessMessage( [in] MSIHANDLE hinst, [in] INSTALLMESSAGE message, [in] MSIHANDLE record );
- HRESULT remote_DoAction( [in] MSIHANDLE hinst, [in] BSTR action );
- HRESULT remote_Sequence( [in] MSIHANDLE hinst, [in] BSTR table, [in] int sequence );
- HRESULT remote_GetTargetPath( [in] MSIHANDLE hinst, [in] BSTR folder, [out, size_is(*size)] BSTR value, [in, out] DWORD *size );
- HRESULT remote_SetTargetPath( [in] MSIHANDLE hinst, [in] BSTR folder, [in] BSTR 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 );
- HRESULT remote_GetFeatureState( [in] MSIHANDLE hinst, [in] BSTR feature, [out] INSTALLSTATE *installed, [out] INSTALLSTATE *action );
- HRESULT remote_SetFeatureState( [in] MSIHANDLE hinst, [in] BSTR feature, [in] INSTALLSTATE state );
- HRESULT remote_GetComponentState( [in] MSIHANDLE hinst, [in] BSTR 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 );
- HRESULT remote_FormatRecord( [in] MSIHANDLE hinst, [in] MSIHANDLE record, [out] BSTR *value );
- HRESULT remote_EvaluateCondition( [in] MSIHANDLE hinst, [in] BSTR condition );
- HRESULT remote_GetFeatureCost( [in] MSIHANDLE hinst, [in] BSTR feature, [in] INT cost_tree, [in] INSTALLSTATE state, [out] INT *cost );
- HRESULT remote_EnumComponentCosts( [in] MSIHANDLE hinst, [in] BSTR component, [in] DWORD index, [in] INSTALLSTATE state,
[out, size_is(*buflen)] BSTR drive, [in, out] DWORD *buflen, [out] INT *cost, [out] INT *temp );
- HRESULT remote_GetActionInfo( [in] LPCGUID guid, [out] INT *type, [out] BSTR *dllname,
[out] BSTR *function, [out] MSIHANDLE *package );
- UINT remote_CloseHandle( [in] MSIHANDLE handle );
+}
Did you consider using [in,string] const WCHAR *param and [out,string] WCHAR **ret instead of passing BSTRs with [out,size_is(*size)] around? That way you'd avoid casting away 'const' and manually managing sizing.
Yes, that's in future patches. I wanted to keep each patch to as manageable a size as possible.
Zebediah Figura z.figura12@gmail.com wrote:
Did you consider using [in,string] const WCHAR *param and [out,string] WCHAR **ret instead of passing BSTRs with [out,size_is(*size)] around? That way you'd avoid casting away 'const' and manually managing sizing.
Yes, that's in future patches. I wanted to keep each patch to as manageable a size as possible.
I see, thanks. Personally I'd prefer explicit 'const WCHAR *' and 'WCHAR *' instead of LPCWSTR and LPWSTR like you do in the patch series though.
Signed-off-by: Hans Leidekker hans@codeweavers.com