diff --git a/CMakeLists.txt b/CMakeLists.txt index 5550e991..f4f17e47 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -89,15 +89,11 @@ if(WIN32) libstdc++.a libwinpthread.a libssp.a - Qwave - winmm ksuser wsock32 ws2_32 - iphlpapi d3d11 dxgi D3DCompiler setupapi - dnsapi ) set_source_files_properties(third-party/ViGEmClient/src/ViGEmClient.cpp PROPERTIES COMPILE_DEFINITIONS "UNICODE=1;ERROR_INVALID_DEVICE_OBJECT_PARAMETER=650") diff --git a/README.md b/README.md index 5a476a86..b78bc234 100644 --- a/README.md +++ b/README.md @@ -65,7 +65,9 @@ sunshine needs access to uinput to create mouse and gamepad events: ### Requirements: - mingw-w64-x86_64-openssl mingw-w64-x86_64-cmake mingw-w64-x86_64-toolchain mingw-w64-x86_64-opus mingw-w64-x86_64-x265 mingw-w64-x86_64-boost git mingw-w64-x86_64-make +First you need to install [MSYS2](https://www.msys2.org), then startup "MSYS2 MinGW 64-bit" and install the following packages using `pacman -S`: + + mingw-w64-x86_64-openssl mingw-w64-x86_64-cmake mingw-w64-x86_64-toolchain mingw-w64-x86_64-opus mingw-w64-x86_64-x265 mingw-w64-x86_64-boost git mingw-w64-x86_64-make cmake make gcc ### Compilation: - `git clone https://github.com/loki-47-6F-64/sunshine.git --recursive` diff --git a/assets/web/welcome.html b/assets/web/welcome.html index 8dd40a83..5570de50 100644 --- a/assets/web/welcome.html +++ b/assets/web/welcome.html @@ -13,11 +13,11 @@
- +
- +
Error: {{error}}
diff --git a/sunshine/config.cpp b/sunshine/config.cpp index 3008047f..18083d9a 100644 --- a/sunshine/config.cpp +++ b/sunshine/config.cpp @@ -742,7 +742,7 @@ void apply_config(std::unordered_map &&vars) { } std::string log_level_string; - string_restricted_f(vars, "min_log_level", log_level_string, { "verbose"sv, "debug"sv, "info"sv, "warning"sv, "error"sv, "fatal"sv, "none"sv }); + string_f(vars, "min_log_level", log_level_string); if(!log_level_string.empty()) { if(log_level_string == "verbose"sv) { diff --git a/sunshine/confighttp.cpp b/sunshine/confighttp.cpp index 97f2f04b..3e624809 100644 --- a/sunshine/confighttp.cpp +++ b/sunshine/confighttp.cpp @@ -419,8 +419,8 @@ void savePassword(resp_https_t response, req_https_t request) { auto username = inputTree.count("currentUsername") > 0 ? inputTree.get("currentUsername") : ""; auto newUsername = inputTree.get("newUsername"); auto password = inputTree.count("currentPassword") > 0 ? inputTree.get("currentPassword") : ""; - auto newPassword = inputTree.get("newPassword"); - auto confirmPassword = inputTree.get("confirmNewPassword"); + auto newPassword = inputTree.count("newPassword") > 0 ? inputTree.get("newPassword") : ""; + auto confirmPassword = inputTree.count("confirmNewPassword") > 0 ? inputTree.get("confirmNewPassword") : ""; if(newUsername.length() == 0) newUsername = username; if(newUsername.length() == 0){ outputTree.put("status", false); @@ -428,7 +428,7 @@ void savePassword(resp_https_t response, req_https_t request) { } else { auto hash = util::hex(crypto::hash(password + config::sunshine.salt)).to_string(); if(config::sunshine.username.empty() || (username == config::sunshine.username && hash == config::sunshine.password)) { - if(newPassword != confirmPassword) { + if(newPassword.empty() || newPassword != confirmPassword) { outputTree.put("status", false); outputTree.put("error", "Password Mismatch"); } else { diff --git a/sunshine/nvhttp.cpp b/sunshine/nvhttp.cpp index 68806106..0d854fdb 100644 --- a/sunshine/nvhttp.cpp +++ b/sunshine/nvhttp.cpp @@ -132,7 +132,7 @@ void save_state() { void load_state() { if(!fs::exists(config::nvhttp.file_state)) { - BOOST_LOG(info) << "DOENST EXIST"sv; + BOOST_LOG(info) << "File "sv << config::nvhttp.file_state << " doesn't exist"sv; http::unique_id = util::uuid_t::generate().string(); return; } diff --git a/sunshine/platform/windows/publish.cpp b/sunshine/platform/windows/publish.cpp index 652785d0..d981593d 100644 --- a/sunshine/platform/windows/publish.cpp +++ b/sunshine/platform/windows/publish.cpp @@ -15,6 +15,9 @@ #include "sunshine/platform/common.h" #include "sunshine/thread_safe.h" +#define _FN(x, ret, args) \ + typedef ret(*x##_fn) args; \ + static x##_fn x using namespace std::literals; @@ -72,28 +75,9 @@ typedef struct _DNS_SERVICE_REGISTER_REQUEST { BOOL unicastEnabled; } DNS_SERVICE_REGISTER_REQUEST, *PDNS_SERVICE_REGISTER_REQUEST; -VOID DnsServiceFreeInstance( - _In_ PDNS_SERVICE_INSTANCE pInstance); - -DWORD DnsServiceDeRegister( - _In_ PDNS_SERVICE_REGISTER_REQUEST pRequest, - _Inout_opt_ PDNS_SERVICE_CANCEL pCancel); - -DWORD DnsServiceRegister( - _In_ PDNS_SERVICE_REGISTER_REQUEST pRequest, - _Inout_opt_ PDNS_SERVICE_CANCEL pCancel); - -PDNS_SERVICE_INSTANCE DnsServiceConstructInstance( - _In_ PCWSTR pServiceName, - _In_ PCWSTR pHostName, - _In_opt_ PIP4_ADDRESS pIp4, - _In_opt_ PIP6_ADDRESS pIp6, - _In_ WORD wPort, - _In_ WORD wPriority, - _In_ WORD wWeight, - _In_ DWORD dwPropertiesCount, - _In_reads_(dwPropertiesCount) PCWSTR *keys, - _In_reads_(dwPropertiesCount) PCWSTR *values); +_FN(_DnsServiceFreeInstance, VOID, (_In_ PDNS_SERVICE_INSTANCE pInstance)); +_FN(_DnsServiceDeRegister, DWORD, (_In_ PDNS_SERVICE_REGISTER_REQUEST pRequest, _Inout_opt_ PDNS_SERVICE_CANCEL pCancel)); +_FN(_DnsServiceRegister, DWORD, (_In_ PDNS_SERVICE_REGISTER_REQUEST pRequest, _Inout_opt_ PDNS_SERVICE_CANCEL pCancel)); } /* extern "C" */ namespace platf::publish { @@ -102,7 +86,7 @@ VOID WINAPI register_cb(DWORD status, PVOID pQueryContext, PDNS_SERVICE_INSTANCE auto fg = util::fail_guard([&]() { if(pInstance) { - DnsServiceFreeInstance(pInstance); + _DnsServiceFreeInstance(pInstance); } }); @@ -140,10 +124,10 @@ static int service(bool enable) { DNS_STATUS status {}; if(enable) { - status = DnsServiceRegister(&req, nullptr); + status = _DnsServiceRegister(&req, nullptr); } else { - status = DnsServiceDeRegister(&req, nullptr); + status = _DnsServiceDeRegister(&req, nullptr); } alarm->wait(); @@ -168,7 +152,32 @@ public: } }; +int load_funcs(HMODULE handle) { + auto fg = util::fail_guard([handle]() { + FreeLibrary(handle); + }); + + _DnsServiceFreeInstance = (_DnsServiceFreeInstance_fn)GetProcAddress(handle, "DnsServiceFreeInstance"); + _DnsServiceDeRegister = (_DnsServiceDeRegister_fn)GetProcAddress(handle, "DnsServiceDeRegister"); + _DnsServiceRegister = (_DnsServiceRegister_fn)GetProcAddress(handle, "DnsServiceRegister"); + + if(!(_DnsServiceFreeInstance && _DnsServiceDeRegister && _DnsServiceRegister)) { + BOOST_LOG(error) << "mDNS service not available in dnsapi.dll"sv; + return -1; + } + + fg.disable(); + return 0; +} + std::unique_ptr<::platf::deinit_t> start() { + HMODULE handle = LoadLibrary("dnsapi.dll"); + + if(!handle || load_funcs(handle)) { + BOOST_LOG(error) << "Couldn't load dnsapi.dll, You'll need to add PC manually from Moonlight"sv; + return nullptr; + } + if(service(true)) { return nullptr; }