COM Port Manager - ComPortMan V1.1.9

Getting Started





Licence agreement



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


    ComPortMan does not come with a SETUP.EXE, it's all manual work. See Section Installation.


    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:

    Licence agreement


    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:

    With ComPortMan you can define which COM-port-number is assigned to a port by some criteria.


    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 (, 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

    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!

    You can uninstall the service using parameter -deregister, this is what the _service_deregister.cmd does:


    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:

    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.


    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:


    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):

    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:


    For moving the current COM7 to 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.


    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:


    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.


    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:


    And individual for each ComPorts section. Sample:


    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:


    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.


    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:


    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:


    For the USB device:


    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:


    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.


    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:


    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:


    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:



    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:


    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

    ;all other USB serials at COM3, 4, 5

    Or short, using the list notation:


    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)


    ;don't touch the Samsung and the Huawei modems

    ;any other USB-serials

    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)


    ;don't touch the Samsung and the Huawei modems

    ;any FTDI RS232 device at COM7

    ;any other USB-serials

    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

    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).





    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:





    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)


    ;don't touch the Samsung and the Huawei modems
    FriendlyName1=SAMSUNG Mobile Modem *
    FriendlyName2=HUAWEI Mobile Connect *

    ;any other USB-serials

    COM-Ports by Bus-Type

    BusType means how the serial device is connected to the system. This can be
  • USB
  • PCI
  • ISA

    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


    ;any USB-serial on COM3 and 4

    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


    ;any modem COM port on COM3 and 4

    COM-Ports by USB-Port



    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:





    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



    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".


    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:  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



    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:  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.
    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".


    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:  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.




    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:  Date: 2019-11-26)
    FriendlyName       : USB Serial Port (COM21)
    BusType            : USB
    Address            : 1


    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:


    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":


    To start it in the SYSTEM context set "system=1":


    A window style can be suggested , e.g. windowstyle=max


    max         maximized
    min         minimized
    hidden      hidden
    noactivate  normal but the windows does not try to get the focus

    If the started program becomes the acitve window depends on being elevated or not. If not it becomes active only when the currently active window is not elevated.

    A delay can be defined in milliseconds or using a unit ('s' for seconds, 'm' for minutes and 'h' for hours. Maximum is 24h:


    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:


    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


    open="%ProgramFiles(x86)%\teraterm\ttermpro.exe" /c=%ComPortNumber% /baud=9600


    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 --
    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


    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.


    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


    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.


    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.


    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.


    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.

    Sets the font used in the right pane.

    Background Color
    Sets the background color used in the right pane.

    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.



    V1.1.9 (21 Aug 2023)
  • Bugfix: Variable %ComPortNumber% was often empty
  • Bugfix: OnArrival did not work when ComPortMan missed the user logon notification on Windows startup

    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


  • 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 and
    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.