// // Copyright (c) 1999-2001 Microsoft Corporation, All Rights Reserved // #include "msi.h" #include "msimeth.h" #include "msimethod.h" #define BUFF_SIZE 512 class CMethods : public IMsiProductMethods, public IMsiSoftwareFeatureMethods // , public IConnectionPointContainer, public IConnectionPoint { protected: ULONG m_cRef; //Object reference count public: CMethods(); ~CMethods(); //Non-delegating object IUnknown STDMETHODIMP QueryInterface(REFIID, void**); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void); /* HRESULT STDMETHODCALLTYPE EnumConnectionPoints( IEnumConnectionPoints __RPC_FAR *__RPC_FAR *ppEnum); HRESULT STDMETHODCALLTYPE FindConnectionPoint( REFIID riid, IConnectionPoint __RPC_FAR *__RPC_FAR *ppCP); HRESULT STDMETHODCALLTYPE GetConnectionInterface( IID __RPC_FAR *pIID); HRESULT STDMETHODCALLTYPE GetConnectionPointContainer( IConnectionPointContainer __RPC_FAR *__RPC_FAR *ppCPC); HRESULT STDMETHODCALLTYPE Advise( IUnknown __RPC_FAR *pUnkSink, DWORD __RPC_FAR *pdwCookie); HRESULT STDMETHODCALLTYPE Unadvise( DWORD dwCookie); HRESULT STDMETHODCALLTYPE EnumConnections( IEnumConnections __RPC_FAR *__RPC_FAR *ppEnum); */ /////////////////////// //Product Methods HRESULT STDMETHODCALLTYPE Admin( /* [string][in] */ LPCWSTR wszPackageLocation, /* [string][in] */ LPCWSTR wszOptions, /* [out] */ UINT __RPC_FAR *puiResult, /* [in] */ int iThreadID); HRESULT STDMETHODCALLTYPE Advertise( /* [string][in] */ LPCWSTR wszPackageLocation, /* [string][in] */ LPCWSTR wszOptions, /* [out] */ UINT __RPC_FAR *puiResult, /* [in] */ int iThreadID); HRESULT STDMETHODCALLTYPE Configure( /* [string][in] */ LPCWSTR wszProductCode, /* [in] */ int iInstallLevel, /* [in] */ int isInstallState, /* [out] */ UINT __RPC_FAR *puiResult, /* [in] */ int iThreadID); HRESULT STDMETHODCALLTYPE Install( /* [string][in] */ LPCWSTR wszPackageLocation, /* [string][in] */ LPCWSTR wszOptions, /* [out] */ UINT __RPC_FAR *puiResult, /* [in] */ int iThreadID); HRESULT STDMETHODCALLTYPE Reinstall( /* [string][in] */ LPCWSTR wszProductCode, /* [in] */ DWORD dwReinstallMode, /* [out] */ UINT __RPC_FAR *puiResult, /* [in] */ int iThreadID); HRESULT STDMETHODCALLTYPE Uninstall( /* [string][in] */ LPCWSTR wszProductCode, /* [out] */ UINT __RPC_FAR *puiResult, /* [in] */ int iThreadID); HRESULT STDMETHODCALLTYPE Upgrade( /* [string][in] */ LPCWSTR wszPackageLocation, /* [string][in] */ LPCWSTR wszOptions, /* [out] */ UINT __RPC_FAR *puiResult, /* [in] */ int iThreadID); /////////////////////// //SoftwareFeature Methods HRESULT STDMETHODCALLTYPE ConfigureSF( /* [string][in] */ LPCWSTR wszProductCode, /* [string][in] */ LPCWSTR wszFeature, /* [in] */ int isInstallState, /* [out] */ UINT __RPC_FAR *puiResult, /* [in] */ int iThreadID); HRESULT STDMETHODCALLTYPE ReinstallSF( /* [string][in] */ LPCWSTR wszProductCode, /* [string][in] */ LPCWSTR wszFeature, /* [in] */ DWORD dwReinstallMode, /* [out] */ UINT __RPC_FAR *puiResult, /* [in] */ int iThreadID); //UI Handler static int WINAPI EventHandler(LPVOID pvContext, UINT iMessageType, LPCWSTR szMessage); private: // Private utility methods of CMethods. HRESULT GetSlot(UINT* puiFreeSlot); HRESULT FindSlot(DWORD dwCookie, UINT* puiSlot); IID m_iidSink; DWORD m_dwNextCookie; static UINT m_cConnections; static UINT m_uiMaxIndex; static CONNECTDATA* m_paConnections; bool CheckForMsiDll(); HRESULT InitStatic(int *piThreadID); DWORD GetAccount(HANDLE TokenHandle, WCHAR *wcDomain, WCHAR *wcUser); DWORD GetSid(HANDLE TokenHandle, WCHAR *wcSID); DWORD LoadHive(LPWSTR pszUserName, LPWSTR pszKeyName); DWORD UnloadHive(LPCWSTR pszKeyName); DWORD AcquirePrivilege(); void RestorePrivilege(); HRESULT PrepareEnvironment(); HRESULT ReleaseEnvironment(); static IMsiMethodStatusSink *m_pStatusSink; DWORD m_dwCheckKeyPresentStatus; WCHAR m_wcKeyName[1024]; TOKEN_PRIVILEGES* m_pOriginalPriv; HKEY m_hKey; DWORD m_dwSize; //Critical section for event handling static CRITICAL_SECTION m_cs; static bool m_bCSReady; }; // These variables keep track of when the module can be unloaded extern long g_cObj; extern long g_cLock; //These are the valiables used to track MSI.dll and it's exported functions typedef INSTALLUILEVEL (CALLBACK* LPFNMSISETINTERNALUI)(INSTALLUILEVEL, HWND); typedef INSTALLUI_HANDLER (CALLBACK* LPFNMSISETEXTERNALUIW)(INSTALLUI_HANDLER, DWORD, LPVOID); typedef UINT (CALLBACK* LPFNMSIENABLELOGW)(DWORD, LPCWSTR, DWORD); typedef UINT (CALLBACK* LPFNMSIINSTALLPRODUCTW)(LPCWSTR, LPCWSTR); typedef UINT (CALLBACK* LPFNMSICONFIGUREPRODUCTW)(LPCWSTR, int, INSTALLSTATE); typedef UINT (CALLBACK* LPFNMSIREINSTALLPRODUCTW)(LPCWSTR, DWORD); typedef UINT (CALLBACK* LPFNMSIAPPLYPATCHW)(LPCWSTR, LPCWSTR, INSTALLTYPE, LPCWSTR); typedef UINT (CALLBACK* LPFNMSICONFIGUREFEATUREW)(LPCWSTR, LPCWSTR, INSTALLSTATE); typedef UINT (CALLBACK* LPFNMSIREINSTALLFEATUREW)(LPCWSTR, LPCWSTR, DWORD); extern bool g_bMsiPresent; extern bool g_bMsiLoaded; extern LPFNMSISETINTERNALUI g_fpMsiSetInternalUI; extern LPFNMSISETEXTERNALUIW g_fpMsiSetExternalUIW; extern LPFNMSIENABLELOGW g_fpMsiEnableLogW; extern LPFNMSIINSTALLPRODUCTW g_fpMsiInstallProductW; extern LPFNMSICONFIGUREPRODUCTW g_fpMsiConfigureProductW; extern LPFNMSIREINSTALLPRODUCTW g_fpMsiReinstallProductW; extern LPFNMSIAPPLYPATCHW g_fpMsiApplyPatchW; extern LPFNMSICONFIGUREFEATUREW g_fpMsiConfigureFeatureW; extern LPFNMSIREINSTALLFEATUREW g_fpMsiReinstallFeatureW;