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.
419 lines
14 KiB
419 lines
14 KiB
#ifndef __MUISETUP_H_
|
|
#define __MUISETUP_H_
|
|
|
|
#include <nt.h>
|
|
#include <ntrtl.h>
|
|
#include <nturtl.h>
|
|
#include <windows.h>
|
|
#include <commctrl.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <tchar.h>
|
|
#include <winnls.h>
|
|
#include "installer.h"
|
|
#include "resource.h"
|
|
#include "sxsapi.h"
|
|
|
|
|
|
|
|
#define SUPPORT_PSEUDO_BUILD
|
|
//#define IGNORE_COPY_ERRORS
|
|
|
|
#define MUISETUP_HELP_FILENAME TEXT("muisetup.hlp")
|
|
#define MUISETUP_EXECUTION_FILENAME TEXT("muisetup.exe")
|
|
#define MUISETUP_ASSEMBLY_INSTALLATION_LOG_FILENAME TEXT("muisetup.log.") // langid would be ext
|
|
|
|
#define MUISETUP_ASSEMBLY_INSTALLATION_REFERENCE_IDENTIFIER TEXT("MUISETUP installation");
|
|
|
|
#define MUISETUP_PATH_SEPARATOR TEXT("\\")
|
|
|
|
#define MUISETUP_FORWARDCALL_TAG TEXT("/$_transfer_$")
|
|
#define MUI_FILLER_CHAR TEXT('?')
|
|
|
|
#ifdef MUI_DEDUG
|
|
#define DEBUGMSGBOX(a, b, c, d) MessageBox(a, b, c, d)
|
|
#else
|
|
#define DEBUGMSGBOX(a, b, c, d)
|
|
#endif
|
|
|
|
|
|
//
|
|
// Context Help IDs for Muisetup
|
|
//
|
|
#define IDH_COMM_GROUPBOX 28548
|
|
#define IDH_MUISETUP_UILANGUAGE_LIST 3000
|
|
#define IDH_MUISETUP_UILANGUAGECOMBO 3001
|
|
#define IDH_MUISETUP_COMMANDLINE 3002
|
|
#define IDH_MUISETUP_CHECKLOCALE 3003
|
|
#define IDH_MUISETUP_MATCHUIFONT 3004
|
|
#define MAX_UI_LANG_GROUPS 64
|
|
#define INSTALLED_FILES 1500
|
|
|
|
|
|
#define MAX_MUI_LANGUAGES 32
|
|
|
|
#define MESSAGEBOX(hWnd, lpText, lpCaption, uiType) (g_bSilent || g_bNoUI ? IDNO : MessageBox(hWnd, lpText, lpCaption, uiType))
|
|
|
|
#define ARRAYSIZE(a) (sizeof(a)/sizeof(a[0]))
|
|
|
|
#define BUFFER_SIZE 1024
|
|
|
|
#define MUI_MATCH_LOCALE 0x0001
|
|
#define MUI_MATCH_UIFONT 0x0002
|
|
|
|
#define REGSTR_MUI_SETTING TEXT("System\\CurrentControlSet\\Control\\NLS\\MUILanguages")
|
|
#define REGSTR_VALUE_MATCH_LOCALE TEXT("MatchSystemLocale")
|
|
#define REGSTR_VALUE_MATCH_UIFONT TEXT("UIFontSubstitute")
|
|
|
|
#define REG_MUI_MSI_COUNT 5
|
|
#define REGSTR_HKLM_MUI_MSI1 TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall") //HKLM - need to append PID after that
|
|
#define REGSTR_HKLM_MUI_MSI2 TEXT("Software\\Classes\\Installer\\Products") //HKLM - need to append reversed PID after that
|
|
#define REGSTR_HKLM_MUI_MSI3 TEXT("Software\\Classes\\Installer\\Features") //HKLM - need to append reversed PID after that
|
|
#define REGSTR_HKR_MUI_MSI4 TEXT("Installer\\Features") //HCR - need to append reversedP ID after that
|
|
#define REGSTR_HKR_MUI_MSI5 TEXT("Installer\\Products") //HCR - need to append reversed PID after that
|
|
|
|
#define IS_FE_LANGPACK(lcid) (((lcid) == 0x0804) || ((lcid) == 0x0404) || ((lcid)==0x0411) || ((lcid)==0x0412))
|
|
|
|
enum GUIDStringType
|
|
{
|
|
REVERSED_GUID = 0,
|
|
NORMAL_GUID = 1
|
|
};
|
|
|
|
typedef struct _MUIMSIREGINFO_structtag
|
|
{
|
|
HKEY hkRegRoot; // the root of the reg hive where subkey lives in (e.g. hklm)
|
|
TCHAR szRegString[BUFFER_SIZE]; // The regkey path to the parent note of the subkey
|
|
GUIDStringType RegType; // used to indicate whether the product guid needs to be reversed when deleting key
|
|
} MUIMSIREGINFO, *PMUIMSIREGINFO;
|
|
|
|
//
|
|
// MUI Language Info attached to listview item
|
|
//
|
|
typedef struct _MUILANGIINFO_structtag
|
|
{
|
|
LGRPID lgrpid; // MUI's Lang Group
|
|
|
|
LCID lcid; // MUI's Lang LCID
|
|
|
|
LPTSTR lpszLcid; // MUI's LCID name
|
|
|
|
TCHAR szDisplayName[BUFFER_SIZE]; // The display for this language.
|
|
|
|
int cd_number;
|
|
INT64 ulLPKSize; // Size of LPK for this LCID
|
|
INT64 ulUISize; // Size of MUI Resource files for this LCID
|
|
|
|
} MUILANGINFO, *PMUILANGINFO;
|
|
|
|
|
|
typedef struct _INSTALL_LANG_GROUP_Structtag
|
|
{
|
|
LGRPID lgrpid[MAX_MUI_LANGUAGES]; // MUI Lang Group to install
|
|
|
|
int iCount; // count of MUI lang group to install
|
|
BOOL bFontLinkRegistryTouched; // We have touched font link registry
|
|
int NotDeleted;
|
|
|
|
} INSTALL_LANG_GROUP, *PINSTALL_LANG_GROUP;
|
|
|
|
typedef struct UI_LangGroup_Structtag
|
|
{
|
|
int iCount;
|
|
|
|
LCID lcid[MAX_UI_LANG_GROUPS];
|
|
|
|
} UILANGUAGEGROUP, *PUILANGUAGEGROUP;
|
|
|
|
typedef struct _FILERENAME_TABLE_Structtag
|
|
{
|
|
TCHAR szSource[MAX_PATH+1];
|
|
TCHAR szDest [MAX_PATH+1];
|
|
} FILERENAME_TABLE,*PFILERENAME_TABLE;
|
|
|
|
typedef struct _TYPENOTFALLBACK_TABLE_Structtag
|
|
{
|
|
TCHAR szSource[MAX_PATH+1];
|
|
} TYPENOTFALLBACK_TABLE,*PTYPENOTFALLBACK_TABLE;
|
|
|
|
|
|
//
|
|
//...Macro for ListView checkboxes
|
|
//
|
|
#ifndef ListView_SetCheckState
|
|
#define ListView_SetCheckState(hwndLV, i, fCheck) \
|
|
ListView_SetItemState(hwndLV, i, \
|
|
INDEXTOSTATEIMAGEMASK((fCheck)+1), LVIS_STATEIMAGEMASK)
|
|
#endif
|
|
|
|
#define MSILOG_FILE TEXT("\\muimsi.log")
|
|
#define LOG_FILE TEXT("\\muisetup.log")
|
|
#define REG_MUI_PATH TEXT("System\\CurrentControlSet\\Control\\Nls\\MUILanguages")
|
|
#define REG_FILEVERSION_PATH TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\MUILanguages\\FileVersions")
|
|
#define MUI_LANG_GROUP_FILE TEXT("muilang.txt")
|
|
#define RUNDLLNAME TEXT("system32\\rundll32.exe")
|
|
#define WINHELP32PATH TEXT("winhlp32.exe")
|
|
extern UINT (WINAPI *pfnGetWindowsDir)(LPWSTR pBuf, UINT uSize);
|
|
|
|
BOOL DeleteSideBySideMUIAssemblyIfExisted(LPTSTR Languages, TCHAR buf[BUFFER_SIZE]);
|
|
|
|
BOOL CheckMultipleInstances(void);
|
|
void InitGlobals(void);
|
|
void Muisetup_Cleanup();
|
|
void SetSourcePath(LPTSTR lpszPath);
|
|
LPTSTR NextCommandTag(LPTSTR lpcmd);
|
|
BOOL InitializePFNs();
|
|
|
|
void Muisetup_RebootTheSystem(void);
|
|
BOOL CheckForReboot(HWND hwnd, PINSTALL_LANG_GROUP pInstallLangGroup);
|
|
BOOL CheckDefault(HWND hwndDlg);
|
|
BOOL CheckLangGroupCommandLine(PINSTALL_LANG_GROUP pInstallLangGroup, LPTSTR lpArg);
|
|
BOOL DeleteFiles(LPTSTR Languages,int *lpNotDeleted);
|
|
int EnumSelectedLanguages(HWND hList, LPTSTR lpAddLanguages);
|
|
int EnumUnselectedLanguages(HWND hList, LPTSTR lpRemoveLanguages);
|
|
BOOL HaveFiles(LPTSTR lpBuffer, BOOL bCheckDir = TRUE);
|
|
BOOL InitializeInstallDialog(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
|
BOOL InitializeListView(HWND hList);
|
|
BOOL UpdateFontLinkRegistry(LPTSTR Languages,BOOL *lpbFontLinkRegistryTouched);
|
|
BOOL IsInstalled(LPTSTR lpUILang);
|
|
DWORD GetInstalledMUILanguages(LPTSTR lpUninstall, int cch);
|
|
BOOL ListViewChanged(HWND hDlg, int iID, NM_LISTVIEW *pLV);
|
|
BOOL ListViewChanging(HWND hDlg, int iID, NM_LISTVIEW *pLv);
|
|
|
|
BOOL RunRegionalOptionsApplet(LPTSTR pCommands);
|
|
|
|
BOOL ParseCommandLine(LPTSTR lpCommandLine);
|
|
BOOL StartGUISetup(HWND hwndDlg);
|
|
BOOL SelectInstalledLanguages(HWND hList);
|
|
BOOL SetDefault(HWND hCombo);
|
|
BOOL SetUserDefaultLanguage(LANGID langID, BOOL bApplyCurrentUser, BOOL bApplyAllUsers);
|
|
BOOL UninstallUpdateRegistry(LPTSTR Languages);
|
|
BOOL UpdateCombo(HWND hwndDlg);
|
|
INT_PTR CALLBACK DialogFunc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
|
INT_PTR CALLBACK ProgressDialogFunc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
|
BOOL GetMuiLangInfoFromListView(HWND hList, int i, PMUILANGINFO *ppMuiLangInfo);
|
|
int Muisetup_GetLocaleLanguageInfo(LCID lcid, PTSTR pBuf, int iLen, BOOL fCountryName);
|
|
|
|
|
|
HKEY OpenMuiKey(REGSAM samDesired);
|
|
BOOL GetLcidItemIndexFromListView(HWND hList, LCID lcid, int *piIndex);
|
|
|
|
|
|
int CopyArgument(LPTSTR dest, LPTSTR src);
|
|
int InsertLanguageInListView(HWND hList, LPTSTR lpLanguage, BOOL bCheckState);
|
|
int InstallSelected (LPTSTR Languages,BOOL *lpbFontLinkRegistryTouched);
|
|
int UninstallSelected(LPTSTR Languages,int *lpNotDeleted);
|
|
|
|
PTCHAR SkipBlanks(PTCHAR pszText);
|
|
|
|
void DisplayHelpWindow(void);
|
|
void ListViewCustomDraw(HWND hDlg, LPNMLVCUSTOMDRAW pDraw);
|
|
|
|
// Language Group Installation
|
|
BOOL CALLBACK EnumLanguageGroupsProc(
|
|
LGRPID LanguageGroup,
|
|
LPTSTR lpLanguageGroupString,
|
|
LPTSTR lpLanguageGroupNameString,
|
|
DWORD dwFlags,
|
|
LONG_PTR lParam);
|
|
LGRPID GetLanguageGroup( LCID lcid );
|
|
BOOL EnumLanguageGroupLocalesProc(
|
|
LGRPID langGroupId,
|
|
LCID lcid,
|
|
LPTSTR lpszLocale,
|
|
LONG_PTR lParam);
|
|
BOOL DetectLanguageGroups(HWND hwndDlg);
|
|
BOOL ConvertMUILangToLangGroup(HWND hwndDlg, PINSTALL_LANG_GROUP pInstallLangGroup);
|
|
BOOL AddMUILangGroup(PINSTALL_LANG_GROUP pInstallLangGroup, LGRPID lgrpid);
|
|
BOOL InstallLanguageGroups(PINSTALL_LANG_GROUP pInstallLangGroup);
|
|
BOOL CheckVolumeChange();
|
|
BOOL StartFromTSClient();
|
|
BOOL CheckLanguageIsQualified(LPTSTR lpLanguage);
|
|
|
|
BOOL CALLBACK Region_EnumUILanguagesProc(PWSTR pwszUILanguage,LONG_PTR lParam);
|
|
BOOL MUIGetAllInstalledUILanguages();
|
|
BOOL GetUIFileSize_commandline(LPTSTR lpszLcid, INT64 *ulUISize,INT64 *ulLPKSize);
|
|
BOOL GetUIFileSize(PMUILANGINFO pMuiLangInfo);
|
|
BOOL IsSpaceEnough(HWND hList,INT64 *ulSizeNeed,INT64 *ulSizeAvailable);
|
|
BOOL CopyRemoveMuiItself(BOOL bInstall);
|
|
BOOL RemoveFileReadOnlyAttribute(LPTSTR lpszFileName);
|
|
BOOL MUI_DeleteFile(LPTSTR lpszFileName);
|
|
void Set_SourcePath_FromForward(LPCTSTR lpszPath);
|
|
BOOL MUIShouldSwitchToNewVersion(LPTSTR lpszCommandLine);
|
|
BOOL MUI_TransferControlToNewVersion(LPTSTR lpszExecutable,LPTSTR lpszCommandLine);
|
|
void ExitFromOutOfMemory();
|
|
void NotifyKernel(
|
|
LPTSTR LangList,
|
|
ULONG Flags
|
|
);
|
|
BOOL WelcomeDialog(HWND hWndParent);
|
|
BOOL DoSetup(
|
|
HWND hwnd,
|
|
int UninstallLangCount, LPTSTR lpUninstall,
|
|
INSTALL_LANG_GROUP installLangGroup,
|
|
int InstallLangCount, LPTSTR lpInstall,
|
|
LPTSTR lpDefaultUILang,
|
|
BOOL fAllowReboot, BOOL bInteractive, BOOL bDisplayUI);
|
|
|
|
//
|
|
// Utility functions
|
|
//
|
|
BOOL IsAdmin(void);
|
|
DWORD_PTR TransNum(LPTSTR lpsz);
|
|
LANGID GetDotDefaultUILanguage();
|
|
|
|
//
|
|
// Log functions
|
|
//
|
|
HANDLE OpenLogFile(void);
|
|
void BeginLog(void);
|
|
BOOL LogMessage(LPCTSTR lpMessage);
|
|
BOOL LogFormattedMessage(HINSTANCE hInstance, int messageID, LONG_PTR* lppArgs);
|
|
|
|
//
|
|
// Resource utility functions
|
|
//
|
|
int DoMessageBox(HWND hwndParent, UINT uIdString, UINT uIdCaption, UINT uType);
|
|
int DoMessageBoxFromResource(HWND hwndParent, HMODULE hInstance, UINT uIdString, LONG_PTR* lppArgs, UINT uIdCaption, UINT uType);
|
|
|
|
LPTSTR FormatStringFromResource(LPTSTR pszBuffer, UINT bufferSize, HMODULE hInstance, int messageID, LONG_PTR* lppArgs);
|
|
void SetWindowTitleFromResource(HWND hwnd, int resourceID);
|
|
|
|
//
|
|
// Registry utility functions
|
|
//
|
|
DWORD DeleteRegTree(HKEY hStartKey, LPTSTR pKeyName);
|
|
void DeleteMSIRegSettings(LPTSTR Language);
|
|
|
|
|
|
//
|
|
// External data refereces
|
|
//
|
|
extern HINSTANCE ghInstance;
|
|
extern HWND ghProgress;
|
|
extern HWND ghProgDialog;
|
|
|
|
typedef
|
|
NTSTATUS
|
|
(NTAPI *pfnNtSetDefaultUILanguage)(
|
|
LANGID DefaultUILanguageId
|
|
);
|
|
|
|
typedef
|
|
LANGID
|
|
(WINAPI *pfnGetUserDefaultUILanguage)(
|
|
void
|
|
);
|
|
|
|
typedef
|
|
LANGID
|
|
(WINAPI *pfnGetSystemDefaultUILanguage)(
|
|
void
|
|
);
|
|
|
|
typedef
|
|
BOOL
|
|
(WINAPI *pfnIsValidLanguageGroup)(
|
|
LGRPID LanguageGroup,
|
|
DWORD dwFlags
|
|
);
|
|
|
|
typedef
|
|
BOOL
|
|
(WINAPI *pfnEnumLanguageGroupLocalesW)(
|
|
LANGGROUPLOCALE_ENUMPROCW lpLangGroupLocaleEnumProc,
|
|
LGRPID LanguageGroup,
|
|
DWORD dwFlags,
|
|
LONG_PTR lParam
|
|
);
|
|
|
|
typedef
|
|
BOOL
|
|
(WINAPI *pfnEnumSystemLanguageGroupsW)(
|
|
LANGUAGEGROUP_ENUMPROCW lpLanguageGroupEnumProc,
|
|
DWORD dwFlags,
|
|
LONG_PTR lParam
|
|
);
|
|
|
|
typedef
|
|
NTSTATUS
|
|
(NTAPI *pfnRtlAdjustPrivilege)(
|
|
ULONG Privilege,
|
|
BOOLEAN Enable,
|
|
BOOLEAN Client,PBOOLEAN WasEnabled
|
|
);
|
|
|
|
typedef
|
|
BOOL
|
|
(WINAPI *pfnGetDefaultUserProfileDirectoryW)(
|
|
LPWSTR lpProfileDir,
|
|
LPDWORD lpcchSize
|
|
);
|
|
|
|
typedef
|
|
BOOL (WINAPI *pfnMUI_InstallMFLFiles)(
|
|
TCHAR* pMUIInstallLanguage
|
|
);
|
|
|
|
typedef
|
|
BOOL
|
|
(WINAPI *pfnProcessIdToSessionId)(
|
|
DWORD_PTR dwProcessId,
|
|
DWORD_PTR *pSessionId
|
|
);
|
|
|
|
typedef
|
|
INT
|
|
(WINAPI *pfnLaunchINFSection)(
|
|
HWND hWnd,
|
|
HINSTANCE hInstance,
|
|
PSTR pParams,
|
|
INT flags
|
|
);
|
|
|
|
typedef BOOL (*UILANGUAGE_ENUMPROC)(LPTSTR, LONG_PTR);
|
|
typedef BOOL (*pfnEnumUILanguages)(UILANGUAGE_ENUMPROC, DWORD, LONG_PTR);
|
|
|
|
extern pfnNtSetDefaultUILanguage gpfnNtSetDefaultUILanguage;
|
|
extern pfnGetUserDefaultUILanguage gpfnGetUserDefaultUILanguage;
|
|
extern pfnGetSystemDefaultUILanguage gpfnGetSystemDefaultUILanguage;
|
|
extern pfnIsValidLanguageGroup gpfnIsValidLanguageGroup;
|
|
extern pfnEnumLanguageGroupLocalesW gpfnEnumLanguageGroupLocalesW;
|
|
extern pfnEnumSystemLanguageGroupsW gpfnEnumSystemLanguageGroupsW;
|
|
extern pfnRtlAdjustPrivilege gpfnRtlAdjustPrivilege;
|
|
extern pfnProcessIdToSessionId gpfnProcessIdToSessionId;
|
|
extern pfnGetDefaultUserProfileDirectoryW gpfnGetDefaultUserProfileDirectoryW;
|
|
extern pfnLaunchINFSection gpfnLaunchINFSection;
|
|
extern PSXS_INSTALL_W gpfnSxsInstallW;
|
|
extern PSXS_UNINSTALL_ASSEMBLYW gpfnSxsUninstallW;
|
|
|
|
extern TCHAR g_szPlatformPath[];
|
|
extern TCHAR g_AddLanguages[];
|
|
extern TCHAR g_szMUIInfoFilePath[];
|
|
extern TCHAR g_szMUISetupFolder[];
|
|
extern TCHAR g_szMuisetupPath[];
|
|
extern TCHAR g_szMUIHelpFilePath[];
|
|
extern TCHAR g_szWinDir[];
|
|
extern BOOL g_InstallCancelled;
|
|
extern BOOL g_IECopyError;
|
|
extern BOOL gbIsWorkStation,gbIsServer,gbIsAdvanceServer,gbIsDataCenter,gbIsDomainController;
|
|
extern PFILERENAME_TABLE g_pFileRenameTable;
|
|
extern int g_nFileRename;
|
|
extern PTYPENOTFALLBACK_TABLE g_pNotFallBackTable;
|
|
extern int g_nNotFallBack;
|
|
extern LPTSTR g_SpecialFiles[];
|
|
extern int gNumLanguages_Install;
|
|
extern UILANGUAGEGROUP g_UILanguageGroup;
|
|
extern LANGID gUserUILangId, gSystemUILangId;
|
|
BOOL GetLanguageGroupDisplayName(LANGID LangId, LPTSTR lpBuffer, int nSize);
|
|
|
|
BOOL CheckMUIRegSetting(DWORD dwFlag);
|
|
BOOL SetMUIRegSetting(DWORD dwFlag, BOOL bEnable);
|
|
BOOL DeleteMUIRegSetting();
|
|
BOOL AddExtraLangGroupsFromINF(LPTSTR lpszLcid, PINSTALL_LANG_GROUP pInstallLangGroup);
|
|
BOOL InstallExternalComponents(LPTSTR Languages);
|
|
VOID UninstallExternalComponents(LPTSTR Languages);
|
|
BOOL GetMSIProductCode(LPTSTR szLanguage, LPTSTR szProductCode, UINT uiBufSize);
|
|
|
|
#endif //__MUISETUP_H_
|