Disabling Auto-Updates in the reMarkable Companion App: WinSparkle DLL Stub Method

When deploying the reMarkable Companion App in an enterprise environment, the built-in auto-updater creates a recurring problem. The application uses the WinSparkle framework to check for updates on every launch. When a new version is found, it shows a dialog and attempts to download and install the update — which requires administrative privileges that standard users do not have.

 


 

[Picture 1] The update dialog appears on every launch when a newer version is available.

 

The “Skip this version” button does not work. The update downloads regardless, and when the installer attempts to run it fails for non-admin users, showing an error message. The update dialog then reappears on the next launch.

 


 

[Picture 2] The updater downloads the installer in the background before failing due to missing admin rights.

 

Method Overview

Method

Status

Description

WinSparkle DLL stub

Current

Replaces WinSparkle.dll with a stub to fully disable update checks

Update Dialog Closer

Legacy

PowerShell script that closes update dialogs reactively

 Previous Approach (Legacy)

An earlier workaround using a PowerShell script to reactively close the update dialog is documented in this blog post and is kept in the repository under legacy/update-dialog-closer/ for reference. It works, but the updater itself remains active and the dialog can reappear. The stub method below is cleaner and fully eliminates the problem.

 

Recommended Method: WinSparkle DLL Stub

The reMarkable application loads WinSparkle.dll to handle its update logic. By replacing this DLL with a stub that exports all the expected functions but does nothing, the update mechanism is disabled at the source. The application loads normally, the update check is never initiated, and no dialog ever appears.

The exported functions were identified by inspecting the original DLL using CFF Explorer:

 


 

[Picture 3] CFF Explorer showing the Export Directory of the original WinSparkle.dll. All listed functions are implemented as no-ops in the stub.

 

The stub DLL exports the complete WinSparkle API so the application does not crash on load. All functions are present but perform no actions.

 

Effect

      Update checks are disabled entirely

      No update dialogs are ever shown to the user

      The application continues functioning normally

 

Applicability

This method is not specific to reMarkable. Any Windows application that uses WinSparkle for updates and loads WinSparkle.dll dynamically can have its updater disabled using the same stub, as long as the application does not verify the DLL signature. The exported function names can be verified with CFF Explorer as shown above.

 

Quick Usage

Install the reMarkable Companion App normally, then replace:

 

C:\Program Files\reMarkable\WinSparkle.dll

 

...with the stub DLL from bin/WinSparkle.dll in the repository.

 

Build Script: Build-reMarkable-NoAutoUpdate.ps1

For production use, compiling the stub yourself is recommended over using the precompiled binary. The included PowerShell build script automates the full process:

 

1.    Resolves the latest reMarkable installer URL from winget-pkgs (with fallbacks)

2.    Resolves the latest MinGW compiler build from GitHub releases

3.    Downloads 7-Zip if needed, extracts MinGW

4.    Compiles the stub DLL from the included C source file

5.    Installs reMarkable silently

6.    Backs up the original WinSparkle.dll and replaces it with the stub

 

Run as Administrator in a test VM or packaging environment:

 

.\Build-reMarkable-NoAutoUpdate.ps1

 

Repeated runs are handled gracefully — downloads are skipped if the file already matches the expected URL and size.

 

Enterprise Deployment

7.    Install the reMarkable Companion App silently (via PSADT or similar)

8.    Replace WinSparkle.dll with the stub version

9.    Deliver subsequent updates through your software distribution platform

 

Integrates cleanly with Omnissa Workspace ONE UEM, App Volumes, PSADT, and MSI repackaging pipelines.

 

Repository

https://github.com/altiris4ever/Remarkable-Update-Closer/

 

References

      WinSparkle project

      WinSparkle registry settings

      niXman MinGW builds

      reMarkable Companion App winget manifest

      Previous blog post: Update Dialog Closer (legacy method)

      Legacy scripts in repository

 



No comments:

Post a Comment