178 lines
6.2 KiB
C++
178 lines
6.2 KiB
C++
//
|
|
|
|
// 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;
|