[chore] bundle the usbmmidd_v2 virtual display driver with Windows packages

This commit is contained in:
dijunkun
2026-09-21 01:10:31 +08:00
parent 6387f2e555
commit b34755c5ee
17 changed files with 185 additions and 2 deletions
@@ -0,0 +1,12 @@
Copyright 2014-2021 Amyuni Technologies Inc.
https://www.amyuni.com
This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software.
By using this software, you accept to be prompted with an advertisement page which is not always under the control of the author. A fully commercial version is available for users who do not wisth to see those advertisements.
Permission is granted to anyone to use this software for any purpose subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software.
If you use this software in a product, an acknowledgment in the product documentation would be required.
2. Altered versions must be plainly marked as such, and must not be misrepresented as being the original software.
3. This notice may not be removed or altered from any distribution.
@@ -0,0 +1,50 @@
Procedure to add a virtual monitor to your system (Windows 10 Only!)
- Download our virtual display driver from https://www.amyuni.com/downloads/usbmmidd_v2.zip
- Unpack the zip file to an empty folder, e.g. c:\temp\usbmmidd
- Make sure you read the License.txt file as with any other software product
- Open a command prompt window as Administrator (you cannot add a device to your system unless you "Run As Administrator")
- Run the following commands:
- cd c:\temp\usbmmid (or whatever destination folder you chose)
- deviceinstaller64 install usbmmidd.inf usbmmidd (If you are on a 32-bit system, replace "deviceinstaller64" by "deviceinstaller")
- Make sure you see the message that the drivers are signed by Amyuni Technologies Inc. This is a confirmation that the drivers went through Microsoft driver signing procedure and are virus free
- Starting with version 2, the virtual monitor supports the following display resolutions by default:
1024 x 768 pixels
1360 x 768 pixels
1440 x 900 pixels
1600 x 900 pixels
1600 x 1200 pixels
1920 x 1080 pixels [Default Resolution]
1920 x 1200 pixels
2560 x 1440 pixels
3840 x 2160 pixels
After the first step above is executed, you can modify the list of supported resolutions by changing the following registry key:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\WUDF\Services\usbmmIdd\Parameters\Monitors
Up to 10 resolutions can be defined through this registry key. The keys should be named from "0" to "9". The (Default) registry value defines the default monitor resolution.
Note that the list of resolutions can also be found in the usbmmidd.inf file that accompanies the printer driver. The inf file should not be modified in any way, otherwise the virtual display driver digital signature is invalidated.
Once you are satisfied with the list of resolutions, you can activate the virtual monitor by running:
- deviceinstaller64 enableidd 1
With version 2, rou can run this command multiple times to add up to 4 virtual monitors to your system.
The included batch file usbmmidd.bat runs these commands automatically and selects between the 32- or 64-bit version of deviceinstaller.
If you are not comfortable opening a command prompt and entering these commands, right-click on usbmmidd.bat and "Run As Administrator."
That's it. You now have a high definition monitor in your Display Settings. You can change the display resolution, position the monitor, extend the desktop or do whatever you do with a real monitor.
To deactivate the virtual monitor, run the command:
deviceinstaller64 enableidd 0
If ou have added more than one monitor, you should run this command multiple times to remove all monitors.
to reactivate a virtual monitor:
deviceinstaller64 enableidd 1
To completely remove the drivers from your system, you can either go through the Device Manager and uninstall "USB Mobile Monitor Virtual Display", or run the commands:
deviceinstaller64 stop usbmmidd
deviceinstaller64 remove usbmmid
@@ -0,0 +1,16 @@
@cd /d "%~dp0"
@goto %PROCESSOR_ARCHITECTURE%
@exit
:AMD64
@cmd /c deviceinstaller64.exe install usbmmidd.inf usbmmidd
@cmd /c deviceinstaller64.exe enableidd 1
@goto end
:x86
@cmd /c deviceinstaller.exe install usbmmidd.inf usbmmidd
@cmd /c deviceinstaller.exe enableidd 1
:end
@pause
@@ -92,6 +92,10 @@ installApp:
File "..\..\..\..\build\windows\x64\release\crossdesk_privacy_window.dll"
; Bundle runtime DLLs from the release output directory
File /x crossdesk_privacy_window.dll "..\..\..\..\build\windows\x64\release\*.dll"
; Amyuni usbmmidd_v2 virtual display driver for headless hosts. xmake
; copies apps\desktop\resources\windows\usbmmidd_v2 into the release
; output directory after building crossdesk; its License.txt ships with it.
File /r "..\..\..\..\build\windows\x64\release\usbmmidd_v2"
Call RegisterInstalledService
@@ -142,6 +146,7 @@ cancelUninstall:
uninstallApp:
Call un.UnregisterInstalledService
Call un.RemoveUsbmmiddDriver
; Delete main executable and uninstaller
Delete "$INSTDIR\CrossDesk.exe"
@@ -151,6 +156,9 @@ uninstallApp:
Delete "$INSTDIR\crossdesk_privacy_window.dll"
Delete "$INSTDIR\uninstall.exe"
; Leave the install directory before removing it
SetOutPath "$TEMP"
; Recursively delete installation directory
RMDir /r "$INSTDIR"
@@ -248,3 +256,50 @@ unregister_with_sc:
Abort
${EndIf}
FunctionEnd
; The session helper (or an elevated CrossDesk) installs the bundled usbmmidd
; driver on first headless use and records HKLM\SOFTWARE\CrossDesk\
; UsbmmiddDriverInstalled in the 64-bit registry view. Only a driver CrossDesk
; installed is removed here; one set up by the user for other software stays.
; deviceinstaller64.exe resolves usbmmIdd.dll relative to the working
; directory, so run it from the driver folder. Failures are logged, not fatal:
; the driver can still be removed from Device Manager.
Function un.RemoveUsbmmiddDriver
IfFileExists "$INSTDIR\usbmmidd_v2\deviceinstaller64.exe" 0 done
SetRegView 64
ClearErrors
ReadRegDWORD $0 HKLM "Software\${PRODUCT_NAME}" "UsbmmiddDriverInstalled"
${If} ${Errors}
${OrIf} $0 != 1
SetRegView lastused
Return
${EndIf}
DetailPrint "Removing the usbmmidd virtual display driver installed by CrossDesk"
SetOutPath "$INSTDIR\usbmmidd_v2"
; Unplug every virtual monitor first (the driver allows up to four).
StrCpy $1 0
unplug_loop:
nsExec::ExecToLog '"$INSTDIR\usbmmidd_v2\deviceinstaller64.exe" enableidd 0'
Pop $2
IntOp $1 $1 + 1
${If} $2 = 0
${AndIf} $1 < 4
Goto unplug_loop
${EndIf}
nsExec::ExecToLog '"$INSTDIR\usbmmidd_v2\deviceinstaller64.exe" stop usbmmidd'
Pop $2
nsExec::ExecToLog '"$INSTDIR\usbmmidd_v2\deviceinstaller64.exe" remove usbmmidd'
Pop $2
${If} $2 != 0
DetailPrint "usbmmidd driver removal returned $2; remove 'USB Mobile Monitor Virtual Display' from Device Manager if it remains"
${EndIf}
SetOutPath "$TEMP"
DeleteRegValue HKLM "Software\${PRODUCT_NAME}" "UsbmmiddDriverInstalled"
DeleteRegKey /ifempty HKLM "Software\${PRODUCT_NAME}"
SetRegView lastused
done:
FunctionEnd
+16
View File
@@ -43,6 +43,21 @@ function setup_targets()
os.cp(runtime_dll, target:targetdir())
end
-- Amyuni usbmmidd_v2 virtual display driver for headless Windows hosts.
-- The installer and the portable archive pick it up from the target
-- directory; the runtime looks for it next to the executables.
local function copy_usbmmidd_package(target)
if not target:is_plat("windows") then
return
end
local source = path.join(os.projectdir(), "apps/desktop/resources/windows/usbmmidd_v2")
assert(os.isfile(path.join(source, "deviceinstaller64.exe")),
"usbmmidd_v2 driver package not found: " .. source)
local destination = path.join(target:targetdir(), "usbmmidd_v2")
os.tryrm(destination)
os.cp(source, destination)
end
local crossdesk_windows_resource = "apps/desktop/resources/windows/crossdesk.rc"
if is_config("CROSSDESK_PORTABLE", true) then
crossdesk_windows_resource = "apps/desktop/resources/windows/crossdesk_portable.rc"
@@ -509,4 +524,5 @@ function setup_targets()
"apps/desktop/src/platform/linux/daemon_backend.cpp")
end
after_build(copy_slint_runtime)
after_build(copy_usbmmidd_package)
end