[appstore] don't exit on unhandled parameters

* Looks like executables installed from the Windows Store launch with a "/InvokerPRAID"
  added parameter, which of course BREAKS apps that have a defined set of parameters
  and don't except that Microsoft would gingerly add random unwanted stuff there...
* This results in our argument processing loop to cause early exit on account that an
  unexpected option was provided.
* Fix this by adding an explicit check for /InvokerPRAID and not exiting on unhandled
  params.
* Also set an explicit Windows.FullTrustApplication and remove splash screen.
* Also update _pre-commit.sh to update appstore build number automatically.
This commit is contained in:
Pete Batard 2021-02-05 10:54:10 +00:00
parent 0d604fbcf1
commit 986234230f
No known key found for this signature in database
GPG key ID: 38E0CF5E69EDD671
6 changed files with 44 additions and 42 deletions

View file

@ -38,7 +38,9 @@ _EOF
sed -i -e "s/@@BUILD@@/$BUILD/g" cmd.sed sed -i -e "s/@@BUILD@@/$BUILD/g" cmd.sed
# Run sed to update the nano version # Run sed to update the nano version
sed -b -i -f cmd.sed src/rufus.rc sed -b -i -f cmd.sed src/rufus.rc
sed -b -i -f cmd.sed res/appstore/Package.appxmanifest
# NB: we need to run git add else the modified files may be ignored # NB: we need to run git add else the modified files may be ignored
git add src/rufus.rc git add src/rufus.rc
git add res/appstore/Package.appxmanifest
rm cmd.sed rm cmd.sed

View file

@ -10,7 +10,7 @@
<Identity <Identity
Name="19453.net.Rufus" Name="19453.net.Rufus"
Publisher="CN=7AC86D13-3E5A-491A-ADD5-80095C212740" Publisher="CN=7AC86D13-3E5A-491A-ADD5-80095C212740"
Version="3.13.1732.0" /> Version="3.13.1733.0" />
<Properties> <Properties>
<DisplayName>Rufus</DisplayName> <DisplayName>Rufus</DisplayName>
@ -19,7 +19,6 @@
</Properties> </Properties>
<Dependencies> <Dependencies>
<TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.0.0" MaxVersionTested="10.0.0.0" />
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.14393.0" MaxVersionTested="10.0.19042.572" /> <TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.14393.0" MaxVersionTested="10.0.19042.572" />
</Dependencies> </Dependencies>
@ -30,7 +29,7 @@
<Applications> <Applications>
<Application Id="Rufus" <Application Id="Rufus"
Executable="rufus\rufus.exe" Executable="rufus\rufus.exe"
EntryPoint="$targetentrypoint$"> EntryPoint="Windows.FullTrustApplication">
<uap:VisualElements <uap:VisualElements
DisplayName="Rufus" DisplayName="Rufus"
Description="Rufus" Description="Rufus"
@ -38,7 +37,6 @@
Square150x150Logo="Images\Square150x150Logo.png" Square150x150Logo="Images\Square150x150Logo.png"
Square44x44Logo="Images\Square44x44Logo.png"> Square44x44Logo="Images\Square44x44Logo.png">
<uap:DefaultTile Wide310x150Logo="Images\Wide310x150Logo.png" Square71x71Logo="Images\SmallTile.png" Square310x310Logo="Images\LargeTile.png"/> <uap:DefaultTile Wide310x150Logo="Images\Wide310x150Logo.png" Square71x71Logo="Images\SmallTile.png" Square310x310Logo="Images\LargeTile.png"/>
<uap:SplashScreen Image="Images\SplashScreen.png" />
</uap:VisualElements> </uap:VisualElements>
</Application> </Application>
</Applications> </Applications>

View file

@ -38,7 +38,7 @@
</ProjectConfiguration> </ProjectConfiguration>
</ItemGroup> </ItemGroup>
<PropertyGroup Label="Configuration"> <PropertyGroup Label="Configuration">
<PreBuildEvent>echo "C:\Program Files (x86)\Windows Kits\10\bin\10.0.18362.0\x64\signtool" sign /v /sha1 9ce9a71ccab3b38a74781b975f1c228222cf7d3b /fd SHA256 /tr http://sha256timestamp.ws.symantec.com/sha256/timestamp rufus.exe</PreBuildEvent> <PreBuildEvent>"C:\Program Files (x86)\Windows Kits\10\bin\10.0.18362.0\x64\signtool" sign /v /sha1 9ce9a71ccab3b38a74781b975f1c228222cf7d3b /fd SHA256 /tr http://sha256timestamp.ws.symantec.com/sha256/timestamp rufus.exe</PreBuildEvent>
</PropertyGroup> </PropertyGroup>
<PropertyGroup> <PropertyGroup>
<WapProjPath Condition="'$(WapProjPath)'==''">$(MSBuildExtensionsPath)\Microsoft\DesktopBridge\</WapProjPath> <WapProjPath Condition="'$(WapProjPath)'==''">$(MSBuildExtensionsPath)\Microsoft\DesktopBridge\</WapProjPath>

