Merge pull request #2 from sjackson0109/feature/ci-cd-auto-ini-offset-gen

feat: CI/CD pipelines, auto-INI update, auto-offset generation
pull/4062/head
Simon Jackson 1 month ago committed by GitHub
commit 8b7184f97a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -0,0 +1,89 @@
name: Build C++ DLL
# Trigger on version tags (e.g. v1.7.0) or manually
on:
push:
tags:
- 'v*'
workflow_dispatch:
permissions:
contents: write
jobs:
# ── Build x64 and Win32 release DLLs ─────────────────────────────────────────
build:
runs-on: windows-2022
strategy:
matrix:
platform: [x64, Win32]
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup MSBuild
uses: microsoft/setup-msbuild@v2
# Override the v120 platform toolset with the VS 2022 toolset (v143).
# The rdpwrap C++ source is standard Win32 API code and compiles cleanly
# with any modern MSVC version.
- name: Build rdpwrap.dll (${{ matrix.platform }})
working-directory: src-x86-x64-Fusix
run: |
msbuild RDPWrap.vcxproj `
/p:Configuration=Release `
/p:Platform="${{ matrix.platform }}" `
/p:PlatformToolset=v143 `
/p:WindowsTargetPlatformVersion=10.0
- name: Upload ${{ matrix.platform }} artifact
uses: actions/upload-artifact@v4
with:
name: rdpwrap-dll-${{ matrix.platform }}
path: src-x86-x64-Fusix/${{ matrix.platform }}/Release/rdpwrap.dll
if-no-files-found: error
# ── Assemble a GitHub Release from both DLL artifacts ────────────────────────
release:
needs: build
runs-on: ubuntu-latest
if: startsWith(github.ref, 'refs/tags/')
steps:
- name: Download x64 artifact
uses: actions/download-artifact@v4
with:
name: rdpwrap-dll-x64
path: ./dist/x64
- name: Download Win32 artifact
uses: actions/download-artifact@v4
with:
name: rdpwrap-dll-Win32
path: ./dist/x86
- name: Rename DLLs for release
run: |
mv dist/x64/rdpwrap.dll dist/rdpwrap_x64.dll
mv dist/x86/rdpwrap.dll dist/rdpwrap_x86.dll
- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
make_latest: false
body: |
## RDP Wrapper DLL ${{ github.ref_name }}
Built from `src-x86-x64-Fusix/` with MSVC v143 (VS 2022).
| File | Architecture |
|---|---|
| `rdpwrap_x64.dll` | x86-64 (64-bit Windows) |
| `rdpwrap_x86.dll` | x86 (32-bit Windows) |
> Place the appropriate DLL in `C:\Program Files\RDP Wrapper\rdpwrap.dll`
> and run `RDPWInst.exe -i` to install.
files: |
dist/rdpwrap_x64.dll
dist/rdpwrap_x86.dll

