Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

177 lines
6.0 KiB

//
// 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;