From 211d12be706894d0515f6bc16f7f5f1693a836aa Mon Sep 17 00:00:00 2001 From: ge0rdi Date: Mon, 25 Mar 2024 20:10:34 +0100 Subject: [PATCH 01/39] Don't install new Immersive skin on Windows 7 It uses metro colors so it works only on Win8+. https://github.com/Open-Shell/Open-Shell-Menu/discussions/1866#discussioncomment-8906191 --- Src/Setup/Setup.wxs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Src/Setup/Setup.wxs b/Src/Setup/Setup.wxs index 18e41875a..58b5cddc4 100644 --- a/Src/Setup/Setup.wxs +++ b/Src/Setup/Setup.wxs @@ -538,9 +538,11 @@ + VersionNT>601 + VersionNT>601 From 7770e3b98b23cfcf4c6753303b7502b916a79d90 Mon Sep 17 00:00:00 2001 From: ge0rdi Date: Sat, 30 Mar 2024 18:11:32 +0100 Subject: [PATCH 02/39] Make `FixFolderScroll` available in all Windows versions (#1887) --- Src/ClassicExplorer/ExplorerBHO.cpp | 2 +- Src/ClassicExplorer/SettingsUI.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Src/ClassicExplorer/ExplorerBHO.cpp b/Src/ClassicExplorer/ExplorerBHO.cpp index edabf46cf..cfd456364 100644 --- a/Src/ClassicExplorer/ExplorerBHO.cpp +++ b/Src/ClassicExplorer/ExplorerBHO.cpp @@ -243,7 +243,7 @@ LRESULT CALLBACK CExplorerBHO::HookExplorer( int nCode, WPARAM wParam, LPARAM lP if (GetClassName(parent,name,_countof(name)) && _wcsicmp(name,L"CabinetWClass")==0) { DWORD_PTR settings=0; - if (GetWinVersion()==WIN_VER_WIN7 && GetSettingBool(L"FixFolderScroll")) + if (GetSettingBool(L"FixFolderScroll")) settings|=1; SetWindowSubclass(hWnd,SubclassTreeProc,'CLSH',settings); PostMessage(hWnd,TVM_SETEXTENDEDSTYLE,TVS_EX_FADEINOUTEXPANDOS|TVS_EX_AUTOHSCROLL|0x80000000,0); diff --git a/Src/ClassicExplorer/SettingsUI.cpp b/Src/ClassicExplorer/SettingsUI.cpp index 8be0eedad..458500eba 100644 --- a/Src/ClassicExplorer/SettingsUI.cpp +++ b/Src/ClassicExplorer/SettingsUI.cpp @@ -621,7 +621,7 @@ void UpdateSettings( void ) UpdateSetting(L"ShowCaption",CComVariant(0),false); HideSetting(L"ShowCaption",true); UpdateSetting(L"ShowIcon",CComVariant(0),false); HideSetting(L"ShowIcon",true); - UpdateSetting(L"FixFolderScroll",CComVariant(0),false); HideSetting(L"FixFolderScroll",true); + UpdateSetting(L"FixFolderScroll",CComVariant(0),false); UpdateSetting(L"ToolbarItems",CComVariant(g_DefaultToolbar2),false); if (GetWinVersion()>=WIN_VER_WIN10) From 040d3d08d3b1f9d1a39bf181134d95d8105c4a07 Mon Sep 17 00:00:00 2001 From: Alex G <10374678+darthmooguy@users.noreply.github.com> Date: Tue, 3 Dec 2024 04:18:43 -0500 Subject: [PATCH 03/39] Update README.md (#1912) --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index b53baa2a8..76e3aa704 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,9 @@ You can find the latest stable version here: [![GitHub All Releases](https://img.shields.io/github/downloads/Open-Shell/Open-Shell-Menu/total?style=for-the-badge&color=4bc2ee&logo=github)](https://github.com/Open-Shell/Open-Shell-Menu/releases/latest) +### ⚠️ Windows for ARM compatibility ⚠️ +Open-Shell is not compatible with Windows for ARM. If you install it on a Windows for ARM installation (ex. using Parallels Desktop on an Apple Silicon Mac), you will no longer be able to log into your account the next time you reboot. Please refrain from installing Open-Shell on Windows for ARM. + ### Temporary Translation/Language Solution 1. Download [language DLL](https://coddec.github.io/Classic-Shell/www.classicshell.net/translations/index.html) 2. Place it either in the Open-Shell's __install folder__ or in the `%ALLUSERSPROFILE%\OpenShell\Languages` folder From 0aa78709e6d56bcd5ce357348416e98b0bce3a6d Mon Sep 17 00:00:00 2001 From: Curious Insatiable <113294705+Need74@users.noreply.github.com> Date: Tue, 3 Dec 2024 10:20:49 +0100 Subject: [PATCH 04/39] Update OpenShellADMX.txt (#1793) --- Src/Localization/French/OpenShellADMX.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Src/Localization/French/OpenShellADMX.txt b/Src/Localization/French/OpenShellADMX.txt index d29752a6d..aaac49839 100644 --- a/Src/Localization/French/OpenShellADMX.txt +++ b/Src/Localization/French/OpenShellADMX.txt @@ -1,7 +1,7 @@ ; TRANSLATE =================================================================== Title.text = Paramètres Open-Shell -State.text = Etat: +State.text = État: State1.text = Verrouillé sur cette valeur State2.text = Verrouillé sur le paramètre par défaut State3.text = Déverrouillé @@ -13,7 +13,7 @@ OpenShellCat.text = Open-Shell OpenShellCatHelp.text = Paramètres de la stratégie de groupe de Open-Shell SUPPORTED_CS404.text = Nécessite Open-Shell 4.0.4 ou plus. -Language.nameOverride = Langage pour les composants Open-Shell -Language.tipOverride = Sélectionnez la langue pour être utilisée avec Open-Shell (par exemple en-US ou de-DE). La langue affectera le texte dans le menu démarrer, les barres d'outils, etc. Si la DLL de langue appropriée est installée, les paramètres UI peuvent aussi être traduits +Language.nameOverride = Langue pour les composants Open-Shell +Language.tipOverride = Sélectionnez la langue à utiliser avec Open-Shell (par exemple en-US ou de-DE). Le choix de langue affectera le texte dans le menu démarrer, les barres d'outils, etc. Si la DLL de langue appropriée est installée, les paramètres UI peuvent aussi être traduits Update.nameOverride = Activer la vérification automatique de nouvelles versions -Update.tipOverride = Lorsque ceci est coché, Open-Shell vérifiera s'il y a des nouvelles versions chaque semaine. Vous serez averti s'il y a une nouvelle version du logiciel ou une mise à jour pour votre langage actuel +Update.tipOverride = Lorsque ceci est coché, Open-Shell vérifiera s'il y a des nouvelles versions chaque semaine. Vous serez averti s'il y a une nouvelle version du logiciel ou une mise à jour pour votre langue actuelle From 32c75254b995d21f85f9cb4bb59c9cf1f2a7de19 Mon Sep 17 00:00:00 2001 From: Curious Insatiable <113294705+Need74@users.noreply.github.com> Date: Tue, 3 Dec 2024 10:21:16 +0100 Subject: [PATCH 05/39] Update MenuADMX.txt (#1794) --- Src/Localization/French/MenuADMX.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/Src/Localization/French/MenuADMX.txt b/Src/Localization/French/MenuADMX.txt index 1303a761e..d4dc11c92 100644 --- a/Src/Localization/French/MenuADMX.txt +++ b/Src/Localization/French/MenuADMX.txt @@ -190,3 +190,4 @@ StartHoverDelay.nameOverride = Délai du survol (pour le bouton Démarrer) AllProgramsDelay.nameOverride = Délai du survol (Pour Tous les Programmes dans Windows 7) CSMHotkey.tipAddition = .\n\nLa valeur de base est le code virtuel principal de la touche. Ajouter 256 pour Maj, 512 pour Contrôle et 1024 pour and 1024 Alt.\nLa meilleur façon pour obtenir la valeur est de sélectionnez la touche raccourcie dans le boîte de dialogue des Paramètres et de chercher la valeur nommée CSMHotkey dans HKCU\Software\OpenShell\StartMenu\Settings WSMHotkey.tipAddition = .\n\nLa valeur de base est le code virtuel principal de la touche. Ajouter 256 pour Maj, 512 pour Contrôle et 1024 pour and 1024 Alt.\nLa meilleur façon pour obtenir la valeur est de sélectionnez la touche raccourcie dans le boîte de dialogue des Paramètres et de chercher la valeur nommée WSMHotkey in HKCU\Software\OpenShell\StartMenu\Settings +SearchFiles.tipOverride = Lorsque cette case est cochée, les résultats de la recherche incluront les fichiers, e-mails et autres éléments provenant d'emplacements indexés From cc3336ea260530e4dc6993de03c6711af18e21a4 Mon Sep 17 00:00:00 2001 From: Curious Insatiable <113294705+Need74@users.noreply.github.com> Date: Tue, 3 Dec 2024 10:21:50 +0100 Subject: [PATCH 06/39] Update StartMenu.html (#1795) --- Src/Localization/French/StartMenu.html | 48 +++++++++++++------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/Src/Localization/French/StartMenu.html b/Src/Localization/French/StartMenu.html index 56ce1ed05..0ef81685f 100644 --- a/Src/Localization/French/StartMenu.html +++ b/Src/Localization/French/StartMenu.html @@ -37,13 +37,13 @@

Styles

Le menu démarrer offre 3 choix de styles.

1) Simple colonne style classique (classic)


-Ce style est très similaire au menu trouvé dans Windows 2000. Il a une colonne dans le menu principal avec du texte vertical sur le côté, vous pouvez personnaliser l'ordre des éléments, icônes et texte.
+Ce style est très similaire au menu trouvé dans Windows 2000. Il a une colonne dans le menu principal avec du texte vertical sur le côté, vous pouvez personnaliser l’ordre des éléments, icônes et texte.
-Programmes, listes de raccourcis, et résultats de recherche s'affichent comme des sous-menus cascadés.
+Programmes, listes de raccourcis, et résultats de recherche s’affichent comme des sous-menus cascadés.

2) Style classique (classic) 2 colonnes


Ceci est similaire au menu de Windows XP. Il y a 2 colonnes où vous pouvez arranger vos éléments de menu. Personnaliser leurs ordres, icônes et texte.
-Programmes, listes de raccourcis, et résultats de recherche s'affichent comme des sous-menus cascadés.
+Programmes, listes de raccourcis, et résultats de recherche s’affichent comme des sous-menus cascadés.

3) Style Windows 7


Ceci est similaire au menu Windows Vista et Windows 7. Les éléments dans la première colonne sont prédéfinis comme épingler et Programmes Récents, la liste de Tous les Programmes et la zone de recherche. Les éléments dans la seconde colonne sont entièrement personnalisable.
-Les listes de raccourcis et les résultats de recherche sont affichés à l'intérieur du menu principal. Les programmes peuvent être à l'intérieur du menu principal ou -s'afficher sous la forme d’un sous-menu cascadé.
+Les listes de raccourcis et les résultats de recherche sont affichés à l’intérieur du menu principal. Les programmes peuvent être à l’intérieur du menu principal ou +s’afficher sous la forme d’un sous-menu cascadé.
Ce style offre moins d’ options de personnalisation que les styles classiques (classic), mais donne une apparence et un sentiment plus familier aux personnes ayant utilisé Windows 7.


@@ -87,16 +87,16 @@

Opération

Appuyez sur la touche Windows ou cliquez sur l’ orbe de Open-Shell dans le coin de l’ écran pour ouvrir le menu démarrer.

-Maintenez Majuscule enfoncée pendant que vous cliquez sur l’ orbe de Open-Shell pour accéder au menu démarrer d'origine du système d'exploitation. +Maintenez Majuscule enfoncée pendant que vous cliquez sur l’ orbe de Open-Shell pour accéder au menu démarrer d’origine du système d’exploitation.

-Cliquez sur un élément pour l'exécuter. +Cliquez sur un élément pour l’exécuter.

-Glissez un programme pour changer l'ordre des programmes dans un menu, ou pour le déplacer dans un autre dossier. +Glissez un programme pour changer l’ordre des programmes dans un menu, ou pour le déplacer dans un autre dossier.

-Clic droit sur un élément pour le renomer, le supprimer, l’explorer, trier le menu, ou effectuer d'autres tches.

+Clic droit sur un élément pour le renomer, le supprimer, l’explorer, trier le menu, ou effectuer d’autres tâches.

Clic droit sur l’orbe de Open-Shell pour modifier les paramètres du menu démarrer, pour voir ce fichier d’aide, ou pour stopper le menu démarrer.

@@ -109,7 +109,7 @@



Vous pouvez choisir d'afficher les paramètres de base ou tous les paramètres disponibles. Survolez chaque paramètre pour obtenir une description de sa fonction. -Saisissez un mot dans la zone de recherche pour trouver un paramètre grce à son nom.
+Saisissez un mot dans la zone de recherche pour trouver un paramètre grâce à son nom.
Chaque paramètre à une valeur par défaut. La valeur par défaut peut-être une constante, ou elle peut dépendre des paramètres systèmes actuels. Une fois que vous modifiez un paramètre, celui-ci devient "modifié" et est affiché en gras. Pour revenir au paramètre par défaut, clic droit sur le paramètre.
@@ -184,7 +184,7 @@

Paramètres Administratifs

nom de la valeur. Par exemple si vous voulez que le menu contextuel soit désactivé par défaut mais que vous voulez autoriser les utilisateurs à modifier cette valeur s’ils le veulent, créez une valeur DWORD nommée "EnableContextMenu_Default" et configurez là à 0.

-La façon la plus facile de connaître le nom registrerie d'un paramètre et ça valeur pour la modifier, est de la rechercher dans HKEY_CURRENT_USER\Software\OpenShell\StartMenu\Settings.
+La façon la plus facile de connaître le nom registrerie d’un paramètre et ça valeur pour la modifier, est de la rechercher dans HKEY_CURRENT_USER\Software\OpenShell\StartMenu\Settings.
Quelqes fois vous voudrez verrouiller un paramètre à sa valeur par défaut, mais vous ne savez quelle est la valeur par défaut. Dans ce cas créez une valeur DWORD et configurez là à 0xDEFA.
@@ -194,7 +194,7 @@

Paramètres Administratifs



-Le menu démarrer vérifie aussi la plupart des stratégies de groupe configurées par l’administrateur. Exécutez gpedit.msc et aller à Configuration User Configuration -> Modèles Administratifs -> Menu Démarrer et Barre des Tches. A partir de là, vous pouvez désactiver Exécuter, Arrêter, Aide, et d'autres fonctions. (Non disponible sur les version Home de Windows).
+Le menu démarrer vérifie aussi la plupart des stratégies de groupe configurées par l’administrateur. Exécutez gpedit.msc et aller à Configuration User Configuration -> Modèles Administratifs -> Menu Démarrer et Barre des Tâches. A partir de là, vous pouvez désactiver Exécuter, Arrêter, Aide, et d’autres fonctions. (Non disponible sur les version Home de Windows).

Modifier les paramètres au travers des stratégies de groupe est aussi supporté. Décompressez le fichier PolicyDefinitions.zip qui se trouve dans le dossier d’installation et lisez le document PolicyDefinitions.rtf pour plus de détails.

@@ -208,24 +208,24 @@

En savoir plus à propos des Peaux (Skins)

Files\Open-Shell\Skins. Après cela, elle sera disponible dans les paramètres.

Note: Certaines peaux (skins) peuvent être spécifiquement conçues pour le mode -Classic, Basic, ou Aero. Par exemple une peau (skin) Aero nécessitera peut être le support de l'option verre, les autres auront une apparence bizarre si le thème Classique (Classic) ou Base (Basic) est sélectionné. Certaines peaux (skins) Aero nécessiteront aussi peut être une couleur de verre spécifique à sélectionner.
+Classic, Basic, ou Aero. Par exemple une peau (skin) Aero nécessitera peut être le support de l’option verre, les autres auront une apparence bizarre si le thème Classique (Classic) ou Base (Basic) est sélectionné. Certaines peaux (skins) Aero nécessiteront aussi peut être une couleur de verre spécifique à sélectionner.

-Vous pouvez créer votre propre peau (skin). Vous aurez besoin d'un logiciel de retouche d’image qui supporte le canal Alpha (comme Gimp ou Photoshop) et un outil pour modifier les fichiers ressources (comme Resource Hacker ou Visual Studio). Et bien sûr quelques talents en conception de graphisme :). Lisez le Tutoriel de peaux (Skinning Tutorial) en anglais avant de commencer.
+Vous pouvez créer votre propre peau (skin). Vous aurez besoin d’un logiciel de retouche d’image qui supporte le canal Alpha (comme Gimp ou Photoshop) et un outil pour modifier les fichiers ressources (comme Resource Hacker ou Visual Studio). Et bien sûr quelques talents en conception de graphisme :). Lisez le Tutoriel de peaux (Skinning Tutorial) en anglais avant de commencer.



Recherche



- La zone de recherche vous laisse rechercher du contenu dans le menu démarrer, les programmes qui se trouvent dans la variable d'environnement PATH et les fichiers indexés. -Vous pouvez avoir la zone de recherche apparaître sous forme d'élément de menu normal et ensuite vous pouvez y aller en utilisant les touches claviers flèches haut/bas. -Vous pouvez choisir d'avoir la zone de recherche sélectionné par défaut quand vous ouvrez le menu démarrer. Ou vous pouvez choisir d’activer la zone de recherche seulement avec la touche Tab, de façon que tant que vous n'utilisez pas la touche tab vous pouvez utiliser le clavier pour naviguer comme si la zone de recherche n'était pas là.
+ La zone de recherche vous laisse rechercher du contenu dans le menu démarrer, les programmes qui se trouvent dans la variable d’environnement PATH et les fichiers indexés. +Vous pouvez avoir la zone de recherche apparaître sous forme d’élément de menu normal et ensuite vous pouvez y aller en utilisant les touches claviers flèches haut/bas. +Vous pouvez choisir d’avoir la zone de recherche sélectionné par défaut quand vous ouvrez le menu démarrer. Ou vous pouvez choisir d’activer la zone de recherche seulement avec la touche Tab, de façon que tant que vous n’utilisez pas la touche tab vous pouvez utiliser le clavier pour naviguer comme si la zone de recherche n’était pas là.

Les résultats de recherche s'affichent dans le menu principal si vous utilisez le style Windows 7 ou dans un sous-menu pour les styles Classiques (Classic).
Cliquez sur chaque catégorie pour la développer et voir plus de résultats. Cliquez sur l’icône à la fin pour voir tous les résultats dans l’Explorateur.

-Les styles Classiques (Classic) vous permettent de configurer des "fournisseurs de recherche" additionnels, que vous pouvez utiliser pour rechercher du texte à partir de la zone de recherche. Vous pouvez exécuter ce programme de recherche soit en le sélectionnant à partir du menu, soit en appuyant sur la touche Alt. Dans cet exemple utilisez Alt+A pour l'Agent Ransack.
+Les styles Classiques (Classic) vous permettent de configurer des "fournisseurs de recherche" additionnels, que vous pouvez utiliser pour rechercher du texte à partir de la zone de recherche. Vous pouvez exécuter ce programme de recherche soit en le sélectionnant à partir du menu, soit en appuyant sur la touche Alt. Dans cet exemple utilisez Alt+A pour l’Agent Ransack.


-Ceci est fait en ajoutant des sous-éléments à l'élément zone de recherche dans l’onglet Personnaliser le Menu Démarrer :
+Ceci est fait en ajoutant des sous-éléments à l’élément zone de recherche dans l’onglet Personnaliser le Menu Démarrer :


Ouvrez chaque sous-élément et saisissez la commande pour démarrer le programme de recherche. Si vous utilisez %1 dans la commande, cela sera remplacé par le contenu de la zone de recherche. Si vous utilisez %2 cela sera remplacé par le texte de la zone de recherche encodé au format url. @@ -240,7 +240,7 @@

Recherche

Bouton Démarrer Personnalisable
-Open-Shell peut ajouter son propre bouton démarrer à la barre des tches. Il peut même remplacer le bouton démarrer par défaut de Windows 7. +Open-Shell peut ajouter son propre bouton démarrer à la barre des tâches. Il peut même remplacer le bouton démarrer par défaut de Windows 7. Vous pouvez choisir entre un bouton orbe style Aero, un bouton classique rectangulaire, ou vous pouvez faire le vôtre. Pour un bouton démarrer personnalisé vous avez besoin d’une image qui contient 3 états du bouton - normal, chaud et cliqué :
Images du bouton démarrer
From b17d08b7a6f9688a80cd993b88a04a6ca257c09b Mon Sep 17 00:00:00 2001 From: ge0rdi Date: Tue, 19 Nov 2024 07:12:20 +0100 Subject: [PATCH 07/39] Fix start button/menu misalignment on touch-screen devices Windows 11 22H2 introduced new touch-optimized taskbar for devices with touch screen. It seems that in this mode taskbar window size is bigger than actual taskbar on screen. There is region defined for the window that covers actually displayed portion of the window. We should account for that region (if present) when obtaining taskbar window dimensions. More info about how to enable/disable touch taskbar: https://www.elevenforum.com/t/turn-on-or-off-tablet-optimized-taskbar-in-windows-11.5133/ --- Src/StartMenu/StartMenuDLL/StartMenuDLL.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Src/StartMenu/StartMenuDLL/StartMenuDLL.cpp b/Src/StartMenu/StartMenuDLL/StartMenuDLL.cpp index d8da25b26..ce80cee8f 100644 --- a/Src/StartMenu/StartMenuDLL/StartMenuDLL.cpp +++ b/Src/StartMenu/StartMenuDLL/StartMenuDLL.cpp @@ -603,6 +603,11 @@ UINT GetTaskbarPosition( HWND taskBar, MONITORINFO *pInfo, HMONITOR *pMonitor, R SHAppBarMessage(ABM_GETTASKBARPOS,&appbar); if (pRc) { + if (RECT rc; GetWindowRgnBox(taskBar,&rc)!=ERROR) + { + MapWindowPoints(taskBar,NULL,(POINT*)&rc,2); + appbar.rc=rc; + } *pRc=appbar.rc; RECT rc; GetWindowRect(taskBar,&rc); @@ -1217,9 +1222,8 @@ static void UpdateStartButtonPosition(const TaskbarInfo* taskBar, const WINDOWPO RecreateStartButton(taskBar->taskbarId); RECT rcTask; - GetWindowRect(taskBar->taskBar, &rcTask); MONITORINFO info; - UINT uEdge = GetTaskbarPosition(taskBar->taskBar, &info, NULL, NULL); + UINT uEdge = GetTaskbarPosition(taskBar->taskBar, &info, NULL, &rcTask); DWORD buttonFlags = SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOSIZE; if (IsWindowVisible(taskBar->taskBar)) buttonFlags |= SWP_SHOWWINDOW; From 5809217adc48ca4ee6c210d9472839176d757adb Mon Sep 17 00:00:00 2001 From: ge0rdi Date: Tue, 19 Nov 2024 07:31:52 +0100 Subject: [PATCH 08/39] Use WiX Toolset v3.14 --- Src/BUILDME.txt | 2 +- Src/Setup/__MakeFinal.bat | 2 +- Src/Setup/__MakeFinalAllLanguages.bat | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Src/BUILDME.txt b/Src/BUILDME.txt index 2f3a43cff..b9ed47e5b 100644 --- a/Src/BUILDME.txt +++ b/Src/BUILDME.txt @@ -10,7 +10,7 @@ Visual Studio 2022 (Community Edition is enough) - Windows 11 SDK (10.0.22621.0) for Desktop C++ - Visual C++ ATL support HTML Help Workshop -WiX 3.11 +WiX 3.14 7-Zip It is possible to convert the projects to newer versions of Visual Studio and newer SDKs. Newer versions of WiX will probably work fine. diff --git a/Src/Setup/__MakeFinal.bat b/Src/Setup/__MakeFinal.bat index 16bcdf1e4..d1b1ebbf3 100644 --- a/Src/Setup/__MakeFinal.bat +++ b/Src/Setup/__MakeFinal.bat @@ -1,5 +1,5 @@ @echo off -set PATH=C:\Program Files\7-Zip\;C:\Program Files (x86)\HTML Help Workshop;C:\Program Files (x86)\WiX Toolset v3.11\bin\;%PATH% +set PATH=C:\Program Files\7-Zip\;C:\Program Files (x86)\HTML Help Workshop;C:\Program Files (x86)\WiX Toolset v3.14\bin\;%PATH% cd %~dp0 diff --git a/Src/Setup/__MakeFinalAllLanguages.bat b/Src/Setup/__MakeFinalAllLanguages.bat index ad73e7a04..161527007 100644 --- a/Src/Setup/__MakeFinalAllLanguages.bat +++ b/Src/Setup/__MakeFinalAllLanguages.bat @@ -1,7 +1,7 @@ @echo off rem This file is to create all the files required for a new release to publish -set PATH=C:\Program Files\7-Zip\;C:\Program Files (x86)\HTML Help Workshop;C:\Program Files (x86)\WiX Toolset v3.11\bin\;%PATH% +set PATH=C:\Program Files\7-Zip\;C:\Program Files (x86)\HTML Help Workshop;C:\Program Files (x86)\WiX Toolset v3.14\bin\;%PATH% cd %~dp0 From 348d8fa54e5442d90ef855c90794eaa3bc88dc66 Mon Sep 17 00:00:00 2001 From: ge0rdi Date: Tue, 3 Dec 2024 10:10:23 +0100 Subject: [PATCH 09/39] ModernSettings: Use proper AllSystemSettings file on newer Win11 It seems that AllSystemSettings file name changed since 24H2. We will look for new file first and then fall-back to original one. Fixes #2033. --- Src/StartMenu/StartMenuHelper/ModernSettings.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Src/StartMenu/StartMenuHelper/ModernSettings.cpp b/Src/StartMenu/StartMenuHelper/ModernSettings.cpp index 88f5a987e..a177340e5 100644 --- a/Src/StartMenu/StartMenuHelper/ModernSettings.cpp +++ b/Src/StartMenu/StartMenuHelper/ModernSettings.cpp @@ -327,9 +327,15 @@ static std::vector> ParseModernSettings() doc->put_async(VARIANT_FALSE); wchar_t path[MAX_PATH]{}; - wcscpy_s(path, LR"(%windir%\ImmersiveControlPanel\Settings\AllSystemSettings_{253E530E-387D-4BC2-959D-E6F86122E5F2}.xml)"); + wcscpy_s(path, LR"(%windir%\ImmersiveControlPanel\Settings\AllSystemSettings_{FDB289F3-FCFC-4702-8015-18926E996EC1}.xml)"); DoEnvironmentSubst(path, _countof(path)); + if (!PathFileExists(path)) + { + wcscpy_s(path, LR"(%windir%\ImmersiveControlPanel\Settings\AllSystemSettings_{253E530E-387D-4BC2-959D-E6F86122E5F2}.xml)"); + DoEnvironmentSubst(path, _countof(path)); + } + VARIANT_BOOL loaded; if (SUCCEEDED(doc->load(CComVariant(path), &loaded)) && loaded) { From 4e7ca97def8f811d23a913a4343346be2add6b26 Mon Sep 17 00:00:00 2001 From: Curious Insatiable <113294705+Need74@users.noreply.github.com> Date: Tue, 3 Dec 2024 17:15:01 +0100 Subject: [PATCH 10/39] Update StartMenu.html (#2036) --- Src/Localization/French/StartMenu.html | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Src/Localization/French/StartMenu.html b/Src/Localization/French/StartMenu.html index 0ef81685f..e22e58aab 100644 --- a/Src/Localization/French/StartMenu.html +++ b/Src/Localization/French/StartMenu.html @@ -37,9 +37,9 @@

