You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
rdpwrap/docs/BUILDING.md

7.1 KiB

Building RDP Wrapper Locally

This document covers the full local build pipeline — from prerequisites to the final ./build/ artefacts.


Prerequisites

Component Version Notes
Windows 10/11 x64 any Host OS
.NET SDK 10.0+ winget install Microsoft.DotNet.SDK.10
Visual Studio 2019 Build Tools 16.x For C++ DLL only
MSVC v142 toolset 14.29+ Installed via VS Build Tools installer
Windows SDK 10.0.19041+ Installed via VS Build Tools installer

ARM64 DLL note: Building rdpwrap_arm64.dll locally requires Visual Studio 2022 with the "MSVC v143 — VS 2022 C++ ARM64 build tools" component. The GitHub Actions CI uses a hosted windows-latest runner which provides this. For local work, the x64 and Win32 DLLs are sufficient for testing.


1. Clone the repository

git clone --recurse-submodules https://github.com/<owner>/rdpwrap.git
cd rdpwrap

If you already cloned without --recurse-submodules:

git submodule update --init --recursive

2. Generate application icons

The C# tool icons are generated programmatically via a helper script and are not committed to source control. Run this once after cloning (and again if you delete them):

.\tools\make-icons.ps1

This creates:

  • src-csharp/RDPConf/app.ico — blue "C" icon for RDPConf
  • src-csharp/RDPCheck/app.ico — green "K" icon for RDPCheck

Both files are .gitignore-exempt (not listed) so they persist in your working tree.


3. Build the C++ DLL (rdpwrap.dll)

Locate MSBuild

Visual Studio 2019 Build Tools installs MSBuild to a non-standard path.
Add it to your session PATH once (or use the full path as shown below):

$msbuild = "C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\MSBuild\Current\Bin\amd64\MSBuild.exe"

If you have Visual Studio IDE installed instead of Build Tools, the path is: C:\Program Files\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\amd64\MSBuild.exe

One-time vcxproj fix

The Windows SDK 10.0.19041 headers emit a C2338 packing warning that is treated as an error under /WX. It has no behavioural effect — the fix is already applied in src-x86-x64-Fusix/RDPWrap.vcxproj via the WINDOWS_IGNORE_PACKING_MISMATCH define. No manual action is required.

Build x64 and Win32

$msbuild = "C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\MSBuild\Current\Bin\amd64\MSBuild.exe"

& $msbuild src-x86-x64-Fusix\RDPWrap.sln `
    /p:Configuration=Release /p:Platform=x64  `
    /p:PlatformToolset=v142   `
    /p:WindowsTargetPlatformVersion=10.0.19041.0 `
    /m /v:m

& $msbuild src-x86-x64-Fusix\RDPWrap.sln `
    /p:Configuration=Release /p:Platform=Win32 `
    /p:PlatformToolset=v142   `
    /p:WindowsTargetPlatformVersion=10.0.19041.0 `
    /m /v:m

Expect C4244 / C4267 type-conversion warnings from the Zydis disassembler submodule — these are benign and can be ignored.

Output locations

Platform Output path
x64 src-x86-x64-Fusix/x64/Release/RDPWrap.dll
Win32 src-x86-x64-Fusix/Release/RDPWrap.dll

4. Build C# tools

All three C# tools are published as self-contained single-file executables using dotnet publish.

Architectures

RID Description
win-x64 64-bit Intel/AMD
win-x86 32-bit Intel/AMD
win-arm64 ARM64 (cross-compiled, no native toolchain needed)

Commands

$TOOLS = @("RDPConf", "RDPCheck", "RDPWInst")
$RIDS  = @("win-x64", "win-x86", "win-arm64")