View file

@ -215,29 +215,13 @@ Global
{B01F5886-2B39-4B66-B65C-6427135B6A02}.Release|x86.ActiveCfg = Release|Win32 {B01F5886-2B39-4B66-B65C-6427135B6A02}.Release|x86.ActiveCfg = Release|Win32
{B01F5886-2B39-4B66-B65C-6427135B6A02}.Release|x86.Build.0 = Release|Win32 {B01F5886-2B39-4B66-B65C-6427135B6A02}.Release|x86.Build.0 = Release|Win32
{9440518F-38FE-43D9-9151-A26618E8C978}.Debug|arm.ActiveCfg = Debug|ARM {9440518F-38FE-43D9-9151-A26618E8C978}.Debug|arm.ActiveCfg = Debug|ARM
{9440518F-38FE-43D9-9151-A26618E8C978}.Debug|arm.Build.0 = Debug|ARM
{9440518F-38FE-43D9-9151-A26618E8C978}.Debug|arm.Deploy.0 = Debug|ARM
{9440518F-38FE-43D9-9151-A26618E8C978}.Debug|arm64.ActiveCfg = Debug|ARM64 {9440518F-38FE-43D9-9151-A26618E8C978}.Debug|arm64.ActiveCfg = Debug|ARM64
{9440518F-38FE-43D9-9151-A26618E8C978}.Debug|arm64.Build.0 = Debug|ARM64
{9440518F-38FE-43D9-9151-A26618E8C978}.Debug|arm64.Deploy.0 = Debug|ARM64
{9440518F-38FE-43D9-9151-A26618E8C978}.Debug|x64.ActiveCfg = Debug|x64 {9440518F-38FE-43D9-9151-A26618E8C978}.Debug|x64.ActiveCfg = Debug|x64
{9440518F-38FE-43D9-9151-A26618E8C978}.Debug|x64.Build.0 = Debug|x64
{9440518F-38FE-43D9-9151-A26618E8C978}.Debug|x64.Deploy.0 = Debug|x64
{9440518F-38FE-43D9-9151-A26618E8C978}.Debug|x86.ActiveCfg = Debug|x86 {9440518F-38FE-43D9-9151-A26618E8C978}.Debug|x86.ActiveCfg = Debug|x86
{9440518F-38FE-43D9-9151-A26618E8C978}.Debug|x86.Build.0 = Debug|x86
{9440518F-38FE-43D9-9151-A26618E8C978}.Debug|x86.Deploy.0 = Debug|x86
{9440518F-38FE-43D9-9151-A26618E8C978}.Release|arm.ActiveCfg = Release|ARM {9440518F-38FE-43D9-9151-A26618E8C978}.Release|arm.ActiveCfg = Release|ARM
{9440518F-38FE-43D9-9151-A26618E8C978}.Release|arm.Build.0 = Release|ARM
{9440518F-38FE-43D9-9151-A26618E8C978}.Release|arm.Deploy.0 = Release|ARM
{9440518F-38FE-43D9-9151-A26618E8C978}.Release|arm64.ActiveCfg = Release|ARM64 {9440518F-38FE-43D9-9151-A26618E8C978}.Release|arm64.ActiveCfg = Release|ARM64
{9440518F-38FE-43D9-9151-A26618E8C978}.Release|arm64.Build.0 = Release|ARM64
{9440518F-38FE-43D9-9151-A26618E8C978}.Release|arm64.Deploy.0 = Release|ARM64
{9440518F-38FE-43D9-9151-A26618E8C978}.Release|x64.ActiveCfg = Release|x64 {9440518F-38FE-43D9-9151-A26618E8C978}.Release|x64.ActiveCfg = Release|x64
{9440518F-38FE-43D9-9151-A26618E8C978}.Release|x64.Build.0 = Release|x64
{9440518F-38FE-43D9-9151-A26618E8C978}.Release|x64.Deploy.0 = Release|x64
{9440518F-38FE-43D9-9151-A26618E8C978}.Release|x86.ActiveCfg = Release|x86 {9440518F-38FE-43D9-9151-A26618E8C978}.Release|x86.ActiveCfg = Release|x86
{9440518F-38FE-43D9-9151-A26618E8C978}.Release|x86.Build.0 = Release|x86
{9440518F-38FE-43D9-9151-A26618E8C978}.Release|x86.Deploy.0 = Release|x86
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE

