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.
181 lines
6.0 KiB
181 lines
6.0 KiB
// NTRAID#NTBUG9 - 589788 - 2002/03/26 - xiaoyuw
|
|
// (1)Do we still need this? or Darwin has fix their side before 2600 client?
|
|
// (2)If we still need this, changing the status of Component could be part of CA
|
|
// (3)About getting installer state. the current implementation is very weak:
|
|
// it assume there is only two states: install and uninstall. which is not true....
|
|
|
|
#include "..\inc\stdinc.h"
|
|
#include "..\inc\macros.h"
|
|
#include "..\inc\common.h"
|
|
|
|
#include "msi.h"
|
|
#include "msiquery.h"
|
|
#include "sxsapi.h"
|
|
|
|
#define CA_SXSPOLICY_INSTALLATION_IDENTIFIER L"Fusion Win32 Policy Installation on XP Client"
|
|
|
|
#define MAX_BUF 1024
|
|
#define CA_SXSPOLICY_WIN32_POLICY_INSTALL_PROMPT L"Win32 Policy Installation for XP Client"
|
|
|
|
HMODULE g_hdSxs = NULL;
|
|
PSXS_INSTALL_W g_procSxsInstallW = NULL;
|
|
PSXS_UNINSTALL_ASSEMBLYW g_procSxsUninstallW = NULL;
|
|
PSXS_QUERY_MANIFEST_INFORMATION g_procSxsQueryManifestInformation = NULL;
|
|
|
|
|
|
HRESULT UninstallSxsPolicy(PCWSTR szManifestFile)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
SXS_UNINSTALLW UninstallParameters = {sizeof(UninstallParameters)};
|
|
SXS_INSTALL_REFERENCEW Reference = {sizeof(Reference)};
|
|
|
|
BYTE ManifestInformationBuffer[1UL << 16];
|
|
PSXS_MANIFEST_INFORMATION_BASIC ManifestBasicInfo = reinterpret_cast<PSXS_MANIFEST_INFORMATION_BASIC>(&ManifestInformationBuffer);
|
|
DWORD Disposition = 0;
|
|
BOOL Success = FALSE;
|
|
|
|
if (g_procSxsUninstallW == NULL)
|
|
{
|
|
if (g_hdSxs == NULL)
|
|
{
|
|
g_hdSxs = LoadLibraryA("sxs.dll");
|
|
if (g_hdSxs == NULL)
|
|
SET_HRERR_AND_EXIT(::GetLastError());
|
|
}
|
|
g_procSxsUninstallW = (PSXS_UNINSTALL_ASSEMBLYW)GetProcAddress(g_hdSxs, "SxsUninstallW");
|
|
if (g_procSxsUninstallW == NULL)
|
|
SET_HRERR_AND_EXIT(::GetLastError());
|
|
}
|
|
|
|
if (g_procSxsQueryManifestInformation == NULL)
|
|
{
|
|
g_procSxsQueryManifestInformation = (PSXS_QUERY_MANIFEST_INFORMATION)GetProcAddress(g_hdSxs, "SxsQueryManifestInformation");
|
|
if (g_procSxsQueryManifestInformation == NULL)
|
|
SET_HRERR_AND_EXIT(::GetLastError());
|
|
}
|
|
|
|
IFFALSE_EXIT(g_procSxsQueryManifestInformation(0, szManifestFile,
|
|
SXS_QUERY_MANIFEST_INFORMATION_INFOCLASS_BASIC, 0, sizeof(ManifestInformationBuffer),
|
|
ManifestBasicInfo, NULL));
|
|
|
|
UninstallParameters.dwFlags |= SXS_UNINSTALL_FLAG_REFERENCE_VALID;
|
|
UninstallParameters.lpInstallReference = &Reference;
|
|
UninstallParameters.lpAssemblyIdentity = ManifestBasicInfo->lpIdentity;
|
|
|
|
Reference.lpIdentifier = CA_SXSPOLICY_INSTALLATION_IDENTIFIER;
|
|
Reference.guidScheme = SXS_INSTALL_REFERENCE_SCHEME_OPAQUESTRING;
|
|
|
|
IFFALSE_EXIT(g_procSxsUninstallW(&UninstallParameters, &Disposition));
|
|
|
|
Exit:
|
|
return hr;
|
|
}
|
|
|
|
HRESULT InstallSxsPolicy(PCWSTR szManifestFile)
|
|
{
|
|
SXS_INSTALLW InstallParameters = {sizeof(InstallParameters)};
|
|
SXS_INSTALL_REFERENCEW InstallReference = {sizeof(InstallReference)};
|
|
HRESULT hr = S_OK;
|
|
|
|
if (g_procSxsInstallW == NULL)
|
|
{
|
|
if (g_hdSxs == NULL)
|
|
{
|
|
g_hdSxs = LoadLibraryA("sxs.dll");
|
|
if (g_hdSxs == NULL)
|
|
{
|
|
SET_HRERR_AND_EXIT(::GetLastError());
|
|
}
|
|
}
|
|
g_procSxsInstallW = (PSXS_INSTALL_W)GetProcAddress(g_hdSxs, "SxsInstallW");
|
|
if (g_procSxsInstallW == NULL)
|
|
{
|
|
SET_HRERR_AND_EXIT(::GetLastError());
|
|
}
|
|
}
|
|
|
|
|
|
InstallParameters.dwFlags =
|
|
SXS_INSTALL_FLAG_REPLACE_EXISTING |
|
|
SXS_INSTALL_FLAG_CODEBASE_URL_VALID |
|
|
SXS_INSTALL_FLAG_REFERENCE_VALID |
|
|
SXS_INSTALL_FLAG_REFRESH_PROMPT_VALID;
|
|
InstallParameters.lpCodebaseURL = szManifestFile;
|
|
InstallParameters.lpManifestPath = szManifestFile;
|
|
InstallParameters.lpReference = &InstallReference;
|
|
InstallParameters.lpRefreshPrompt = CA_SXSPOLICY_WIN32_POLICY_INSTALL_PROMPT ;
|
|
|
|
InstallReference.guidScheme = SXS_INSTALL_REFERENCE_SCHEME_OPAQUESTRING;
|
|
InstallReference.lpIdentifier = CA_SXSPOLICY_INSTALLATION_IDENTIFIER;
|
|
|
|
IFFALSE_EXIT((*g_procSxsInstallW)(&InstallParameters));
|
|
Exit:
|
|
return hr;
|
|
}
|
|
|
|
HRESULT __stdcall CA_Policy_EnumFusionWin32AssemblyCallback(CA_ENM_ASSEMBLY_CALLBACK_INFO * info)
|
|
{
|
|
enum CA_MIGRATION_MSI_INSTALL_MODE eInstallMode;
|
|
CStringBuffer sbManfiestFilename;
|
|
HRESULT hr = S_OK;
|
|
|
|
PARAMETER_CHECK_NTC((info->dwFlags == 0) ||(info->dwFlags == CA_ENM_ASSEMBLY_CALLBACK_INFO_FLAG_IGNORE_MIGRATE_DENY_CHECK));
|
|
PARAMETER_CHECK_NTC(info->hInstall != NULL);
|
|
PARAMETER_CHECK_NTC(info->pszComponentID != NULL);
|
|
PARAMETER_CHECK_NTC(info->pszManifestFileID != NULL);
|
|
|
|
IFFAILED_EXIT(MSI_GetSourceFileFullPathName(CA_FILEFULLPATHNAME_FILEID_IN_FILE_TABLE, info->hInstall, info->hdb, NULL, info->pszManifestFileID, sbManfiestFilename, info->pszComponentID));
|
|
|
|
IFFAILED_EXIT(MSI_GetInstallerState(info->hInstall, eInstallMode));
|
|
//
|
|
// install this API using sxs.dll
|
|
//
|
|
if (eInstallMode == eInstallProduct)
|
|
{
|
|
IFFAILED_EXIT(InstallSxsPolicy(sbManfiestFilename));
|
|
}
|
|
else
|
|
{
|
|
ASSERT_NTC(eInstallMode == eRemoveProduct);
|
|
IFFAILED_EXIT(UninstallSxsPolicy(sbManfiestFilename));
|
|
}
|
|
|
|
Exit:
|
|
return hr;
|
|
}
|
|
|
|
|
|
HRESULT __stdcall CustomAction_SxsPolicy(MSIHANDLE hInstall)
|
|
{
|
|
|
|
HRESULT hr = S_OK;
|
|
#if DBG
|
|
MessageBoxA(NULL, "Enjoy Debug for sxs policy installation using msi on xpclient", "ca_policy", MB_OK);
|
|
#endif
|
|
IFFAILED_EXIT(MSI_EnumWinFuseAssembly(ENUM_ASSEMBLY_FLAG_CHECK_POLICY_ONLY, hInstall, CA_Policy_EnumFusionWin32AssemblyCallback));
|
|
|
|
Exit:
|
|
|
|
return hr;
|
|
}
|
|
|
|
BOOL WINAPI DllMain(
|
|
HINSTANCE hinstDLL,
|
|
DWORD fdwReason,
|
|
LPVOID lpvReserved
|
|
)
|
|
{
|
|
if (fdwReason == DLL_PROCESS_DETACH)
|
|
{
|
|
if (g_hdSxs != NULL)
|
|
{
|
|
if (lpvReserved != NULL)
|
|
{
|
|
FreeLibrary(g_hdSxs);
|
|
}
|
|
g_hdSxs = NULL;
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|