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

  1. //
  2. // Copyright (c) 1999-2001 Microsoft Corporation, All Rights Reserved
  3. //
  4. #include "msi.h"
  5. #include "msimeth.h"
  6. #include "msimethod.h"
  7. #define BUFF_SIZE 512
  8. class CMethods : public IMsiProductMethods, public IMsiSoftwareFeatureMethods
  9. // , public IConnectionPointContainer, public IConnectionPoint
  10. {
  11. protected:
  12. ULONG m_cRef; //Object reference count
  13. public:
  14. CMethods();
  15. ~CMethods();
  16. //Non-delegating object IUnknown
  17. STDMETHODIMP QueryInterface(REFIID, void**);
  18. STDMETHODIMP_(ULONG) AddRef(void);
  19. STDMETHODIMP_(ULONG) Release(void);
  20. /*
  21. HRESULT STDMETHODCALLTYPE EnumConnectionPoints(
  22. IEnumConnectionPoints __RPC_FAR *__RPC_FAR *ppEnum);
  23. HRESULT STDMETHODCALLTYPE FindConnectionPoint(
  24. REFIID riid,
  25. IConnectionPoint __RPC_FAR *__RPC_FAR *ppCP);
  26. HRESULT STDMETHODCALLTYPE GetConnectionInterface(
  27. IID __RPC_FAR *pIID);
  28. HRESULT STDMETHODCALLTYPE GetConnectionPointContainer(
  29. IConnectionPointContainer __RPC_FAR *__RPC_FAR *ppCPC);
  30. HRESULT STDMETHODCALLTYPE Advise(
  31. IUnknown __RPC_FAR *pUnkSink,
  32. DWORD __RPC_FAR *pdwCookie);
  33. HRESULT STDMETHODCALLTYPE Unadvise(
  34. DWORD dwCookie);
  35. HRESULT STDMETHODCALLTYPE EnumConnections(
  36. IEnumConnections __RPC_FAR *__RPC_FAR *ppEnum);
  37. */
  38. ///////////////////////
  39. //Product Methods
  40. HRESULT STDMETHODCALLTYPE Admin(
  41. /* [string][in] */ LPCWSTR wszPackageLocation,
  42. /* [string][in] */ LPCWSTR wszOptions,
  43. /* [out] */ UINT __RPC_FAR *puiResult,
  44. /* [in] */ int iThreadID);
  45. HRESULT STDMETHODCALLTYPE Advertise(
  46. /* [string][in] */ LPCWSTR wszPackageLocation,
  47. /* [string][in] */ LPCWSTR wszOptions,
  48. /* [out] */ UINT __RPC_FAR *puiResult,
  49. /* [in] */ int iThreadID);
  50. HRESULT STDMETHODCALLTYPE Configure(
  51. /* [string][in] */ LPCWSTR wszProductCode,
  52. /* [in] */ int iInstallLevel,
  53. /* [in] */ int isInstallState,
  54. /* [out] */ UINT __RPC_FAR *puiResult,
  55. /* [in] */ int iThreadID);
  56. HRESULT STDMETHODCALLTYPE Install(
  57. /* [string][in] */ LPCWSTR wszPackageLocation,
  58. /* [string][in] */ LPCWSTR wszOptions,
  59. /* [out] */ UINT __RPC_FAR *puiResult,
  60. /* [in] */ int iThreadID);
  61. HRESULT STDMETHODCALLTYPE Reinstall(
  62. /* [string][in] */ LPCWSTR wszProductCode,
  63. /* [in] */ DWORD dwReinstallMode,
  64. /* [out] */ UINT __RPC_FAR *puiResult,
  65. /* [in] */ int iThreadID);
  66. HRESULT STDMETHODCALLTYPE Uninstall(
  67. /* [string][in] */ LPCWSTR wszProductCode,
  68. /* [out] */ UINT __RPC_FAR *puiResult,
  69. /* [in] */ int iThreadID);
  70. HRESULT STDMETHODCALLTYPE Upgrade(
  71. /* [string][in] */ LPCWSTR wszPackageLocation,
  72. /* [string][in] */ LPCWSTR wszOptions,
  73. /* [out] */ UINT __RPC_FAR *puiResult,
  74. /* [in] */ int iThreadID);
  75. ///////////////////////
  76. //SoftwareFeature Methods
  77. HRESULT STDMETHODCALLTYPE ConfigureSF(
  78. /* [string][in] */ LPCWSTR wszProductCode,
  79. /* [string][in] */ LPCWSTR wszFeature,
  80. /* [in] */ int isInstallState,
  81. /* [out] */ UINT __RPC_FAR *puiResult,
  82. /* [in] */ int iThreadID);
  83. HRESULT STDMETHODCALLTYPE ReinstallSF(
  84. /* [string][in] */ LPCWSTR wszProductCode,
  85. /* [string][in] */ LPCWSTR wszFeature,
  86. /* [in] */ DWORD dwReinstallMode,
  87. /* [out] */ UINT __RPC_FAR *puiResult,
  88. /* [in] */ int iThreadID);
  89. //UI Handler
  90. static int WINAPI EventHandler(LPVOID pvContext, UINT iMessageType, LPCWSTR szMessage);
  91. private:
  92. // Private utility methods of CMethods.
  93. HRESULT GetSlot(UINT* puiFreeSlot);
  94. HRESULT FindSlot(DWORD dwCookie, UINT* puiSlot);
  95. IID m_iidSink;
  96. DWORD m_dwNextCookie;
  97. static UINT m_cConnections;
  98. static UINT m_uiMaxIndex;
  99. static CONNECTDATA* m_paConnections;
  100. bool CheckForMsiDll();
  101. HRESULT InitStatic(int *piThreadID);
  102. DWORD GetAccount(HANDLE TokenHandle, WCHAR *wcDomain, WCHAR *wcUser);
  103. DWORD GetSid(HANDLE TokenHandle, WCHAR *wcSID);
  104. DWORD LoadHive(LPWSTR pszUserName, LPWSTR pszKeyName);
  105. DWORD UnloadHive(LPCWSTR pszKeyName);
  106. DWORD AcquirePrivilege();
  107. void RestorePrivilege();
  108. HRESULT PrepareEnvironment();
  109. HRESULT ReleaseEnvironment();
  110. static IMsiMethodStatusSink *m_pStatusSink;
  111. DWORD m_dwCheckKeyPresentStatus;
  112. WCHAR m_wcKeyName[1024];
  113. TOKEN_PRIVILEGES* m_pOriginalPriv;
  114. HKEY m_hKey;
  115. DWORD m_dwSize;
  116. //Critical section for event handling
  117. static CRITICAL_SECTION m_cs;
  118. static bool m_bCSReady;
  119. };
  120. // These variables keep track of when the module can be unloaded
  121. extern long g_cObj;
  122. extern long g_cLock;
  123. //These are the valiables used to track MSI.dll and it's exported functions
  124. typedef INSTALLUILEVEL (CALLBACK* LPFNMSISETINTERNALUI)(INSTALLUILEVEL, HWND);
  125. typedef INSTALLUI_HANDLER (CALLBACK* LPFNMSISETEXTERNALUIW)(INSTALLUI_HANDLER, DWORD, LPVOID);
  126. typedef UINT (CALLBACK* LPFNMSIENABLELOGW)(DWORD, LPCWSTR, DWORD);
  127. typedef UINT (CALLBACK* LPFNMSIINSTALLPRODUCTW)(LPCWSTR, LPCWSTR);
  128. typedef UINT (CALLBACK* LPFNMSICONFIGUREPRODUCTW)(LPCWSTR, int, INSTALLSTATE);
  129. typedef UINT (CALLBACK* LPFNMSIREINSTALLPRODUCTW)(LPCWSTR, DWORD);
  130. typedef UINT (CALLBACK* LPFNMSIAPPLYPATCHW)(LPCWSTR, LPCWSTR, INSTALLTYPE, LPCWSTR);
  131. typedef UINT (CALLBACK* LPFNMSICONFIGUREFEATUREW)(LPCWSTR, LPCWSTR, INSTALLSTATE);
  132. typedef UINT (CALLBACK* LPFNMSIREINSTALLFEATUREW)(LPCWSTR, LPCWSTR, DWORD);
  133. extern bool g_bMsiPresent;
  134. extern bool g_bMsiLoaded;
  135. extern LPFNMSISETINTERNALUI g_fpMsiSetInternalUI;
  136. extern LPFNMSISETEXTERNALUIW g_fpMsiSetExternalUIW;
  137. extern LPFNMSIENABLELOGW g_fpMsiEnableLogW;
  138. extern LPFNMSIINSTALLPRODUCTW g_fpMsiInstallProductW;
  139. extern LPFNMSICONFIGUREPRODUCTW g_fpMsiConfigureProductW;
  140. extern LPFNMSIREINSTALLPRODUCTW g_fpMsiReinstallProductW;
  141. extern LPFNMSIAPPLYPATCHW g_fpMsiApplyPatchW;
  142. extern LPFNMSICONFIGUREFEATUREW g_fpMsiConfigureFeatureW;
  143. extern LPFNMSIREINSTALLFEATUREW g_fpMsiReinstallFeatureW;