@ -0,0 +1,137 @@
name: Publish INI and Offset Finder Tools
on:
push:
branches: [main, master]
paths:
- 'res/rdpwrap.ini'
- '.github/workflows/publish-ini.yml'
workflow_dispatch:
permissions:
contents: write
jobs:
publish:
runs-on: windows-2022
steps:
- name: Checkout repository
uses: actions/checkout@v4
# ── Extract the date string used for tagging and the updated field ──────
- name: Get release metadata
id: meta
shell: pwsh
run: |
$date = Get-Date -Format "yyyy.MM.dd.HHmm"
$stamp = Get-Date -Format "yyyy-MM-dd HH:mm UTC"
# Pull the Updated= line out of the INI to surface in release notes
$iniContent = Get-Content res/rdpwrap.ini -Raw
$iniDate = if ($iniContent -match 'Updated=([^\r\n]+)') { $Matches[1] } else { 'unknown' }
echo "date=$date" >> $env:GITHUB_OUTPUT
echo "stamp=$stamp" >> $env:GITHUB_OUTPUT
echo "inidate=$iniDate" >> $env:GITHUB_OUTPUT
# ── Download the latest RDPWrapOffsetFinder release zip from llccd ──────
- name: Download RDPWrapOffsetFinder
id: finder
shell: pwsh
run: |
$zip = "RDPWrapOffsetFinder.zip"
# Resolve the real latest-release download URL via the GitHub API
$apiUrl = "https://api.github.com/repos/llccd/RDPWrapOffsetFinder/releases/latest"
$release = Invoke-RestMethod -Uri $apiUrl -Headers @{ "User-Agent" = "rdpwrap-ci" }
$asset = $release.assets | Where-Object { $_.name -like "*.zip" } | Select-Object -First 1
if (-not $asset) { throw "No zip asset found in latest RDPWrapOffsetFinder release" }
Write-Host "Downloading $($asset.browser_download_url)"
Invoke-WebRequest -Uri $asset.browser_download_url -OutFile $zip
# Expand the archive
Expand-Archive -Path $zip -DestinationPath .\finder -Force
# Diagnostic: show what we got
Write-Host "Zip contents:"
Get-ChildItem -Recurse .\finder | Select-Object FullName
# Helper: find a file by name pattern, preferring arch-specific subdirs
function Find-Binary($pattern, $archHint) {
$hits = Get-ChildItem -Recurse -Filter $pattern .\finder
# prefer paths that contain the arch hint
$match = $hits | Where-Object { $_.FullName -match $archHint } | Select-Object -First 1
if (-not $match) { $match = $hits | Select-Object -First 1 }
return $match
}
$x64exe = Find-Binary "RDPWrapOffsetFinder*.exe" "x64"
$x86exe = Find-Binary "RDPWrapOffsetFinder*.exe" "x86|Win32|32"
$x64dll = Find-Binary "Zydis*.dll" "x64"
$x86dll = Find-Binary "Zydis*.dll" "x86|Win32|32"
# If only one exe/dll variant exists, use it for both architectures
if (-not $x86exe) { $x86exe = $x64exe }
if (-not $x86dll) { $x86dll = $x64dll }
if (-not $x64exe) { throw "Could not locate RDPWrapOffsetFinder exe in zip" }
if (-not $x64dll) { throw "Could not locate Zydis dll in zip" }
Copy-Item $x64exe.FullName .\RDPWrapOffsetFinder_x64.exe
Copy-Item $x86exe.FullName .\RDPWrapOffsetFinder_x86.exe
Copy-Item $x64dll.FullName .\Zydis_x64.dll
Copy-Item $x86dll.FullName .\Zydis_x86.dll
Write-Host "Staged binaries:"
Get-ChildItem .\RDPWrapOffsetFinder_*.exe, .\Zydis_*.dll |
Format-Table Name, Length
echo "finder_ver=$($release.tag_name)" >> $env:GITHUB_OUTPUT
# ── Validate the INI has required sections ───────────────────────────────
- name: Validate INI
shell: pwsh
run: |
$ini = Get-Content res/rdpwrap.ini -Raw
foreach ($section in @('[Main]', '[SLPolicy]', '[PatchCodes]')) {
if ($ini -notmatch [regex]::Escape($section)) {
throw "INI validation failed: missing required section $section"
}
}
$sectionCount = ([regex]::Matches($ini, '^\[[\d\.]+\]', 'Multiline')).Count
Write-Host "INI is valid. Windows-version sections: $sectionCount"
# ── Create/update a versioned GitHub Release with all assets ─────────────
- name: Publish release
uses: softprops/action-gh-release@v2
with:
tag_name: "ini-${{ steps.meta.outputs.date }}"
name: "INI Update ${{ steps.meta.outputs.date }}"
make_latest: true
body: |
## RDP Wrapper — Automated INI Release
| Field | Value |
|---|---|
| INI `Updated` date | `${{ steps.meta.outputs.inidate }}` |
| Published | ${{ steps.meta.outputs.stamp }} |
| RDPWrapOffsetFinder | ${{ steps.finder.outputs.finder_ver }} |
### Assets
| File | Purpose |
|---|---|
| `rdpwrap.ini` | Latest offset database for all known termsrv.dll versions |
| `RDPWrapOffsetFinder_x64.exe` | Auto-generates offsets for unknown x64 Windows builds |
| `RDPWrapOffsetFinder_x86.exe` | Auto-generates offsets for unknown x86 Windows builds |
| `Zydis_x64.dll` / `Zydis_x86.dll` | Required runtime for the offset finder |
The installer fetches `rdpwrap.ini` from this release automatically.
If your termsrv.dll version is not in the INI, the installer downloads the
offset finder tools and generates the missing section on-the-fly.
files: |
res/rdpwrap.ini
RDPWrapOffsetFinder_x64.exe
RDPWrapOffsetFinder_x86.exe
Zydis_x64.dll
Zydis_x86.dll

