Index
COM Port Manager - ComPortMan V1.1.8
Getting Started
Installation
Configuration
Problems
History
Licence agreement
Homepage:
https://www.uwe-sieber.de/comportman_e.html
EMail:
mail@uwe-sieber.de
Getting started
ComPortMan is a Windows service that gives control over Window's COM-port assignment. Running as service makes it independent of the logged on user's privileges, so there is no need to give the users the privilege to change COM-ports in the Windows Device Manager.
You can define new default COM-ports for USB-to-Serial devices or any other type of serial device.
It can keep clean the Windows COM name arbiter and show balloon-tips for newly attached ports.
ComPortMan works with Windows 2000, XP, Server 2003, Vista, Windows 7, 8, 10, 11 and their server editions. On x64 editions of Windows only the x64 version works.
It is primarily tested under Windows 10 x64
Installation
ComPortMan does not come with a SETUP.EXE, it's all manual work. See Section Installation.
Conditions
The software is not limited or crippled in any way. It's fully functional without a time limit. There is no "full version".
ComPortMan is Freeware for private and educational use only. Otherwise a licence is required per computer after a 30 day test period.
"Educational" means institutions where the students outnumber the employees.
Furthermore it's free for public, free of charge libraries.
Price list is available here:
https://www.uwe-sieber.de/comportman_e.html
Licence agreement
Why?
When a new COM-port appears in the system then Windows does not assing the first free number, instead it assigns the first number which has never been used before. Therefore the endless increasing port numbers...
The reservation of former used port numbers is stored in the registry under HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\COM Name Arbiter
I've made tool for deleting the reservation manually:
https://www.uwe-sieber.de/misc_tools_e.html#com_ports
With ComPortMan you can define which COM-port-number is assigned to a port by some criteria.
Installation
Using the MSI file
Right-click the ComPortMan_x64.msi -> Install. This installs the ComPortMan service to "C:\Program Files\ComPortMan" without further questions and starts the ComPortMan service.
Manually using the ZIP file
Unzip the distribution file (ComPortMan_x64.zip), e.g. to your programs folder (a ComPortMan folder is included). This needs admin privileges.
As result the files should be in a folder like C:\Program Files\ComPortMan
ComPortMan will not run from a network or subst drive, it must be located on a "real" local drive.
Then register ComPortMan as a service by starting the
_service_register.cmd
This does not copy any files, it only registers ComPortMan as service and starts the service.
Without administrator privileges you will be asked for.
Once installed ComPortMan is permanently running as Windows service. The service starts automatically on Windows startup.
Remember: Once installed as service it does not matter from where the service is started. The ComPortMan.exe is loaded from the folder where the _service_register.cmd had been started from!
Uninstallation:
You can uninstall the service using parameter -deregister, this is what the _service_deregister.cmd does:
_service_deregister.cmd
This stops the service and unregisters it but no files are deleted.
Installation and uninstallation can be done without the message box by using
ComPortMan -silentregister
ComPortMan -silentderegister
It returns Errorlevel 0 on success, 1 on failure.
You can stop and start the installed service by means of the NET command:
net stop ComPortMan
net start ComPortMan
or by means of the _service_stop and _service_start command script which are using the ComPortMan.exe and request admin privileges if required.
Configuration by means of the INI file
To create or edit the ComPortMan.ini just start the _edit_ini.cmd. It request admin privileges if required.
You can change the COM-port settings in the ComPortMan.INI without restarting the service because it is checked for changes each time a COM-device event occurs.
Most settings take effect without restarting the service.
See configuration.
Some hints
The command scripts contain command lines like
"%~dp0ComPortMan" -register
%~dp0 is the placeholder for the drive and path to the CMD file. How does it work? %0 is placeholder for the running CMD file like C:\Program Files\ComPortMan\_service_register.cmd.
~dp is a "modifier" which delivers drive and path like C:\Program Files\ComPortMan. Because of the possible space character in the path it must be quoted.
Read more about batch parameters and modifiers here:
http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/percent.mspx
If you install ComPortMan into a different folder than C:\Program Files, the ensure that non-admins have no write access to it. Otherwise it might be used to aquire admin or even System privileges.
Configuration
The desired COM-ports are defined in a text file called ComPortMan.INI located in the same place as the ComPortMan.EXE.
Modern applications often store their settings in the Windows registry but I don't like that. INI files are the 'classic' approach.
Windows Vista, Windows 7/8/10, Server 2008+:
Since Vista the "Virtual Store" might redirect the INI file to
C:\Users\(UserName)\AppData\Local\VirtualStore\Program Files\ComPortMan
when you modifiy or copy it.
But the ComPortMan service always reads from its own folder. So, under Vista/Win7/8/10 you should start the Editor elevated, otherwise the USBDLM.INI might be redirected into the virtual store where it has no effect. This is what the _edit-ini.cmd does.
Or install ComPortMan into a different folder, for instance to C:\Tools\ComPortMan because the Virtual Store deals with the "C:\Program Files" folder only.
How INI files work:
INI files have sections leaded in by names in square brackets, e.g. [ComPorts] or [BalloonTips]. The settings relevant to that section appear below the section name.
Each section name is allowed to exist once only! Same thing for the values within a section.
Comment lines begin with a semicolon. Never try to deactivate a section this way:
;[ComPorts20]
This extends the previous section to the begin of the next section which leads to unexpected results. This is the right way:
[xxxx ComPorts20]
It is still a new section but with no effect because of the unknown name.
Settings in the Registry:
ComPortMan can read its settings from the registry too. It reads from
HKLM/Software/Uwe Sieber/ComPortMan
If this registry key exists, then the ComPortMan.INI is ignored! Only the log file settings are read from the INI then.
To make ComPortMan see changes in the registry, change the (Standard) value under HKLM/Software/Uwe Sieber/ComPortMan to any different value than before. ComPortMan reads the configuration again then.
Here is a sample REG file (do not execute it unchanged): https://www.uwe-sieber.de/files/comportman_sample.reg
Under x64 Windows the Win32 edition of ComPortMan is redirected to
HKLM/Software/Wow6432Node/Uwe Sieber/ComPortMan
so better use the x64 version here.
Simple Samples
Without a configuration ComPortMan does not touch the COM-port assignments.
For each type of COM-port you need a different handling for you need one [ComPortsXX] section. Which section is used for a port is controlled by the criterias defined in each section. Each section needs at least one criteria.
The ComPortInfo tool shows some data about all currently present ports, these data can be used as criterias.
Sample of ComPortInfo output:
PortName : COM2
KernelName : \Device\Serial0
DeviceID : ACPI\PNP0501\1
FriendlyName : Communications Port (COM2)
IRQ : 7
IoPort : 3F8
PortName : COM7
KernelName : \Device\sscdmdm0
DeviceID : USB\VID_04E8&PID_6601&MI_00\9&34C622D7&0&4_00
FriendlyName : SAMSUNG Mobile Modem #2
If you want the COM2 back on COM1, configure a section like this, green are the criteria, violet the target port:
[ComPorts10]
IRQ=7
IoPort=3F8
PortName=COM1
For moving the current COM7 to COM3:
[ComPorts20]
KernelName=\Device\sscdmdm0
PortName=COM3
The numbers of the section have no relation to anything. ComPortMan just reads [ComPorts1] to [ComPorts99] and checks the criteria. The first section with fitting criteria is used.
If you want a certain port not changed just configure a low numbered section with fitting criteria but without a PortName line.
After saving the INI file start the ComPortInfo tool again or press F5 to refresh. If you have done things right it will show your sections:
PortName : COM2
KernelName : \Device\Serial0
DeviceID : ACPI\PNP0501\1
FriendlyName : Communications Port (COM2)
IRQ : 7
IoPort : 3F8
Section : [ComPorts10]
PortName : COM7
KernelName : \Device\sscdmdm0
DeviceID : USB\VID_04E8&PID_6601&MI_00\9&34C622D7&0&4_00
FriendlyName : SAMSUNG Mobile Modem #2
Section : [ComPorts20]
ComPortMan checks the ports when it starts and when a new port appears in the system. So, for making it change a removable port, remove and attach it again or perform a restart by means of the ComPortInfo tool.
Settings
Even the section [Settings] is mentioned here again and again, all settings have to be together within the one and only section [Settings]! There can be only one...
Most settings take effect immediately.
Check COM-ports on startup
By default ComPortMan checks the COM port on startup. If it shall not do so:
[Settings]
CheckPortsOnStartup=0
Check COM-ports on resmue from standby or hibernation
Some Windows installations wake up with screwed up COM-ports after resume. If required, ComPortMan can check the ports on resume. This is deactivated by default because it's usually not required.
[Settings]
CheckPortsOnResume=1
Quick-and-dirty Mode
Up to V0.7 ComPortMan changed port numbers by modifying the port's registry settings and then restarting the device. But this sometimes take several seconds. When dealing with multi-port devices then their upper device, e.g. an USB-hub, is restarted instead.
This is clean but slow.
In the Quick-and-dirty mode the registry settings are modified too but then ComPortMan just deletes the old port name and creates the new one. Fast but dirty.
On removal of the port ComPortMan has to delete the new name because the ports driver probably wants to delete the old name! If its old name is meanwhile used by another port, problably this meanwhile foreign port is deleted. If this really happens depents on the driver of the removed port.
Since V0.95 ComPortMan sees and fixes it immediately, so there is no problem.
As long as you deal with one device at the same time there is no problem anyway.
This setting is available global:
[Settings]
QuickAndDirtyMode=1
And individual for each ComPorts section. Sample:
[ComPorts20]
DeviceId=FTDIBUS*
PortNames=COM3,COM4
QuickAndDirtyMode=0
Delete DosDeviceName of COM-Ports after removal
Some drivers forget do remove the symbolic link from the DosDeviceName (like COM1) to their kernel object (like \Device\Serial1). Usually no probem because no other device will use this port thanks to the COM Name Arbiter registry settings. But when using ComPortMan this might be a problem.
If ComPortMan shall always delete the DosDeviceName on device removal:
[Settings]
RemoveDosDeviceNameOnRemoval=1
By default this is done when ComPortMan had assigned the port in the Quick-and-dirty mode.
Delete DosDeviceName of COM-Ports on startup
On startup ComPortMan can delete lost COMn pointing to non-exisiting kernel objects (an attempt to open the port results in ERROR_FILE_NOT_FOUND or ERROR_PATH_NOT_FOUND).
Some drivers forget do remove it when a device is disconnected, also when ComPortMan changed a port in "Quick-and-dirty Mode" and the device is removed while ComPortMan isn't running a dead port is remaining.
[Settings]
RemoveDosDeviceNameOnStartup=1
Windows COM-Name-Arbiter
For each COM-port when installed Windows sets a bit in the registry which markes this port as reserved to make it not being used by new devices. The result are the increasing COM-port numbers...
A tool for manually reset the bits is my COM Name Arbiter Tool.
ComPortMan can clean up too. It does so on startup of the service and after a COM-port has been removed.
Sample: Clean the reservation for ports 3, 4 and 10-256:
[Settings]
ComNameArbiterClean=3,4,10-256
The reservation of currently present ports is not removed, furthermore ComPortMan modifies reservations on arrival of COM-ports.
By default Windows
After removal delete the device from the Windows device management
If you deal with lots of always new devices which will never be attached again then it makes sense to delete it from the Windows device management after removal.
For the COM-Port:
[Settings]
RemovePortDeviceOnRemoval=1
For the USB device:
[Settings]
RemoveUsbDeviceOnRemoval=1
Debug Information
If there are problems I may figure out what is wrong by reading the debug logs which ComPortMan writes.
It can write a log file or live output that can be grabbed by SysInternals DebugView
To activate the log file set WriteLogFile=1, for the live output WriteDebugOutput=1.
To control how detailed the output is, set the LogLevel=1 to 4, 3 is usually good enough.
The file is _ComPortMan.LOG in the root folder of the Windows drive by default but can be changed:
[Settings]
WriteDebugOutput=1
LogLevel=3
WriteLogFile=1
LogFile=C:\ComPortMan.LOG
No restart is required to take effect. The log file settings are read from the INI only, even when the Registry is used for other settings.
On startup of the service an existing ComPortMan.LOG is renamed into ComPortMan_BAK.LOG, an existing ComPortMan_BAK.LOG is deleted.
Balloon Tips
ComPortMan can show a balloon tip with information about the assigned COM-Port numbers.
[BalloonTips]
Enabled=1
Timeout=6000
Timeout is the duration the balloon tip is shown in milliseconds.
6 seconds (6000 ms) is the default plus half a second for each additionally shown port.
The timeout starts again when the mouse is moved over the balloon tip.
Since V0.9.3 BalloonTips on removal are shown, by default if Enabled=1. Default timeout is half the one on arrival. Both can be set separately:
[BalloonTips]
EnabledOnRemoval=1
TimeoutOnRemoval=3000
The COM ports are sorted by USB port or (if equal or non-USB device) by device ID.
COM-Ports depending on Criteria
For each different handling you need one separate [ComPortsXX] section with criteria specific to the wanted port.
The sections are tested from [ComPorts1] to [ComPorts99] and finally [ComPorts] (without a number).
The first section whose criteria fit to the port is used. So, configure special cases at low numbers and more general ones at higher numbers and the most general with the highest number or without a number.
I suggest to use the number in steps of 10, so you can later easily insert sections.
The section and value numbers have no relation to anything. Section and values are just evaluated from low numbers upwards to high numbers, that's all.
The ComPortInfo tool shows for each port which section is used for it, so you can easily check if you have configured right.
Each section needs at least one criteria.
Untypical sample for showing how it works, criteria in green, target ports in violet:
[ComPorts10]
DeviceID1=USB\VID_067B&PID_2517
DeviceID2=USB\VID_1234&PID_5678
PortName1=COM5
PortName2=COM6
This section is used if a port with either DeviceID USB\VID_067B&PID_2517 or USB\VID_1234&PID_5678 is attached. The port then gets assigned COM5 if available, otherwise COM6. If both are in use then the port is not changed.
There is no relation between the numbers!
Typical sample for getting these two ports on its own port-numbers:
[ComPorts10]
DeviceID=USB\VID_067B&PID_2517
PortName=COM5
[ComPorts20]
DeviceID=USB\VID_1234&PID_5678
PortName=COM6
When only one criteria of the same type or one PortName is used then the number can be ommitted as shown in the above samples.
If you want two port devices handled by one section then use numbered criteria:
[ComPorts10]
DeviceID1=USB\VID_067B&PID_2517
DeviceID2=USB\VID_1212&PID_8976
PortName=COM5
Here one of the device IDs must fit the port. The numbers have no relation to anything, they are just used to make the values unique.
Don't touch one certain USB-COM-Port, all others on COM3, 4 or 5
;don't touch Samsung Modems
[ComPorts10]
KernelName=\Device\sscdmdm*
PortName=
;all other USB serials at COM3, 4, 5
[ComPorts20]
DeviceID=USB\*
PortName1=COM3
PortName2=COM4
PortName3=COM5
Or short, using the list notation:
[ComPorts20]
DeviceID=USB\*
PortNames=COM3,COM4,COM5
COM-Port by Kernel Name
The kernel name is what the "DOS device name" (COM1, COM2 etc) points to thru a symbolic link.
Internal ISA-style ports have a name like \Device\Serial0, \Device\Serial1 etc. The kernel name of other devices is defined by their driver, so it can be used to identify a certain type of port.
The ComPortInfo tool show the kernel name:
PortName : COM1
KernelName : \Device\Serial0
DeviceID : ACPI\PNP0501\1
FriendlyName : Communications Port (COM1)
IRQ : 7
Port : 3F8
PortName : COM7
KernelName : \Device\sscdmdm0
DeviceID : USB\VID_04E8&PID_6601&MI_00\9&34C622D7&0&4_00
FriendlyName : SAMSUNG Mobile Modem #2
PortName : COM4
KernelName : \Device\QCUSB_COM4_2
DeviceID : USB\VID_12D1&PID_1001&MI_01\7&36AC8E78&0&0001
FriendlyName : HUAWEI Mobile Connect - 3G Application Interface (COM4)
Sample:
;don't touch the Samsung and the Huawei modems
[ComPorts10]
KernelName1=\Device\sscdmdm*
KernelName2=\Device\QCUSB_COM*
;any other USB-serials
[ComPorts20]
ParentDeviceID=USB\*
PortNames=COM3,COM4
The Number the kernel names end with do not always correlate with the physical ports of multi-port devices! Often it seems so but it is not reliable.
The Device-ID helps with real multi-port devices, the USB-port number with single port devices attached to a common USB hub. ComPortInfo or UsbTreeView show what a device is.
COM-Port by Device ID or Parent Device ID
The ComPortInfo tool show the device IDs:
PortName : COM1
KernelName : \Device\Serial0
DeviceID : ACPI\PNP0501\1
ParentDeviceID : PCI\VEN_8086&DEV_2918&SUBSYS_00000000&REV_02\3&13C0B0C5&0&F8
FriendlyName : Communications Port (COM1)
IRQ : 7
Port : 3F8
PortName : COM4
KernelName : \Device\sscdmdm0
DeviceID : USB\VID_04E8&PID_6601&MI_00\9&34C622D7&0&4_00
ParentDeviceID : USB\VID_04E8&PID_6601\7&310D02EB&1&3
FriendlyName : SAMSUNG Mobile Modem #2
PortName : COM6
KernelName : \Device\QCUSB_COM6_1
DeviceID : USB\VID_12D1&PID_1001&MI_01\7&36AC8E78&0&0001
ParentDeviceID : USB\VID_12D1&PID_1001\6&33F5ECF6&0&4
FriendlyName : HUAWEI Mobile Connect - 3G Application Interface (COM4)
PortName : COM7
KernelName : \Device\VCP0
DeviceID : FTDIBUS\VID_0403+PID_6001+FTF6DPKEA\0000
ParentDeviceID : USB\VID_0403&PID_6001\FTF6DPKE
FriendlyName : USB Serial Port (COM7)
Sample:
;don't touch the Samsung and the Huawei modems
[ComPorts10]
DeviceID1=USB\VID_04E8&PID_6601*
DeviceID2=USB\VID_12D1&PID_1001*
;any FTDI RS232 device at COM7
[ComPorts1]
DeviceID=FTDIBUS\VID_0403+PID_6001
PortName=COM7
;any other USB-serials
[ComPorts99]
ParentDeviceID=USB\*
PortNames=COM3,COM4
Some USB to serial devices don't have a USB\xxx device ID, but their parent device always has.
Or just use the BusType criteria instead:
;any other USB-serials
[ComPorts99]
BusType=USB
PortNames=COM3,COM4
More samples:
4x Prolific adaptor which is in fact a 4x USB hub with four single serial controllers to COM11, 12, 13, 14.
Since Windows puts the USB port number at the end of the device instance ID we can use it. The
asterisk is used as wildcard for the random part which Windows generates different for each USB port
the adaptor is attached to if the USB device has no USB hardware serial number (the iSerial string descriptor).
[ComPorts10]
DeviceID=USB\VID_067B&PID_2303*&1
PortName=COM11
[ComPorts11]
DeviceID=USB\VID_067B&PID_2303*&2
PortName=COM12
[ComPorts12]
DeviceID=USB\VID_067B&PID_2303*&3
PortName=COM13
[ComPorts13]
DeviceID=USB\VID_067B&PID_2303*&4
PortName=COM14
4x MosChip adaptor which is one USB MultiPortSerial device with four COM ports. The port devices'
device IDs end with 0000, 0001, 0002 and 0003 so we can use these:
[ComPorts15]
DeviceID=QUADPORT\QUAD_SERIAL_INTERFACE\*&0000
PortName=COM21
[ComPorts16]
DeviceID=QUADPORT\QUAD_SERIAL_INTERFACE\*&0001
PortName=COM22
[ComPorts17]
DeviceID=QUADPORT\QUAD_SERIAL_INTERFACE\*&0002
PortName=COM23
[ComPorts18]
DeviceID=QUADPORT\QUAD_SERIAL_INTERFACE\*&0003
PortName=COM24
COM-Ports by FriendlyName
The ComPortInfo tool shows the friendly name:
PortName : COM1
KernelName : \Device\Serial0
DeviceID : ACPI\PNP0501\1
FriendlyName : Communications Port (COM1)
IRQ : 7
Port : 3F8
PortName : COM7
KernelName : \Device\sscdmdm0
DeviceID : USB\VID_04E8&PID_6601&MI_00\9&34C622D7&0&4_00
FriendlyName : SAMSUNG Mobile Modem #2
PortName : COM4
KernelName : \Device\QCUSB_COM4_2
DeviceID : USB\VID_12D1&PID_1001&MI_01\7&36AC8E78&0&0001
FriendlyName : HUAWEI Mobile Connect - 3G Application Interface (COM4)
Sample:
;don't touch the Samsung and the Huawei modems
[ComPorts10]
FriendlyName1=SAMSUNG Mobile Modem *
FriendlyName2=HUAWEI Mobile Connect *
;any other USB-serials
[ComPorts20]
ParentDeviceID=USB\*
PortNames=COM3,COM4
COM-Ports by Bus-Type
BusType means how the serial device is connected to the system. This can be
USB
PCMCIA
PCI
ISA
UNKNOWN
The ComPortInfo tool shows the BusType:
PortName : COM1
KernelName : \Device\Serial0
DeviceID : ACPI\PNP0501\1
ParentDeviceID : PCI\VEN_8086&DEV_2918&SUBSYS_00000000&REV_02\3&13C0B0C5&0&F8
FriendlyName : Communications Port (COM1)
BusType : ISA
IRQ : 4
IoPort : 3F8
PortName : COM4
KernelName : \Device\sscdmdm0
DeviceID : USB\VID_04E8&PID_6601&MI_00\8&A4D665B&0&3_00
ParentDeviceID : USB\VID_04E8&PID_6601\7&310D02EB&1&3
FriendlyName : SAMSUNG CDMA Modem #2
BusType : USB
PortName : COM7
KernelName : \Device\VCP0
DeviceID : FTDIBUS\VID_0403+PID_6001+FTF6DPKEA\0000
ParentDeviceID : USB\VID_0403&PID_6001\FTF6DPKE
FriendlyName : USB Serial Port (COM7)
BusType : USB
Sample:
;any USB-serial on COM3 and 4
[ComPorts20]
BusType=USB
PortNames=COM3,COM4
COM-Ports by Class
So far I have seen only two device classes for COM ports:
Ports
Modem
The ComPortInfo tool shows the device class:
PortName : COM1
KernelName : \Device\Serial0
DeviceID : ACPI\PNP0501\1
ParentDeviceID : PCI\VEN_8086&DEV_2918&SUBSYS_00000000&REV_02\3&13C0B0C5&0&F8
FriendlyName : Communications Port (COM1)
BusType : ISA
Class : Ports
IRQ : 4
IoPort : 3F8
PortName : COM4
KernelName : \Device\sscdmdm0
DeviceID : USB\VID_04E8&PID_6601&MI_00\8&A4D665B&0&3_00
ParentDeviceID : USB\VID_04E8&PID_6601\7&310D02EB&1&3
FriendlyName : SAMSUNG CDMA Modem #2
BusType : USB
Class : Modem
PortName : COM7
KernelName : \Device\VCP0
DeviceID : FTDIBUS\VID_0403+PID_6001+FTF6DPKEA\0000
ParentDeviceID : USB\VID_0403&PID_6001\FTF6DPKE
FriendlyName : USB Serial Port (COM7)
BusType : USB
Class : Ports
Sample:
;any modem COM port on COM3 and 4
[ComPorts20]
Class=Modem
PortNames=COM3,COM4
COM-Ports by USB-Port
Sample:
[ComPorts10]
UsbPort=1-2-3
PortName=COM7
ComPortInfo shows the used USB-Port:
PortName : COM7
KernelName : \Device\VCP0
DeviceID : FTDIBUS\VID_0403+PID_6001+FTF6DPKEA\0000
ParentDeviceID : USB\VID_0403&PID_6001\FTF6DPKE
FriendlyName : USB Serial Port (COM7)
BusType : USB
UsbPort : 1-2-3
The 1-2-3 in the sample means that the USB device is attached to port 3 of a USB hub which is attached to port 2 of USB root-hub number 1. See UsbTreeView to get the picture.
Using the USB port is handy for multiport adaptors which are in fact single USB-to-serial controllers attached to an integrated USB hub.
Since the arrival order is not guarateed to be as the ports are numbered, it is better to confiugre one section per port and use the last part of the USB port name as criteria.
Sample for a Prolific 4x adaptor (which is a 4x USB hub with 4 USB-serial devices) on COM11 to COM14 in the expected order:
[ComPorts21]
PortName=COM11
FriendlyName=Prolific*
UsbPort=*-1
[ComPorts22]
PortName=COM12
FriendlyName=Prolific*
UsbPort=*-2
[ComPorts23]
PortName=COM13
FriendlyName=Prolific*
UsbPort=*-3
[ComPorts24]
PortName=COM14
FriendlyName=Prolific*
UsbPort=*-4
The numbers of the section have relation to anything, they just have to be uniqe and the sections are tested on order of their number for fitting criteria.
COM-Port by Location Info
Sample:
[ComPorts10]
Location=Port_#0002.Hub_#0003
PortName=COM7
ComPortInfo shows the location info:
PortName : COM80
KernelName : \Device\ProlificSerial0
DevicePath : \\?\usb#vid_067b&pid_2303#7&30673e26&0&1#{86e0d1e0-8089-11d0-9ce4-08003e301f73}
KernelNameDevp : \Device\0000019b
DeviceID : USB\VID_067B&PID_2303\7&30673E26&0&1
ParentDeviceID : USB\VID_0416&PID_5518\6&3893146&0&3
DriverKeyName : {4d36e978-e325-11ce-bfc1-08002be10318}\0086
FriendlyName : Prolific USB-to-Serial Comm Port (COM80)
BusType : USB
Service : Ser2pl
Location : Port_#0001.Hub_#0007
UsbPort : 1-2-3
Somtimes the location information of the parent device is helpful, the "ParentLocation".
[ComPorts10]
ParentLocation=Port_#0002.Hub_#0003
PortName=COM7
The parent device is shown by ComPortInfo as "Controller":
========================= Controller =========================
DevInst = 13464
Device ID = USB\VID_9710&PID_7840\6&32B66D4F&0&2
Hardware IDs = USB\VID_9710&PID_7840&REV_0001, USB\VID_9710&PID_7840
Description = High-Speed USB MultiSerial Compound Device
Driver Key Name = {50906cb8-ba12-11d1-bf5d-0000f805f530}\0003
Service = mos24ser_QUADPORT
Driver = C:\Windows\system32\DRIVERS\mos24ser_QUADPORT.sys (Version: 2.0.2.0 Date: 2012-10-03)
Legacy BusType = PNPBus
Bus Number = 0
Enumerator = USB
PDO = \Device\00000181
Manufacturer = ASIX Electronics Corporation.
Class = MultiPortSerial
Class GUID = {50906cb8-ba12-11d1-bf5d-0000f805f530}
Location = Port_#0002.Hub_#0003
COM-Port by Location Path
Sample:
[ComPorts10]
LocationPath=PCIROOT(0)#PCI(1400)#USBROOT(0)#USB(5)#USB(2)#USBMI(0)
PortName=COM7
ComPortInfo shows the LocationPaths-Info:
PortName : COM34
KernelName : \Device\USBSER000
DevicePath : \\?\usb#vid_04d8&pid_00dd&mi_00#7&269c0eec&0&0000#{86e0d1e0-8089-11d0-9ce4-08003e301f73}
KernelName Devpath : \Device\0000005e
DeviceID : USB\VID_04D8&PID_00DD&MI_00\7&269C0EEC&0&0000
DriverKeyName : {4d36e978-e325-11ce-bfc1-08002be10318}\0045 (GUID_DEVCLASS_PORTS)
Service : usbser
Driver : C:\WINDOWS\System32\drivers\usbser.sys (Version: 10.0.186.1 Date: 2019-03-19)
FriendlyName : USB Serial Port (COM34)
BusType : USB
Class : Ports
ClassGUID : {4d36e978-e325-11ce-bfc1-08002be10318} (GUID_DEVCLASS_PORTS)
Location : 0000.0014.0000.005.002.000.000.000.000
Location Paths : PCIROOT(0)#PCI(1400)#USBROOT(0)#USB(5)#USB(2)#USBMI(0), PCIROOT(0)#PCI(1400)#USBROOT(...
USB Port Chain : 5-5-2
Location Paths are multiple paths but as criteria in the ComPortMan.ini only the first one works!
Some port devices don't provide a Location Path.
Somtimes the location path information of the parent device is helpful, the "ParentLocationPath".
[ComPorts10]
ParentLocationPath=PCIROOT(0)#PCI(1400)#USBROOT(0)#USB(5)#USB(2)
PortName=COM7
The parent device is shown by ComPortInfo as "Controller":
========================= Controller =========================
Device ID : USB\VID_04D8&PID_00DD\6&32DBD12E&0&2
Hardware IDs : USB\VID_04D8&PID_00DD&REV_0100, USB\VID_04D8&PID_00DD
Description : USB-Verbundgerät
Driver Key Name : {36fc9e60-c465-11cf-8056-444553540000}\0104
Service : usbccgp
Driver : C:\WINDOWS\System32\drivers\usbccgp.sys (Version: 10.0.186.86 Date: 2020-11-10)
Legacy BusType : PNPBus
Bus Number : 0
Enumerator : USB
PDO : \Device\USBPDO-5
Manufacturer : (Standard-USB-Hostcontroller)
Class : USB
Class GUID : {36fc9e60-c465-11cf-8056-444553540000} (GUID_DEVCLASS_USB)
Location : Port_#0002.Hub_#0007
Location Paths : PCIROOT(0)#PCI(1400)#USBROOT(0)#USB(5)#USB(2), PCIROOT(0)#PCI(1400)#USBROOT(...
USB Port Chain : 5-5-2
COM-Port by Address
Many device have a 32 bit address value (CM_DRP_ADDRESS). On USB Composite Devices with multiple COM ports this might be the only criteria to distinguish between them.
Sample:
[ComPorts10]
DeviceID=FTDIBUS\VID_0403+PID_6011+*
Address=1
PortName=COM21
[ComPorts11]
DeviceID=FTDIBUS\VID_0403+PID_6011+*
Address=2
PortName=COM22
If the Address is 0 oder identical for all ports then the address of the parent device might help, the ParentAddress criteria.
ComPortInfo shows Address values:
----------------------- COM Port -----------------------
PortName : COM21
KernelName : \Device\VCP0
DevicePath : \\?\FTDIBUS#VID_0403+PID_6011+F061204A#0000#{86e0d1e0-8089-11d0-9ce4-08003e301f73} (GUID_DEVINTERFACE_COMPORT)
KernelName Devpath : \Device\000000f5
DeviceID : FTDIBUS\VID_0403+PID_6011+F061204A\0000
Parent DeviceID : USB\VID_0403&PID_6011&MI_00\8&871B112&0&0000
Driver Key Name : {4d36e978-e325-11ce-bfc1-08002be10318}\0012 (GUID_DEVCLASS_PORTS)
Service : FTSER2K
Driver : C:\WINDOWS\system32\drivers\ftser2k.sys (Version: 2.8.28.11 Date: 2019-11-26)
FriendlyName : USB Serial Port (COM21)
BusType : USB
Address : 1
Autorun
Since V0.9.8 ComPortMan can execute an application on arrival and on removal of a COM port device by means of OnArrival and OnRemoval sections which work exactly like ComPorts sections.
Sample: Start the calculator when an FTDI port is attached to port 1-1:
[OnArrival20]
DeviceID=FTDIBUS\*
UsbPort=1-1
open=%windir%\System32\calc.exe
By default ComPortMan start appliations in the context of the logged-on user. If there is the UAC (User Account Control) active then without admin privileges.
To start an application "As Administrator" add a line "elevated=1":
[OnArrival20]
DeviceID=FTDIBUS\*
UsbPort=1-1
open=%windir%\System32\calc.exe
elevated=1
To start it in the SYSTEM context set "system=1":
[OnArrival20]
DeviceID=FTDIBUS\*
UsbPort=1-1
open=%windir%\System32\calc.exe
system=1
A window style can be suggested , e.g. windowstyle=max
[OnArrival20]
DeviceID=FTDIBUS\*
UsbPort=1-1
open=%windir%\System32\notepad.exe
windowstyle=max
max maximized
min minimized
hidden hidden
noactivate normal but the windows does not try to get the focus
A delay can be defined in milliseconds or using a unit ('s' for seconds, 'm' for minutes and 'h' for hours. Maximum is 24h:
delay=10s
Multiple open commands
There can be up to 10 open commands. Use open1= to open9= and open= then. Additional parameters as openstyle, restricted etc must be numbered then too and have effect on the open line with the same number.
In open lines variables can be used:
Variables
Variable Description Sample
%ComPort% COM-Port COM9
%ComPortNumber% COM-Port number 9
%KernelName% Kernel name of COMnnn \Device\VCP0
%DeviceID% Device ID FTDIBUS\VID_0403+PID_6001+FT9G9I7TA\0000
%DevicePath% Device path \\?\ftdibus#vid_0403+pid_6001+ft9g9i7ta#0000#{86e0d1e0-8089-11d0-9ce4-08003e301f73}
%DriverKeyName% Driver key name {4d36e978-e325-11ce-bfc1-08002be10318}\0017
%Class% Device class Ports
%ClassGuid% Device class GUID {4d36e978-e325-11ce-bfc1-08002be10318}
%FriendlyName% Readable device name USB Serial Port (COM9)
%BusType% Connection type USB
%UsbPort% USB port chain 1-1
Sample:
[OnArrival20]
DeviceID=FTDIBUS\*
UsbPort=1-1
open="%ProgramFiles(x86)%\teraterm\ttermpro.exe" /c=%ComPortNumber% /b=9600
Wildcards
Configuring criterions wildcards can be used:
The asterisk '*' stands for null to n characters and the question mark '?' for exactly one.
It's all case insensitive.
Sample | fits for | does not fit
----------------+-------------------------+------------------
\Device\Serial? | \Device\Serial0, | \Device\Serial20
| \Device\Serial9 |
----------------+-------------------------+------------------
USB\VID_* | everything that starts | PCI\VEN_...
| with USB\VID_ |
----------------+-------------------------+------------------
*\VID_* | everything that contains| PCI\VEN_...
| \VID_ |
----------------+-------------------------+------------------
2-1-* | 2-1-1, 2-1-7, 2-1-1-3 | 2-1, 1-1-1
----------------+-------------------------+------------------
2-1-? | 2-1-1, 2-1-7 | 2-1, 2-1-1-3
----------------+-------------------------+------------------
*-1 | 2-1-1, 13-5-1 | 1-2, 13-5-2
----------------+-------------------------+------------------
Technical Information
Here some background information, just what came into my mind...
Window Service
ComPortMan is a Windows Service. As such it is registered in the registry and started and stopped by the "Service Control Manager".
Services usually are running in the context "Local System" and have high privileges here. ComPortMan is a Win32 service, not a kernel service. A kernel service could have the start type "System" which would ensure that it is loaded before the user logs on. For a Win32 service "Automatic" is earliest start type. With "Automatic" the user might be logged on before the services starts, see also "ComPortMan service starts to late" under Problems.
Creating an MSI
Having ComPortMan as an MSI with included ComPortMan.INI file is useful for distributing ComPortMan in a network by means of a group policy, admins know better than I do...
The Microsoft WIX toolset is used for creating the MSI. You need the Microsoft WIX toolset. Download the WIX35.MSI, right click -> Install.
If there is no Visual Studio installed it comes first with a warnig message. Just click OK, its about the Visual Studio integration only.
WiX installs to the default programs folder, e.g. to "C:\Program Files\Windows Installer XML v3.5", the folder where the environment variable %ProgramFiles% points to.
WiX requires the .NET 3.5 Framework. Since Windows 7 the .NET 3.5 framework must be be activated in the Control Panel -> Programs and Features -> Turn Windows feature on or off.
Here is the WIX script for ComPortMan: ComPortMan.WXS
In this script there is a line for adding the "ComPortMan_sample.ini", change this into "ComPortMan.INI".
Into the ComPortMan folder put the files from the ComPortMan.ZIP archive, the ComPortMan.WXS, your customized ComPortMan.INI and a make_msi.cmd like this:
@echo off
set WiX_Path=%ProgramFiles%\Windows Installer XML v3.5\bin
if not exist "%WiX_Path%" echo !!!!!!!!!!! WiX not found !!!!!!!!!!!!! & pause & goto ExitPoint
rem -- ensure the folder of the CMD file is the current folder --
%~d0
cd %~p0
rem -- excute WiX candle and light, pause & exit if error --
"%WiX_Path%\candle.exe" -dProcessorArchitecture=x86 -arch x86 -out ComPortMan.wixobj ComPortMan.wxs
if errorlevel 1 pause & goto ExitPoint
"%WiX_Path%\light.exe" -out ComPortMan.msi ComPortMan.wixobj
if errorlevel 1 pause & goto ExitPoint
rem -- cleanup --
del ComPortMan.wixobj
del ComPortMan.wixpdb
:ExitPoint
For the x64 version change x86 to x64:
"%WiX_Path%\candle.exe" -dProcessorArchitecture=x64 -arch x64 -out ComPortMan.wixobj ComPortMan.wxs
The wixpdb file created where the MSI is created, so, if you change -out to another folder then put this path to the "del ComPortMan.wixpdb" line too.
Problems
Wrong COM-port for a short moment
When a serial device is attached then it usually comes with a COM-port which (if required) ComPortMan changes at the earliest possible point. If an application reads the COM-port at the same point then it gets confused when ComPortMan changes the port a millisecond later.
ComPortMan service starts to late
Since XP Windows does not delay the user logon until all services are started - the illusion of a fast system start has priority...
So it can happen that the user gets logged on before the ComPortMan service is started. If the user starts then an application which opens a certain COM port, it might not be there because ComPortMan was not started yet. Very theoretically problem...
Error 193
If the start of the ComPortMan service fails with error 193 (which is ERROR_BAD_EXE_FORMAT), then the ComPortMan.EXE is probably x64 but the system is 32 bits. Or it is in a folder which cannot be read by the "Local System" account. This is required for a service beeing started by the Service Control Manager.
Fix it by giving "SYSTEM" at least read+execute access.
COM Port Info Tool
Introduction
The "COM Port Info" Tool, short ComPortInfo shows information about COM-ports, can manually change the port number, swap the numbers of two ports, perform safe removal and a device restart.
Views
There are to tabs with the "COM ports" and the "BusTypes" view. In the "COM ports" view the ports are sorted by their port number while in the "BusTypes" view they are shown in a device tree below their BusType. Below their parent device they are sorted by their USB port number (if one COM port per USB port) or by Device ID otherwise.
Operations
By right-clicking a device a "safe removal" and a device restart can be performed, the COM-port number changed (even swapped with another port) and the device's properties dialog from the Windows Device Manager can be shown.
Device restart and port number changes are available only if ComPortInfo is started with admin privileges.
If the ComPortMan service is running then ComPortInfo shows the INI sections responsible for a device.
Options
Autorefresh
If activated the view is refreshed on arrival and removal of port devices. If of then F5 must be pressed for a refresh.
Show Port Parameters (GetCommState and GetCommTimeouts)
If activated the parameters of a port are shown as left behind by the last application which used that port.
If an error ERROR_SHARING_VIOLATION or ERROR_ACCESS_DENIED is shown then the port is currently opened by an other application.
Show default Port Parameters (GetDefaultCommConfig)
If activated the default parameters of a port are shown as set in the Windows Device Manager. These have little impact since they must be requested and the set by an application which is quite rare.
Show Port Properties (GetCommProperties)
If activated the port's capabilities are shown, as supported data rates and signals.
Show ComPortMan Criteria
If activated criteria ready to use in the ComPortMan.ini are shown.
Font
Sets the font used in the right pane.
Background Color
Sets the background color used in the right pane.
Highlighting
Configures the highlight colors and duration for arrived and removed devices.
Windows Theme
Allows to disable the use of the Windows design service to get a Windows 95 like look. Under Windows 10 you can then say again which part of the scroll bars are the sliders and which are the background...
Allow only one Instance
Allows only one instance of the same ComPortMan.exe. When started again the window of the former one is activated instead.
Always on top
Keeps the window on top of others.
.
History
V1.1.8 (21 May 2023)
New: BalloonTips and ComPortInfo look better on high DPI scale
V1.1.7 (13 Nov 2022)
Bugfix: Errorlevel on -install/-register/-uninstall/-deregister was always 1
New: The MSIs creating an entry in "Programs and Features" aka "Add/Remove Programs"
V1.1.6 (13 June 2022)
Bugfix: Setting RemoveDosDeviceNameOnStartup=1 works now
New: Criteria Address and ParentAddress for USB Composite Devices with more than one COM port
V1.1.5 (25 May 2022)
Bugfix: Some bugfixes for "Quick-and-dirty Mode"
Bugfix: ComPortInfo sorts in new ports more reliably
V1.1.4 (01 April 2022)
Bugfix: Balloontips did not show all COM ports of bluetooth devices with multiple COM ports
New: ComPortInfo can flash RTS/DTR lines of RS.232 ports for identification
V1.1.3 (07 Nov 2021)
New: Balloontips with round corners under Windows 11
V1.1.2 (11 July 2021)
New: RemovePortDeviceOnRemoval and RemoveUsbDeviceOnRemoval have 30s delay now to avoid conflicts when a device disappears for a moment while the drive installation
V1.1.1 (30 May 2021)
New: ComPortMan can delete a COM name if still present after changing (sometimes necessary with VirtualPC's virtual COM ports)
V1.1.0 (24 May 2021)
Bugfix: Crash ComPortMan V1.0.8 when using ComNameArbiterClean
New: ComPortMan's BallonTips and ComPortInfo support Windows 10 display scaling > 100%
V1.0.8 (06 April 2021)
New: Criteria Device Class
New: ComPortMan and ComPortInfo sort ports of multi-serial devices by Location and DeviceID which corresponds better with the hardware
V1.0.7 (14 Feb 2021)
Bugfix: ComNameArbiterClean did not work correctly since V0.9.8
V1.0.6 (08 Feb 2021)
New: Variable %ComPortNumber% which for instance expands to 9 for COM9
V1.0.5 (03 January 2021)
New: COM port Registry values under HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM are checked and corrected after restarting a port device. Usually this is the job of the device's driver but some just don't take care. HKLM\HARDWARE\DEVICEMAP\SERIALCOMM is a relic from the pre-plug'n play age (Windows NT 3.1 to 4.0) but since the .NET Framework looks there for available COM ports this is and will stay important...
New: Criteria LocationPath
V1.0.4 (21 Sept 2020)
Bugfix: ComPortMan and ComPortInfo V1.0.3 did not work with some modem devices
V1.0.3 (21 Sept 2020)
New: ComPortMan can restore COM port names when the PortName registry value has been emptied somehow
Bugfix: Minor fixes for ComPortInfo
V1.0.0 (03 Sept 2020)
Bugfix: Some "COM Port Info" crashes
New: ComPortMan can swap port numbers when required
V0.9.9 (26 July 2020)
Bugfix: Port assignment might fail in V0.9.8 when a device is attached again
Bugfix: BallonTips not shown on some Windows 7
New: Faster restart of USB devices by resetting the USB port instead of using the device manager (XP, Win8, Win10 only, not supported by Vista and Win7)
New: "COM Port Info" with highlighting of just arrived and removed devices
New: "COM Port Info" can restart USB ports (XP, Win8, Win10 only, not supported by Vista and Win7)
V0.9.8.0 (20 May 2020)
New: Executing programs on arrival and on removal of COM port devices
New: Balloontips in Windows 10 style
New: "COM Port Info" changes ports much faster
New: "COM Port Info" shows more COM port information
New: "COM Port Info" shows open handles to COM ports
V0.9.7.0 (12 Sept 2017)
Bugfix: QuickAndDirty=1 was ignored in V0.9.6
V0.9.6.0 (07 Feb 2017)
New: Criteria Location and ParentLocation
Bugfix: Generating a full report did not work in ComPortInfo
V0.9.5.0 (11 Dec 2016)
New: _install.cmd and _uninstall.cmd renamed to what they really do: _service_register.cmd and _service_deregister.cmd; _start.cmd and stop.cmd renamed to _service_start.cmd and _service_stop.cmd to fit in the new naming scheme
New: ComPortMan detects COM port devices which failed to start, for instance because their port number is in use. To prevent this, so far ComPortMan changed the port number to 200 up on removal to ensure the device can start when attached next time. This is no more necessary. Furthermore ComPortMan detects if a device starts but without creating a COM port because it is in use. Both is then fixed by changing the port number and restarting the device.
New: When a port device is removed whose port was changed in quick&dirty mode then its driver will try to delete the former port. If this one is in use meanwhile by another device then ComPortMan restores it immediately.
New: ListComPorts command line tool replaced by the GUI tool ComPortInfo
V0.9.4.0 (13 July 2015)
Bugfix: On -install and -uninstall ComPortMan V0.9.3 did nothing but opening the help
V0.9.3.0 (17 May 2015)
Bugfix: ComNameArbiterClean did not work correctly
Bugfix: Fixing FriendlyNames didn't always work
New: BalloonTips on removal
V0.9.2.0 (10 May 2015)
New: FriendlyName is checked and fixed even ComPortMan does not change the port number
New: Port number is set as used in the "COM Name Arbiter" registry key, even ComPortMan does not change the port number; makes sense because Windows does this only when the device is installed but not on subsequent arrivals
New: Port number collisions are detected and fixed even when ComPortMan does not change the port number (on arrival only, not on service startup)
V0.9.1.0 (01 Oct 2014)
New: COM ports of "Modem" class devices are handled
V0.9.0.0 (12 May 2014)
Bugfix: For USB devices attached to USB3 controllers the USB port name was wrong
V0.8.9.0 (18 Feb 2014)
Bugfix: For devices with device interface GUID_DEVINTERFACE_USB the removal was not processed
New: Setting RemoveDosDeviceNameOnRemoval
V0.8.8.3 (17 Feb 2014)
New: Works with devices which have the device interface GUID_DEVINTERFACE_SERENUM_BUS_ENUMERATOR and GUID_DEVINTERFACE_USB (so far only GUID_DEVINTERFACE_COMPORT)
Bugfix: USB port not determined on Texas Instrumens USB3 controllers
V0.8.7.0 (15 May 2013)
New: After removal of a COM-port the device can be deleted from the Windows device management, see Settings
V0.8.6.0 (15 May 2013)
Bugfix: When assigning a COM-port for a new device the same port is changed for all non-present devices to ensure their driver can start if the are attached at the same time
V0.8.5.0 (04 July 2012)
Bugfix: -silentstop (used by the MSI) was not implemented
V0.8.4.0 (03 July 2012)
Bugfix: -install and -uninstall did not work in V0.8.3.0
V0.8.3.0 (10 June 2012)
Bugfix: Wrong balloontip if multiple different COM devices attached to the same USB hub
Change: The first digit of the USB port name has been changed to be compatible with USBDLM and UsbTreeView
V0.8.2.0 (1 March 2012)
Bugfix: COM-port removed if all configured ports are not available
V0.8.1.0 (27 Feb 2012)
Bugfix: Detection of mulit-port-adaptors as such failed with some devices
New: "Quick-and-dirty mode" is default, see Settings
V0.8.0.0 (27 Feb 2012)
New: Fast "Quick-and-dirty mode" available, see Settings
New: Windows COM-port reservation can be removed, see Settings
V0.7.0.0 (22 Feb 2012)
New: COM-Ports sorted in the balloontip
V0.6.1.0 (17 Feb 2012)
Bugfix: USB-Port-Name had the final part missing on some devices
V0.6.0.0 (17 Feb 2012)
Bugfix: Failure on arrival of USB multi-port adaptors
V0.5.0.0 (15 Feb 2012)
New: COM-Ports by USB-Port
New: Balloontips on COM-Port arrival
V0.1.0.0 (22 Jan 2012)
very first public version
Plans
maybe AutoRuns on arrival of COM-Ports like USBDLM does -> done in V0.9.8
COM port swapping, so far the COM port assignment works only if the target port is not in use -> done in V1.0.0
Software Licence ComPortMan
This licence agreement is based on and bound to German law. This is a translation of the most important facts for our customers and visitors. All programs and documents were created corresponding German law. If there were any infringements of changed or international law it is done unintentional. Please let me know in order to allow corrections.
1. The subject of the contract
The subject of the contract is the enclosed software, the software description and instructions, as well as other associated written material, in the following also called 'software'.
The author makes attentive to the fact that it is not possible to provide software that works error free is in all applications and combinations.
The subject of the contract is therefore only a software, which is usable in the sense of the program description.
2. Granting of a licence
The author grants public schools, universities and other non profit institution of education where the students outnumber all others a free licence.
Furthermore public libraries whose usage is free of charge can use the software for free.
Other users have 30 days to determine if this product meets their needs. After this time one licence per computer must be ordered or the software must be removed from the computers.
The licence applies to all version numbers of the software now and in the future to the appropriate number of licences.
The volume licences are valid for the particular number of computers within a company or organization.
The author does not supply updates since all updates are offered for download.
The software can be copied and passed on freely, as long as the ZIP or MSI archive is unchanged. Re-packaging is allowed for internal use only.
3. No further legal claims
The author is both author and owner of the software, as well as of algorithms and procedures used in this software.
4. No modifications or decompiling
Changes in any files, disassembling, reverse engineering, patching of this software is expressly prohibited.
5. Redistribution
Redistribution of the unmodified software archive files on CD/DVD media of computer magazines is allowed.
Making them available for download is unwanted. Whenever possible link to https://www.uwe-sieber.de/files/comportman.zip and https://www.uwe-sieber.de/files/comportman.msi
Re-packaging is allowed for internal use only.
6. No warranty
I make no guarantee, implied or otherwise as to the accuracy of the documentation or the software's suitability for any purpose. It is a condition of the licence that the user accepts that I'm not responsible for any damages arising by the use or misuse of this software. This includes loss of profit, data, any material losses and their consequential damages: even if I'm informed about the possibility of those damages. I try to fix bugs as soon as possible.