foreach ($tool in $TOOLS) {
    foreach ($rid in $RIDS) {
        $arch = $rid -replace "win-", ""
        $out  = "build\staging\$tool\$rid"
        dotnet publish "src-csharp\$tool\$tool.csproj" `
            -c Release -r $rid `
            --self-contained true `
            -p:PublishSingleFile=true `
            -p:IncludeNativeLibrariesForSelfExtract=true `
            -p:PublishTrimmed=false `
            -p:Version=1.0.0 `
            -o $out
    }
}

Output

After publishing, executables are in build/staging/<Tool>/<RID>/:

build\staging\RDPConf\win-x64\RDPConf.exe
build\staging\RDPConf\win-x86\RDPConf.exe
build\staging\RDPConf\win-arm64\RDPConf.exe
build\staging\RDPCheck\win-x64\RDPCheck.exe
...

5. Assemble ./build/

Copy all artefacts to a flat ./build/ directory:

New-Item -Force -ItemType Directory build | Out-Null

# DLLs
Copy-Item src-x86-x64-Fusix\x64\Release\RDPWrap.dll  build\rdpwrap_x64.dll
Copy-Item src-x86-x64-Fusix\Release\RDPWrap.dll       build\rdpwrap_x86.dll

# C# executables
foreach ($tool in @("RDPConf","RDPCheck","RDPWInst")) {
    foreach ($rid in @("win-x64","win-x86","win-arm64")) {
        $arch = $rid -replace "win-",""
        Copy-Item "build\staging\$tool\$rid\$tool.exe" `
                  "build\${tool}_${arch}.exe"
    }
}

# Cleanup staging
Remove-Item -Recurse -Force build\staging

Final ./build/ layout

build/
  rdpwrap_x64.dll       # x64 termsrv.dll hook
  rdpwrap_x86.dll       # x86 termsrv.dll hook
  RDPConf_x64.exe       # GUI config tool (x64)
  RDPConf_x86.exe       # GUI config tool (x86)
  RDPConf_arm64.exe     # GUI config tool (ARM64)
  RDPCheck_x64.exe      # RDP loopback tester (x64)
  RDPCheck_x86.exe      # RDP loopback tester (x86)
  RDPCheck_arm64.exe    # RDP loopback tester (ARM64)
  RDPWInst_x64.exe      # CLI installer (x64)
  RDPWInst_x86.exe      # CLI installer (x86)
  RDPWInst_arm64.exe    # CLI installer (ARM64)

./build/ is listed in .gitignore — artefacts are not committed.


6. Automated script

All steps 25 are automated in tools/build-local.ps1.
Run it from the repo root:

.\tools\build-local.ps1

Optional flag to skip the DLL rebuild (faster during C# iteration):

.\tools\build-local.ps1 -SkipCpp

7. Troubleshooting

MSBuild not found

Verify VS 2019 Build Tools are installed.
Open the Visual Studio Installer → Modify → ensure
"Desktop development with C++" and "MSVC v142 build tools" are checked.

ARM64 DLL: error MSB8013

No ARM64 cross-compiler found. Either install VS 2022 with ARM64 tools or skip ARM64
(-SkipArm64Dll flag in build-local.ps1). The ARM64 DLL is produced by CI.

error C2338: Windows headers require the default packing option

WINDOWS_IGNORE_PACKING_MISMATCH is missing from PreprocessorDefinitions.
Run the following once then rebuild:

(Get-Content src-x86-x64-Fusix\RDPWrap.vcxproj) `
    -replace '(<PreprocessorDefinitions>)([^<]+)(<)', `
             '$1$2;WINDOWS_IGNORE_PACKING_MISMATCH$3' |
    Set-Content src-x86-x64-Fusix\RDPWrap.vcxproj

dotnet publish fails with SDK not found

Ensure .NET 10 SDK is installed: dotnet --version should print 10.x.x.


Appendix: CI vs local comparison

Feature Local build GitHub Actions CI
x64 DLL
x86 DLL
ARM64 DLL (needs VS 2022)
C# x64/x86/arm64 (cross-compiled)
Code signing (if cert configured)
GitHub Release (on tag push)