Leaked source code of windows server 2003
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

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