@ -1,11 +1,15 @@
# RDP Wrapper Library by Stas'M # RDP Wrapper Library
> **Maintained fork** by [@sjackson0109](https://github.com/sjackson0109) — based on the original work by [Stas'M / binarymaster](https://github.com/stascorp/rdpwrap).
[![Telegram](https://img.shields.io/badge/chat-Telegram-blue.svg)](https://t.me/rdpwrap) [![Telegram](https://img.shields.io/badge/chat-Telegram-blue.svg)](https://t.me/rdpwrap)
![Environment](https://img.shields.io/badge/Windows-Vista,%207,%208,%2010-brightgreen.svg) ![Environment](https://img.shields.io/badge/Windows-Vista%20through%2011-brightgreen.svg)
[![Release](https://img.shields.io/github/release/stascorp/rdpwrap.svg)](https://github.com/stascorp/rdpwrap/releases) [![Release](https://img.shields.io/github/release/sjackson0109/rdpwrap.svg)](https://github.com/sjackson0109/rdpwrap/releases)
![License](https://img.shields.io/github/license/stascorp/rdpwrap.svg) [![INI publish](https://github.com/sjackson0109/rdpwrap/actions/workflows/publish-ini.yml/badge.svg)](https://github.com/sjackson0109/rdpwrap/actions/workflows/publish-ini.yml)
![Downloads](https://img.shields.io/github/downloads/stascorp/rdpwrap/latest/total.svg) [![Build C++ DLL](https://github.com/sjackson0109/rdpwrap/actions/workflows/build-cpp.yml/badge.svg)](https://github.com/sjackson0109/rdpwrap/actions/workflows/build-cpp.yml)
![TotalDownloads](https://img.shields.io/github/downloads/stascorp/rdpwrap/total.svg) ![License](https://img.shields.io/github/license/sjackson0109/rdpwrap.svg)
![Downloads](https://img.shields.io/github/downloads/sjackson0109/rdpwrap/latest/total.svg)
![TotalDownloads](https://img.shields.io/github/downloads/sjackson0109/rdpwrap/total.svg)
The goal of this project is to enable Remote Desktop Host support and concurrent RDP sessions on reduced functionality systems for home usage. The goal of this project is to enable Remote Desktop Host support and concurrent RDP sessions on reduced functionality systems for home usage.
@ -64,21 +68,30 @@ It's recommended to have original termsrv.dll file with the RDP Wrapper installa
- Windows 2000, XP and Server 2003 will not be supported - Windows 2000, XP and Server 2003 will not be supported
### Key features: ### Key features:
- RDP host server on any Windows edition beginning from Vista - RDP host server on any Windows edition beginning from Vista through Windows 11
- Console and remote sessions at the same time - Console and remote sessions at the same time
- Using the same user simultaneously for local and remote logon (see configuration app) - Using the same user simultaneously for local and remote logon (see configuration app)
- Up to [15 concurrent sessions](https://github.com/stascorp/rdpwrap/issues/192) (the actual limitation depends on your hardware and OS version) - Up to [15 concurrent sessions](https://github.com/stascorp/rdpwrap/issues/192) (the actual limitation depends on your hardware and OS version)
- Console and RDP session shadowing (using [Task Manager in Windows 7](http://cdn.freshdesk.com/data/helpdesk/attachments/production/1009641577/original/remote_control.png?1413476051) and lower, and [Remote Desktop Connection in Windows 8](http://woshub.com/rds-shadow-how-to-connect-to-a-user-session-in-windows-server-2012-r2/) and higher) - Console and RDP session shadowing (using [Task Manager in Windows 7](http://cdn.freshdesk.com/data/helpdesk/attachments/production/1009641577/original/remote_control.png?1413476051) and lower, and [Remote Desktop Connection in Windows 8](http://woshub.com/rds-shadow-how-to-connect-to-a-user-session-in-windows-server-2012-r2/) and higher)
- Full [multi-monitor support](https://github.com/stascorp/rdpwrap/issues/163) for RDP host - Full [multi-monitor support](https://github.com/stascorp/rdpwrap/issues/163) for RDP host
- ...and if you find a new feature not listed here, [tell us](https://github.com/stascorp/rdpwrap/issues/new) ;) - **Automatic INI updates** — the installer fetches the latest `rdpwrap.ini` directly from [GitHub Releases](https://github.com/sjackson0109/rdpwrap/releases/latest), published automatically by CI/CD on every change
- **Auto-generation of offsets for unknown builds** — if your `termsrv.dll` version is not yet in the INI, the installer downloads [RDPWrapOffsetFinder](https://github.com/llccd/RDPWrapOffsetFinder) and generates the missing section on-the-fly (inspired by [sergiye/rdpWrapper](https://github.com/sergiye/rdpWrapper))
- ...and if you find a new feature not listed here, [tell us](https://github.com/sjackson0109/rdpwrap/issues/new) ;)
### Porting to other platforms: ### Porting to other platforms:
- **ARM** for Windows RT (see links below) - **ARM** for Windows RT (see links below)
- **IA-64** for Itanium-based Windows Server? *Well, I have no idea* :) - **IA-64** for Itanium-based Windows Server? *Well, I have no idea* :)
### Building the binaries: ### Building the binaries:
- **x86 Delphi version** can be built with *Embarcadero RAD Studio 2010* - **x86 Delphi version** (installer, config tool, checker) — requires *Embarcadero RAD Studio 2010* or later; no automated CI yet
- **x86/x64 C++ version** can be built with *Microsoft Visual Studio 2013* - **x86/x64 C++ version** (`rdpwrap.dll`) — can be built locally with *Visual Studio 2013+*, or automatically via the [Build C++ DLL](.github/workflows/build-cpp.yml) GitHub Actions workflow (uses MSVC v143 / VS 2022) by pushing a `v*` tag
### CI/CD Pipelines:
| Workflow | Trigger | Output |
|---|---|---|
| [publish-ini.yml](.github/workflows/publish-ini.yml) | Push to `main`/`master` touching `res/rdpwrap.ini`, or manual | GitHub Release with `rdpwrap.ini`, `RDPWrapOffsetFinder_x64/x86.exe`, `Zydis_x64/x86.dll` |
| [build-cpp.yml](.github/workflows/build-cpp.yml) | Version tag push (`v*`) | GitHub Release with `rdpwrap_x64.dll` and `rdpwrap_x86.dll` |
[andrewblock]: http://web.archive.org/web/20150810054558/http://andrewblock.net/enable-remote-desktop-on-windows-8-core/ [andrewblock]: http://web.archive.org/web/20150810054558/http://andrewblock.net/enable-remote-desktop-on-windows-8-core/
[mydigitallife]: http://forums.mydigitallife.info/threads/55935-RDP-Wrapper-Library-(works-with-Windows-8-1-Basic) [mydigitallife]: http://forums.mydigitallife.info/threads/55935-RDP-Wrapper-Library-(works-with-Windows-8-1-Basic)
@ -87,8 +100,14 @@ It's recommended to have original termsrv.dll file with the RDP Wrapper installa
[yt-offsets]: http://www.youtube.com/watch?v=FiD86tmRBtk [yt-offsets]: http://www.youtube.com/watch?v=FiD86tmRBtk
### Links: ### Links:
- Official GitHub repository: - **This fork (maintained):**
<br>https://github.com/sjackson0109/rdpwrap/
- Original upstream repository (archived / unmaintained):
<br>https://github.com/stascorp/rdpwrap/ <br>https://github.com/stascorp/rdpwrap/
- Inspiration for auto-offset generation:
<br>[sergiye/rdpWrapper](https://github.com/sergiye/rdpWrapper)
- Offset finder tool used for auto-generation:
<br>[llccd/RDPWrapOffsetFinder](https://github.com/llccd/RDPWrapOffsetFinder)
- Official Telegram chat: - Official Telegram chat:
<br>https://t.me/rdpwrap <br>https://t.me/rdpwrap
- Active discussion in the comments here: - Active discussion in the comments here:
@ -119,7 +138,7 @@ It's recommended to have original termsrv.dll file with the RDP Wrapper installa
> Where can I download the installer or binaries? > Where can I download the installer or binaries?
In the [GitHub Releases](https://github.com/stascorp/rdpwrap/releases) section. In the [GitHub Releases](https://github.com/sjackson0109/rdpwrap/releases) section.
> Is it legal to use this application? > Is it legal to use this application?
@ -131,7 +150,7 @@ Yes, it works in online mode by default. You may disable it by removing `-o` fla
> What is online install mode? > What is online install mode?
Online install mode introduced in version 1.6.1. When you installing RDP Wrapper first time using this mode, it will download [latest INI file](https://github.com/stascorp/rdpwrap/blob/master/res/rdpwrap.ini) from GitHub. See [this discussion](https://github.com/stascorp/rdpwrap/issues/132). Online install mode was introduced in version 1.6.1. When installing for the first time using this mode, the installer downloads the [latest `rdpwrap.ini`](https://github.com/sjackson0109/rdpwrap/releases/latest/download/rdpwrap.ini) from this repository's GitHub Releases — published automatically by CI/CD whenever `res/rdpwrap.ini` is updated. If your `termsrv.dll` version is not yet listed in the downloaded INI, the installer will additionally download [RDPWrapOffsetFinder](https://github.com/llccd/RDPWrapOffsetFinder) and attempt to auto-generate the missing offsets on the spot.
> What is INI file and why we need it? > What is INI file and why we need it?
@ -143,11 +162,11 @@ Beginning with version 1.5 the `rdpwrap.dll` is not updated anymore, since all s
> Config Tool shows `[not supported]` and RDP doesn't work. What can I do? > Config Tool shows `[not supported]` and RDP doesn't work. What can I do?
Make sure you're connected to the Internet and run `update.bat`. Make sure you're connected to the Internet and run `update.bat`. This will download the latest INI from GitHub Releases and, if your `termsrv.dll` version is still missing, will automatically run [RDPWrapOffsetFinder](https://github.com/llccd/RDPWrapOffsetFinder) to generate offsets for your specific build.
> Update doesn't help, it still shows `[not supported]`. > Update doesn't help, it still shows `[not supported]`.
Visit [issues](https://github.com/stascorp/rdpwrap/issues) section, and check whether your `termsrv.dll` build is listed here. If you can't find such issue, create a new — specify your build version for adding to support. Check the [issues](https://github.com/sjackson0109/rdpwrap/issues) section to see if your `termsrv.dll` build is mentioned. If not, please open a new issue with your exact build version (shown by the Config Tool). You can also run `RDPWInst.exe -w` from an Administrator command prompt to see the full output of the update and auto-generation steps.
> Why `RDPCheck` doesn't allow to change resolution and other settings? > Why `RDPCheck` doesn't allow to change resolution and other settings?
@ -168,6 +187,14 @@ Visit [issues](https://github.com/stascorp/rdpwrap/issues) section, and check wh
### Change log: ### Change log:
#### 2026.03.29
- Fork maintained by [@sjackson0109](https://github.com/sjackson0109)
- INI source redirected from unmaintained stascorp upstream to this repository's GitHub Releases
- **CI/CD pipeline added** — [`publish-ini.yml`](.github/workflows/publish-ini.yml) publishes `rdpwrap.ini` and the `RDPWrapOffsetFinder` tools as release assets on every INI change
- **CI/CD pipeline added** — [`build-cpp.yml`](.github/workflows/build-cpp.yml) builds `rdpwrap_x64.dll` / `rdpwrap_x86.dll` via MSVC v143 (VS 2022) on version tag push
- **Auto-offset generation** added to `RDPWInst.dpr` — on install (`-i`) and update (`-w`), if the running `termsrv.dll` version is absent from the INI the installer downloads `RDPWrapOffsetFinder` from release assets and appends the generated `[x.x.xxxxx.xxxxx]` section automatically; inspired by [sergiye/rdpWrapper](https://github.com/sergiye/rdpWrapper)
- New installer helpers: `DownloadFileToDisk`, `INIHasSection`, `TryAutoGenerateOffsets`
#### 2017.12.27 #### 2017.12.27
- Version 1.6.2 - Version 1.6.2
- Installer updated - Installer updated

@ -93,6 +93,7 @@ var
TermServicePID: DWORD; TermServicePID: DWORD;
ShareSvc: Array of String; ShareSvc: Array of String;
sShareSvc: String; sShareSvc: String;
TermSrvVerTxt: String; // e.g. '10.0.26100.7623' — set by CheckTermsrvVersion
function SupportedArchitecture: Boolean; function SupportedArchitecture: Boolean;
var var
@ -617,7 +618,9 @@ end;
function GitINIFile(var Content: String): Boolean; function GitINIFile(var Content: String): Boolean;
const const
URL = 'https://raw.githubusercontent.com/stascorp/rdpwrap/master/res/rdpwrap.ini'; // Points to the latest release artifact in the sjackson0109 fork.
// The publish-ini CI/CD workflow keeps this asset up to date automatically.
URL = 'https://github.com/sjackson0109/rdpwrap/releases/latest/download/rdpwrap.ini';
var var
NetHandle: HINTERNET; NetHandle: HINTERNET;
UrlHandle: HINTERNET; UrlHandle: HINTERNET;
@ -843,6 +846,138 @@ begin
Result := True; Result := True;
end; end;
{ ──────────────────────────────────────────────────────────────────────────────
DownloadFileToDisk
Downloads the HTTP/HTTPS resource at URL and saves it to DestPath on disk.
Returns True only when the destination file exists and is non-empty.
────────────────────────────────────────────────────────────────────────────── }
function DownloadFileToDisk(const URL, DestPath: String): Boolean;
var
NetHandle: HINTERNET;
UrlHandle: HINTERNET;
FileHandle: THandle;
Buf: Array[0..4095] of Byte;
BytesRead, BytesWritten: DWORD;
begin
Result := False;
NetHandle := InternetOpen('RDP Wrapper', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
if not Assigned(NetHandle) then Exit;
UrlHandle := InternetOpenUrl(NetHandle, PChar(URL), nil, 0, INTERNET_FLAG_RELOAD, 0);
if not Assigned(UrlHandle) then
begin
InternetCloseHandle(NetHandle);
Exit;
end;
FileHandle := CreateFile(PChar(DestPath), GENERIC_WRITE, 0, nil,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
if FileHandle = INVALID_HANDLE_VALUE then
begin
InternetCloseHandle(UrlHandle);
InternetCloseHandle(NetHandle);
Exit;
end;
repeat
InternetReadFile(UrlHandle, @Buf[0], SizeOf(Buf), BytesRead);
if BytesRead > 0 then
WriteFile(FileHandle, Buf[0], BytesRead, BytesWritten, nil);
until BytesRead = 0;
CloseHandle(FileHandle);
InternetCloseHandle(UrlHandle);
InternetCloseHandle(NetHandle);
Result := FileExists(DestPath);
end;
{ ──────────────────────────────────────────────────────────────────────────────
INIHasSection
Returns True when the INI file at INIPath contains [Section].
────────────────────────────────────────────────────────────────────────────── }
function INIHasSection(const INIPath, Section: String): Boolean;
var
F: TStringList;
begin
Result := False;
if not FileExists(INIPath) then Exit;
F := TStringList.Create;
try
F.LoadFromFile(INIPath);
Result := Pos('[' + Section + ']', F.Text) > 0;
finally
F.Free;
end;
end;
{ ──────────────────────────────────────────────────────────────────────────────
TryAutoGenerateOffsets
If the current termsrv.dll version (TermSrvVerTxt) is absent from the on-disk
rdpwrap.ini, download RDPWrapOffsetFinder + Zydis from the sjackson0109 release
assets and run the finder to append the generated section to the INI.
This mirrors the approach used by sergiye/rdpWrapper (Wrapper.cs GenerateIniFile).
────────────────────────────────────────────────────────────────────────────── }
procedure TryAutoGenerateOffsets;
const
BASE_URL = 'https://github.com/sjackson0109/rdpwrap/releases/latest/download/';
var
TempDir, ExePath, DllPath, INIPath, ArchSuffix, SysCmd: String;
begin
if TermSrvVerTxt = '' then Exit;
INIPath := ExtractFilePath(ExpandPath(WrapPath)) + 'rdpwrap.ini';
if INIHasSection(INIPath, TermSrvVerTxt) then
begin
Writeln('[+] Version ', TermSrvVerTxt, ' is covered in INI.');
Exit;
end;
Writeln('[!] Version ', TermSrvVerTxt, ' not found in INI.');
Writeln('[*] Attempting automatic offset generation via RDPWrapOffsetFinder...');
if Arch = 64 then ArchSuffix := '_x64' else ArchSuffix := '_x86';
TempDir := ExpandPath('%TEMP%') + '\rdpwrapoffset';
if not ForceDirectories(TempDir) and not DirectoryExists(TempDir) then
begin
Writeln('[-] Could not create temp directory. Skipping auto-generation.');
Exit;
end;
ExePath := TempDir + '\RDPWrapOffsetFinder.exe';
DllPath := TempDir + '\Zydis.dll';
Writeln('[*] Downloading RDPWrapOffsetFinder', ArchSuffix, '.exe ...');
if not DownloadFileToDisk(BASE_URL + 'RDPWrapOffsetFinder' + ArchSuffix + '.exe', ExePath) then
begin
Writeln('[-] Download failed. The release asset may not yet be published.');
Writeln('[!] Run the publish-ini workflow on the sjackson0109/rdpwrap repository,');
Writeln('[!] then re-run this installer to enable auto-generation.');
Exit;
end;
Writeln('[*] Downloading Zydis', ArchSuffix, '.dll ...');
if not DownloadFileToDisk(BASE_URL + 'Zydis' + ArchSuffix + '.dll', DllPath) then
begin
Writeln('[-] Zydis download failed. Skipping auto-generation.');
DeleteFile(ExePath);
Exit;
end;
Writeln('[*] Running offset finder for termsrv.dll ', TermSrvVerTxt, ' ...');
{ Run via cmd.exe so >> redirect to the INI file works correctly. }
SysCmd := ExpandPath('%SystemRoot%') + '\System32\cmd.exe';
ExecWait('"' + SysCmd + '" /c ""' + ExePath + '" >> "' + INIPath + '""');
if INIHasSection(INIPath, TermSrvVerTxt) then
Writeln('[+] Offsets generated successfully for version ', TermSrvVerTxt)
else
Writeln('[!] Offset finder ran but [', TermSrvVerTxt, '] was not added.',
' Session may be limited or unstable for this build.');
{ Clean up temporary tool files }
DeleteFile(ExePath);
DeleteFile(DllPath);
RemoveDirectory(PChar(TempDir));
end;
procedure CheckTermsrvVersion; procedure CheckTermsrvVersion;
var var
SuppLvl: Byte; SuppLvl: Byte;
@ -857,6 +992,7 @@ begin
GetFileVersion(ExpandPath(TermServicePath), FV); GetFileVersion(ExpandPath(TermServicePath), FV);
VerTxt := Format('%d.%d.%d.%d', VerTxt := Format('%d.%d.%d.%d',
[FV.Version.w.Major, FV.Version.w.Minor, FV.Release, FV.Build]); [FV.Version.w.Major, FV.Version.w.Minor, FV.Release, FV.Build]);
TermSrvVerTxt := VerTxt; // expose globally for TryAutoGenerateOffsets
Writeln('[*] Terminal Services version: ', VerTxt); Writeln('[*] Terminal Services version: ', VerTxt);
if (FV.Version.w.Major = 5) and (FV.Version.w.Minor = 1) then if (FV.Version.w.Major = 5) and (FV.Version.w.Minor = 1) then
@ -1119,6 +1255,15 @@ begin
end; end;
Str.Free; Str.Free;
{ After writing updated INI, fill any missing section for the running
termsrv.dll. FV/TermSrvVerTxt may not be set in the -w path, so
compute the version here before calling TryAutoGenerateOffsets. }
GetFileVersion(ExpandPath(TermServicePath), FV);
TermSrvVerTxt := Format('%d.%d.%d.%d',
[FV.Version.w.Major, FV.Version.w.Minor, FV.Release, FV.Build]);
Writeln('[*] Checking INI coverage for installed termsrv.dll version...');
TryAutoGenerateOffsets;
SvcStart(TermService); SvcStart(TermService);
Writeln('[+] Update completed.'); Writeln('[+] Update completed.');
@ -1208,6 +1353,9 @@ begin
Online := (ParamStr(2) = '-o') or (ParamStr(3) = '-o'); Online := (ParamStr(2) = '-o') or (ParamStr(3) = '-o');
ExtractFiles; ExtractFiles;
Writeln('[*] Checking INI coverage for installed termsrv.dll version...');
TryAutoGenerateOffsets;
Writeln('[*] Configuring service library...'); Writeln('[*] Configuring service library...');
SetWrapperDll; SetWrapperDll;

Loading…
Cancel
Save