From 964c22c1cae372ad6562207fcbffa67c193dd501 Mon Sep 17 00:00:00 2001 From: Mark Jansen Date: Sun, 20 Sep 2020 22:18:08 +0200 Subject: [PATCH] [RAPPS][RAPPS.COM] Introduce a rapps console shim rapps.com will be launched when running 'rapps' from cmd or from run, and since it is a console application, explorer/ cmd will wait for it. This rapps.com passes the commandline to rapps.exe, and wait for rapps.exe to exit before closing. CORE-17281 --- base/applications/CMakeLists.txt | 1 + base/applications/rapps/CMakeLists.txt | 2 +- base/applications/rapps/appview.cpp | 8 +- base/applications/rapps/available.cpp | 4 +- base/applications/rapps/include/unattended.h | 2 + base/applications/rapps/unattended.cpp | 55 +++++++------- base/applications/rapps/winmain.cpp | 11 +-- base/applications/rapps_com/CMakeLists.txt | 7 ++ base/applications/rapps_com/main.c | 73 +++++++++++++++++++ base/applications/rapps_com/main.ico | Bin 0 -> 29926 bytes base/applications/rapps_com/rapps.rc | 5 ++ 11 files changed, 127 insertions(+), 41 deletions(-) create mode 100644 base/applications/rapps_com/CMakeLists.txt create mode 100644 base/applications/rapps_com/main.c create mode 100644 base/applications/rapps_com/main.ico create mode 100644 base/applications/rapps_com/rapps.rc diff --git a/base/applications/CMakeLists.txt b/base/applications/CMakeLists.txt index 74ddde5815c..082b2121b35 100644 --- a/base/applications/CMakeLists.txt +++ b/base/applications/CMakeLists.txt @@ -30,6 +30,7 @@ add_subdirectory(network) add_subdirectory(notepad) add_subdirectory(osk) add_subdirectory(rapps) +add_subdirectory(rapps_com) add_subdirectory(regedit) add_subdirectory(regedt32) add_subdirectory(sc) diff --git a/base/applications/rapps/CMakeLists.txt b/base/applications/rapps/CMakeLists.txt index cb559b5509d..4da7397229f 100644 --- a/base/applications/rapps/CMakeLists.txt +++ b/base/applications/rapps/CMakeLists.txt @@ -41,7 +41,7 @@ add_definitions( file(GLOB_RECURSE rapps_rc_deps res/*.*) add_rc_deps(rapps.rc ${rapps_rc_deps}) add_executable(rapps ${SOURCE} rapps.rc) -set_module_type(rapps win32cui UNICODE) +set_module_type(rapps win32gui UNICODE) target_link_libraries(rapps conutils ${PSEH_LIB} uuid wine cpprt atl_classes) add_importlibs(rapps advapi32 comctl32 gdi32 wininet user32 shell32 shlwapi ole32 setupapi gdiplus msvcrt kernel32 ntdll) add_pch(rapps include/rapps.h SOURCE) diff --git a/base/applications/rapps/appview.cpp b/base/applications/rapps/appview.cpp index 0bdcc67cdbc..947df04d0bd 100644 --- a/base/applications/rapps/appview.cpp +++ b/base/applications/rapps/appview.cpp @@ -58,8 +58,14 @@ HIMAGELIST CMainToolbar::InitImageList() return hImageList; } -CMainToolbar::CMainToolbar() : m_iToolbarHeight(24) +CMainToolbar::CMainToolbar() + : m_iToolbarHeight(24) + , m_dButtonsWidthMax(0) { + memset(szInstallBtn, 0, sizeof(szInstallBtn)); + memset(szUninstallBtn, 0, sizeof(szUninstallBtn)); + memset(szModifyBtn, 0, sizeof(szModifyBtn)); + memset(szSelectAll, 0, sizeof(szSelectAll)); } VOID CMainToolbar::OnGetDispInfo(LPTOOLTIPTEXT lpttt) diff --git a/base/applications/rapps/available.cpp b/base/applications/rapps/available.cpp index 6de168024dd..fa266d7f5e1 100644 --- a/base/applications/rapps/available.cpp +++ b/base/applications/rapps/available.cpp @@ -7,15 +7,13 @@ * Copyright 2017 Alexander Shaposhnikov (sanchaez@reactos.org) * Copyright 2020 He Yang (1160386205@qq.com) */ + #include "rapps.h" #include "available.h" #include "misc.h" #include "dialogs.h" -#include -#include -#include // CAvailableApplicationInfo CAvailableApplicationInfo::CAvailableApplicationInfo(const ATL::CStringW& sFileNameParam, AvailableStrings& AvlbStrings) diff --git a/base/applications/rapps/include/unattended.h b/base/applications/rapps/include/unattended.h index 301f54ab9e7..83aa2e06b9f 100644 --- a/base/applications/rapps/include/unattended.h +++ b/base/applications/rapps/include/unattended.h @@ -5,6 +5,8 @@ #define CMD_KEY_FIND L"FIND" #define CMD_KEY_INFO L"INFO" #define CMD_KEY_HELP L"?" +#define CMD_KEY_HELP_ALT L"HELP" + const WCHAR UsageString[] = L"RAPPS \ [/" CMD_KEY_HELP L"] \ diff --git a/base/applications/rapps/unattended.cpp b/base/applications/rapps/unattended.cpp index f1589a3b544..885c604fd5e 100644 --- a/base/applications/rapps/unattended.cpp +++ b/base/applications/rapps/unattended.cpp @@ -20,28 +20,36 @@ BOOL MatchCmdOption(LPWSTR argvOption, LPCWSTR szOptToMacth) { if (argvOption[0] == FirstCharList[i]) { - if (StrCmpIW(argvOption + 1, szOptToMacth) == 0) - { - return TRUE; - } - else - { - return FALSE; - } + return StrCmpIW(argvOption + 1, szOptToMacth) == 0; } } return FALSE; } +void InitRappsConsole() +{ + // First, try to attach to our parent's console + if (!AttachConsole(ATTACH_PARENT_PROCESS)) + { + // Did we already have a console? + if (GetLastError() != ERROR_ACCESS_DENIED) + { + // No, try to open a new one + AllocConsole(); + } + } + ConInitStdStreams(); // Initialize the Console Standard Streams +} + + BOOL HandleInstallCommand(LPWSTR szCommand, int argcLeft, LPWSTR * argvLeft) { if (argcLeft == 0) { - ConInitStdStreams(); // Initialize the Console Standard Streams + InitRappsConsole(); ConResMsgPrintf(StdOut, NULL, IDS_CMD_NEED_PACKAGE_NAME, szCommand); return FALSE; } - FreeConsole(); ATL::CSimpleArray PkgNameList; @@ -70,11 +78,10 @@ BOOL HandleSetupCommand(LPWSTR szCommand, int argcLeft, LPWSTR * argvLeft) { if (argcLeft != 1) { - ConInitStdStreams(); // Initialize the Console Standard Streams + InitRappsConsole(); ConResMsgPrintf(StdOut, NULL, IDS_CMD_NEED_FILE_NAME, szCommand); return FALSE; } - FreeConsole(); ATL::CSimpleArray PkgNameList; HINF InfHandle = SetupOpenInfFileW(argvLeft[0], NULL, INF_STYLE_WIN4, NULL); @@ -218,20 +225,14 @@ BOOL HandleInfoCommand(LPWSTR szCommand, int argcLeft, LPWSTR *argvLeft) return TRUE; } -BOOL HandleHelpCommand(LPWSTR szCommand, int argcLeft, LPWSTR * argvLeft) +VOID PrintHelpCommand() { - if (argcLeft != 0) - { - return FALSE; - } - ConPrintf(StdOut, L"\n"); ConResPuts(StdOut, IDS_APPTITLE); ConPrintf(StdOut, L"\n\n"); ConResPuts(StdOut, IDS_CMD_USAGE); ConPrintf(StdOut, L"%ls\n", UsageString); - return TRUE; } BOOL ParseCmdAndExecute(LPWSTR lpCmdLine, BOOL bIsFirstLaunch, int nCmdShow) @@ -246,10 +247,6 @@ BOOL ParseCmdAndExecute(LPWSTR lpCmdLine, BOOL bIsFirstLaunch, int nCmdShow) if (argc == 1) // RAPPS is launched without options { - // Close the console, and open MainWindow - FreeConsole(); - - // Check for if rapps MainWindow is already launched in another process HANDLE hMutex; @@ -275,7 +272,8 @@ BOOL ParseCmdAndExecute(LPWSTR lpCmdLine, BOOL bIsFirstLaunch, int nCmdShow) return TRUE; } - else if (MatchCmdOption(argv[1], CMD_KEY_INSTALL)) + + if (MatchCmdOption(argv[1], CMD_KEY_INSTALL)) { return HandleInstallCommand(argv[1], argc - 2, argv + 2); } @@ -283,9 +281,8 @@ BOOL ParseCmdAndExecute(LPWSTR lpCmdLine, BOOL bIsFirstLaunch, int nCmdShow) { return HandleSetupCommand(argv[1], argc - 2, argv + 2); } - - ConInitStdStreams(); // Initialize the Console Standard Streams + InitRappsConsole(); if (MatchCmdOption(argv[1], CMD_KEY_FIND)) { @@ -295,14 +292,16 @@ BOOL ParseCmdAndExecute(LPWSTR lpCmdLine, BOOL bIsFirstLaunch, int nCmdShow) { return HandleInfoCommand(argv[1], argc - 2, argv + 2); } - else if (MatchCmdOption(argv[1], CMD_KEY_HELP)) + else if (MatchCmdOption(argv[1], CMD_KEY_HELP) || MatchCmdOption(argv[1], CMD_KEY_HELP_ALT)) { - return HandleHelpCommand(argv[1], argc - 2, argv + 2); + PrintHelpCommand(); + return TRUE; } else { // unrecognized/invalid options ConResPuts(StdOut, IDS_CMD_INVALID_OPTION); + PrintHelpCommand(); return FALSE; } } diff --git a/base/applications/rapps/winmain.cpp b/base/applications/rapps/winmain.cpp index 9d36df598eb..c8604ca6c9e 100644 --- a/base/applications/rapps/winmain.cpp +++ b/base/applications/rapps/winmain.cpp @@ -7,15 +7,10 @@ * Copyright 2017 Alexander Shaposhnikov (sanchaez@reactos.org) */ #include "rapps.h" - #include "unattended.h" - #include "winmain.h" - #include - #include - #include LPCWSTR szWindowClass = L"ROSAPPMGR"; @@ -63,11 +58,11 @@ VOID InitializeGDIPlus(BOOL bInitialize) } } -int wmain(int argc, wchar_t *argv[]) +INT WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, INT nShowCmd) { BOOL bIsFirstLaunch; - InitializeAtlModule(GetModuleHandle(NULL), TRUE); + InitializeAtlModule(hInstance, TRUE); InitializeGDIPlus(TRUE); if (GetUserDefaultUILanguage() == MAKELANGID(LANG_HEBREW, SUBLANG_DEFAULT)) @@ -75,7 +70,7 @@ int wmain(int argc, wchar_t *argv[]) SetProcessDefaultLayout(LAYOUT_RTL); } - hInst = GetModuleHandle(NULL); + hInst = hInstance; bIsFirstLaunch = !LoadSettings(&SettingsInfo); if (bIsFirstLaunch) diff --git a/base/applications/rapps_com/CMakeLists.txt b/base/applications/rapps_com/CMakeLists.txt new file mode 100644 index 00000000000..4e2ff5599cd --- /dev/null +++ b/base/applications/rapps_com/CMakeLists.txt @@ -0,0 +1,7 @@ +project(rapps) + +add_executable(rapps.com main.c rapps.rc) +set_module_type(rapps.com win32cui UNICODE) +set_target_properties(rapps.com PROPERTIES SUFFIX "") +add_importlibs(rapps.com msvcrt kernel32 ntdll) +add_cd_file(TARGET rapps.com DESTINATION reactos/system32 FOR all) diff --git a/base/applications/rapps_com/main.c b/base/applications/rapps_com/main.c new file mode 100644 index 00000000000..fdb583f053d --- /dev/null +++ b/base/applications/rapps_com/main.c @@ -0,0 +1,73 @@ +/* + * PROJECT: ReactOS Applications Manager Command-Line Launcher (rapps.com) + * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later) + * PURPOSE: Allow explorer / cmd to wait for rapps.exe when passing commandline arguments + * COPYRIGHT: Copyright 2020 Mark Jansen (mark.jansen@reactos.org) + */ + +#include +#include +#include + + +int run_rapps(LPWSTR cmdline) +{ + STARTUPINFOW si = { sizeof(si) }; + PROCESS_INFORMATION pi = { 0 }; + SetLastError(0); + if (!CreateProcessW(NULL, cmdline, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) + { + fprintf(stderr, "Unable to create rapps.exe process...\n"); + return -1; + } + CloseHandle(pi.hThread); + WaitForSingleObject(pi.hProcess, INFINITE); + DWORD dwExit; + GetExitCodeProcess(pi.hProcess, &dwExit); + CloseHandle(pi.hProcess); + return dwExit; +} + +int wmain(int argc, wchar_t* argv[]) +{ + WCHAR RappsExe[MAX_PATH] = { 0 }; + + GetModuleFileNameW(NULL, RappsExe, ARRAYSIZE(RappsExe)); + size_t arglen = wcslen(RappsExe); + if (arglen > 4 && !wcsicmp(RappsExe + arglen - 4, L".com")) + { + wcscpy(RappsExe + arglen - 4, L".exe"); + } + else + { + fprintf(stderr, "Unable to build rapps.exe path...\n"); + return - 1; + } + + arglen += (1 + 2); // nullterminator + 2 quotes + + for (int n = 1; n < argc; ++n) + { + arglen += wcslen(argv[n]); + arglen += 3; // Surrounding quotes + space + } + + wchar_t* cmdline = LocalAlloc(LMEM_ZEROINIT, arglen * sizeof(WCHAR)); + if (cmdline) + { + wchar_t* ptr = cmdline; + size_t cchRemaining = arglen; + + StringCchPrintfExW(ptr, cchRemaining, &ptr, &cchRemaining, 0, L"\"%s\"", RappsExe); + + for (int n = 1; n < argc; ++n) + { + StringCchPrintfExW(ptr, cchRemaining, &ptr, &cchRemaining, 0, L" \"%s\"", argv[n]); + } + } + + int iRet = run_rapps(cmdline); + if (cmdline) + LocalFree(cmdline); + return iRet; +} diff --git a/base/applications/rapps_com/main.ico b/base/applications/rapps_com/main.ico new file mode 100644 index 0000000000000000000000000000000000000000..27f227da3b18bc28506e184586c8efa0d301404a GIT binary patch literal 29926 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 literal 0 HcmV?d00001 diff --git a/base/applications/rapps_com/rapps.rc b/base/applications/rapps_com/rapps.rc new file mode 100644 index 00000000000..9282aae2b8c --- /dev/null +++ b/base/applications/rapps_com/rapps.rc @@ -0,0 +1,5 @@ +#define REACTOS_STR_FILE_DESCRIPTION "ReactOS Applications Manager console shim" +#define REACTOS_STR_INTERNAL_NAME "rapps" +#define REACTOS_STR_ORIGINAL_FILENAME "rapps.com" + +#include