diff --git a/flake.nix b/flake.nix index a0cc9bf2..495fdfab 100644 --- a/flake.nix +++ b/flake.nix @@ -86,7 +86,8 @@ overlays = [ inputs.self.overlays.default ]; crossOverlays = [(final: prev: { - boost = prev.boost.override { zstd = null; }; + boost = (prev.boost.override { zstd = null; }).overrideAttrs (prev: + { patches = prev.patches or [] ++ [ ./local/pkgs/winjob/boost.patch ]; }); magic-enum = prev.magic-enum.overrideAttrs (prev: { cmakeFlags = prev.cmakeFlags ++ [ "-DMAGIC_ENUM_OPT_BUILD_EXAMPLES=OFF" "-DMAGIC_ENUM_OPT_BUILD_TESTS=OFF" ]; }); range-v3 = prev.range-v3.overrideAttrs (prev: { cmakeFlags = prev.cmakeFlags ++ @@ -191,7 +192,7 @@ packages = [ pkgs.clang-tools_18 ]; CMAKE_EXPORT_COMPILE_COMMANDS = "1"; }; - winjob = pkgs.mkShell.override { stdenv = pkgs.pkgsCross.mingwW64Static.gcc14Stdenv; } + winjob = pkgs.mkShell { inputsFrom = [ pkgs.pkgsCross.mingwW64Static.winjob ]; packages = [ pkgs.clang-tools_18 ]; diff --git a/local/pkgs/default.nix b/local/pkgs/default.nix index 7ca56b1a..81aba09d 100644 --- a/local/pkgs/default.nix +++ b/local/pkgs/default.nix @@ -70,7 +70,7 @@ inputs: rec ufo = inputs.pkgs.callPackage ./ufo { inherit concurrencpp biu glad matplotplusplus zpp-bits; tbb = inputs.pkgs.tbb_2021_11; }; chn-bsub = inputs.pkgs.callPackage ./chn-bsub { inherit biu; }; - winjob = inputs.pkgs.callPackage ./winjob { stdenv = inputs.pkgs.gcc14Stdenv; }; + winjob = inputs.pkgs.callPackage ./winjob {}; sockpp = inputs.pkgs.callPackage ./sockpp.nix { src = inputs.topInputs.sockpp; }; git-lfs-transfer = inputs.pkgs.callPackage ./git-lfs-transfer.nix { src = inputs.topInputs.git-lfs-transfer; }; diff --git a/local/pkgs/winjob/CMakeLists.txt b/local/pkgs/winjob/CMakeLists.txt index d812cace..f083fad3 100644 --- a/local/pkgs/winjob/CMakeLists.txt +++ b/local/pkgs/winjob/CMakeLists.txt @@ -16,15 +16,14 @@ find_package(Boost REQUIRED COMPONENTS headers filesystem) find_package(nlohmann_json REQUIRED) add_executable(winjob src/winjob.cpp src/windows.cpp) -# target_compile_features(winjob PRIVATE cxx_std_26) -target_compile_options(winjob PRIVATE "-std=c++26") +target_compile_features(winjob PRIVATE cxx_std_23) target_include_directories(winjob PRIVATE ${PROJECT_SOURCE_DIR}/include) target_link_libraries(winjob PRIVATE Boost::headers Boost::filesystem ws2_32 wsock32) target_compile_definitions(winjob PRIVATE winjob_VERSION="${winjob_VERSION}") add_executable(winjobd src/winjobd.cpp src/windows.cpp) -# target_compile_features(winjob PRIVATE cxx_std_26) -target_compile_options(winjobd PRIVATE "-std=c++26") +target_compile_features(winjob PRIVATE cxx_std_23) +target_compile_options(winjobd PRIVATE -fpermissive) target_include_directories(winjobd PRIVATE ${PROJECT_SOURCE_DIR}/include) target_link_libraries(winjobd PRIVATE Boost::headers Boost::filesystem ws2_32 wsock32) target_compile_definitions(winjobd PRIVATE winjob_VERSION="${winjob_VERSION}") diff --git a/local/pkgs/winjob/boost.patch b/local/pkgs/winjob/boost.patch new file mode 100644 index 00000000..400957da --- /dev/null +++ b/local/pkgs/winjob/boost.patch @@ -0,0 +1,12 @@ +diff --color -ur a/boost/process/v2/detail/impl/utf8.ipp b/boost/process/v2/detail/impl/utf8.ipp +--- a/boost/process/v2/detail/impl/utf8.ipp 2024-07-26 15:50:15.844632780 +0800 ++++ b/boost/process/v2/detail/impl/utf8.ipp 2024-07-26 15:50:09.036567016 +0800 +@@ -11,7 +11,7 @@ + #include + + #if defined(BOOST_PROCESS_V2_WINDOWS) +-#include ++#include + #endif + + BOOST_PROCESS_V2_BEGIN_NAMESPACE diff --git a/local/pkgs/winjob/include/winjob/windows.hpp b/local/pkgs/winjob/include/winjob/windows.hpp index d6d5422e..79186700 100644 --- a/local/pkgs/winjob/include/winjob/windows.hpp +++ b/local/pkgs/winjob/include/winjob/windows.hpp @@ -1,11 +1,9 @@ # include # include # include -# include namespace winjob { std::optional> get_owner(std::wstring file_name); bool set_permission(std::wstring fileName); - std::unique_ptr run_as(std::pair user, std::wstring program); } diff --git a/local/pkgs/winjob/src/windows.cpp b/local/pkgs/winjob/src/windows.cpp index e6dd1ba4..66aebd72 100644 --- a/local/pkgs/winjob/src/windows.cpp +++ b/local/pkgs/winjob/src/windows.cpp @@ -3,7 +3,6 @@ # include # include # include -# include namespace winjob { @@ -103,22 +102,4 @@ namespace winjob { FreeSid(pUsersSID); LocalFree(pACL); LocalFree(pSD); return false; } else { FreeSid(pUsersSID); LocalFree(pACL); LocalFree(pSD); return true; } } - - std::unique_ptr run_as(std::pair user, std::wstring program) - { - auto password = L""; - - // Initialize the STARTUPINFO structure - STARTUPINFOW si = { sizeof(si) }; - PROCESS_INFORMATION pi; - - // Create the process as the specified user - BOOL result = CreateProcessWithLogonW - ( - user.second.c_str(), user.first.c_str(), password, LOGON_WITH_PROFILE, program.c_str(), NULL, // args - CREATE_UNICODE_ENVIRONMENT, NULL, NULL, &si, &pi - ); - if (!result) return {}; - else return new boost::process::child(boost::process::detail::windows::child_handle(pi.hProcess, true)); - } } diff --git a/local/pkgs/winjob/src/winjobd.cpp b/local/pkgs/winjob/src/winjobd.cpp index e64ecbe5..502c9915 100644 --- a/local/pkgs/winjob/src/winjobd.cpp +++ b/local/pkgs/winjob/src/winjobd.cpp @@ -1,8 +1,11 @@ -# include # include +# include +# include +# include # include # include # include +# include using namespace std::literals; @@ -17,18 +20,31 @@ int main() std::filesystem::create_directories(LR"(C:\ProgramData\winjob\auth)"); winjob::set_permission(LR"(C:\ProgramData\winjob\auth)"); - // log file std::ofstream log(LR"(C:\ProgramData\winjob\log.txt)", std::ios::app); + auto user = winjob::get_owner(LR"(C:\Users\chn\Desktop\winjob.exe)"); + if (!user) + { + log << "Failed to get owner\n" << std::flush; + return 1; + } + if (user) + { + log << "Owner: " << user->first << "\\" << user->second << '\n' << std::flush; + auto launcher = boost::process::v2::windows::with_logon_launcher(user->second, L"", user->first, + LOGON_WITH_PROFILE); + boost::asio::io_context ctx; + boost::process::v2::error_code ec; + std::wstring program = LR"(C:\Users\chn\Desktop\winjob.exe)"; + auto process = launcher(ctx, ec, program, std::vector{}); + } + boost::asio::io_context io_context; - boost::asio::local::stream_protocol::endpoint ep(LR"(C:\ProgramData\winjob\winjobd.sock)"); + boost::asio::local::stream_protocol::endpoint ep(R"(C:\ProgramData\winjob\winjobd.sock)"); boost::asio::local::stream_protocol::acceptor acceptor(io_context, ep, false); winjob::set_permission(LR"(C:\ProgramData\winjob\winjobd.sock)"); - auto user = winjob::get_owner(LR"(C:\Users\chn\Desktop\winjob.exe)"); - if (user) winjob::run_as(*user, LR"(C:\Users\chn\Desktop\winjob.exe)"); - std::function func = [&](const boost::system::error_code& ec, boost::asio::local::stream_protocol::socket socket) {