Opération

Glissez un programme pour changer l’ordre des programmes dans un menu, ou pour le déplacer dans un autre dossier.

-Clic droit sur un élément pour le renomer, le supprimer, l’explorer, trier le menu, ou effectuer d’autres tâches.

+Clic droit sur un élément pour le renomer, le supprimer, l’explorer, trier le menu, ou effectuer d’autres tâches.

Clic droit sur l’orbe de Open-Shell pour modifier les paramètres du menu démarrer, pour voir ce fichier d’aide, ou pour stopper le menu démarrer.

@@ -109,7 +109,7 @@



Vous pouvez choisir d'afficher les paramètres de base ou tous les paramètres disponibles. Survolez chaque paramètre pour obtenir une description de sa fonction. -Saisissez un mot dans la zone de recherche pour trouver un paramètre grâce à son nom.
+Saisissez un mot dans la zone de recherche pour trouver un paramètre grâce à son nom.
Chaque paramètre à une valeur par défaut. La valeur par défaut peut-être une constante, ou elle peut dépendre des paramètres systèmes actuels. Une fois que vous modifiez un paramètre, celui-ci devient "modifié" et est affiché en gras. Pour revenir au paramètre par défaut, clic droit sur le paramètre.
@@ -194,7 +194,7 @@

Paramètres Administratifs



-Le menu démarrer vérifie aussi la plupart des stratégies de groupe configurées par l’administrateur. Exécutez gpedit.msc et aller à Configuration User Configuration -> Modèles Administratifs -> Menu Démarrer et Barre des Tâches. A partir de là, vous pouvez désactiver Exécuter, Arrêter, Aide, et d’autres fonctions. (Non disponible sur les version Home de Windows).
+Le menu démarrer vérifie aussi la plupart des stratégies de groupe configurées par l’administrateur. Exécutez gpedit.msc et aller à Configuration User Configuration -> Modèles Administratifs -> Menu Démarrer et Barre des Tâches. A partir de là, vous pouvez désactiver Exécuter, Arrêter, Aide, et d’autres fonctions. (Non disponible sur les version Home de Windows).

Modifier les paramètres au travers des stratégies de groupe est aussi supporté. Décompressez le fichier PolicyDefinitions.zip qui se trouve dans le dossier d’installation et lisez le document PolicyDefinitions.rtf pour plus de détails.

@@ -240,7 +240,7 @@

Recherche