View file

@ -120,7 +120,7 @@ BOOL advanced_mode_device, advanced_mode_format, allow_dual_uefi_bios, detect_fa
BOOL use_fake_units, preserve_timestamps = FALSE, fast_zeroing = FALSE, app_changed_size = FALSE; BOOL use_fake_units, preserve_timestamps = FALSE, fast_zeroing = FALSE, app_changed_size = FALSE;
BOOL zero_drive = FALSE, list_non_usb_removable_drives = FALSE, enable_file_indexing, large_drive = FALSE; BOOL zero_drive = FALSE, list_non_usb_removable_drives = FALSE, enable_file_indexing, large_drive = FALSE;
BOOL write_as_image = FALSE, write_as_esp = FALSE, installed_uefi_ntfs = FALSE, use_vds = FALSE, ignore_boot_marker = FALSE; BOOL write_as_image = FALSE, write_as_esp = FALSE, installed_uefi_ntfs = FALSE, use_vds = FALSE, ignore_boot_marker = FALSE;
BOOL windows_to_go_selected = FALSE; BOOL windows_to_go_selected = FALSE, appstore_version = FALSE;
float fScale = 1.0f; float fScale = 1.0f;
int dialog_showing = 0, selection_default = BT_IMAGE, persistence_unit_selection = -1; int dialog_showing = 0, selection_default = BT_IMAGE, persistence_unit_selection = -1;
int default_fs, fs_type, boot_type, partition_type, target_type; // file system, boot type, partition type, target type int default_fs, fs_type, boot_type, partition_type, target_type; // file system, boot type, partition type, target type
@ -3087,7 +3087,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
int wait_for_mutex = 0; int wait_for_mutex = 0;
FILE* fd; FILE* fd;
BOOL attached_console = FALSE, external_loc_file = FALSE, lgp_set = FALSE, automount = TRUE; BOOL attached_console = FALSE, external_loc_file = FALSE, lgp_set = FALSE, automount = TRUE;
BOOL disable_hogger = FALSE, previous_enable_HDDs = FALSE; // , vc = IsRegistryNode(REGKEY_HKCU, vs_reg); BOOL disable_hogger = FALSE, previous_enable_HDDs = FALSE, vc = IsRegistryNode(REGKEY_HKCU, vs_reg);
BOOL alt_pressed = FALSE, alt_command = FALSE; BOOL alt_pressed = FALSE, alt_command = FALSE;
BYTE *loc_data; BYTE *loc_data;
DWORD loc_size, u, size = sizeof(u); DWORD loc_size, u, size = sizeof(u);
@ -3101,6 +3101,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
HDC hDC; HDC hDC;
MSG msg; MSG msg;
struct option long_options[] = { struct option long_options[] = {
{"appstore", no_argument, NULL, 'a'},
{"extra-devs", no_argument, NULL, 'x'}, {"extra-devs", no_argument, NULL, 'x'},
{"gui", no_argument, NULL, 'g'}, {"gui", no_argument, NULL, 'g'},
{"help", no_argument, NULL, 'h'}, {"help", no_argument, NULL, 'h'},
@ -3145,13 +3146,14 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
// We have to process the arguments before we acquire the lock and process the locale // We have to process the arguments before we acquire the lock and process the locale
PF_INIT(__wgetmainargs, Msvcrt); PF_INIT(__wgetmainargs, Msvcrt);
if (pf__wgetmainargs != NULL) { if (pf__wgetmainargs != NULL) {
BOOL list_params = TRUE; // TODO: Remove this once we've seen more from AppStore
pf__wgetmainargs(&argc, &wargv, &wenv, 1, &si); pf__wgetmainargs(&argc, &wargv, &wenv, 1, &si);
argv = (char**)calloc(argc, sizeof(char*)); argv = (char**)calloc(argc, sizeof(char*));
if (argv != NULL) { if (argv != NULL) {
// Non getopt parameter check // Non getopt parameter check
for (i = 0; i < argc; i++) { for (i = 0; i < argc; i++) {
argv[i] = wchar_to_utf8(wargv[i]); argv[i] = wchar_to_utf8(wargv[i]);
// Check for " /W" (wait for mutex release for pre 1.3.3 versions) // Check for "/W" (wait for mutex release for pre 1.3.3 versions)
if (strcmp(argv[i], "/W") == 0) if (strcmp(argv[i], "/W") == 0)
wait_for_mutex = 150; // Try to acquire the mutex for 15 seconds wait_for_mutex = 150; // Try to acquire the mutex for 15 seconds
// We need to find if we need to disable the hogger BEFORE we start // We need to find if we need to disable the hogger BEFORE we start
@ -3159,6 +3161,14 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
// on the commandline then, which the hogger makes more intuitive. // on the commandline then, which the hogger makes more intuitive.
if ((strcmp(argv[i], "-g") == 0) || (strcmp(argv[i], "--gui") == 0)) if ((strcmp(argv[i], "-g") == 0) || (strcmp(argv[i], "--gui") == 0))
disable_hogger = TRUE; disable_hogger = TRUE;
// Check for "/InvokerPRAID", which is *STUPIDLY* added by Microsoft
// when starting an app that was installed from the Windows store...
if ((stricmp(argv[i], "/InvokerPRAID") == 0) || (strcmp(argv[i], "-a") == 0) ||
(strcmp(argv[i], "--appstore") == 0)) {
uprintf("AppStore version detected");
appstore_version = TRUE;
goto skip_args_processing;
}
} }
// If our application name contains a 'p' (for "portable") create a 'rufus.ini' // If our application name contains a 'p' (for "portable") create a 'rufus.ini'
// NB: argv[0] is populated in the previous loop // NB: argv[0] is populated in the previous loop
@ -3173,6 +3183,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
if (!disable_hogger) { if (!disable_hogger) {
// Reattach the console, if we were started from commandline // Reattach the console, if we were started from commandline
if (AttachConsole(ATTACH_PARENT_PROCESS) != 0) { if (AttachConsole(ATTACH_PARENT_PROCESS) != 0) {
uprintf("Enabling console line hogger");
attached_console = TRUE; attached_console = TRUE;
IGNORE_RETVAL(freopen("CONIN$", "r", stdin)); IGNORE_RETVAL(freopen("CONIN$", "r", stdin));
IGNORE_RETVAL(freopen("CONOUT$", "w", stdout)); IGNORE_RETVAL(freopen("CONOUT$", "w", stdout));
@ -3182,11 +3193,12 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
} }
} }
while ((opt = getopt_long(argc, argv, "?xghf:i:w:l:", long_options, &option_index)) != EOF) { while ((opt = getopt_long(argc, argv, "xghf:i:w:l:", long_options, &option_index)) != EOF) {
switch (opt) { switch (opt) {
case 'x': case 'x':
enable_HDDs = TRUE; enable_HDDs = TRUE;
break; break;
case 'a':
case 'g': case 'g':
// No need to reprocess that option // No need to reprocess that option
break; break;
@ -3227,19 +3239,26 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
case 'w': case 'w':
wait_for_mutex = atoi(optarg); wait_for_mutex = atoi(optarg);
break; break;
case '?':
case 'h': case 'h':
default:
uprintf("Rufus usage selected");
PrintUsage(argv[0]); PrintUsage(argv[0]);
goto out; goto out;
// getopt_long returns '?' for any option it doesn't recognize
default:
list_params = TRUE;
break;
} }
} }
if (list_params) {
uprintf("Command line arguments:");
for (i = 1; i < argc; i++)
uprintf(argv[i]);
}
} }
} else { } else {
uprintf("Could not access UTF-16 args"); uprintf("Could not access UTF-16 args");
} }
uprintf("Post args processing");
skip_args_processing:
// Retrieve various app & system directories // Retrieve various app & system directories
if (GetCurrentDirectoryU(sizeof(app_dir), app_dir) == 0) { if (GetCurrentDirectoryU(sizeof(app_dir), app_dir) == 0) {
uprintf("Could not get current directory: %s", WindowsErrorString()); uprintf("Could not get current directory: %s", WindowsErrorString());
@ -3253,7 +3272,6 @@ uprintf("Post args processing");
uprintf("Could not get temp directory: %s", WindowsErrorString()); uprintf("Could not get temp directory: %s", WindowsErrorString());
static_strcpy(temp_dir, ".\\"); static_strcpy(temp_dir, ".\\");
} }
uprintf("Post dirs processing");
// Construct Sysnative ourselves as there is no GetSysnativeDirectory() call // Construct Sysnative ourselves as there is no GetSysnativeDirectory() call
// By default (64bit app running on 64 bit OS or 32 bit app running on 32 bit OS) // By default (64bit app running on 64 bit OS or 32 bit app running on 32 bit OS)
// Sysnative and System32 are the same // Sysnative and System32 are the same
@ -3272,7 +3290,7 @@ uprintf("Post dirs processing");
// Look for a .ini file in the current app directory // Look for a .ini file in the current app directory
static_sprintf(ini_path, "%s\\rufus.ini", app_dir); static_sprintf(ini_path, "%s\\rufus.ini", app_dir);
fd = fopenU(ini_path, ini_flags); // Will create the file if portable mode is requested fd = fopenU(ini_path, ini_flags); // Will create the file if portable mode is requested
// vc |= (safe_strcmp(GetSignatureName(NULL, NULL), cert_name[0]) == 0); vc |= (safe_strcmp(GetSignatureName(NULL, NULL), cert_name[0]) == 0);
if (fd != NULL) { if (fd != NULL) {
ini_file = ini_path; ini_file = ini_path;
fclose(fd); fclose(fd);
@ -3431,12 +3449,12 @@ relaunch:
if (get_loc_data_file(loc_file, selected_locale)) if (get_loc_data_file(loc_file, selected_locale))
WriteSettingStr(SETTING_LOCALE, selected_locale->txt[0]); WriteSettingStr(SETTING_LOCALE, selected_locale->txt[0]);
//if (!vc) { if (!vc) {
// if (MessageBoxExU(NULL, lmprintf(MSG_296), lmprintf(MSG_295), if (MessageBoxExU(NULL, lmprintf(MSG_296), lmprintf(MSG_295),
// MB_YESNO | MB_ICONWARNING | MB_IS_RTL | MB_SYSTEMMODAL, selected_langid) != IDYES) MB_YESNO | MB_ICONWARNING | MB_IS_RTL | MB_SYSTEMMODAL, selected_langid) != IDYES)
// goto out; goto out;
// vc = TRUE; vc = TRUE;
//} }
/* /*
* Create the main Window * Create the main Window

View file

@ -33,7 +33,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
IDD_DIALOG DIALOGEX 12, 12, 232, 326 IDD_DIALOG DIALOGEX 12, 12, 232, 326
STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_ACCEPTFILES EXSTYLE WS_EX_ACCEPTFILES
CAPTION "Rufus 3.14.1732" CAPTION "Rufus 3.14.1733"
FONT 9, "Segoe UI Symbol", 400, 0, 0x0 FONT 9, "Segoe UI Symbol", 400, 0, 0x0
BEGIN BEGIN
LTEXT "Drive Properties",IDS_DRIVE_PROPERTIES_TXT,8,6,53,12,NOT WS_GROUP LTEXT "Drive Properties",IDS_DRIVE_PROPERTIES_TXT,8,6,53,12,NOT WS_GROUP
@ -395,8 +395,8 @@ END
// //
VS_VERSION_INFO VERSIONINFO VS_VERSION_INFO VERSIONINFO
FILEVERSION 3,14,1732,0 FILEVERSION 3,14,1733,0
PRODUCTVERSION 3,14,1732,0 PRODUCTVERSION 3,14,1733,0
FILEFLAGSMASK 0x3fL FILEFLAGSMASK 0x3fL
#ifdef _DEBUG #ifdef _DEBUG
FILEFLAGS 0x1L FILEFLAGS 0x1L
@ -414,13 +414,13 @@ BEGIN
VALUE "Comments", "https://rufus.ie" VALUE "Comments", "https://rufus.ie"
VALUE "CompanyName", "Akeo Consulting" VALUE "CompanyName", "Akeo Consulting"
VALUE "FileDescription", "Rufus" VALUE "FileDescription", "Rufus"
VALUE "FileVersion", "3.14.1732" VALUE "FileVersion", "3.14.1733"
VALUE "InternalName", "Rufus" VALUE "InternalName", "Rufus"
VALUE "LegalCopyright", "© 2011-2021 Pete Batard (GPL v3)" VALUE "LegalCopyright", "© 2011-2021 Pete Batard (GPL v3)"
VALUE "LegalTrademarks", "https://www.gnu.org/licenses/gpl-3.0.html" VALUE "LegalTrademarks", "https://www.gnu.org/licenses/gpl-3.0.html"
VALUE "OriginalFilename", "rufus-3.13.exe" VALUE "OriginalFilename", "rufus-3.13.exe"
VALUE "ProductName", "Rufus" VALUE "ProductName", "Rufus"
VALUE "ProductVersion", "3.14.1732" VALUE "ProductVersion", "3.14.1733"
END END
END END
BLOCK "VarFileInfo" BLOCK "VarFileInfo"