diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 76717e3c1b0..0517efb862b 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -935,29 +935,23 @@ jobs: - name: Setup Dependencies Windows uses: msys2/setup-msys2@v2 with: + msystem: ucrt64 update: true install: >- - base-devel - diffutils doxygen git - make - mingw-w64-x86_64-binutils - mingw-w64-x86_64-boost - mingw-w64-x86_64-cmake - mingw-w64-x86_64-curl - mingw-w64-x86_64-graphviz - mingw-w64-x86_64-miniupnpc - mingw-w64-x86_64-nlohmann-json - mingw-w64-x86_64-nodejs - mingw-w64-x86_64-nsis - mingw-w64-x86_64-onevpl - mingw-w64-x86_64-openssl - mingw-w64-x86_64-opus - mingw-w64-x86_64-toolchain - nasm - wget - yasm + mingw-w64-ucrt-x86_64-boost + mingw-w64-ucrt-x86_64-cmake + mingw-w64-ucrt-x86_64-curl + mingw-w64-ucrt-x86_64-graphviz + mingw-w64-ucrt-x86_64-miniupnpc + mingw-w64-ucrt-x86_64-nlohmann-json + mingw-w64-ucrt-x86_64-nodejs + mingw-w64-ucrt-x86_64-nsis + mingw-w64-ucrt-x86_64-onevpl + mingw-w64-ucrt-x86_64-openssl + mingw-w64-ucrt-x86_64-opus + mingw-w64-ucrt-x86_64-toolchain - name: Setup python # use this instead of msys2 python due to known issues using wheels, https://www.msys2.org/docs/python/ diff --git a/docs/source/building/windows.rst b/docs/source/building/windows.rst index 90b3d9e3c33..eb5444f468b 100644 --- a/docs/source/building/windows.rst +++ b/docs/source/building/windows.rst @@ -3,7 +3,7 @@ Windows Requirements ------------ -First you need to install `MSYS2 `__, then startup "MSYS2 MinGW 64-bit" and execute the following +First you need to install `MSYS2 `__, then startup "MSYS2 UCRT64" and execute the following codes. Update all packages: @@ -15,26 +15,21 @@ Install dependencies: .. code-block:: bash pacman -S \ - base-devel \ - cmake \ - diffutils \ doxygen \ - gcc \ git \ - make \ - mingw-w64-x86_64-binutils \ - mingw-w64-x86_64-boost \ - mingw-w64-x86_64-cmake \ - mingw-w64-x86_64-curl \ - mingw-w64-x86_64-graphviz \ - mingw-w64-x86_64-miniupnpc \ - mingw-w64-x86_64-nlohmann-json \ - mingw-w64-x86_64-nodejs \ - mingw-w64-x86_64-onevpl \ - mingw-w64-x86_64-openssl \ - mingw-w64-x86_64-opus \ - mingw-w64-x86_64-rust \ - mingw-w64-x86_64-toolchain \ + mingw-w64-ucrt-x86_64-boost \ + mingw-w64-ucrt-x86_64-cmake \ + mingw-w64-ucrt-x86_64-curl \ + mingw-w64-ucrt-x86_64-graphviz \ + mingw-w64-ucrt-x86_64-miniupnpc \ + mingw-w64-ucrt-x86_64-nlohmann-json \ + mingw-w64-ucrt-x86_64-nodejs \ + mingw-w64-ucrt-x86_64-nsis \ + mingw-w64-ucrt-x86_64-onevpl \ + mingw-w64-ucrt-x86_64-openssl \ + mingw-w64-ucrt-x86_64-opus \ + mingw-w64-ucrt-x86_64-rust \ + mingw-w64-ucrt-x86_64-toolchain \ python \ python-pip diff --git a/src/config.cpp b/src/config.cpp index 9211c863aea..4bede1a4267 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -1272,10 +1272,16 @@ namespace config { BOOST_LOG(fatal) << "Failed to apply config: "sv << err.what(); } - if (!config_loaded) { #ifdef _WIN32 + // UCRT64 raises an access denied exception if launching from the shortcut + // as non-admin and the config folder is not yet present; we can defer + // so that service instance will do the work instead. + + if (!config_loaded && !shortcut_launch) { BOOST_LOG(fatal) << "To relaunch Sunshine successfully, use the shortcut in the Start Menu. Do not run Sunshine.exe manually."sv; std::this_thread::sleep_for(10s); +#else + if (!config_loaded) { #endif return -1; } @@ -1283,6 +1289,8 @@ namespace config { #ifdef _WIN32 // We have to wait until the config is loaded to handle these launches, // because we need to have the correct base port loaded in our config. + // Exception: UCRT64 shortcut_launch instances may have no config loaded due to + // insufficient permissions to create folder; port defaults will be acceptable. if (service_admin_launch) { // This is a relaunch as admin to start the service service_ctrl::start_service(); diff --git a/src/main.cpp b/src/main.cpp index 208951d48fc..6231e503ef3 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -91,8 +91,7 @@ main(int argc, char *argv[]) { task_pool_util::TaskPool::task_id_t force_shutdown = nullptr; #ifdef _WIN32 - // Switch default C standard library locale to UTF-8 on Windows 10 1803+ - setlocale(LC_ALL, ".UTF-8"); + setlocale(LC_ALL, "C"); #endif #pragma GCC diagnostic push diff --git a/src_assets/windows/misc/migration/migrate-config.bat b/src_assets/windows/misc/migration/migrate-config.bat index 65d00d8f7cd..cc720ada607 100644 --- a/src_assets/windows/misc/migration/migrate-config.bat +++ b/src_assets/windows/misc/migration/migrate-config.bat @@ -38,10 +38,11 @@ if exist "%OLD_DIR%\credentials\" ( rem Create the credentials directory if it wasn't migrated or already existing if not exist "%NEW_DIR%\credentials\" mkdir "%NEW_DIR%\credentials" -rem Disallow read access to the credentials directory for normal users -rem Note: We must use the SID directly because "Administrators" is localized +rem Disallow read access to the credentials directory contents for normal users +rem Note: We must use the SIDs directly because "Users" and "Administrators" are localized icacls "%NEW_DIR%\credentials" /inheritance:r icacls "%NEW_DIR%\credentials" /grant:r *S-1-5-32-544:(OI)(CI)(F) +icacls "%NEW_DIR%\credentials" /grant:r *S-1-5-32-545:(R) rem Migrate the covers directory if exist "%OLD_DIR%\covers\" (