Bouton Démarrer Personnalisable
-Open-Shell peut ajouter son propre bouton démarrer à la barre des tâches. Il peut même remplacer le bouton démarrer par défaut de Windows 7. +Open-Shell peut ajouter son propre bouton démarrer à la barre des tâches. Il peut même remplacer le bouton démarrer par défaut de Windows 7. Vous pouvez choisir entre un bouton orbe style Aero, un bouton classique rectangulaire, ou vous pouvez faire le vôtre. Pour un bouton démarrer personnalisé vous avez besoin d’une image qui contient 3 états du bouton - normal, chaud et cliqué :
Images du bouton démarrer
From f60e2a18cbc6e3ad3db4da74d2e58d528b0d1e4c Mon Sep 17 00:00:00 2001 From: ge0rdi Date: Wed, 4 Dec 2024 19:54:58 +0100 Subject: [PATCH 11/39] Fix custom button auto-hiding (#2041) --- Src/StartMenu/StartMenuDLL/StartMenuDLL.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Src/StartMenu/StartMenuDLL/StartMenuDLL.cpp b/Src/StartMenu/StartMenuDLL/StartMenuDLL.cpp index ce80cee8f..0cfcdee7b 100644 --- a/Src/StartMenu/StartMenuDLL/StartMenuDLL.cpp +++ b/Src/StartMenu/StartMenuDLL/StartMenuDLL.cpp @@ -1222,8 +1222,14 @@ static void UpdateStartButtonPosition(const TaskbarInfo* taskBar, const WINDOWPO RecreateStartButton(taskBar->taskbarId); RECT rcTask; + GetWindowRect(taskBar->taskBar, &rcTask); + if (RECT rc; GetWindowRgnBox(taskBar->taskBar, &rc) != ERROR) + { + MapWindowPoints(taskBar->taskBar, NULL, (POINT*)&rc, 2); + rcTask = rc; + } MONITORINFO info; - UINT uEdge = GetTaskbarPosition(taskBar->taskBar, &info, NULL, &rcTask); + UINT uEdge = GetTaskbarPosition(taskBar->taskBar, &info, NULL, NULL); DWORD buttonFlags = SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOSIZE; if (IsWindowVisible(taskBar->taskBar)) buttonFlags |= SWP_SHOWWINDOW; From 680e6eedbb6f78d8331d8c321f49554d03a0ba8f Mon Sep 17 00:00:00 2001 From: ge0rdi Date: Fri, 6 Dec 2024 07:25:00 +0100 Subject: [PATCH 12/39] AppVeyor: New deployment token --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 3d8500970..a7d00344c 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -21,5 +21,5 @@ deploy: on: APPVEYOR_ACCOUNT_NAME: passionate-coder auth_token: - secure: D0QZnRZfea3qJlWOwrxE6M2jrbiSrOfz/6U7RzdeeG8N0qNDFKI7LFjYyw2I/PcR + secure: SOu6Y71k0oIxXJR35x+7ZTrqDa3HqUM4kLNJc+DbohPz9zhVHh9O8QYwmI7LI0qslug5L11fo9pZVfVgZttw4eBgooHaX9TNBTTA6sJItkXqMX+M6mKAG7tbI/O3Eg0v prerelease: true From 077afd2377d2addbf53a5083bb0793374b5b5b60 Mon Sep 17 00:00:00 2001 From: ge0rdi Date: Fri, 20 Dec 2024 14:07:09 +0100 Subject: [PATCH 13/39] Add missing version info --- Src/Setup/SetupHelper/SetupHelper.rc | 61 +++++++++++++++++++++++ Src/Setup/SetupHelper/SetupHelper.vcxproj | 3 ++ Src/Setup/Utility/Utility.rc | 38 ++++++++++++++ 3 files changed, 102 insertions(+) create mode 100644 Src/Setup/SetupHelper/SetupHelper.rc diff --git a/Src/Setup/SetupHelper/SetupHelper.rc b/Src/Setup/SetupHelper/SetupHelper.rc new file mode 100644 index 000000000..beff246c0 --- /dev/null +++ b/Src/Setup/SetupHelper/SetupHelper.rc @@ -0,0 +1,61 @@ +// Microsoft Visual C++ generated resource script. +// + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION _PRODUCT_VERSION + PRODUCTVERSION _PRODUCT_VERSION + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x4L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904e4" + BEGIN + VALUE "CompanyName", "Open-Shell" + VALUE "FileDescription", "Setup helper" + VALUE "FileVersion", _PRODUCT_VERSION_STR + VALUE "InternalName", "SetupHelper.exe" + VALUE "LegalCopyright", "Copyright (C) 2017-2018, The Open-Shell Team" + VALUE "OriginalFilename", "SetupHelper.exe" + VALUE "ProductName", "Open-Shell" + VALUE "ProductVersion", _PRODUCT_VERSION_STR + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1252 + END +END + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// diff --git a/Src/Setup/SetupHelper/SetupHelper.vcxproj b/Src/Setup/SetupHelper/SetupHelper.vcxproj index 4a99fa415..4b5e328d2 100644 --- a/Src/Setup/SetupHelper/SetupHelper.vcxproj +++ b/Src/Setup/SetupHelper/SetupHelper.vcxproj @@ -38,6 +38,9 @@ + + + diff --git a/Src/Setup/Utility/Utility.rc b/Src/Setup/Utility/Utility.rc index 5e6ee6904..a544464a8 100644 --- a/Src/Setup/Utility/Utility.rc +++ b/Src/Setup/Utility/Utility.rc @@ -207,6 +207,44 @@ BEGIN END #endif // APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION _PRODUCT_VERSION + PRODUCTVERSION _PRODUCT_VERSION + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x4L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904e4" + BEGIN + VALUE "CompanyName", "Open-Shell" + VALUE "FileDescription", "Utility" + VALUE "FileVersion", _PRODUCT_VERSION_STR + VALUE "InternalName", "Utility.exe" + VALUE "LegalCopyright", "Copyright (C) 2017-2018, The Open-Shell Team" + VALUE "OriginalFilename", "Utility.exe" + VALUE "ProductName", "Open-Shell" + VALUE "ProductVersion", _PRODUCT_VERSION_STR + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1252 + END +END + #endif // English (U.S.) resources ///////////////////////////////////////////////////////////////////////////// From 31acb6b092846a35920fc4b4f331f708ff8eaa33 Mon Sep 17 00:00:00 2001 From: ge0rdi Date: Fri, 20 Dec 2024 14:11:20 +0100 Subject: [PATCH 14/39] Remove obsolete product version fallback --- Src/StartMenu/StartMenu.rc | 8 -------- 1 file changed, 8 deletions(-) diff --git a/Src/StartMenu/StartMenu.rc b/Src/StartMenu/StartMenu.rc index f2c965607..00b951f3c 100644 --- a/Src/StartMenu/StartMenu.rc +++ b/Src/StartMenu/StartMenu.rc @@ -52,14 +52,6 @@ END // Version // -// Solution loading fail-safe -#ifndef _PRODUCT_VERSION -#define _PRODUCT_VERSION 4.4.102 -#endif -#ifndef _PRODUCT_VERSION_STR -#define _PRODUCT_VERSION_STR "4.4.102" -#endif - VS_VERSION_INFO VERSIONINFO FILEVERSION _PRODUCT_VERSION PRODUCTVERSION _PRODUCT_VERSION From d82fadb926d69a4c6f7a294b8448d976f99ece44 Mon Sep 17 00:00:00 2001 From: Curious Insatiable <113294705+Need74@users.noreply.github.com> Date: Thu, 2 Jan 2025 21:02:28 +0100 Subject: [PATCH 15/39] Update StartMenuL10N.ini for all languages (#2086) --- Src/StartMenu/StartMenuL10N.ini | 40 +++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/Src/StartMenu/StartMenuL10N.ini b/Src/StartMenu/StartMenuL10N.ini index ae1dbd891..b39d674aa 100644 --- a/Src/StartMenu/StartMenuL10N.ini +++ b/Src/StartMenu/StartMenuL10N.ini @@ -93,6 +93,7 @@ Menu.SearchPeople = عن أ&شخاص... Menu.SortByName = فرز &حسب الاسم Menu.Open = ف&تح Menu.OpenAll = &فتح كافة المستخدمين +Menu.OpenPinned = Open Pinned Menu.Explore = ا&ستكشاف Menu.ExploreAll = است&كشاف كافة المستخدمين Menu.MenuSettings = إعدادات @@ -229,6 +230,7 @@ Menu.SearchPeople = За хо&ра... Menu.SortByName = &Сортирай по име Menu.Open = &Отвори Menu.OpenAll = О&твори "Всички потребители" +Menu.OpenPinned = Отворете фиксираните елементи Menu.Explore = &Преглед Menu.ExploreAll = Пре&глед на "Всички потребители" Menu.MenuSettings = Настройки @@ -365,6 +367,7 @@ Menu.SearchPeople = &Persones... Menu.SortByName = Ordenar per &Nom Menu.Open = &Obrir Menu.OpenAll = Ob&rir tots els usuaris +Menu.OpenPinned = Obre elements fixats Menu.Explore = E&xplorar Menu.ExploreAll = &Explorar tots els usuaris Menu.MenuSettings = Configuració @@ -503,6 +506,7 @@ Menu.SearchPeople = Oso&by... Menu.SortByName = Seřadit podle &názvu Menu.Open = &Otevřít Menu.OpenAll = Ot&evřít položky všech uživatele +Menu.OpenPinned = Otevřít připnuté položky Menu.Explore = Proz&koumat Menu.ExploreAll = P&rocházet položky všech uživatelů Menu.MenuSettings = Nastavení @@ -639,6 +643,7 @@ Menu.SearchPeople = Efter &personer... Menu.SortByName = So&rter efter navn Menu.Open = Å&bn Menu.OpenAll = &Åbn mappen Alle brugere +Menu.OpenPinned = Åbn fastgjorte elementer Menu.Explore = &Stifinder Menu.ExploreAll = &Gennemse mappen Alle brugere Menu.MenuSettings = Indstillinger @@ -912,6 +917,7 @@ Menu.SearchPeople = Για ά&τομα... Menu.SortByName = Ταξι&νόμηση κατά όνομα Menu.Open = Άν&οιγμα Menu.OpenAll = Άνοιγμα ό&λων των χρηστών +Menu.OpenPinned = Άνοιγμα καρφιτσωμένων στοιχείων Menu.Explore = Ε&ξερεύνηση Menu.ExploreAll = &Εξερεύνηση όλων των χρηστών Menu.MenuSettings = Ρυθμίσεις @@ -1048,6 +1054,7 @@ Menu.SearchPeople = For &People... Menu.SortByName = Sort &by Name Menu.Open = &Open Menu.OpenAll = O&pen All Users +Menu.OpenPinned = Open Pinned Menu.Explore = &Explore Menu.ExploreAll = E&xplore All Users Menu.MenuSettings = Settings @@ -1184,6 +1191,7 @@ Menu.SearchPeople = &Personas... Menu.SortByName = Ordenar por &Nombre Menu.Open = &Abrir Menu.OpenAll = Ab&rir todos los usuarios +Menu.OpenPinned = Abrir elementos fijados Menu.Explore = E&xplorar Menu.ExploreAll = &Explorar todos los usuarios Menu.MenuSettings = Configuración @@ -1320,6 +1328,7 @@ Menu.SearchPeople = &Inimesi... Menu.SortByName = Sor&di nime järgi Menu.Open = &Ava Menu.OpenAll = A&va kaust Kõik kasutajad +Menu.OpenPinned = Ava kinnitatud üksused Menu.Explore = Uu&ri Menu.ExploreAll = Uur&i kausta Kõik kasutajad Menu.MenuSettings = Sätted @@ -1456,6 +1465,7 @@ Menu.SearchPeople = برای ا&فراد... Menu.SortByName = &ترتیب بر اساس نام Menu.Open = با&ز کردن Menu.OpenAll = باز کردن تمام &کاربرها +Menu.OpenPinned = Open Pinned Menu.Explore = کاو&ش Menu.ExploreAll = کاوش ت&مام کاربرها Menu.MenuSettings = تنظیمات @@ -1594,6 +1604,7 @@ Menu.SearchPeople = &Henkilöitä... Menu.SortByName = &Lajittele nimen mukaan Menu.Open = &Avaa Menu.OpenAll = Avaa &kaikki käyttäjät +Menu.OpenPinned = Avaa kiinnitetyt kohteet Menu.Explore = &Resurssienhallinta Menu.ExploreAll = &Selaa kaikkia käyttäjiä Menu.MenuSettings = Asetukset @@ -1730,6 +1741,7 @@ Menu.SearchPeople = Des &personnes… Menu.SortByName = Trier par &nom Menu.Open = &Ouvrir Menu.OpenAll = Ouvrir &tous les utilisateurs +Menu.OpenPinned = Ouvrir les éléments épinglés Menu.Explore = E&xplorer Menu.ExploreAll = &Explorer Tous les utilisateurs Menu.MenuSettings = Paramètres @@ -1866,6 +1878,7 @@ Menu.SearchPeople = Airson &daoine... Menu.SortByName = Seòrsaich a-rèir ain&m Menu.Open = F&osgail Menu.OpenAll = &Fosgail a h-uile cleachdaiche +Menu.OpenPinned = Fosgail nithean pinnte Menu.Explore = &Rùraich Menu.ExploreAll = Rùraic&h a h-uile cleachdaiche Menu.MenuSettings = Roghainnean @@ -2002,6 +2015,7 @@ Menu.SearchPeople = עבור &אנשים... Menu.SortByName = מיין לפי &שם Menu.Open = &פתח Menu.OpenAll = פתח את &כל המשתמשים +Menu.OpenPinned = Open Pinned Menu.Explore = &סייר Menu.ExploreAll = סיי&ר בכל המשתמשים Menu.MenuSettings = הגדרות @@ -2138,6 +2152,7 @@ Menu.SearchPeople = Za &osobe... Menu.SortByName = Poredaj po i&menu Menu.Open = &Otvori Menu.OpenAll = Ot&vori sve korisnike +Menu.OpenPinned = Otvaranje zakačenih stavki Menu.Explore = Ist&raži Menu.ExploreAll = Istr&aži sve korisnike Menu.MenuSettings = Postavke @@ -2274,6 +2289,7 @@ Menu.SearchPeople = &Személyek... Menu.SortByName = &Név szerinti rendezés Menu.Open = &Megnyitás Menu.OpenAll = M&egnyitás - All Users +Menu.OpenPinned = Open Pinned Menu.Explore = T&allózás Menu.ExploreAll = Ta&llózás - All Users Menu.MenuSettings = Beállítások @@ -2412,6 +2428,7 @@ Menu.SearchPeople = Að &fólki... Menu.SortByName = Raða &eftir heiti Menu.Open = &Opna Menu.OpenAll = O&pna Allir notendur +Menu.OpenPinned = Opnaðu fest atriði Menu.Explore = Opna &möppu Menu.ExploreAll = Opna m&öppu Allir notendur Menu.MenuSettings = Stillingar @@ -2548,6 +2565,7 @@ Menu.SearchPeople = &Contatti... Menu.SortByName = Or&dina per nome Menu.Open = &Apri Menu.OpenAll = Apri &cartella Utenti +Menu.OpenPinned = Apri gli elementi appuntati Menu.Explore = &Esplora Menu.ExploreAll = Esplora cartella &Utenti Menu.MenuSettings = Impostazioni @@ -2684,6 +2702,7 @@ Menu.SearchPeople = 人(&P)... Menu.SortByName = 名前順で並べ替え(&B) Menu.Open = 開く(&O) Menu.OpenAll = 開く - All Users(&P) +Menu.OpenPinned = 開く - Pinned Menu.Explore = エクスプローラー(&E) Menu.ExploreAll = エクスプローラー - All Users(&X) Menu.MenuSettings = 設定 @@ -2820,6 +2839,7 @@ Menu.SearchPeople = 사람 찾기(&P)... Menu.SortByName = 이름순 정렬(&B) Menu.Open = 열기(&O) Menu.OpenAll = 열기 - All Users(&P) +Menu.OpenPinned = 열기 - Pinned Menu.Explore = 탐색(&E) Menu.ExploreAll = 탐색 - All Users(&X) Menu.MenuSettings = 설정 @@ -2956,6 +2976,7 @@ Menu.SearchPeople = &Asmenims... Menu.SortByName = &Rūšiuoti pagal vardus Menu.Open = &Atidaryti Menu.OpenAll = A&tidaryti aplanką Visi vartotojai +Menu.OpenPinned = Atidaryti prisegtus elementus Menu.Explore = Naršyt&i Menu.ExploreAll = Na&ršyti visus vartotojus Menu.MenuSettings = Parametrai @@ -3092,6 +3113,7 @@ Menu.SearchPeople = &Personām... Menu.SortByName = &Kārtot pēc nosaukuma Menu.Open = A&tvērt Menu.OpenAll = &Atvērt visus lietotājus +Menu.OpenPinned = Atvērt piespraustos vienumus Menu.Explore = &Pārlūkot Menu.ExploreAll = Pār&lūkot visus lietotājus Menu.MenuSettings = Iestatījumi @@ -3228,6 +3250,7 @@ Menu.SearchPeople = За луѓе... Menu.SortByName = Сортирај по име Menu.Open = Отвори Menu.OpenAll = Отвори "Сите корисници" +Menu.OpenPinned = Отворете закачени ставки Menu.Explore = Преглед Menu.ExploreAll = Преглед на "Сите корисници" Menu.MenuSettings = Подесувања @@ -3364,6 +3387,7 @@ Menu.SearchPeople = Etter &personer... Menu.SortByName = Sorter etter &navn Menu.Open = Å&pne Menu.OpenAll = &Åpne mappen All users +Menu.OpenPinned = Åpne festede elementer Menu.Explore = &Utforsk Menu.ExploreAll = Utforsk &mappen All users Menu.MenuSettings = Innstillinger @@ -3500,6 +3524,7 @@ Menu.SearchPeople = &Personen... Menu.SortByName = S&orteren op naam Menu.Open = &Openen Menu.OpenAll = &Alle gebruikers weergeven +Menu.OpenPinned = Open vastgezette items Menu.Explore = Ve&rkennen Menu.ExploreAll = Alle &gebruikers verkennen Menu.MenuSettings = Instellingen @@ -3636,6 +3661,7 @@ Menu.SearchPeople = &Do osób... Menu.SortByName = Sortuj w&edług nazw Menu.Open = &Otwórz Menu.OpenAll = Otwórz &wszystkich użytkowników +Menu.OpenPinned = Otwórz przypięte elementy Menu.Explore = &Eksploruj Menu.ExploreAll = E&ksploruj wszystkich użytkowników Menu.MenuSettings = Ustawienia @@ -3772,6 +3798,7 @@ Menu.SearchPeople = Para &Pessoas... Menu.SortByName = C&lassificar por nome Menu.Open = &Abrir Menu.OpenAll = A&brir a pasta All Users +Menu.OpenPinned = Abrir itens fixados Menu.Explore = E&xplorar Menu.ExploreAll = Expl&orar a pasta All Users Menu.MenuSettings = Configurações @@ -3908,6 +3935,7 @@ Menu.SearchPeople = &Pessoas... Menu.SortByName = Ordenar pelo &nome Menu.Open = &Abrir Menu.OpenAll = A&brir All Users +Menu.OpenPinned = Abrir os itens fixados Menu.Explore = E&xplorar Menu.ExploreAll = Explorar All &Users Menu.MenuSettings = Definições @@ -4044,6 +4072,7 @@ Menu.SearchPeople = &Persoane... Menu.SortByName = &Sortare după nume Menu.Open = &Deschidere Menu.OpenAll = Desc&hidere Toți utilizatorii +Menu.OpenPinned = Deschideți elementele fixate Menu.Explore = &Explorare Menu.ExploreAll = E&xplorare Toți utilizatorii Menu.MenuSettings = Setări @@ -4180,6 +4209,7 @@ Menu.SearchPeople = &Людей... Menu.SortByName = &Сортировать по имени Menu.Open = &Открыть Menu.OpenAll = Открыть о&бщее для всех меню +Menu.OpenPinned = Open Pinned Menu.Explore = &Проводник Menu.ExploreAll = Проводни&к в общее для всех меню Menu.MenuSettings = Настройка @@ -4316,6 +4346,7 @@ Menu.SearchPeople = Ľu&dia... Menu.SortByName = &Usporiadať podľa názvov Menu.Open = &Otvoriť Menu.OpenAll = Ot&voriť profil All Users +Menu.OpenPinned = Otvoriť Pinned Menu.Explore = &Preskúmať Menu.ExploreAll = P&reskúmať profil All Users Menu.MenuSettings = Nastavenie @@ -4452,6 +4483,7 @@ Menu.SearchPeople = &Za osebe ... Menu.SortByName = &Razvrsti po imenih Menu.Open = &Odpri Menu.OpenAll = O&dpri mapo »All users« +Menu.OpenPinned = Odpri »Pinned« Menu.Explore = R&azišči Menu.ExploreAll = &Razišči mapo »All users« Menu.MenuSettings = Nastavitve @@ -4588,6 +4620,7 @@ Menu.SearchPeople = &Za osobe... Menu.SortByName = &Sortiraj po imenu Menu.Open = &Otvori Menu.OpenAll = O&tvori sve korisnike +Menu.OpenPinned = Otvori dodato Menu.Explore = &Istraži Menu.ExploreAll = Istraži sve &korisnike Menu.MenuSettings = Postavke @@ -4724,6 +4757,7 @@ Menu.SearchPeople = Efter &personer... Menu.SortByName = Sortera efter &namn Menu.Open = &Öppna Menu.OpenAll = Öppna &delade Start-menyn +Menu.OpenPinned = Öppna fästa objekt Menu.Explore = &Utforska Menu.ExploreAll = Utf&orska delade Start-menyn Menu.MenuSettings = Inställningar @@ -4861,6 +4895,7 @@ Menu.SearchPeople = สำหรับ&บุคคล... Menu.SortByName = เรียงลำดั&บตามชื่อ Menu.Open = เ&ปิด Menu.OpenAll = &เปิดโฟลเดอร์ All Users +Menu.OpenPinned = เ&ปิด Pinned Menu.Explore = สำรว&จ Menu.ExploreAll = &สำรวจโฟลเดอร์ All Users Menu.MenuSettings = การตั้งค่า @@ -4997,6 +5032,7 @@ Menu.SearchPeople = &Kişiler... Menu.SortByName = A&da Göre Sırala Menu.Open = &Aç Menu.OpenAll = Tü&m Kullanıcıları Aç +Menu.OpenPinned = Sabitlenmiş öğeleri Aç Menu.Explore = A&raştır Menu.ExploreAll = &Tüm Kullanıcıları Araştır Menu.MenuSettings = Ayarlar @@ -5133,6 +5169,7 @@ Menu.SearchPeople = Л&юдей... Menu.SortByName = Сортувати за &іменем Menu.Open = &Відкрити Menu.OpenAll = В&ідкрити спільне для всіх меню +Menu.OpenPinned = Open Pinned Menu.Explore = &Провідник Menu.ExploreAll = Пр&овідник до спільного для всіх меню Menu.MenuSettings = Настройки @@ -5269,6 +5306,7 @@ Menu.SearchPeople = 个人(&P)... Menu.SortByName = 按名称排序(&B) Menu.Open = 打开(&O) Menu.OpenAll = 打开所有用户(&P) +Menu.OpenPinned = Open Pinned Menu.Explore = 浏览(&E) Menu.ExploreAll = 浏览所有用户(&X) Menu.MenuSettings = 设置 @@ -5405,6 +5443,7 @@ Menu.SearchPeople = 人員(&P)... Menu.SortByName = 依名稱排序(&B) Menu.Open = 開啟(&O) Menu.OpenAll = 開啟所有使用者(&P) +Menu.OpenPinned = Open Pinned Menu.Explore = 檔案總管(&E) Menu.ExploreAll = 瀏覽所有使用者(&X) Menu.MenuSettings = 設定 @@ -5541,6 +5580,7 @@ Menu.SearchPeople = 人員(&P)... Menu.SortByName = 依名稱排序(&B) Menu.Open = 開啟(&O) Menu.OpenAll = 開啟所有使用者(&P) +Menu.OpenPinned = Open Pinned Menu.Explore = 檔案總管(&E) Menu.ExploreAll = 瀏覽所有使用者(&X) Menu.MenuSettings = 設定 From 055ac870390bfbafafaf8b62855e771a677db69e Mon Sep 17 00:00:00 2001 From: ge0rdi Date: Sat, 4 Jan 2025 09:47:32 +0100 Subject: [PATCH 16/39] Fix modern settings on Win11 24H2+ (#2091) --- .../StartMenuHelper/ModernSettings.cpp | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/Src/StartMenu/StartMenuHelper/ModernSettings.cpp b/Src/StartMenu/StartMenuHelper/ModernSettings.cpp index a177340e5..5e6232427 100644 --- a/Src/StartMenu/StartMenuHelper/ModernSettings.cpp +++ b/Src/StartMenu/StartMenuHelper/ModernSettings.cpp @@ -274,15 +274,30 @@ static void ParseApplicationInformation(CComPtr& parent, AttributeW } } +static void ParseSettingIDs(CComPtr& node, AttributeWriter& writer) +{ + writer.addString(Id::PageId, GetTranslatedString(node, L"PageID")); + writer.addString(Id::HostId, GetTranslatedString(node, L"HostID")); + writer.addString(Id::GroupId, GetTranslatedString(node, L"GroupID")); + writer.addString(Id::SettingId, GetTranslatedString(node, L"SettingID")); +} + +static void ParseSettingPaths(CComPtr& parent, AttributeWriter& writer) +{ + CComPtr node; + if (parent->selectSingleNode(CComBSTR(L"SettingPaths/Path"), &node) == S_OK) + ParseSettingIDs(node, writer); +} + static void ParseSettingIdentity(CComPtr& parent, AttributeWriter& writer) { CComPtr node; if (parent->selectSingleNode(CComBSTR(L"SettingIdentity"), &node) == S_OK) { - writer.addString(Id::PageId, GetTranslatedString(node, L"PageID")); - writer.addString(Id::HostId, GetTranslatedString(node, L"HostID")); - writer.addString(Id::GroupId, GetTranslatedString(node, L"GroupID")); - writer.addString(Id::SettingId, GetTranslatedString(node, L"SettingID")); + // Win11 24H2+ + ParseSettingPaths(node, writer); + // older + ParseSettingIDs(node, writer); } } From 552fbd8296edfcb239d076a5b8d7b0b39de2a299 Mon Sep 17 00:00:00 2001 From: ge0rdi Date: Sat, 4 Jan 2025 16:10:52 +0100 Subject: [PATCH 17/39] Set position of tray buttons on primary taskbar only It seems that secondary taskbars handle try button positioning correctly. So there is no need for this workaround. Original change was introduced in 674a486 due to #1232 issue. --- Src/StartMenu/StartMenuDLL/StartMenuDLL.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/Src/StartMenu/StartMenuDLL/StartMenuDLL.cpp b/Src/StartMenu/StartMenuDLL/StartMenuDLL.cpp index 0cfcdee7b..5022f67f0 100644 --- a/Src/StartMenu/StartMenuDLL/StartMenuDLL.cpp +++ b/Src/StartMenu/StartMenuDLL/StartMenuDLL.cpp @@ -3179,11 +3179,14 @@ static void RecreateStartButton( size_t taskbarId ) RECT rcTask; GetWindowRect(taskBar.taskBar,&rcTask); PostMessage(taskBar.taskBar,WM_SIZE,SIZE_RESTORED,MAKELONG(rcTask.right-rcTask.left,rcTask.bottom-rcTask.top)); - for (auto btn : taskBar.trayButtons) + if (taskBar.taskBar==g_TaskBar) { - RECT rc; - GetWindowRect(btn,&rc); - SetWindowPos(btn,HWND_TOP,rc.left,rc.top,0,0,SWP_NOSIZE|SWP_NOACTIVATE|SWP_NOZORDER); + for (auto btn : taskBar.trayButtons) + { + RECT rc; + GetWindowRect(btn,&rc); + SetWindowPos(btn,HWND_TOP,rc.left,rc.top,0,0,SWP_NOSIZE|SWP_NOACTIVATE|SWP_NOZORDER); + } } } } From faf79de4d558f23b0493a96f0b23e83e80d25ee2 Mon Sep 17 00:00:00 2001 From: ge0rdi Date: Sat, 4 Jan 2025 16:10:52 +0100 Subject: [PATCH 18/39] Fix custom button position on auto-hiding taskbar Fixes #2067. --- Src/StartMenu/StartMenuDLL/StartMenuDLL.cpp | 22 ++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/Src/StartMenu/StartMenuDLL/StartMenuDLL.cpp b/Src/StartMenu/StartMenuDLL/StartMenuDLL.cpp index 5022f67f0..1a3c64db0 100644 --- a/Src/StartMenu/StartMenuDLL/StartMenuDLL.cpp +++ b/Src/StartMenu/StartMenuDLL/StartMenuDLL.cpp @@ -1216,6 +1216,19 @@ void EnableHotkeys( THotkeys enable ) } } +bool IsTouchTaskbar(void) +{ + if (!IsWin11()) + return false; + + CRegKey regKey; + if (regKey.Open(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer") != ERROR_SUCCESS) + return false; + + DWORD val; + return regKey.QueryDWORDValue(L"TabletPostureTaskbar", val) == ERROR_SUCCESS && val; +} + static void UpdateStartButtonPosition(const TaskbarInfo* taskBar, const WINDOWPOS* pPos) { if (IsStartButtonSmallIcons(taskBar->taskbarId) != IsTaskbarSmallIcons()) @@ -1223,10 +1236,13 @@ static void UpdateStartButtonPosition(const TaskbarInfo* taskBar, const WINDOWPO RECT rcTask; GetWindowRect(taskBar->taskBar, &rcTask); - if (RECT rc; GetWindowRgnBox(taskBar->taskBar, &rc) != ERROR) + if (IsTouchTaskbar()) { - MapWindowPoints(taskBar->taskBar, NULL, (POINT*)&rc, 2); - rcTask = rc; + if (RECT rc; GetWindowRgnBox(taskBar->taskBar, &rc) != ERROR) + { + MapWindowPoints(taskBar->taskBar, NULL, (POINT*)&rc, 2); + rcTask = rc; + } } MONITORINFO info; UINT uEdge = GetTaskbarPosition(taskBar->taskBar, &info, NULL, NULL); From f22f10c7d5e516bd51b2cf891df225fbf3eceb3b Mon Sep 17 00:00:00 2001 From: ge0rdi Date: Sat, 4 Jan 2025 16:10:52 +0100 Subject: [PATCH 19/39] Apply taskbar customizations to News and interests Fixes #676 --- Src/StartMenu/StartMenuDLL/StartMenuDLL.cpp | 5 +++++ Src/StartMenu/StartMenuDLL/StartMenuDLL.h | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Src/StartMenu/StartMenuDLL/StartMenuDLL.cpp b/Src/StartMenu/StartMenuDLL/StartMenuDLL.cpp index 1a3c64db0..7cf742a2c 100644 --- a/Src/StartMenu/StartMenuDLL/StartMenuDLL.cpp +++ b/Src/StartMenu/StartMenuDLL/StartMenuDLL.cpp @@ -3106,6 +3106,9 @@ static void InitStartMenuDLL( void ) taskBar.chevron=FindWindowEx(tray,NULL,L"Button",NULL); if (taskBar.chevron) SetWindowSubclass(taskBar.chevron,SubclassTrayChevronProc,'CLSH',taskBar.taskbarId); + taskBar.news=FindWindowEx(g_TaskBar,NULL,L"DynamicContent2",NULL); + if (taskBar.news) + SetWindowSubclass(taskBar.news,SubclassTrayChevronProc,'CLSH',taskBar.taskbarId); } HandleTaskbarParts(taskBar,true); @@ -3295,6 +3298,8 @@ if (!g_bTrimHooks) } if (it->second.chevron) RemoveWindowSubclass(it->second.chevron,SubclassTrayChevronProc,'CLSH'); + if (it->second.news) + RemoveWindowSubclass(it->second.news,SubclassTrayChevronProc,'CLSH'); if (it->second.desktop) RemoveWindowSubclass(it->second.desktop,SubclassDesktopButtonProc,'CLSH'); if (it->second.bTimer) diff --git a/Src/StartMenu/StartMenuDLL/StartMenuDLL.h b/Src/StartMenu/StartMenuDLL/StartMenuDLL.h index fb27b980a..456a88475 100644 --- a/Src/StartMenu/StartMenuDLL/StartMenuDLL.h +++ b/Src/StartMenu/StartMenuDLL/StartMenuDLL.h @@ -47,7 +47,7 @@ void EnableStartTooltip( bool bEnable ); struct TaskbarInfo { - TaskbarInfo( void ) { taskbarId=pointerId=0; taskBar=startButton=oldButton=rebar=taskList=chevron=desktop=NULL; startButtonSize.cx=startButtonSize.cy=0; oldButtonSize.cx=oldButtonSize.cy=0; bTimer=bCustomLook=bReplaceButton=bHideButton=bRecreatingButton=bThemeChanging=false; } + TaskbarInfo( void ) { taskbarId=pointerId=0; taskBar=startButton=oldButton=rebar=taskList=chevron=news=desktop=NULL; startButtonSize.cx=startButtonSize.cy=0; oldButtonSize.cx=oldButtonSize.cy=0; bTimer=bCustomLook=bReplaceButton=bHideButton=bRecreatingButton=bThemeChanging=false; } int taskbarId; HWND taskBar; HWND startButton; // either own start button or the win7 start button (depending on bReplaceButton) @@ -55,6 +55,7 @@ struct TaskbarInfo HWND rebar; HWND taskList; HWND chevron; + HWND news; HWND desktop; SIZE startButtonSize; SIZE oldButtonSize; From a280fa92e1ffc0d77b6cd60f0bc0645b205c1fdb Mon Sep 17 00:00:00 2001 From: vodek3 Date: Mon, 13 Jan 2025 09:01:26 +0300 Subject: [PATCH 20/39] Update StartMenuL10N.ini (#2103) --- Src/StartMenu/StartMenuL10N.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Src/StartMenu/StartMenuL10N.ini b/Src/StartMenu/StartMenuL10N.ini index b39d674aa..8c915b8e4 100644 --- a/Src/StartMenu/StartMenuL10N.ini +++ b/Src/StartMenu/StartMenuL10N.ini @@ -4209,7 +4209,7 @@ Menu.SearchPeople = &Людей... Menu.SortByName = &Сортировать по имени Menu.Open = &Открыть Menu.OpenAll = Открыть о&бщее для всех меню -Menu.OpenPinned = Open Pinned +Menu.OpenPinned = Открыть папку "Pinned" Menu.Explore = &Проводник Menu.ExploreAll = Проводни&к в общее для всех меню Menu.MenuSettings = Настройка From 58d804d22a77428df83f1db26a9417d2b460cd25 Mon Sep 17 00:00:00 2001 From: ge0rdi Date: Sun, 2 Mar 2025 11:18:32 +0100 Subject: [PATCH 21/39] Remove obsolete links from help Fixes #2148 --- Src/Localization/English/Links.html | 16 ++++------------ Src/Localization/English/OpenShellReadme.rtf | 5 +---- 2 files changed, 5 insertions(+), 16 deletions(-) diff --git a/Src/Localization/English/Links.html b/Src/Localization/English/Links.html index ffc0e90ce..589bcc149 100644 --- a/Src/Localization/English/Links.html +++ b/Src/Localization/English/Links.html @@ -24,23 +24,15 @@ Open-Shell website

  Links


The latest version can be found on the Open-Shell website:
https://github.com/Open-Shell/Open-Shell-Menu/releases/latest/
-
-View the project history here:
-History: https://coddec.github.io/Classic-Shell/www.classicshell.net/history/
-
-
-

Get Help

-For answers to frequently asked questions look here:
-FAQ: https://coddec.github.io/Classic-Shell/www.classicshell.net/faq/

-If you don't find your answer in the FAQ, try the discussion forums:
-Discussion Forums: https://github.com/Open-Shell/Open-Shell-Menu/discussions
+

Get Help

+Discussion forums:
+https://github.com/Open-Shell/Open-Shell-Menu/discussions
-

Report a Problem

Report bugs and feature requests in the development forums:
-Development Forums: https://github.com/Open-Shell/Open-Shell-Menu/issues
+https://github.com/Open-Shell/Open-Shell-Menu/issues
diff --git a/Src/Localization/English/OpenShellReadme.rtf b/Src/Localization/English/OpenShellReadme.rtf index 6ea6608cd..7435293bc 100644 --- a/Src/Localization/English/OpenShellReadme.rtf +++ b/Src/Localization/English/OpenShellReadme.rtf @@ -9,10 +9,7 @@ The latest version can be found on the Open-Shell website:\par {{\field{\*\fldinst{HYPERLINK https://github.com/Open-Shell/Open-Shell-Menu }}{\fldrslt{https://github.com/Open-Shell/Open-Shell-Menu\ul0\cf0}}}}\f1\fs22\par \par -For answers to frequently asked questions look here:\par -{{\field{\*\fldinst{HYPERLINK https://coddec.github.io/Classic-Shell/www.classicshell.net/faq/ }}{\fldrslt{https://coddec.github.io/Classic-Shell/www.classicshell.net/faq/\ul0\cf0}}}}\f1\fs22\par -\par -Or use the discussion forums to get help:\par +Use the discussion forums to get help:\par {{\field{\*\fldinst{HYPERLINK https://github.com/Open-Shell/Open-Shell-Menu/discussions }}{\fldrslt{https://github.com/Open-Shell/Open-Shell-Menu/discussions\ul0\cf0}}}}\f1\fs22\par \par Report problems in the Open-Shell development forums:\par From d5c561720d9e8c997b966cd997681e4726f476d9 Mon Sep 17 00:00:00 2001 From: ge0rdi Date: Sun, 19 Jan 2025 10:55:36 +0100 Subject: [PATCH 22/39] [ExplorerPatcher] Fix taskbar texturing Fixes #2094. --- Src/StartMenu/StartMenuDLL/StartMenuDLL.cpp | 28 +++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/Src/StartMenu/StartMenuDLL/StartMenuDLL.cpp b/Src/StartMenu/StartMenuDLL/StartMenuDLL.cpp index 7cf742a2c..a1f55e333 100644 --- a/Src/StartMenu/StartMenuDLL/StartMenuDLL.cpp +++ b/Src/StartMenu/StartMenuDLL/StartMenuDLL.cpp @@ -67,6 +67,8 @@ static SIZE g_TaskbarTextureSize; static TTaskbarTile g_TaskbarTileH, g_TaskbarTileV; static RECT g_TaskbarMargins; int g_CurrentCSMTaskbar=-1, g_CurrentWSMTaskbar=-1; +// ExplorerPatcher taskbar +static bool g_epTaskbar = false; static void FindWindowsMenu( void ); static void RecreateStartButton( size_t taskbarId ); @@ -2772,6 +2774,17 @@ static void WINAPI SHFillRectClr2( HDC hdc, const RECT *pRect, COLORREF color ) g_SHFillRectClr(hdc,pRect,color); } +static IatHookData* g_ExtTextOutWHook = nullptr; + +// used by ExplorerPatcher's custom implementation of `SHFillRectClr` +static BOOL WINAPI ExtTextOutW2(HDC hdc, int X, int Y, UINT fuOptions, const RECT* lprc, LPCWSTR lpString, UINT cbCount, const INT* lpDx) +{ + if (fuOptions != ETO_OPAQUE || lpString || cbCount || lpDx || !g_CurrentTaskList || !g_TaskbarTexture || GetCurrentThreadId() != g_TaskbarThreadId) + return ExtTextOutW(hdc, X, Y, fuOptions, lprc, lpString, cbCount, lpDx); + + return FALSE; +} + static HRESULT STDAPICALLTYPE DrawThemeBackground2( HTHEME hTheme, HDC hdc, int iPartId, int iStateId, LPCRECT pRect, LPCRECT pClipRect ) { if (g_CurrentTaskList && g_TaskbarTexture && iPartId==1 && iStateId==0 && GetCurrentThreadId()==g_TaskbarThreadId) @@ -2956,6 +2969,15 @@ static void InitStartMenuDLL( void ) if (GetSettingBool(L"CustomTaskbar")) { auto module=GetModuleHandle(L"taskbar.dll"); + if (!module) + { + module = GetModuleHandle(L"ep_taskbar.5.dll"); + if (!module) + module = GetModuleHandle(L"ep_taskbar.2.dll"); + + if (module) + g_epTaskbar = true; + } if (!module) module=GetModuleHandle(NULL); @@ -2975,6 +2997,10 @@ static void InitStartMenuDLL( void ) g_StretchDIBitsHook=SetIatHook(module,"gdi32.dll","StretchDIBits",StretchDIBits2); if (!g_StretchDIBitsHook) g_StretchDIBitsHook=SetIatHook(module,"ext-ms-win-gdi-draw-l1-1-0.dll","StretchDIBits",StretchDIBits2); + + // ExplorerPatcher compatibility + if (g_epTaskbar) + g_ExtTextOutWHook = SetIatHook(module, "gdi32.dll", "ExtTextOutW", ExtTextOutW2); } { @@ -3230,6 +3256,8 @@ static void CleanStartMenuDLL( void ) g_SHFillRectClrHook=NULL; ClearIatHook(g_StretchDIBitsHook); g_StretchDIBitsHook=NULL; + ClearIatHook(g_ExtTextOutWHook); + g_ExtTextOutWHook = NULL; ClearIatHook(g_DrawThemeBackgroundHook); g_DrawThemeBackgroundHook=NULL; From 4943938d0f562d87874fcc1852f8aaba09ff378e Mon Sep 17 00:00:00 2001 From: ge0rdi Date: Sun, 19 Jan 2025 10:56:38 +0100 Subject: [PATCH 23/39] [ExplorerPatcher] Don't shift custom start button on Win11 --- Src/StartMenu/StartMenuDLL/StartMenuDLL.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Src/StartMenu/StartMenuDLL/StartMenuDLL.cpp b/Src/StartMenu/StartMenuDLL/StartMenuDLL.cpp index a1f55e333..a660d0c94 100644 --- a/Src/StartMenu/StartMenuDLL/StartMenuDLL.cpp +++ b/Src/StartMenu/StartMenuDLL/StartMenuDLL.cpp @@ -1344,7 +1344,7 @@ static void UpdateStartButtonPosition(const TaskbarInfo* taskBar, const WINDOWPO // Start button on Win11 is a bit shifted to the right // We will shift our Aero button to cover original button - if (IsWin11() && (x == info.rcMonitor.left) && (GetStartButtonType() == START_BUTTON_AERO)) + if (IsWin11() && (x == info.rcMonitor.left) && (GetStartButtonType() == START_BUTTON_AERO) && !g_epTaskbar) x += ScaleForDpi(taskBar->taskBar, 6); } From 146c27ecd2aa78ef8e712cef7642b2e19289d19f Mon Sep 17 00:00:00 2001 From: ge0rdi Date: Sun, 19 Jan 2025 11:00:31 +0100 Subject: [PATCH 24/39] Fix tray button positioning --- Src/StartMenu/StartMenuDLL/StartMenuDLL.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Src/StartMenu/StartMenuDLL/StartMenuDLL.cpp b/Src/StartMenu/StartMenuDLL/StartMenuDLL.cpp index a660d0c94..9f26f2284 100644 --- a/Src/StartMenu/StartMenuDLL/StartMenuDLL.cpp +++ b/Src/StartMenu/StartMenuDLL/StartMenuDLL.cpp @@ -3230,6 +3230,7 @@ static void RecreateStartButton( size_t taskbarId ) { RECT rc; GetWindowRect(btn,&rc); + MapWindowPoints(NULL,taskBar.taskBar,(POINT*)&rc,2); // convert to taskbar coordinates SetWindowPos(btn,HWND_TOP,rc.left,rc.top,0,0,SWP_NOSIZE|SWP_NOACTIVATE|SWP_NOZORDER); } } From 58b909037ff3b34755a4e813c749f8f46be6f37d Mon Sep 17 00:00:00 2001 From: Matthijs Lavrijsen Date: Thu, 8 May 2025 10:14:56 +0200 Subject: [PATCH 25/39] Add ARM64 support (#641) * Add ARM64 build configurations to projects * StartMenu: add ARM64 support * Add support for IAT hooking on ARM64 * Add ARM64 support to Classic IE * Add ARM64 support to installer NB: WiX 3.14.0.3910 or higher is required to create the MSI * Revert whitespace change * Separate x86/x64 and ARM64 installers * Change suffix of ARM64 binaries * Put also ARM64 MSI to final installer * Fix sln * Build some DLLs as ARM64X These are meant to be loaded to both x64 and ARM64 processes. We will compile them as ARM64X (when building for ARM64). That way they will contain both x64 and ARM64 code paths. https://learn.microsoft.com/en-us/windows/arm/arm64x-pe * Make sure x64 installer cannot be installed on ARM64 In case if somebody manually tries to install x64 MSI on ARM64. This is not supported/working scenario. --------- Co-authored-by: ge0rdi --- .gitignore | 3 + Src/ClassicExplorer/ClassicExplorer.vcxproj | 31 ++++ .../ClassicExplorer.vcxproj.filters | 2 +- Src/ClassicIE/ClassicIE.vcxproj | 15 ++ .../ClassicIEDLL/ClassicIEDLL.vcxproj | 31 ++++ .../ClassicIEDLL/ClassicIEDLL.vcxproj.filters | 2 +- Src/Common.props | 8 + Src/Lib/IatHookHelper.cpp | 7 +- Src/Lib/IatHookHelper.h | 4 + Src/Lib/Lib.vcxproj | 19 +++ .../English/OpenShellText-en-US.wxl | 1 + Src/OpenShell.sln | 161 ++++++++++++++++++ Src/Setup/BuildBinaries.bat | 47 ++++- Src/Setup/BuildInstaller.bat | 22 ++- Src/Setup/Setup.cpp | 140 ++++++++++++--- Src/Setup/Setup.rc | 3 +- Src/Setup/Setup.vcxproj | 1 + Src/Setup/Setup.vcxproj.filters | 1 + Src/Setup/Setup.wxs | 43 ++++- Src/Setup/Utility/Utility.cpp | 78 ++++++++- Src/Setup/Utility/Utility.vcxproj | 9 + Src/Setup/resource.h | 1 + Src/StartMenu/StartMenu.vcxproj | 12 ++ .../StartMenuDLL/StartMenuDLL.vcxproj | 12 ++ .../StartMenuHelper/StartMenuHelper.vcxproj | 31 ++++ 25 files changed, 636 insertions(+), 48 deletions(-) diff --git a/.gitignore b/.gitignore index 283a3da2e..75591d3db 100644 --- a/.gitignore +++ b/.gitignore @@ -20,12 +20,15 @@ # Build results [Dd]ebug/ [Dd]ebug64/ +[Dd]ebugARM64/ [Dd]ebugPublic/ [Rr]elease/ [Rr]elease64/ +[Rr]eleaseARM64/ [Rr]eleases/ x64/ x86/ +ARM64/ bld/ [Bb]in/ [Oo]bj/ diff --git a/Src/ClassicExplorer/ClassicExplorer.vcxproj b/Src/ClassicExplorer/ClassicExplorer.vcxproj index 4280d8376..2ec90585b 100644 --- a/Src/ClassicExplorer/ClassicExplorer.vcxproj +++ b/Src/ClassicExplorer/ClassicExplorer.vcxproj @@ -1,6 +1,14 @@ + + Debug + ARM64 + + + Debug + ARM64EC + Debug Win32 @@ -9,6 +17,14 @@ Debug x64 + + Release + ARM64 + + + Release + ARM64EC + Release Win32 @@ -17,6 +33,14 @@ Release x64 + + Setup + ARM64 + + + Setup + ARM64EC + Setup Win32 @@ -53,6 +77,13 @@ $(ProjectName)64 + + $(ProjectName)64 + + + $(ProjectName)64 + true + true diff --git a/Src/ClassicExplorer/ClassicExplorer.vcxproj.filters b/Src/ClassicExplorer/ClassicExplorer.vcxproj.filters index 3b72d121a..419ebce35 100644 --- a/Src/ClassicExplorer/ClassicExplorer.vcxproj.filters +++ b/Src/ClassicExplorer/ClassicExplorer.vcxproj.filters @@ -146,4 +146,4 @@ Resource Files - + \ No newline at end of file diff --git a/Src/ClassicIE/ClassicIE.vcxproj b/Src/ClassicIE/ClassicIE.vcxproj index 4a5b9a4b4..83f8308ba 100644 --- a/Src/ClassicIE/ClassicIE.vcxproj +++ b/Src/ClassicIE/ClassicIE.vcxproj @@ -1,6 +1,10 @@ + + Debug + ARM64 + Debug Win32 @@ -9,6 +13,10 @@ Debug x64 + + Release + ARM64 + Release Win32 @@ -17,6 +25,10 @@ Release x64 + + Setup + ARM64 + Setup Win32 @@ -53,6 +65,9 @@ $(ProjectName)_64 + + $(ProjectName)_64 + NotUsing diff --git a/Src/ClassicIE/ClassicIEDLL/ClassicIEDLL.vcxproj b/Src/ClassicIE/ClassicIEDLL/ClassicIEDLL.vcxproj index 57068dd0c..10ea42734 100644 --- a/Src/ClassicIE/ClassicIEDLL/ClassicIEDLL.vcxproj +++ b/Src/ClassicIE/ClassicIEDLL/ClassicIEDLL.vcxproj @@ -1,6 +1,14 @@ + + Debug + ARM64 + + + Debug + ARM64EC + Debug Win32 @@ -9,6 +17,14 @@ Debug x64 + + Release + ARM64 + + + Release + ARM64EC + Release Win32 @@ -17,6 +33,14 @@ Release x64 + + Setup + ARM64 + + + Setup + ARM64EC + Setup Win32 @@ -53,6 +77,13 @@ $(ProjectName)_64 + + $(ProjectName)_64 + + + $(ProjectName)_64 + true + _USRDLL;CLASSICIEDLL_EXPORTS;%(PreprocessorDefinitions) diff --git a/Src/ClassicIE/ClassicIEDLL/ClassicIEDLL.vcxproj.filters b/Src/ClassicIE/ClassicIEDLL/ClassicIEDLL.vcxproj.filters index 8af204741..8f49852ad 100644 --- a/Src/ClassicIE/ClassicIEDLL/ClassicIEDLL.vcxproj.filters +++ b/Src/ClassicIE/ClassicIEDLL/ClassicIEDLL.vcxproj.filters @@ -98,4 +98,4 @@ Resource Files - + \ No newline at end of file diff --git a/Src/Common.props b/Src/Common.props index 62a42c9fe..2a0a2ceee 100644 --- a/Src/Common.props +++ b/Src/Common.props @@ -16,6 +16,14 @@ $(MSBuildThisFileDirectory)..\build\bin\$(Configuration)64\ $(MSBuildThisFileDirectory)..\build\obj\$(ProjectName)\$(Configuration)64\ + + $(MSBuildThisFileDirectory)..\build\bin\$(Configuration)ARM64\ + $(MSBuildThisFileDirectory)..\build\obj\$(ProjectName)\$(Configuration)ARM64\ + + + $(MSBuildThisFileDirectory)..\build\bin\$(Configuration)ARM64EC\ + $(MSBuildThisFileDirectory)..\build\obj\$(ProjectName)\$(Configuration)ARM64EC\ + diff --git a/Src/Lib/IatHookHelper.cpp b/Src/Lib/IatHookHelper.cpp index 4a34d315b..5305811ed 100644 --- a/Src/Lib/IatHookHelper.cpp +++ b/Src/Lib/IatHookHelper.cpp @@ -70,12 +70,17 @@ IatHookData *SetIatHook( IMAGE_DOS_HEADER *dosHeader, DWORD iatOffset, DWORD int { IatHookData *hook=g_IatHooks+g_IatHookCount; g_IatHookCount++; +#if defined(_M_AMD64) || defined(_M_IX86) hook->jump[0]=hook->jump[1]=0x90; // NOP hook->jump[2]=0xFF; hook->jump[3]=0x25; // JUMP -#ifdef _WIN64 +#if defined(_M_AMD64) hook->jumpOffs=0; #else hook->jumpOffs=(DWORD)(hook)+8; +#endif +#elif defined(_M_ARM64) + hook->jump[0]=0x48; hook->jump[1]=0x00; hook->jump[2]=0x00; hook->jump[3]=0x58; // LDR X8, newProc + hook->jump[4]=0x00; hook->jump[5]=0x01; hook->jump[6]=0x1F; hook->jump[7]=0xD6; // BR X8 #endif hook->newProc=newProc; hook->oldProc=(void*)thunk->u1.Function; diff --git a/Src/Lib/IatHookHelper.h b/Src/Lib/IatHookHelper.h index 2a4603f0d..d522bfbd7 100644 --- a/Src/Lib/IatHookHelper.h +++ b/Src/Lib/IatHookHelper.h @@ -6,8 +6,12 @@ struct IatHookData { +#if defined(_M_AMD64) || defined(_M_IX86) unsigned char jump[4]; // jump instruction 0x90, 0x90, 0xFF, 0x25 DWORD jumpOffs; // jump instruction offset +#elif defined(_M_ARM64) + unsigned char jump[8]; // LDR
, BR +#endif void *newProc; // the address of the new proc void *oldProc; // the address of the old proc IMAGE_THUNK_DATA *thunk; // the IAT thunk diff --git a/Src/Lib/Lib.vcxproj b/Src/Lib/Lib.vcxproj index 7d7c023ba..8c29ee77c 100644 --- a/Src/Lib/Lib.vcxproj +++ b/Src/Lib/Lib.vcxproj @@ -1,6 +1,14 @@ + + Debug + ARM64 + + + Debug + ARM64EC + Debug Win32 @@ -9,6 +17,14 @@ Debug x64 + + Release + ARM64 + + + Release + ARM64EC + Release Win32 @@ -42,6 +58,9 @@ $(IntDir) + + true + _LIB;%(PreprocessorDefinitions) diff --git a/Src/Localization/English/OpenShellText-en-US.wxl b/Src/Localization/English/OpenShellText-en-US.wxl index dd4bc0213..4a1941857 100644 --- a/Src/Localization/English/OpenShellText-en-US.wxl +++ b/Src/Localization/English/OpenShellText-en-US.wxl @@ -1,6 +1,7 @@ This installer is only for 32-bit version of Windows. For 64-bit Windows you need to run Setup64. + This installer is only for 64-bit version of Windows. For ARM64 Windows you need to run SetupARM64. Open-Shell requires Windows 7 or above. A newer version of [ProductName] is already installed. The setup will now exit. Classic Explorer diff --git a/Src/OpenShell.sln b/Src/OpenShell.sln index 192313d85..c53d1eb2f 100644 --- a/Src/OpenShell.sln +++ b/Src/OpenShell.sln @@ -72,337 +72,498 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Immersive7", "Skins\Immersi EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|ARM64 = Debug|ARM64 Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 + Release|ARM64 = Release|ARM64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 + Setup|ARM64 = Setup|ARM64 Setup|Win32 = Setup|Win32 Setup|x64 = Setup|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution + {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Debug|ARM64.Build.0 = Debug|ARM64 + {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Debug|ARM64.Deploy.0 = Debug|ARM64 {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Debug|Win32.ActiveCfg = Debug|Win32 {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Debug|Win32.Build.0 = Debug|Win32 {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Debug|x64.ActiveCfg = Debug|x64 {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Debug|x64.Build.0 = Debug|x64 + {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Release|ARM64.ActiveCfg = Release|ARM64 + {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Release|ARM64.Build.0 = Release|ARM64 + {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Release|ARM64.Deploy.0 = Release|ARM64 {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Release|Win32.ActiveCfg = Release|Win32 {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Release|Win32.Build.0 = Release|Win32 {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Release|x64.ActiveCfg = Release|x64 {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Release|x64.Build.0 = Release|x64 + {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Setup|ARM64.ActiveCfg = Setup|ARM64 + {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Setup|ARM64.Build.0 = Setup|ARM64 {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Setup|Win32.ActiveCfg = Setup|Win32 {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Setup|Win32.Build.0 = Setup|Win32 {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Setup|x64.ActiveCfg = Setup|x64 {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Setup|x64.Build.0 = Setup|x64 + {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Debug|ARM64.Build.0 = Debug|ARM64 + {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Debug|ARM64.Deploy.0 = Debug|ARM64 {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Debug|Win32.ActiveCfg = Debug|Win32 {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Debug|Win32.Build.0 = Debug|Win32 {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Debug|x64.ActiveCfg = Debug|x64 {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Debug|x64.Build.0 = Debug|x64 + {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Release|ARM64.ActiveCfg = Release|ARM64 + {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Release|ARM64.Build.0 = Release|ARM64 + {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Release|ARM64.Deploy.0 = Release|ARM64 {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Release|Win32.ActiveCfg = Release|Win32 {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Release|Win32.Build.0 = Release|Win32 {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Release|x64.ActiveCfg = Release|x64 {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Release|x64.Build.0 = Release|x64 + {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Setup|ARM64.ActiveCfg = Setup|ARM64 + {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Setup|ARM64.Build.0 = Setup|ARM64 {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Setup|Win32.ActiveCfg = Setup|Win32 {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Setup|Win32.Build.0 = Setup|Win32 {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Setup|x64.ActiveCfg = Setup|x64 {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Setup|x64.Build.0 = Setup|x64 + {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Debug|ARM64.Build.0 = Debug|ARM64 {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Debug|Win32.ActiveCfg = Debug|Win32 {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Debug|Win32.Build.0 = Debug|Win32 {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Debug|x64.ActiveCfg = Debug|x64 {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Debug|x64.Build.0 = Debug|x64 + {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Release|ARM64.ActiveCfg = Release|ARM64 + {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Release|ARM64.Build.0 = Release|ARM64 {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Release|Win32.ActiveCfg = Release|Win32 {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Release|Win32.Build.0 = Release|Win32 {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Release|x64.ActiveCfg = Release|x64 {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Release|x64.Build.0 = Release|x64 + {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Setup|ARM64.ActiveCfg = Setup|ARM64 + {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Setup|ARM64.Build.0 = Setup|ARM64 {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Setup|Win32.ActiveCfg = Setup|Win32 {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Setup|Win32.Build.0 = Setup|Win32 {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Setup|x64.ActiveCfg = Setup|x64 {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Setup|x64.Build.0 = Setup|x64 + {A4A4D3B1-24E7-401E-A37C-72141D7603DC}.Debug|ARM64.ActiveCfg = Debug|Win32 + {A4A4D3B1-24E7-401E-A37C-72141D7603DC}.Debug|ARM64.Build.0 = Debug|Win32 {A4A4D3B1-24E7-401E-A37C-72141D7603DC}.Debug|Win32.ActiveCfg = Debug|Win32 {A4A4D3B1-24E7-401E-A37C-72141D7603DC}.Debug|Win32.Build.0 = Debug|Win32 {A4A4D3B1-24E7-401E-A37C-72141D7603DC}.Debug|x64.ActiveCfg = Debug|Win32 + {A4A4D3B1-24E7-401E-A37C-72141D7603DC}.Debug|x64.Build.0 = Debug|Win32 + {A4A4D3B1-24E7-401E-A37C-72141D7603DC}.Release|ARM64.ActiveCfg = Release|Win32 + {A4A4D3B1-24E7-401E-A37C-72141D7603DC}.Release|ARM64.Build.0 = Release|Win32 {A4A4D3B1-24E7-401E-A37C-72141D7603DC}.Release|Win32.ActiveCfg = Release|Win32 {A4A4D3B1-24E7-401E-A37C-72141D7603DC}.Release|Win32.Build.0 = Release|Win32 {A4A4D3B1-24E7-401E-A37C-72141D7603DC}.Release|x64.ActiveCfg = Release|Win32 + {A4A4D3B1-24E7-401E-A37C-72141D7603DC}.Release|x64.Build.0 = Release|Win32 + {A4A4D3B1-24E7-401E-A37C-72141D7603DC}.Setup|ARM64.ActiveCfg = Release|Win32 {A4A4D3B1-24E7-401E-A37C-72141D7603DC}.Setup|Win32.ActiveCfg = Release|Win32 {A4A4D3B1-24E7-401E-A37C-72141D7603DC}.Setup|x64.ActiveCfg = Release|Win32 + {EA65FDDD-CB77-417F-8BB4-2F3ECB5B3E75}.Debug|ARM64.ActiveCfg = Resource|Win32 + {EA65FDDD-CB77-417F-8BB4-2F3ECB5B3E75}.Debug|ARM64.Build.0 = Resource|Win32 {EA65FDDD-CB77-417F-8BB4-2F3ECB5B3E75}.Debug|Win32.ActiveCfg = Resource|Win32 {EA65FDDD-CB77-417F-8BB4-2F3ECB5B3E75}.Debug|Win32.Build.0 = Resource|Win32 {EA65FDDD-CB77-417F-8BB4-2F3ECB5B3E75}.Debug|x64.ActiveCfg = Resource|Win32 {EA65FDDD-CB77-417F-8BB4-2F3ECB5B3E75}.Debug|x64.Build.0 = Resource|Win32 + {EA65FDDD-CB77-417F-8BB4-2F3ECB5B3E75}.Release|ARM64.ActiveCfg = Resource|Win32 + {EA65FDDD-CB77-417F-8BB4-2F3ECB5B3E75}.Release|ARM64.Build.0 = Resource|Win32 {EA65FDDD-CB77-417F-8BB4-2F3ECB5B3E75}.Release|Win32.ActiveCfg = Resource|Win32 {EA65FDDD-CB77-417F-8BB4-2F3ECB5B3E75}.Release|Win32.Build.0 = Resource|Win32 {EA65FDDD-CB77-417F-8BB4-2F3ECB5B3E75}.Release|x64.ActiveCfg = Resource|Win32 {EA65FDDD-CB77-417F-8BB4-2F3ECB5B3E75}.Release|x64.Build.0 = Resource|Win32 + {EA65FDDD-CB77-417F-8BB4-2F3ECB5B3E75}.Setup|ARM64.ActiveCfg = Resource|Win32 {EA65FDDD-CB77-417F-8BB4-2F3ECB5B3E75}.Setup|Win32.ActiveCfg = Resource|Win32 {EA65FDDD-CB77-417F-8BB4-2F3ECB5B3E75}.Setup|Win32.Build.0 = Resource|Win32 {EA65FDDD-CB77-417F-8BB4-2F3ECB5B3E75}.Setup|x64.ActiveCfg = Resource|Win32 + {404821C5-4EE4-4908-A759-5EF6DAC14AB6}.Debug|ARM64.ActiveCfg = Resource|Win32 + {404821C5-4EE4-4908-A759-5EF6DAC14AB6}.Debug|ARM64.Build.0 = Resource|Win32 {404821C5-4EE4-4908-A759-5EF6DAC14AB6}.Debug|Win32.ActiveCfg = Resource|Win32 {404821C5-4EE4-4908-A759-5EF6DAC14AB6}.Debug|Win32.Build.0 = Resource|Win32 {404821C5-4EE4-4908-A759-5EF6DAC14AB6}.Debug|x64.ActiveCfg = Resource|Win32 {404821C5-4EE4-4908-A759-5EF6DAC14AB6}.Debug|x64.Build.0 = Resource|Win32 + {404821C5-4EE4-4908-A759-5EF6DAC14AB6}.Release|ARM64.ActiveCfg = Resource|Win32 + {404821C5-4EE4-4908-A759-5EF6DAC14AB6}.Release|ARM64.Build.0 = Resource|Win32 {404821C5-4EE4-4908-A759-5EF6DAC14AB6}.Release|Win32.ActiveCfg = Resource|Win32 {404821C5-4EE4-4908-A759-5EF6DAC14AB6}.Release|Win32.Build.0 = Resource|Win32 {404821C5-4EE4-4908-A759-5EF6DAC14AB6}.Release|x64.ActiveCfg = Resource|Win32 {404821C5-4EE4-4908-A759-5EF6DAC14AB6}.Release|x64.Build.0 = Resource|Win32 + {404821C5-4EE4-4908-A759-5EF6DAC14AB6}.Setup|ARM64.ActiveCfg = Resource|Win32 {404821C5-4EE4-4908-A759-5EF6DAC14AB6}.Setup|Win32.ActiveCfg = Resource|Win32 {404821C5-4EE4-4908-A759-5EF6DAC14AB6}.Setup|Win32.Build.0 = Resource|Win32 {404821C5-4EE4-4908-A759-5EF6DAC14AB6}.Setup|x64.ActiveCfg = Resource|Win32 + {9EC23CA9-384A-4EEB-979E-69879DC1A78C}.Debug|ARM64.ActiveCfg = Resource|Win32 + {9EC23CA9-384A-4EEB-979E-69879DC1A78C}.Debug|ARM64.Build.0 = Resource|Win32 {9EC23CA9-384A-4EEB-979E-69879DC1A78C}.Debug|Win32.ActiveCfg = Resource|Win32 {9EC23CA9-384A-4EEB-979E-69879DC1A78C}.Debug|Win32.Build.0 = Resource|Win32 {9EC23CA9-384A-4EEB-979E-69879DC1A78C}.Debug|x64.ActiveCfg = Resource|Win32 {9EC23CA9-384A-4EEB-979E-69879DC1A78C}.Debug|x64.Build.0 = Resource|Win32 + {9EC23CA9-384A-4EEB-979E-69879DC1A78C}.Release|ARM64.ActiveCfg = Resource|Win32 + {9EC23CA9-384A-4EEB-979E-69879DC1A78C}.Release|ARM64.Build.0 = Resource|Win32 {9EC23CA9-384A-4EEB-979E-69879DC1A78C}.Release|Win32.ActiveCfg = Resource|Win32 {9EC23CA9-384A-4EEB-979E-69879DC1A78C}.Release|Win32.Build.0 = Resource|Win32 {9EC23CA9-384A-4EEB-979E-69879DC1A78C}.Release|x64.ActiveCfg = Resource|Win32 {9EC23CA9-384A-4EEB-979E-69879DC1A78C}.Release|x64.Build.0 = Resource|Win32 + {9EC23CA9-384A-4EEB-979E-69879DC1A78C}.Setup|ARM64.ActiveCfg = Resource|Win32 {9EC23CA9-384A-4EEB-979E-69879DC1A78C}.Setup|Win32.ActiveCfg = Resource|Win32 {9EC23CA9-384A-4EEB-979E-69879DC1A78C}.Setup|Win32.Build.0 = Resource|Win32 {9EC23CA9-384A-4EEB-979E-69879DC1A78C}.Setup|x64.ActiveCfg = Resource|Win32 + {066C9721-26D5-4C4D-868E-50C2BA0A8196}.Debug|ARM64.ActiveCfg = Resource|Win32 + {066C9721-26D5-4C4D-868E-50C2BA0A8196}.Debug|ARM64.Build.0 = Resource|Win32 {066C9721-26D5-4C4D-868E-50C2BA0A8196}.Debug|Win32.ActiveCfg = Resource|Win32 {066C9721-26D5-4C4D-868E-50C2BA0A8196}.Debug|Win32.Build.0 = Resource|Win32 {066C9721-26D5-4C4D-868E-50C2BA0A8196}.Debug|x64.ActiveCfg = Resource|Win32 {066C9721-26D5-4C4D-868E-50C2BA0A8196}.Debug|x64.Build.0 = Resource|Win32 + {066C9721-26D5-4C4D-868E-50C2BA0A8196}.Release|ARM64.ActiveCfg = Resource|Win32 + {066C9721-26D5-4C4D-868E-50C2BA0A8196}.Release|ARM64.Build.0 = Resource|Win32 {066C9721-26D5-4C4D-868E-50C2BA0A8196}.Release|Win32.ActiveCfg = Resource|Win32 {066C9721-26D5-4C4D-868E-50C2BA0A8196}.Release|Win32.Build.0 = Resource|Win32 {066C9721-26D5-4C4D-868E-50C2BA0A8196}.Release|x64.ActiveCfg = Resource|Win32 {066C9721-26D5-4C4D-868E-50C2BA0A8196}.Release|x64.Build.0 = Resource|Win32 + {066C9721-26D5-4C4D-868E-50C2BA0A8196}.Setup|ARM64.ActiveCfg = Resource|Win32 {066C9721-26D5-4C4D-868E-50C2BA0A8196}.Setup|Win32.ActiveCfg = Resource|Win32 {066C9721-26D5-4C4D-868E-50C2BA0A8196}.Setup|Win32.Build.0 = Resource|Win32 {066C9721-26D5-4C4D-868E-50C2BA0A8196}.Setup|x64.ActiveCfg = Resource|Win32 + {66D1EAA4-65D1-45CC-9989-E616FC0575EB}.Debug|ARM64.ActiveCfg = Resource|Win32 + {66D1EAA4-65D1-45CC-9989-E616FC0575EB}.Debug|ARM64.Build.0 = Resource|Win32 {66D1EAA4-65D1-45CC-9989-E616FC0575EB}.Debug|Win32.ActiveCfg = Resource|Win32 {66D1EAA4-65D1-45CC-9989-E616FC0575EB}.Debug|Win32.Build.0 = Resource|Win32 {66D1EAA4-65D1-45CC-9989-E616FC0575EB}.Debug|x64.ActiveCfg = Resource|Win32 {66D1EAA4-65D1-45CC-9989-E616FC0575EB}.Debug|x64.Build.0 = Resource|Win32 + {66D1EAA4-65D1-45CC-9989-E616FC0575EB}.Release|ARM64.ActiveCfg = Resource|Win32 + {66D1EAA4-65D1-45CC-9989-E616FC0575EB}.Release|ARM64.Build.0 = Resource|Win32 {66D1EAA4-65D1-45CC-9989-E616FC0575EB}.Release|Win32.ActiveCfg = Resource|Win32 {66D1EAA4-65D1-45CC-9989-E616FC0575EB}.Release|Win32.Build.0 = Resource|Win32 {66D1EAA4-65D1-45CC-9989-E616FC0575EB}.Release|x64.ActiveCfg = Resource|Win32 {66D1EAA4-65D1-45CC-9989-E616FC0575EB}.Release|x64.Build.0 = Resource|Win32 + {66D1EAA4-65D1-45CC-9989-E616FC0575EB}.Setup|ARM64.ActiveCfg = Resource|Win32 {66D1EAA4-65D1-45CC-9989-E616FC0575EB}.Setup|Win32.ActiveCfg = Resource|Win32 {66D1EAA4-65D1-45CC-9989-E616FC0575EB}.Setup|Win32.Build.0 = Resource|Win32 {66D1EAA4-65D1-45CC-9989-E616FC0575EB}.Setup|x64.ActiveCfg = Resource|Win32 + {81EB6336-366C-47DD-82CF-FF6C36CCD2B5}.Debug|ARM64.ActiveCfg = Resource|Win32 + {81EB6336-366C-47DD-82CF-FF6C36CCD2B5}.Debug|ARM64.Build.0 = Resource|Win32 {81EB6336-366C-47DD-82CF-FF6C36CCD2B5}.Debug|Win32.ActiveCfg = Resource|Win32 {81EB6336-366C-47DD-82CF-FF6C36CCD2B5}.Debug|Win32.Build.0 = Resource|Win32 {81EB6336-366C-47DD-82CF-FF6C36CCD2B5}.Debug|x64.ActiveCfg = Resource|Win32 {81EB6336-366C-47DD-82CF-FF6C36CCD2B5}.Debug|x64.Build.0 = Resource|Win32 + {81EB6336-366C-47DD-82CF-FF6C36CCD2B5}.Release|ARM64.ActiveCfg = Resource|Win32 + {81EB6336-366C-47DD-82CF-FF6C36CCD2B5}.Release|ARM64.Build.0 = Resource|Win32 {81EB6336-366C-47DD-82CF-FF6C36CCD2B5}.Release|Win32.ActiveCfg = Resource|Win32 {81EB6336-366C-47DD-82CF-FF6C36CCD2B5}.Release|Win32.Build.0 = Resource|Win32 {81EB6336-366C-47DD-82CF-FF6C36CCD2B5}.Release|x64.ActiveCfg = Resource|Win32 {81EB6336-366C-47DD-82CF-FF6C36CCD2B5}.Release|x64.Build.0 = Resource|Win32 + {81EB6336-366C-47DD-82CF-FF6C36CCD2B5}.Setup|ARM64.ActiveCfg = Resource|Win32 {81EB6336-366C-47DD-82CF-FF6C36CCD2B5}.Setup|Win32.ActiveCfg = Resource|Win32 {81EB6336-366C-47DD-82CF-FF6C36CCD2B5}.Setup|Win32.Build.0 = Resource|Win32 {81EB6336-366C-47DD-82CF-FF6C36CCD2B5}.Setup|x64.ActiveCfg = Resource|Win32 + {E1017135-9916-4B11-9AC5-1EC0BD8F8CD6}.Debug|ARM64.ActiveCfg = Debug|Win32 {E1017135-9916-4B11-9AC5-1EC0BD8F8CD6}.Debug|Win32.ActiveCfg = Debug|Win32 {E1017135-9916-4B11-9AC5-1EC0BD8F8CD6}.Debug|Win32.Build.0 = Debug|Win32 {E1017135-9916-4B11-9AC5-1EC0BD8F8CD6}.Debug|x64.ActiveCfg = Debug|Win32 + {E1017135-9916-4B11-9AC5-1EC0BD8F8CD6}.Release|ARM64.ActiveCfg = Release|Win32 {E1017135-9916-4B11-9AC5-1EC0BD8F8CD6}.Release|Win32.ActiveCfg = Release|Win32 {E1017135-9916-4B11-9AC5-1EC0BD8F8CD6}.Release|Win32.Build.0 = Release|Win32 {E1017135-9916-4B11-9AC5-1EC0BD8F8CD6}.Release|x64.ActiveCfg = Release|Win32 + {E1017135-9916-4B11-9AC5-1EC0BD8F8CD6}.Setup|ARM64.ActiveCfg = Release|Win32 {E1017135-9916-4B11-9AC5-1EC0BD8F8CD6}.Setup|Win32.ActiveCfg = Release|Win32 {E1017135-9916-4B11-9AC5-1EC0BD8F8CD6}.Setup|Win32.Build.0 = Release|Win32 {E1017135-9916-4B11-9AC5-1EC0BD8F8CD6}.Setup|x64.ActiveCfg = Release|Win32 + {E93271C8-0252-4A08-8227-1978C64C2D34}.Debug|ARM64.ActiveCfg = Debug|Win32 {E93271C8-0252-4A08-8227-1978C64C2D34}.Debug|Win32.ActiveCfg = Debug|Win32 {E93271C8-0252-4A08-8227-1978C64C2D34}.Debug|Win32.Build.0 = Debug|Win32 {E93271C8-0252-4A08-8227-1978C64C2D34}.Debug|x64.ActiveCfg = Debug|Win32 + {E93271C8-0252-4A08-8227-1978C64C2D34}.Release|ARM64.ActiveCfg = Release|Win32 {E93271C8-0252-4A08-8227-1978C64C2D34}.Release|Win32.ActiveCfg = Release|Win32 {E93271C8-0252-4A08-8227-1978C64C2D34}.Release|Win32.Build.0 = Release|Win32 {E93271C8-0252-4A08-8227-1978C64C2D34}.Release|x64.ActiveCfg = Release|Win32 + {E93271C8-0252-4A08-8227-1978C64C2D34}.Setup|ARM64.ActiveCfg = Setup|Win32 {E93271C8-0252-4A08-8227-1978C64C2D34}.Setup|Win32.ActiveCfg = Setup|Win32 {E93271C8-0252-4A08-8227-1978C64C2D34}.Setup|Win32.Build.0 = Setup|Win32 {E93271C8-0252-4A08-8227-1978C64C2D34}.Setup|x64.ActiveCfg = Setup|Win32 + {0A60FD06-3A81-4651-A869-9850DBC115EA}.Debug|ARM64.ActiveCfg = Resource|Win32 {0A60FD06-3A81-4651-A869-9850DBC115EA}.Debug|Win32.ActiveCfg = Resource|Win32 {0A60FD06-3A81-4651-A869-9850DBC115EA}.Debug|Win32.Build.0 = Resource|Win32 {0A60FD06-3A81-4651-A869-9850DBC115EA}.Debug|x64.ActiveCfg = Resource|Win32 + {0A60FD06-3A81-4651-A869-9850DBC115EA}.Release|ARM64.ActiveCfg = Resource|Win32 {0A60FD06-3A81-4651-A869-9850DBC115EA}.Release|Win32.ActiveCfg = Resource|Win32 {0A60FD06-3A81-4651-A869-9850DBC115EA}.Release|Win32.Build.0 = Resource|Win32 {0A60FD06-3A81-4651-A869-9850DBC115EA}.Release|x64.ActiveCfg = Resource|Win32 + {0A60FD06-3A81-4651-A869-9850DBC115EA}.Setup|ARM64.ActiveCfg = Resource|Win32 {0A60FD06-3A81-4651-A869-9850DBC115EA}.Setup|Win32.ActiveCfg = Resource|Win32 {0A60FD06-3A81-4651-A869-9850DBC115EA}.Setup|Win32.Build.0 = Resource|Win32 {0A60FD06-3A81-4651-A869-9850DBC115EA}.Setup|x64.ActiveCfg = Resource|Win32 + {D42FE717-485B-492D-884A-1999F6D51154}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {D42FE717-485B-492D-884A-1999F6D51154}.Debug|ARM64.Build.0 = Debug|ARM64 {D42FE717-485B-492D-884A-1999F6D51154}.Debug|Win32.ActiveCfg = Debug|Win32 {D42FE717-485B-492D-884A-1999F6D51154}.Debug|Win32.Build.0 = Debug|Win32 {D42FE717-485B-492D-884A-1999F6D51154}.Debug|x64.ActiveCfg = Debug|x64 {D42FE717-485B-492D-884A-1999F6D51154}.Debug|x64.Build.0 = Debug|x64 + {D42FE717-485B-492D-884A-1999F6D51154}.Release|ARM64.ActiveCfg = Release|ARM64 + {D42FE717-485B-492D-884A-1999F6D51154}.Release|ARM64.Build.0 = Release|ARM64 {D42FE717-485B-492D-884A-1999F6D51154}.Release|Win32.ActiveCfg = Release|Win32 {D42FE717-485B-492D-884A-1999F6D51154}.Release|Win32.Build.0 = Release|Win32 {D42FE717-485B-492D-884A-1999F6D51154}.Release|x64.ActiveCfg = Release|x64 {D42FE717-485B-492D-884A-1999F6D51154}.Release|x64.Build.0 = Release|x64 + {D42FE717-485B-492D-884A-1999F6D51154}.Setup|ARM64.ActiveCfg = Release|ARM64 + {D42FE717-485B-492D-884A-1999F6D51154}.Setup|ARM64.Build.0 = Release|ARM64 {D42FE717-485B-492D-884A-1999F6D51154}.Setup|Win32.ActiveCfg = Release|Win32 {D42FE717-485B-492D-884A-1999F6D51154}.Setup|Win32.Build.0 = Release|Win32 {D42FE717-485B-492D-884A-1999F6D51154}.Setup|x64.ActiveCfg = Release|x64 {D42FE717-485B-492D-884A-1999F6D51154}.Setup|x64.Build.0 = Release|x64 + {65D5C193-E807-4094-AE19-19E6A310A312}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {65D5C193-E807-4094-AE19-19E6A310A312}.Debug|ARM64.Build.0 = Debug|ARM64 {65D5C193-E807-4094-AE19-19E6A310A312}.Debug|Win32.ActiveCfg = Debug|Win32 {65D5C193-E807-4094-AE19-19E6A310A312}.Debug|Win32.Build.0 = Debug|Win32 {65D5C193-E807-4094-AE19-19E6A310A312}.Debug|x64.ActiveCfg = Debug|x64 {65D5C193-E807-4094-AE19-19E6A310A312}.Debug|x64.Build.0 = Debug|x64 + {65D5C193-E807-4094-AE19-19E6A310A312}.Release|ARM64.ActiveCfg = Release|ARM64 + {65D5C193-E807-4094-AE19-19E6A310A312}.Release|ARM64.Build.0 = Release|ARM64 {65D5C193-E807-4094-AE19-19E6A310A312}.Release|Win32.ActiveCfg = Release|Win32 {65D5C193-E807-4094-AE19-19E6A310A312}.Release|Win32.Build.0 = Release|Win32 {65D5C193-E807-4094-AE19-19E6A310A312}.Release|x64.ActiveCfg = Release|x64 {65D5C193-E807-4094-AE19-19E6A310A312}.Release|x64.Build.0 = Release|x64 + {65D5C193-E807-4094-AE19-19E6A310A312}.Setup|ARM64.ActiveCfg = Setup|ARM64 + {65D5C193-E807-4094-AE19-19E6A310A312}.Setup|ARM64.Build.0 = Setup|ARM64 {65D5C193-E807-4094-AE19-19E6A310A312}.Setup|Win32.ActiveCfg = Setup|Win32 {65D5C193-E807-4094-AE19-19E6A310A312}.Setup|Win32.Build.0 = Setup|Win32 {65D5C193-E807-4094-AE19-19E6A310A312}.Setup|x64.ActiveCfg = Setup|x64 {65D5C193-E807-4094-AE19-19E6A310A312}.Setup|x64.Build.0 = Setup|x64 + {BC0E6E7C-08C1-4F12-A754-4608E5A22FA8}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {BC0E6E7C-08C1-4F12-A754-4608E5A22FA8}.Debug|ARM64.Build.0 = Debug|ARM64 {BC0E6E7C-08C1-4F12-A754-4608E5A22FA8}.Debug|Win32.ActiveCfg = Debug|Win32 {BC0E6E7C-08C1-4F12-A754-4608E5A22FA8}.Debug|Win32.Build.0 = Debug|Win32 {BC0E6E7C-08C1-4F12-A754-4608E5A22FA8}.Debug|x64.ActiveCfg = Debug|x64 {BC0E6E7C-08C1-4F12-A754-4608E5A22FA8}.Debug|x64.Build.0 = Debug|x64 + {BC0E6E7C-08C1-4F12-A754-4608E5A22FA8}.Release|ARM64.ActiveCfg = Release|ARM64 + {BC0E6E7C-08C1-4F12-A754-4608E5A22FA8}.Release|ARM64.Build.0 = Release|ARM64 {BC0E6E7C-08C1-4F12-A754-4608E5A22FA8}.Release|Win32.ActiveCfg = Release|Win32 {BC0E6E7C-08C1-4F12-A754-4608E5A22FA8}.Release|Win32.Build.0 = Release|Win32 {BC0E6E7C-08C1-4F12-A754-4608E5A22FA8}.Release|x64.ActiveCfg = Release|x64 {BC0E6E7C-08C1-4F12-A754-4608E5A22FA8}.Release|x64.Build.0 = Release|x64 + {BC0E6E7C-08C1-4F12-A754-4608E5A22FA8}.Setup|ARM64.ActiveCfg = Setup|ARM64 + {BC0E6E7C-08C1-4F12-A754-4608E5A22FA8}.Setup|ARM64.Build.0 = Setup|ARM64 {BC0E6E7C-08C1-4F12-A754-4608E5A22FA8}.Setup|Win32.ActiveCfg = Setup|Win32 {BC0E6E7C-08C1-4F12-A754-4608E5A22FA8}.Setup|Win32.Build.0 = Setup|Win32 {BC0E6E7C-08C1-4F12-A754-4608E5A22FA8}.Setup|x64.ActiveCfg = Setup|x64 {BC0E6E7C-08C1-4F12-A754-4608E5A22FA8}.Setup|x64.Build.0 = Setup|x64 + {171B46B0-6083-4D9E-BD33-946EA3BD76FA}.Debug|ARM64.ActiveCfg = Debug|Win32 {171B46B0-6083-4D9E-BD33-946EA3BD76FA}.Debug|Win32.ActiveCfg = Debug|Win32 {171B46B0-6083-4D9E-BD33-946EA3BD76FA}.Debug|Win32.Build.0 = Debug|Win32 {171B46B0-6083-4D9E-BD33-946EA3BD76FA}.Debug|x64.ActiveCfg = Debug|Win32 + {171B46B0-6083-4D9E-BD33-946EA3BD76FA}.Release|ARM64.ActiveCfg = Release|Win32 {171B46B0-6083-4D9E-BD33-946EA3BD76FA}.Release|Win32.ActiveCfg = Release|Win32 {171B46B0-6083-4D9E-BD33-946EA3BD76FA}.Release|Win32.Build.0 = Release|Win32 {171B46B0-6083-4D9E-BD33-946EA3BD76FA}.Release|x64.ActiveCfg = Release|Win32 + {171B46B0-6083-4D9E-BD33-946EA3BD76FA}.Setup|ARM64.ActiveCfg = Release|Win32 {171B46B0-6083-4D9E-BD33-946EA3BD76FA}.Setup|Win32.ActiveCfg = Release|Win32 {171B46B0-6083-4D9E-BD33-946EA3BD76FA}.Setup|Win32.Build.0 = Release|Win32 {171B46B0-6083-4D9E-BD33-946EA3BD76FA}.Setup|x64.ActiveCfg = Release|Win32 + {A2CCDE9F-17CE-461E-8BD9-00261B8855A6}.Debug|ARM64.ActiveCfg = Resource|Win32 + {A2CCDE9F-17CE-461E-8BD9-00261B8855A6}.Debug|ARM64.Build.0 = Resource|Win32 {A2CCDE9F-17CE-461E-8BD9-00261B8855A6}.Debug|Win32.ActiveCfg = Resource|Win32 {A2CCDE9F-17CE-461E-8BD9-00261B8855A6}.Debug|Win32.Build.0 = Resource|Win32 {A2CCDE9F-17CE-461E-8BD9-00261B8855A6}.Debug|x64.ActiveCfg = Resource|Win32 {A2CCDE9F-17CE-461E-8BD9-00261B8855A6}.Debug|x64.Build.0 = Resource|Win32 + {A2CCDE9F-17CE-461E-8BD9-00261B8855A6}.Release|ARM64.ActiveCfg = Resource|Win32 + {A2CCDE9F-17CE-461E-8BD9-00261B8855A6}.Release|ARM64.Build.0 = Resource|Win32 {A2CCDE9F-17CE-461E-8BD9-00261B8855A6}.Release|Win32.ActiveCfg = Resource|Win32 {A2CCDE9F-17CE-461E-8BD9-00261B8855A6}.Release|Win32.Build.0 = Resource|Win32 {A2CCDE9F-17CE-461E-8BD9-00261B8855A6}.Release|x64.ActiveCfg = Resource|Win32 {A2CCDE9F-17CE-461E-8BD9-00261B8855A6}.Release|x64.Build.0 = Resource|Win32 + {A2CCDE9F-17CE-461E-8BD9-00261B8855A6}.Setup|ARM64.ActiveCfg = Resource|Win32 {A2CCDE9F-17CE-461E-8BD9-00261B8855A6}.Setup|Win32.ActiveCfg = Resource|Win32 {A2CCDE9F-17CE-461E-8BD9-00261B8855A6}.Setup|Win32.Build.0 = Resource|Win32 {A2CCDE9F-17CE-461E-8BD9-00261B8855A6}.Setup|x64.ActiveCfg = Resource|Win32 + {31C016FB-9EA1-4AF5-987A-37210C04DA06}.Debug|ARM64.ActiveCfg = Resource|Win32 + {31C016FB-9EA1-4AF5-987A-37210C04DA06}.Debug|ARM64.Build.0 = Resource|Win32 {31C016FB-9EA1-4AF5-987A-37210C04DA06}.Debug|Win32.ActiveCfg = Resource|Win32 {31C016FB-9EA1-4AF5-987A-37210C04DA06}.Debug|Win32.Build.0 = Resource|Win32 {31C016FB-9EA1-4AF5-987A-37210C04DA06}.Debug|x64.ActiveCfg = Resource|Win32 {31C016FB-9EA1-4AF5-987A-37210C04DA06}.Debug|x64.Build.0 = Resource|Win32 + {31C016FB-9EA1-4AF5-987A-37210C04DA06}.Release|ARM64.ActiveCfg = Resource|Win32 + {31C016FB-9EA1-4AF5-987A-37210C04DA06}.Release|ARM64.Build.0 = Resource|Win32 {31C016FB-9EA1-4AF5-987A-37210C04DA06}.Release|Win32.ActiveCfg = Resource|Win32 {31C016FB-9EA1-4AF5-987A-37210C04DA06}.Release|Win32.Build.0 = Resource|Win32 {31C016FB-9EA1-4AF5-987A-37210C04DA06}.Release|x64.ActiveCfg = Resource|Win32 {31C016FB-9EA1-4AF5-987A-37210C04DA06}.Release|x64.Build.0 = Resource|Win32 + {31C016FB-9EA1-4AF5-987A-37210C04DA06}.Setup|ARM64.ActiveCfg = Resource|Win32 {31C016FB-9EA1-4AF5-987A-37210C04DA06}.Setup|Win32.ActiveCfg = Resource|Win32 {31C016FB-9EA1-4AF5-987A-37210C04DA06}.Setup|Win32.Build.0 = Resource|Win32 {31C016FB-9EA1-4AF5-987A-37210C04DA06}.Setup|x64.ActiveCfg = Resource|Win32 + {5C875214-0E3A-4CF0-BC0C-BFF6FAA4C089}.Debug|ARM64.ActiveCfg = Resource|Win32 + {5C875214-0E3A-4CF0-BC0C-BFF6FAA4C089}.Debug|ARM64.Build.0 = Resource|Win32 {5C875214-0E3A-4CF0-BC0C-BFF6FAA4C089}.Debug|Win32.ActiveCfg = Resource|Win32 {5C875214-0E3A-4CF0-BC0C-BFF6FAA4C089}.Debug|Win32.Build.0 = Resource|Win32 {5C875214-0E3A-4CF0-BC0C-BFF6FAA4C089}.Debug|x64.ActiveCfg = Resource|Win32 {5C875214-0E3A-4CF0-BC0C-BFF6FAA4C089}.Debug|x64.Build.0 = Resource|Win32 + {5C875214-0E3A-4CF0-BC0C-BFF6FAA4C089}.Release|ARM64.ActiveCfg = Resource|Win32 + {5C875214-0E3A-4CF0-BC0C-BFF6FAA4C089}.Release|ARM64.Build.0 = Resource|Win32 {5C875214-0E3A-4CF0-BC0C-BFF6FAA4C089}.Release|Win32.ActiveCfg = Resource|Win32 {5C875214-0E3A-4CF0-BC0C-BFF6FAA4C089}.Release|Win32.Build.0 = Resource|Win32 {5C875214-0E3A-4CF0-BC0C-BFF6FAA4C089}.Release|x64.ActiveCfg = Resource|Win32 {5C875214-0E3A-4CF0-BC0C-BFF6FAA4C089}.Release|x64.Build.0 = Resource|Win32 + {5C875214-0E3A-4CF0-BC0C-BFF6FAA4C089}.Setup|ARM64.ActiveCfg = Resource|Win32 {5C875214-0E3A-4CF0-BC0C-BFF6FAA4C089}.Setup|Win32.ActiveCfg = Resource|Win32 {5C875214-0E3A-4CF0-BC0C-BFF6FAA4C089}.Setup|Win32.Build.0 = Resource|Win32 {5C875214-0E3A-4CF0-BC0C-BFF6FAA4C089}.Setup|x64.ActiveCfg = Resource|Win32 + {ED74EBA9-1BCB-4B8F-9AE1-DC63B3C24A94}.Debug|ARM64.ActiveCfg = Resource|Win32 + {ED74EBA9-1BCB-4B8F-9AE1-DC63B3C24A94}.Debug|ARM64.Build.0 = Resource|Win32 {ED74EBA9-1BCB-4B8F-9AE1-DC63B3C24A94}.Debug|Win32.ActiveCfg = Resource|Win32 {ED74EBA9-1BCB-4B8F-9AE1-DC63B3C24A94}.Debug|Win32.Build.0 = Resource|Win32 {ED74EBA9-1BCB-4B8F-9AE1-DC63B3C24A94}.Debug|x64.ActiveCfg = Resource|Win32 {ED74EBA9-1BCB-4B8F-9AE1-DC63B3C24A94}.Debug|x64.Build.0 = Resource|Win32 + {ED74EBA9-1BCB-4B8F-9AE1-DC63B3C24A94}.Release|ARM64.ActiveCfg = Resource|Win32 + {ED74EBA9-1BCB-4B8F-9AE1-DC63B3C24A94}.Release|ARM64.Build.0 = Resource|Win32 {ED74EBA9-1BCB-4B8F-9AE1-DC63B3C24A94}.Release|Win32.ActiveCfg = Resource|Win32 {ED74EBA9-1BCB-4B8F-9AE1-DC63B3C24A94}.Release|Win32.Build.0 = Resource|Win32 {ED74EBA9-1BCB-4B8F-9AE1-DC63B3C24A94}.Release|x64.ActiveCfg = Resource|Win32 {ED74EBA9-1BCB-4B8F-9AE1-DC63B3C24A94}.Release|x64.Build.0 = Resource|Win32 + {ED74EBA9-1BCB-4B8F-9AE1-DC63B3C24A94}.Setup|ARM64.ActiveCfg = Resource|Win32 {ED74EBA9-1BCB-4B8F-9AE1-DC63B3C24A94}.Setup|Win32.ActiveCfg = Resource|Win32 {ED74EBA9-1BCB-4B8F-9AE1-DC63B3C24A94}.Setup|Win32.Build.0 = Resource|Win32 {ED74EBA9-1BCB-4B8F-9AE1-DC63B3C24A94}.Setup|x64.ActiveCfg = Resource|Win32 + {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Debug|ARM64.Build.0 = Debug|ARM64 + {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Debug|ARM64.Deploy.0 = Debug|ARM64 {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Debug|Win32.ActiveCfg = Debug|Win32 {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Debug|Win32.Build.0 = Debug|Win32 {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Debug|x64.ActiveCfg = Debug|x64 {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Debug|x64.Build.0 = Debug|x64 + {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Release|ARM64.ActiveCfg = Release|ARM64 + {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Release|ARM64.Build.0 = Release|ARM64 + {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Release|ARM64.Deploy.0 = Release|ARM64 {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Release|Win32.ActiveCfg = Release|Win32 {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Release|Win32.Build.0 = Release|Win32 {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Release|x64.ActiveCfg = Release|x64 {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Release|x64.Build.0 = Release|x64 + {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Setup|ARM64.ActiveCfg = Setup|ARM64 + {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Setup|ARM64.Build.0 = Setup|ARM64 {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Setup|Win32.ActiveCfg = Setup|Win32 {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Setup|Win32.Build.0 = Setup|Win32 {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Setup|x64.ActiveCfg = Setup|x64 {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Setup|x64.Build.0 = Setup|x64 + {DAE66C9B-05DC-4ACE-97DA-2547B490BBFF}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {DAE66C9B-05DC-4ACE-97DA-2547B490BBFF}.Debug|ARM64.Build.0 = Debug|ARM64 {DAE66C9B-05DC-4ACE-97DA-2547B490BBFF}.Debug|Win32.ActiveCfg = Debug|Win32 {DAE66C9B-05DC-4ACE-97DA-2547B490BBFF}.Debug|Win32.Build.0 = Debug|Win32 {DAE66C9B-05DC-4ACE-97DA-2547B490BBFF}.Debug|x64.ActiveCfg = Debug|x64 {DAE66C9B-05DC-4ACE-97DA-2547B490BBFF}.Debug|x64.Build.0 = Debug|x64 + {DAE66C9B-05DC-4ACE-97DA-2547B490BBFF}.Release|ARM64.ActiveCfg = Release|ARM64 + {DAE66C9B-05DC-4ACE-97DA-2547B490BBFF}.Release|ARM64.Build.0 = Release|ARM64 {DAE66C9B-05DC-4ACE-97DA-2547B490BBFF}.Release|Win32.ActiveCfg = Release|Win32 {DAE66C9B-05DC-4ACE-97DA-2547B490BBFF}.Release|Win32.Build.0 = Release|Win32 {DAE66C9B-05DC-4ACE-97DA-2547B490BBFF}.Release|x64.ActiveCfg = Release|x64 {DAE66C9B-05DC-4ACE-97DA-2547B490BBFF}.Release|x64.Build.0 = Release|x64 + {DAE66C9B-05DC-4ACE-97DA-2547B490BBFF}.Setup|ARM64.ActiveCfg = Release|ARM64 + {DAE66C9B-05DC-4ACE-97DA-2547B490BBFF}.Setup|ARM64.Build.0 = Release|ARM64 {DAE66C9B-05DC-4ACE-97DA-2547B490BBFF}.Setup|Win32.ActiveCfg = Release|Win32 {DAE66C9B-05DC-4ACE-97DA-2547B490BBFF}.Setup|Win32.Build.0 = Release|Win32 {DAE66C9B-05DC-4ACE-97DA-2547B490BBFF}.Setup|x64.ActiveCfg = Release|x64 {DAE66C9B-05DC-4ACE-97DA-2547B490BBFF}.Setup|x64.Build.0 = Release|x64 + {7BD26CB3-5280-48FD-9A86-C13E321018D5}.Debug|ARM64.ActiveCfg = Resource|Win32 + {7BD26CB3-5280-48FD-9A86-C13E321018D5}.Debug|ARM64.Build.0 = Resource|Win32 {7BD26CB3-5280-48FD-9A86-C13E321018D5}.Debug|Win32.ActiveCfg = Resource|Win32 {7BD26CB3-5280-48FD-9A86-C13E321018D5}.Debug|Win32.Build.0 = Resource|Win32 {7BD26CB3-5280-48FD-9A86-C13E321018D5}.Debug|x64.ActiveCfg = Resource|Win32 {7BD26CB3-5280-48FD-9A86-C13E321018D5}.Debug|x64.Build.0 = Resource|Win32 + {7BD26CB3-5280-48FD-9A86-C13E321018D5}.Release|ARM64.ActiveCfg = Resource|Win32 + {7BD26CB3-5280-48FD-9A86-C13E321018D5}.Release|ARM64.Build.0 = Resource|Win32 {7BD26CB3-5280-48FD-9A86-C13E321018D5}.Release|Win32.ActiveCfg = Resource|Win32 {7BD26CB3-5280-48FD-9A86-C13E321018D5}.Release|Win32.Build.0 = Resource|Win32 {7BD26CB3-5280-48FD-9A86-C13E321018D5}.Release|x64.ActiveCfg = Resource|Win32 {7BD26CB3-5280-48FD-9A86-C13E321018D5}.Release|x64.Build.0 = Resource|Win32 + {7BD26CB3-5280-48FD-9A86-C13E321018D5}.Setup|ARM64.ActiveCfg = Resource|Win32 {7BD26CB3-5280-48FD-9A86-C13E321018D5}.Setup|Win32.ActiveCfg = Resource|Win32 {7BD26CB3-5280-48FD-9A86-C13E321018D5}.Setup|Win32.Build.0 = Resource|Win32 {7BD26CB3-5280-48FD-9A86-C13E321018D5}.Setup|x64.ActiveCfg = Resource|Win32 + {598AB4AC-008E-4501-90B3-C5213834C1DA}.Debug|ARM64.ActiveCfg = Resource|Win32 + {598AB4AC-008E-4501-90B3-C5213834C1DA}.Debug|ARM64.Build.0 = Resource|Win32 {598AB4AC-008E-4501-90B3-C5213834C1DA}.Debug|Win32.ActiveCfg = Resource|Win32 {598AB4AC-008E-4501-90B3-C5213834C1DA}.Debug|Win32.Build.0 = Resource|Win32 {598AB4AC-008E-4501-90B3-C5213834C1DA}.Debug|x64.ActiveCfg = Resource|Win32 {598AB4AC-008E-4501-90B3-C5213834C1DA}.Debug|x64.Build.0 = Resource|Win32 + {598AB4AC-008E-4501-90B3-C5213834C1DA}.Release|ARM64.ActiveCfg = Resource|Win32 + {598AB4AC-008E-4501-90B3-C5213834C1DA}.Release|ARM64.Build.0 = Resource|Win32 {598AB4AC-008E-4501-90B3-C5213834C1DA}.Release|Win32.ActiveCfg = Resource|Win32 {598AB4AC-008E-4501-90B3-C5213834C1DA}.Release|Win32.Build.0 = Resource|Win32 {598AB4AC-008E-4501-90B3-C5213834C1DA}.Release|x64.ActiveCfg = Resource|Win32 {598AB4AC-008E-4501-90B3-C5213834C1DA}.Release|x64.Build.0 = Resource|Win32 + {598AB4AC-008E-4501-90B3-C5213834C1DA}.Setup|ARM64.ActiveCfg = Resource|Win32 {598AB4AC-008E-4501-90B3-C5213834C1DA}.Setup|Win32.ActiveCfg = Resource|Win32 {598AB4AC-008E-4501-90B3-C5213834C1DA}.Setup|Win32.Build.0 = Resource|Win32 {598AB4AC-008E-4501-90B3-C5213834C1DA}.Setup|x64.ActiveCfg = Resource|Win32 + {63BAF573-170B-4FA0-AEE3-16E04F3E9DF5}.Debug|ARM64.ActiveCfg = Resource|Win32 + {63BAF573-170B-4FA0-AEE3-16E04F3E9DF5}.Debug|ARM64.Build.0 = Resource|Win32 {63BAF573-170B-4FA0-AEE3-16E04F3E9DF5}.Debug|Win32.ActiveCfg = Resource|Win32 {63BAF573-170B-4FA0-AEE3-16E04F3E9DF5}.Debug|Win32.Build.0 = Resource|Win32 {63BAF573-170B-4FA0-AEE3-16E04F3E9DF5}.Debug|x64.ActiveCfg = Resource|Win32 {63BAF573-170B-4FA0-AEE3-16E04F3E9DF5}.Debug|x64.Build.0 = Resource|Win32 + {63BAF573-170B-4FA0-AEE3-16E04F3E9DF5}.Release|ARM64.ActiveCfg = Resource|Win32 + {63BAF573-170B-4FA0-AEE3-16E04F3E9DF5}.Release|ARM64.Build.0 = Resource|Win32 {63BAF573-170B-4FA0-AEE3-16E04F3E9DF5}.Release|Win32.ActiveCfg = Resource|Win32 {63BAF573-170B-4FA0-AEE3-16E04F3E9DF5}.Release|Win32.Build.0 = Resource|Win32 {63BAF573-170B-4FA0-AEE3-16E04F3E9DF5}.Release|x64.ActiveCfg = Resource|Win32 {63BAF573-170B-4FA0-AEE3-16E04F3E9DF5}.Release|x64.Build.0 = Resource|Win32 + {63BAF573-170B-4FA0-AEE3-16E04F3E9DF5}.Setup|ARM64.ActiveCfg = Resource|Win32 {63BAF573-170B-4FA0-AEE3-16E04F3E9DF5}.Setup|Win32.ActiveCfg = Resource|Win32 {63BAF573-170B-4FA0-AEE3-16E04F3E9DF5}.Setup|Win32.Build.0 = Resource|Win32 {63BAF573-170B-4FA0-AEE3-16E04F3E9DF5}.Setup|x64.ActiveCfg = Resource|Win32 + {CA5BFC96-428D-42F5-9F7D-CDDE048A357C}.Debug|ARM64.ActiveCfg = Resource|Win32 + {CA5BFC96-428D-42F5-9F7D-CDDE048A357C}.Debug|ARM64.Build.0 = Resource|Win32 {CA5BFC96-428D-42F5-9F7D-CDDE048A357C}.Debug|Win32.ActiveCfg = Resource|Win32 {CA5BFC96-428D-42F5-9F7D-CDDE048A357C}.Debug|Win32.Build.0 = Resource|Win32 {CA5BFC96-428D-42F5-9F7D-CDDE048A357C}.Debug|x64.ActiveCfg = Resource|Win32 {CA5BFC96-428D-42F5-9F7D-CDDE048A357C}.Debug|x64.Build.0 = Resource|Win32 + {CA5BFC96-428D-42F5-9F7D-CDDE048A357C}.Release|ARM64.ActiveCfg = Resource|Win32 + {CA5BFC96-428D-42F5-9F7D-CDDE048A357C}.Release|ARM64.Build.0 = Resource|Win32 {CA5BFC96-428D-42F5-9F7D-CDDE048A357C}.Release|Win32.ActiveCfg = Resource|Win32 {CA5BFC96-428D-42F5-9F7D-CDDE048A357C}.Release|Win32.Build.0 = Resource|Win32 {CA5BFC96-428D-42F5-9F7D-CDDE048A357C}.Release|x64.ActiveCfg = Resource|Win32 {CA5BFC96-428D-42F5-9F7D-CDDE048A357C}.Release|x64.Build.0 = Resource|Win32 + {CA5BFC96-428D-42F5-9F7D-CDDE048A357C}.Setup|ARM64.ActiveCfg = Resource|Win32 {CA5BFC96-428D-42F5-9F7D-CDDE048A357C}.Setup|Win32.ActiveCfg = Resource|Win32 {CA5BFC96-428D-42F5-9F7D-CDDE048A357C}.Setup|Win32.Build.0 = Resource|Win32 {CA5BFC96-428D-42F5-9F7D-CDDE048A357C}.Setup|x64.ActiveCfg = Resource|Win32 + {D94BD2A6-1872-4F01-B911-F406603AA2E1}.Debug|ARM64.ActiveCfg = Debug|Win32 {D94BD2A6-1872-4F01-B911-F406603AA2E1}.Debug|Win32.ActiveCfg = Debug|Win32 {D94BD2A6-1872-4F01-B911-F406603AA2E1}.Debug|Win32.Build.0 = Debug|Win32 {D94BD2A6-1872-4F01-B911-F406603AA2E1}.Debug|x64.ActiveCfg = Debug|Win32 + {D94BD2A6-1872-4F01-B911-F406603AA2E1}.Release|ARM64.ActiveCfg = Release|Win32 {D94BD2A6-1872-4F01-B911-F406603AA2E1}.Release|Win32.ActiveCfg = Release|Win32 {D94BD2A6-1872-4F01-B911-F406603AA2E1}.Release|Win32.Build.0 = Release|Win32 {D94BD2A6-1872-4F01-B911-F406603AA2E1}.Release|x64.ActiveCfg = Release|Win32 + {D94BD2A6-1872-4F01-B911-F406603AA2E1}.Setup|ARM64.ActiveCfg = Release|Win32 {D94BD2A6-1872-4F01-B911-F406603AA2E1}.Setup|Win32.ActiveCfg = Release|Win32 {D94BD2A6-1872-4F01-B911-F406603AA2E1}.Setup|Win32.Build.0 = Release|Win32 {D94BD2A6-1872-4F01-B911-F406603AA2E1}.Setup|x64.ActiveCfg = Release|Win32 + {BD28B058-230E-42DF-9FB1-FFBB0153F498}.Debug|ARM64.ActiveCfg = Resource|Win32 + {BD28B058-230E-42DF-9FB1-FFBB0153F498}.Debug|ARM64.Build.0 = Resource|Win32 {BD28B058-230E-42DF-9FB1-FFBB0153F498}.Debug|Win32.ActiveCfg = Resource|Win32 {BD28B058-230E-42DF-9FB1-FFBB0153F498}.Debug|Win32.Build.0 = Resource|Win32 {BD28B058-230E-42DF-9FB1-FFBB0153F498}.Debug|x64.ActiveCfg = Resource|Win32 {BD28B058-230E-42DF-9FB1-FFBB0153F498}.Debug|x64.Build.0 = Resource|Win32 + {BD28B058-230E-42DF-9FB1-FFBB0153F498}.Release|ARM64.ActiveCfg = Resource|Win32 + {BD28B058-230E-42DF-9FB1-FFBB0153F498}.Release|ARM64.Build.0 = Resource|Win32 {BD28B058-230E-42DF-9FB1-FFBB0153F498}.Release|Win32.ActiveCfg = Resource|Win32 {BD28B058-230E-42DF-9FB1-FFBB0153F498}.Release|Win32.Build.0 = Resource|Win32 {BD28B058-230E-42DF-9FB1-FFBB0153F498}.Release|x64.ActiveCfg = Resource|Win32 {BD28B058-230E-42DF-9FB1-FFBB0153F498}.Release|x64.Build.0 = Resource|Win32 + {BD28B058-230E-42DF-9FB1-FFBB0153F498}.Setup|ARM64.ActiveCfg = Resource|Win32 + {BD28B058-230E-42DF-9FB1-FFBB0153F498}.Setup|ARM64.Build.0 = Resource|Win32 {BD28B058-230E-42DF-9FB1-FFBB0153F498}.Setup|Win32.ActiveCfg = Resource|Win32 {BD28B058-230E-42DF-9FB1-FFBB0153F498}.Setup|Win32.Build.0 = Resource|Win32 {BD28B058-230E-42DF-9FB1-FFBB0153F498}.Setup|x64.ActiveCfg = Resource|Win32 {BD28B058-230E-42DF-9FB1-FFBB0153F498}.Setup|x64.Build.0 = Resource|Win32 + {75809D15-8403-420A-BBE6-05F478D88D8E}.Debug|ARM64.ActiveCfg = Resource|Win32 + {75809D15-8403-420A-BBE6-05F478D88D8E}.Debug|ARM64.Build.0 = Resource|Win32 {75809D15-8403-420A-BBE6-05F478D88D8E}.Debug|Win32.ActiveCfg = Resource|Win32 {75809D15-8403-420A-BBE6-05F478D88D8E}.Debug|Win32.Build.0 = Resource|Win32 {75809D15-8403-420A-BBE6-05F478D88D8E}.Debug|x64.ActiveCfg = Resource|Win32 {75809D15-8403-420A-BBE6-05F478D88D8E}.Debug|x64.Build.0 = Resource|Win32 + {75809D15-8403-420A-BBE6-05F478D88D8E}.Release|ARM64.ActiveCfg = Resource|Win32 + {75809D15-8403-420A-BBE6-05F478D88D8E}.Release|ARM64.Build.0 = Resource|Win32 {75809D15-8403-420A-BBE6-05F478D88D8E}.Release|Win32.ActiveCfg = Resource|Win32 {75809D15-8403-420A-BBE6-05F478D88D8E}.Release|Win32.Build.0 = Resource|Win32 {75809D15-8403-420A-BBE6-05F478D88D8E}.Release|x64.ActiveCfg = Resource|Win32 {75809D15-8403-420A-BBE6-05F478D88D8E}.Release|x64.Build.0 = Resource|Win32 + {75809D15-8403-420A-BBE6-05F478D88D8E}.Setup|ARM64.ActiveCfg = Resource|Win32 + {75809D15-8403-420A-BBE6-05F478D88D8E}.Setup|ARM64.Build.0 = Resource|Win32 {75809D15-8403-420A-BBE6-05F478D88D8E}.Setup|Win32.ActiveCfg = Resource|Win32 {75809D15-8403-420A-BBE6-05F478D88D8E}.Setup|Win32.Build.0 = Resource|Win32 {75809D15-8403-420A-BBE6-05F478D88D8E}.Setup|x64.ActiveCfg = Resource|Win32 diff --git a/Src/Setup/BuildBinaries.bat b/Src/Setup/BuildBinaries.bat index fa35bb2f2..0241c892e 100644 --- a/Src/Setup/BuildBinaries.bat +++ b/Src/Setup/BuildBinaries.bat @@ -1,6 +1,7 @@ if exist Output rd /Q /S Output md Output md Output\x64 +md Output\ARM64 echo -- Compiling @@ -9,13 +10,18 @@ for /f "usebackq tokens=*" %%i in (`"%ProgramFiles(x86)%\Microsoft Visual Studio REM Restore NuGet packages "%MSBuildDir%MSBuild.exe" ..\OpenShell.sln /m /t:Restore -p:RestorePackagesConfig=true /verbosity:quiet /nologo -REM ********* Build 64-bit solution -echo --- 64bit +REM ********* Build x64 solution +echo --- x64 "%MSBuildDir%MSBuild.exe" ..\OpenShell.sln /m /t:Rebuild /p:Configuration="Setup" /p:Platform="x64" /verbosity:quiet /nologo @if ERRORLEVEL 1 exit /b 1 +REM ********* Build ARM64 solution +echo --- ARM64 +"%MSBuildDir%MSBuild.exe" ..\OpenShell.sln /m /t:Rebuild /p:Configuration="Setup" /p:Platform="ARM64" /verbosity:quiet /nologo +if ERRORLEVEL 1 exit /b 1 + REM ********* Build 32-bit solution (must be after 64-bit) -echo --- 32bit +echo --- x86 "%MSBuildDir%MSBuild.exe" ..\OpenShell.sln /m /t:Rebuild /p:Configuration="Setup" /p:Platform="Win32" /verbosity:quiet /nologo @if ERRORLEVEL 1 exit /b 1 @@ -45,6 +51,13 @@ copy /B ..\..\build\bin\Release\Update.exe Output > nul copy /B ..\..\build\bin\Release\DesktopToasts.dll Output > nul copy /B ..\..\build\bin\Release\SetupHelper.exe Output > nul +copy /B ..\..\build\bin\SetupARM64\ClassicExplorer64.dll Output\ARM64 > nul +copy /B ..\..\build\bin\SetupARM64\ClassicIEDLL_64.dll Output\ARM64 > nul +copy /B ..\..\build\bin\SetupARM64\ClassicIE_64.exe Output\ARM64 > nul +copy /B ..\..\build\bin\SetupARM64\StartMenu.exe Output\ARM64 > nul +copy /B ..\..\build\bin\SetupARM64\StartMenuDLL.dll Output\ARM64 > nul +copy /B ..\..\build\bin\SetupARM64\StartMenuHelper64.dll Output\ARM64 > nul + copy /B ..\..\build\bin\Setup64\ClassicExplorer64.dll Output\x64 > nul copy /B ..\..\build\bin\Setup64\ClassicIEDLL_64.dll Output\x64 > nul copy /B ..\..\build\bin\Setup64\ClassicIE_64.exe Output\x64 > nul @@ -73,6 +86,7 @@ copy /B "..\..\build\bin\Skins\Immersive.skin7" Output > nul REM ********* Collect debug info md Output\PDB32 md Output\PDB64 +md Output\PDBARM64 REM Explorer 32 copy /B ..\..\build\bin\Setup\ClassicExplorer32.pdb Output\PDB32 > nul @@ -84,6 +98,10 @@ REM Explorer 64 copy /B ..\..\build\bin\Setup64\ClassicExplorer64.pdb Output\PDB64 > nul copy /B Output\x64\ClassicExplorer64.dll Output\PDB64 > nul +REM Explorer ARM64 +copy /B ..\..\build\bin\SetupARM64\ClassicExplorer64.pdb Output\PDBARM64 > nul +copy /B Output\ARM64\ClassicExplorer64.dll Output\PDBARM64 > nul + REM IE 32 copy /B ..\..\build\bin\Setup\ClassicIEDLL_32.pdb Output\PDB32 > nul copy /B Output\ClassicIEDLL_32.dll Output\PDB32 > nul @@ -96,6 +114,12 @@ copy /B Output\x64\ClassicIEDLL_64.dll Output\PDB64 > nul copy /B ..\..\build\bin\Setup64\ClassicIE_64.pdb Output\PDB64 > nul copy /B Output\x64\ClassicIE_64.exe Output\PDB64 > nul +REM IE ARM64 +copy /B ..\..\build\bin\SetupARM64\ClassicIEDLL_64.pdb Output\PDBARM64 > nul +copy /B Output\ARM64\ClassicIEDLL_64.dll Output\PDBARM64 > nul +copy /B ..\..\build\bin\SetupARM64\ClassicIE_64.pdb Output\PDBARM64 > nul +copy /B Output\ARM64\ClassicIE_64.exe Output\PDBARM64 > nul + REM Menu 32 copy /B ..\..\build\bin\Setup\StartMenu.pdb Output\PDB32 > nul copy /B Output\StartMenu.exe Output\PDB32 > nul @@ -116,6 +140,13 @@ copy /B Output\x64\StartMenuDLL.dll Output\PDB64 > nul copy /B ..\..\build\bin\Setup64\StartMenuHelper64.pdb Output\PDB64 > nul copy /B Output\x64\StartMenuHelper64.dll Output\PDB64 > nul +REM Menu ARM64 +copy /B ..\..\build\bin\SetupARM64\StartMenu.pdb Output\PDBARM64 > nul +copy /B Output\ARM64\StartMenu.exe Output\PDBARM64 > nul +copy /B ..\..\build\bin\SetupARM64\StartMenuDLL.pdb Output\PDBARM64 > nul +copy /B Output\ARM64\StartMenuDLL.dll Output\PDBARM64 > nul +copy /B ..\..\build\bin\SetupARM64\StartMenuHelper64.pdb Output\PDBARM64 > nul +copy /B Output\ARM64\StartMenuHelper64.dll Output\PDBARM64 > nul REM ********* Source Index PDBs @@ -140,6 +171,14 @@ if exist %PDBSTR_PATH% ( exit /b 1 ) ) + + for %%f in (Output\PDBARM64\*.pdb) do ( + %PDBSTR_PATH% -w -p:%%f -s:srcsrv -i:Output\pdbstr.txt + if not ERRORLEVEL 0 ( + echo Error adding source index to PDB + exit /b 1 + ) + ) ) REM ********* Prepare symbols @@ -148,11 +187,13 @@ set SYMSTORE_PATH="C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\symstore %SYMSTORE_PATH% add /r /f Output\PDB32 /s Output\symbols /t OpenShell -:NOREFS > nul %SYMSTORE_PATH% add /r /f Output\PDB64 /s Output\symbols /t OpenShell -:NOREFS > nul +%SYMSTORE_PATH% add /r /f Output\PDBARM64 /s Output\symbols /t OpenShell -:NOREFS > nul rd /Q /S Output\symbols\000Admin > nul del Output\symbols\pingme.txt > nul rd /Q /S Output\PDB32 rd /Q /S Output\PDB64 +rd /Q /S Output\PDBARM64 REM ********* Build ADMX echo --- ADMX diff --git a/Src/Setup/BuildInstaller.bat b/Src/Setup/BuildInstaller.bat index 468a274d7..42d444554 100644 --- a/Src/Setup/BuildInstaller.bat +++ b/Src/Setup/BuildInstaller.bat @@ -36,9 +36,9 @@ md Temp @set /a "CS_VERSION_NUM=%%A<<24|%%B<<16|%%C" ) -REM ********* Build 32-bit MSI -echo --- 32bit MSI -candle Setup.wxs -nologo -out Temp\Setup32.wixobj -ext WixUIExtension -ext WixUtilExtension -dx64=0 -dCS_LANG_FOLDER=%CS_LANG_FOLDER% -dCS_LANG_NAME=%CS_LANG_NAME% +REM ********* Build x86 MSI +echo --- x86 MSI +candle Setup.wxs -nologo -out Temp\Setup32.wixobj -ext WixUIExtension -ext WixUtilExtension -dx64=0 -dARM64=0 -dCS_LANG_FOLDER=%CS_LANG_FOLDER% -dCS_LANG_NAME=%CS_LANG_NAME% @if ERRORLEVEL 1 exit /b 1 @REM We need to suppress ICE38 and ICE43 because they apply only to per-user installation. We only support per-machine installs @@ -46,10 +46,9 @@ candle Setup.wxs -nologo -out Temp\Setup32.wixobj -ext WixUIExtension -ext WixUt light Temp\Setup32.wixobj -nologo -out Temp\Setup32.msi -ext WixUIExtension -ext WixUtilExtension -loc ..\Localization\%CS_LANG_FOLDER%\OpenShellText-%CS_LANG_NAME%.wxl -loc ..\Localization\%CS_LANG_FOLDER%\WixUI_%CS_LANG_NAME%.wxl -sice:ICE38 -sice:ICE43 -sice:ICE09 @if ERRORLEVEL 1 exit /b 1 - -REM ********* Build 64-bit MSI -echo --- 64bit MSI -candle Setup.wxs -nologo -out Temp\Setup64.wixobj -ext WixUIExtension -ext WixUtilExtension -dx64=1 -dCS_LANG_FOLDER=%CS_LANG_FOLDER% -dCS_LANG_NAME=%CS_LANG_NAME% +REM ********* Build x64 MSI +echo --- x64 MSI +candle Setup.wxs -nologo -out Temp\Setup64.wixobj -ext WixUIExtension -ext WixUtilExtension -dx64=1 -dARM64=0 -dCS_LANG_FOLDER=%CS_LANG_FOLDER% -dCS_LANG_NAME=%CS_LANG_NAME% @if ERRORLEVEL 1 exit /b 1 @REM We need to suppress ICE38 and ICE43 because they apply only to per-user installation. We only support per-machine installs @@ -57,6 +56,15 @@ candle Setup.wxs -nologo -out Temp\Setup64.wixobj -ext WixUIExtension -ext WixUt light Temp\Setup64.wixobj -nologo -out Temp\Setup64.msi -ext WixUIExtension -ext WixUtilExtension -loc ..\Localization\%CS_LANG_FOLDER%\OpenShellText-%CS_LANG_NAME%.wxl -loc ..\Localization\%CS_LANG_FOLDER%\WixUI_%CS_LANG_NAME%.wxl -sice:ICE38 -sice:ICE43 -sice:ICE09 @if ERRORLEVEL 1 exit /b 1 +REM ********* Build ARM64 MSI +echo --- ARM64 MSI +candle Setup.wxs -nologo -out Temp\SetupARM64.wixobj -ext WixUIExtension -ext WixUtilExtension -dx64=0 -dARM64=1 -dCS_LANG_FOLDER=%CS_LANG_FOLDER% -dCS_LANG_NAME=%CS_LANG_NAME% +@if ERRORLEVEL 1 exit /b 1 + +@REM We need to suppress ICE38 and ICE43 because they apply only to per-user installation. We only support per-machine installs +@REM We need to suppress ICE09 because the helper DLLs need to go into the system directory (for safety reasons) +light Temp\SetupARM64.wixobj -nologo -out Temp\SetupARM64.msi -ext WixUIExtension -ext WixUtilExtension -loc ..\Localization\%CS_LANG_FOLDER%\OpenShellText-%CS_LANG_NAME%.wxl -loc ..\Localization\%CS_LANG_FOLDER%\WixUI_%CS_LANG_NAME%.wxl -sice:ICE38 -sice:ICE43 -sice:ICE09 +@if ERRORLEVEL 1 exit /b 1 REM ********* Build MSI Checksums echo --- MSI Checksums diff --git a/Src/Setup/Setup.cpp b/Src/Setup/Setup.cpp index b90bb4ed3..c7c144e20 100644 --- a/Src/Setup/Setup.cpp +++ b/Src/Setup/Setup.cpp @@ -12,10 +12,13 @@ #include "StringUtils.h" #include "FNVHash.h" -// Setup.exe is a bootstrap application that contains installers for 32-bit and 64-bit. +// Setup.exe is a bootstrap application that contains installers for x86, x64 and ARM64. // It unpacks the right installer into the temp directory and executes it. typedef BOOL (WINAPI *FIsWow64Process)( HANDLE hProcess, PBOOL Wow64Process ); +typedef BOOL (WINAPI *FIsWow64Process2)( HANDLE hProcess, USHORT *pProcessMachine, USHORT *pNativeMachine ); +typedef BOOL (WINAPI *FWow64DisableWow64FsRedirection)( PVOID* OldValue ); +typedef BOOL (WINAPI *FWow64RevertWow64FsRedirection)( PVOID OldValue ); @@ -31,6 +34,14 @@ enum ERR_MSIEXEC, // msiexec failed to start }; +enum ExtractType +{ + None, + x86, + x64, + ARM64 +}; + struct Chunk { int start1, start2, len; @@ -49,7 +60,7 @@ static void WriteFileXOR( HANDLE hFile, const unsigned char *buf, int size ) } } -static int ExtractMsi( HINSTANCE hInstance, const wchar_t *msiName, bool b64, bool bQuiet ) +static int ExtractMsi( HINSTANCE hInstance, const wchar_t *msiName, ExtractType extractType, bool bQuiet ) { void *pRes=NULL; HRSRC hResInfo=FindResource(hInstance,MAKEINTRESOURCE(IDR_MSI_CHECKSUM),L"MSI_FILE"); @@ -70,13 +81,21 @@ static int ExtractMsi( HINSTANCE hInstance, const wchar_t *msiName, bool b64, bo } return ERR_HASH_NOTFOUND; } - unsigned int hash0=((unsigned int*)pRes)[b64?1:0]; + unsigned int hash0=((unsigned int*)pRes)[extractType-1]; const Chunk *pChunks=NULL; int chunkCount=0; - if (b64) + if (extractType==x64) { - chunkCount=((unsigned int*)pRes)[2]; - pChunks=(Chunk*)((unsigned int*)pRes+3); + chunkCount=((unsigned int*)pRes)[3]; + pChunks=(Chunk*)((unsigned int*)pRes+4); + } + if (extractType==ARM64) + { + int x64chunkCount=((unsigned int*)pRes)[3]; + const Chunk *px64Chunks=(Chunk*)((unsigned int*)pRes+4); + + chunkCount=((unsigned int*)(px64Chunks+x64chunkCount))[0]; + pChunks = (Chunk*)((unsigned int*)(px64Chunks+x64chunkCount)+1); } // extract the installer @@ -99,11 +118,11 @@ static int ExtractMsi( HINSTANCE hInstance, const wchar_t *msiName, bool b64, bo } return ERR_MSIRES_NOTFOUND; } - const unsigned char *pRes64=NULL; + const unsigned char *pRes64=NULL, *pResArm64=NULL; int size32=SizeofResource(hInstance,hResInfo); unsigned int hash; - int size64=0; - if (b64) + int size64=0, sizeArm64=0; + if (extractType==x64) { HRSRC hResInfo=FindResource(hInstance,MAKEINTRESOURCE(IDR_MSI_FILE64),L"MSI_FILE"); if (hResInfo) @@ -140,6 +159,43 @@ static int ExtractMsi( HINSTANCE hInstance, const wchar_t *msiName, bool b64, bo if (pos0;count--,params++) { @@ -233,9 +305,11 @@ int APIENTRY wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCm return 0; } if (_wcsicmp(params[0],L"extract32")==0) - extract=32; + extractType=x86; if (_wcsicmp(params[0],L"extract64")==0) - extract=64; + extractType=x64; + if (_wcsicmp(params[0],L"extractARM64")==0) + extractType=ARM64; if (_wcsicmp(params[0],L"/qn")==0 || _wcsicmp(params[0],L"/q")==0 || _wcsicmp(params[0],L"/quiet")==0 || _wcsicmp(params[0],L"/passive")==0) { bQuiet=true; @@ -255,11 +329,11 @@ int APIENTRY wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCm return ERR_VERRES_NOTFOUND; } - if (extract) + if (extractType != None) { wchar_t msiName[_MAX_PATH]; - Sprintf(msiName,_countof(msiName),L"OpenShellSetup%d_%d_%d_%d.msi",extract,HIWORD(pVer->dwProductVersionMS),LOWORD(pVer->dwProductVersionMS),HIWORD(pVer->dwProductVersionLS)); - return ExtractMsi(hInstance,msiName,extract==64,bQuiet); + Sprintf(msiName,_countof(msiName),L"OpenShellSetup%s_%d_%d_%d.msi",(extractType==x86?L"32":(extractType==x64?L"64":L"ARM64")),HIWORD(pVer->dwProductVersionMS),LOWORD(pVer->dwProductVersionMS),HIWORD(pVer->dwProductVersionLS)); + return ExtractMsi(hInstance,msiName,extractType,bQuiet); } // check Windows version @@ -282,7 +356,9 @@ int APIENTRY wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCm // dynamically link to IsWow64Process because it is not available for Windows 2000 HMODULE hKernel32=GetModuleHandle(L"kernel32.dll"); FIsWow64Process isWow64Process=(FIsWow64Process)GetProcAddress(hKernel32,"IsWow64Process"); - if (!isWow64Process) + FWow64DisableWow64FsRedirection wow64DisableWow64FsRedirection=(FWow64DisableWow64FsRedirection)GetProcAddress(hKernel32,"Wow64DisableWow64FsRedirection"); + FWow64RevertWow64FsRedirection wow64RevertWow64FsRedirection=(FWow64RevertWow64FsRedirection)GetProcAddress(hKernel32,"Wow64RevertWow64FsRedirection"); + if (!isWow64Process || !wow64DisableWow64FsRedirection || !wow64RevertWow64FsRedirection) { if (!bQuiet) { @@ -295,13 +371,25 @@ int APIENTRY wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCm return ERR_WRONG_OS; } - BOOL b64=FALSE; - isWow64Process(GetCurrentProcess(),&b64); + // Use IsWow64Process2 if it's available (Windows 10 1511+), otherwise fall back to IsWow64Process + FIsWow64Process2 isWow64Process2=(FIsWow64Process2)GetProcAddress(hKernel32,"IsWow64Process2"); + if (isWow64Process2) + { + USHORT processMachine = 0, nativeMachine = 0; + isWow64Process2(GetCurrentProcess(), &processMachine, &nativeMachine); + extractType=nativeMachine==IMAGE_FILE_MACHINE_AMD64?x64:nativeMachine==IMAGE_FILE_MACHINE_ARM64?ARM64:x86; + } + else + { + BOOL x64=FALSE; + isWow64Process(GetCurrentProcess(),&x64); + extractType=x64?ExtractType::x64:x86; + } wchar_t msiName[_MAX_PATH]; - Sprintf(msiName,_countof(msiName),L"%%ALLUSERSPROFILE%%\\OpenShellSetup%d_%d_%d_%d.msi",b64?64:32,HIWORD(pVer->dwProductVersionMS),LOWORD(pVer->dwProductVersionMS),HIWORD(pVer->dwProductVersionLS)); + Sprintf(msiName,_countof(msiName),L"%%ALLUSERSPROFILE%%\\OpenShellSetup%s_%d_%d_%d.msi",(extractType==x86?L"32":(extractType==x64?L"64":L"ARM64")),HIWORD(pVer->dwProductVersionMS),LOWORD(pVer->dwProductVersionMS),HIWORD(pVer->dwProductVersionLS)); DoEnvironmentSubst(msiName,_countof(msiName)); - int ex=ExtractMsi(hInstance,msiName,b64!=FALSE,bQuiet); + int ex=ExtractMsi(hInstance,msiName,extractType,bQuiet); if (ex) return ex; wchar_t cmdLine[2048]; @@ -316,11 +404,19 @@ int APIENTRY wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCm Sprintf(cmdLine,_countof(cmdLine),L"msiexec.exe /i \"%s\" %s",msiName,lpCmdLine); } + // On ARM64 we must launch msiexec.exe from system32 and not syswow64 as would otherwise happen + PVOID wow64FsRedirVal=NULL; + if (extractType == ARM64) + Wow64DisableWow64FsRedirection(&wow64FsRedirVal); + // start the installer STARTUPINFO startupInfo={sizeof(startupInfo)}; PROCESS_INFORMATION processInfo; memset(&processInfo,0,sizeof(processInfo)); - if (!CreateProcess(NULL,cmdLine,NULL,NULL,TRUE,0,NULL,NULL,&startupInfo,&processInfo)) + BOOL ret=CreateProcess(NULL,cmdLine,NULL,NULL,TRUE,0,NULL,NULL,&startupInfo,&processInfo); + if (extractType == ARM64) + Wow64RevertWow64FsRedirection(wow64FsRedirVal); + if (!ret) { DeleteFile(msiName); if (!bQuiet) diff --git a/Src/Setup/Setup.rc b/Src/Setup/Setup.rc index 8d479c126..020a47b53 100644 --- a/Src/Setup/Setup.rc +++ b/Src/Setup/Setup.rc @@ -102,6 +102,7 @@ END IDR_MSI_FILE32 MSI_FILE "Temp\\Setup32.msi_" IDR_MSI_FILE64 MSI_FILE "Temp\\Setup64.msi_" +IDR_MSI_FILEARM64 MSI_FILE "Temp\\SetupARM64.msi_" IDR_MSI_CHECKSUM MSI_FILE "msichecksum.bin" @@ -126,7 +127,7 @@ END STRINGTABLE BEGIN - IDS_HELP "Open-Shell Setup will install Open-Shell on your computer. Possible command lines:\n - runs the installer normally\n extract32 - extracts the 32-bit MSI\n extract64 - extracts the 64-bit MSI\n help, /? - shows the command line help\n - the options are passed to msiexec\n * if the options contain %MSI% (all caps) the token is replaced by the name of the extracted MSI file\n * if %MSI% is not found, the setup runs ""msiexec /i ""\n * run msiexec with no parameters to see the full list of msiexec options\n\nExamples:\n /qn - runs the installer in quiet mode\n /x %MSI% /qb - uninstalls the product in basic UI level\n /f %MSI% - repairs the product\n /l* log.txt - runs the installer and logs the process in the log.txt file\n /qn ADDLOCAL=ClassicExplorer - installs only Classic Explorer in quiet mode\n /qn ADDLOCAL=StartMenu APPLICATIONFOLDER=C:\\OpenShell - installs only Open-Shell Start Menu in quiet mode in the folder C:\\OpenShell\n ADDLOCAL=StartMenu,ClassicIE - runs the installer in full UI mode with Open-Shell Start Menu and Classic IE checked by default" + IDS_HELP "Open-Shell Setup will install Open-Shell on your computer. Possible command lines:\n - runs the installer normally\n extract32 - extracts the 32-bit MSI\n extract64 - extracts the 64-bit MSI\n extractARM64 - extracts the ARM64 MSI\n help, /? - shows the command line help\n - the options are passed to msiexec\n * if the options contain %MSI% (all caps) the token is replaced by the name of the extracted MSI file\n * if %MSI% is not found, the setup runs ""msiexec /i ""\n * run msiexec with no parameters to see the full list of msiexec options\n\nExamples:\n /qn - runs the installer in quiet mode\n /x %MSI% /qb - uninstalls the product in basic UI level\n /f %MSI% - repairs the product\n /l* log.txt - runs the installer and logs the process in the log.txt file\n /qn ADDLOCAL=ClassicExplorer - installs only Classic Explorer in quiet mode\n /qn ADDLOCAL=StartMenu APPLICATIONFOLDER=C:\\OpenShell - installs only Open-Shell Start Menu in quiet mode in the folder C:\\OpenShell\n ADDLOCAL=StartMenu,ClassicIE - runs the installer in full UI mode with Open-Shell Start Menu and Classic IE checked by default" END #endif // English (U.S.) resources diff --git a/Src/Setup/Setup.vcxproj b/Src/Setup/Setup.vcxproj index 827fc9291..090492dce 100644 --- a/Src/Setup/Setup.vcxproj +++ b/Src/Setup/Setup.vcxproj @@ -64,6 +64,7 @@ + diff --git a/Src/Setup/Setup.vcxproj.filters b/Src/Setup/Setup.vcxproj.filters index 613885939..00a2d7a1a 100644 --- a/Src/Setup/Setup.vcxproj.filters +++ b/Src/Setup/Setup.vcxproj.filters @@ -61,5 +61,6 @@ + \ No newline at end of file diff --git a/Src/Setup/Setup.wxs b/Src/Setup/Setup.wxs index 58b5cddc4..b1a2f993f 100644 --- a/Src/Setup/Setup.wxs +++ b/Src/Setup/Setup.wxs @@ -3,7 +3,7 @@ # This comment is generated by WixEdit, the specific commandline # arguments for the WiX Toolset are stored here. - candleArgs: "" -out ".wixobj" -ext WixUIExtension -ext WixUtilExtension -dx64=0 + candleArgs: "" -out ".wixobj" -ext WixUIExtension -ext WixUtilExtension -dx64=0 -dARM64=0 lightArgs: ".wixobj" -out ".msi" -ext WixUIExtension -ext WixUtilExtension -loc OpenShellText-en-US.wxl --> @@ -11,6 +11,11 @@ + + + + + @@ -22,9 +27,13 @@ - + + not Msix64 + + NOT (WIX_NATIVE_MACHINE AND WIX_NATIVE_MACHINE="43620") + VersionNT>=601 NOT NEWERPRODUCTFOUND OR Installed @@ -59,7 +68,7 @@ - + @@ -71,7 +80,7 @@ - + @@ -98,7 +107,7 @@ - + @@ -443,6 +452,25 @@ + + + + + + + + + + + + + + + + + + + @@ -624,6 +652,11 @@ + + + + + diff --git a/Src/Setup/Utility/Utility.cpp b/Src/Setup/Utility/Utility.cpp index f4cbe7c65..3cc524f4a 100644 --- a/Src/Setup/Utility/Utility.cpp +++ b/Src/Setup/Utility/Utility.cpp @@ -86,7 +86,7 @@ int CalcMsiChecksum( wchar_t *const *params, int count ) // load files wchar_t path1[_MAX_PATH]; - std::vector buf1, buf2; + std::vector buf1, buf2, buf3; Sprintf(path1,_countof(path1),L"%s\\Setup32.msi",params[1]); LoadFile(path1,buf1); if (buf1.empty()) @@ -102,20 +102,30 @@ int CalcMsiChecksum( wchar_t *const *params, int count ) Printf("Failed to open file %s\n",path2); return 1; } + wchar_t path3[_MAX_PATH]; + Sprintf(path3,_countof(path3),L"%s\\SetupARM64.msi",params[1]); + LoadFile(path3,buf3); + if (buf3.empty()) + { + Printf("Failed to open file %s\n",path3); + return 1; + } int len1=(int)buf1.size(); int len2=(int)buf2.size(); + int len3=(int)buf3.size(); for (std::vector::iterator it=buf1.begin();it!=buf1.end();++it) *it^=0xFF; for (std::vector::iterator it=buf2.begin();it!=buf2.end();++it) *it^=0xFF; + for (std::vector::iterator it=buf3.begin();it!=buf3.end();++it) + *it^=0xFF; - // detect common blocks (assuming at least 256K in size and in the same order in both files) - const int BLOCK_SIZE=256*1024; + const int BLOCK_SIZE = 256 * 1024; + // detect x86/x64 common blocks (assuming at least 256K in size and in the same order in both files) std::vector chunks; - int start2=0; - for (int i=0;i chunks2; + for (int i=0,start2=0;i0 && chunk.start2>0 && buf1[chunk.start1-1]==buf3[chunk.start2-1]) + { + chunk.start1--; + chunk.start2--; + chunk.len++; + } + while (chunk.start1+chunk.len::const_iterator it=chunks2.begin();it!=chunks2.end();++it) + { + if (it->start2-start>0) + fwrite(&buf3[start],1,it->start2-start,f); + start=it->start2+it->len; + } + if (len3-start>0) + fwrite(&buf3[start],1,len3-start,f); + fclose(f); + } + + unsigned int fnvs[3]; fnvs[0]=CalcFNVHash(&buf1[0],len1,FNV_HASH0); fnvs[1]=CalcFNVHash(&buf2[0],len2,FNV_HASH0); + fnvs[2]=CalcFNVHash(&buf3[0],len3,FNV_HASH0); // save fnvs and chunks { @@ -193,6 +254,9 @@ int CalcMsiChecksum( wchar_t *const *params, int count ) int count=(int)chunks.size(); fwrite(&count,1,4,f); fwrite(&chunks[0],sizeof(Chunk),count,f); + count=(int)chunks2.size(); + fwrite(&count,1,4,f); + fwrite(&chunks2[0],sizeof(Chunk),count,f); fclose(f); } return 0; @@ -841,7 +905,7 @@ static HRESULT CALLBACK TaskDialogCallback( HWND hwnd, UINT uNotification, WPARA // Open-Shell utility - multiple utilities for building and maintaining Open-Shell // Usage: // no parameters - saves a troubleshooting log -// crcmsi // creates a file with checksum of both msi files +// crcmsi // creates a file with checksum of all msi files // makeEN // extracts the localization resources and creates a sample en-US.DLL // extract // extracts the string table, the dialog text, and the L10N text from a DLL and stores it in a CSV // extract en-us.dll // extracts the string table, the dialog text, and the L10N text from two DLL and stores it in a CSV diff --git a/Src/Setup/Utility/Utility.vcxproj b/Src/Setup/Utility/Utility.vcxproj index b98da855c..744de02c8 100644 --- a/Src/Setup/Utility/Utility.vcxproj +++ b/Src/Setup/Utility/Utility.vcxproj @@ -1,6 +1,10 @@ + + Debug + ARM64 + Debug Win32 @@ -9,6 +13,10 @@ Debug x64 + + Release + ARM64 + Release Win32 @@ -63,6 +71,7 @@ true + true diff --git a/Src/Setup/resource.h b/Src/Setup/resource.h index 85076b8d8..e77b7a46d 100644 --- a/Src/Setup/resource.h +++ b/Src/Setup/resource.h @@ -8,6 +8,7 @@ #define IDS_ERR_CORRUPTED 102 #define IDR_MSI_FILE32 132 #define IDR_MSI_FILE64 164 +#define IDR_MSI_FILEARM64 165 #define IDS_ERR_INTERNAL 166 #define IDS_ERR_EXTRACT 167 #define IDR_MSI_CHECKSUM 167 diff --git a/Src/StartMenu/StartMenu.vcxproj b/Src/StartMenu/StartMenu.vcxproj index c535f82b5..96d346e4c 100644 --- a/Src/StartMenu/StartMenu.vcxproj +++ b/Src/StartMenu/StartMenu.vcxproj @@ -1,6 +1,10 @@ + + Debug + ARM64 + Debug Win32 @@ -9,6 +13,10 @@ Debug x64 + + Release + ARM64 + Release Win32 @@ -17,6 +25,10 @@ Release x64 + + Setup + ARM64 + Setup Win32 diff --git a/Src/StartMenu/StartMenuDLL/StartMenuDLL.vcxproj b/Src/StartMenu/StartMenuDLL/StartMenuDLL.vcxproj index 1da1c24a0..b60797b41 100644 --- a/Src/StartMenu/StartMenuDLL/StartMenuDLL.vcxproj +++ b/Src/StartMenu/StartMenuDLL/StartMenuDLL.vcxproj @@ -1,6 +1,10 @@ + + Debug + ARM64 + Debug Win32 @@ -9,6 +13,10 @@ Debug x64 + + Release + ARM64 + Release Win32 @@ -17,6 +25,10 @@ Release x64 + + Setup + ARM64 + Setup Win32 diff --git a/Src/StartMenu/StartMenuHelper/StartMenuHelper.vcxproj b/Src/StartMenu/StartMenuHelper/StartMenuHelper.vcxproj index c293faf8c..363990fba 100644 --- a/Src/StartMenu/StartMenuHelper/StartMenuHelper.vcxproj +++ b/Src/StartMenu/StartMenuHelper/StartMenuHelper.vcxproj @@ -1,6 +1,14 @@ + + Debug + ARM64 + + + Debug + ARM64EC + Debug Win32 @@ -9,6 +17,14 @@ Debug x64 + + Release + ARM64 + + + Release + ARM64EC + Release Win32 @@ -17,6 +33,14 @@ Release x64 + + Setup + ARM64 + + + Setup + ARM64EC + Setup Win32 @@ -53,6 +77,13 @@ $(ProjectName)64 + + $(ProjectName)64 + + + $(ProjectName)64 + true + _USRDLL;%(PreprocessorDefinitions) From 8c713cc5fd179cbdfb79c57349436b973ac7d6a4 Mon Sep 17 00:00:00 2001 From: ge0rdi Date: Sat, 24 May 2025 08:31:51 +0200 Subject: [PATCH 26/39] Update ARM notice in readme --- README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 76e3aa704..0c366359a 100644 --- a/README.md +++ b/README.md @@ -23,8 +23,11 @@ You can find the latest stable version here: [![GitHub All Releases](https://img.shields.io/github/downloads/Open-Shell/Open-Shell-Menu/total?style=for-the-badge&color=4bc2ee&logo=github)](https://github.com/Open-Shell/Open-Shell-Menu/releases/latest) -### ⚠️ Windows for ARM compatibility ⚠️ -Open-Shell is not compatible with Windows for ARM. If you install it on a Windows for ARM installation (ex. using Parallels Desktop on an Apple Silicon Mac), you will no longer be able to log into your account the next time you reboot. Please refrain from installing Open-Shell on Windows for ARM. +> [!IMPORTANT] +> #### Windows for ARM compatibility +> Open-Shell is compatible with Windows for ARM since version [4.4.196](https://github.com/Open-Shell/Open-Shell-Menu/releases/tag/v4.4.196). +> +> If you install older one on a Windows for ARM installation (ex. using > Parallels Desktop on an Apple Silicon Mac), you will no longer be able to log into your account the next time you > reboot. Please refrain from installing Open-Shell on Windows for ARM. ### Temporary Translation/Language Solution 1. Download [language DLL](https://coddec.github.io/Classic-Shell/www.classicshell.net/translations/index.html) From dc1994e713baa1b67fe0d63f37b479a7894d5256 Mon Sep 17 00:00:00 2001 From: benja2998 <197428407+benja2998@users.noreply.github.com> Date: Sun, 25 May 2025 01:23:42 -0400 Subject: [PATCH 27/39] Remove random '>' symbol in readme (#2223) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0c366359a..ad1d49929 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ You can find the latest stable version here: > #### Windows for ARM compatibility > Open-Shell is compatible with Windows for ARM since version [4.4.196](https://github.com/Open-Shell/Open-Shell-Menu/releases/tag/v4.4.196). > -> If you install older one on a Windows for ARM installation (ex. using > Parallels Desktop on an Apple Silicon Mac), you will no longer be able to log into your account the next time you > reboot. Please refrain from installing Open-Shell on Windows for ARM. +> If you install older one on a Windows for ARM installation (ex. using > Parallels Desktop on an Apple Silicon Mac), you will no longer be able to log into your account the next time you reboot. Please refrain from installing Open-Shell on Windows for ARM. ### Temporary Translation/Language Solution 1. Download [language DLL](https://coddec.github.io/Classic-Shell/www.classicshell.net/translations/index.html) From 4ebeadd949d05506428dacf362e5f600d60ba50c Mon Sep 17 00:00:00 2001 From: benja2998 <197428407+benja2998@users.noreply.github.com> Date: Wed, 25 Jun 2025 11:27:18 -0400 Subject: [PATCH 28/39] Remove another '>' symbol (#2243) Remove another 'z --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ad1d49929..6597b57a2 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ You can find the latest stable version here: > #### Windows for ARM compatibility > Open-Shell is compatible with Windows for ARM since version [4.4.196](https://github.com/Open-Shell/Open-Shell-Menu/releases/tag/v4.4.196). > -> If you install older one on a Windows for ARM installation (ex. using > Parallels Desktop on an Apple Silicon Mac), you will no longer be able to log into your account the next time you reboot. Please refrain from installing Open-Shell on Windows for ARM. +> If you install older one on a Windows for ARM installation (ex. using Parallels Desktop on an Apple Silicon Mac), you will no longer be able to log into your account the next time you reboot. Please refrain from installing Open-Shell on Windows for ARM. ### Temporary Translation/Language Solution 1. Download [language DLL](https://coddec.github.io/Classic-Shell/www.classicshell.net/translations/index.html) From 40d8f5b119fbb118d2d3a4c96d1f2ecc9d637ba8 Mon Sep 17 00:00:00 2001 From: ge0rdi Date: Sun, 30 Nov 2025 16:02:35 +0100 Subject: [PATCH 29/39] AppVeyor: New deployment token --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index a7d00344c..a9390d421 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -21,5 +21,5 @@ deploy: on: APPVEYOR_ACCOUNT_NAME: passionate-coder auth_token: - secure: SOu6Y71k0oIxXJR35x+7ZTrqDa3HqUM4kLNJc+DbohPz9zhVHh9O8QYwmI7LI0qslug5L11fo9pZVfVgZttw4eBgooHaX9TNBTTA6sJItkXqMX+M6mKAG7tbI/O3Eg0v + secure: SOu6Y71k0oIxXJR35x+7ZeU/+WRW8kaGnCWcbR3OVOd8HeCJwB1Tw3hUJa5EveLGKaGoMKGqAh01Pwc8tWX4xmphZsYYUr09IVjA0+rqgN5VT87CXD6OQxUxBJ7g+9IN prerelease: true From dd57854da129a78a6d65e6cc418b114069701824 Mon Sep 17 00:00:00 2001 From: ge0rdi Date: Fri, 12 Dec 2025 09:09:21 +0100 Subject: [PATCH 30/39] Scale custom button image according to current DPI (#2248) Fixes #2246 --- Src/Lib/ResourceHelper.cpp | 17 ++++++++++++++--- Src/Lib/ResourceHelper.h | 4 +++- Src/StartMenu/StartMenuDLL/StartButton.cpp | 4 ++-- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/Src/Lib/ResourceHelper.cpp b/Src/Lib/ResourceHelper.cpp index 62a32fb8b..b7388a554 100644 --- a/Src/Lib/ResourceHelper.cpp +++ b/Src/Lib/ResourceHelper.cpp @@ -384,14 +384,14 @@ HICON CreateDisabledIcon( HICON hIcon, int iconSize ) } // Loads an image file into a bitmap and optionally resizes it -HBITMAP LoadImageFile( const wchar_t *path, const SIZE *pSize, bool bUseAlpha, bool bPremultiply, std::vector *pButtonAnim ) +HBITMAP LoadImageFile( const wchar_t *path, const SIZE *pSize, bool bUseAlpha, bool bPremultiply, std::vector *pButtonAnim, UINT dpi ) { HBITMAP srcBmp=NULL; if (_wcsicmp(PathFindExtension(path),L".bmp")==0) { srcBmp=(HBITMAP)LoadImage(NULL,path,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_LOADFROMFILE); } - if (srcBmp && !pSize) + if (srcBmp && !pSize && !dpi) return srcBmp; CComPtr pFactory; if (FAILED(pFactory.CoCreateInstance(CLSID_WICImagingFactory))) @@ -482,6 +482,12 @@ HBITMAP LoadImageFile( const wchar_t *path, const SIZE *pSize, bool bUseAlpha, b else frameHeightD=frameWidthD*frameHeightS/frameWidthS; } + + if (dpi) + { + frameWidthD=ScaleForDpi(dpi,frameWidthD); + frameHeightD=ScaleForDpi(dpi,frameHeightD); + } } BITMAPINFO bi={0}; @@ -946,7 +952,12 @@ UINT GetDpi(HWND hwnd) return dpi; } +int ScaleForDpi(UINT dpi, int value) +{ + return MulDiv(value, dpi, USER_DEFAULT_SCREEN_DPI); +} + int ScaleForDpi(HWND hwnd, int value) { - return MulDiv(value, GetDpi(hwnd), USER_DEFAULT_SCREEN_DPI); + return ScaleForDpi(GetDpi(hwnd), value); } diff --git a/Src/Lib/ResourceHelper.h b/Src/Lib/ResourceHelper.h index d44eb6b59..5afc1d1dc 100644 --- a/Src/Lib/ResourceHelper.h +++ b/Src/Lib/ResourceHelper.h @@ -35,7 +35,7 @@ HICON ShExtractIcon( const char *path, int index, int iconSize ); HBITMAP BitmapFromIcon( HICON hIcon, int iconSize, unsigned int **pBits, bool bDestroyIcon ); // Loads an image file into a bitmap and optionally resizes it -HBITMAP LoadImageFile( const wchar_t *path, const SIZE *pSize, bool bUseAlpha, bool bPremultiply, std::vector *pButtonAnim ); +HBITMAP LoadImageFile( const wchar_t *path, const SIZE *pSize, bool bUseAlpha, bool bPremultiply, std::vector *pButtonAnim, UINT dpi=0 ); // Loads a bitmap from a IMAGE resource HBITMAP LoadImageResource( HMODULE hModule, const wchar_t *name, bool bTopDown, bool bPremultiply ); @@ -88,6 +88,8 @@ HFONT CreateFontSetting( const wchar_t *fontStr, int dpi ); // Return DPI of given window (or system DPI on older systems) UINT GetDpi(HWND hwnd = nullptr); +// Scale given value according to given DPI +int ScaleForDpi(UINT dpi, int value); // Scale given value according to DPI of window int ScaleForDpi(HWND hwnd, int value); diff --git a/Src/StartMenu/StartMenuDLL/StartButton.cpp b/Src/StartMenu/StartMenuDLL/StartButton.cpp index 39d07d419..f279fa10f 100644 --- a/Src/StartMenu/StartMenuDLL/StartButton.cpp +++ b/Src/StartMenu/StartMenuDLL/StartButton.cpp @@ -526,16 +526,16 @@ void CStartButton::LoadBitmap( void ) } else { + int dpi=GetDpi(GetParent()); bool bResource=false; std::vector buttonAnim; if (*path) { - m_Bitmap=LoadImageFile(path,&size,true,true,&buttonAnim); + m_Bitmap=LoadImageFile(path,&size,true,true,&buttonAnim,dpi); } if (!m_Bitmap) { int id; - int dpi=GetDpi(GetParent()); if (dpi<120) id=IDB_BUTTON96; else if (dpi<144) From e2758ec37688b00e55ba50ea3db0bba9abe66604 Mon Sep 17 00:00:00 2001 From: Anixx Date: Sat, 24 Jan 2026 12:26:25 +0200 Subject: [PATCH 31/39] Support for unthemed taskbar (#2369) * Support for unthemed taskbar See this discussion: https://github.com/Open-Shell/Open-Shell-Menu/discussions/2367 * Refactor color handling in StartMenuDLL --- Src/StartMenu/StartMenuDLL/StartMenuDLL.cpp | 23 +++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/Src/StartMenu/StartMenuDLL/StartMenuDLL.cpp b/Src/StartMenu/StartMenuDLL/StartMenuDLL.cpp index 9f26f2284..9111cb40c 100644 --- a/Src/StartMenu/StartMenuDLL/StartMenuDLL.cpp +++ b/Src/StartMenu/StartMenuDLL/StartMenuDLL.cpp @@ -1624,7 +1624,7 @@ static void ComputeTaskbarColors( int *data ) { bool bDefLook; int look=GetSettingInt(L"TaskbarLook",bDefLook); - if (GetWinVersion()bCustomLook && SetWindowCompositionAttribute && GetWinVersion()WIN_VER_WIN7) { - color=GetSystemGlassColor8(); - color=((color&0xFF)<<16)|(color&0xFF00)|((color>>16)&0xFF); + if (IsAppThemed()) + { + color=GetSystemGlassColor8(); + color=((color&0xFF)<<16)|(color&0xFF00)|((color>>16)&0xFF); + } + else + { + color=GetSysColor(COLOR_BTNFACE); + } } BITMAPINFO bi={0}; bi.bmiHeader.biSize=sizeof(BITMAPINFOHEADER); @@ -3012,7 +3020,10 @@ static void InitStartMenuDLL( void ) if (GetWinVersion()<=WIN_VER_WIN81) g_DrawThemeBackgroundHook=SetIatHook(module,"uxtheme.dll","DrawThemeBackground",DrawThemeBackground2); g_DrawThemeTextHook=SetIatHook(module,"uxtheme.dll","DrawThemeText",DrawThemeText2); - g_DrawThemeTextExHook=SetIatHook(module,"uxtheme.dll","DrawThemeTextEx",DrawThemeTextEx2); + if (IsAppThemed()) + { + g_DrawThemeTextExHook=SetIatHook(module,"uxtheme.dll","DrawThemeTextEx",DrawThemeTextEx2); + } g_DrawThemeTextCtlHook=SetIatHook(GetModuleHandle(L"comctl32.dll"),"uxtheme.dll","DrawThemeText",DrawThemeText2); if (GetWinVersion()>=WIN_VER_WIN10) g_SetWindowCompositionAttributeHook=SetIatHook(module,"user32.dll","SetWindowCompositionAttribute",SetWindowCompositionAttribute2); From 32ad90f17dadc2744da03d08ab6f4b28c361c3ea Mon Sep 17 00:00:00 2001 From: "Nicholas N." <51804513+nnyj@users.noreply.github.com> Date: Sat, 18 Apr 2026 21:18:23 +0800 Subject: [PATCH 32/39] Fix search auto-selecting wrong item before programs finish loading (#2451) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fix: defer auto-select until programs loaded to prevent wrong search result selection When search results refresh mid-collection, OnRefresh auto-selects the first result item. If programs haven't loaded yet, Settings category appears first and gets selected. If user hits Enter in that window, wrong item launches. Skip auto-select when search is still in progress and no programs have been found yet. Next refresh after programs load will select correctly. Fixes Open-Shell/Open-Shell-Menu#456 Fixes Open-Shell/Open-Shell-Menu#1982 Fixes Open-Shell/Open-Shell-Menu#4 > 🤖 Generated with [Claude Code](https://claude.ai/code) Co-authored-by: Claude --- Src/StartMenu/StartMenuDLL/MenuContainer.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Src/StartMenu/StartMenuDLL/MenuContainer.cpp b/Src/StartMenu/StartMenuDLL/MenuContainer.cpp index 52ed2c738..856ead1e4 100644 --- a/Src/StartMenu/StartMenuDLL/MenuContainer.cpp +++ b/Src/StartMenu/StartMenuDLL/MenuContainer.cpp @@ -6366,7 +6366,10 @@ LRESULT CMenuContainer::OnRefresh( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL } } else if (m_Items[m_OriginalCount].id==MENU_SEARCH_CATEGORY) - hotItem=m_OriginalCount+1; + { + if (!bSearching || !s_SearchResults.programs.empty()) + hotItem=m_OriginalCount+1; + } } else hotItem=-1; From 7566280973d46fb7e81efdd94f528b65ab5db085 Mon Sep 17 00:00:00 2001 From: coolvitto <160416811+coolvitto@users.noreply.github.com> Date: Tue, 12 May 2026 02:24:28 +0900 Subject: [PATCH 33/39] Update font face names in Japanese localization (#2409) --- Src/Localization/WixUI/WixUI_ja-jp.wxl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Src/Localization/WixUI/WixUI_ja-jp.wxl b/Src/Localization/WixUI/WixUI_ja-jp.wxl index f6e5e4faf..5487b6ccf 100644 --- a/Src/Localization/WixUI/WixUI_ja-jp.wxl +++ b/Src/Localization/WixUI/WixUI_ja-jp.wxl @@ -31,7 +31,7 @@ 12 9 8 - "MS UI Gothic", "MS PGothic", "MS Pゴシック", "MS Gothic", "MS ゴシック", Osaka, Tahoma + "MS UI Gothic", "MS PGothic", "MS Pゴシック", "MS Gothic", "MS ゴシック", Yu Gothic UI, Tahoma [ProductName] セットアップ 場所(&L): From b2070640ffbe047791de25f83063fb62bbc7d22f Mon Sep 17 00:00:00 2001 From: ge0rdi Date: Tue, 12 May 2026 21:12:51 +0200 Subject: [PATCH 34/39] Fix open/save file dialog getting stuck after Windows 11 update (#2457) We will run those APIs on separate STA thread and pump messages while waiting for the dialog to end. fixes #2431 fixes #2426 fixes #2418 fixes #2417 fixes #2390 fixes #2372 fixes #2371 fixes #2370 fixes #2364 fixes #2361 fixes #2360 fixes #2343 fixes #2332 fixes #2322 fixes #2320 fixes #2319 fixes #2312 fixes #2299 --- Src/Lib/Settings.cpp | 4 +- Src/Lib/SettingsUIHelper.cpp | 93 ++++++++++++++++++++++++++++++++++-- Src/Lib/SettingsUIHelper.h | 4 ++ 3 files changed, 94 insertions(+), 7 deletions(-) diff --git a/Src/Lib/Settings.cpp b/Src/Lib/Settings.cpp index 8937d4c39..599cb9fed 100644 --- a/Src/Lib/Settings.cpp +++ b/Src/Lib/Settings.cpp @@ -1670,7 +1670,7 @@ LRESULT CSettingsDlg::OnBackup( WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& ofn.lpstrTitle=title; ofn.lpstrDefExt=L".xml"; ofn.Flags=OFN_DONTADDTORECENT|OFN_ENABLESIZING|OFN_EXPLORER|OFN_PATHMUSTEXIST|OFN_OVERWRITEPROMPT|OFN_HIDEREADONLY|OFN_NOCHANGEDIR; - if (GetSaveFileName(&ofn)) + if (GetSaveFileNameSafe(&ofn)) { CString err=g_SettingsManager.SaveSettingsXml(path); if (!err.IsEmpty()) @@ -1699,7 +1699,7 @@ LRESULT CSettingsDlg::OnBackup( WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& CString title=LoadStringEx(IDS_XML_TITLE_LOAD); ofn.lpstrTitle=title; ofn.Flags=OFN_DONTADDTORECENT|OFN_ENABLESIZING|OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_NOCHANGEDIR; - if (GetOpenFileName(&ofn)) + if (GetOpenFileNameSafe(&ofn)) { SetCurTab(m_Index,true); // reload tab once to force-close any active edit boxes CString error=g_SettingsManager.LoadSettingsXml(path); diff --git a/Src/Lib/SettingsUIHelper.cpp b/Src/Lib/SettingsUIHelper.cpp index 9372677c5..9b988e282 100644 --- a/Src/Lib/SettingsUIHelper.cpp +++ b/Src/Lib/SettingsUIHelper.cpp @@ -15,6 +15,7 @@ #include #include #include +#include const KNOWNFOLDERID FOLDERID_DesktopRoot={'DESK', 'TO', 'P', {'D', 'E', 'S', 'K', 'T', 'O', 'P', 0x00}}; @@ -1193,7 +1194,7 @@ bool BrowseCommandHelper( HWND parent, wchar_t *text ) ofn.lpstrFile=text; ofn.nMaxFile=_MAX_PATH; ofn.Flags=OFN_DONTADDTORECENT|OFN_ENABLESIZING|OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_NOCHANGEDIR|OFN_NODEREFERENCELINKS; - if (GetOpenFileName(&ofn)) + if (GetOpenFileNameSafe(&ofn)) { wchar_t buf[_MAX_PATH]; UnExpandEnvStrings(text,buf,_countof(buf)); @@ -1216,7 +1217,8 @@ bool BrowseCommandHelper( HWND parent, wchar_t *text ) return false; } -bool BrowseLinkHelper( HWND parent, wchar_t *text, bool bFoldersOnly ) +// Internal implementation that must be run on an STA thread with COM initialized. +static bool BrowseLinkHelperImpl( HWND parent, wchar_t *text, bool bFoldersOnly ) { DoEnvironmentSubst(text,_MAX_PATH); @@ -1276,6 +1278,41 @@ bool BrowseLinkHelper( HWND parent, wchar_t *text, bool bFoldersOnly ) return pResult!=NULL; } +// Run IFileOpenDialog on a separate STA thread and pump messages on the caller while waiting. +bool BrowseLinkHelper( HWND parent, wchar_t *text, bool bFoldersOnly ) +{ + bool result = false; + + std::thread worker([&parent, &text, &bFoldersOnly, &result]() mutable { + CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); + result = BrowseLinkHelperImpl(parent, text, bFoldersOnly); + CoUninitialize(); + }); + + // Pump messages while waiting for the worker (dialog) to finish + while (true) + { + HANDLE hWorker = worker.native_handle(); + if (MsgWaitForMultipleObjects(1, &hWorker, FALSE, INFINITE, QS_ALLINPUT) == WAIT_OBJECT_0) + break; + + MSG msg; + while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) + { + if (msg.message == WM_QUIT) + { + PostQuitMessage((int)msg.wParam); + break; + } + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + worker.join(); + + return result; +} + bool BrowseIconHelper( HWND parent, wchar_t *text ) { int id=0; @@ -2011,7 +2048,7 @@ LRESULT CBrowseForIconDlg::OnBrowse( WORD wNotifyCode, WORD wID, HWND hWndCtl, B CString title=LoadStringEx(IDS_ICON_TITLE); ofn.lpstrTitle=title; ofn.Flags=OFN_DONTADDTORECENT|OFN_ENABLESIZING|OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_NOCHANGEDIR; - if (GetOpenFileName(&ofn)) + if (GetOpenFileNameSafe(&ofn)) { wchar_t buf[_MAX_PATH]; UnExpandEnvStrings(path,buf,_countof(buf)); @@ -2210,7 +2247,7 @@ bool BrowseForBitmap( HWND hWndParent, wchar_t *path, bool bAllowJpeg ) CString title=LoadStringEx(IDS_BMP_TITLE); ofn.lpstrTitle=title; ofn.Flags=OFN_DONTADDTORECENT|OFN_ENABLESIZING|OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_NOCHANGEDIR; - if (GetOpenFileName(&ofn)) + if (GetOpenFileNameSafe(&ofn)) { wchar_t buf[_MAX_PATH]; UnExpandEnvStrings(path,buf,_countof(buf)); @@ -2242,7 +2279,7 @@ bool BrowseForSound( HWND hWndParent, wchar_t *path ) CString title=LoadStringEx(IDS_WAV_TITLE); ofn.lpstrTitle=title; ofn.Flags=OFN_DONTADDTORECENT|OFN_ENABLESIZING|OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_NOCHANGEDIR; - if (GetOpenFileName(&ofn)) + if (GetOpenFileNameSafe(&ofn)) { wchar_t buf[_MAX_PATH]; UnExpandEnvStrings(path,buf,_countof(buf)); @@ -3630,3 +3667,49 @@ DWORD ParseColor(const wchar_t* str) wchar_t* end; return wcstoul(str, &end, 16) & 0xFFFFFF; } + +// Run GetOpenFileName/GetSaveFileName on a separate STA thread and pump messages on the caller +template +static BOOL GetFileNameSafe(OPENFILENAME* pOfn) +{ + BOOL result = FALSE; + + std::thread worker([&pOfn, &result]() mutable { + CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); + result = Fnc(pOfn); + CoUninitialize(); + }); + + // Pump messages while waiting for the worker (dialog) to finish + while (true) + { + HANDLE hWorker = worker.native_handle(); + if (MsgWaitForMultipleObjects(1, &hWorker, FALSE, INFINITE, QS_ALLINPUT) == WAIT_OBJECT_0) + break; + + MSG msg; + while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) + { + if (msg.message == WM_QUIT) + { + PostQuitMessage((int)msg.wParam); + break; + } + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + worker.join(); + + return result; +} + +BOOL GetOpenFileNameSafe(OPENFILENAME* pOfn) +{ + return GetFileNameSafe(pOfn); +} + +BOOL GetSaveFileNameSafe(OPENFILENAME* pOfn) +{ + return GetFileNameSafe(pOfn); +} diff --git a/Src/Lib/SettingsUIHelper.h b/Src/Lib/SettingsUIHelper.h index acdea3f63..8a66f72c3 100644 --- a/Src/Lib/SettingsUIHelper.h +++ b/Src/Lib/SettingsUIHelper.h @@ -395,3 +395,7 @@ DWORD BgrToRgb(DWORD val); // parse color from hexadecimal string DWORD ParseColor(const wchar_t* str); + +// safe versions of GetOpenFileName/GetSaveFileName (run API on a separate STA thread and pump messages on the caller) +BOOL GetOpenFileNameSafe(OPENFILENAME* pOfn); +BOOL GetSaveFileNameSafe(OPENFILENAME* pOfn); From dfb307b3b71d8fee7811bbe6c7b6ca9f7eddd5d8 Mon Sep 17 00:00:00 2001 From: ge0rdi Date: Wed, 13 May 2026 20:07:54 +0200 Subject: [PATCH 35/39] Fix C++23 warnings warning C5333: backslash and newline separated by space is treated as a line continuation in C++23 and later --- Src/StartMenu/StartMenuDLL/ItemManager.h | 2 +- Src/StartMenu/StartMenuHelper/StartMenuExt.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Src/StartMenu/StartMenuDLL/ItemManager.h b/Src/StartMenu/StartMenuDLL/ItemManager.h index 0c273b6ca..e10775bdf 100644 --- a/Src/StartMenu/StartMenuDLL/ItemManager.h +++ b/Src/StartMenu/StartMenuDLL/ItemManager.h @@ -383,7 +383,7 @@ class CItemManager static DWORD CALLBACK StaticRefreshInfoThread( void *param ); static DWORD CALLBACK SaveCacheFileThread( void *param ); - // all paths are in caps and end with \ + // all paths are in caps and end with backslash CString m_RootStartMenu1; CString m_RootStartMenu2; CString m_RootStartMenu3; diff --git a/Src/StartMenu/StartMenuHelper/StartMenuExt.h b/Src/StartMenu/StartMenuHelper/StartMenuExt.h index f7f11aa75..8ad501941 100644 --- a/Src/StartMenu/StartMenuHelper/StartMenuExt.h +++ b/Src/StartMenu/StartMenuHelper/StartMenuExt.h @@ -55,8 +55,8 @@ END_COM_MAP() STDMETHODIMP InvokeCommand( CMINVOKECOMMANDINFO *pInfo ); STDMETHODIMP GetCommandString( UINT_PTR idCmd, UINT uFlags, UINT* pwReserved, LPSTR pszName, UINT cchMax ); - wchar_t m_PinFolder1[_MAX_PATH]; // ending with \ - wchar_t m_PinFolder2[_MAX_PATH]; // ending with \ + wchar_t m_PinFolder1[_MAX_PATH]; // ending with backslash + wchar_t m_PinFolder2[_MAX_PATH]; // ending with backslash wchar_t m_FileName[_MAX_PATH]; LPITEMIDLIST m_FilePidl; bool m_bInPinFolder1, m_bInPinFolder2; From f5fa8f0ea31ace15d7c027bebabab6900e8a8a51 Mon Sep 17 00:00:00 2001 From: ge0rdi Date: Sat, 16 May 2026 08:19:20 +0200 Subject: [PATCH 36/39] Add github build workflow --- .github/workflows/build.yml | 94 +++++++++++++++++++++++++++++++++++++ Src/Setup/BuildArchives.bat | 2 + 2 files changed, 96 insertions(+) create mode 100644 .github/workflows/build.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 000000000..77c4edfd5 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,94 @@ +name: Build + +permissions: + contents: read # Default to secure + +on: + pull_request: + branches: + - master + paths: + - 'Src/**' + - 'Localization/**' + - '.github/workflows/build.yml' + + workflow_dispatch: # allows manual trigger for main/master + +jobs: + build: + runs-on: windows-2022 + outputs: + new_version: ${{ steps.versioning.outputs.NEW_VERSION }} + steps: + - name: Checkout code + uses: actions/checkout@v6 + with: + fetch-depth: 0 # Essential to see all tags + + - name: Prepare version + id: versioning + shell: pwsh + run: | + # Fetch latest tag + $latestTag = git describe --tags --abbrev=0 2>$null + + if ($latestTag -notmatch '^v\d+\.\d+\.\d+$') { + Write-Error "Error: Could not find a valid vX.Y.Z tag in history. Found: '$latestTag'" + exit 1 + } + + # Parse and Increment + $version = [version]$latestTag.Substring(1) + $baseVersion = "$($version.Major).$($version.Minor).$($version.Build + 1)" + + # Handle PR Suffix + if ("${{ github.event_name }}" -eq "pull_request") { + $shortSha = "${{ github.event.pull_request.head.sha }}".Substring(0, 7) + $finalVersion = "$baseVersion-pr-$shortSha" + } else { + $finalVersion = $baseVersion + } + + # Export + "NEW_VERSION=$finalVersion" | Out-File -FilePath $env:GITHUB_OUTPUT -Append + Write-Host "Building version: $finalVersion" + + - name: Build + shell: cmd + env: + APPVEYOR_BUILD_VERSION: ${{ steps.versioning.outputs.NEW_VERSION }} + run: Src\Setup\__MakeFinal.bat + + - name: Upload artifacts + uses: actions/upload-artifact@v7 + with: + name: OpenShell + path: | + Src/Setup/Final/ + !Src/Setup/Final/OpenShellLoc.zip + + release: + if: github.event_name == 'workflow_dispatch' # Only manual master builds + needs: build + runs-on: ubuntu-latest # Cheaper/faster than windows for just uploading + permissions: + contents: write # Elevate permissions ONLY for this job + steps: + - name: Download artifacts + uses: actions/download-artifact@v8 + with: + name: OpenShell + + - name: Create GitHub Release + uses: softprops/action-gh-release@v3 + with: + tag_name: v${{ needs.build.outputs.new_version }} + name: ${{ needs.build.outputs.new_version }} + generate_release_notes: true + prerelease: true + files: | + OpenShellSetup*.exe + OpenShellSymbols_*.7z + Utility.exe + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/Src/Setup/BuildArchives.bat b/Src/Setup/BuildArchives.bat index 1e6339f95..b3000d7fd 100644 --- a/Src/Setup/BuildArchives.bat +++ b/Src/Setup/BuildArchives.bat @@ -20,6 +20,8 @@ cd .. cd Setup +copy /B ..\..\build\bin\Release\Utility.exe .\Final > nul + if defined APPVEYOR ( appveyor PushArtifact ..\..\build\bin\Release\Utility.exe ) From 7baba47baf0f2e550f888df4c856b5240269e12a Mon Sep 17 00:00:00 2001 From: ge0rdi Date: Sat, 16 May 2026 08:27:14 +0200 Subject: [PATCH 37/39] Add github build badge --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6597b57a2..f05fed121 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ A collection of utilities bringing back classic features to Windows. *Originally* **[Classic Shell](http://www.classicshell.net)** *by [Ivo Beltchev](https://sourceforge.net/u/ibeltchev/profile/)* -[![GitHub Release](https://img.shields.io/github/release/Open-Shell/Open-Shell-Menu.svg?style=flat-square)](https://github.com/Open-Shell/Open-Shell-Menu/releases/latest)  [![GitHub Pre-Release](https://img.shields.io/github/release/Open-Shell/Open-Shell-Menu/all.svg?style=flat-square)](https://github.com/Open-Shell/Open-Shell-Menu/releases)  [![Build status](https://img.shields.io/appveyor/build/passionate-coder/Open-Shell-Menu?logo=appveyor&style=flat-square)](https://ci.appveyor.com/project/passionate-coder/open-shell-menu/branch/master)  [![GitQ](https://img.shields.io/badge/gitq-discussions-1577fa?style=flat-square)](https://gitq.com/passionate-coder/Classic-Start)  [![Gitter chat](https://img.shields.io/gitter/room/badges/shields.svg?color=lightseagreen&logo=gitter&style=flat-square)](https://gitter.im/open-shell/Lobby)  [![Discord](https://img.shields.io/discord/757701054782636082?color=mediumslateblue&label=Discord&logo=discord&logoColor=white&style=flat-square)](https://discord.gg/7H6arr5) +[![GitHub Release](https://img.shields.io/github/release/Open-Shell/Open-Shell-Menu.svg?style=flat-square)](https://github.com/Open-Shell/Open-Shell-Menu/releases/latest)  [![GitHub Pre-Release](https://img.shields.io/github/release/Open-Shell/Open-Shell-Menu/all.svg?style=flat-square)](https://github.com/Open-Shell/Open-Shell-Menu/releases)  [![Build](https://github.com/Open-Shell/Open-Shell-Menu/actions/workflows/build.yml/badge.svg)](https://github.com/Open-Shell/Open-Shell-Menu/actions/workflows/build.yml)  [![Build status](https://img.shields.io/appveyor/build/passionate-coder/Open-Shell-Menu?logo=appveyor&style=flat-square)](https://ci.appveyor.com/project/passionate-coder/open-shell-menu/branch/master)  [![GitQ](https://img.shields.io/badge/gitq-discussions-1577fa?style=flat-square)](https://gitq.com/passionate-coder/Classic-Start)  [![Gitter chat](https://img.shields.io/gitter/room/badges/shields.svg?color=lightseagreen&logo=gitter&style=flat-square)](https://gitter.im/open-shell/Lobby)  [![Discord](https://img.shields.io/discord/757701054782636082?color=mediumslateblue&label=Discord&logo=discord&logoColor=white&style=flat-square)](https://discord.gg/7H6arr5) [Open-Shell Homepage](https://open-shell.github.io/Open-Shell-Menu) From f15a0fbd759764f19d58beb547795d557c7b86d0 Mon Sep 17 00:00:00 2001 From: ge0rdi Date: Fri, 29 May 2026 20:09:03 +0200 Subject: [PATCH 38/39] Adjust wording of IDS_STARTSCREEN_ITEM Fixes #2472 --- Src/StartMenu/StartMenuDLL/StartMenuDLL.rc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Src/StartMenu/StartMenuDLL/StartMenuDLL.rc b/Src/StartMenu/StartMenuDLL/StartMenuDLL.rc index b7007ee1e..fbaf3e9a2 100644 --- a/Src/StartMenu/StartMenuDLL/StartMenuDLL.rc +++ b/Src/StartMenu/StartMenuDLL/StartMenuDLL.rc @@ -1081,9 +1081,9 @@ BEGIN IDS_RIGHT_SHIFT_TIP "When this is checked, right-click on the start button will open the standard Windows context menu instead of the Open-Shell menu. Otherwise Shift+right-click will open it" IDS_RIGHT_SHIFTX "Right click opens Win+X menu" IDS_RIGHT_SHIFTX_TIP "When this is checked, right-click on the start button will open the Win+X power menu instead of the Open-Shell menu. Otherwise Shift+right-click will open it" - IDS_STARTSCREEN_ITEM "Show Start screen shortcut" + IDS_STARTSCREEN_ITEM "Show Start Menu/Screen shortcut" IDS_STARTSCREEN_ITEM_TIP - "When this is checked, the main menu will contain a shortcut to open the Start screen" + "When this is checked, the main menu will contain a shortcut to open original Start menu/screen" IDS_MIN_HEIGHT "Minimum menu height" IDS_MIN_HEIGHT_TIP "The main menu will be at least as tall as this many search results" IDS_GLASS_OVERRIDE "Override glass color" From 9518c3b6503c2ae64d2aecab7a04ef79b6d904e9 Mon Sep 17 00:00:00 2001 From: ge0rdi Date: Sat, 30 May 2026 22:00:09 +0200 Subject: [PATCH 39/39] Make sure to run `release` step only on manual builds from master --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 77c4edfd5..f6b1819bc 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -68,7 +68,7 @@ jobs: !Src/Setup/Final/OpenShellLoc.zip release: - if: github.event_name == 'workflow_dispatch' # Only manual master builds + if: github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/master' # Only manual master builds needs: build runs-on: ubuntu-latest # Cheaper/faster than windows for just uploading permissions: