├── lib ├── README.md └── exec │ ├── CMakeLists.txt │ ├── appx.hpp │ ├── argv.cc │ ├── execinternal.hpp │ └── exec.hpp ├── vendor ├── bela │ ├── .clang_complete │ ├── external │ │ ├── ntimage.h.txt │ │ └── charconv │ │ │ ├── VERSION │ │ │ └── xcharconv.h │ ├── docs │ │ ├── en-US │ │ │ └── path.md │ │ ├── zh-CN │ │ │ ├── strcat.md │ │ │ ├── README.md │ │ │ ├── path.md │ │ │ └── strformat.md │ │ └── README.md │ ├── src │ │ ├── belawin │ │ │ ├── README.md │ │ │ ├── CMakeLists.txt │ │ │ ├── pe │ │ │ │ ├── overlay.cc │ │ │ │ ├── internal.hpp │ │ │ │ ├── string.cc │ │ │ │ ├── section.cc │ │ │ │ ├── rva.cc │ │ │ │ └── resource.cc │ │ │ └── env.cc │ │ ├── belaund │ │ │ ├── llvm │ │ │ │ ├── VERSION │ │ │ │ ├── include │ │ │ │ │ └── llvm │ │ │ │ │ │ ├── Config │ │ │ │ │ │ └── llvm-config.h │ │ │ │ │ │ └── Demangle │ │ │ │ │ │ └── StringViewExtras.h │ │ │ │ └── lib │ │ │ │ │ └── Demangle │ │ │ │ │ └── CMakeLists.txt │ │ │ └── CMakeLists.txt │ │ ├── hazel │ │ │ ├── zip │ │ │ │ ├── README.md │ │ │ │ ├── decompress.cc │ │ │ │ └── filemode.cc │ │ │ ├── macho │ │ │ │ ├── images │ │ │ │ │ ├── hello-macho.jpg │ │ │ │ │ └── micro-macho.jpg │ │ │ │ └── README.md │ │ │ ├── elf │ │ │ │ ├── images │ │ │ │ │ └── ELF_Executable_and_Linkable_Format_diagram_by_Ange_Albertini.png │ │ │ │ ├── README.md │ │ │ │ └── dynamic.cc │ │ │ ├── CMakeLists.txt │ │ │ ├── ina │ │ │ │ ├── hazelinc.hpp │ │ │ │ ├── docs.hpp │ │ │ │ ├── font.cc │ │ │ │ └── docs.cc │ │ │ └── hazel.cc │ │ ├── belahash │ │ │ ├── blake3 │ │ │ │ ├── .gitignore │ │ │ │ ├── blake3-config.cmake.in │ │ │ │ ├── libblake3.pc.in │ │ │ │ ├── example.c │ │ │ │ ├── blake3_tbb.cpp │ │ │ │ ├── example_tbb.c │ │ │ │ ├── CMakePresets.json │ │ │ │ └── Makefile.testing │ │ │ ├── blake3.lock │ │ │ └── README.md │ │ ├── belashl │ │ │ └── CMakeLists.txt │ │ ├── belatime │ │ │ ├── CMakeLists.txt │ │ │ ├── README.md │ │ │ ├── timezone.cc │ │ │ ├── clock.cc │ │ │ └── dos.cc │ │ └── bela │ │ │ ├── CMakeLists.txt │ │ │ ├── codecvt.cc │ │ │ └── __fnmatch │ │ │ └── fnmatch_internal.hpp │ ├── .clang-format │ ├── compile_flags.txt │ ├── utils │ │ ├── update-unicode │ │ │ ├── .gitignore │ │ │ └── update_unicode.sh │ │ └── scanner │ │ │ ├── main.cc │ │ │ ├── scanner.cc │ │ │ └── scanner.hpp │ ├── include │ │ ├── gtl.lock │ │ ├── hazel │ │ │ ├── details │ │ │ │ ├── version.lock │ │ │ │ └── ELFRelocs │ │ │ │ │ ├── BPF.def │ │ │ │ │ ├── MSP430.def │ │ │ │ │ ├── Lanai.def │ │ │ │ │ ├── AMDGPU.def │ │ │ │ │ ├── RISCV_nonstandard.def │ │ │ │ │ ├── VE.def │ │ │ │ │ ├── AVR.def │ │ │ │ │ ├── i386.def │ │ │ │ │ ├── x86_64.def │ │ │ │ │ ├── M68k.def │ │ │ │ │ ├── Xtensa.def │ │ │ │ │ └── SystemZ.def │ │ │ └── fs.hpp │ │ ├── bela │ │ │ ├── und.hpp │ │ │ ├── btree.hpp │ │ │ ├── picker.hpp │ │ │ ├── fnmatch.hpp │ │ │ ├── __charconv │ │ │ │ └── tables.hpp │ │ │ ├── escaping.hpp │ │ │ ├── process.hpp │ │ │ ├── fs.hpp │ │ │ ├── terminal.hpp │ │ │ ├── buffer.hpp │ │ │ └── bufio.hpp │ │ └── gtl │ │ │ └── combinators.hpp │ ├── build.bat │ ├── clang-tidy.bat │ ├── test │ │ ├── ls │ │ │ ├── CMakeLists.txt │ │ │ └── main.cc │ │ ├── io │ │ │ ├── CMakeLists.txt │ │ │ └── readall.cc │ │ ├── color │ │ │ ├── CMakeLists.txt │ │ │ └── main.cc │ │ ├── escapeargv │ │ │ ├── CMakeLists.txt │ │ │ ├── evw.cc │ │ │ └── eva.cc │ │ ├── now │ │ │ └── CMakeLists.txt │ │ ├── semver │ │ │ ├── CMakeLists.txt │ │ │ └── main.cc │ │ ├── filehash │ │ │ ├── CMakeLists.txt │ │ │ └── filehash.cc │ │ ├── mix │ │ │ ├── CMakeLists.txt │ │ │ └── endian.cc │ │ ├── tokencmd │ │ │ ├── CMakeLists.txt │ │ │ └── tokencmd.cc │ │ ├── base │ │ │ ├── constexpr_base.cc │ │ │ ├── static_string.cc │ │ │ ├── cityhash.cc │ │ │ ├── delfile.cc │ │ │ ├── startswith.cc │ │ │ ├── CMakeLists.txt │ │ │ └── strsplit.cc │ │ ├── escape │ │ │ ├── CMakeLists.txt │ │ │ ├── settitle.cc │ │ │ └── escape.cc │ │ ├── hazel │ │ │ └── CMakeLists.txt │ │ ├── fmt │ │ │ ├── strjoin.cc │ │ │ ├── CMakeLists.txt │ │ │ └── unicode-width.cc │ │ ├── binview │ │ │ ├── CMakeLists.txt │ │ │ ├── machoview.cc │ │ │ └── elfview.cc │ │ ├── appexeclink │ │ │ ├── CMakeLists.txt │ │ │ ├── rptest.cc │ │ │ └── appexeclink.cc │ │ ├── win │ │ │ ├── CMakeLists.txt │ │ │ ├── version.cc │ │ │ └── pick.cc │ │ ├── CMakeLists.txt │ │ └── winutils │ │ │ ├── dirname.cc │ │ │ ├── exepath.cc │ │ │ ├── which.cc │ │ │ ├── CMakeLists.txt │ │ │ ├── process.cc │ │ │ ├── writefile.cc │ │ │ ├── env2.cc │ │ │ ├── envps.cc │ │ │ └── expandenv.cc │ ├── .cmake-format.json │ ├── res │ │ ├── longPathAware.manifest │ │ ├── utf8activeCodePage.manifest │ │ ├── 1903.manifest │ │ └── win10.manifest │ ├── CMakeSettings.json │ ├── .gitignore │ └── CMakeLists.txt ├── bela.lock ├── pugixml.lock └── pugixml │ └── LICENSE.md ├── .clang_complete ├── .clang-format ├── include ├── json.hpp.lock ├── apphelp.hpp ├── file.hpp ├── baseversion.h └── baseversion.h.cmake ├── AppExec ├── app.ico ├── CMakeLists.txt ├── main.cc ├── appx.cc ├── capabilities.cc ├── AppExec.manifest ├── resource.h └── settings.cc ├── Privexec ├── app.ico ├── main.cc ├── CMakeLists.txt ├── Privexec.manifest ├── capabilities.cc ├── resource.h └── alias.cc ├── wsudo ├── shield.ico ├── wsudo.ico ├── resource.h ├── verify.md ├── server.hpp ├── CMakeLists.txt ├── server.cc ├── wsudo.manifest ├── alias.hpp └── env.hpp ├── docs ├── images │ ├── admin.png │ ├── alias.png │ ├── wsudo.png │ ├── appexec.png │ ├── austack.png │ ├── wsudo3.png │ ├── appcontainer.png │ └── wsudo-bridge-new-mintty.png ├── Details.md ├── covert.ps1 ├── useful.md └── changelog.md ├── resources ├── Square44x44Logo.targetsize-32.png └── Square44x44Logo.altform-unplated_targetsize-32.png ├── test ├── apc │ └── CMakeLists.txt ├── strappend.cc ├── pugixml │ └── main.cc └── appmanifest │ └── FluentEditor.appxmanifest ├── .cmake-format.json ├── script ├── uninstall.bat ├── runassys.bat ├── runasti.bat ├── runassys.ps1 └── runasti.ps1 ├── .vscode └── c_cpp_properties.json ├── config └── Privexec.json ├── LICENSE └── .github └── workflows └── ci.yml /lib/README.md: -------------------------------------------------------------------------------- 1 | # Privexec libs -------------------------------------------------------------------------------- /vendor/bela/.clang_complete: -------------------------------------------------------------------------------- 1 | -Iinclude 2 | -------------------------------------------------------------------------------- /vendor/bela/external/ntimage.h.txt: -------------------------------------------------------------------------------- 1 | 10.0.22000.1 -------------------------------------------------------------------------------- /vendor/bela/docs/en-US/path.md: -------------------------------------------------------------------------------- 1 | # Path function 2 | -------------------------------------------------------------------------------- /vendor/bela/docs/zh-CN/strcat.md: -------------------------------------------------------------------------------- 1 | # StringCat 和 StrAppend 函数 2 | -------------------------------------------------------------------------------- /vendor/bela/docs/README.md: -------------------------------------------------------------------------------- 1 | # Bela docs 2 | 3 | Bela documents. 4 | -------------------------------------------------------------------------------- /vendor/bela/src/belawin/README.md: -------------------------------------------------------------------------------- 1 | # Bela Windows OS Feature library -------------------------------------------------------------------------------- /.clang_complete: -------------------------------------------------------------------------------- 1 | -Iinclude 2 | -Ilib/exec 3 | -Ivendor/bela/include 4 | -------------------------------------------------------------------------------- /.clang-format: -------------------------------------------------------------------------------- 1 | BasedOnStyle: LLVM 2 | SortIncludes: false 3 | ColumnLimit: 120 -------------------------------------------------------------------------------- /include/json.hpp.lock: -------------------------------------------------------------------------------- 1 | https://github.com/nlohmann/json 2 | version=3.12.0 3 | -------------------------------------------------------------------------------- /AppExec/app.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M2Team/Privexec/HEAD/AppExec/app.ico -------------------------------------------------------------------------------- /Privexec/app.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M2Team/Privexec/HEAD/Privexec/app.ico -------------------------------------------------------------------------------- /wsudo/shield.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M2Team/Privexec/HEAD/wsudo/shield.ico -------------------------------------------------------------------------------- /wsudo/wsudo.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M2Team/Privexec/HEAD/wsudo/wsudo.ico -------------------------------------------------------------------------------- /docs/images/admin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M2Team/Privexec/HEAD/docs/images/admin.png -------------------------------------------------------------------------------- /docs/images/alias.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M2Team/Privexec/HEAD/docs/images/alias.png -------------------------------------------------------------------------------- /docs/images/wsudo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M2Team/Privexec/HEAD/docs/images/wsudo.png -------------------------------------------------------------------------------- /vendor/bela/.clang-format: -------------------------------------------------------------------------------- 1 | BasedOnStyle: LLVM 2 | SortIncludes: false 3 | ColumnLimit: 120 4 | -------------------------------------------------------------------------------- /vendor/bela/compile_flags.txt: -------------------------------------------------------------------------------- 1 | -Wall 2 | -Wextra 3 | -pedantic 4 | -std=c++17 5 | -Iinclude -------------------------------------------------------------------------------- /vendor/bela/src/belaund/llvm/VERSION: -------------------------------------------------------------------------------- 1 | llvm-project:a95a303a54e3bdaec948a8d9e945ff76d2a657a4 -------------------------------------------------------------------------------- /vendor/bela/utils/update-unicode/.gitignore: -------------------------------------------------------------------------------- 1 | uniset/ 2 | UnicodeData.txt 3 | EastAsianWidth.txt -------------------------------------------------------------------------------- /docs/images/appexec.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M2Team/Privexec/HEAD/docs/images/appexec.png -------------------------------------------------------------------------------- /docs/images/austack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M2Team/Privexec/HEAD/docs/images/austack.png -------------------------------------------------------------------------------- /docs/images/wsudo3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M2Team/Privexec/HEAD/docs/images/wsudo3.png -------------------------------------------------------------------------------- /vendor/bela.lock: -------------------------------------------------------------------------------- 1 | https://github.com/fcharlie/bela/tree/000e92b75bf42fe19831fe0322b9410a506883e3 2 | -------------------------------------------------------------------------------- /vendor/pugixml.lock: -------------------------------------------------------------------------------- 1 | https://github.com/zeux/pugixml/tree/61c944895e071872370219cadade8423dc6e04dc 2 | -------------------------------------------------------------------------------- /docs/images/appcontainer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M2Team/Privexec/HEAD/docs/images/appcontainer.png -------------------------------------------------------------------------------- /vendor/bela/include/gtl.lock: -------------------------------------------------------------------------------- 1 | https://github.com/greg7mdp/gtl 2 | 7fdccadfe576b3f126aeea4645d16cce89b0bddc -------------------------------------------------------------------------------- /vendor/bela/src/hazel/zip/README.md: -------------------------------------------------------------------------------- 1 | # ZIP 2 | 3 | ![](./images/ZIP-64_Internal_Layout.svg) 4 | 5 | 6 | -------------------------------------------------------------------------------- /docs/Details.md: -------------------------------------------------------------------------------- 1 | # Details 2 | 3 | `CreateProcessAsUser` Stack: 4 | 5 | ![Stask](./images/austack.png) 6 | -------------------------------------------------------------------------------- /vendor/bela/src/belahash/blake3/.gitignore: -------------------------------------------------------------------------------- 1 | blake3 2 | example 3 | build/ 4 | *.o 5 | 6 | CMakeUserPresets.json 7 | -------------------------------------------------------------------------------- /vendor/bela/build.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | pwsh -NoProfile -NoLogo -ExecutionPolicy unrestricted -File "%~dp0build.ps1" %* -------------------------------------------------------------------------------- /vendor/bela/external/charconv/VERSION: -------------------------------------------------------------------------------- 1 | https://github.com/microsoft/stl/tree/5404ba9c25f26f25a0ac50e6c4defce7833a8da6 2 | -------------------------------------------------------------------------------- /vendor/bela/src/belahash/blake3.lock: -------------------------------------------------------------------------------- 1 | https://github.com/BLAKE3-team/BLAKE3 2 | 890050cb9b89448a25e067349aed9734a3b03d5e 3 | -------------------------------------------------------------------------------- /docs/images/wsudo-bridge-new-mintty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M2Team/Privexec/HEAD/docs/images/wsudo-bridge-new-mintty.png -------------------------------------------------------------------------------- /vendor/bela/clang-tidy.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | pwsh -NoProfile -NoLogo -ExecutionPolicy unrestricted -File "%~dp0clang-tidy.ps1" %* -------------------------------------------------------------------------------- /resources/Square44x44Logo.targetsize-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M2Team/Privexec/HEAD/resources/Square44x44Logo.targetsize-32.png -------------------------------------------------------------------------------- /vendor/bela/test/ls/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | add_executable(ls_test 2 | main.cc 3 | ) 4 | 5 | target_link_libraries(ls_test 6 | belawin 7 | ) 8 | -------------------------------------------------------------------------------- /vendor/bela/utils/scanner/main.cc: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | int wmain(int argc, wchar_t **argv) { 4 | // 5 | return 0; 6 | } -------------------------------------------------------------------------------- /docs/covert.ps1: -------------------------------------------------------------------------------- 1 | Get-Content $PSScriptRoot\calist.txt|ForEach-Object { 2 | $nl = $_.TrimStart() 3 | "L$nl"|Out-File -Append catemp.cc 4 | } -------------------------------------------------------------------------------- /vendor/bela/test/io/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | add_executable(readall_test 2 | readall.cc 3 | ) 4 | 5 | target_link_libraries(readall_test 6 | belawin 7 | ) -------------------------------------------------------------------------------- /vendor/bela/src/belaund/llvm/include/llvm/Config/llvm-config.h: -------------------------------------------------------------------------------- 1 | #ifndef CONFIG_H 2 | #define CONFIG_H 3 | 4 | #define LLVM_BUILD_STATIC 1 5 | 6 | #endif -------------------------------------------------------------------------------- /vendor/bela/src/hazel/macho/images/hello-macho.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M2Team/Privexec/HEAD/vendor/bela/src/hazel/macho/images/hello-macho.jpg -------------------------------------------------------------------------------- /vendor/bela/src/hazel/macho/images/micro-macho.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M2Team/Privexec/HEAD/vendor/bela/src/hazel/macho/images/micro-macho.jpg -------------------------------------------------------------------------------- /vendor/bela/test/color/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # base 2 | add_executable(color_test 3 | main.cc 4 | ) 5 | 6 | target_link_libraries(color_test 7 | bela 8 | ) -------------------------------------------------------------------------------- /vendor/bela/include/hazel/details/version.lock: -------------------------------------------------------------------------------- 1 | https://github.com/llvm/llvm-project/tree/a95a303a54e3bdaec948a8d9e945ff76d2a657a4/llvm/include/llvm/BinaryFormat -------------------------------------------------------------------------------- /vendor/bela/test/escapeargv/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | ## 2 | 3 | add_executable(ev_test 4 | evw.cc 5 | ) 6 | 7 | target_link_libraries(ev_test 8 | bela 9 | ) 10 | -------------------------------------------------------------------------------- /vendor/bela/test/now/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # 2 | ## 3 | 4 | add_executable(now 5 | now.cc 6 | ) 7 | 8 | target_link_libraries(now 9 | belatime 10 | ) 11 | 12 | -------------------------------------------------------------------------------- /resources/Square44x44Logo.altform-unplated_targetsize-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M2Team/Privexec/HEAD/resources/Square44x44Logo.altform-unplated_targetsize-32.png -------------------------------------------------------------------------------- /vendor/bela/test/semver/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | ## 2 | 3 | add_executable(semver_test 4 | main.cc 5 | ) 6 | 7 | target_link_libraries(semver_test 8 | bela 9 | ) 10 | -------------------------------------------------------------------------------- /vendor/bela/src/belashl/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # bela win libaray 2 | 3 | add_library(belashl STATIC picker.cc) 4 | 5 | target_link_libraries(belashl belawin Comctl32 Ole32) 6 | 7 | -------------------------------------------------------------------------------- /vendor/bela/test/filehash/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | ## 2 | 3 | add_executable(filehash 4 | filehash.cc 5 | ) 6 | 7 | target_link_libraries(filehash 8 | belahash 9 | ) 10 | -------------------------------------------------------------------------------- /vendor/bela/test/mix/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # 2 | ## 3 | 4 | add_executable(endian_test 5 | endian.cc 6 | ) 7 | 8 | target_link_libraries(endian_test 9 | bela 10 | ) 11 | 12 | -------------------------------------------------------------------------------- /vendor/bela/test/tokencmd/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | ## 2 | 3 | add_executable(tokencmd_test 4 | tokencmd.cc 5 | ) 6 | 7 | target_link_libraries(tokencmd_test 8 | bela 9 | ) 10 | -------------------------------------------------------------------------------- /vendor/bela/docs/zh-CN/README.md: -------------------------------------------------------------------------------- 1 | # Bela 中文文档索引 2 | 3 | 1. StringCat 字符串函数:[StringCat](./strcat.md) 4 | 2. Path 路径函数:[path.md](./path.md) 5 | 3. StrFormat: [StrFormat](./strformat.md) 6 | -------------------------------------------------------------------------------- /test/apc/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # privexec 2 | 3 | add_executable(edge_test 4 | edge.cc 5 | ) 6 | 7 | target_link_libraries(edge_test 8 | bela 9 | belawin 10 | ) 11 | 12 | -------------------------------------------------------------------------------- /lib/exec/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # exec lib 2 | add_library(Exec STATIC 3 | appcontainer.cc 4 | argv.cc 5 | elevator.cc 6 | exec.cc 7 | system.cc 8 | ) 9 | 10 | target_link_libraries(Exec 11 | belawin 12 | ) 13 | -------------------------------------------------------------------------------- /vendor/bela/src/hazel/elf/images/ELF_Executable_and_Linkable_Format_diagram_by_Ange_Albertini.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M2Team/Privexec/HEAD/vendor/bela/src/hazel/elf/images/ELF_Executable_and_Linkable_Format_diagram_by_Ange_Albertini.png -------------------------------------------------------------------------------- /vendor/bela/test/mix/endian.cc: -------------------------------------------------------------------------------- 1 | /// 2 | #include 3 | #include 4 | 5 | int wmain() { 6 | int val = 2; 7 | auto x = bela::frombe(val); 8 | bela::FPrintF(stderr, L"%d\n", x); 9 | return 0; 10 | } 11 | -------------------------------------------------------------------------------- /lib/exec/appx.hpp: -------------------------------------------------------------------------------- 1 | /// 2 | #ifndef WSUDO_EXEC_APPX_HPP 3 | #define WSUDO_EXEC_APPX_HPP 4 | #include 5 | 6 | namespace wsudo::exec { 7 | bool LoadAppx(std::wstring_view file, std::vector &caps, bela::error_code &ec); 8 | } 9 | 10 | #endif -------------------------------------------------------------------------------- /vendor/bela/test/base/constexpr_base.cc: -------------------------------------------------------------------------------- 1 | /// 2 | #include 3 | //#include 4 | 5 | int wmain() { 6 | constexpr bela::Hex a(123456789U); 7 | constexpr bela::Dec b(123456789, bela::kZeroPad16); 8 | return 0; 9 | } -------------------------------------------------------------------------------- /vendor/bela/include/bela/und.hpp: -------------------------------------------------------------------------------- 1 | /// 2 | #ifndef BELA_UND_HPP 3 | #define BELA_UND_HPP 4 | #include 5 | 6 | namespace llvm { 7 | std::string demangle(std::string_view MangledName); 8 | } 9 | namespace bela { 10 | using llvm::demangle; 11 | } 12 | 13 | #endif -------------------------------------------------------------------------------- /vendor/bela/test/escape/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # 2 | 3 | add_executable(escape_test 4 | escape.cc 5 | ) 6 | 7 | target_link_libraries(escape_test 8 | bela 9 | ) 10 | 11 | add_executable(title_test 12 | settitle.cc 13 | ) 14 | 15 | target_link_libraries(title_test 16 | bela 17 | ) -------------------------------------------------------------------------------- /vendor/bela/include/bela/btree.hpp: -------------------------------------------------------------------------------- 1 | /// 2 | #ifndef BELA_BTREE_HPP 3 | #define BELA_BTREE_HPP 4 | #include "__phmap/btree.h" 5 | 6 | namespace bela { 7 | using phmap::btree_map; 8 | using phmap::btree_multimap; 9 | using phmap::btree_set; 10 | } // namespace bela 11 | 12 | #endif 13 | -------------------------------------------------------------------------------- /vendor/bela/src/belatime/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # 2 | 3 | # bela win libaray 4 | 5 | add_library( 6 | belatime STATIC 7 | clock.cc 8 | datetime.cc 9 | dos.cc 10 | duration.cc 11 | format.cc 12 | time.cc 13 | timezone.cc) 14 | 15 | target_link_libraries(belatime bela) 16 | 17 | -------------------------------------------------------------------------------- /vendor/bela/test/hazel/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | add_executable(zipview 2 | zipview.cc 3 | ) 4 | 5 | target_link_libraries(zipview 6 | belatime 7 | belawin 8 | hazel 9 | ) 10 | 11 | # add_executable(shebang-gen 12 | # shebang-gen.cc 13 | # ) 14 | 15 | # target_link_libraries(shebang-gen 16 | # belawin 17 | # ) -------------------------------------------------------------------------------- /vendor/bela/src/belahash/README.md: -------------------------------------------------------------------------------- 1 | # Bela Hash Library 2 | 3 | This directory includes the implementation of the SHA256/SHA512/SHA3/BLAKE3 hash algorithm, in which the code of SHA256/SHA512/SHA3 based on librhash is adjusted to the C++17 paradigm, thanks to the rhash author for his efforts. Thanks also to BLAKE3 contributors. -------------------------------------------------------------------------------- /.cmake-format.json: -------------------------------------------------------------------------------- 1 | { 2 | "format": { 3 | "line_width": 120, 4 | "tab_size": 2, 5 | "max_pargs_hwrap": 4, 6 | "max_subgroups_hwrap": 2, 7 | "separate_ctrl_name_with_space": false, 8 | "separate_fn_name_with_space": false, 9 | "dangle_parens": false 10 | } 11 | } -------------------------------------------------------------------------------- /vendor/bela/test/fmt/strjoin.cc: -------------------------------------------------------------------------------- 1 | // 2 | #include 3 | #include 4 | 5 | int wmain() { 6 | constexpr std::wstring_view strs[] = {L"1", L"---", L"XXX", L"ZZZZ", L"NNNN"}; 7 | auto s = bela::StrJoin(strs, L";"); 8 | bela::FPrintF(stderr, L"Joined: %s\n", s); 9 | return 0; 10 | } -------------------------------------------------------------------------------- /vendor/bela/.cmake-format.json: -------------------------------------------------------------------------------- 1 | { 2 | "format": { 3 | "line_width": 120, 4 | "tab_size": 2, 5 | "max_pargs_hwrap": 4, 6 | "max_subgroups_hwrap": 2, 7 | "separate_ctrl_name_with_space": false, 8 | "separate_fn_name_with_space": false, 9 | "dangle_parens": false 10 | } 11 | } -------------------------------------------------------------------------------- /vendor/bela/test/binview/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # base 2 | add_executable(elfview_test 3 | elfview.cc 4 | ) 5 | 6 | target_link_libraries(elfview_test 7 | hazel 8 | belaund 9 | ) 10 | 11 | # base 12 | add_executable(machoview_test 13 | machoview.cc 14 | ) 15 | 16 | target_link_libraries(machoview_test 17 | hazel 18 | belaund 19 | ) -------------------------------------------------------------------------------- /vendor/bela/test/base/static_string.cc: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | int main() { 6 | bela::static_string<4096> exe; 7 | bela::FPrintF(stderr, L"%zu %zu max_size: %zu sv: %s\n", exe.size(), exe.capacity(), exe.max_size(), exe.subview()); 8 | // 9 | return 0; 10 | } -------------------------------------------------------------------------------- /vendor/bela/src/belaund/llvm/lib/Demangle/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | add_llvm_component_library(LLVMDemangle 2 | Demangle.cpp 3 | ItaniumDemangle.cpp 4 | MicrosoftDemangle.cpp 5 | MicrosoftDemangleNodes.cpp 6 | RustDemangle.cpp 7 | DLangDemangle.cpp 8 | 9 | ADDITIONAL_HEADER_DIRS 10 | "${LLVM_MAIN_INCLUDE_DIR}/llvm/Demangle" 11 | 12 | ) 13 | -------------------------------------------------------------------------------- /Privexec/main.cc: -------------------------------------------------------------------------------- 1 | /// 2 | #include 3 | #include "app.hpp" 4 | #include 5 | 6 | int WINAPI wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, 7 | _In_ int nCmdShow) { 8 | priv::dotcom_global_initializer di; 9 | priv::App app; 10 | return app.run(hInstance); 11 | } 12 | -------------------------------------------------------------------------------- /script/uninstall.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | reg delete "HKCR\exefile\shell\runassystem" /f 4 | reg delete "HKCR\batfile\shell\runassystem" /f 5 | reg delete "HKCR\cmdfile\shell\runassystem" /f 6 | reg delete "HKCR\exefile\shell\runastrustedinstaller" /f 7 | reg delete "HKCR\batfile\shell\runastrustedinstaller" /f 8 | reg delete "HKCR\cmdfile\shell\runastrustedinstaller" /f -------------------------------------------------------------------------------- /vendor/bela/include/hazel/details/ELFRelocs/BPF.def: -------------------------------------------------------------------------------- 1 | #ifndef ELF_RELOC 2 | #error "ELF_RELOC must be defined" 3 | #endif 4 | 5 | // No relocation 6 | ELF_RELOC(R_BPF_NONE, 0) 7 | ELF_RELOC(R_BPF_64_64, 1) 8 | ELF_RELOC(R_BPF_64_ABS64, 2) 9 | ELF_RELOC(R_BPF_64_ABS32, 3) 10 | ELF_RELOC(R_BPF_64_NODYLD32, 4) 11 | ELF_RELOC(R_BPF_64_32, 10) 12 | -------------------------------------------------------------------------------- /script/runassys.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | where pwsh.exe >nul 2>nul 3 | if %ERRORLEVEL% NEQ 0 ( 4 | echo It is recommended to install PowerShell 7^+ for a better experience. 5 | powershell -NoProfile -NoLogo -ExecutionPolicy unrestricted -File "%~dp0runassys.ps1" %* 6 | ) else ( 7 | pwsh -NoProfile -NoLogo -ExecutionPolicy unrestricted -File "%~dp0runassys.ps1" %* 8 | ) -------------------------------------------------------------------------------- /script/runasti.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | where pwsh.exe >nul 2>nul 3 | if %ERRORLEVEL% NEQ 0 ( 4 | echo It is recommended to install PowerShell 7^+ for a better experience. 5 | powershell -NoProfile -NoLogo -ExecutionPolicy unrestricted -File "%~dp0runasti.ps1" %* 6 | ) else ( 7 | pwsh -NoProfile -NoLogo -ExecutionPolicy unrestricted -File "%~dp0runasti.ps1" %* 8 | ) -------------------------------------------------------------------------------- /vendor/bela/test/base/cityhash.cc: -------------------------------------------------------------------------------- 1 | // 2 | #include 3 | #include 4 | 5 | int wmain(int argc, wchar_t **argv) { 6 | std::wstring_view sn(argv[0]); 7 | bela::FPrintF(stderr, L"%s --> hash: %d\n", argv[0], 8 | bela::CityHash64(reinterpret_cast(sn.data()), sn.size() * sizeof(wchar_t))); 9 | return 0; 10 | } -------------------------------------------------------------------------------- /vendor/bela/test/appexeclink/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # 2 | 3 | add_executable(appexeclink_test appexeclink.cc) 4 | 5 | target_link_libraries(appexeclink_test belawin) 6 | 7 | add_executable(rptest rptest.cc) 8 | 9 | target_link_libraries(rptest belawin hazel) 10 | 11 | add_executable(fileview_test fv.cc) 12 | 13 | target_link_libraries(fileview_test belawin belatime hazel) 14 | -------------------------------------------------------------------------------- /vendor/bela/src/belahash/blake3/blake3-config.cmake.in: -------------------------------------------------------------------------------- 1 | @PACKAGE_INIT@ 2 | 3 | include(CMakeFindDependencyMacro) 4 | 5 | # Remember TBB option state 6 | set(BLAKE3_USE_TBB @BLAKE3_USE_TBB@) 7 | 8 | if(BLAKE3_USE_TBB) 9 | find_dependency(TBB @TBB_VERSION@) 10 | endif() 11 | 12 | include("${CMAKE_CURRENT_LIST_DIR}/blake3-targets.cmake") 13 | 14 | check_required_components(blake3) 15 | -------------------------------------------------------------------------------- /vendor/bela/src/hazel/macho/README.md: -------------------------------------------------------------------------------- 1 | # Mach-O documents 2 | 3 | Wikipedia: [Mach-O](https://en.wikipedia.org/wiki/Mach-O) 4 | 5 | Hello Mach-O (source: [http://seriot.ch/hello_macho.php](http://seriot.ch/hello_macho.php)): 6 | 7 | ![](./images/hello-macho.jpg) 8 | 9 | Micro Mach-O (source: [http://seriot.ch/hello_macho.php](http://seriot.ch/hello_macho.php)): 10 | 11 | ![](./images/micro-macho.jpg) 12 | 13 | -------------------------------------------------------------------------------- /vendor/bela/res/longPathAware.manifest: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | true 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /vendor/bela/src/belahash/blake3/libblake3.pc.in: -------------------------------------------------------------------------------- 1 | prefix="@CMAKE_INSTALL_PREFIX@" 2 | exec_prefix="${prefix}" 3 | libdir="@PKG_CONFIG_INSTALL_LIBDIR@" 4 | includedir="@PKG_CONFIG_INSTALL_INCLUDEDIR@" 5 | 6 | Name: @PROJECT_NAME@ 7 | Description: @PROJECT_DESCRIPTION@ 8 | Version: @PROJECT_VERSION@ 9 | 10 | Requires: @PKG_CONFIG_REQUIRES@ 11 | Libs: -L"${libdir}" -lblake3 @PKG_CONFIG_LIBS@ 12 | Cflags: -I"${includedir}" @PKG_CONFIG_CFLAGS@ 13 | -------------------------------------------------------------------------------- /.vscode/c_cpp_properties.json: -------------------------------------------------------------------------------- 1 | { 2 | "configurations": [ 3 | { 4 | "name": "Win32", 5 | "includePath": [ 6 | "${workspaceFolder}/**", 7 | "${workspaceFolder}/include" 8 | ], 9 | "defines": [ 10 | "_DEBUG", 11 | "UNICODE", 12 | "_UNICODE" 13 | ] 14 | } 15 | ], 16 | "version": 4 17 | } -------------------------------------------------------------------------------- /vendor/bela/src/bela/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # bela base libaray 2 | 3 | add_library( 4 | bela STATIC 5 | errno.cc 6 | ascii.cc 7 | city.cc 8 | codecvt.cc 9 | escaping.cc 10 | int128.cc 11 | match.cc 12 | numbers.cc 13 | str_split.cc 14 | str_split_narrow.cc 15 | str_replace.cc 16 | str_cat.cc 17 | subsitute.cc 18 | terminal.cc 19 | __charconv/charconv_float.cc 20 | __fnmatch/fnmatch.cc 21 | __format/fmt.cc) 22 | 23 | -------------------------------------------------------------------------------- /vendor/bela/src/belatime/README.md: -------------------------------------------------------------------------------- 1 | # Time 2 | 3 | 4 | [Leap Smear](https://developers.google.com/time/smear) 5 | 6 | [How the Windows Time service treats a leap second](https://docs.microsoft.com/en-us/troubleshoot/windows-server/identity/time-service-treats-leap-second) 7 | 8 | ## Windows Time 9 | 10 | [How the Windows Time Service Works](https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2003/cc773013(v=ws.10)) -------------------------------------------------------------------------------- /docs/useful.md: -------------------------------------------------------------------------------- 1 | # Useful docs 2 | 3 | 4 | ## Process 5 | 6 | [Reading another process’s environment](https://blogs.msdn.microsoft.com/matt_pietrek/2004/08/25/reading-another-processs-environment/ ) 7 | 8 | ## Sudo internal 9 | 10 | [Comments about Windows sudo @fcharlie](https://github.com/microsoft/terminal/issues/146#issuecomment-515812461) 11 | 12 | ## Privexec Internal 13 | 14 | [Privexec New](https://forcemz.net/windows/2018/12/01/PrivexecNew/) -------------------------------------------------------------------------------- /Privexec/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # privexec 2 | 3 | add_executable( 4 | Privexec WIN32 5 | alias.cc 6 | capabilities.cc 7 | app.cc 8 | main.cc 9 | Privexec.manifest 10 | Privexec.rc) 11 | 12 | target_link_libraries( 13 | Privexec 14 | Exec 15 | belashl 16 | Comctl32 17 | Shlwapi 18 | Pathcch 19 | wtsapi32 20 | Userenv 21 | Taskschd 22 | Kernel32 23 | Gdi32 24 | Advapi32) 25 | 26 | install(TARGETS Privexec DESTINATION .) 27 | -------------------------------------------------------------------------------- /config/Privexec.json: -------------------------------------------------------------------------------- 1 | { 2 | "alias": [ 3 | { 4 | "description": "Edit Hosts", 5 | "name": "edit-hosts", 6 | "target": "Notepad %windir%\\System32\\Drivers\\etc\\hosts" 7 | }, 8 | { 9 | "description": "Windows Debugger", 10 | "name": "windbg", 11 | "target": "\"%ProgramFiles(x86)%\\Windows Kits\\10\\Debuggers\\x64\\windbg.exe\"" 12 | } 13 | ] 14 | } -------------------------------------------------------------------------------- /AppExec/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # privexec 2 | 3 | add_executable( 4 | AppExec WIN32 5 | settings.cc 6 | capabilities.cc 7 | app.cc 8 | appx.cc 9 | main.cc 10 | Appexec.manifest 11 | Appexec.rc) 12 | 13 | target_link_libraries( 14 | AppExec 15 | Exec 16 | belashl 17 | Comctl32 18 | Shlwapi 19 | Pathcch 20 | wtsapi32 21 | Userenv 22 | Taskschd 23 | Kernel32 24 | Gdi32 25 | Advapi32) 26 | 27 | install(TARGETS AppExec DESTINATION .) 28 | -------------------------------------------------------------------------------- /test/strappend.cc: -------------------------------------------------------------------------------- 1 | #include "../include/strcat.hpp" 2 | #include 3 | #include 4 | 5 | int wmain(int argc, wchar_t const *argv[]) { 6 | /* code */ 7 | _wsetlocale(LC_ALL, L""); 8 | std::wstring s = L"nihao"; 9 | base::StrAppend(&s, L" current command args: ", argc, L" first: ", argv[0]); 10 | if (argc >= 2) { 11 | base::StrAppend(&s, L" second: ", argv[1]); 12 | } 13 | wprintf(L"%s\n", s.data()); 14 | return 0; 15 | } -------------------------------------------------------------------------------- /vendor/bela/test/base/delfile.cc: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | int wmain(int argc, wchar_t **argv) { 6 | if (argc < 2) { 7 | bela::FPrintF(stderr, L"usage: delfile %s\n", argv[0]); 8 | return 1; 9 | } 10 | bela::error_code ec; 11 | if (!bela::fs::ForceDeleteFolders(argv[1], ec)) { 12 | bela::FPrintF(stderr, L"remove all: %s %d %s\n", argv[1], ec.code, ec); 13 | } 14 | return 0; 15 | } -------------------------------------------------------------------------------- /vendor/bela/test/win/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | ## 2 | add_executable(pecoff_test 3 | pecoff.cc 4 | ) 5 | 6 | target_link_libraries(pecoff_test 7 | belawin 8 | belaund 9 | hazel 10 | ) 11 | 12 | ## 13 | add_executable(version_test 14 | version.cc 15 | ) 16 | 17 | target_link_libraries(version_test 18 | belawin 19 | ) 20 | 21 | 22 | add_executable(pick_test 23 | pick.cc 24 | ../../res/win10.manifest 25 | ) 26 | 27 | target_link_libraries(pick_test 28 | belashl 29 | ) -------------------------------------------------------------------------------- /vendor/bela/test/escapeargv/evw.cc: -------------------------------------------------------------------------------- 1 | /// 2 | #include 3 | #include 4 | 5 | // 6 | int wmain(int argc, wchar_t **argv) { 7 | bela::EscapeArgv ea; 8 | ea.Assign(argv[0]); 9 | for (int i = 1; i < argc; i++) { 10 | ea.Append(argv[i]); 11 | } 12 | bela::FPrintF(stderr, L"%s\n", ea.sv()); 13 | bela::EscapeArgv ea2(L"zzzz", L"", L"vvv ssdss", L"-D=\"JJJJJ sb\""); 14 | bela::FPrintF(stderr, L"%s\n", ea2.sv()); 15 | return 0; 16 | } -------------------------------------------------------------------------------- /wsudo/resource.h: -------------------------------------------------------------------------------- 1 | //{{NO_DEPENDENCIES}} 2 | // Microsoft Visual C++ generated include file. 3 | // Used by wsudo.rc 4 | 5 | // 6 | #include "baseversion.h" 7 | 8 | #define IDI_APPICON 1001 9 | #define IDI_SHIELD 1002 10 | 11 | #ifdef APSTUDIO_INVOKED 12 | #ifndef APSTUDIO_READONLY_SYMBOLS 13 | #define _APS_NEXT_RESOURCE_VALUE 101 14 | #define _APS_NEXT_COMMAND_VALUE 40001 15 | #define _APS_NEXT_CONTROL_VALUE 1001 16 | #define _APS_NEXT_SYMED_VALUE 101 17 | #endif 18 | #endif 19 | -------------------------------------------------------------------------------- /vendor/bela/src/belaund/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # bela win libaray 2 | 3 | add_library( 4 | belaund STATIC 5 | llvm/lib/Demangle/Demangle.cpp 6 | llvm/lib/Demangle/DLangDemangle.cpp 7 | llvm/lib/Demangle/ItaniumDemangle.cpp 8 | llvm/lib/Demangle/MicrosoftDemangle.cpp 9 | llvm/lib/Demangle/MicrosoftDemangleNodes.cpp 10 | llvm/lib/Demangle/RustDemangle.cpp) 11 | 12 | target_include_directories(belaund PRIVATE llvm/include) 13 | target_compile_options(belaund PRIVATE -wd4996 -wd4244 -wd4267) -------------------------------------------------------------------------------- /vendor/bela/src/hazel/elf/README.md: -------------------------------------------------------------------------------- 1 | # ELF documents 2 | 3 | Wikipedia: [Executable and Linkable Format](https://en.wikipedia.org/wiki/Executable_and_Linkable_Format) 4 | 5 | ELF Format image (from: Wikipedia): 6 | 7 | Layout: 8 | 9 | ![](./images/Elf-layout.svg) 10 | 11 | Section: 12 | 13 | ![](./images/ELF_Executable_and_Linkable_Format_diagram_by_Ange_Albertini.png) 14 | 15 | ## RISC-V 16 | 17 | [RISC-V ELF psABI specification](https://github.com/riscv/riscv-elf-psabi-doc/blob/master/riscv-elf.md) -------------------------------------------------------------------------------- /vendor/bela/test/semver/main.cc: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | int wmain() { 5 | bela::semver::version v1(L"7.8.1-rc.1"); 6 | bela::semver::version v2("7.8.1.0-rc.1"); 7 | bela::semver::version v3(u8"7.8.1-rc.1"); 8 | bela::FPrintF(stderr, L"v1(%s)%s=v2(%s)\n", v1.make_string_version(), (v1 == v2 ? L"=" : L"!"), 9 | v2.make_string_version()); 10 | bela::FPrintF(stderr, L"version: %s\n", v3.make_string_version()); 11 | return 0; 12 | } -------------------------------------------------------------------------------- /AppExec/main.cc: -------------------------------------------------------------------------------- 1 | /// 2 | #include 3 | #include "app.hpp" 4 | #include 5 | 6 | int WINAPI wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, 7 | _In_ int nCmdShow) { 8 | priv::dotcom_global_initializer di; 9 | priv::App app; 10 | // INITCOMMONCONTROLSEX iccex; 11 | // iccex.dwICC = ICC_WIN95_CLASSES; 12 | // iccex.dwSize = sizeof(INITCOMMONCONTROLSEX); 13 | // InitCommonControlsEx(&iccex); 14 | return app.run(hInstance); 15 | } 16 | -------------------------------------------------------------------------------- /vendor/bela/test/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # 2 | 3 | add_subdirectory(appexeclink) 4 | add_subdirectory(base) 5 | add_subdirectory(binview) 6 | add_subdirectory(color) 7 | add_subdirectory(escape) 8 | add_subdirectory(escapeargv) 9 | add_subdirectory(filehash) 10 | add_subdirectory(fmt) 11 | add_subdirectory(hazel) 12 | add_subdirectory(io) 13 | add_subdirectory(ls) 14 | add_subdirectory(mix) 15 | add_subdirectory(now) 16 | add_subdirectory(semver) 17 | add_subdirectory(tokencmd) 18 | add_subdirectory(winutils) 19 | add_subdirectory(win) 20 | -------------------------------------------------------------------------------- /vendor/bela/CMakeSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "configurations": [ 3 | { 4 | "name": "x64-Debug (默认值)", 5 | "generator": "Ninja", 6 | "configurationType": "Debug", 7 | "inheritEnvironments": [ "msvc_x64_x64" ], 8 | "buildRoot": "${projectDir}\\out\\build\\${name}", 9 | "installRoot": "${projectDir}\\out\\install\\${name}", 10 | "cmakeCommandArgs": "-DBUILD_BELA_TEST=ON", 11 | "buildCommandArgs": "", 12 | "ctestCommandArgs": "", 13 | "variables": [] 14 | } 15 | ] 16 | } -------------------------------------------------------------------------------- /vendor/bela/test/fmt/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | ## 2 | 3 | add_executable(fmt_test 4 | main.cc 5 | ) 6 | 7 | target_link_libraries(fmt_test 8 | bela 9 | ) 10 | 11 | 12 | add_executable(strjoin_test 13 | strjoin.cc 14 | ) 15 | 16 | target_link_libraries(strjoin_test 17 | bela 18 | ) 19 | 20 | add_executable(charconv_test 21 | charconv.cc 22 | ) 23 | 24 | target_link_libraries(charconv_test 25 | bela 26 | ) 27 | 28 | add_executable(unicode_width_test 29 | unicode-width.cc 30 | ) 31 | 32 | target_link_libraries(unicode_width_test 33 | bela 34 | ) -------------------------------------------------------------------------------- /vendor/bela/test/escapeargv/eva.cc: -------------------------------------------------------------------------------- 1 | #include 2 | #include "../../include/bela/escapeargv.hpp" 3 | using EscapeArgvA = bela::basic_escape_argv; 4 | 5 | int main(int argc, char const *argv[]) { 6 | /* code */ 7 | EscapeArgvA ea; 8 | ea.Assign(argv[0]); 9 | for (int i = 1; i < argc; i++) { 10 | ea.Append(argv[i]); 11 | } 12 | fprintf(stderr, "%s\n", ea.data()); 13 | 14 | EscapeArgvA ea2("zzzz", "", "vvv ssdss", "-D=\"JJJJJ sb\""); 15 | ea2.AppendNoEscape("jacks ome"); 16 | fprintf(stderr, "%s\n", ea2.data()); 17 | return 0; 18 | } 19 | -------------------------------------------------------------------------------- /vendor/bela/test/winutils/dirname.cc: -------------------------------------------------------------------------------- 1 | /// 2 | #include 3 | #include 4 | 5 | int wmain() { 6 | constexpr std::wstring_view dirs[] = {L"C:\\User\\Jack\\helloworld.txt", L"C:\\User\\Jack\\helloworld.txt\\\\\\", 7 | L"C:\\User\\Jack\\\\helloworld.txt\\\\\\", 8 | L"C:\\User\\Jack\\helloworld.txt\\\\\\.\\\\", L"C:\\User\\Jack\\"}; 9 | for (const auto d : dirs) { 10 | bela::FPrintF(stderr, L"%s--%s\n", d, bela::DirName(d)); 11 | } 12 | return 0; 13 | } -------------------------------------------------------------------------------- /vendor/bela/src/belawin/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # bela win libaray 2 | 3 | set(PE_FILES 4 | pe/delayimports.cc 5 | pe/dotnet.cc 6 | pe/exports.cc 7 | pe/file.cc 8 | pe/imports.cc 9 | pe/overlay.cc 10 | pe/resource.cc 11 | pe/rva.cc 12 | pe/searcher.cc 13 | pe/section.cc 14 | pe/string.cc 15 | pe/symbol.cc 16 | pe/version.cc 17 | ) 18 | 19 | add_library( 20 | belawin STATIC 21 | env.cc 22 | io.cc 23 | fs.cc 24 | path.cc 25 | process.cc 26 | realpath.cc 27 | simulator.cc 28 | ${PE_FILES}) 29 | 30 | target_link_libraries(belawin bela version) 31 | 32 | -------------------------------------------------------------------------------- /vendor/bela/src/hazel/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # bela hazel library 2 | 3 | add_library( 4 | hazel STATIC 5 | ina/archive.cc 6 | ina/binexeobj.cc 7 | ina/docs.cc 8 | ina/font.cc 9 | ina/git.cc 10 | ina/image.cc 11 | ina/media.cc 12 | ina/shebang.cc 13 | ina/shl.cc 14 | ina/text.cc 15 | zip/decompress.cc 16 | zip/filemode.cc 17 | zip/zip.cc 18 | elf/dynamic.cc 19 | elf/elf.cc 20 | elf/gnu.cc 21 | elf/symbol.cc 22 | macho/macho.cc 23 | macho/fat.cc 24 | fs.cc 25 | hazel.cc 26 | mime.cc) 27 | 28 | target_link_libraries(hazel bela belawin) 29 | 30 | -------------------------------------------------------------------------------- /include/apphelp.hpp: -------------------------------------------------------------------------------- 1 | //////////// 2 | #ifndef PRIV_APPHELP_HPP 3 | #define PRIV_APPHELP_HPP 4 | #include 5 | #include 6 | #include 7 | 8 | namespace priv { 9 | class dotcom_global_initializer { 10 | public: 11 | dotcom_global_initializer() { 12 | auto hr = CoInitialize(NULL); 13 | if (FAILED(hr)) { 14 | bela::FPrintF(stderr, L"\x1b[31minitialize dotcom error: 0x%08x\x1b[0m\n", hr); 15 | exit(1); 16 | } 17 | } 18 | ~dotcom_global_initializer() { CoUninitialize(); } 19 | }; 20 | 21 | } // namespace priv 22 | 23 | #endif -------------------------------------------------------------------------------- /vendor/bela/utils/scanner/scanner.cc: -------------------------------------------------------------------------------- 1 | #include "scanner.hpp" 2 | #include 3 | 4 | namespace git { 5 | // 6 | // GIT_ALTERNATE_OBJECT_DIRECTORIES 7 | 8 | bool Scanner::Execute(const std::wstring_view gitdir, const Filter &filter, bela::error_code &ec) { 9 | if (!filter) { 10 | ec = bela::make_error_code(L"filter callback is nil"); 11 | return false; 12 | } 13 | // L0 14 | auto objdir = bela::StringCat(gitdir, L"/objects"); 15 | bela::fs::Finder finder; 16 | if (!finder.First(objdir, L"*", ec)) { 17 | return false; 18 | } 19 | return false; 20 | } 21 | 22 | } // namespace git -------------------------------------------------------------------------------- /vendor/bela/src/belawin/pe/overlay.cc: -------------------------------------------------------------------------------- 1 | // read pe overlay data 2 | #include "internal.hpp" 3 | 4 | namespace bela::pe { 5 | int64_t File::ReadOverlay(std::span overlayData, bela::error_code &ec) const { 6 | if (size <= overlayOffset) { 7 | ec = bela::make_error_code(ErrNoOverlay, L"no overlay data"); 8 | return -1; 9 | } 10 | auto readSize = (std::min)(static_cast(overlayData.size()), size - overlayOffset); 11 | if (!fd.ReadAt(overlayData.subspan(0, static_cast(readSize)), overlayOffset, ec)) { 12 | return -1; 13 | } 14 | return readSize; 15 | } 16 | 17 | } // namespace bela::pe -------------------------------------------------------------------------------- /vendor/bela/test/base/startswith.cc: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | struct kv { 5 | const wchar_t *a; 6 | const wchar_t *b; 7 | }; 8 | 9 | int wmain() { 10 | constexpr const kv kvv[] = { 11 | {L"jack", L"kj"}, {L"mmmvn", L"mv"}, {L"helloworld", L"he"}, 12 | {L"world", L""}, {L"xxxxwwe3we", L"x"}, {L"xxxmmmv", L"mv"}, 13 | }; 14 | 15 | for (const auto &k : kvv) { 16 | bela::FPrintF(stderr, L"%s startswith %s %v\n", k.a, k.b, bela::StartsWith(k.a, k.b)); 17 | bela::FPrintF(stderr, L"%s endswith %s %v\n", k.a, k.b, bela::EndsWith(k.a, k.b)); 18 | } 19 | return 0; 20 | } -------------------------------------------------------------------------------- /vendor/bela/include/hazel/details/ELFRelocs/MSP430.def: -------------------------------------------------------------------------------- 1 | 2 | #ifndef ELF_RELOC 3 | #error "ELF_RELOC must be defined" 4 | #endif 5 | 6 | ELF_RELOC(R_MSP430_NONE, 0) 7 | ELF_RELOC(R_MSP430_32, 1) 8 | ELF_RELOC(R_MSP430_10_PCREL, 2) 9 | ELF_RELOC(R_MSP430_16, 3) 10 | ELF_RELOC(R_MSP430_16_PCREL, 4) 11 | ELF_RELOC(R_MSP430_16_BYTE, 5) 12 | ELF_RELOC(R_MSP430_16_PCREL_BYTE, 6) 13 | ELF_RELOC(R_MSP430_2X_PCREL, 7) 14 | ELF_RELOC(R_MSP430_RL_PCREL, 8) 15 | ELF_RELOC(R_MSP430_8, 9) 16 | ELF_RELOC(R_MSP430_SYM_DIFF, 10) 17 | -------------------------------------------------------------------------------- /vendor/bela/test/appexeclink/rptest.cc: -------------------------------------------------------------------------------- 1 | // Test reparse pointer 2 | 3 | #include 4 | #include 5 | 6 | int wmain(int argc, wchar_t **argv) { 7 | if (argc < 2) { 8 | bela::FPrintF(stderr, L"usage: %s path\n", argv[0]); 9 | return 1; 10 | } 11 | hazel::fs::FileReparsePoint frp; 12 | bela::error_code ec; 13 | if (!hazel::fs::LookupReparsePoint(argv[1], frp, ec)) { 14 | bela::FPrintF(stderr, L"unable lookup reparse point %s\n", ec); 15 | return 1; 16 | } 17 | for (auto &kv : frp.attributes) { 18 | bela::FPrintF(stderr, L"%s: %s\n", kv.first, kv.second); 19 | } 20 | return 0; 21 | } -------------------------------------------------------------------------------- /vendor/bela/test/color/main.cc: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | int wmain() { 5 | // 6 | if (auto c1 = bela::color::decode(L"#88FFFF"); c1 == bela::color(0x88, 0xff, 0xff)) { 7 | bela::FPrintF(stderr, L"#88FFFF: r %d g %d b %d: %s\n", c1.r, c1.g, c1.b, c1.encode()); 8 | } 9 | if (auto c2 = bela::color::decode(L"#FFFF42FF"); c2 == bela::color(0xff, 0xff, 0x42, 0xff)) { 10 | bela::FPrintF(stderr, L"#FFFF42FF: r %d g %d b %d: %s\n", c2.r, c2.g, c2.b, c2.encode(true)); 11 | } 12 | bela::color c(132, 122, 64); 13 | bela::FPrintF(stderr, L"Encode -> %s\n", c.encode(true)); 14 | return 0; 15 | } -------------------------------------------------------------------------------- /vendor/bela/test/win/version.cc: -------------------------------------------------------------------------------- 1 | // 2 | /// 3 | #include 4 | #include 5 | 6 | int wmain(int argc, wchar_t **argv) { 7 | if (argc < 2) { 8 | bela::FPrintF(stderr, L"usage: %s pefile\n", argv[0]); 9 | return 1; 10 | } 11 | bela::error_code ec; 12 | auto version = bela::pe::Lookup(argv[1], ec); 13 | if (!version) { 14 | bela::FPrintF(stderr, L"unable lookup version: %v", ec); 15 | return 1; 16 | } 17 | bela::FPrintF(stderr, L"FileDescription: %s\nProductName: %s\nLegalCopyright: %s\n", version->FileDescription, 18 | version->ProductName, version->LegalCopyright); 19 | return 0; 20 | } -------------------------------------------------------------------------------- /vendor/bela/include/hazel/details/ELFRelocs/Lanai.def: -------------------------------------------------------------------------------- 1 | 2 | #ifndef ELF_RELOC 3 | #error "ELF_RELOC must be defined" 4 | #endif 5 | 6 | // No relocation 7 | ELF_RELOC(R_LANAI_NONE, 0) 8 | // 21-bit symbol relocation 9 | ELF_RELOC(R_LANAI_21, 1) 10 | // 21-bit symbol relocation with last two bits masked to 0 11 | ELF_RELOC(R_LANAI_21_F, 2) 12 | // 25-bit branch targets 13 | ELF_RELOC(R_LANAI_25, 3) 14 | // General 32-bit relocation 15 | ELF_RELOC(R_LANAI_32, 4) 16 | // Upper 16-bits of a symbolic relocation 17 | ELF_RELOC(R_LANAI_HI16, 5) 18 | // Lower 16-bits of a symbolic relocation 19 | ELF_RELOC(R_LANAI_LO16, 6) 20 | -------------------------------------------------------------------------------- /vendor/bela/include/hazel/details/ELFRelocs/AMDGPU.def: -------------------------------------------------------------------------------- 1 | #ifndef ELF_RELOC 2 | #error "ELF_RELOC must be defined" 3 | #endif 4 | 5 | ELF_RELOC(R_AMDGPU_NONE, 0) 6 | ELF_RELOC(R_AMDGPU_ABS32_LO, 1) 7 | ELF_RELOC(R_AMDGPU_ABS32_HI, 2) 8 | ELF_RELOC(R_AMDGPU_ABS64, 3) 9 | ELF_RELOC(R_AMDGPU_REL32, 4) 10 | ELF_RELOC(R_AMDGPU_REL64, 5) 11 | ELF_RELOC(R_AMDGPU_ABS32, 6) 12 | ELF_RELOC(R_AMDGPU_GOTPCREL, 7) 13 | ELF_RELOC(R_AMDGPU_GOTPCREL32_LO, 8) 14 | ELF_RELOC(R_AMDGPU_GOTPCREL32_HI, 9) 15 | ELF_RELOC(R_AMDGPU_REL32_LO, 10) 16 | ELF_RELOC(R_AMDGPU_REL32_HI, 11) 17 | ELF_RELOC(R_AMDGPU_RELATIVE64, 13) 18 | ELF_RELOC(R_AMDGPU_REL16, 14) 19 | -------------------------------------------------------------------------------- /vendor/bela/src/belawin/pe/internal.hpp: -------------------------------------------------------------------------------- 1 | /// 2 | #ifndef BELA_PE_INTERNAL_HPP 3 | #define BELA_PE_INTERNAL_HPP 4 | #include 5 | 6 | namespace bela::pe { 7 | 8 | struct image_import_descriptor { 9 | uint32_t OriginalFirstThunk; 10 | uint32_t TimeDateStamp; 11 | uint32_t ForwarderChain; 12 | uint32_t Name; 13 | uint32_t FirstThunk; 14 | }; 15 | 16 | struct image_delayload_descriptor { 17 | uint32_t Attributes; 18 | uint32_t DllNameRVA; 19 | uint32_t ModuleHandleRVA; 20 | uint32_t ImportAddressTableRVA; 21 | uint32_t ImportNameTableRVA; 22 | uint32_t BoundImportAddressTableRVA; 23 | uint32_t UnloadInformationTableRVA; 24 | uint32_t TimeDateStamp; 25 | }; 26 | } // namespace bela::pe 27 | 28 | #endif -------------------------------------------------------------------------------- /test/pugixml/main.cc: -------------------------------------------------------------------------------- 1 | /// 2 | #include 3 | #include 4 | #define PUGIXML_HEADER_ONLY 1 5 | #include "../../vendor/pugixml/pugixml.hpp" 6 | 7 | int main(int argc, char const *argv[]) { 8 | if (argc < 2) { 9 | fprintf(stderr, "usage: %s appmanifest\n", argv[0]); 10 | return 1; 11 | } 12 | pugi::xml_document doc; 13 | if (!doc.load_file(argv[1])) { 14 | fprintf(stderr, "unable load %s %s\n", argv[1], strerror(errno)); 15 | return 1; 16 | } 17 | // constexpr std::string_view caps = "Capability"; 18 | for (auto it : doc.child("Package").child("Capabilities")) { 19 | /* code */ 20 | fprintf(stderr, "%s %s\n", it.name(), it.attribute("Name").as_string()); 21 | } 22 | return 0; 23 | } 24 | -------------------------------------------------------------------------------- /wsudo/verify.md: -------------------------------------------------------------------------------- 1 | # Verify 2 | 3 | API: 4 | 5 | 1. CreateFileW 6 | 2. [CryptCATAdminAcquireContext2](https://docs.microsoft.com/en-us/windows/win32/api/mscat/nf-mscat-cryptcatadminacquirecontext2) 7 | 3. [CryptCATAdminCalcHashFromFileHandle2](https://docs.microsoft.com/en-us/windows/win32/api/mscat/nf-mscat-cryptcatadmincalchashfromfilehandle2) 8 | 4. [CryptCATAdminEnumCatalogFromHash](https://docs.microsoft.com/en-us/windows/win32/api/mscat/nf-mscat-cryptcatadminenumcatalogfromhash) 9 | 5. [CryptCATCatalogInfoFromContext](https://docs.microsoft.com/en-us/windows/win32/api/mscat/nf-mscat-cryptcatcataloginfofromcontext) 10 | 6. [WinVerifyTrustEx](https://docs.microsoft.com/en-us/windows/win32/api/wintrust/nf-wintrust-winverifytrustex) 11 | -------------------------------------------------------------------------------- /vendor/bela/src/belatime/timezone.cc: -------------------------------------------------------------------------------- 1 | /// 2 | #include 3 | #include 4 | #include 5 | 6 | namespace bela { 7 | // SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones 8 | // https://docs.microsoft.com/en-us/windows/win32/api/timezoneapi/nf-timezoneapi-gettimezoneinformation 9 | 10 | static TIME_ZONE_INFORMATION tz_info; 11 | static std::once_flag tz_flag; 12 | 13 | std::int_least32_t TimeZoneOffset() { 14 | std::call_once(tz_flag, [] { GetTimeZoneInformation(&tz_info); }); 15 | return tz_info.Bias * 60; 16 | } 17 | 18 | const wchar_t *TimeZoneStandardName() { 19 | std::call_once(tz_flag, [] { GetTimeZoneInformation(&tz_info); }); 20 | return tz_info.StandardName; 21 | } 22 | 23 | } // namespace bela -------------------------------------------------------------------------------- /vendor/bela/test/io/readall.cc: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | int wmain(int argc, wchar_t **argv) { 5 | if (argc < 2) { 6 | bela::FPrintF(stderr, L"usage: %s file\n", argv[0]); 7 | return 1; 8 | } 9 | std::wstring buf; 10 | bela::error_code ec; 11 | if (!bela::io::ReadFile(argv[1], buf, ec)) { 12 | bela::FPrintF(stderr, L"open file %s\n", ec); 13 | return 1; 14 | } 15 | bela::FPrintF(stderr, L"File read utf16 chars %d\n", buf.size()); 16 | std::string u8buf; 17 | if (!bela::io::ReadFile(argv[1], u8buf, ec)) { 18 | bela::FPrintF(stderr, L"u8 open file %s\n", ec); 19 | return 1; 20 | } 21 | bela::FPrintF(stderr, L"U8 File read utf8 chars %d\n%s\n", u8buf.size(), u8buf); 22 | return 0; 23 | } -------------------------------------------------------------------------------- /wsudo/server.hpp: -------------------------------------------------------------------------------- 1 | /// 2 | #ifndef WSUDO_SERVER_HPP 3 | #define WSUDO_SERVER_HPP 4 | #include 5 | #include 6 | 7 | namespace wsudo { 8 | class Server { 9 | public: 10 | Server() = default; 11 | Server(const Server &) = delete; 12 | Server &operator=(const Server &) = delete; 13 | ~Server() { 14 | if (hPipe != INVALID_HANDLE_VALUE) { 15 | CloseHandle(hPipe); 16 | } 17 | } 18 | bool Initialize(bela::error_code &ec); 19 | bool Waiting(std::wstring_view path, const std::vector &argv, int timeout, bela::error_code &ec); 20 | std::wstring_view Name() const { return name; } 21 | 22 | private: 23 | HANDLE hPipe{INVALID_HANDLE_VALUE}; 24 | std::wstring name; 25 | }; 26 | } // namespace wsudo 27 | 28 | #endif -------------------------------------------------------------------------------- /wsudo/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # privexec 2 | 3 | add_executable( 4 | wsudo 5 | delegate.cc 6 | wsudo.cc 7 | alias.cc 8 | wsudo.rc 9 | wsudo.manifest) 10 | 11 | target_link_libraries( 12 | wsudo 13 | Exec 14 | Exec 15 | Comctl32 16 | Shlwapi 17 | Pathcch 18 | wtsapi32 19 | Userenv 20 | Taskschd 21 | Kernel32 22 | Gdi32 23 | Advapi32) 24 | 25 | install(TARGETS wsudo DESTINATION .) 26 | 27 | add_executable(wsudo-bridge wsudo-bridge.cc wsudo-bridge.trace.cc wsudo-bridge.rc wsudo.manifest) 28 | 29 | target_link_libraries( 30 | wsudo-bridge 31 | Exec 32 | belashl 33 | Comctl32 34 | Shlwapi 35 | Pathcch 36 | wtsapi32 37 | Userenv 38 | Taskschd 39 | Kernel32 40 | Gdi32 41 | Advapi32) 42 | 43 | install(TARGETS wsudo-bridge DESTINATION .) 44 | -------------------------------------------------------------------------------- /vendor/bela/test/winutils/exepath.cc: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | int wmain() { 5 | bela::error_code ec; 6 | auto e = bela::Executable(ec); 7 | if (!e) { 8 | bela::FPrintF(stderr, L"FAILED: Executable: %s\n", ec); 9 | return 1; 10 | } 11 | bela::FPrintF(stderr, L"Executable: '%s'\n", *e); 12 | auto p = bela::ExecutableParent(ec); 13 | if (!p) { 14 | bela::FPrintF(stderr, L"FAILED: ExecutablePath: %s\n", ec); 15 | return 1; 16 | } 17 | bela::FPrintF(stderr, L"ExecutableParent: '%s'\n", *p); 18 | auto fp = bela::ExecutableFinalPath(ec); 19 | if (!fp) { 20 | bela::FPrintF(stderr, L"FAILED: ExecutableFinalPath: %s\n", ec); 21 | return 1; 22 | } 23 | bela::FPrintF(stderr, L"ExecutableFinalPath: '%s'\n", *fp); 24 | return 0; 25 | } -------------------------------------------------------------------------------- /vendor/bela/utils/scanner/scanner.hpp: -------------------------------------------------------------------------------- 1 | #ifndef GIT_SCANNER_HPP 2 | #define GIT_SCANNER_HPP 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | namespace git { 9 | using Filter = std::function; 10 | 11 | template 12 | requires std::integral 13 | struct Snapshot { 14 | T offset{0}; 15 | uint32_t index{0}; 16 | }; 17 | 18 | class Scanner { 19 | public: 20 | Scanner(std::int64_t ls) : limitSize(ls) {} 21 | bool Execute(const std::wstring_view gitdir, const Filter &filter, bela::error_code &ec); 22 | auto DiskSize() const { return diskSize; } 23 | 24 | private: 25 | const std::int64_t limitSize; 26 | std::int64_t diskSize{0}; 27 | }; 28 | 29 | } // namespace git 30 | 31 | #endif -------------------------------------------------------------------------------- /vendor/bela/test/escape/settitle.cc: -------------------------------------------------------------------------------- 1 | //// 2 | #include 3 | #include 4 | #include 5 | // .\test\escape\title_test.exe "vcpkg \U0001F496 Environment" 6 | int wmain(int argc, wchar_t **argv) { 7 | if (argc < 2) { 8 | bela::FPrintF(stderr, L"usage: %s escaped-title\n", argv[0]); 9 | return 1; 10 | } 11 | std::wstring title; 12 | if (!bela::CUnescape(argv[1], &title)) { 13 | bela::FPrintF(stderr, L"Unable unescape title: %s\n", argv[1]); 14 | } 15 | if (SetConsoleTitleW(title.data()) != TRUE) { 16 | auto ec = bela::make_system_error_code(); 17 | bela::FPrintF(stderr, L"SetConsoleTitleW [%s] %s\n", title, ec); 18 | return 1; 19 | } 20 | bela::FPrintF(stderr, L"New console title is [%s]\n", title); 21 | (void)getc(stdin); // wait 22 | return 0; 23 | } -------------------------------------------------------------------------------- /vendor/bela/test/escape/escape.cc: -------------------------------------------------------------------------------- 1 | /// 2 | /// unicode escape L"CH\u2082O\u2083" => L"CH₂O" 3 | #include 4 | #include 5 | 6 | int wmain() { 7 | bela::FPrintF(stderr, L"Humans cannot do without O\u2082\n"); 8 | const wchar_t *msg = L"H\\u2082O \\U0001F496 \\xA9 \\x1b[32mcolour " 9 | L"escape\\x1b[0m \\u2080\\u2081\\u2082 (2-9)"; 10 | const auto ws = 11 | LR"("C:\Program Files\PowerShell\7-preview\pwsh.exe" -NoExit -Command "$Host.UI.RawUI.WindowTitle=\"Windows Pwsh 💙 (7 Preview)\"")"; 12 | 13 | // H₂O 💖 © colour escape 14 | std::wstring dest; 15 | if (bela::CUnescape(msg, &dest)) { 16 | bela::FPrintF(stderr, L"\U0001F496: %s\n%s\n", msg, dest); 17 | } 18 | auto result = bela::CEscape(ws); 19 | bela::FPrintF(stderr, L"Escape:\n%s\n", result); 20 | return 0; 21 | } 22 | -------------------------------------------------------------------------------- /vendor/bela/test/win/pick.cc: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | class dotcom_global_initializer { 6 | public: 7 | dotcom_global_initializer() { 8 | auto hr = CoInitialize(NULL); 9 | if (FAILED(hr)) { 10 | bela::FPrintF(stderr, L"initialize dotcom error: 0x%08x\n", hr); 11 | exit(1); 12 | } 13 | } 14 | ~dotcom_global_initializer() { CoUninitialize(); } 15 | }; 16 | 17 | int wmain() { 18 | dotcom_global_initializer dot; 19 | bela::FPrintF(stderr, L"dotcom initialized.\n"); 20 | bela::unique_variant v1; 21 | auto f = bela::FolderPicker(nullptr, nullptr); 22 | if (!f) { 23 | auto ec = bela::make_system_error_code(); 24 | bela::FPrintF(stderr, L"Picker Folder error: %s\n", ec); 25 | return 1; 26 | } 27 | bela::FPrintF(stderr, L"Folder is: %s\n", *f); 28 | 29 | return 0; 30 | } -------------------------------------------------------------------------------- /vendor/bela/include/bela/picker.hpp: -------------------------------------------------------------------------------- 1 | #ifndef BELA_PICKER_HPP 2 | #define BELA_PICKER_HPP 3 | #include "base.hpp" 4 | #include 5 | #include 6 | 7 | namespace bela { 8 | // Messagebox type 9 | enum class mbs_t { 10 | INFO, // 11 | WARN, 12 | FATAL, 13 | ABOUT 14 | }; 15 | 16 | bool BelaMessageBox(HWND hWnd, LPCWSTR pszWindowTitle, LPCWSTR pszContent, LPCWSTR pszExpandedInfo, 17 | mbs_t mt = mbs_t::ABOUT); 18 | using filter_t = COMDLG_FILTERSPEC; 19 | std::optional FilePicker(HWND hWnd, const wchar_t *title, const filter_t *fts, size_t flen); 20 | template 21 | inline std::optional FilePicker(HWND hWnd, const wchar_t *title, const filter_t (&fts)[N]) { 22 | return FilePicker(hWnd, title, fts, N); 23 | } 24 | std::optional FolderPicker(HWND hWnd, const wchar_t *title); 25 | } // namespace bela 26 | 27 | #endif -------------------------------------------------------------------------------- /vendor/bela/res/utf8activeCodePage.manifest: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | UTF-8 7 | 8 | 9 | 10 | 11 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /vendor/bela/res/1903.manifest: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | PerMonitorV2 15 | true 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /vendor/bela/src/belawin/pe/string.cc: -------------------------------------------------------------------------------- 1 | /// 2 | #include 3 | 4 | #include "internal.hpp" 5 | 6 | namespace bela::pe { 7 | 8 | bool File::readStringTable(bela::error_code &ec) { 9 | if (fh.PointerToSymbolTable == 0) { 10 | // table nullptr 11 | return true; 12 | } 13 | auto offset = fh.PointerToSymbolTable + (COFFSymbolSize * fh.NumberOfSymbols); 14 | if (std::cmp_greater_equal(offset + 4, size)) { 15 | return true; 16 | } 17 | uint32_t l = 0; 18 | if (!fd.ReadAt(l, offset, ec)) { 19 | return false; 20 | } 21 | l = bela::fromle(l); 22 | if (l <= 4 || std::cmp_greater(l + offset, size)) { 23 | return true; 24 | } 25 | l -= 4; 26 | bela::Buffer b(l); 27 | if (!fd.ReadFull(b, l, ec)) { 28 | ec = bela::make_error_code(ErrGeneral, L"fail to read string table: ", ec.message); 29 | return false; 30 | } 31 | stringTable.buffer = std::move(b); 32 | return true; 33 | } 34 | } // namespace bela::pe -------------------------------------------------------------------------------- /AppExec/appx.cc: -------------------------------------------------------------------------------- 1 | //////// Appmanifest import 2 | // working in progress 3 | #include "app.hpp" 4 | // https://www.appveyor.com/docs/windows-images-software/#visual-studio-2017 5 | // Appveyor Visual Studio Community 2017 version 15.9.4 6 | #include 7 | #include 8 | 9 | namespace priv { 10 | bool App::ParseAppx(std::wstring_view file) { 11 | auto basename = bela::BaseName(file); 12 | title.Update(basename); 13 | std::vector caps; 14 | bela::error_code ec; 15 | if (!wsudo::exec::LoadAppx(file, caps, ec)) { 16 | return false; 17 | } 18 | auto N = ListView_GetItemCount(appx.hlview); 19 | for (int i = 0; i < N; i++) { 20 | auto p = appx.CheckedValue(i); 21 | if (std::find(caps.begin(), caps.end(), p) != caps.end()) { 22 | ListView_SetCheckState(appx.hlview, i, TRUE); 23 | } else { 24 | ListView_SetCheckState(appx.hlview, i, FALSE); 25 | } 26 | } 27 | return true; 28 | } 29 | } // namespace priv -------------------------------------------------------------------------------- /vendor/bela/test/binview/machoview.cc: -------------------------------------------------------------------------------- 1 | /// 2 | #include 3 | #include 4 | #include 5 | 6 | int wmain(int argc, wchar_t **argv) { 7 | if (argc < 2) { 8 | bela::FPrintF(stderr, L"usage: %s macho-o-file\n", argv[0]); 9 | return 1; 10 | } 11 | hazel::macho::File file; 12 | bela::error_code ec; 13 | if (!file.NewFile(argv[1], ec)) { 14 | bela::FPrintF(stderr, L"parse macho file %s error: %s\n", argv[1], ec); 15 | return 1; 16 | } 17 | std::vector libs; 18 | file.Depends(libs, ec); 19 | for (const auto &d : libs) { 20 | bela::FPrintF(stdout, L"need: %s\n", d); 21 | } 22 | std::vector symbols; 23 | if (!file.ImportedSymbols(symbols, ec)) { 24 | bela::FPrintF(stderr, L"parse macho file %s error: %s\n", argv[1], ec); 25 | return 1; 26 | } 27 | for (const auto &s : symbols) { 28 | bela::FPrintF(stdout, L"S: %s\n", bela::demangle(s)); 29 | } 30 | return 0; 31 | } -------------------------------------------------------------------------------- /docs/changelog.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | ## 2018-12-28 4 | 5 | 1. Privexec/WSUDO support `Less Privileged AppContainer` 6 | 2. Privexec AppContainer supports more capabilities to choose from 7 | 8 | ## 2018-12-22 9 | 10 | 1. Privexec (GUI) AppContainer support Restricted Capabilities. 11 | `Recommended Capabilities` can be selected at the same time as `Appmanifest`, the `Capabilities `will be merged 12 | 2. Privexec (GUI) Support Dropfiles. Appx edit box accept `*.xml;*.appmanifest` if it is activated. Command edit box accept other files. 13 | 14 | ## 2022-07-22 15 | 16 | 1. wsudo -U will create a process without privilege escalation. If it is currently running under the System account, wsudo -U cannot start the Store App directly, but it can start the Store App in the launched shell.(在系统权限下,wsudo -U 无法直接启动 Store App,但是可以在启动的 shell 中启动 Store App。) 17 | 2. wsudo add -B --basic as default (permission inheritance mode)(wsudo 添加 `-B` `--basic` 作为默认执行模式,即继承父进程权限,而 -U 则总是启动未提权的进程。) -------------------------------------------------------------------------------- /wsudo/server.cc: -------------------------------------------------------------------------------- 1 | // 2 | #include 3 | #include "server.hpp" 4 | 5 | namespace wsudo { 6 | 7 | std::atomic_uint32_t ProcessPipeId{0}; 8 | bool Server::Initialize(bela::error_code &ec) { 9 | auto PipeId = static_cast(ProcessPipeId++); 10 | name = bela::StringCat(LR"(\.\pipe\wsudo-delegation-)", GetCurrentProcessId(), L"-", PipeId); 11 | 12 | if (hPipe = CreateNamedPipeW(name.data(), PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED | FILE_FLAG_FIRST_PIPE_INSTANCE, 13 | PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_REJECT_REMOTE_CLIENTS, 1, 65536, 65536, 14 | 0, nullptr); 15 | hPipe == INVALID_HANDLE_VALUE) { 16 | ec = bela::make_system_error_code(L"Server::Initialize "); 17 | return false; 18 | } 19 | return true; 20 | } 21 | 22 | bool Server::Waiting(std::wstring_view path, const std::vector &argv, int timeout, bela::error_code &ec) { 23 | 24 | } 25 | 26 | } // namespace wsudo -------------------------------------------------------------------------------- /vendor/bela/src/hazel/ina/hazelinc.hpp: -------------------------------------------------------------------------------- 1 | // 2 | #ifndef HAZEL_INTERNAL_INC_HPP 3 | #define HAZEL_INTERNAL_INC_HPP 4 | #include 5 | #include 6 | 7 | namespace hazel::internal { 8 | typedef enum hazel_status_e : int { 9 | None = 0, 10 | Found, /// 11 | Break 12 | } status_t; 13 | status_t LookupExecutableFile(const bela::bytes_view &bv, hazel::hazel_result &hr); 14 | status_t LookupArchives(const bela::bytes_view &bv, hazel::hazel_result &hr); 15 | status_t LookupDocs(const bela::bytes_view &bv, hazel_result &hr); 16 | status_t LookupFonts(const bela::bytes_view &bv, hazel_result &hr); 17 | status_t LookupShellLink(const bela::bytes_view &bv, hazel_result &hr); 18 | status_t LookupMedia(const bela::bytes_view &bv, hazel_result &hr); 19 | status_t LookupImages(const bela::bytes_view &bv, hazel_result &hr); 20 | status_t LookupText(const bela::bytes_view &bv, hazel_result &hr); 21 | bool LookupShebang(const std::wstring_view line, hazel_result &hr); 22 | } // namespace hazel::internal 23 | 24 | #endif -------------------------------------------------------------------------------- /vendor/bela/test/ls/main.cc: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | int wmain(int argc, wchar_t **argv) { 6 | std::wstring dir = L"."; 7 | std::wstring baseName = L"*"; 8 | if (argc >= 2) { 9 | dir = argv[1]; 10 | } 11 | bela::error_code ec; 12 | bela::fs::Finder finder; 13 | if ((GetFileAttributesW(dir.data()) & FILE_ATTRIBUTE_DIRECTORY) == 0) { 14 | if (!finder.First(dir, ec)) { 15 | bela::FPrintF(stderr, L"List error %v\n", ec); 16 | return 1; 17 | } 18 | } else { 19 | if (!finder.First(dir, L"*", ec)) { 20 | bela::FPrintF(stderr, L"List error %v\n", ec); 21 | return 1; 22 | } 23 | } 24 | do { 25 | if (finder.Ignore()) { 26 | continue; 27 | } 28 | if (finder.IsDir()) { 29 | bela::FPrintF(stderr, L"D 0 %s\n", finder.Name()); 30 | continue; 31 | } 32 | bela::FPrintF(stderr, L"F %10d %s\n", finder.Size(), finder.Name()); 33 | } while (finder.Next()); 34 | return 0; 35 | } -------------------------------------------------------------------------------- /vendor/bela/src/belahash/blake3/example.c: -------------------------------------------------------------------------------- 1 | #include "blake3.h" 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | int main(void) { 8 | // Initialize the hasher. 9 | blake3_hasher hasher; 10 | blake3_hasher_init(&hasher); 11 | 12 | // Read input bytes from stdin. 13 | unsigned char buf[65536]; 14 | while (1) { 15 | ssize_t n = read(STDIN_FILENO, buf, sizeof(buf)); 16 | if (n > 0) { 17 | blake3_hasher_update(&hasher, buf, n); 18 | } else if (n == 0) { 19 | break; // end of file 20 | } else { 21 | fprintf(stderr, "read failed: %s\n", strerror(errno)); 22 | return 1; 23 | } 24 | } 25 | 26 | // Finalize the hash. BLAKE3_OUT_LEN is the default output length, 32 bytes. 27 | uint8_t output[BLAKE3_OUT_LEN]; 28 | blake3_hasher_finalize(&hasher, output, BLAKE3_OUT_LEN); 29 | 30 | // Print the hash as hexadecimal. 31 | for (size_t i = 0; i < BLAKE3_OUT_LEN; i++) { 32 | printf("%02x", output[i]); 33 | } 34 | printf("\n"); 35 | return 0; 36 | } 37 | -------------------------------------------------------------------------------- /include/file.hpp: -------------------------------------------------------------------------------- 1 | //////////// 2 | #ifndef PRIVEXEC_FILE_HPP 3 | #define PRIVEXEC_FILE_HPP 4 | #include 5 | #include 6 | #include 7 | 8 | namespace priv { 9 | struct FD { 10 | FD() = default; 11 | FD(FILE *fd_) : fd(fd_) {} 12 | FD(FD &&other) { 13 | if (fd != nullptr) { 14 | fclose(fd); 15 | } 16 | fd = other.fd; 17 | other.fd = nullptr; 18 | } 19 | FD &operator=(FD &&other) { 20 | if (fd != nullptr) { 21 | fclose(fd); 22 | } 23 | fd = other.fd; 24 | other.fd = nullptr; 25 | return *this; 26 | } 27 | FD &operator=(FILE *f) { 28 | if (fd != nullptr) { 29 | fclose(fd); 30 | } 31 | fd = f; 32 | return *this; 33 | } 34 | FD(const FD &) = delete; 35 | FD &operator=(const FD &) = delete; 36 | ~FD() { 37 | if (fd != nullptr) { 38 | fclose(fd); 39 | } 40 | } 41 | 42 | explicit operator bool() const noexcept { return fd != nullptr; } 43 | operator FILE *() const { return fd; } 44 | FILE *fd{nullptr}; 45 | }; 46 | } // namespace priv 47 | 48 | #endif -------------------------------------------------------------------------------- /lib/exec/argv.cc: -------------------------------------------------------------------------------- 1 | // argv feature 2 | #include "exec.hpp" 3 | #include 4 | #include 5 | 6 | namespace wsudo::exec { 7 | // 8 | bool SplitArgv(std::wstring_view cmd, std::wstring &path, std::vector &argv, bela::error_code &ec) { 9 | bela::Tokenizer tokenizer; 10 | if (!tokenizer.Tokenize(cmd)) { 11 | ec = bela::make_error_code(1, L"bad command '", cmd, L"'"); 12 | return false; 13 | } 14 | const auto Argv = tokenizer.Argv(); 15 | const auto Argc = tokenizer.Argc(); 16 | for (size_t i = 0; i < Argc; i++) { 17 | argv.emplace_back(Argv[i]); 18 | } 19 | if (argv.empty()) { 20 | ec = bela::make_error_code(1, L"bad command '", cmd, L"'"); 21 | return false; 22 | } 23 | std::wstring_view arg0 = path.empty() ? argv[0] : path; 24 | std::wstring p; 25 | if (!bela::env::LookPath(arg0, p, true)) { 26 | ec = bela::make_error_code(1, L"command not found '", arg0, L"'"); 27 | return false; 28 | } 29 | path.assign(std::move(p)); 30 | return true; 31 | } 32 | 33 | } // namespace wsudo::exec 34 | -------------------------------------------------------------------------------- /vendor/bela/test/winutils/which.cc: -------------------------------------------------------------------------------- 1 | //// 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | bool onlyAbsPath() { 8 | auto v = bela::AsciiStrToLower(bela::GetEnv(L"ENABLE_ABS_PATH")); 9 | return v == L"true" || v == L"1" || v == L"on" || v == L"yes"; 10 | } 11 | 12 | int wmain(int argc, wchar_t **argv) { 13 | if (argc < 2) { 14 | bela::FPrintF(stderr, L"usage: %s command\n", argv[0]); 15 | return 1; 16 | } 17 | auto oa = onlyAbsPath(); 18 | bela::FPrintF(stderr, L"ENABLE_ABS_PATH %v\n", oa); 19 | std::wstring exe; 20 | if (!bela::env::LookPath(argv[1], exe, oa)) { 21 | bela::FPrintF(stderr, L"command not found: %s\n", argv[1]); 22 | return 1; 23 | } 24 | bela::FPrintF(stdout, L"%s\n", exe); 25 | 26 | std::vector paths; 27 | bela::MakePathEnv(paths); 28 | std::wstring exe2; 29 | if (!bela::env::LookPath(argv[1], exe2, paths, oa)) { 30 | bela::FPrintF(stderr, L"command not found: %s\n", argv[1]); 31 | return 1; 32 | } 33 | bela::FPrintF(stdout, L"%s\n", exe2); 34 | return 0; 35 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright © 2022 Force Charlie 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /script/runassys.ps1: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env pwsh 2 | $PrivexeRoot = Split-Path -Parent $PSScriptRoot 3 | 4 | $WSudoExe = Join-Path -Path $PrivexeRoot -ChildPath "wsudo.exe" 5 | $WSudoBridge = Join-Path -Path $PrivexeRoot -ChildPath "wsudo-bridge.exe" 6 | 7 | if (!(Test-Path $WSudoExe)) { 8 | Write-Host -ForegroundColor Red "$WSudoExe not exists" 9 | Exit 1 10 | } 11 | 12 | if (!(Test-Path $WSudoBridge)) { 13 | Write-Host -ForegroundColor Red "$WSudoBridge not exists" 14 | Exit 1 15 | } 16 | 17 | $subKeys = @( 'exefile\shell\runassystem', 'batfile\shell\runassystem', 'cmdfile\shell\runassystem' ) 18 | 19 | 20 | # https://powershell.org/forums/topic/cant-set-new-itemproperty-to-registry-path-containing-astrix/ 21 | 22 | $hive = [Microsoft.Win32.RegistryKey]::OpenBaseKey('ClassesRoot', 'Default') 23 | foreach ($sk in $subKeys) { 24 | $subKey = $hive.CreateSubKey($sk, $true) 25 | $subkey.SetValue($null, 'Run as System', 'String') 26 | $subkey.SetValue('Icon', $WSudoBridge, 'String') 27 | $subKey = $subKey.CreateSubKey('command', $true) 28 | $subkey.SetValue($null, "`"$WSudoExe`" -S `"%1`"", 'String') 29 | } 30 | 31 | 32 | -------------------------------------------------------------------------------- /vendor/bela/.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | 4 | # User-specific files 5 | *.suo 6 | *.user 7 | *.userosscache 8 | *.sln.docstates 9 | 10 | # User-specific files (MonoDevelop/Xamarin Studio) 11 | *.userprefs 12 | 13 | # Build results 14 | [Dd]ebug/ 15 | [Dd]ebugPublic/ 16 | [Rr]elease/ 17 | [Rr]eleases/ 18 | x64/ 19 | x86/ 20 | bld/ 21 | [Bb]in/ 22 | [Oo]bj/ 23 | [Ll]og/ 24 | 25 | # Visual Studio 2015 cache/options directory 26 | .vs/ 27 | # Uncomment if you have tasks that create the project's static files in wwwroot 28 | #wwwroot/ 29 | 30 | 31 | *_i.c 32 | *_p.c 33 | *_i.h 34 | *.ilk 35 | *.meta 36 | *.obj 37 | *.exe 38 | *.pch 39 | *.pdb 40 | *.pgc 41 | *.pgd 42 | *.rsp 43 | *.sbr 44 | *.tlb 45 | *.tli 46 | *.tlh 47 | *.tmp 48 | *.tmp_proj 49 | *.log 50 | *.vspscc 51 | *.vssscc 52 | .builds 53 | *.pidb 54 | *.svclog 55 | *.scc 56 | *.out 57 | 58 | 59 | # Visual C++ cache files 60 | ipch/ 61 | *.aps 62 | *.ncb 63 | *.opendb 64 | *.opensdf 65 | *.sdf 66 | *.cachefile 67 | *.VC.db 68 | *.VC.VC.opendb 69 | 70 | 71 | build/ 72 | dist/ 73 | /.vscode/ -------------------------------------------------------------------------------- /vendor/bela/test/winutils/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | ## 2 | 3 | add_executable(dirname_test 4 | dirname.cc 5 | ) 6 | 7 | target_link_libraries(dirname_test 8 | belawin 9 | ) 10 | 11 | add_executable(exepath_test 12 | exepath.cc 13 | ) 14 | 15 | target_link_libraries(exepath_test 16 | belawin 17 | ) 18 | 19 | add_executable(pathcat_test 20 | pathcat.cc 21 | ) 22 | 23 | target_link_libraries(pathcat_test 24 | belawin 25 | ) 26 | 27 | add_executable(which 28 | which.cc 29 | ) 30 | 31 | add_executable(env2 32 | env2.cc 33 | ) 34 | 35 | add_executable(envps 36 | envps.cc 37 | ) 38 | 39 | 40 | target_link_libraries(which 41 | belawin 42 | ) 43 | 44 | add_executable(expandenv 45 | expandenv.cc 46 | ) 47 | 48 | target_link_libraries(expandenv 49 | belawin 50 | ) 51 | 52 | target_link_libraries(env2 53 | belawin 54 | ) 55 | 56 | target_link_libraries(envps 57 | belawin 58 | ) 59 | 60 | 61 | add_executable(writefile_test 62 | writefile.cc 63 | ) 64 | 65 | target_link_libraries(writefile_test 66 | belawin 67 | ) 68 | 69 | add_executable(process_test 70 | process.cc 71 | ) 72 | 73 | target_link_libraries(process_test 74 | belawin 75 | ) 76 | -------------------------------------------------------------------------------- /script/runasti.ps1: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env pwsh 2 | $PrivexeRoot = Split-Path -Parent $PSScriptRoot 3 | $WSudoExe = Join-Path -Path $PrivexeRoot -ChildPath "wsudo.exe" 4 | $WSudoBridge = Join-Path -Path $PrivexeRoot -ChildPath "wsudo-bridge.exe" 5 | 6 | if (!(Test-Path $WSudoExe)) { 7 | Write-Host -ForegroundColor Red "$WSudoExe not exists" 8 | Exit 1 9 | } 10 | 11 | if (!(Test-Path $WSudoBridge)) { 12 | Write-Host -ForegroundColor Red "$WSudoBridge not exists" 13 | Exit 1 14 | } 15 | 16 | $subKeys = @( 'exefile\shell\runastrustedinstaller', 'batfile\shell\runastrustedinstaller', 'cmdfile\shell\runastrustedinstaller' ) 17 | 18 | 19 | # https://powershell.org/forums/topic/cant-set-new-itemproperty-to-registry-path-containing-astrix/ 20 | 21 | $hive = [Microsoft.Win32.RegistryKey]::OpenBaseKey('ClassesRoot', 'Default') 22 | foreach ($sk in $subKeys) { 23 | $subKey = $hive.CreateSubKey($sk, $true) 24 | $subkey.SetValue($null, 'Run as TrustedInstaller', 'String') 25 | $subkey.SetValue('Icon', $WSudoBridge, 'String') 26 | $subKey = $subKey.CreateSubKey('command', $true) 27 | $subkey.SetValue($null, "`"$WSudoExe`" -T `"%1`"", 'String') 28 | } 29 | 30 | -------------------------------------------------------------------------------- /vendor/pugixml/LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2006-2022 Arseny Kapoulkine 4 | 5 | Permission is hereby granted, free of charge, to any person 6 | obtaining a copy of this software and associated documentation 7 | files (the "Software"), to deal in the Software without 8 | restriction, including without limitation the rights to use, 9 | copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the 11 | Software is furnished to do so, subject to the following 12 | conditions: 13 | 14 | The above copyright notice and this permission notice shall be 15 | included in all copies or substantial portions of the Software. 16 | 17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 18 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 19 | OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 20 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 21 | HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 22 | WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 23 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 24 | OTHER DEALINGS IN THE SOFTWARE. 25 | -------------------------------------------------------------------------------- /AppExec/capabilities.cc: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include "app.hpp" 5 | #include "resource.h" 6 | 7 | namespace priv { 8 | 9 | bool IsKnownCapabilityNames(std::wstring_view name) { 10 | for (auto c : KnownCapabilityNames) { 11 | if (name == c) { 12 | return true; 13 | } 14 | } 15 | return false; 16 | } 17 | 18 | bool App::InitializeCapabilities() { 19 | ListView_SetExtendedListViewStyleEx(appx.hlview, LVS_EX_CHECKBOXES, LVS_EX_CHECKBOXES); 20 | LVCOLUMNW lvw; 21 | memset(&lvw, 0, sizeof(lvw)); 22 | lvw.cx = 200; 23 | ListView_InsertColumn(appx.hlview, 0, &lvw); 24 | constexpr std::size_t wnlen = sizeof(capabilityNames) / sizeof(CapabilityName); 25 | for (std::size_t n = wnlen; n > 0; n--) { 26 | const auto &w = capabilityNames[n - 1]; 27 | LVITEMW item; 28 | ZeroMemory(&item, sizeof(item)); 29 | item.mask = LVIF_TEXT | LVIF_PARAM; 30 | item.pszText = const_cast(w.name); 31 | item.lParam = (LPARAM)w.value; 32 | ListView_InsertItem(appx.hlview, &item); 33 | } 34 | ListView_SetColumnWidth(appx.hlview, 0, LVSCW_AUTOSIZE_USEHEADER); 35 | return true; 36 | } 37 | } // namespace priv -------------------------------------------------------------------------------- /vendor/bela/test/appexeclink/appexeclink.cc: -------------------------------------------------------------------------------- 1 | /// 2 | #include 3 | #include 4 | // test\appexeclink\appexeclink_test.exe 5 | // C:\Users\$Username\AppData\Local\Microsoft\WindowsApps\wt.exe 6 | int wmain(int argc, wchar_t **argv) { 7 | if (argc < 2) { 8 | bela::FPrintF(stderr, L"usage: %s appexeclink\n", argv[0]); 9 | return 1; 10 | } 11 | bela::error_code ec; 12 | auto p = bela::RealPath(argv[1], ec); 13 | if (p) { 14 | bela::FPrintF(stdout, L"%s RealPath [%s]\n", argv[1], *p); 15 | } else { 16 | bela::FPrintF(stderr, L"%s RealPath error: %s\n", argv[1], ec); 17 | } 18 | auto p2 = bela::RealPathEx(argv[1], ec); 19 | if (p2) { 20 | bela::FPrintF(stdout, L"%s RealPathEx [%s]\n", argv[1], *p2); 21 | } else { 22 | bela::FPrintF(stderr, L"%s RealPathEx error: %s\n", argv[1], ec); 23 | } 24 | bela::AppExecTarget ae; 25 | if (!bela::LookupAppExecLinkTarget(argv[1], ae)) { 26 | bela::FPrintF(stderr, L"unable lookup %s AppExecTarget\n", argv[1]); 27 | return 1; 28 | } 29 | bela::FPrintF(stdout, L"AppExecLink details:\nPackageID: %s\nAppUserID: %s\nTarget: %s\n", ae.pkid, 30 | ae.appuserid, ae.target); 31 | return 0; 32 | } -------------------------------------------------------------------------------- /vendor/bela/test/winutils/process.cc: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | int stty_size() { 5 | bela::process::Process p; 6 | if (p.CaptureWithMode(bela::process::CAPTURE_USEIN | bela::process::CAPTURE_USEERR, L"stty", L"size") != 0) { 7 | bela::FPrintF(stderr, L"ExitCode: %d Error: %s\nOutput: %s\n", p.ExitCode(), p.ErrorCode().message, p.Out()); 8 | return 1; 9 | } 10 | bela::FPrintF(stderr, L"result: %s\n", p.Out()); 11 | return 0; 12 | } 13 | 14 | int wmain() { 15 | stty_size(); 16 | bela::env::Simulator simulator; 17 | simulator.InitializeEnv(); 18 | simulator.SetEnv(L"BELA_DEBUG_MODE", L"true"); 19 | bela::process::Process p(&simulator); 20 | // vswhere use stdout output 21 | if (p.CaptureWithMode(bela::process::CAPTURE_USEIN | bela::process::CAPTURE_USEERR, L"vswhere", L"-format", L"json", 22 | L"-utf8") == 0) { 23 | bela::FPrintF(stderr, L"result: %s\n", p.Out()); 24 | } else { 25 | bela::FPrintF(stderr, L"Exit %s\n%s\n", p.ErrorCode().message, p.Out()); 26 | } 27 | bela::FPrintF(stderr, L"\x1b[33mRun cmd\x1b[0m\n"); 28 | auto exitcode = p.Execute(L"cmd"); 29 | bela::FPrintF(stderr, L"\x1b[33mcmd exit %d\x1b[0m\n", exitcode); 30 | return 0; 31 | } -------------------------------------------------------------------------------- /vendor/bela/src/bela/codecvt.cc: -------------------------------------------------------------------------------- 1 | ////////// 2 | // see: 3 | // https://github.com/llvm-mirror/llvm/blob/master/lib/Support/ConvertUTF.cpp 4 | // 5 | #include 6 | #include 7 | #include 8 | 9 | namespace bela { 10 | 11 | bool bisearch(char32_t rune, const bela::unicode::interval *table, size_t max) { 12 | size_t min = 0; 13 | size_t mid; 14 | if (rune < table[0].first || rune > table[max].last) { 15 | return false; 16 | } 17 | while (max >= min) { 18 | mid = (min + max) / 2; 19 | if (rune > table[mid].last) { 20 | min = mid + 1; 21 | continue; 22 | } 23 | if (rune < table[mid].first) { 24 | max = mid - 1; 25 | continue; 26 | } 27 | return true; 28 | } 29 | return false; 30 | } 31 | 32 | size_t rune_width(char32_t rune) { 33 | // control characters we return 0; 34 | if (rune == 0 || rune > 0x10FFFF || rune < 32 || (rune >= 0x7F && rune < 0xa0)) { 35 | return 0; 36 | } 37 | if (bisearch(rune, bela::unicode::zero_width, std::size(bela::unicode::zero_width) - 1)) { 38 | return 0; 39 | } 40 | if (bisearch(rune, bela::unicode::double_width, std::size(bela::unicode::double_width) - 1)) { 41 | return 2; 42 | } 43 | return 1; 44 | } 45 | 46 | } // namespace bela 47 | -------------------------------------------------------------------------------- /vendor/bela/test/tokencmd/tokencmd.cc: -------------------------------------------------------------------------------- 1 | /// 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | int TestTokenize() { 8 | auto cmd = L"ccc\\clang -c -DFOO=\"\"\"ABC\"\"\" x.cpp "; 9 | bela::FPrintF(stderr, L"tokenize [%s]\n", cmd); 10 | bela::Tokenizer tokenizer; 11 | if (!tokenizer.Tokenize(cmd)) { 12 | bela::FPrintF(stderr, L"unable tokenize [%s]\n", cmd); 13 | return 1; 14 | } 15 | for (size_t i = 0; i < tokenizer.Argc(); i++) { 16 | bela::FPrintF(stderr, L"Got: [%s]\n", tokenizer.Argv()[i]); 17 | } 18 | return 0; 19 | } 20 | 21 | int wmain(int argc, wchar_t **argv) { 22 | _wsetlocale(LC_ALL, L""); 23 | TestTokenize(); 24 | std::wstring_view cmdline = GetCommandLineW(); 25 | bela::FPrintF(stderr, L"cmdline: [%s]\n", cmdline); 26 | bela::Tokenizer tokenizer; 27 | if (!tokenizer.Tokenize(cmdline)) { 28 | bela::FPrintF(stderr, L"unable tokenize [%s]\n", cmdline); 29 | return 1; 30 | } 31 | if (tokenizer.Argc() != (size_t)argc) { 32 | bela::FPrintF(stderr, L"command line number not match %d --> %d\n", tokenizer.Argc(), argc); 33 | return 1; 34 | } 35 | for (int i = 0; i < argc; i++) { 36 | bela::FPrintF(stderr, L"Need: [%s] Got: [%s]\n", argv[i], tokenizer.Argv()[i]); 37 | } 38 | return 0; 39 | } -------------------------------------------------------------------------------- /vendor/bela/test/winutils/writefile.cc: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | int wmain(int argc, wchar_t **argv) { 5 | if (argc < 2) { 6 | bela::FPrintF(stderr, L"usage %s text\n", argv[0]); 7 | return 1; 8 | } 9 | bela::error_code ec; 10 | if (!bela::io::WriteText(L"u8.txt", std::wstring_view{argv[1]}, ec)) { 11 | bela::FPrintF(stderr, L"write u8: %s\n", ec); 12 | } 13 | if (!bela::io::WriteTextU16LE(L"u16.txt", std::wstring_view{argv[1]}, ec)) { 14 | bela::FPrintF(stderr, L"write u16: %s\n", ec); 15 | } 16 | auto u8 = bela::io::ReadLine(L"u8.txt", ec); 17 | if (u8) { 18 | bela::FPrintF(stderr, L"read u8 success: %s\n", *u8); 19 | } else { 20 | bela::FPrintF(stderr, L"read u8: %s\n", ec); 21 | } 22 | auto u16 = bela::io::ReadLine(L"u16.txt", ec); 23 | if (u16) { 24 | bela::FPrintF(stderr, L"read u16 success: %s\n", *u16); 25 | } else { 26 | bela::FPrintF(stderr, L"read u16: %s\n", ec); 27 | } 28 | if (!bela::io::AtomicWriteText(L"atomic.txt", bela::io::as_bytes("789456133"), ec)) { 29 | bela::FPrintF(stderr, L"atomic update file error: %s\n", ec); 30 | } 31 | if (!bela::io::AtomicWriteText( 32 | L"atomic.txt", 33 | bela::io::as_bytes("😊✔️💜🤣👌😁🎉💖😒😂😍🤣🎉🎉🎉🎉🎉"), ec)) { 34 | bela::FPrintF(stderr, L"atomic update file error: %v\n", ec); 35 | } 36 | return true; 37 | } -------------------------------------------------------------------------------- /include/baseversion.h: -------------------------------------------------------------------------------- 1 | #ifndef PRIVEXEC_VERSION_H 2 | #define PRIVEXEC_VERSION_H 3 | 4 | #define PRIVEXEC_VERSION_MAJOR 2 5 | #define PRIVEXEC_VERSION_MINOR 6 6 | #define PRIVEXEC_VERSION_PATCH 1 7 | #define PRIVEXEC_VERSION_BUILD 0 8 | 9 | #define PRIVEXEC_VERSION L"2.6.1" 10 | #define PRIVEXEC_REVISION L"323ae224ca6272af7be64f507a2346f9a69ec619" 11 | #define PRIVEXEC_REFNAME L"refs/heads/master" 12 | #define PRIVEXEC_BUILD_TIME L"none" 13 | #define PRIVEXEC_REMOTE_URL L"git@github.com:M2Team/Privexec.git" 14 | 15 | #define PRIVEXEC_APPLINK \ 16 | L"For more information about this tool. \nVisit: Privexec\nVisit: forcemz.net" 19 | 20 | #define PRIVEXEC_APPLINKE \ 21 | L"Ask for help with this issue. \nVisit: Privexec " \ 23 | L"Issues" 24 | 25 | #define PRIVEXEC_APPVERSION L"Version: 2.6.1\nCopyright \xA9 2022, Privexec contributors." 26 | 27 | #define PRIVEXECUI_COPYRIGHT L"Copyright \xA9 2022, Privexec contributors." 28 | 29 | #endif 30 | -------------------------------------------------------------------------------- /vendor/bela/include/bela/fnmatch.hpp: -------------------------------------------------------------------------------- 1 | // 2 | #ifndef BELA_FNMATCH_HPP 3 | #define BELA_FNMATCH_HPP 4 | #include 5 | 6 | namespace bela { 7 | namespace fnmatch { 8 | [[maybe_unused]] constexpr int NoEscape = 0x1; 9 | [[maybe_unused]] constexpr int PathName = 0x2; 10 | [[maybe_unused]] constexpr int Period = 0x4; 11 | [[maybe_unused]] constexpr int LeadingDir = 0x8; 12 | [[maybe_unused]] constexpr int CaseFold = 0x10; 13 | [[maybe_unused]] constexpr int IgnoreCase = 0x10; 14 | [[maybe_unused]] constexpr int FileName = PathName; 15 | } // namespace fnmatch 16 | // POSIX fnmatch impl see http://man7.org/linux/man-pages/man3/fnmatch.3.html 17 | 18 | bool FnMatch(std::u16string_view pattern, std::u16string_view text, int flags = 0); 19 | inline bool FnMatch(std::wstring_view pattern, std::wstring_view text, int flags = 0) { 20 | return FnMatch({reinterpret_cast(pattern.data()), pattern.size()}, 21 | {reinterpret_cast(text.data()), text.size()}, flags); 22 | } 23 | bool FnMatch(std::u8string_view pattern, std::u8string_view text, int flags = 0); 24 | inline bool FnMatch(std::string_view pattern, std::string_view text, int flags = 0) { 25 | return FnMatch({reinterpret_cast(pattern.data()), pattern.size()}, 26 | {reinterpret_cast(text.data()), text.size()}, flags); 27 | } 28 | 29 | } // namespace bela 30 | 31 | #endif -------------------------------------------------------------------------------- /vendor/bela/test/base/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # base 2 | add_executable(base_test 3 | base.cc 4 | ) 5 | 6 | target_link_libraries(base_test 7 | bela 8 | ) 9 | 10 | # base 11 | add_executable(cityhash_test 12 | cityhash.cc 13 | ) 14 | 15 | target_link_libraries(cityhash_test 16 | bela 17 | ) 18 | 19 | 20 | # base 21 | add_executable(ascii_test 22 | ascii.cc 23 | ) 24 | 25 | target_link_libraries(ascii_test 26 | bela 27 | ) 28 | 29 | # base 30 | add_executable(fnmatch_test 31 | fnmatch.cc 32 | ) 33 | 34 | target_link_libraries(fnmatch_test 35 | bela 36 | ) 37 | 38 | # delfile 39 | add_executable(delfile_test 40 | delfile.cc 41 | ) 42 | 43 | target_link_libraries(delfile_test 44 | bela 45 | belawin 46 | ) 47 | 48 | # base 49 | add_executable(strsplit_test 50 | strsplit.cc 51 | ) 52 | 53 | target_link_libraries(strsplit_test 54 | bela 55 | ) 56 | 57 | 58 | 59 | # base 60 | add_executable(startswith_test 61 | startswith.cc 62 | ) 63 | 64 | target_link_libraries(startswith_test 65 | bela 66 | ) 67 | 68 | # base 69 | add_executable(static_string_test 70 | static_string.cc 71 | ) 72 | 73 | target_link_libraries(static_string_test 74 | bela 75 | ) 76 | 77 | add_executable(iota_test 78 | iota.cc 79 | ) 80 | 81 | target_link_libraries(iota_test 82 | bela 83 | ) 84 | 85 | add_executable(strings_cat_test 86 | strings_cat.cc 87 | ) 88 | 89 | target_link_libraries(strings_cat_test 90 | bela 91 | ) -------------------------------------------------------------------------------- /vendor/bela/test/base/strsplit.cc: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | int wmain() { 9 | const wchar_t *paths[] = { 10 | L"/////////////Temp/bela/build", 11 | }; 12 | for (const auto p : paths) { 13 | std::vector pvv = bela::StrSplit(p, bela::ByChar('/'), bela::SkipEmpty()); 14 | bela::FPrintF(stderr, L"path: %s\n", p); 15 | for (const auto e : pvv) { 16 | bela::FPrintF(stderr, L" %s\n", e); 17 | } 18 | bela::FPrintF(stderr, L"Join: %s\n", bela::StrJoin(pvv, L"/")); 19 | } 20 | const char *Apaths[] = { 21 | "/////////////Temp/bela/build", 22 | }; 23 | for (const auto p : Apaths) { 24 | std::vector pvv = bela::narrow::StrSplit(p, bela::narrow::ByChar('/'), bela::narrow::SkipEmpty()); 25 | bela::FPrintF(stderr, L"path: %s\n", p); 26 | for (const auto e : pvv) { 27 | bela::FPrintF(stderr, L" %s\n", e); 28 | } 29 | bela::FPrintF(stderr, L"Join: %s\n", bela::narrow::StrJoin(pvv, "/")); 30 | } 31 | bela::FPrintF(stderr, L"%s\n", bela::StrReplaceAll("++++++++++++++++++++dexxxABCdefg", {{"de", "xx"}})); 32 | bela::FPrintF(stderr, L"%s\n", bela::StrReplaceAll(L"wwwwwwwwwwwwwwwwde~~~~~~~~~~~~ABCdefg", {{L"de", L"xx"}})); 33 | return 0; 34 | } -------------------------------------------------------------------------------- /vendor/bela/src/belaund/llvm/include/llvm/Demangle/StringViewExtras.h: -------------------------------------------------------------------------------- 1 | //===--- StringViewExtras.h ----------*- mode:c++;eval:(read-only-mode) -*-===// 2 | // Do not edit! See README.txt. 3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 | // See https://llvm.org/LICENSE.txt for license information. 5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 | // 7 | //===----------------------------------------------------------------------===// 8 | // 9 | // There are two copies of this file in the source tree. The one under 10 | // libcxxabi is the original and the one under llvm is the copy. Use 11 | // cp-to-llvm.sh to update the copy. See README.txt for more details. 12 | // 13 | //===----------------------------------------------------------------------===// 14 | 15 | #ifndef DEMANGLE_STRINGVIEW_H 16 | #define DEMANGLE_STRINGVIEW_H 17 | 18 | #include "DemangleConfig.h" 19 | 20 | #include 21 | 22 | DEMANGLE_NAMESPACE_BEGIN 23 | 24 | inline bool starts_with(std::string_view self, char C) noexcept { 25 | return !self.empty() && *self.begin() == C; 26 | } 27 | 28 | inline bool starts_with(std::string_view haystack, 29 | std::string_view needle) noexcept { 30 | if (needle.size() > haystack.size()) 31 | return false; 32 | haystack.remove_suffix(haystack.size() - needle.size()); 33 | return haystack == needle; 34 | } 35 | 36 | DEMANGLE_NAMESPACE_END 37 | 38 | #endif 39 | -------------------------------------------------------------------------------- /vendor/bela/src/belahash/blake3/blake3_tbb.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | #include 5 | 6 | #include "blake3_impl.h" 7 | 8 | static_assert(TBB_USE_EXCEPTIONS == 0, 9 | "This file should be compiled with C++ exceptions disabled."); 10 | 11 | extern "C" void blake3_compress_subtree_wide_join_tbb( 12 | // shared params 13 | const uint32_t key[8], uint8_t flags, bool use_tbb, 14 | // left-hand side params 15 | const uint8_t *l_input, size_t l_input_len, uint64_t l_chunk_counter, 16 | uint8_t *l_cvs, size_t *l_n, 17 | // right-hand side params 18 | const uint8_t *r_input, size_t r_input_len, uint64_t r_chunk_counter, 19 | uint8_t *r_cvs, size_t *r_n) noexcept { 20 | if (!use_tbb) { 21 | *l_n = blake3_compress_subtree_wide(l_input, l_input_len, key, 22 | l_chunk_counter, flags, l_cvs, use_tbb); 23 | *r_n = blake3_compress_subtree_wide(r_input, r_input_len, key, 24 | r_chunk_counter, flags, r_cvs, use_tbb); 25 | return; 26 | } 27 | 28 | oneapi::tbb::parallel_invoke( 29 | [=]() { 30 | *l_n = blake3_compress_subtree_wide( 31 | l_input, l_input_len, key, l_chunk_counter, flags, l_cvs, use_tbb); 32 | }, 33 | [=]() { 34 | *r_n = blake3_compress_subtree_wide( 35 | r_input, r_input_len, key, r_chunk_counter, flags, r_cvs, use_tbb); 36 | }); 37 | } 38 | -------------------------------------------------------------------------------- /wsudo/wsudo.manifest: -------------------------------------------------------------------------------- 1 | 2 | 3 | WSUDO 4 | 5 | 6 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | true/PM 27 | PerMonitorV2, PerMonitor 28 | true 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /AppExec/AppExec.manifest: -------------------------------------------------------------------------------- 1 | 2 | 3 | AppExec 4 | 5 | 6 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | true/PM 27 | PerMonitorV2, PerMonitor 28 | true 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /Privexec/Privexec.manifest: -------------------------------------------------------------------------------- 1 | 2 | 3 | Privexec 4 | 5 | 6 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | true/PM 27 | PerMonitorV2, PerMonitor 28 | true 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /vendor/bela/src/hazel/ina/docs.hpp: -------------------------------------------------------------------------------- 1 | /// 2 | #ifndef INQUISITIVE_DOCS_HPP 3 | #define INQUISITIVE_DOCS_HPP 4 | #include 5 | 6 | namespace hazel::internal { 7 | // Microsoft word/ppt/xls 8 | // WordDocument 9 | // https://msdn.microsoft.com/en-us/library/office/dd926131(v=office.12).aspx 10 | // https://msdn.microsoft.com/en-us/library/office/dd949344(v=office.12).aspx 11 | // https://docs.microsoft.com/zh-cn/previous-versions/office/gg615596(v=office.14) 12 | // https://msdn.microsoft.com/en-us/library/cc313154(v=office.12).aspx 13 | 14 | struct oleheader_t { 15 | uint32_t id[2]; // D0CF11E0 A1B11AE1 16 | uint32_t clid[4]; 17 | uint16_t verminor; // 0x3e 18 | uint16_t verdll; // 0x03 19 | uint16_t byteorder; 20 | uint16_t lsectorB; 21 | uint16_t lssectorB; 22 | 23 | uint16_t reserved1; 24 | uint32_t reserved2; 25 | uint32_t reserved3; 26 | 27 | uint32_t cfat; // count full sectors 28 | uint32_t dirstart; 29 | 30 | uint32_t reserved4; 31 | 32 | uint32_t sectorcutoff; // min size of a standard stream ; if less than this 33 | // then it uses short-streams 34 | uint32_t sfatstart; // first short-sector or EOC 35 | uint32_t csfat; // count short sectors 36 | uint32_t difstart; // first sector master sector table or EOC 37 | uint32_t cdif; // total count 38 | uint32_t MSAT[109]; // First 109 MSAT 39 | }; 40 | 41 | // https://www.oasis-open.org/standards#opendocumentv1.2 42 | } // namespace hazel::internal 43 | 44 | #endif 45 | -------------------------------------------------------------------------------- /vendor/bela/res/win10.manifest: -------------------------------------------------------------------------------- 1 | 2 | 3 | Bela 4 | 5 | 6 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | true/PM 27 | PerMonitorV2, PerMonitor 28 | true 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /vendor/bela/external/charconv/xcharconv.h: -------------------------------------------------------------------------------- 1 | // xcharconv.h internal header 2 | 3 | // Copyright (c) Microsoft Corporation. 4 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 5 | 6 | #pragma once 7 | #ifndef _XCHARCONV_H 8 | #define _XCHARCONV_H 9 | #include 10 | #if _STL_COMPILER_PREPROCESSOR 11 | 12 | #include 13 | #include 14 | #include 15 | 16 | #if !_HAS_CXX17 17 | #error The contents of are only available with C++17. (Also, you should not include this internal header.) 18 | #endif // !_HAS_CXX17 19 | 20 | #pragma pack(push, _CRT_PACKING) 21 | #pragma warning(push, _STL_WARNING_LEVEL) 22 | #pragma warning(disable : _STL_DISABLED_WARNINGS) 23 | _STL_DISABLE_CLANG_WARNINGS 24 | #pragma push_macro("new") 25 | #undef new 26 | 27 | _STD_BEGIN 28 | _EXPORT_STD enum class chars_format { 29 | scientific = 0b001, 30 | fixed = 0b010, 31 | hex = 0b100, 32 | general = fixed | scientific, 33 | }; 34 | 35 | _BITMASK_OPS(_EXPORT_STD, chars_format) 36 | 37 | _EXPORT_STD struct to_chars_result { 38 | char* ptr; 39 | errc ec; 40 | #if _HAS_CXX20 41 | _NODISCARD_FRIEND bool operator==(const to_chars_result&, const to_chars_result&) = default; 42 | #endif // _HAS_CXX20 43 | }; 44 | 45 | _STD_END 46 | 47 | #pragma pop_macro("new") 48 | _STL_RESTORE_CLANG_WARNINGS 49 | #pragma warning(pop) 50 | #pragma pack(pop) 51 | 52 | #endif // _STL_COMPILER_PREPROCESSOR 53 | #endif // _XCHARCONV_H 54 | -------------------------------------------------------------------------------- /vendor/bela/test/winutils/env2.cc: -------------------------------------------------------------------------------- 1 | ////////// 2 | #include 3 | #include 4 | 5 | namespace bela { 6 | namespace env { 7 | std::wstring_view resovle_shell_name(std::wstring_view s, size_t &off); 8 | } 9 | } // namespace bela 10 | 11 | int wmain(int argc, wchar_t **argv) { 12 | const wchar_t *sss[] = {L"{HOME}", L"{HOME,,,,}", L"HOME----", L"{}", L"HOME$"}; 13 | for (auto s : sss) { 14 | size_t off = 0; 15 | auto k = bela::env::resovle_shell_name(s, off); 16 | bela::FPrintF(stderr, L"%s --> [%s] off: %d\n", s, k, off); 17 | } 18 | bela::env::Simulator simulator; 19 | simulator.InitializeCleanupEnv(); 20 | simulator.AddBashCompatible(argc, argv); 21 | simulator.PutEnv(L"JACK=ROSE"); 22 | 23 | const wchar_t *svv[] = { // 24 | L"SystemRoot ${SystemRoot}, $ who $JACK ?$$$ |", // 25 | L"System $|--- $ ???", 26 | L"System $|--- $ ???${", 27 | L"------->${}", // -------> 28 | L"App Argv0: $0 HOME: $HOME", 29 | L"cmdline: $@"}; 30 | for (auto s : svv) { 31 | bela::FPrintF(stderr, L"%s --> [%s]\n", s, simulator.ExpandEnv(s)); 32 | } 33 | auto path = bela::AppendEnv(L"Path", L"C:\\Program Files\\7-Zip", L"C:\\MSYS2"); 34 | bela::FPrintF(stderr, L"Path: %s\n", path); 35 | bela::FPrintF(stderr, L"SSH Public Key: %s\n", bela::env::PathExpand(L"~/.ssh/id_ed25519.pub")); 36 | return 0; 37 | } -------------------------------------------------------------------------------- /vendor/bela/src/hazel/elf/dynamic.cc: -------------------------------------------------------------------------------- 1 | // 2 | #include 3 | #include 4 | 5 | namespace hazel::elf { 6 | bool File::DynString(int tag, std::vector &sv, bela::error_code &ec) const { 7 | if (tag != DT_NEEDED && tag != DT_SONAME && tag != DT_RPATH && tag != DT_RUNPATH) { 8 | ec = bela::make_error_code(ErrGeneral, L"non-string-valued tag ", tag); 9 | return false; 10 | } 11 | auto ds = SectionByType(SHT_DYNAMIC); 12 | if (ds == nullptr) { 13 | return true; 14 | } 15 | bela::Buffer d; 16 | if (!sectionData(*ds, d, ec)) { 17 | return false; 18 | } 19 | bela::Buffer str; 20 | if (!stringTable(ds->Link, str, ec)) { 21 | return false; 22 | } 23 | auto bsv = str.as_bytes_view(); 24 | auto dv = d.as_bytes_view(); 25 | if (fh.Class == ELFCLASS32) { 26 | while (dv.size() >= 8) { 27 | auto t = cast_from(dv.data()); 28 | auto v = cast_from(dv.data() + 4); 29 | dv.remove_prefix(8); 30 | if (std::cmp_equal(t, tag)) { 31 | if (auto s = bsv.make_cstring_view(v); !s.empty()) { 32 | sv.emplace_back(s); 33 | } 34 | } 35 | } 36 | return true; 37 | } 38 | while (dv.size() >= 16) { 39 | auto t = cast_from(dv.data()); 40 | auto v = cast_from(dv.data() + 8); 41 | dv.remove_prefix(16); 42 | if (std::cmp_equal(t, tag)) { 43 | if (auto s = bsv.make_cstring_view(static_cast(v)); !s.empty()) { 44 | sv.emplace_back(s); 45 | } 46 | } 47 | } 48 | return true; 49 | } 50 | } // namespace hazel::elf -------------------------------------------------------------------------------- /Privexec/capabilities.cc: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include "app.hpp" 4 | #include "resource.h" 5 | #include 6 | 7 | /// SEE: 8 | /// https://github.com/googleprojectzero/sandbox-attacksurface-analysis-tools/blob/main/NtApiDotNet/SecurityCapabilities.cs 9 | // $source=Get-Content -Path .\SecurityCapabilities.cs -Raw 10 | // Add-Type -TypeDefinition $source 11 | 12 | namespace priv { 13 | bool IsKnownCapabilityNames(std::wstring_view name) { 14 | for (auto c : KnownCapabilityNames) { 15 | if (name == c) { 16 | return true; 17 | } 18 | } 19 | return false; 20 | } 21 | 22 | bool App::InitializeCapabilities() { 23 | capabilities.hlview = GetDlgItem(hWnd, IDL_APPCONTAINER_LISTVIEW); 24 | capabilities.hlpacbox = GetDlgItem(hWnd, IDC_LPACMODE); 25 | ListView_SetExtendedListViewStyleEx(capabilities.hlview, LVS_EX_CHECKBOXES, LVS_EX_CHECKBOXES); 26 | LVCOLUMNW lvw; 27 | memset(&lvw, 0, sizeof(lvw)); 28 | lvw.cx = 200; 29 | ListView_InsertColumn(capabilities.hlview, 0, &lvw); 30 | constexpr std::size_t wnlen = sizeof(capabilityNames) / sizeof(CapabilityName); 31 | for (std::size_t n = wnlen; n > 0; n--) { 32 | const auto &w = capabilityNames[n - 1]; 33 | LVITEMW item; 34 | ZeroMemory(&item, sizeof(item)); 35 | item.mask = LVIF_TEXT | LVIF_PARAM; 36 | item.pszText = const_cast(w.name); 37 | item.lParam = (LPARAM)w.value; 38 | ListView_InsertItem(capabilities.hlview, &item); 39 | } 40 | ListView_SetColumnWidth(capabilities.hlview, 0, LVSCW_AUTOSIZE_USEHEADER); 41 | return true; 42 | } 43 | } // namespace priv -------------------------------------------------------------------------------- /Privexec/resource.h: -------------------------------------------------------------------------------- 1 | #ifndef RESOURCE_H 2 | #define RESOURCE_H 3 | #include "baseversion.h" 4 | #define IDI_APPLICATION_ICON 101 5 | #define IDD_APPLICATION_DIALOG 102 6 | 7 | #define IDM_PRIVEXEC_ABOUT 500 8 | #define IDM_EDIT_ALIASFILE 501 9 | 10 | #define IDC_USER_COMBOX 1001 11 | #define IDC_USER_STATIC 1002 12 | #define IDC_COMMAND_STATIC 1003 13 | #define IDC_COMMAND_COMBOX 1005 14 | #define IDB_COMMAND_TARGET 1006 15 | #define IDB_EXECUTE_BUTTON 1007 16 | #define IDB_EXIT_BUTTON 1008 17 | #define IDS_APPSTARTUP 1009 18 | #define IDE_APPSTARTUP 1010 19 | #define IDB_APPSTARTUP 1011 20 | #define IDC_COMMAND_SID 1012 21 | #define IDE_APPCONTAINER_APPMANIFEST 1013 22 | #define IDC_APPCONTAINER_STATIC 1014 23 | #define IDB_APPCONTAINER_BUTTON 1015 24 | #define IDS_RECOMMENDED_CAPS 1016 // recommended 25 | #define IDL_APPCONTAINER_LISTVIEW 1017 26 | #define IDS_HELPMSG 1018 27 | #define IDC_LPACMODE 1019 28 | #define IDM_PRIVEXEC_THEME 1020 29 | 30 | #define CS_LISTVIEW WS_BORDER | WS_VSCROLL | WS_TABSTOP | LVS_REPORT | LVS_NOCOLUMNHEADER 31 | 32 | #define CS_BASE \ 33 | BS_PUSHBUTTON | BS_TEXT | BS_DEFPUSHBUTTON | BS_CHECKBOX | BS_AUTOCHECKBOX | WS_CHILD | WS_OVERLAPPED | WS_VISIBLE 34 | 35 | // Next default values for new objects 36 | // 37 | #ifdef APSTUDIO_INVOKED 38 | #ifndef APSTUDIO_READONLY_SYMBOLS 39 | #define _APS_NEXT_RESOURCE_VALUE 103 40 | #define _APS_NEXT_COMMAND_VALUE 40001 41 | #define _APS_NEXT_CONTROL_VALUE 1008 42 | #define _APS_NEXT_SYMED_VALUE 101 43 | #endif 44 | #endif 45 | 46 | #endif 47 | -------------------------------------------------------------------------------- /vendor/bela/include/hazel/details/ELFRelocs/RISCV_nonstandard.def: -------------------------------------------------------------------------------- 1 | //===--- RISC-V Nonstandard Relocation List ---------------------*- C++ -*-===// 2 | // 3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 | // See https://llvm.org/LICENSE.txt for license information. 5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 | // 7 | //===----------------------------------------------------------------------===// 8 | 9 | #ifndef ELF_RISCV_NONSTANDARD_RELOC 10 | #error "ELF_RISCV_NONSTANDARD_RELOC must be defined" 11 | #endif 12 | 13 | // ELF_RISCV_NONSTANDARD_RELOC(VENDOR, NAME, ID) defines information about 14 | // nonstandard relocation codes. This can be used when parsing relocations, or 15 | // when printing them, to provide better information. 16 | // 17 | // VENDOR should be the symbol name expected in the associated `R_RISCV_VENDOR` 18 | // relocation. NAME and ID work like `ELF_RELOC` but the mapping is not expected 19 | // to be 1:1. 20 | // 21 | // The mapping in RISCV.def is 1:1, and should be used when the only information 22 | // available is the relocation enum value. 23 | 24 | // Qualcomm Nonstandard Relocations 25 | ELF_RISCV_NONSTANDARD_RELOC(QUALCOMM, R_RISCV_QC_ABS20_U, 192) 26 | ELF_RISCV_NONSTANDARD_RELOC(QUALCOMM, R_RISCV_QC_E_BRANCH, 193) 27 | ELF_RISCV_NONSTANDARD_RELOC(QUALCOMM, R_RISCV_QC_E_32, 194) 28 | ELF_RISCV_NONSTANDARD_RELOC(QUALCOMM, R_RISCV_QC_E_CALL_PLT, 195) 29 | 30 | // Andes Nonstandard Relocations 31 | // Calculation: S + A - P (10-bit PC-relative branch offset) 32 | ELF_RISCV_NONSTANDARD_RELOC(ANDES, R_RISCV_NDS_BRANCH_10, 241) 33 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | on: 3 | push: 4 | paths-ignore: 5 | # https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions 6 | - "docs/**" 7 | - '**.md' 8 | - '**.txt' 9 | - 'LICENSE' 10 | pull_request: 11 | paths-ignore: 12 | - "docs/**" 13 | - '**.md' 14 | - '**.txt' 15 | - 'LICENSE' 16 | jobs: 17 | build: 18 | name: Build 19 | runs-on: windows-latest 20 | strategy: 21 | fail-fast: false 22 | matrix: 23 | target: [win64, arm64] 24 | steps: 25 | - uses: actions/checkout@v6 26 | with: 27 | fetch-depth: 1 28 | - name: compile-Privexec 29 | run: pwsh -NoProfile -NoLogo -ExecutionPolicy unrestricted -File "./build.ps1" -Target "${{ matrix.target }}" 30 | 31 | - name: Package release 32 | if: startsWith(github.ref, 'refs/tags/') 33 | shell: pwsh 34 | # create package and show sha256 hash 35 | run: | 36 | Set-Location build 37 | # cleanup zip files 38 | Remove-Item -Force *.zip 39 | cpack -G ZIP 40 | $obj=Get-FileHash -Algorithm SHA256 Privexec*.zip 41 | Split-Path -Leaf $obj.Path 42 | $obj.Algorithm +":"+$obj.Hash.ToLower() 43 | - name: Upload release 44 | uses: svenstaro/upload-release-action@v2 45 | if: startsWith(github.ref, 'refs/tags/') 46 | with: 47 | file_glob: true 48 | repo_token: ${{ secrets.GITHUB_TOKEN }} 49 | file: build/Privexec-*.zip 50 | tag: ${{ github.ref }} 51 | overwrite: true 52 | -------------------------------------------------------------------------------- /vendor/bela/docs/zh-CN/path.md: -------------------------------------------------------------------------------- 1 | # Windows Path Utility 2 | 3 | ## PathCat 函数 4 | 5 | `PathCat`,`JoinPath` 函数借鉴了 `StringCat` 函数,将路径组件连接起来。例子如下: 6 | 7 | ```c++ 8 | auto p = bela::PathCat(L"\\\\?\\C:\\Windows/System32", L"drivers/etc", L"hosts"); 9 | bela::FPrintF(stderr, L"PathCat: %s\n", p); 10 | auto p2 = bela::PathCat(L"C:\\Windows/System32", L"drivers/../.."); 11 | bela::FPrintF(stderr, L"PathCat: %s\n", p2); 12 | auto p3 = bela::PathCat(L"Windows/System32", L"drivers/./././.\\.\\etc"); 13 | bela::FPrintF(stderr, L"PathCat: %s\n", p3); 14 | auto p4 = bela::PathCat(L".", L"test/pathcat/./pathcat_test.exe"); 15 | bela::FPrintF(stderr, L"PathCat: %s\n", p4); 16 | auto p5 = bela::PathCat(L"C:\\Windows\\System32\\drivers\\..\\.\\IME"); 17 | bela::FPrintF(stderr, L"PathCat: %s\n", p5); 18 | ``` 19 | `PathCat` 的思路是获得 root 后,将其他路径按路径分隔符拆分成数组然后合成,`JoinPath` 与 `PathCat` 不一致的地方在于,`JoinPath` 将会把路径参数中的第一个解析为绝对路径,然后再参与计算。 20 | 21 | `PathCat`,`JoinPath` 并不会判断路径是否存在,因此需要注意。 22 | 23 | 路径解析错误是很多软件的漏洞根源,合理的规范化路径非常有必要,而 `PathCat` 在规范化路径时,使用 C++17/C++20(Span) 的特性,减少内存分配,简化了规范化流程。 24 | 25 | 26 | ## PathExists 函数 27 | 28 | `PathExists` 函数判断路径是否存在,当使用默认参数时,只会判断路径是否存在,如果需要判断路径的其他属性,可以使用如下方式: 29 | 30 | ```c++ 31 | if(!bela::PathExists(L"C:\\Windows",FileAttribute::Dir)){ 32 | bela::FPrintF(stderr,L"C:\\Windows not dir or not exists\n"); 33 | } 34 | ``` 35 | 36 | ## LookupRealPath 函数 37 | 38 | `LookupRealPath` 用于解析 Windows 符号链接和卷挂载点。 39 | 40 | ## LookupAppExecLinkTarget 函数 41 | 42 | `LookupAppExecLinkTarget` 用于解析 Windows AppExecLink 目标,在 Windows 10 系统中,`AppExecLink` 是一种 Store App 的命令行入口,通常位于 `C:\Users\$Username\AppData\Local\Microsoft\WindowsApps`,这种文件本质上是一种重解析点,因此解析时需要按照重解析点的方法去解析。 43 | -------------------------------------------------------------------------------- /vendor/bela/include/hazel/details/ELFRelocs/VE.def: -------------------------------------------------------------------------------- 1 | 2 | #ifndef ELF_RELOC 3 | #error "ELF_RELOC must be defined" 4 | #endif 5 | 6 | // Relocation types defined in following documents. 7 | // 8 | // - System V Application Binary Interface - VE Architecture 9 | // Processor Supplement 10 | // - ELF Handling For Thread-Local Storage - VE Architecture 11 | // Processor Supplement 12 | 13 | ELF_RELOC(R_VE_NONE, 0) 14 | ELF_RELOC(R_VE_REFLONG, 1) 15 | ELF_RELOC(R_VE_REFQUAD, 2) 16 | ELF_RELOC(R_VE_SREL32, 3) 17 | ELF_RELOC(R_VE_HI32, 4) 18 | ELF_RELOC(R_VE_LO32, 5) 19 | ELF_RELOC(R_VE_PC_HI32, 6) 20 | ELF_RELOC(R_VE_PC_LO32, 7) 21 | ELF_RELOC(R_VE_GOT32, 8) 22 | ELF_RELOC(R_VE_GOT_HI32, 9) 23 | ELF_RELOC(R_VE_GOT_LO32, 10) 24 | ELF_RELOC(R_VE_GOTOFF32, 11) 25 | ELF_RELOC(R_VE_GOTOFF_HI32, 12) 26 | ELF_RELOC(R_VE_GOTOFF_LO32, 13) 27 | ELF_RELOC(R_VE_PLT32, 14) 28 | ELF_RELOC(R_VE_PLT_HI32, 15) 29 | ELF_RELOC(R_VE_PLT_LO32, 16) 30 | ELF_RELOC(R_VE_RELATIVE, 17) 31 | ELF_RELOC(R_VE_GLOB_DAT, 18) 32 | ELF_RELOC(R_VE_JUMP_SLOT, 19) 33 | ELF_RELOC(R_VE_COPY, 20) 34 | ELF_RELOC(R_VE_DTPMOD64, 22) 35 | ELF_RELOC(R_VE_DTPOFF64, 23) 36 | // ELF_RELOC(R_VE_TPOFF64, 24) 37 | ELF_RELOC(R_VE_TLS_GD_HI32, 25) 38 | ELF_RELOC(R_VE_TLS_GD_LO32, 26) 39 | // ELF_RELOC(R_VE_TLS_LD_HI32, 27) 40 | // ELF_RELOC(R_VE_TLS_LD_LO32, 28) 41 | // ELF_RELOC(R_VE_DTPOFF32, 29) 42 | // ELF_RELOC(R_VE_TLS_IE_HI32, 30) 43 | // ELF_RELOC(R_VE_TLS_IE_LO32, 31) 44 | ELF_RELOC(R_VE_TPOFF_HI32, 32) 45 | ELF_RELOC(R_VE_TPOFF_LO32, 33) 46 | // ELF_RELOC(R_VE_TPOFF32, 34) 47 | ELF_RELOC(R_VE_CALL_HI32, 35) 48 | ELF_RELOC(R_VE_CALL_LO32, 36) 49 | -------------------------------------------------------------------------------- /vendor/bela/include/hazel/details/ELFRelocs/AVR.def: -------------------------------------------------------------------------------- 1 | 2 | #ifndef ELF_RELOC 3 | #error "ELF_RELOC must be defined" 4 | #endif 5 | 6 | ELF_RELOC(R_AVR_NONE, 0) 7 | ELF_RELOC(R_AVR_32, 1) 8 | ELF_RELOC(R_AVR_7_PCREL, 2) 9 | ELF_RELOC(R_AVR_13_PCREL, 3) 10 | ELF_RELOC(R_AVR_16, 4) 11 | ELF_RELOC(R_AVR_16_PM, 5) 12 | ELF_RELOC(R_AVR_LO8_LDI, 6) 13 | ELF_RELOC(R_AVR_HI8_LDI, 7) 14 | ELF_RELOC(R_AVR_HH8_LDI, 8) 15 | ELF_RELOC(R_AVR_LO8_LDI_NEG, 9) 16 | ELF_RELOC(R_AVR_HI8_LDI_NEG, 10) 17 | ELF_RELOC(R_AVR_HH8_LDI_NEG, 11) 18 | ELF_RELOC(R_AVR_LO8_LDI_PM, 12) 19 | ELF_RELOC(R_AVR_HI8_LDI_PM, 13) 20 | ELF_RELOC(R_AVR_HH8_LDI_PM, 14) 21 | ELF_RELOC(R_AVR_LO8_LDI_PM_NEG, 15) 22 | ELF_RELOC(R_AVR_HI8_LDI_PM_NEG, 16) 23 | ELF_RELOC(R_AVR_HH8_LDI_PM_NEG, 17) 24 | ELF_RELOC(R_AVR_CALL, 18) 25 | ELF_RELOC(R_AVR_LDI, 19) 26 | ELF_RELOC(R_AVR_6, 20) 27 | ELF_RELOC(R_AVR_6_ADIW, 21) 28 | ELF_RELOC(R_AVR_MS8_LDI, 22) 29 | ELF_RELOC(R_AVR_MS8_LDI_NEG, 23) 30 | ELF_RELOC(R_AVR_LO8_LDI_GS, 24) 31 | ELF_RELOC(R_AVR_HI8_LDI_GS, 25) 32 | ELF_RELOC(R_AVR_8, 26) 33 | ELF_RELOC(R_AVR_8_LO8, 27) 34 | ELF_RELOC(R_AVR_8_HI8, 28) 35 | ELF_RELOC(R_AVR_8_HLO8, 29) 36 | ELF_RELOC(R_AVR_DIFF8, 30) 37 | ELF_RELOC(R_AVR_DIFF16, 31) 38 | ELF_RELOC(R_AVR_DIFF32, 32) 39 | ELF_RELOC(R_AVR_LDS_STS_16, 33) 40 | ELF_RELOC(R_AVR_PORT6, 34) 41 | ELF_RELOC(R_AVR_PORT5, 35) 42 | -------------------------------------------------------------------------------- /vendor/bela/utils/update-unicode/update_unicode.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | #See http://www.unicode.org/reports/tr44/ 3 | # 4 | #Me Enclosing_Mark an enclosing combining mark 5 | #Mn Nonspacing_Mark a nonspacing combining mark (zero advance width) 6 | #Cf Format a format control character 7 | # 8 | cd "$(dirname "$0")" || exit 9 | 10 | # RUNING under WSL 11 | 12 | UNICODEWIDTH_HPP=$(git rev-parse --show-toplevel)/include/bela/__unicode/unicode-width.hpp 13 | 14 | wget -N http://www.unicode.org/Public/UCD/latest/ucd/UnicodeData.txt \ 15 | http://www.unicode.org/Public/UCD/latest/ucd/EastAsianWidth.txt && 16 | if ! test -d uniset; then 17 | git clone git@github.com:depp/uniset.git && 18 | (cd uniset && git checkout 4b186196dd) 19 | fi && 20 | ( 21 | cd uniset && 22 | if ! test -x uniset; then 23 | autoreconf -i && 24 | ./configure --enable-warnings=-Werror CFLAGS='-O0 -ggdb' 25 | fi && 26 | make 27 | ) && 28 | UNICODE_DIR=. && export UNICODE_DIR && 29 | cat >"$UNICODEWIDTH_HPP" <<-EOF 30 | // ------------ codegen by update_unicode.sh ------------ 31 | // Code generated by update_unicode. DO NOT EDIT. 32 | 33 | namespace bela::unicode { 34 | 35 | struct interval { 36 | char32_t first; 37 | char32_t last; 38 | }; 39 | 40 | // clang-format off 41 | [[maybe_unused]] constexpr const interval zero_width[] = { 42 | $(uniset/uniset --32 cat:Me,Mn,Cf + U+1160..U+11FF - U+00AD) 43 | }; 44 | 45 | [[maybe_unused]] constexpr const interval double_width[] = { 46 | $(uniset/uniset --32 eaw:F,W) 47 | }; 48 | // clang-format on 49 | } 50 | EOF 51 | -------------------------------------------------------------------------------- /vendor/bela/test/winutils/envps.cc: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | int LinkToApp(wchar_t *env) { 6 | STARTUPINFOW si; 7 | PROCESS_INFORMATION pi; 8 | SecureZeroMemory(&si, sizeof(si)); 9 | SecureZeroMemory(&pi, sizeof(pi)); 10 | si.cb = sizeof(si); 11 | wchar_t cmd[256] = L"pwsh"; 12 | if (!CreateProcessW(nullptr, cmd, nullptr, nullptr, FALSE, CREATE_UNICODE_ENVIRONMENT, env, nullptr, &si, &pi)) { 13 | return -1; 14 | } 15 | CloseHandle(pi.hThread); 16 | SetConsoleCtrlHandler(nullptr, TRUE); 17 | WaitForSingleObject(pi.hProcess, INFINITE); 18 | SetConsoleCtrlHandler(nullptr, FALSE); 19 | DWORD exitCode; 20 | GetExitCodeProcess(pi.hProcess, &exitCode); 21 | CloseHandle(pi.hProcess); 22 | return exitCode; 23 | } 24 | 25 | int GoVersion(bela::env::Simulator *simulator) { 26 | bela::process::Process p(simulator); 27 | p.Execute(L"go", L"version"); 28 | return 0; 29 | } 30 | int CMDSet(bela::env::Simulator *simulator) { 31 | bela::process::Process p(simulator); 32 | p.Execute(L"cmd", L"/c", L"set"); 33 | return 0; 34 | } 35 | 36 | int wmain() { 37 | bela::env::Simulator simulator; 38 | simulator.InitializeCleanupEnv(); 39 | simulator.SetEnv(L"GOPROXY", L"https://goproxy.io/"); 40 | simulator.PathAppend(L"C:\\Go\\bin"); 41 | simulator.PathAppend(L"C:\\Go\\bin"); 42 | auto p = simulator.PathExpand(L"~/.ssh/id_ed25519.pub"); 43 | bela::FPrintF(stderr, L"[%s] Find ssh key: \x1b[32m%s\x1b[0m\n", simulator.GetEnv(L"USERPROFILE"), p); 44 | GoVersion(&simulator); 45 | CMDSet(&simulator); 46 | simulator.PathOrganize(); 47 | CMDSet(&simulator); 48 | // simulator.SetEnv(L"Path", L"C:/Dev"); 49 | auto envs = simulator.MakeEnv(); 50 | return LinkToApp(envs.data()); 51 | } -------------------------------------------------------------------------------- /vendor/bela/include/hazel/details/ELFRelocs/i386.def: -------------------------------------------------------------------------------- 1 | 2 | #ifndef ELF_RELOC 3 | #error "ELF_RELOC must be defined" 4 | #endif 5 | 6 | // TODO: this is just a subset 7 | ELF_RELOC(R_386_NONE, 0) 8 | ELF_RELOC(R_386_32, 1) 9 | ELF_RELOC(R_386_PC32, 2) 10 | ELF_RELOC(R_386_GOT32, 3) 11 | ELF_RELOC(R_386_PLT32, 4) 12 | ELF_RELOC(R_386_COPY, 5) 13 | ELF_RELOC(R_386_GLOB_DAT, 6) 14 | ELF_RELOC(R_386_JUMP_SLOT, 7) 15 | ELF_RELOC(R_386_RELATIVE, 8) 16 | ELF_RELOC(R_386_GOTOFF, 9) 17 | ELF_RELOC(R_386_GOTPC, 10) 18 | ELF_RELOC(R_386_32PLT, 11) 19 | ELF_RELOC(R_386_TLS_TPOFF, 14) 20 | ELF_RELOC(R_386_TLS_IE, 15) 21 | ELF_RELOC(R_386_TLS_GOTIE, 16) 22 | ELF_RELOC(R_386_TLS_LE, 17) 23 | ELF_RELOC(R_386_TLS_GD, 18) 24 | ELF_RELOC(R_386_TLS_LDM, 19) 25 | ELF_RELOC(R_386_16, 20) 26 | ELF_RELOC(R_386_PC16, 21) 27 | ELF_RELOC(R_386_8, 22) 28 | ELF_RELOC(R_386_PC8, 23) 29 | ELF_RELOC(R_386_TLS_GD_32, 24) 30 | ELF_RELOC(R_386_TLS_GD_PUSH, 25) 31 | ELF_RELOC(R_386_TLS_GD_CALL, 26) 32 | ELF_RELOC(R_386_TLS_GD_POP, 27) 33 | ELF_RELOC(R_386_TLS_LDM_32, 28) 34 | ELF_RELOC(R_386_TLS_LDM_PUSH, 29) 35 | ELF_RELOC(R_386_TLS_LDM_CALL, 30) 36 | ELF_RELOC(R_386_TLS_LDM_POP, 31) 37 | ELF_RELOC(R_386_TLS_LDO_32, 32) 38 | ELF_RELOC(R_386_TLS_IE_32, 33) 39 | ELF_RELOC(R_386_TLS_LE_32, 34) 40 | ELF_RELOC(R_386_TLS_DTPMOD32, 35) 41 | ELF_RELOC(R_386_TLS_DTPOFF32, 36) 42 | ELF_RELOC(R_386_TLS_TPOFF32, 37) 43 | ELF_RELOC(R_386_TLS_GOTDESC, 39) 44 | ELF_RELOC(R_386_TLS_DESC_CALL, 40) 45 | ELF_RELOC(R_386_TLS_DESC, 41) 46 | ELF_RELOC(R_386_IRELATIVE, 42) 47 | ELF_RELOC(R_386_GOT32X, 43) 48 | -------------------------------------------------------------------------------- /vendor/bela/include/bela/__charconv/tables.hpp: -------------------------------------------------------------------------------- 1 | // -*- C++ -*- 2 | //===----------------------------------------------------------------------===// 3 | // 4 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5 | // See https://llvm.org/LICENSE.txt for license information. 6 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7 | // 8 | //===----------------------------------------------------------------------===// 9 | 10 | #ifndef _BELA___CHARCONV_TABLES 11 | #define _BELA___CHARCONV_TABLES 12 | 13 | namespace bela::__itoa { 14 | 15 | constexpr wchar_t __digits_base_10[200] = { 16 | // clang-format off 17 | '0', '0', '0', '1', '0', '2', '0', '3', '0', '4', '0', '5', '0', '6', '0', '7', '0', '8', '0', '9', 18 | '1', '0', '1', '1', '1', '2', '1', '3', '1', '4', '1', '5', '1', '6', '1', '7', '1', '8', '1', '9', 19 | '2', '0', '2', '1', '2', '2', '2', '3', '2', '4', '2', '5', '2', '6', '2', '7', '2', '8', '2', '9', 20 | '3', '0', '3', '1', '3', '2', '3', '3', '3', '4', '3', '5', '3', '6', '3', '7', '3', '8', '3', '9', 21 | '4', '0', '4', '1', '4', '2', '4', '3', '4', '4', '4', '5', '4', '6', '4', '7', '4', '8', '4', '9', 22 | '5', '0', '5', '1', '5', '2', '5', '3', '5', '4', '5', '5', '5', '6', '5', '7', '5', '8', '5', '9', 23 | '6', '0', '6', '1', '6', '2', '6', '3', '6', '4', '6', '5', '6', '6', '6', '7', '6', '8', '6', '9', 24 | '7', '0', '7', '1', '7', '2', '7', '3', '7', '4', '7', '5', '7', '6', '7', '7', '7', '8', '7', '9', 25 | '8', '0', '8', '1', '8', '2', '8', '3', '8', '4', '8', '5', '8', '6', '8', '7', '8', '8', '8', '9', 26 | '9', '0', '9', '1', '9', '2', '9', '3', '9', '4', '9', '5', '9', '6', '9', '7', '9', '8', '9', '9'}; 27 | // clang-format on 28 | 29 | } // namespace bela::__itoa 30 | 31 | #endif // _LIBCPP___CHARCONV_TABLES -------------------------------------------------------------------------------- /AppExec/resource.h: -------------------------------------------------------------------------------- 1 | /// 2 | #ifndef RESOURCE_H 3 | #define RESOURCE_H 4 | #include "baseversion.h" 5 | #define IDI_APPLICATION_ICON 101 6 | #define IDD_APPLICATION_DIALOG 102 7 | 8 | #define IDM_APPEXEC_ABOUT 1000 9 | #define IDS_APPCONTAINER_NAME 1001 10 | #define IDE_APPCONTAINER_NAME 1002 11 | #define IDC_ENABLE_LPAC 1003 12 | #define IDS_ENABLE_LPAC 1004 13 | #define IDC_COMMAND_STATIC 1005 14 | #define IDC_COMMAND_EDIT 1006 15 | #define IDB_COMMAND_TARGET 1007 16 | #define IDB_EXECUTE_BUTTON 1008 17 | #define IDB_EXIT_BUTTON 1009 18 | #define IDS_APPSTARTUP 1010 19 | #define IDE_APPSTARTUP 1011 20 | #define IDB_APPSTARTUP 1012 21 | #define IDS_APPCONTAINER_ACL 1013 22 | #define IDE_APPCONTAINER_ACL 1014 23 | #define IDS_CAPABILITIES_LIST 1015 // recommended 24 | #define IDL_APPCONTAINER_LISTVIEW 1016 25 | #define IDE_APPEXEC_INFO 1017 26 | #define IDS_HELPMSG 1018 27 | #define IDL_APPEXEC_DESC 1019 28 | #define IDM_APPTHEME 1020 29 | 30 | #define IDB_APPX_IMPORT 1021 31 | 32 | #define CS_LISTVIEW WS_BORDER | WS_VSCROLL | WS_TABSTOP | LVS_REPORT | LVS_NOCOLUMNHEADER 33 | 34 | #define CS_BASE \ 35 | BS_PUSHBUTTON | BS_TEXT | BS_DEFPUSHBUTTON | BS_CHECKBOX | BS_AUTOCHECKBOX | WS_CHILD | \ 36 | WS_OVERLAPPED | WS_VISIBLE 37 | 38 | #define CS_EDIT \ 39 | ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN | ES_LEFT | WS_VSCROLL 40 | 41 | // Next default values for new objects 42 | // 43 | #ifdef APSTUDIO_INVOKED 44 | #ifndef APSTUDIO_READONLY_SYMBOLS 45 | #define _APS_NEXT_RESOURCE_VALUE 103 46 | #define _APS_NEXT_COMMAND_VALUE 40001 47 | #define _APS_NEXT_CONTROL_VALUE 1008 48 | #define _APS_NEXT_SYMED_VALUE 101 49 | #endif 50 | #endif 51 | 52 | #endif 53 | -------------------------------------------------------------------------------- /vendor/bela/test/winutils/expandenv.cc: -------------------------------------------------------------------------------- 1 | // 2 | #include 3 | #include 4 | 5 | std::wstring ExpandEnv2(std::wstring_view s) { 6 | auto N = ExpandEnvironmentStringsW(s.data(), nullptr, 0); 7 | if (N == 0) { 8 | return L""; 9 | } 10 | std::wstring buf; 11 | buf.resize(N); 12 | // If the function succeeds, the return value is the number of TCHARs stored 13 | // in the destination buffer, including the terminating null character. 14 | N = ExpandEnvironmentStringsW(s.data(), buf.data(), N); // Include 15 | buf.resize(N - 1); 16 | return buf; 17 | } 18 | 19 | int wmain() { 20 | const wchar_t *svv[] = { 21 | // 22 | L"%SystemRoot%\\System32\\cmd.exe", // Normal 23 | L"^%SystemRoot%\\System32\\cmd.exe", // Normal 24 | L"^%SystemRoot^%\\System32\\cmd.exe", // Normal 25 | L"%%SystemRoot%%\\System32\\cmd.exe", // TODO 26 | L"%%%SystemRoot%%\\System32\\cmd.exe", // TODO 27 | L"%%%SystemRoot%%%\\System32\\cmd.exe", // TODO 28 | L"%%%SystemRoot%%%\\System32\\cmd.exe;%COMPUTERNAME%", // TODO 29 | L"%NOTAENVNAME%someone", // NOT a env 30 | L"%%%%-----", // 31 | L"----------%-------------", // 32 | L"-----------------------%" 33 | // 34 | }; 35 | for (auto s : svv) { 36 | auto es = bela::WindowsExpandEnv(s); 37 | bela::FPrintF(stderr, L"[%s] Expand to [%s]\n", s, es); 38 | auto ss = bela::PathUnExpand(s); 39 | bela::FPrintF(stderr, L"PathUnExpand [%s]\n", ss); 40 | } 41 | auto ss = bela::PathUnExpand(L"%APPDATA%\\Microsoft\\WindowsApp\\wt.exe"); 42 | bela::FPrintF(stderr, L"PathUnExpand [%s]\n", ss); 43 | return 0; 44 | } -------------------------------------------------------------------------------- /vendor/bela/src/hazel/zip/decompress.cc: -------------------------------------------------------------------------------- 1 | /// 2 | #include "zipinternal.hpp" 3 | #include 4 | 5 | namespace hazel::zip { 6 | bool Reader::Decompress(const File &file, const Writer &w, bela::error_code &ec) const { 7 | auto realPosition = file.position + baseOffset; 8 | uint8_t buf[fileHeaderLen]; 9 | if (!fd.ReadAt(buf, realPosition, ec)) { 10 | return false; 11 | } 12 | bela::endian::LittenEndian b(buf); 13 | if (auto sig = b.Read(); sig != fileHeaderSignature) { 14 | ec = bela::make_error_code(L"zip: not a valid zip file"); 15 | return false; 16 | } 17 | b.Discard(22); 18 | auto filenameLen = static_cast(b.Read()); 19 | auto extraLen = static_cast(b.Read()); 20 | auto position = realPosition + fileHeaderLen + filenameLen + extraLen; 21 | if (!fd.Seek(position, ec)) { 22 | return false; 23 | } 24 | switch (file.method) { 25 | case ZIP_STORE: { 26 | uint8_t buffer[4096]; 27 | auto cSize = file.compressed_size; 28 | while (cSize != 0) { 29 | auto minsize = (std::min)(cSize, static_cast(sizeof(buffer))); 30 | if (!fd.ReadFull({buffer, static_cast(minsize)}, ec)) { 31 | return false; 32 | } 33 | if (!w(buffer, static_cast(minsize))) { 34 | return false; 35 | } 36 | cSize -= minsize; 37 | } 38 | 39 | } break; 40 | case ZIP_DEFLATE: 41 | break; 42 | case ZIP_DEFLATE64: 43 | break; 44 | case ZIP_ZSTD: 45 | break; 46 | case ZIP_LZMA2: 47 | break; 48 | case ZIP_PPMD: 49 | break; 50 | case ZIP_XZ: 51 | break; 52 | case ZIP_BZIP2: 53 | break; 54 | default: 55 | ec = bela::make_error_code(ErrGeneral, L"support zip method ", file.method); 56 | return false; 57 | } 58 | return true; 59 | } 60 | 61 | } // namespace hazel::zip -------------------------------------------------------------------------------- /wsudo/alias.hpp: -------------------------------------------------------------------------------- 1 | ///// 2 | #ifndef WSUDO_ALIAS_HPP 3 | #define WSUDO_ALIAS_HPP 4 | #pragma once 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | 12 | namespace wsudo { 13 | struct AliasTarget { 14 | std::wstring target; 15 | std::wstring desc; 16 | AliasTarget() = default; 17 | AliasTarget(std::wstring_view t, std::wstring_view d) : target(t), desc(d) {} 18 | AliasTarget(std::string_view t, std::string_view d) 19 | : target(bela::encode_into(t)), desc(bela::encode_into(d)) {} 20 | }; 21 | 22 | class AliasEngine { 23 | public: 24 | using value_type = gtl::flat_hash_map; 26 | AliasEngine() = default; 27 | AliasEngine(const AliasEngine &) = delete; 28 | AliasEngine &operator=(const AliasEngine &) = delete; 29 | ~AliasEngine(); 30 | bool Initialize(bool verbose = false); 31 | std::optional Target(std::wstring_view al); 32 | bool Set(std::wstring_view key, std::wstring_view target, std::wstring_view desc) { 33 | alias.insert_or_assign(key, AliasTarget(target, desc)); 34 | updated = true; 35 | return true; 36 | } 37 | bool Delete(std::wstring_view key) { 38 | auto it = alias.find(key); 39 | if (it == alias.end()) { 40 | return false; 41 | } 42 | alias.erase(key); 43 | updated = true; 44 | return true; 45 | } 46 | /// prevent apply 47 | void Prevent() { updated = false; } 48 | 49 | private: 50 | bool updated{false}; 51 | bool Apply(); 52 | value_type alias; 53 | }; 54 | int AliasSubcmd(const std::vector &argv); 55 | } // namespace wsudo 56 | 57 | #endif 58 | -------------------------------------------------------------------------------- /vendor/bela/src/hazel/hazel.cc: -------------------------------------------------------------------------------- 1 | // 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include "ina/hazelinc.hpp" 7 | 8 | namespace hazel { 9 | 10 | using lookup_handle_t = hazel::internal::status_t (*)(const bela::bytes_view &, hazel_result &); 11 | 12 | bool LookupBytes(const bela::bytes_view &bv, hazel_result &hr, bela::error_code & /*unused*/) { 13 | if (auto p = memchr(bv.data(), 0, bv.size()); p != nullptr) { 14 | hr.zeroPosition = static_cast(reinterpret_cast(p) - bv.data()); 15 | } 16 | 17 | constexpr lookup_handle_t handles[] = { 18 | hazel::internal::LookupExecutableFile, // 19 | hazel::internal::LookupArchives, // 7z ... 20 | hazel::internal::LookupDocs, 21 | hazel::internal::LookupFonts, // 22 | hazel::internal::LookupShellLink, // shortcut 23 | hazel::internal::LookupMedia, // media 24 | hazel::internal::LookupImages, // images 25 | hazel::internal::LookupText, 26 | }; 27 | for (auto h : handles) { 28 | if (h(bv, hr) == hazel::internal::Found) { 29 | return true; 30 | } 31 | } 32 | return false; 33 | } 34 | 35 | bool LookupFile(const bela::io::FD &fd, hazel_result &hr, bela::error_code &ec, int64_t offset) { 36 | if (hr.size_ = fd.Size(ec); hr.size_ == bela::SizeUnInitialized) { 37 | return false; 38 | } 39 | if (offset < 0 || hr.size_ < offset) { 40 | ec = bela::make_error_code(ErrGeneral, L"file offset over size"); 41 | return false; 42 | } 43 | uint8_t buffer[4096]; 44 | auto minSize = (std::min)(hr.size_ - offset, 4096LL); 45 | if (!fd.ReadAt({buffer, static_cast(minSize)}, offset, ec)) { 46 | return false; 47 | } 48 | bela::bytes_view bv(buffer, static_cast(minSize)); 49 | return LookupBytes(bv, hr, ec); 50 | } 51 | 52 | } // namespace hazel -------------------------------------------------------------------------------- /vendor/bela/src/belatime/clock.cc: -------------------------------------------------------------------------------- 1 | /// 2 | #include 3 | #include 4 | #include 5 | 6 | namespace bela { 7 | 8 | // GetCurrentTimeNanos 9 | int64_t GetCurrentTimeNanos() { 10 | using namespace std::chrono; 11 | return duration_cast(system_clock::now().time_since_epoch()).count(); 12 | } 13 | 14 | Time Now() { 15 | // TODO(bww): Get a timespec instead so we don't have to divide. 16 | int64_t n = bela::GetCurrentTimeNanos(); 17 | if (n >= 0) { 18 | return time_internal::FromUnixDuration(time_internal::MakeDuration(n / 1000000000, n % 1000000000 * 4)); 19 | } 20 | return time_internal::FromUnixDuration(bela::Nanoseconds(n)); 21 | } 22 | // Returns the maximum duration that SleepOnce() can sleep for. 23 | constexpr bela::Duration MaxSleep() { 24 | #ifdef _WIN32 25 | // Windows Sleep() takes unsigned long argument in milliseconds. 26 | return bela::Milliseconds((std::numeric_limits::max)()); // NOLINT(runtime/int) 27 | #else 28 | return bela::Seconds(std::numeric_limits::max()); 29 | #endif 30 | } 31 | 32 | // Sleeps for the given duration. 33 | // REQUIRES: to_sleep <= MaxSleep(). 34 | void SleepOnce(bela::Duration to_sleep) { 35 | #ifdef _WIN32 36 | Sleep(static_cast(to_sleep / bela::Milliseconds(1))); 37 | #else 38 | struct timespec sleep_time = bela::ToTimespec(to_sleep); 39 | while (nanosleep(&sleep_time, &sleep_time) != 0 && errno == EINTR) { 40 | // Ignore signals and wait for the full interval to elapse. 41 | } 42 | #endif 43 | } 44 | } // namespace bela 45 | 46 | extern "C" { 47 | 48 | BELA_ATTRIBUTE_WEAK void BelaInternalSleepFor(bela::Duration duration) { 49 | while (duration > bela::ZeroDuration()) { 50 | bela::Duration to_sleep = (std::min)(duration, bela::MaxSleep()); 51 | bela::SleepOnce(to_sleep); 52 | duration -= to_sleep; 53 | } 54 | } 55 | 56 | } // extern "C" -------------------------------------------------------------------------------- /vendor/bela/src/belahash/blake3/example_tbb.c: -------------------------------------------------------------------------------- 1 | #include "blake3.h" 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | 10 | int main(int argc, char **argv) { 11 | // For each filepath argument, memory map it and hash it. 12 | for (int i = 1; i < argc; i++) { 13 | // Open and memory map the file. 14 | int fd = open(argv[i], O_RDONLY); 15 | if (fd == -1) { 16 | fprintf(stderr, "open failed: %s\n", strerror(errno)); 17 | return 1; 18 | } 19 | struct stat statbuf; 20 | if (fstat(fd, &statbuf) == -1) { 21 | fprintf(stderr, "stat failed: %s\n", strerror(errno)); 22 | return 1; 23 | } 24 | void *mapped = mmap(NULL, statbuf.st_size, PROT_READ, MAP_PRIVATE, fd, 0); 25 | if (mapped == MAP_FAILED) { 26 | fprintf(stderr, "mmap failed: %s\n", strerror(errno)); 27 | return 1; 28 | } 29 | 30 | // Initialize the hasher. 31 | blake3_hasher hasher; 32 | blake3_hasher_init(&hasher); 33 | 34 | // Hash the mapped file using multiple threads. 35 | blake3_hasher_update_tbb(&hasher, mapped, statbuf.st_size); 36 | 37 | // Unmap and close the file. 38 | if (munmap(mapped, statbuf.st_size) == -1) { 39 | fprintf(stderr, "munmap failed: %s\n", strerror(errno)); 40 | return 1; 41 | } 42 | if (close(fd) == -1) { 43 | fprintf(stderr, "close failed: %s\n", strerror(errno)); 44 | return 1; 45 | } 46 | 47 | // Finalize the hash. BLAKE3_OUT_LEN is the default output length, 32 bytes. 48 | uint8_t output[BLAKE3_OUT_LEN]; 49 | blake3_hasher_finalize(&hasher, output, BLAKE3_OUT_LEN); 50 | 51 | // Print the hash as hexadecimal. 52 | for (size_t i = 0; i < BLAKE3_OUT_LEN; i++) { 53 | printf("%02x", output[i]); 54 | } 55 | printf("\n"); 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /wsudo/env.hpp: -------------------------------------------------------------------------------- 1 | #ifndef WSUDO_ENV_HPP 2 | #define WSUDO_ENV_HPP 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | namespace wsudo { 10 | 11 | class Derivator { 12 | public: 13 | using value_type = gtl::flat_hash_map; 15 | using apply_t = std::function; 16 | Derivator() = default; 17 | Derivator(const Derivator &) = delete; 18 | Derivator &operator=(const Derivator &) = delete; 19 | bool Append(std::wstring_view s) { 20 | auto pos = s.find(L'='); 21 | if (pos == std::wstring_view::npos) { 22 | em.insert_or_assign(s, std::wstring()); 23 | return true; 24 | } 25 | auto k = s.substr(0, pos); 26 | if (k.empty()) { 27 | return false; 28 | } 29 | auto v = s.substr(pos + 1); 30 | em.insert_or_assign(k, bela::WindowsExpandEnv(v)); 31 | return true; 32 | } 33 | // Normal 34 | bool IsAppend(std::wstring_view ws) { 35 | auto pos = ws.find(L'='); 36 | if (pos == std::wstring_view::npos || pos == 0) { 37 | return false; 38 | } 39 | auto k = ws.substr(0, pos); 40 | auto v = ws.substr(pos + 1); 41 | em.insert_or_assign(k, bela::WindowsExpandEnv(v)); 42 | return true; 43 | } 44 | bool Apply(apply_t fn) const { 45 | if (em.empty()) { 46 | return true; 47 | } 48 | for (const auto &e : em) { 49 | fn(e.first, e.second); /// callback 50 | SetEnvironmentVariableW(e.first.data(), e.second.empty() ? nullptr : e.second.data()); 51 | } 52 | return true; 53 | } 54 | const value_type &Items() const { return em; } 55 | 56 | private: 57 | value_type em; 58 | }; 59 | } // namespace wsudo 60 | 61 | #endif 62 | -------------------------------------------------------------------------------- /include/baseversion.h.cmake: -------------------------------------------------------------------------------- 1 | // Generate code by cmake, don't modify 2 | #ifndef PRIVEXEC_VERSION_H 3 | #define PRIVEXEC_VERSION_H 4 | 5 | #define PRIVEXEC_VERSION_MAJOR ${PRIVEXEC_VERSION_MAJOR} 6 | #define PRIVEXEC_VERSION_MINOR ${PRIVEXEC_VERSION_MINOR} 7 | #define PRIVEXEC_VERSION_PATCH ${PRIVEXEC_VERSION_PATCH} 8 | #define PRIVEXEC_VERSION_BUILD 0 9 | 10 | #define PRIVEXEC_VERSION L"${PRIVEXEC_VERSION_MAJOR}.${PRIVEXEC_VERSION_MINOR}.${PRIVEXEC_VERSION_PATCH}" 11 | #define PRIVEXEC_REVISION L"${PRIVEXEC_REVISION}" 12 | #define PRIVEXEC_REFNAME L"${PRIVEXEC_REFNAME}" 13 | #define PRIVEXEC_BUILD_TIME L"${PRIVEXEC_BUILD_TIME}" 14 | #define PRIVEXEC_REMOTE_URL L"${PRIVEXEC_REMOTE_URL}" 15 | 16 | #define PRIVEXEC_APPLINK \ 17 | L"For more information about this tool. \nVisit: Privexec\nVisit: forcemz.net" 21 | 22 | #define PRIVEXEC_APPLINKE \ 23 | L"Ask for help with this issue. \nVisit: Privexec " \ 25 | L"Issues" 26 | 27 | #define PRIVEXEC_APPVERSION \ 28 | L"Version: ${PRIVEXEC_VERSION_MAJOR}.${PRIVEXEC_VERSION_MINOR}.${PRIVEXEC_VERSION_PATCH}\nCopyright " \ 29 | L"\xA9 ${PRIVEXEC_COPYRIGHT_YEAR}, Privexec contributors." 30 | 31 | #define PRIVEXECUI_COPYRIGHT L"Copyright \xA9 ${PRIVEXEC_COPYRIGHT_YEAR}, Privexec contributors." 32 | 33 | #endif 34 | -------------------------------------------------------------------------------- /vendor/bela/include/hazel/details/ELFRelocs/x86_64.def: -------------------------------------------------------------------------------- 1 | 2 | #ifndef ELF_RELOC 3 | #error "ELF_RELOC must be defined" 4 | #endif 5 | 6 | ELF_RELOC(R_X86_64_NONE, 0) 7 | ELF_RELOC(R_X86_64_64, 1) 8 | ELF_RELOC(R_X86_64_PC32, 2) 9 | ELF_RELOC(R_X86_64_GOT32, 3) 10 | ELF_RELOC(R_X86_64_PLT32, 4) 11 | ELF_RELOC(R_X86_64_COPY, 5) 12 | ELF_RELOC(R_X86_64_GLOB_DAT, 6) 13 | ELF_RELOC(R_X86_64_JUMP_SLOT, 7) 14 | ELF_RELOC(R_X86_64_RELATIVE, 8) 15 | ELF_RELOC(R_X86_64_GOTPCREL, 9) 16 | ELF_RELOC(R_X86_64_32, 10) 17 | ELF_RELOC(R_X86_64_32S, 11) 18 | ELF_RELOC(R_X86_64_16, 12) 19 | ELF_RELOC(R_X86_64_PC16, 13) 20 | ELF_RELOC(R_X86_64_8, 14) 21 | ELF_RELOC(R_X86_64_PC8, 15) 22 | ELF_RELOC(R_X86_64_DTPMOD64, 16) 23 | ELF_RELOC(R_X86_64_DTPOFF64, 17) 24 | ELF_RELOC(R_X86_64_TPOFF64, 18) 25 | ELF_RELOC(R_X86_64_TLSGD, 19) 26 | ELF_RELOC(R_X86_64_TLSLD, 20) 27 | ELF_RELOC(R_X86_64_DTPOFF32, 21) 28 | ELF_RELOC(R_X86_64_GOTTPOFF, 22) 29 | ELF_RELOC(R_X86_64_TPOFF32, 23) 30 | ELF_RELOC(R_X86_64_PC64, 24) 31 | ELF_RELOC(R_X86_64_GOTOFF64, 25) 32 | ELF_RELOC(R_X86_64_GOTPC32, 26) 33 | ELF_RELOC(R_X86_64_GOT64, 27) 34 | ELF_RELOC(R_X86_64_GOTPCREL64, 28) 35 | ELF_RELOC(R_X86_64_GOTPC64, 29) 36 | ELF_RELOC(R_X86_64_GOTPLT64, 30) 37 | ELF_RELOC(R_X86_64_PLTOFF64, 31) 38 | ELF_RELOC(R_X86_64_SIZE32, 32) 39 | ELF_RELOC(R_X86_64_SIZE64, 33) 40 | ELF_RELOC(R_X86_64_GOTPC32_TLSDESC, 34) 41 | ELF_RELOC(R_X86_64_TLSDESC_CALL, 35) 42 | ELF_RELOC(R_X86_64_TLSDESC, 36) 43 | ELF_RELOC(R_X86_64_IRELATIVE, 37) 44 | ELF_RELOC(R_X86_64_GOTPCRELX, 41) 45 | ELF_RELOC(R_X86_64_REX_GOTPCRELX, 42) 46 | ELF_RELOC(R_X86_64_CODE_4_GOTPCRELX, 43) 47 | ELF_RELOC(R_X86_64_CODE_4_GOTTPOFF, 44) 48 | ELF_RELOC(R_X86_64_CODE_4_GOTPC32_TLSDESC, 45) 49 | ELF_RELOC(R_X86_64_CODE_6_GOTTPOFF, 50) 50 | -------------------------------------------------------------------------------- /vendor/bela/src/belatime/dos.cc: -------------------------------------------------------------------------------- 1 | /// 2 | #include 3 | #include 4 | 5 | namespace bela { 6 | 7 | constexpr int WindowsEpochDays = ((1601 - 1) * 365) + ((1601 - 1) / 4) - ((1601 - 1) / 100) + ((1601 - 1) / 400); 8 | constexpr int64_t UnixEpochStart = 11644473600LL; 9 | 10 | constexpr uint64_t Win_ticks_per_second = 10000000ULL; 11 | constexpr uint64_t Win_ticks_from_epoch = ((1970 - 1601) * 365 + 3 * 24 + 17) * 86400ULL * Win_ticks_per_second; 12 | 13 | constexpr bool IsLeapYear(int Y) { return Y % 4 == 0 && (Y % 100 != 0 || Y % 400 == 0); } 14 | constexpr int sinceWindowsEpochDays(int Y) { 15 | Y--; 16 | return (Y * 365) + (Y / 4) - (Y / 100) + (Y / 400) - WindowsEpochDays; 17 | } 18 | // FromDosDateTime dos time to bela::Time 19 | // https://msdn.microsoft.com/en-us/library/ms724247(v=VS.85).aspx 20 | // Windows Epoch start 1601 21 | bela::Time FromDosDateTime(uint16_t dosDate, uint16_t dosTime) { 22 | auto year = (static_cast(dosDate) >> 9) + 1980; 23 | auto mon = ((dosDate >> 5) & 0xf); 24 | auto day = static_cast(dosDate & 0x1f); 25 | auto hour = static_cast(dosTime) >> 11; 26 | auto minute = ((dosTime >> 5) & 0x3f); 27 | auto sec = static_cast(dosTime & 0x1f) << 1; 28 | if (sec < 0 || sec > 59 || minute > 59 || minute < 0 || hour < 0 || hour > 23 || mon < 1 || mon > 12 || year < 1601) { 29 | return bela::UnixEpoch(); 30 | } 31 | auto leapYear = IsLeapYear(year); 32 | auto mondays = leapYear ? time_internal::LeapMonths[mon - 1] : time_internal::Months[mon - 1]; 33 | if (day < 1 || day > mondays) { 34 | return bela::UnixEpoch(); 35 | } 36 | auto days = sinceWindowsEpochDays(year); 37 | for (auto i = 1; i < mon; i++) { 38 | days += time_internal::Months[i - 1]; 39 | } 40 | if (mon > 2 && leapYear) { 41 | days++; 42 | } 43 | days += day - 1; 44 | return bela::FromUnixSeconds((days * secondsPerDay) + (hour * 3600) + (minute * 60) + sec - UnixEpochStart); 45 | } 46 | } // namespace bela -------------------------------------------------------------------------------- /vendor/bela/src/hazel/ina/font.cc: -------------------------------------------------------------------------------- 1 | ////////////// FONT resolve 2 | #include "hazelinc.hpp" 3 | 4 | namespace hazel::internal { 5 | 6 | inline bool IsEot(const bela::bytes_view &bv) { 7 | return bv.size() > 35 && bv[34] == 0x4C && bv[35] == 0x50 && 8 | ((bv[8] == 0x02 && bv[9] == 0x00 && bv[10] == 0x01) || (bv[8] == 0x01 && bv[9] == 0x00 && bv[10] == 0x00) || 9 | (bv[8] == 0x02 && bv[9] == 0x00 && bv[10] == 0x02)); 10 | } 11 | 12 | status_t LookupFonts(const bela::bytes_view &bv, hazel_result &hr) { 13 | switch (bv[0]) { 14 | case 0x00: 15 | if (bv.size() > 4 && bv[1] == 0x01 && bv[2] == 0x00 && bv[3] == 0x00 && bv[4] == 0x00) { 16 | // https://en.wikipedia.org/wiki/TrueType 17 | hr.assign(types::ttf, L"TrueType Font"); 18 | return Found; 19 | } 20 | break; 21 | case 0x4F: 22 | if (bv.size() > 4 && bv[1] == 0x54 && bv[2] == 0x54 && bv[3] == 0x4F && bv[4] == 0x00) { 23 | // https://en.wikipedia.org/wiki/OpenType 24 | hr.assign(types::otf, L"OpenType Font"); 25 | return Found; 26 | } 27 | break; 28 | case 0x77: 29 | if (bv.size() <= 7) { 30 | break; 31 | } 32 | if (bv[1] == 0x4F && bv[2] == 0x46 && bv[3] == 0x46 && bv[4] == 0x00 && bv[5] == 0x01 && bv[6] == 0x00 && 33 | bv[7] == 0x00) { 34 | // https://en.wikipedia.org/wiki/Web_Open_Font_Format 35 | hr.assign(types::woff, L"Web Open Font Format"); 36 | return Found; 37 | } 38 | if (bv[1] == 0x4F && bv[2] == 0x46 && bv[3] == 0x32 && bv[4] == 0x00 && bv[5] == 0x01 && bv[6] == 0x00 && 39 | bv[7] == 0x00) { 40 | // https://en.wikipedia.org/wiki/Web_Open_Font_Format 41 | hr.assign(types::woff2, L"Web Open Font Format 2.0"); 42 | return Found; 43 | } 44 | break; 45 | default: 46 | break; 47 | } 48 | if (IsEot(bv)) { 49 | hr.assign(types::eot, L"Embedded OpenType (EOT) fonts"); 50 | return Found; 51 | } 52 | return None; 53 | } 54 | } // namespace hazel::internal -------------------------------------------------------------------------------- /vendor/bela/src/hazel/ina/docs.cc: -------------------------------------------------------------------------------- 1 | ////////////// 2 | #include "hazelinc.hpp" 3 | #include "docs.hpp" 4 | #include 5 | #include 6 | 7 | namespace hazel::internal { 8 | 9 | // RTF format 10 | // https://en.wikipedia.org/wiki/Rich_Text_Format 11 | /*{\rtf1*/ 12 | status_t lookup_rtfinternal(const bela::bytes_view &bv, hazel_result &hr) { 13 | constexpr uint8_t rtfMagic[] = {0x7B, 0x5C, 0x72, 0x74, 0x66}; 14 | if (!bv.starts_bytes_with(rtfMagic) || bv.size() < 6) { 15 | return None; 16 | } 17 | // {\rtf1 18 | auto sv = bv.make_string_view(5); 19 | int version = 0; 20 | if (auto result = std::from_chars(sv.data(), sv.data() + sv.size(), version); result.ec != std::errc{}) { 21 | return None; 22 | } 23 | hr.assign(types::rtf, L"Rich Text Format"); 24 | hr.append(L"Version", version); 25 | return Found; 26 | } 27 | 28 | // https://en.wikipedia.org/wiki/Compound_File_Binary_Format 29 | // http://www.openoffice.org/sc/compdocfileformat.pdf 30 | // https://interoperability.blob.core.windows.net/files/MS-PPT/[MS-PPT].pdf 31 | 32 | status_t LookupDocs(const bela::bytes_view &bv, hazel_result &hr) { 33 | constexpr const uint8_t msoleMagic[] = {0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1}; 34 | if (lookup_rtfinternal(bv, hr) == Found) { 35 | return Found; 36 | } 37 | constexpr const auto olesize = sizeof(oleheader_t); 38 | if (!bv.starts_bytes_with(msoleMagic) || bv.size() < 520) { 39 | return None; 40 | } 41 | if (bv[512] == 0xEC && bv[513] == 0xA5) { 42 | hr.assign(types::doc, L"Microsoft Word 97-2003"); 43 | return Found; 44 | } 45 | if (bv[512] == 0x09 && bv[513] == 0x08) { 46 | hr.assign(types::doc, L"Microsoft Excel 97-2003"); 47 | return Found; 48 | } 49 | if (bv[512] == 0xA0 && bv[513] == 0x46) { 50 | hr.assign(types::doc, L"Microsoft PowerPoint 97-2003"); 51 | return Found; 52 | } 53 | hr.assign(types::msi, L"Windows Installer packages"); 54 | return Found; 55 | } 56 | } // namespace hazel::internal 57 | -------------------------------------------------------------------------------- /vendor/bela/include/hazel/fs.hpp: -------------------------------------------------------------------------------- 1 | /// 2 | #ifndef HAZEL_FS_HPP 3 | #define HAZEL_FS_HPP 4 | #include 5 | #include 6 | 7 | namespace hazel::fs { 8 | typedef enum reparse_point_e : unsigned long { 9 | MOUNT_POINT = 0xA0000003, 10 | HSM = 0xC0000004, 11 | DRIVE_EXTENDER = 0x80000005, 12 | HSM2 = 0x80000006, 13 | SIS = 0x80000007, 14 | WIM = 0x80000008, 15 | CSV = 0x80000009, 16 | DFS = 0x8000000A, 17 | FILTER_MANAGER = 0x8000000B, 18 | SYMLINK = 0xA000000C, 19 | IIS_CACHE = 0xA0000010, 20 | DFSR = 0x80000012, 21 | DEDUP = 0x80000013, 22 | APPXSTRM = 0xC0000014, 23 | NFS = 0x80000014, 24 | FILE_PLACEHOLDER = 0x80000015, 25 | DFM = 0x80000016, 26 | WOF = 0x80000017, 27 | WCI = 0x80000018, 28 | WCI_1 = 0x90001018, 29 | GLOBAL_REPARSE = 0xA0000019, 30 | CLOUD = 0x9000001A, 31 | CLOUD_1 = 0x9000101A, 32 | CLOUD_2 = 0x9000201A, 33 | CLOUD_3 = 0x9000301A, 34 | CLOUD_4 = 0x9000401A, 35 | CLOUD_5 = 0x9000501A, 36 | CLOUD_6 = 0x9000601A, 37 | CLOUD_7 = 0x9000701A, 38 | CLOUD_8 = 0x9000801A, 39 | CLOUD_9 = 0x9000901A, 40 | CLOUD_A = 0x9000A01A, 41 | CLOUD_B = 0x9000B01A, 42 | CLOUD_C = 0x9000C01A, 43 | CLOUD_D = 0x9000D01A, 44 | CLOUD_E = 0x9000E01A, 45 | CLOUD_F = 0x9000F01A, 46 | CLOUD_MASK = 0x0000F000, 47 | APPEXECLINK = 0x8000001B, 48 | PROJFS = 0x9000001C, 49 | LX_SYMLINK = 0xA000001D, 50 | STORAGE_SYNC = 0x8000001E, 51 | WCI_TOMBSTONE = 0xA000001F, 52 | UNHANDLED = 0x80000020, 53 | ONEDRIVE = 0x80000021, 54 | PROJFS_TOMBSTONE = 0xA0000022, 55 | AF_UNIX = 0x80000023, 56 | LX_FIFO = 0x80000024, 57 | LX_CHR = 0x80000025, 58 | LX_BLK = 0x80000026, 59 | WCI_LINK = 0xA0000027, 60 | WCI_LINK_1 = 0xA0001027, 61 | } reparse_point_t; 62 | 63 | struct FileReparsePoint { 64 | gtl::flat_hash_map attributes; 65 | reparse_point_t type; 66 | }; 67 | 68 | bool LookupReparsePoint(std::wstring_view file, FileReparsePoint &frp, bela::error_code &ec); 69 | 70 | } // namespace hazel::fs 71 | 72 | #endif -------------------------------------------------------------------------------- /vendor/bela/src/belawin/pe/section.cc: -------------------------------------------------------------------------------- 1 | // 2 | #include "internal.hpp" 3 | #include 4 | 5 | namespace bela::pe { 6 | 7 | std::string File::sectionFullName(SectionHeader32 &sh) const { 8 | if (sh.Name[0] != '/') { 9 | return std::string(bela::cstring_view(sh.Name)); 10 | } 11 | auto slen = bela::cstring_view({sh.Name + 1, sizeof(sh.Name) - 1}); 12 | uint32_t offset = 0; 13 | if (auto result = std::from_chars(slen.data(), slen.data() + slen.size(), offset); result.ec != std::errc{}) { 14 | return ""; 15 | } 16 | bela::error_code ec; 17 | return std::string(stringTable.make_cstring_view(bela::fromle(offset), ec)); 18 | } 19 | 20 | bool File::readRelocs(Section &sec) const { 21 | if (sec.NumberOfRelocations == 0) { 22 | return true; 23 | } 24 | bela::error_code ec; 25 | sec.Relocs.resize(sec.NumberOfRelocations); 26 | if (!fd.ReadAt(sec.Relocs, sec.PointerToRelocations, ec)) { 27 | return false; 28 | } 29 | if constexpr (bela::IsBigEndian()) { 30 | for (auto &reloc : sec.Relocs) { 31 | reloc.VirtualAddress = bela::fromle(reloc.VirtualAddress); 32 | reloc.SymbolTableIndex = bela::fromle(reloc.SymbolTableIndex); 33 | reloc.Type = bela::fromle(reloc.Type); 34 | } 35 | } 36 | return true; 37 | } 38 | std::optional File::readSectionData(const Section &sec, bela::error_code &ec) const { 39 | if (sec.Size == 0) { 40 | return std::make_optional(); 41 | } 42 | if (bela::narrow_cast(sec.Offset + sec.Size) > size) { 43 | ec = bela::make_error_code(bela::ErrFileTooSmall, L"corrupted PE file, section overflow file: ", size, 44 | L" section end: ", sec.Offset + sec.Size); 45 | return false; 46 | } 47 | Buffer buffer(sec.Size); 48 | if (!fd.ReadAt(buffer, sec.Size, sec.Offset, ec)) { 49 | ec = bela::make_error_code(ec.code, L"unable read section data: ", ec.message); 50 | return std::nullopt; 51 | } 52 | return std::make_optional(std::move(buffer)); 53 | } 54 | } // namespace bela::pe -------------------------------------------------------------------------------- /vendor/bela/test/fmt/unicode-width.cc: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | namespace mock { 6 | bool bisearch(char32_t rune, const bela::unicode::interval *table, size_t max) { 7 | size_t min = 0; 8 | size_t mid; 9 | if (rune < table[0].first || rune > table[max].last) { 10 | return false; 11 | } 12 | while (max >= min) { 13 | mid = (min + max) / 2; 14 | if (rune > table[mid].last) { 15 | min = mid + 1; 16 | continue; 17 | } 18 | if (rune < table[mid].first) { 19 | max = mid - 1; 20 | continue; 21 | } 22 | return true; 23 | } 24 | return false; 25 | } 26 | 27 | size_t rune_width(char32_t rune) { 28 | // control characters we return 0; 29 | if (rune == 0 || rune > 0x10FFFF || rune < 32 || (rune >= 0x7F && rune < 0xa0)) { 30 | return 0; 31 | } 32 | if (bisearch(rune, bela::unicode::zero_width, std::size(bela::unicode::zero_width) - 1)) { 33 | return 0; 34 | } 35 | if (bisearch(rune, bela::unicode::double_width, std::size(bela::unicode::double_width) - 1)) { 36 | return 2; 37 | } 38 | return 1; 39 | } 40 | } // namespace mock 41 | 42 | int wmain() { 43 | constexpr char32_t em = 0x1F603; // 😃 U+1F603 44 | constexpr char32_t sh = 0x1F496; // 💖 45 | constexpr char32_t blueheart = U'💙'; //💙 46 | constexpr char32_t se = 0x1F92A; //🤪 47 | constexpr char32_t em2 = U'中'; 48 | constexpr char32_t hammerandwrench = 0x1F6E0; 49 | bela::FPrintF(stderr, L"Unicode %c Width: %d \u2600 %d 中 %d ©: %d [%c] %d [%c] %d \n", em, mock::rune_width(em), 50 | mock::rune_width(0x2600), mock::rune_width(L'中'), mock::rune_width(0xA9), 161, mock::rune_width(161), 51 | hammerandwrench, mock::rune_width(hammerandwrench)); 52 | constexpr char32_t codes[] = {0x1F603, 0x1F496, U'💙', 0x1F92A, 0x1FA75, 0x1FABB, 0x1FAF6, U'✅'}; 53 | for (const auto c : codes) { 54 | bela::FPrintF(stderr, L"%v width: %d\n", c, mock::rune_width(c)); 55 | } 56 | } -------------------------------------------------------------------------------- /vendor/bela/src/belawin/pe/rva.cc: -------------------------------------------------------------------------------- 1 | // 2 | #include "internal.hpp" 3 | 4 | namespace bela::pe { 5 | // https://docs.microsoft.com/en-us/windows/desktop/Debug/pe-format 6 | // PE32+ executable (console) x86-64, for MS Windows 7 | // PE32 executable (DLL) (console) Intel 80386 Mono/.Net assembly, for MS 8 | // Windows PE32 executable (console) Intel 80386, for MS Windows file command 9 | // not support check arm and arm64 10 | // Not depend DebHelp.dll 11 | // LE endian 12 | [[maybe_unused]] inline PVOID belarva(PVOID m, PVOID b) { 13 | return reinterpret_cast(reinterpret_cast(b) + reinterpret_cast(m)); 14 | } 15 | 16 | PIMAGE_SECTION_HEADER 17 | BelaImageRvaToSection(PIMAGE_NT_HEADERS nh, PVOID BaseAddress, ULONG rva) { 18 | (void)BaseAddress; 19 | ULONG count = bela::fromle(nh->FileHeader.NumberOfSections); 20 | PIMAGE_SECTION_HEADER section = IMAGE_FIRST_SECTION(nh); 21 | ULONG va = 0; 22 | while (count-- != 0) { 23 | va = bela::fromle(section->VirtualAddress); 24 | if ((va <= rva) && (rva < va + bela::fromle(section->SizeOfRawData))) { 25 | return section; 26 | } 27 | section++; 28 | } 29 | return nullptr; 30 | } 31 | 32 | // like RtlImageRvaToVa 33 | PVOID 34 | BelaImageRvaToVa(PIMAGE_NT_HEADERS nh, PVOID BaseAddress, ULONG rva, PIMAGE_SECTION_HEADER *sh) { 35 | PIMAGE_SECTION_HEADER section = nullptr; 36 | if (sh != nullptr) { 37 | section = *sh; 38 | } 39 | if ((section == nullptr) || (rva < bela::fromle(section->VirtualAddress)) || 40 | (rva >= bela::fromle(section->VirtualAddress) + bela::fromle(section->SizeOfRawData))) { 41 | section = BelaImageRvaToSection(nh, BaseAddress, rva); 42 | if (section == nullptr) { 43 | return nullptr; 44 | } 45 | if (sh != nullptr) { 46 | *sh = section; 47 | } 48 | } 49 | auto va = reinterpret_cast(BaseAddress) + rva + 50 | static_cast(bela::fromle(section->PointerToRawData)) - 51 | static_cast(bela::fromle(section->VirtualAddress)); 52 | return reinterpret_cast(va); 53 | } 54 | 55 | } // namespace bela::pe -------------------------------------------------------------------------------- /vendor/bela/include/bela/escaping.hpp: -------------------------------------------------------------------------------- 1 | // --------------------------------------------------------------------------- 2 | // Copyright © 2025, Bela contributors 3 | // 4 | // Licensed under the Apache License, Version 2.0 (the "License"); 5 | // you may not use this file except in compliance with the License. 6 | // You may obtain a copy of the License at 7 | // 8 | // https://www.apache.org/licenses/LICENSE-2.0 9 | // 10 | // Unless required by applicable law or agreed to in writing, software 11 | // distributed under the License is distributed on an "AS IS" BASIS, 12 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | // See the License for the specific language governing permissions and 14 | // limitations under the License. 15 | // 16 | // Includes work from abseil-cpp (https://github.com/abseil/abseil-cpp) 17 | // with modifications. 18 | // 19 | // Copyright 2019 The Abseil Authors. 20 | // 21 | // Licensed under the Apache License, Version 2.0 (the "License"); 22 | // you may not use this file except in compliance with the License. 23 | // You may obtain a copy of the License at 24 | // 25 | // https://www.apache.org/licenses/LICENSE-2.0 26 | // 27 | // Unless required by applicable law or agreed to in writing, software 28 | // distributed under the License is distributed on an "AS IS" BASIS, 29 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 30 | // See the License for the specific language governing permissions and 31 | // limitations under the License. 32 | // --------------------------------------------------------------------------- 33 | #ifndef BELA_ESCAPING_HPP 34 | #define BELA_ESCAPING_HPP 35 | #include 36 | #include 37 | #include 38 | #include 39 | 40 | namespace bela { 41 | bool CUnescape(std::wstring_view source, std::wstring *dest, std::wstring *error); 42 | 43 | // Overload of `CUnescape()` with no error reporting. 44 | inline bool CUnescape(std::wstring_view source, std::wstring *dest) { return CUnescape(source, dest, nullptr); } 45 | std::wstring CEscape(std::wstring_view src); 46 | } // namespace bela 47 | 48 | #endif 49 | -------------------------------------------------------------------------------- /vendor/bela/src/belahash/blake3/CMakePresets.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "cmakeMinimumRequired": { 4 | "major": 3, 5 | "minor": 22, 6 | "patch": 0 7 | }, 8 | "configurePresets": [ 9 | { 10 | "name": "base", 11 | "hidden": true, 12 | "binaryDir": "${sourceDir}/build/${presetName}" 13 | }, 14 | { 15 | "name": "msvc", 16 | "hidden": true, 17 | "generator": "Visual Studio 17 2022", 18 | "vendor": { 19 | "microsoft.com/VisualStudioSettings/CMake/1.0": { 20 | "hostOS": [ 21 | "Windows" 22 | ] 23 | } 24 | } 25 | }, 26 | { 27 | "name": "x64-windows-msvc", 28 | "inherits": [ 29 | "msvc", 30 | "base" 31 | ], 32 | "architecture": "x64" 33 | }, 34 | { 35 | "name": "x86-windows-msvc", 36 | "inherits": [ 37 | "msvc", 38 | "base" 39 | ], 40 | "architecture": "Win32" 41 | }, 42 | { 43 | "name": "arm64-windows-msvc", 44 | "inherits": [ 45 | "msvc", 46 | "base" 47 | ], 48 | "architecture": "ARM64" 49 | } 50 | ], 51 | "buildPresets": [ 52 | { 53 | "name": "x64-windows-msvc-debug", 54 | "configurePreset": "x64-windows-msvc", 55 | "configuration": "Debug" 56 | }, 57 | { 58 | "name": "x64-windows-msvc-release", 59 | "configurePreset": "x64-windows-msvc", 60 | "configuration": "RelWithDebInfo" 61 | }, 62 | { 63 | "name": "x86-windows-msvc-debug", 64 | "configurePreset": "x86-windows-msvc", 65 | "configuration": "Debug" 66 | }, 67 | { 68 | "name": "x86-windows-msvc-release", 69 | "configurePreset": "x86-windows-msvc", 70 | "configuration": "RelWithDebInfo" 71 | } 72 | ] 73 | } -------------------------------------------------------------------------------- /lib/exec/execinternal.hpp: -------------------------------------------------------------------------------- 1 | /// 2 | #ifndef WSUDO_EXE_INTERNAL_HPP 3 | #define WSUDO_EXE_INTERNAL_HPP 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include "exec.hpp" 11 | 12 | namespace wsudo::exec { 13 | 14 | inline void FreeToken(HANDLE &hToken) { 15 | if (hToken != INVALID_HANDLE_VALUE) { 16 | CloseHandle(hToken); 17 | hToken = INVALID_HANDLE_VALUE; 18 | } 19 | } 20 | struct privilege_entries { 21 | template privilege_entries(Args... a) { entries = std::initializer_list{a...}; } 22 | std::vector entries; 23 | std::wstring format() const { 24 | auto sz = entries.size(); 25 | std::wstring s = L"["; 26 | for (size_t i = 0; i < sz; i++) { 27 | bela::StrAppend(&s, L"\"", entries[i], L"\""); 28 | if (i != sz - 1) { 29 | bela::StrAppend(&s, L", "); 30 | } 31 | } 32 | bela::StrAppend(&s, L"]"); 33 | return s; 34 | } 35 | }; 36 | 37 | bool GetCurrentSessionToken(PHANDLE hNewToken, bela::error_code &ec); 38 | bool GetCurrentSessionId(DWORD &dwSessionId); 39 | 40 | // System process elavator 41 | class Elavator { 42 | public: 43 | Elavator() = default; 44 | Elavator(const Elavator &) = delete; 45 | Elavator &operator=(const Elavator &) = delete; 46 | ~Elavator() { FreeToken(hToken); } 47 | // System Process PID 48 | DWORD SystemPID() const { return systemProcessId; } 49 | // Session ID 50 | DWORD SessionID() const { return currentSessionId; } 51 | bool ImpersonationSystemPrivilege(const privilege_entries *pv, bela::error_code &ec); 52 | 53 | private: 54 | bool impersonation_system_token(bela::error_code &ec); 55 | HANDLE hToken{nullptr}; 56 | DWORD currentSessionId{0}; 57 | // system process id 58 | DWORD systemProcessId{0}; 59 | }; 60 | bool execute_basic(command &cmd, bela::error_code &ec); 61 | bool execute_with_ti(command &cmd, bela::error_code &ec); 62 | bool execute_with_system(command &cmd, bela::error_code &ec); 63 | bool execute_with_token(command &cmd, HANDLE hToken, bool desktop, LPVOID lpEnvironment, bela::error_code &ec); 64 | } // namespace wsudo::exec 65 | 66 | #endif -------------------------------------------------------------------------------- /vendor/bela/include/bela/process.hpp: -------------------------------------------------------------------------------- 1 | // bela::process type 2 | #ifndef BELA_PROCESS_HPP 3 | #define BELA_PROCESS_HPP 4 | #include "base.hpp" 5 | #include "escapeargv.hpp" 6 | #include "simulator.hpp" 7 | 8 | namespace bela::process { 9 | constexpr const wchar_t *string_nullable(std::wstring_view str) { return str.empty() ? nullptr : str.data(); } 10 | constexpr wchar_t *string_nullable(std::wstring &str) { return str.empty() ? nullptr : str.data(); } 11 | 12 | enum CaptureMode : DWORD { 13 | CAPTURE_OUT = 0, // default 14 | CAPTURE_ERR = 0x1, 15 | CAPTURE_USEIN = 0x2, 16 | CAPTURE_USEERR = 0x4, 17 | }; 18 | using bela::env::Simulator; 19 | class Process { 20 | public: 21 | Process(const Simulator *simulator_ = nullptr) : simulator(simulator_) {} 22 | Process(const Process &) = delete; 23 | Process &operator=(const Process &) = delete; 24 | Process &Chdir(std::wstring_view dir) { 25 | cwd = dir; 26 | return *this; 27 | } 28 | const bela::error_code &ErrorCode() const { return ec; } 29 | const DWORD ExitCode() const { return exitcode; } 30 | std::string_view Out() const { return out; } // when call Capture 31 | template int Execute(std::wstring_view cmd, const Args &...args) { 32 | bela::EscapeArgv ea(cmd, args...); 33 | exitcode = ExecuteInternal(cmd, ea.data()); 34 | return exitcode; 35 | } 36 | template int Capture(std::wstring_view cmd, const Args &...args) { 37 | bela::EscapeArgv ea(cmd, args...); 38 | exitcode = CaptureInternal(cmd, ea.data(), CAPTURE_OUT); 39 | return exitcode; 40 | } 41 | template int CaptureWithMode(DWORD flags, std::wstring_view cmd, const Args &...args) { 42 | bela::EscapeArgv ea(cmd, args...); 43 | exitcode = CaptureInternal(cmd, ea.data(), flags); 44 | return exitcode; 45 | } 46 | 47 | private: 48 | int ExecuteInternal(std::wstring_view file, wchar_t *cmdline); 49 | int CaptureInternal(std::wstring_view file, wchar_t *cmdline, DWORD flags); 50 | const Simulator *simulator{nullptr}; 51 | std::wstring cwd; 52 | std::string out; 53 | bela::error_code ec; 54 | DWORD pid{0}; 55 | DWORD exitcode{0}; 56 | }; 57 | } // namespace bela::process 58 | 59 | #endif -------------------------------------------------------------------------------- /vendor/bela/test/binview/elfview.cc: -------------------------------------------------------------------------------- 1 | /// 2 | #include 3 | #include 4 | #include 5 | 6 | int wmain(int argc, wchar_t **argv) { 7 | if (argc < 2) { 8 | bela::FPrintF(stderr, L"usage: %s elf-file\n", argv[0]); 9 | return 1; 10 | } 11 | hazel::elf::File file; 12 | bela::error_code ec; 13 | if (!file.NewFile(argv[1], ec)) { 14 | bela::FPrintF(stderr, L"parse elf file %s error: %s\n", argv[1], ec); 15 | return 1; 16 | } 17 | for (const auto &s : file.Sections()) { 18 | bela::FPrintF(stdout, L"%s: %08x (%d) %d %d\n", s.Name, s.Addr, s.Size, s.Entsize, s.Flags); 19 | } 20 | if (auto so = file.LibSoName(ec); so) { 21 | bela::FPrintF(stdout, L"SONAME: %s\n", *so); 22 | } 23 | if (auto rpath = file.Rpath(ec); rpath) { 24 | bela::FPrintF(stdout, L"RPATH: %s\n", *rpath); 25 | } 26 | if (auto rupath = file.Rupath(ec); rupath) { 27 | bela::FPrintF(stdout, L"RUPATH: %s\n", *rupath); 28 | } 29 | std::vector libs; 30 | if (!file.Depends(libs, ec)) { 31 | bela::FPrintF(stderr, L"parse elf file depends %s error: %s\n", argv[1], ec); 32 | return 1; 33 | } 34 | for (const auto &d : libs) { 35 | bela::FPrintF(stdout, L"need: %s\n", d); 36 | } 37 | 38 | if (std::vector symbols; file.Symbols(symbols, ec)) { 39 | bela::FPrintF(stdout, L"\x1b[34mSymbols:\x1b[0m\n"); 40 | for (const auto &s : symbols) { 41 | bela::FPrintF(stdout, L"%s %s %s\n", bela::demangle(s.Name), s.Library, s.Version); 42 | } 43 | } 44 | 45 | if (std::vector symbols; file.DynamicSymbols(symbols, ec)) { 46 | bela::FPrintF(stderr, L"\x1b[34mDynamic Symbols:\x1b[0m\n"); 47 | for (const auto &s : symbols) { 48 | bela::FPrintF(stdout, L"%s (%s@%s)\n", bela::demangle(s.Name), s.Library, s.Version); 49 | } 50 | } 51 | 52 | if (std::vector symbols; file.ImportedSymbols(symbols, ec)) { 53 | bela::FPrintF(stdout, L"\x1b[34mImported Symbols:\x1b[0m\n"); 54 | for (const auto &s : symbols) { 55 | bela::FPrintF(stdout, L"%s (%s@%s)\n", bela::demangle(s.Name), s.Library, s.Version); 56 | } 57 | } 58 | 59 | return 0; 60 | } -------------------------------------------------------------------------------- /test/appmanifest/FluentEditor.appxmanifest: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | FluentThemeEditor 7 | Microsoft 8 | Assets\ColorAlgorithmToolStoreLogo.png 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /AppExec/settings.cc: -------------------------------------------------------------------------------- 1 | ///////////// 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include "app.hpp" 10 | 11 | namespace priv { 12 | bool AppInitializeSettings(AppSettings &as) { 13 | auto file = PathSearcher::Instance().JoinAppData(LR"(Privexec\AppExec.json)"); 14 | FD fd; 15 | if (_wfopen_s(&fd.fd, file.data(), L"rb") != 0) { 16 | return false; 17 | } 18 | try { 19 | auto j = nlohmann::json::parse(fd.fd, nullptr, true, true); 20 | auto root = j["AppExec"]; 21 | auto bk = bela::color::decode(root["Background"].get(), bela::color(243, 243, 243)); 22 | as.bk = bk; 23 | as.textcolor = calcLuminance(bk.r, bk.g, bk.b); 24 | } catch (const std::exception &e) { 25 | OutputDebugStringA(e.what()); 26 | return false; 27 | } 28 | return true; 29 | } 30 | 31 | bool AppApplySettings(const AppSettings &as) { 32 | auto file = PathSearcher::Instance().JoinAppData(LR"(Privexec\AppExec.json)"); 33 | std::filesystem::path p(file); 34 | auto parent = p.parent_path(); 35 | std::error_code e; 36 | if (!std::filesystem::exists(parent, e)) { 37 | if (!std::filesystem::create_directories(parent, e)) { 38 | auto ec = bela::make_error_code_from_std(e); 39 | return false; 40 | } 41 | } 42 | nlohmann::json j; 43 | try { 44 | FD fd; 45 | if (_wfopen_s(&fd.fd, file.data(), L"rb") == 0) { 46 | j = nlohmann::json::parse(fd.fd, nullptr, true, true); 47 | } 48 | } catch (const std::exception &e) { 49 | OutputDebugStringA(e.what()); 50 | } 51 | 52 | try { 53 | auto it = j.find("AppExec"); 54 | nlohmann::json a; 55 | if (it != j.end()) { 56 | a = *it; 57 | } 58 | a["Background"] = bela::color(as.bk).encode(); 59 | j["AppExec"] = a; 60 | auto buf = j.dump(4); 61 | FD fd; 62 | if (_wfopen_s(&fd.fd, file.data(), L"w+") != 0) { 63 | return false; 64 | } 65 | fwrite(buf.data(), 1, buf.size(), fd); 66 | } catch (const std::exception &e) { 67 | OutputDebugStringA(e.what()); 68 | return false; 69 | } 70 | return true; 71 | } 72 | 73 | } // namespace priv 74 | -------------------------------------------------------------------------------- /vendor/bela/src/belawin/env.cc: -------------------------------------------------------------------------------- 1 | /////////// 2 | // bela expand env 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | namespace bela { 10 | 11 | // https://docs.microsoft.com/en-us/windows/desktop/api/processenv/nf-processenv-expandenvironmentstringsw 12 | std::wstring WindowsExpandEnv(std::wstring_view sv) { 13 | auto pos = sv.find('%'); 14 | if (pos == std::wstring_view::npos) { 15 | return std::wstring(sv); 16 | } 17 | // NO check 18 | if (sv.find(L'%', pos + 1) == std::wstring_view::npos) { 19 | return std::wstring(sv); 20 | } 21 | std::wstring buf; 22 | buf.resize(sv.size() + 256); 23 | auto N = ExpandEnvironmentStringsW(sv.data(), buf.data(), static_cast(buf.size())); 24 | if (static_cast(N) > buf.size()) { 25 | buf.resize(N); 26 | N = ExpandEnvironmentStringsW(sv.data(), buf.data(), static_cast(buf.size())); 27 | } 28 | if (N == 0 || static_cast(N) > buf.size()) { 29 | return L""; 30 | } 31 | buf.resize(N - 1); 32 | return buf; 33 | } 34 | 35 | std::wstring PathUnExpand(std::wstring_view sv) { 36 | constexpr const std::wstring_view envvars[] = { 37 | //-- 38 | L"ALLUSERSPROFILE", // 39 | L"APPDATA", // 40 | L"COMPUTERNAME", // 41 | L"ProgramFiles", // 42 | L"SystemRoot", // 43 | L"SystemDrive", // 44 | L"USERPROFILE" 45 | // 46 | }; 47 | std::wstring buf; 48 | buf.reserve(sv.size()); 49 | auto it = sv.data(); 50 | auto end = it + sv.size(); 51 | while (it < end) { 52 | auto pos = CharFind(it, end, '%'); 53 | if (pos == bela::MaximumPos) { 54 | buf.append(it, end - it); 55 | break; 56 | } 57 | buf.append(it, pos); 58 | it += pos + 1; 59 | if (it >= end) { 60 | break; 61 | } 62 | size_t xlen = end - it; 63 | for (auto e : envvars) { 64 | if (xlen < e.size() + 1) { 65 | continue; 66 | } 67 | if (_wcsnicmp(it, e.data(), e.size()) == 0 && it[e.size()] == '%') { 68 | buf.append(GetEnv(e)); 69 | it += e.size() + 1; 70 | } 71 | } 72 | } 73 | return buf; 74 | } 75 | } // namespace bela 76 | -------------------------------------------------------------------------------- /vendor/bela/src/bela/__fnmatch/fnmatch_internal.hpp: -------------------------------------------------------------------------------- 1 | /// 2 | #ifndef BELA_FNMATCH_INTERNAL_HPP 3 | #define BELA_FNMATCH_INTERNAL_HPP 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | namespace bela::fnmatch_internal { 10 | constexpr int END = 0; 11 | constexpr int UNMATCHABLE = -2; 12 | constexpr int BRACKET = -3; 13 | constexpr int QUESTION = -4; 14 | constexpr int STAR = -5; 15 | 16 | constexpr bool ascii_isalpha_u16_template(wchar_t c) { return true; } 17 | 18 | constexpr bool ascii_isalpha_u8_template(char8_t c) { return true; } 19 | 20 | constexpr bool same_character_matched(char16_t wc, std::u16string_view sv) { 21 | constexpr struct { 22 | std::u16string_view sv; 23 | decltype(ascii_isalpha_u16_template) *fn; 24 | } matchers[] = { 25 | {u"alnum", bela::ascii_isalnum}, {u"alpha", bela::ascii_isalpha}, {u"blank", bela::ascii_isblank}, 26 | {u"cntrl", bela::ascii_iscntrl}, {u"digit", bela::ascii_isdigit}, {u"graph", bela::ascii_isgraph}, 27 | {u"lower", bela::ascii_islower}, {u"print", bela::ascii_isprint}, {u"punct", bela::ascii_ispunct}, 28 | {u"space", bela::ascii_isspace}, {u"upper", bela::ascii_isupper}, {u"xdigit", bela::ascii_isxdigit}, 29 | }; 30 | for (const auto &m : matchers) { 31 | if (m.sv == sv) { 32 | return m.fn(wc); 33 | } 34 | } 35 | return false; 36 | } 37 | 38 | constexpr bool same_character_matched(char8_t wc, std::u8string_view sv) { 39 | constexpr struct { 40 | std::u8string_view sv; 41 | decltype(ascii_isalpha_u8_template) *fn; 42 | } matchers[] = { 43 | {u8"alnum", bela::ascii_isalnum}, {u8"alpha", bela::ascii_isalpha}, {u8"blank", bela::ascii_isblank}, 44 | {u8"cntrl", bela::ascii_iscntrl}, {u8"digit", bela::ascii_isdigit}, {u8"graph", bela::ascii_isgraph}, 45 | {u8"lower", bela::ascii_islower}, {u8"print", bela::ascii_isprint}, {u8"punct", bela::ascii_ispunct}, 46 | {u8"space", bela::ascii_isspace}, {u8"upper", bela::ascii_isupper}, {u8"xdigit", bela::ascii_isxdigit}, 47 | }; 48 | for (const auto &m : matchers) { 49 | if (m.sv == sv) { 50 | return m.fn(wc); 51 | } 52 | } 53 | return false; 54 | } 55 | 56 | } // namespace bela::fnmatch_internal 57 | 58 | #endif -------------------------------------------------------------------------------- /vendor/bela/include/bela/fs.hpp: -------------------------------------------------------------------------------- 1 | /// 2 | #ifndef BELA_FS_HPP 3 | #define BELA_FS_HPP 4 | #include "base.hpp" 5 | #include "str_cat.hpp" 6 | #include 7 | 8 | namespace bela::fs { 9 | constexpr bool DirSkipFaster(const wchar_t *dir) { 10 | return (dir[0] == L'.' && (dir[1] == L'\0' || (dir[1] == L'.' && dir[2] == L'\0'))); 11 | } 12 | 13 | class Finder { 14 | public: 15 | Finder() noexcept = default; 16 | Finder(const Finder &) = delete; 17 | Finder &operator=(const Finder &) = delete; 18 | ~Finder() noexcept { 19 | if (hFind != INVALID_HANDLE_VALUE) { 20 | FindClose(hFind); 21 | } 22 | } 23 | const WIN32_FIND_DATAW &FD() const { return wfd; } 24 | bool Ignore() const { return DirSkipFaster(wfd.cFileName); } 25 | bool IsDir() const { return (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0; } 26 | bool IsReparsePoint() const { return (wfd.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0; } 27 | int64_t Size() const { 28 | LARGE_INTEGER li{{ 29 | .LowPart = wfd.nFileSizeLow, 30 | .HighPart = static_cast(wfd.nFileSizeHigh), 31 | }}; 32 | return li.QuadPart; 33 | } 34 | std::wstring_view Name() const { return std::wstring_view(wfd.cFileName); } 35 | bool Next() { return FindNextFileW(hFind, &wfd) == TRUE; } 36 | bool First(std::wstring_view file, bela::error_code &ec) { 37 | if (hFind != INVALID_HANDLE_VALUE) { 38 | ec = bela::make_error_code(L"Find handle not invalid"); 39 | return false; 40 | } 41 | hFind = FindFirstFileW(file.data(), &wfd); 42 | if (hFind == INVALID_HANDLE_VALUE) { 43 | ec = bela::make_system_error_code(); 44 | return false; 45 | } 46 | return true; 47 | } 48 | bool First(std::wstring_view dir, std::wstring_view suffix, bela::error_code &ec) { 49 | auto d = bela::StringCat(dir, L"\\", suffix); 50 | return First(d, ec); 51 | } 52 | 53 | private: 54 | HANDLE hFind{INVALID_HANDLE_VALUE}; 55 | WIN32_FIND_DATAW wfd; 56 | }; 57 | // Remove remove file force 58 | bool ForceDeleteFile(HANDLE FileHandle, bela::error_code &ec); 59 | bool ForceDeleteFile(std::wstring_view path, bela::error_code &ec); 60 | bool ForceDeleteFolders(std::wstring_view path, bela::error_code &ec); 61 | } // namespace bela::fs 62 | 63 | #endif -------------------------------------------------------------------------------- /lib/exec/exec.hpp: -------------------------------------------------------------------------------- 1 | // exec library new command feature 2 | #ifndef WSUDO_EXEC_HPP 3 | #define WSUDO_EXEC_HPP 4 | #include 5 | 6 | namespace wsudo::exec { 7 | constexpr const wchar_t *string_nullable(std::wstring_view str) { return str.empty() ? nullptr : str.data(); } 8 | constexpr wchar_t *string_nullable(std::wstring &str) { return str.empty() ? nullptr : str.data(); } 9 | 10 | enum class privilege_t : uint8_t { 11 | none, 12 | appcontainer, 13 | mic, 14 | basic, 15 | standard, 16 | elevated, // such as administrator 17 | system, 18 | trustedinstaller, 19 | }; 20 | 21 | enum class visible_t : uint8_t { 22 | none, 23 | newconsole, 24 | hide, 25 | }; 26 | 27 | // command define 28 | struct command { 29 | std::wstring path; 30 | std::wstring cwd; 31 | std::wstring env; 32 | std::vector argv; 33 | uint32_t pid{0}; 34 | privilege_t priv{privilege_t::standard}; 35 | visible_t visible; 36 | bool execute(bela::error_code &ec); 37 | }; 38 | 39 | struct appcommand { 40 | std::wstring path; 41 | std::wstring cwd; 42 | std::wstring appid; 43 | std::wstring appmanifest; 44 | std::wstring sid; 45 | std::wstring folder; 46 | std::wstring env; 47 | std::vector argv; 48 | std::vector allowdirs; 49 | std::vector regdirs; 50 | std::vector caps; 51 | visible_t visible; 52 | uint32_t pid{0}; 53 | bool islpac{false}; 54 | bool retain{false}; 55 | bool initialize(bela::error_code &ec); 56 | bool execute(bela::error_code &ec); 57 | }; 58 | 59 | inline bool IsUserAdministratorsGroup() { 60 | SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY; 61 | PSID AdministratorsGroup; 62 | if (!AllocateAndInitializeSid(&NtAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, 63 | &AdministratorsGroup)) { 64 | return false; 65 | } 66 | BOOL b = FALSE; 67 | if (!CheckTokenMembership(NULL, AdministratorsGroup, &b)) { 68 | b = FALSE; 69 | } 70 | FreeSid(AdministratorsGroup); 71 | return b == TRUE; 72 | } 73 | 74 | bool SplitArgv(std::wstring_view cmd, std::wstring &path, std::vector &argv, bela::error_code &ec); 75 | } // namespace wsudo::exec 76 | 77 | #endif -------------------------------------------------------------------------------- /vendor/bela/docs/zh-CN/strformat.md: -------------------------------------------------------------------------------- 1 | # StrFormat 2 | 3 | Bela 目前提供了一个类型安全简单的 `StrFormat`, `StrFormat` 基于 C++ 变参模板,使用 `union` 记录参数类型,在解析时按照输入的占位符将其他类型转换为字符串连接在一起,从而实现格式化功能。 4 | 5 | 支持的类型和响应的占位符如下表所示: 6 | 7 | |类型|占位符|备注| 8 | |---|---|---| 9 | |char|`%c`|ASCII 字符,会被提升为 wchar_t| 10 | |unsigned char|`%c`|ASCII 字符,会被提升为 wchar_t| 11 | |wchar_t|`%c`|UTF-16 字符| 12 | |char16_t|`%c`|UTF-16 字符| 13 | |char32_t|`%c`|UTF-32 Unicode 字符,会被转为 UTF-16 字符,这意味着可以使用 Unicode 码点以 %c 的方式输出 emoji。| 14 | |short|`%d`|16位整型| 15 | |unsigned short|`%d`|16位无符号整型| 16 | |int|`%d`|32位整型| 17 | |unsigned int|`%d`|32位无符号整型| 18 | |long|`%d`|32位整型| 19 | |unsigned long|`%d`|32位无符号整型| 20 | |long long|`%d`|64位整型| 21 | |unsigned long long|`%d`|64位无符号整型| 22 | |float|`%f`|会被提升为 `double`| 23 | |double|`%f`|64位浮点| 24 | |const char *|`%s`|UTF-8 字符串,会被转换成 UTF-16 字符串| 25 | |char *|`%s`|UTF-8 字符串,会被转换成 UTF-16 字符串| 26 | |std::string|`%s`|UTF-8 字符串,会被转换成 UTF-16 字符串| 27 | |std::string_view|`%s`|UTF-8 字符串,会被转换成 UTF-16 字符串| 28 | |const wchar_t *|`%s`|UTF-16 字符串| 29 | |wchar_t *|`%s`|UTF-16 字符串| 30 | |std::wstring|`%s`|UTF-16 字符串| 31 | |std::wstring_view|`%s`|UTF-16 字符串| 32 | |const char16_t *|`%s`|UTF-16 字符串| 33 | |char16_t *|`%s`|UTF-16 字符串| 34 | |std::u16string|`%s`|UTF-16 字符串| 35 | |std::u16string_view|`%s`|UTF-16 字符串| 36 | |void *|`%p`|指针类型,会格式化成 `0xffff00000` 这样的字符串| 37 | 38 | 如果不格式化 UTF-8 字符串,且拥有固定大小内存缓冲区,可以使用 `StrFormat` 的如下重载,此重载可以轻松的移植到 POSIX 系统并支持异步信号安全: 39 | 40 | ```c++ 41 | template 42 | ssize_t StrFormat(wchar_t *buf, size_t N, const wchar_t *fmt, const Args& ... args) 43 | ``` 44 | 45 | ## 示例 46 | 47 | ```cpp 48 | /// 49 | #include 50 | #include 51 | 52 | int wmain(int argc, wchar_t **argv) { 53 | auto ux = "\xf0\x9f\x98\x81 UTF-8 text \xE3\x8D\xA4"; // force encode UTF-8 54 | wchar_t wx[] = L"Engine \xD83D\xDEE0 中国"; 55 | bela::FPrintF( 56 | stderr, 57 | L"Argc: %d Arg0: \x1b[32m%s\x1b[0m W: %s UTF-8: %s __cplusplus: %d\n", argc, argv[0], wx, ux, __cplusplus); 58 | char32_t em = 0x1F603;//😃 59 | auto s = bela::StringCat(L"Look emoji -->", em, L" U: ", 60 | static_cast(em)); 61 | bela::FPrintF(stderr, L"emoji test %c %s\n", em, s); 62 | return 0; 63 | } 64 | 65 | ``` 66 | 67 | 请注意,如果上述 emoji 要正常显示,应当使用 `Windows Terminal` 或者是 `Mintty`。 68 | -------------------------------------------------------------------------------- /vendor/bela/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # bela sources 2 | cmake_minimum_required(VERSION 3.31) 3 | 4 | project(bela) 5 | 6 | include(FeatureSummary) 7 | 8 | if(CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR AND NOT MSVC_IDE) 9 | message( 10 | FATAL_ERROR 11 | "In-source builds are not allowed. 12 | CMake would overwrite the makefiles distributed with bela. 13 | Please create a directory and run cmake from there, passing the path 14 | to this source directory as the last argument. 15 | This process created the file `CMakeCache.txt' and the directory `CMakeFiles'. 16 | Please delete them.") 17 | endif() 18 | 19 | option(BUILD_BELA_TEST "Enable test" OFF) 20 | option(BELA_ENABLE_ASSEMBLY_FILES "bela enable assembly files" OFF) 21 | 22 | message(STATUS "CMAKE_ASM_COMPILER_ID ${CMAKE_ASM_COMPILER_ID}") 23 | 24 | if(NOT (DEFINED CMAKE_CXX_STANDARD)) 25 | set(CMAKE_CXX_STANDARD 23) 26 | endif() 27 | 28 | if(CMAKE_CXX_STANDARD LESS 23 OR CMAKE_CXX_STANDARD STREQUAL "98") 29 | message(FATAL_ERROR "Bela requires C++23 or later") 30 | endif() 31 | 32 | set(CMAKE_CXX_STANDARD_REQUIRED YES) 33 | set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE) 34 | 35 | if("^${CMAKE_SOURCE_DIR}$" STREQUAL "^${PROJECT_SOURCE_DIR}$") 36 | set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) 37 | set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib) 38 | if(MSVC) 39 | set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -utf-8 -W3 -DUNICODE=1 -D_UNICODE=1 -wd26812") 40 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -utf-8 -W3 -permissive- -Zc:__cplusplus -DUNICODE=1 -D_UNICODE=1 -wd26812") 41 | endif(MSVC) 42 | endif() 43 | 44 | include(CheckSymbolExists) 45 | 46 | if(MSVC) 47 | check_symbol_exists(_M_X64 "" BELA_ARCHITECTURE_64BIT) 48 | check_symbol_exists(_M_IX86 "" BELA_ARCHITECTURE_32BIT) 49 | check_symbol_exists(_M_ARM64 "" BELA_ARCHITECTURE_ARM64) 50 | else() 51 | check_symbol_exists(__x86_64__ "" BELA_ARCHITECTURE_64BIT) 52 | check_symbol_exists(__aarch64__ "" BELA_ARCHITECTURE_ARM64) 53 | endif() 54 | 55 | include_directories(include) 56 | 57 | add_subdirectory(src/bela) 58 | add_subdirectory(src/belawin) 59 | add_subdirectory(src/belashl) 60 | add_subdirectory(src/belatime) 61 | add_subdirectory(src/belaund) 62 | add_subdirectory(src/belahash) 63 | add_subdirectory(src/hazel) 64 | if(BUILD_BELA_TEST) 65 | add_subdirectory(test) 66 | endif() 67 | -------------------------------------------------------------------------------- /vendor/bela/include/bela/terminal.hpp: -------------------------------------------------------------------------------- 1 | // 2 | #ifndef BELA_TERMINAL_HPP 3 | #define BELA_TERMINAL_HPP 4 | #include "base.hpp" 5 | #include "fmt.hpp" 6 | 7 | namespace bela { 8 | namespace terminal { 9 | // Is same terminal maybe console or Cygwin pty 10 | bool IsSameTerminal(HANDLE fd); 11 | bool IsSameTerminal(FILE *fd); 12 | 13 | // Is console terminal 14 | bool IsTerminal(HANDLE fd); 15 | bool IsTerminal(FILE *fd); 16 | 17 | // Is cygwin terminal 18 | bool IsCygwinTerminal(HANDLE fd); 19 | bool IsCygwinTerminal(FILE *fd); 20 | 21 | struct terminal_size { 22 | uint32_t columns{0}; 23 | uint32_t rows{0}; 24 | }; 25 | bool TerminalSize(HANDLE fd, terminal_size &sz); 26 | bool TerminalSize(FILE *fd, terminal_size &sz); 27 | bela::ssize_t WriteTerminal(HANDLE fd, std::wstring_view data); 28 | bela::ssize_t WriteSameFile(HANDLE fd, std::wstring_view data); 29 | bela::ssize_t WriteSameFile(HANDLE fd, std::string_view data); 30 | // Warning, currently bela :: terminal :: WriteAuto does not support redirect 31 | // operations like freopen, please do not use this 32 | bela::ssize_t WriteAuto(FILE *fd, std::wstring_view data); 33 | // UTF-8 version cache write 34 | bela::ssize_t WriteAuto(FILE *fd, std::string_view data); 35 | // If you need to call freopen, you should use the following: 36 | bela::ssize_t WriteDirect(FILE *fd, std::wstring_view data); 37 | // UTF-8 version direct write 38 | bela::ssize_t WriteDirect(FILE *fd, std::string_view data); 39 | } // namespace terminal 40 | template ssize_t FPrintF(FILE *out, const wchar_t *fmt, const Args &...args) { 41 | const format_internal::FormatArg arg_array[] = {args...}; 42 | auto str = format_internal::StrFormatInternal(fmt, arg_array, sizeof...(args)); 43 | return bela::terminal::WriteAuto(out, str); 44 | } 45 | 46 | inline ssize_t FPrintF(FILE *out, const wchar_t *fmt) { return bela::terminal::WriteAuto(out, fmt); } 47 | 48 | template ssize_t FPrintDirectF(FILE *out, const wchar_t *fmt, const Args &...args) { 49 | const format_internal::FormatArg arg_array[] = {args...}; 50 | auto str = format_internal::StrFormatInternal(fmt, arg_array, sizeof...(args)); 51 | return bela::terminal::WriteDirect(out, str); 52 | } 53 | 54 | inline ssize_t FPrintDirectF(FILE *out, const wchar_t *fmt) { return bela::terminal::WriteDirect(out, fmt); } 55 | 56 | } // namespace bela 57 | #endif -------------------------------------------------------------------------------- /vendor/bela/include/bela/buffer.hpp: -------------------------------------------------------------------------------- 1 | /// 2 | #ifndef BELA_BUFFER_HPP 3 | #define BELA_BUFFER_HPP 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include "bytes_view.hpp" 9 | 10 | namespace bela { 11 | 12 | class Buffer { 13 | private: 14 | std::allocator alloc_; 15 | void MoveFrom(Buffer &&other) { 16 | Free(); // Free self 17 | data_ = other.data_; 18 | alloc_ = std::move(other.alloc_); 19 | other.data_ = nullptr; 20 | capacity_ = other.capacity_; 21 | other.capacity_ = 0; 22 | size_ = other.size_; 23 | other.size_ = 0; 24 | } 25 | void Free() { 26 | if (data_ != nullptr) { 27 | alloc_.deallocate(data_, capacity_); 28 | data_ = nullptr; 29 | capacity_ = 0; 30 | size_ = 0; 31 | } 32 | } 33 | 34 | public: 35 | Buffer() = default; 36 | Buffer(size_t maxsize) { grow(maxsize); } 37 | Buffer(Buffer &&other) { MoveFrom(std::move(other)); } 38 | Buffer &operator=(Buffer &&other) { 39 | MoveFrom(std::move(other)); 40 | return *this; 41 | } 42 | Buffer(const Buffer &) = delete; 43 | Buffer &operator=(const Buffer &) = delete; 44 | ~Buffer() { Free(); } 45 | [[nodiscard]] size_t size() const { return size_; } 46 | [[nodiscard]] size_t &size() { return size_; } 47 | [[nodiscard]] size_t capacity() const { return capacity_; } 48 | void grow(size_t n) { 49 | if (n <= capacity_) { 50 | return; 51 | } 52 | auto b = alloc_.allocate(n); 53 | if (size_ != 0) { 54 | memcpy(b, data_, size_); 55 | } 56 | if (data_ != nullptr) { 57 | alloc_.deallocate(data_, capacity_); 58 | } 59 | data_ = b; 60 | capacity_ = n; 61 | } 62 | [[nodiscard]] const uint8_t *data() const { return data_; } 63 | [[nodiscard]] uint8_t operator[](const size_t _Off) const noexcept { return *(data_ + _Off); } 64 | [[nodiscard]] uint8_t *data() { return data_; } 65 | std::span make_const_span() const { return std::span{data_, size_}; } 66 | std::span make_span(size_t spanlen = std::string_view::npos) const { 67 | return std::span{data_, (std::min)(capacity_, spanlen)}; 68 | } 69 | auto as_bytes_view() const { return bytes_view(data_, size_); } 70 | 71 | private: 72 | uint8_t *data_{nullptr}; 73 | size_t size_{0}; 74 | size_t capacity_{0}; 75 | }; 76 | 77 | } // namespace bela 78 | 79 | #endif -------------------------------------------------------------------------------- /vendor/bela/test/filehash/filehash.cc: -------------------------------------------------------------------------------- 1 | // 2 | 3 | #include 4 | #include 5 | 6 | int wmain(int argc, wchar_t **argv) { 7 | if (argc < 2) { 8 | bela::FPrintF(stderr, L"usage: %s file\n", argv[0]); 9 | return 1; 10 | } 11 | bela::hash::sha256::Hasher h1; 12 | h1.Initialize(bela::hash::sha256::HashBits::SHA224); 13 | bela::hash::sha256::Hasher h2; 14 | h2.Initialize(); 15 | bela::hash::sha512::Hasher h3; 16 | h3.Initialize(bela::hash::sha512::HashBits::SHA384); 17 | bela::hash::sha512::Hasher h4; 18 | h4.Initialize(); 19 | bela::hash::sha3::Hasher h5; 20 | h5.Initialize(bela::hash::sha3::HashBits::SHA3224); 21 | bela::hash::sha3::Hasher h6; 22 | h6.Initialize(); 23 | bela::hash::sha3::Hasher h7; 24 | h7.Initialize(bela::hash::sha3::HashBits::SHA3384); 25 | bela::hash::sha3::Hasher h8; 26 | h8.Initialize(bela::hash::sha3::HashBits::SHA3512); 27 | bela::hash::blake3::Hasher h9; 28 | h9.Initialize(); 29 | bela::hash::sm3::Hasher h10; 30 | h10.Initialize(); 31 | FILE *fd = nullptr; 32 | if (auto e = _wfopen_s(&fd, argv[1], L"rb"); e != 0) { 33 | auto ec = bela::make_error_code_from_errno(e); 34 | bela::FPrintF(stderr, L"unable open file: %s\n", ec); 35 | return 1; 36 | } 37 | auto closer = bela::finally([&] { fclose(fd); }); 38 | char buffer[32678]; 39 | for (;;) { 40 | auto n = fread(buffer, 1, sizeof(buffer), fd); 41 | h1.Update(buffer, n); 42 | h2.Update(buffer, n); 43 | h3.Update(buffer, n); 44 | h4.Update(buffer, n); 45 | h5.Update(buffer, n); 46 | h6.Update(buffer, n); 47 | h7.Update(buffer, n); 48 | h8.Update(buffer, n); 49 | h9.Update(buffer, n); 50 | h10.Update(buffer, n); 51 | if (n < sizeof(buffer)) { 52 | break; 53 | } 54 | } 55 | bela::FPrintF(stdout, L"SHA224: %s\n", h1.Finalize()); 56 | bela::FPrintF(stdout, L"SHA256: %s\n", h2.Finalize()); 57 | bela::FPrintF(stdout, L"SHA384: %s\n", h3.Finalize()); 58 | bela::FPrintF(stdout, L"SHA512: %s\n", h4.Finalize()); 59 | bela::FPrintF(stdout, L"SHA3-224: %s\n", h5.Finalize()); 60 | bela::FPrintF(stdout, L"SHA3-256: %s\n", h6.Finalize()); 61 | bela::FPrintF(stdout, L"SHA3-384: %s\n", h7.Finalize()); 62 | bela::FPrintF(stdout, L"SHA3-512: %s\n", h8.Finalize()); 63 | bela::FPrintF(stdout, L"BLAKE3: %s\n", h9.Finalize()); 64 | bela::FPrintF(stdout, L"SM3: %s\n", h10.Finalize()); 65 | return 0; 66 | } -------------------------------------------------------------------------------- /vendor/bela/src/belahash/blake3/Makefile.testing: -------------------------------------------------------------------------------- 1 | # This Makefile is only for testing. C callers should follow the instructions 2 | # in ./README.md to incorporate these C files into their existing build. 3 | 4 | NAME=blake3 5 | CC=gcc 6 | CFLAGS=-O3 -Wall -Wextra -std=c11 -pedantic -fstack-protector-strong -D_FORTIFY_SOURCE=2 -fPIE -fvisibility=hidden 7 | LDFLAGS=-pie -Wl,-z,relro,-z,now 8 | TARGETS= 9 | ASM_TARGETS= 10 | EXTRAFLAGS=-Wa,--noexecstack 11 | 12 | ifdef BLAKE3_NO_SSE2 13 | EXTRAFLAGS += -DBLAKE3_NO_SSE2 14 | else 15 | TARGETS += blake3_sse2.o 16 | ASM_TARGETS += blake3_sse2_x86-64_unix.S 17 | endif 18 | 19 | ifdef BLAKE3_NO_SSE41 20 | EXTRAFLAGS += -DBLAKE3_NO_SSE41 21 | else 22 | TARGETS += blake3_sse41.o 23 | ASM_TARGETS += blake3_sse41_x86-64_unix.S 24 | endif 25 | 26 | ifdef BLAKE3_NO_AVX2 27 | EXTRAFLAGS += -DBLAKE3_NO_AVX2 28 | else 29 | TARGETS += blake3_avx2.o 30 | ASM_TARGETS += blake3_avx2_x86-64_unix.S 31 | endif 32 | 33 | ifdef BLAKE3_NO_AVX512 34 | EXTRAFLAGS += -DBLAKE3_NO_AVX512 35 | else 36 | TARGETS += blake3_avx512.o 37 | ASM_TARGETS += blake3_avx512_x86-64_unix.S 38 | endif 39 | 40 | ifdef BLAKE3_USE_NEON 41 | EXTRAFLAGS += -DBLAKE3_USE_NEON=1 42 | TARGETS += blake3_neon.o 43 | endif 44 | 45 | ifdef BLAKE3_NO_NEON 46 | EXTRAFLAGS += -DBLAKE3_USE_NEON=0 47 | endif 48 | 49 | all: blake3.c blake3_dispatch.c blake3_portable.c main.c $(TARGETS) 50 | $(CC) $(CFLAGS) $(EXTRAFLAGS) $^ -o $(NAME) $(LDFLAGS) 51 | 52 | blake3_sse2.o: blake3_sse2.c 53 | $(CC) $(CFLAGS) $(EXTRAFLAGS) -c $^ -o $@ -msse2 54 | 55 | blake3_sse41.o: blake3_sse41.c 56 | $(CC) $(CFLAGS) $(EXTRAFLAGS) -c $^ -o $@ -msse4.1 57 | 58 | blake3_avx2.o: blake3_avx2.c 59 | $(CC) $(CFLAGS) $(EXTRAFLAGS) -c $^ -o $@ -mavx2 60 | 61 | blake3_avx512.o: blake3_avx512.c 62 | $(CC) $(CFLAGS) $(EXTRAFLAGS) -c $^ -o $@ -mavx512f -mavx512vl 63 | 64 | blake3_neon.o: blake3_neon.c 65 | $(CC) $(CFLAGS) $(EXTRAFLAGS) -c $^ -o $@ 66 | 67 | test: CFLAGS += -DBLAKE3_TESTING -fsanitize=address,undefined 68 | test: all 69 | ./test.py 70 | 71 | asm: blake3.c blake3_dispatch.c blake3_portable.c main.c $(ASM_TARGETS) 72 | $(CC) $(CFLAGS) $(EXTRAFLAGS) $^ -o $(NAME) $(LDFLAGS) 73 | 74 | test_asm: CFLAGS += -DBLAKE3_TESTING -fsanitize=address,undefined 75 | test_asm: asm 76 | ./test.py 77 | 78 | example: example.c blake3.c blake3_dispatch.c blake3_portable.c $(ASM_TARGETS) 79 | $(CC) $(CFLAGS) $(EXTRAFLAGS) $^ -o $@ $(LDFLAGS) 80 | 81 | clean: 82 | rm -f $(NAME) *.o 83 | -------------------------------------------------------------------------------- /vendor/bela/src/belawin/pe/resource.cc: -------------------------------------------------------------------------------- 1 | /// 2 | #include "internal.hpp" 3 | 4 | namespace bela::pe { 5 | struct image_resource_directory { 6 | uint32_t characteristics; 7 | uint32_t time_date_stamp; 8 | uint16_t major_version; 9 | uint16_t minor_version; 10 | uint16_t number_of_named_entries; 11 | uint16_t number_of_id_entries; 12 | // image_resource_directory_entry directory_entries[]; 13 | }; 14 | 15 | struct image_resource_directory_entry { 16 | union { 17 | struct { 18 | uint32_t name_offset : 31; 19 | uint32_t name_is_string : 1; 20 | }; 21 | uint32_t name; 22 | uint16_t id; 23 | }; 24 | union { 25 | uint32_t offset_to_data; 26 | struct { 27 | uint32_t offset_to_directory : 31; 28 | uint32_t data_is_directory : 1; 29 | }; 30 | }; 31 | }; 32 | 33 | struct image_resource_directory_string { 34 | uint16_t length; 35 | uint8_t name_string[1]; 36 | }; 37 | 38 | struct image_resource_dir_string_u { 39 | uint16_t length; 40 | uint16_t name_string[1]; 41 | }; 42 | 43 | struct image_resource_data_entry { 44 | uint32_t offset_to_data; 45 | uint32_t size; 46 | uint32_t code_page; 47 | uint32_t reserved; 48 | }; 49 | 50 | // manifest 51 | constexpr std::string_view rsrcName = ".rsrc"; 52 | 53 | std::optional File::LookupVersion(bela::error_code &ec) const { 54 | auto dd = getDataDirectory(IMAGE_DIRECTORY_ENTRY_RESOURCE); 55 | if (dd == nullptr) { 56 | return std::nullopt; 57 | } 58 | if (dd->VirtualAddress == 0) { 59 | return std::nullopt; 60 | } 61 | auto sec = getSection(rsrcName); 62 | if (sec == nullptr) { 63 | return std::nullopt; 64 | } 65 | auto offset = static_cast(sec->Offset); 66 | auto N = dd->VirtualAddress - sec->VirtualAddress; 67 | auto offsetSize = sec->Size - N; 68 | IMAGE_RESOURCE_DIRECTORY ird; 69 | if (!fd.ReadAt(ird, offset, ec)) { 70 | return std::nullopt; 71 | } 72 | auto totalEntries = static_cast(ird.NumberOfNamedEntries) + static_cast(ird.NumberOfIdEntries); 73 | if (totalEntries == 0) { 74 | return std::nullopt; 75 | } 76 | IMAGE_RESOURCE_DIRECTORY_ENTRY entry; 77 | for (auto i = 0; i < totalEntries; i++) { 78 | if (!fd.ReadFull(entry, ec)) { 79 | return std::nullopt; 80 | } 81 | // if (entry.NameIsString != 1) { 82 | // continue; 83 | // } 84 | // if (entry.Name != 0x00000010) { 85 | // } 86 | } 87 | return std::nullopt; 88 | } 89 | 90 | } // namespace bela::pe -------------------------------------------------------------------------------- /vendor/bela/include/bela/bufio.hpp: -------------------------------------------------------------------------------- 1 | // 2 | #ifndef BELA_BUFIO_HPP 3 | #define BELA_BUFIO_HPP 4 | #include 5 | #include "base.hpp" 6 | #include "types.hpp" 7 | 8 | namespace bela::bufio { 9 | constexpr ssize_t default_buffer_size = 4096; 10 | // Fixed capacity size bufio.Reader implementation 11 | template class Reader { 12 | public: 13 | Reader(HANDLE r) : fd(r) {} 14 | Reader(const Reader &) = delete; 15 | Reader &operator=(const Reader &) = delete; 16 | ssize_t Buffered() const { return w - r; } 17 | ssize_t Read(void *buffer, ssize_t len, bela::error_code &ec) { 18 | if (buffer == nullptr || len == 0) { 19 | ec = bela::make_error_code(L"short read"); 20 | return -1; 21 | } 22 | if (r == w) { 23 | if (static_cast(len) > sizeof(data)) { 24 | // Large read, empty buffer. 25 | // Read directly into p to avoid copy. 26 | ssize_t rlen = 0; 27 | if (!fsread(buffer, len, rlen, ec)) { 28 | return -1; 29 | } 30 | return rlen; 31 | } 32 | w = 0; 33 | r = 0; 34 | if (!fsread(data, sizeof(data), w, ec)) { 35 | return -1; 36 | } 37 | if (w == 0) { 38 | ec = bela::make_error_code(L"unexpected EOF"); 39 | return -1; 40 | } 41 | } 42 | 43 | auto n = (std::min)(w - r, len); 44 | memcpy(buffer, data + r, n); 45 | r += n; 46 | return n; 47 | } 48 | ssize_t ReadFull(void *buffer, ssize_t len, bela::error_code &ec) { 49 | auto p = reinterpret_cast(buffer); 50 | ssize_t n = 0; 51 | for (; n < len;) { 52 | auto nn = Read(p + n, len - n, ec); 53 | if (nn == -1) { 54 | return -1; 55 | } 56 | n += nn; 57 | } 58 | if (n < len) { 59 | ec = bela::make_error_code(L"unexpected EOF"); 60 | return -1; 61 | } 62 | return n; 63 | } 64 | 65 | constexpr int size() const { return Size; } 66 | 67 | private: 68 | HANDLE fd{INVALID_HANDLE_VALUE}; 69 | uint8_t data[Size] = {0}; 70 | ssize_t w{0}; 71 | ssize_t r{0}; 72 | bool fsread(void *b, ssize_t len, ssize_t &rlen, bela::error_code &ec) { 73 | DWORD dwSize = {0}; 74 | if (::ReadFile(fd, b, static_cast(len), &dwSize, nullptr) != TRUE) { 75 | ec = bela::make_system_error_code(L"ReadFile: "); 76 | return false; 77 | } 78 | rlen = static_cast(len); 79 | return true; 80 | } 81 | }; 82 | } // namespace bela::bufio 83 | 84 | #endif -------------------------------------------------------------------------------- /vendor/bela/include/hazel/details/ELFRelocs/M68k.def: -------------------------------------------------------------------------------- 1 | #ifndef ELF_RELOC 2 | #error "ELF_RELOC must be defined" 3 | #endif 4 | 5 | ELF_RELOC(R_68K_NONE, 0) /* No reloc */ 6 | ELF_RELOC(R_68K_32, 1) /* Direct 32 bit */ 7 | ELF_RELOC(R_68K_16, 2) /* Direct 16 bit */ 8 | ELF_RELOC(R_68K_8, 3) /* Direct 8 bit */ 9 | ELF_RELOC(R_68K_PC32, 4) /* PC relative 32 bit */ 10 | ELF_RELOC(R_68K_PC16, 5) /* PC relative 16 bit */ 11 | ELF_RELOC(R_68K_PC8, 6) /* PC relative 8 bit */ 12 | ELF_RELOC(R_68K_GOTPCREL32, 7) /* 32 bit PC relative GOT entry */ 13 | ELF_RELOC(R_68K_GOTPCREL16, 8) /* 16 bit PC relative GOT entry */ 14 | ELF_RELOC(R_68K_GOTPCREL8, 9) /* 8 bit PC relative GOT entry */ 15 | ELF_RELOC(R_68K_GOTOFF32, 10) /* 32 bit GOT offset */ 16 | ELF_RELOC(R_68K_GOTOFF16, 11) /* 16 bit GOT offset */ 17 | ELF_RELOC(R_68K_GOTOFF8, 12) /* 8 bit GOT offset */ 18 | ELF_RELOC(R_68K_PLT32, 13) /* 32 bit PC relative PLT address */ 19 | ELF_RELOC(R_68K_PLT16, 14) /* 16 bit PC relative PLT address */ 20 | ELF_RELOC(R_68K_PLT8, 15) /* 8 bit PC relative PLT address */ 21 | ELF_RELOC(R_68K_PLTOFF32, 16) /* 32 bit PLT offset */ 22 | ELF_RELOC(R_68K_PLTOFF16, 17) /* 16 bit PLT offset */ 23 | ELF_RELOC(R_68K_PLTOFF8, 18) /* 8 bit PLT offset */ 24 | ELF_RELOC(R_68K_COPY, 19) /* Copy symbol at runtime */ 25 | ELF_RELOC(R_68K_GLOB_DAT, 20) /* Create GOT entry */ 26 | ELF_RELOC(R_68K_JMP_SLOT, 21) /* Create PLT entry */ 27 | ELF_RELOC(R_68K_RELATIVE, 22) /* Adjust by program base */ 28 | /* These are GNU extensions to enable C++ vtable garbage collection. */ 29 | ELF_RELOC(R_68K_GNU_VTINHERIT, 23) 30 | ELF_RELOC(R_68K_GNU_VTENTRY, 24) 31 | /* TLS static relocations. */ 32 | ELF_RELOC(R_68K_TLS_GD32, 25) 33 | ELF_RELOC(R_68K_TLS_GD16, 26) 34 | ELF_RELOC(R_68K_TLS_GD8, 27) 35 | ELF_RELOC(R_68K_TLS_LDM32, 28) 36 | ELF_RELOC(R_68K_TLS_LDM16, 29) 37 | ELF_RELOC(R_68K_TLS_LDM8, 30) 38 | ELF_RELOC(R_68K_TLS_LDO32, 31) 39 | ELF_RELOC(R_68K_TLS_LDO16, 32) 40 | ELF_RELOC(R_68K_TLS_LDO8, 33) 41 | ELF_RELOC(R_68K_TLS_IE32, 34) 42 | ELF_RELOC(R_68K_TLS_IE16, 35) 43 | ELF_RELOC(R_68K_TLS_IE8, 36) 44 | ELF_RELOC(R_68K_TLS_LE32, 37) 45 | ELF_RELOC(R_68K_TLS_LE16, 38) 46 | ELF_RELOC(R_68K_TLS_LE8, 39) 47 | ELF_RELOC(R_68K_TLS_DTPMOD32, 40) 48 | ELF_RELOC(R_68K_TLS_DTPREL32, 41) 49 | ELF_RELOC(R_68K_TLS_TPREL32, 42) 50 | -------------------------------------------------------------------------------- /vendor/bela/include/hazel/details/ELFRelocs/Xtensa.def: -------------------------------------------------------------------------------- 1 | #ifndef ELF_RELOC 2 | #error "ELF_RELOC must be defined" 3 | #endif 4 | 5 | ELF_RELOC(R_XTENSA_NONE, 0) 6 | ELF_RELOC(R_XTENSA_32, 1) 7 | ELF_RELOC(R_XTENSA_RTLD, 2) 8 | ELF_RELOC(R_XTENSA_GLOB_DAT, 3) 9 | ELF_RELOC(R_XTENSA_JMP_SLOT, 4) 10 | ELF_RELOC(R_XTENSA_RELATIVE, 5) 11 | ELF_RELOC(R_XTENSA_PLT, 6) 12 | // RELOC '7' currently is not used. 13 | ELF_RELOC(R_XTENSA_OP0, 8) 14 | ELF_RELOC(R_XTENSA_OP1, 9) 15 | ELF_RELOC(R_XTENSA_OP2, 10) 16 | ELF_RELOC(R_XTENSA_ASM_EXPAND, 11) 17 | ELF_RELOC(R_XTENSA_ASM_SIMPLIFY, 12) 18 | ELF_RELOC(R_XTENSA_32_PCREL, 14) 19 | ELF_RELOC(R_XTENSA_GNU_VTINHERIT, 15) 20 | ELF_RELOC(R_XTENSA_GNU_VTENTRY, 16) 21 | ELF_RELOC(R_XTENSA_DIFF8, 17) 22 | ELF_RELOC(R_XTENSA_DIFF16, 18) 23 | ELF_RELOC(R_XTENSA_DIFF32, 19) 24 | ELF_RELOC(R_XTENSA_SLOT0_OP, 20) 25 | ELF_RELOC(R_XTENSA_SLOT1_OP, 21) 26 | ELF_RELOC(R_XTENSA_SLOT2_OP, 22) 27 | ELF_RELOC(R_XTENSA_SLOT3_OP, 23) 28 | ELF_RELOC(R_XTENSA_SLOT4_OP, 24) 29 | ELF_RELOC(R_XTENSA_SLOT5_OP, 25) 30 | ELF_RELOC(R_XTENSA_SLOT6_OP, 26) 31 | ELF_RELOC(R_XTENSA_SLOT7_OP, 27) 32 | ELF_RELOC(R_XTENSA_SLOT8_OP, 28) 33 | ELF_RELOC(R_XTENSA_SLOT9_OP, 29) 34 | ELF_RELOC(R_XTENSA_SLOT10_OP, 30) 35 | ELF_RELOC(R_XTENSA_SLOT11_OP, 31) 36 | ELF_RELOC(R_XTENSA_SLOT12_OP, 32) 37 | ELF_RELOC(R_XTENSA_SLOT13_OP, 33) 38 | ELF_RELOC(R_XTENSA_SLOT14_OP, 34) 39 | ELF_RELOC(R_XTENSA_SLOT0_ALT, 35) 40 | ELF_RELOC(R_XTENSA_SLOT1_ALT, 36) 41 | ELF_RELOC(R_XTENSA_SLOT2_ALT, 37) 42 | ELF_RELOC(R_XTENSA_SLOT3_ALT, 38) 43 | ELF_RELOC(R_XTENSA_SLOT4_ALT, 39) 44 | ELF_RELOC(R_XTENSA_SLOT5_ALT, 40) 45 | ELF_RELOC(R_XTENSA_SLOT6_ALT, 41) 46 | ELF_RELOC(R_XTENSA_SLOT7_ALT, 42) 47 | ELF_RELOC(R_XTENSA_SLOT8_ALT, 43) 48 | ELF_RELOC(R_XTENSA_SLOT9_ALT, 44) 49 | ELF_RELOC(R_XTENSA_SLOT10_ALT, 45) 50 | ELF_RELOC(R_XTENSA_SLOT11_ALT, 46) 51 | ELF_RELOC(R_XTENSA_SLOT12_ALT, 47) 52 | ELF_RELOC(R_XTENSA_SLOT13_ALT, 48) 53 | ELF_RELOC(R_XTENSA_SLOT14_ALT, 49) 54 | ELF_RELOC(R_XTENSA_TLSDESC_FN, 50) 55 | ELF_RELOC(R_XTENSA_TLSDESC_ARG, 51) 56 | ELF_RELOC(R_XTENSA_TLS_DTPOFF, 52) 57 | ELF_RELOC(R_XTENSA_TLS_TPOFF, 53) 58 | ELF_RELOC(R_XTENSA_TLS_FUNC, 54) 59 | ELF_RELOC(R_XTENSA_TLS_ARG, 55) 60 | ELF_RELOC(R_XTENSA_TLS_CALL, 56) 61 | -------------------------------------------------------------------------------- /vendor/bela/include/gtl/combinators.hpp: -------------------------------------------------------------------------------- 1 | pragma once 2 | 3 | /* 4 | * from https://github.com/codereport/blackbird - Copyright (c) 2022 Conor Hoekstra 5 | * 6 | * MIT License: https://github.com/codereport/blackbird/blob/main/LICENSE 7 | */ 8 | 9 | #include 10 | 11 | namespace combinators { 12 | 13 | ///////////////// 14 | // combinators // 15 | ///////////////// 16 | 17 | // B (The Bluebird) 18 | auto _b = [](auto f, auto g) { return [=](auto x) { return f(g(x)); }; }; 19 | 20 | // C (The Cardinal) aka `flip` in Haskell 21 | auto _c = [](auto f) { return [=](auto x, auto y) { return f(y, x); }; }; 22 | 23 | // K (Kestrel) 24 | auto _l_ = [](auto x, auto y) { return x; }; 25 | 26 | // KI 27 | auto _r_ = [](auto x, auto y) { return y; }; 28 | 29 | // Phi (The Phoenix) 30 | auto _phi = [](auto f, auto g, auto h) { return [=](auto x) { return g(f(x), h(x)); }; }; 31 | 32 | // Phi1 (The Pheasant) 33 | auto _phi1_ = [](auto f, auto g, auto h) { return [=](auto x, auto y) { return g(f(x, y), h(x, y)); }; }; 34 | 35 | // Psi (The Psi Bird) 36 | auto _psi = [](auto f, auto g) { return [=](auto x, auto y) { return f(g(x), g(y)); }; }; 37 | 38 | ///////////////////////////////////////////// 39 | // more convenient binary/unary operations // 40 | ///////////////////////////////////////////// 41 | 42 | auto _eq = [](auto x) { return [x](auto y) { return x == y; }; }; 43 | auto _eq_ = std::equal_to{}; 44 | auto _neq_ = std::not_equal_to{}; 45 | auto _lt = [](auto x) { return [x](auto y) { return x > y; }; }; 46 | auto lt_ = [](auto x) { return [x](auto y) { return y < x; }; }; 47 | auto _lt_ = std::less{}; 48 | auto _gte = [](auto x) { return [x](auto y) { return x >= y; }; }; 49 | auto _plus = [](auto x) { return [x](auto y) { return x + y; }; }; 50 | auto _plus_ = std::plus{}; 51 | auto _mul = [](auto x) { return [x](auto y) { return x * y; }; }; 52 | auto _mul_ = std::multiplies{}; 53 | auto _sub = [](auto x) { return [x](auto y) { return x - y; }; }; 54 | auto sub_ = [](auto x) { return [x](auto y) { return y - x; }; }; 55 | auto _sub_ = std::minus{}; 56 | auto _or_ = std::logical_or{}; 57 | auto _and_ = std::logical_and{}; 58 | auto _not = std::logical_not{}; 59 | auto _min_ = [](auto a, auto b) { return std::min(a, b); }; 60 | auto _max_ = [](auto a, auto b) { return std::max(a, b); }; 61 | auto _fst = [](auto t) { return std::get<0>(t); }; 62 | auto _snd = [](auto t) { return std::get<1>(t); }; 63 | 64 | } // namespace combinators 65 | -------------------------------------------------------------------------------- /vendor/bela/include/hazel/details/ELFRelocs/SystemZ.def: -------------------------------------------------------------------------------- 1 | 2 | #ifndef ELF_RELOC 3 | #error "ELF_RELOC must be defined" 4 | #endif 5 | 6 | ELF_RELOC(R_390_NONE, 0) 7 | ELF_RELOC(R_390_8, 1) 8 | ELF_RELOC(R_390_12, 2) 9 | ELF_RELOC(R_390_16, 3) 10 | ELF_RELOC(R_390_32, 4) 11 | ELF_RELOC(R_390_PC32, 5) 12 | ELF_RELOC(R_390_GOT12, 6) 13 | ELF_RELOC(R_390_GOT32, 7) 14 | ELF_RELOC(R_390_PLT32, 8) 15 | ELF_RELOC(R_390_COPY, 9) 16 | ELF_RELOC(R_390_GLOB_DAT, 10) 17 | ELF_RELOC(R_390_JMP_SLOT, 11) 18 | ELF_RELOC(R_390_RELATIVE, 12) 19 | ELF_RELOC(R_390_GOTOFF, 13) 20 | ELF_RELOC(R_390_GOTPC, 14) 21 | ELF_RELOC(R_390_GOT16, 15) 22 | ELF_RELOC(R_390_PC16, 16) 23 | ELF_RELOC(R_390_PC16DBL, 17) 24 | ELF_RELOC(R_390_PLT16DBL, 18) 25 | ELF_RELOC(R_390_PC32DBL, 19) 26 | ELF_RELOC(R_390_PLT32DBL, 20) 27 | ELF_RELOC(R_390_GOTPCDBL, 21) 28 | ELF_RELOC(R_390_64, 22) 29 | ELF_RELOC(R_390_PC64, 23) 30 | ELF_RELOC(R_390_GOT64, 24) 31 | ELF_RELOC(R_390_PLT64, 25) 32 | ELF_RELOC(R_390_GOTENT, 26) 33 | ELF_RELOC(R_390_GOTOFF16, 27) 34 | ELF_RELOC(R_390_GOTOFF64, 28) 35 | ELF_RELOC(R_390_GOTPLT12, 29) 36 | ELF_RELOC(R_390_GOTPLT16, 30) 37 | ELF_RELOC(R_390_GOTPLT32, 31) 38 | ELF_RELOC(R_390_GOTPLT64, 32) 39 | ELF_RELOC(R_390_GOTPLTENT, 33) 40 | ELF_RELOC(R_390_PLTOFF16, 34) 41 | ELF_RELOC(R_390_PLTOFF32, 35) 42 | ELF_RELOC(R_390_PLTOFF64, 36) 43 | ELF_RELOC(R_390_TLS_LOAD, 37) 44 | ELF_RELOC(R_390_TLS_GDCALL, 38) 45 | ELF_RELOC(R_390_TLS_LDCALL, 39) 46 | ELF_RELOC(R_390_TLS_GD32, 40) 47 | ELF_RELOC(R_390_TLS_GD64, 41) 48 | ELF_RELOC(R_390_TLS_GOTIE12, 42) 49 | ELF_RELOC(R_390_TLS_GOTIE32, 43) 50 | ELF_RELOC(R_390_TLS_GOTIE64, 44) 51 | ELF_RELOC(R_390_TLS_LDM32, 45) 52 | ELF_RELOC(R_390_TLS_LDM64, 46) 53 | ELF_RELOC(R_390_TLS_IE32, 47) 54 | ELF_RELOC(R_390_TLS_IE64, 48) 55 | ELF_RELOC(R_390_TLS_IEENT, 49) 56 | ELF_RELOC(R_390_TLS_LE32, 50) 57 | ELF_RELOC(R_390_TLS_LE64, 51) 58 | ELF_RELOC(R_390_TLS_LDO32, 52) 59 | ELF_RELOC(R_390_TLS_LDO64, 53) 60 | ELF_RELOC(R_390_TLS_DTPMOD, 54) 61 | ELF_RELOC(R_390_TLS_DTPOFF, 55) 62 | ELF_RELOC(R_390_TLS_TPOFF, 56) 63 | ELF_RELOC(R_390_20, 57) 64 | ELF_RELOC(R_390_GOT20, 58) 65 | ELF_RELOC(R_390_GOTPLT20, 59) 66 | ELF_RELOC(R_390_TLS_GOTIE20, 60) 67 | ELF_RELOC(R_390_IRELATIVE, 61) 68 | ELF_RELOC(R_390_PC12DBL, 62) 69 | ELF_RELOC(R_390_PLT12DBL, 63) 70 | ELF_RELOC(R_390_PC24DBL, 64) 71 | ELF_RELOC(R_390_PLT24DBL, 65) 72 | -------------------------------------------------------------------------------- /vendor/bela/src/hazel/zip/filemode.cc: -------------------------------------------------------------------------------- 1 | /// 2 | #include 3 | #include "zipinternal.hpp" 4 | 5 | namespace hazel::zip { 6 | using bela::os::FileMode; 7 | std::string String(FileMode m) { 8 | constexpr const char str[] = "dalTLDpSugct?"; 9 | char buf[32] = {0}; // 10 | size_t w = 0; 11 | for (size_t i = 0; i < 13; i++) { 12 | if ((m & (1 << (32 - 1 - i))) != 0) { 13 | buf[w] = str[i]; 14 | w++; 15 | } 16 | } 17 | if (w == 0) { 18 | buf[w] = '-'; 19 | w++; 20 | } 21 | constexpr const char rwx[] = "rwxrwxrwx"; 22 | for (size_t i = 0; i < 11; i++) { 23 | if ((m & (1 << (9 - 1 - i))) != 0) { 24 | buf[w] = rwx[i]; 25 | } else { 26 | buf[w] = '-'; 27 | } 28 | w++; 29 | } 30 | return std::string{buf, w}; 31 | } 32 | 33 | FileMode unixModeToFileMode(uint32_t m) { 34 | uint32_t mode = static_cast(m & 0777); 35 | switch (m & s_IFMT) { 36 | case s_IFBLK: 37 | mode |= FileMode::ModeDevice; 38 | break; 39 | case s_IFCHR: 40 | mode |= FileMode::ModeDevice | FileMode::ModeCharDevice; 41 | break; 42 | case s_IFDIR: 43 | mode |= FileMode::ModeDir; 44 | break; 45 | case s_IFIFO: 46 | mode |= FileMode::ModeNamedPipe; 47 | break; 48 | case s_IFLNK: 49 | mode |= FileMode::ModeSymlink; 50 | break; 51 | case s_IFREG: 52 | break; 53 | case s_IFSOCK: 54 | mode |= FileMode::ModeSocket; 55 | break; 56 | default: 57 | break; 58 | } 59 | if ((m & s_ISGID) != 0) { 60 | mode |= FileMode::ModeSetgid; 61 | } 62 | if ((m & s_ISUID) != 0) { 63 | mode |= FileMode::ModeSetuid; 64 | } 65 | if ((m & s_ISVTX) != 0) { 66 | mode |= FileMode::ModeSticky; 67 | } 68 | return static_cast(mode); 69 | } 70 | 71 | FileMode msdosModeToFileMode(uint32_t m) { 72 | uint32_t mode = 0; 73 | if ((m & msdosDir) != 0) { 74 | mode = FileMode::ModeDir | 0777; 75 | } else { 76 | mode = 0666; 77 | } 78 | if ((m & msdosReadOnly) != 0) { 79 | mode &= ~0222; 80 | } 81 | return static_cast(mode); 82 | } 83 | 84 | FileMode resolveFileMode(const File &file, uint32_t externalAttrs) { 85 | auto mode = static_cast(0); 86 | auto n = file.version_madeby >> 8; 87 | if (n == creatorUnix || n == creatorMacOSX) { 88 | mode = unixModeToFileMode(externalAttrs >> 16); 89 | } else if (n == creatorNTFS || n == creatorVFAT || n == creatorFAT) { 90 | mode = msdosModeToFileMode(externalAttrs); 91 | } 92 | if (file.name.ends_with('/') || file.name.ends_with('\\')) { 93 | mode = mode | FileMode::ModeDir; 94 | } 95 | return mode; 96 | } 97 | } // namespace hazel::zip -------------------------------------------------------------------------------- /Privexec/alias.cc: -------------------------------------------------------------------------------- 1 | ///////////// 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include "app.hpp" 12 | 13 | namespace priv { 14 | struct alias_item_t { 15 | std::string_view name; 16 | std::string_view desc; 17 | std::string_view target; 18 | }; 19 | bool AppAliasInitializeBuilt(std::wstring_view file) { 20 | constexpr alias_item_t items[] = { 21 | {"edit-hosts", "Edit Hosts", "Notepad %windir%\\System32\\Drivers\\etc\\hosts"}, // 22 | }; 23 | try { 24 | nlohmann::json j; 25 | nlohmann::json alias; 26 | for (const auto &i : items) { 27 | nlohmann::json a; 28 | a["name"] = i.name; 29 | a["description"] = i.desc; 30 | a["target"] = i.target; 31 | alias.push_back(std::move(a)); 32 | } 33 | j["alias"] = alias; 34 | bela::error_code ec; 35 | std::filesystem::path p(file); 36 | auto parent = p.parent_path(); 37 | if (std::error_code e; !std::filesystem::exists(parent, e)) { 38 | if (!std::filesystem::create_directories(parent, e)) { 39 | ec = bela::make_error_code_from_std(e); 40 | return false; 41 | } 42 | } 43 | if (!bela::io::AtomicWriteText(file, bela::io::as_bytes(j.dump(4)), ec)) { 44 | return false; 45 | } 46 | } catch (const std::exception &e) { 47 | OutputDebugStringA(e.what()); 48 | return false; 49 | } 50 | return true; 51 | } 52 | 53 | std::wstring AppAliasFile() { 54 | // 55 | return PathSearcher::Instance().JoinAppData(LR"(Privexec\Privexec.json)"); 56 | } 57 | 58 | bool AppAliasInitialize(HWND hbox, priv::alias_t &alias) { 59 | auto file = PathSearcher::Instance().JoinAppData(LR"(Privexec\Privexec.json)"); 60 | if (!bela::PathExists(file)) { 61 | if (!AppAliasInitializeBuilt(file)) { 62 | return false; 63 | } 64 | } 65 | priv::FD fd; 66 | if (_wfopen_s(&fd.fd, file.data(), L"rb") != 0) { 67 | return false; 68 | } 69 | try { 70 | auto json = nlohmann::json::parse(fd.fd, nullptr, true, true); 71 | auto cmds = json["alias"]; 72 | for (auto &cmd : cmds) { 73 | auto desc = bela::encode_into(cmd["description"].get()); 74 | alias.insert_or_assign(desc, bela::encode_into(cmd["target"].get())); 75 | ::SendMessageW(hbox, CB_ADDSTRING, 0, (LPARAM)desc.data()); 76 | } 77 | } catch (const std::exception &e) { 78 | OutputDebugStringA(e.what()); 79 | return false; 80 | } 81 | return true; 82 | } 83 | } // namespace priv 84 | --------------------------------------------------------------------------------