Index




COM Port Manager - ComPortMan V1.1.9

Einstieg

Installation

Konfiguration

Probleme

History

Lizenzvereinbarung




Homepage:
https://www.uwe-sieber.de/comportmane.html


EMail:
mail@uwe-sieber.de







Einstieg



ComPortMan ist ein Window-Dienst, der Kontrolle über die Vergabe von COM-Port-Namen (z.B. COM3, COM4 usw.) verschafft.
Als Windows-Dienst ist ComPortMan, einmal installiert, unabhängig von den Rechten des angemeldeten Nutzers.

Es können neue Standard-COM-Ports für beliebige Arten von COM-Ports festgelegt werden, z.B. für USB-Seriell-Adapter.

ComPortMan läuft unter Windows 2000, XP, Server 2003, Vista, Windows 7, 8, 10, 11 und den jeweiligen Server-Versionen.
Vorrangig getestet wurde zuletzt nur noch Windows 10 x64.


Installation

ComPortMan kommt in einer ZIP-Datei zur manuellen Installation oder als MSI, siehe hier: Installation.


Konditionen

ComPortMan ist Freeware für die private Nutzung sowie für Bildungseinrichtungen. Anderenfalls ist - nach einer 30-tägigen Testzeit - pro Computer eine Lizenz nötig, s.unten.
Bildungseinrichtungen gelten als solche, wenn Zahl der eingeschriebenen Schüler und Studenten höher ist als die der sonstigen Mitarbeiter.

Preise gibts hier:
https://www.uwe-sieber.de/ComPortMan.html

Lizenz-Vereinbarung

Die Software ist auch ohne Lizenz voll funktionsfähig - es gibt keine "Vollversion".





Wozu?

Beim erstmaligen Anschließen eines Gerätes, dass sich als COM-Port zu erkennen gibt, ordnet Windows den ersten, in der gesamten Lebensdauer der Windowsinstallation noch niemals benutzten COM-Port zu. Den Port kann man dann im Geräte-Manager mit einiger Klickerei umstellen.
Für jeden neuen COM-Port geht das Ganze von vorne los, ebenso wenn man ein Gerät, keine USB-Hardware-Seriennummer hat, an einen anderen USB-Port anschließt - ohne Seriennummer wird es dort nicht als das Selbe wiedererkannt.

Wird ein COM-Port entfernt, bleibt dessen Port-Nummer reserviert.

Die Reservierung zuvor genutzter COM-Ports ist in Registry unter HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\COM Name Arbiter gespeichert. Zur manuellen aufheben der Reservierung habe ich ein kleines Tool geschrieben:
https://www.uwe-sieber.de/misc_tools.html#com_ports


Mit ComPortMan kann man Abhängig von Kriterien vordefinieren, anhand verschiedener Kriterien  welche Geräte welche Portnummern bekommen.

Zum Ändern von COM-Ports gibt es kein API, ComPortMan muß direkt auf die Windows Registry zurgreifen. Da sich ComPortMan über die Reservierungen hinwegsetzt passiert unter Umständen genau das was die Reservierungen verhindern sollen, nämlich dass ein COM-Port beim erneuten Anschließen eine Gerätes bereits belegt ist und das Gerät deshalb nicht starten kann. Da es dann auch keine Benachrichtigung über die Ankunft des Geräte gibt, kann dann auch ComPortMan nichts mehr retten.

Das Einsatzscenario beschränkt sich somit auf einfache Fälle, wie das Anschließen eines einzelnen USB-Seriell-Adapters an verschiedene USB-Ports, wo er trotz fehlender USB-Seriennummer immer den selben Port bekommt.

Immer hilfreich und problemlos sind natürlich auch die Balloontip mit den zugeordneten COM-Ports neue angeschlossener Geräte.




 











Installation




Mittels MSI

Die ComPortMan.msi rechts-klicken -> Instalieren. Das installiert ComPortman ohne Rückfragen nach "C:\Programme\ComPortMan", registriert und started den ComPortMan-Dienst.

Manuell

Die ZIP-Datei entpacken, z.B. nach C:\Programme - ein Ordner ComPortMan ist enthalten. Im Ergebnis sollten die Dateien dann z.B. in C:\Programme\ComPortMan liegen.

ComPortMan muß auf einem lokalen Laufwerk installiert sein, er funktioniert nicht, wenn er von einem Netz- oder Subst-Laufwerk gestartet wird.

Zum Installieren des ComPortMan-Dienstes einfach die ComPortMan.exe mit dem Paramter -register starten.
Genau das macht die _service_register.cmd

Damit werden keinerlei Dateien kopiert. ComPortMan wird nur als Dienst registriert und gestartet.

Ohne Admin-Rechte startet sich die ComPortMan.exe selbst nochmal und fordert dabei die nötigen Admin-Rechten an.

ComPortMan trägt sich mit der Startart 'Automatisch' ein - wird also bei jedem Systemstart automatisch geladen.


Deinstallation:
Der Dienst kann mit dem Parameter -servicederegister gestoppt und deinstalliert werden - das macht die 
_service_deregister.cmd

Der Unterstrich am Beginn des Dateinames dient allein dazu, die Command-Script-Dateien bei alphabetischer Sortierung am Anfang zu haben...

Beides geht auch ohne MessageBox:

ComPortMan -silentregister
ComPortMan -silentderegister

Es gibt dann bei Erfolg Errorlevel 0, sonst 1 zurück.



Konfiguration mittels ComPortMan.ini

Um die ComPortMan.ini im Text-Editor zu öffnen immer die _edit_ini.cmd starten - die öffnet die ComPortMan.ini im Text-Editor, falls noch keine vorhanden ist, wird eine neue, einfache angelegt. Falls Admin-Rechte nötig sind, werden diese angefordert.

Mehr dazu unter Konfiguration.



Sonstiges

Der installierte Dienst kann mit _service_stop.cmd und _service_start.cmd gestoppt und gestartet werden.

Auf der Kommandozeile kann man auch das Windows-Kommando NET bemühen:

net stop ComPortMan
net start ComPortMan

Wenn der ComPortMan-Dienst gestartet wird, wird die ComPortMan.exe aus dem Pfad genommen, aus dem der Dienst installiert wurde! Von wo aus der Dienst gestartet wird, spielt keine Rolle, soll ein neues Verzeichnis benutzt werden, dort einmal  _service_deregister und dann _service_register ausführen.


Falls ein Ordner wie C:\Tools benutzt wird, bitte sicherstellen, dass - genau wie bei C:\Programme - nur Administratoren und "SYSTEM" Schreib- und Ändern-Zugriff haben, sonst könnte böswillige Software die ComPortMan.exe ersetzen oder die ComPortMan.ini modifizieren, um an höhere Rechte zu gelangen.


Die Einstellungen in der ComPortMan.ini können geändert werden, ohne den Dienst neu zu starten - die INI wird bei jedem Anschließen eines COM-Ports gelesen, wenn sich ihr Datei-Datum/Uhrzeit geändert hat.


Hinweis:

Die CMD-Dateien enthalten Kommandozeilen wie
"%~dp0ComPortMan" -register

%~dp0 ist ein Platzhalter für Laufwerk und Pfad zur CMD-Datei. Das funktioniert so: %0 ist der Platzhalter für die laufende CMD-Datei, z.B. C:\Program Files\ComPortMan\_service_register.cmd.
~dp ist ein "Modifizierer" und liefert Laufwerk plus Pfad (drive + path), z.B. C:\Program Files\ComPortMan\.

Mehr über Batch-Parameter und Modifizierer:
http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/percent.mspx




Konfiguration



ComPortMan wird über eine INI-Datei namens ComPortMan.INI konfiguriert die im selben Verzeichnis wie die ComPortMan.EXE liegt. Der Windows-Explorer zeigt ja standardmäßig keine Dateierweiterungen wie "INI" an - INI-Dateien nennt er "Konfigurationseinstellungen".
Eine INI-Datei kann z.B. mit dem Windows-Editor 'Notepad' bearbeitet werden - einfach im Explorer doppelklicken.
Mitgeliefert wird als Beispiel die ComPortMan_Sample.INI - die kann man sich umbenennen oder eine neue ComPortMan.INI anlegen.

Das Editieren der ComPortMan.INI erfordert Admin-Rechte, da sie im Programme-Verzeichnis liegt - da haben auf NTFS-formatierten Laufwerken nur Admins Schreibzugriff.
Unter Vista kann hier der "Virtual Store" zuschlagen: Das Schreiben der INI-Datei wird dann nach 
C:\Users\(UserName)\AppData\Local\VirtualStore\Program Files\ComPortMan
umgelenkt. Der ComPortMan-Dienst liest aber aus seinem Verzeichnis. Also unter Vista die USDBLM.INI immer als "echter" Administrator bearbeiten. Oder ComPortMan nicht unter C:\Programme installieren, sondern irgendwo anders, z.B. C:\Tools\ComPortMan - der Vista Virtual Store ist nur für C:\Programme wirksam.


Wie INI-Dateien funktionieren

INI-Dateien sind in Abschnitte unterteilt - jeder Abschnitt beginnt mit dem Abschnitts-Namen in eckigen Klammern, z.B. [ComPorts] und erstreckt sich bis zum Beginn des nächsten Abschnitts bzw. beim letzen Abschnitt bis zum Datei-Ende. Jeden Abschnitt darf es nur einmal geben! Die Konfigurations-Einstellungen stehen unter den jeweiligen Abschnitts-Namen - ihre Bedeutung ist abhängig vom Abschnitt in dem sie stehen. Innerhalb eines Abschnitts darf es jeden Wert nur einmal geben.
Kommentarzeilen beginnen mit einem Semikolon. Kommentare sind nur am Zeilenanfang zulässig.

Niemals Abschnitts-Zeilen so auskommentieren:

;[ComPorts20]

Die Einstellungen aus diesem Abschitt gehören dann zum vorherigen!
So legt man einen Abschnitt z.B. korrekt lahm:

[-----ComPorts10]

Es ist nach wie vor ein Abschnitt, aber keiner für den sich jemand interessiert.


Alternativ Regsitry

ComPortMan kann seine Einstellungen alternativ aus der Registry lesen, und zwar unter
HKLM/Software/Uwe Sieber/ComPortMan
Wenn dieser Schlüssel vorhanden ist, wird die ComPortMan.INI ignoriert! Nur die Einstellungen für die Log-Datei kommen immer aus der ComPortMan.INI.
Für jeden INI-Abschnitt ist ein Schlüssel anzulegen, die Werte müssen vom Typ REG_SZ sein. Damit ComPortMan Änderungen im laufenden Betrieb bemerkt, kann der Wert (Standard) unter HKLM/Software/Uwe Sieber/ComPortMan auf einen anderen (beliebigen) Wert gesetzt werden.. ComPortMan liest dann die Konfiguration neu ein.
Hier gibt's eine Beispiel REG-Datei (natürlich erst speichern und bearbeiten, nicht gleich ausführen...): https://www.uwe-sieber.de/files/ComPortMan_beispiel.reg

Unter x64 Windows wird die Win32-Version von ComPortMan umgeleitet nach
HKLM/Software/Wow6432Node/Uwe Sieber/ComPortMan, also besser die x64-Version einsetzen.


Einige Beispiele

Ohne Konfiguration ändert ComPortMan keine COM-Ports.

Für jeden COM-Port-Typ der eine eigene Behandlung erfahren soll brauch man einen Abschnitt [ComPortsXX]. XX steht für eine Nummer von 1 bis 99 oder keine Nummer - in dieser Reihenfolge werden die Abschnitte ausgewertet.
Welcher Abschnitt für einen COM-Port zuständig ist, wird über Kriterien gesteuert. Jeder Abschnitt braucht mindestens ein Kriterium.

Das Tool ComPortInfo zeigt einige Daten über die aktuell vorhanden COM-Ports und diese Daten können für ComPortMan als Kriterien genutzt werden.

Beispiel für ComPortInfo' Ausgaben:

PortName      : COM2
KernelName    : \Device\Serial0
DeviceID      : ACPI\PNP0501\1
FriendlyName  : Kommunikationsanschluss (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

Wenn man COM2 zurück auf COM1 haben will, nutzt man am besten die nur bei internen Ports vorhandenen Kriterien IRQ und IoPort:
Grün die Kriterien, violet der Ziel-Port:

[ComPorts10]
IRQ=7
IoPort=3F8
PortName=COM1

Um COM7 aus obigem Beispiel auf COM3 zu verschieben:

[ComPorts20]
KernelName=\Device\sscdmdm0
PortName=COM3

Die Nummern der Abschnitt stehen in keiner Beziehung zu irgendwas. ComPortMan liest [ComPorts1] bis [ComPorts99] und zuletzt [ComPorts] und überprüft die dort festgelegten Kriterien. Der erste Abschnitt mit passenden Daten wird benutzt.

Wenn ein Port nicht verändert werden soll, legt man einfach einen dafür passenden Abschnitt mit niedriger Nummer an und legt dort keinen Ziel-Port fest. Der Abschnitt ist dann trotzdem zuständig, mangels Ziel-Port wird aber nichts verändert.

Nachdem die INI angepaßt wurde, kann man F5 zum Aktualisieren drücken - es sollte dann für den jeweiligen Port den zuständigen Abschnitt zeigen:

PortName      : COM2
KernelName    : \Device\Serial0
DeviceID      : ACPI\PNP0501\1
FriendlyName  : Kommunikationsanschluss (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 überpüft die Ports beim Start und wenn ein neuer Port im System erscheint. 
Um also die Einstellungen für einen externen Anschluß wirksam zu machen, schließt man ihn neu an. Für interne Ports kann man die ComPortMan-Dienst neu starten.




Einstellungen



Die im Folgenden beschriebenen Einstellungen sind in der ComPortMan.INI im Abschnitt [Settings] einzutragen.
In den Beispielen wird immer wieder aufs Neue der Abschnitt [Settings] genannt. Damit ist natürlich der eine gemeinsame Abschnitt gemeint. Es kann nur einen geben...

Die Einstellungen werden sofort wirksam.


COM-Ports beim Start überprüfen

Standardmäßig überprüft ComPortMan die Ports beim Start. Wenn es das nicht tun soll:

[Settings]
CheckPortsOnStartup=0


COM-Ports beim Aufwachen aus Standby und Ruhezustand überprüfen

Falls sich die COM-Ports nach dem Aufwachen aus Standby und Ruhezustand verändern, kann ComPortMan das korrigieren. Normalerweise ist das aber nicht nötig.

[Settings]
CheckPortsOnResume=1



Quick-and-dirty-Modus

Bis V0.7 hat ComPortMan Portnummern geändert, indem er die entprechenden Registry-Einträge des jeweiligen Ports ändert und dann das Gerät neu startet. Dieser Neustart kann aber einige Sekunden dauern. Bei Mehrfachports startet ComPortMan das übergeordnete Gerät neu da das etwas schneller geht. Bei USB-Multi-Seriell-Adaptern ist das z.B. dessen eingebauter USB-Hub.
Das ist die saubere aber oft langsame Methode.

Im Quick-and-dirty-Modus werden auch die Registry-Einträge geändert, dann aber direkt der alte COM-Port-Name gelöscht und der neue angelegt.
Beim Entfernen des Ports muß dann ComPortMan den neuen COM-Port-Namen löschen, denn der Treiber wird wahrscheinlich den ursprünglichen löschen wollen. Wenn der nicht da ist, macht das nichts, ist der Port aber inzwischen durch ein anderes Gerät belegt, könnte dessen Port gelöscht werden. Ob sowas passiert, hängt vom Treiber des Ports ab. Ab Version 0.95 erkennt ComPortMan dies und stellt den gelöschten Port sofort wieder her.

Die Einstellung gibts zum einen global:

[Settings]
QuickAndDirtyMode=1

Zum Anderen kann man sie auch individuell für einzelne Geräte im jeweiligen ComPorts-Abschnitt vornehmen und so die globale Einstellung überstimmen:

[ComPorts20]
DeviceId=FTDIBUS*
PortNames=COM3,COM4
QuickAndDirtyMode=0


DosDeviceName von COM-Ports nach dem Entfernen löschen

Manche Treiber vergessen, den DosDeviceName (sowas wie COM1, COM2 usw) nach Entfernen des Gerätes zu löschen. Normalerweise macht das nichts, da ja ohne ComPortMan nur genau dieses Gerät diesen Port bekommt. Wenn ComPortMan das Löschen übernehmen soll:

[Settings]
RemoveDosDeviceNameOnRemoval=1

Standardmäßig löscht ComPortMan den Portnamen nur, wenn er ihn selbst im Quick-and-dirty-Modus zugeordnet hat.


DosDeviceName von COM-Ports beim Systemstart löschen

Manche Treiber vergessen, den DosDeviceName (sowas wie COM1, COM2 usw) nach Entfernen des Gerätes zu löschen.
Auch wenn ein von ComPortMan im Qick-and-dirty-Modus zugeordneter Port getrennt wird während ComPortMan nicht läuft bleibt der Symlink von "COMn" auf dessen Kernel-Objekt zurück.

ComPortMan kann solche Zombie-Ports beim Start entfernen:

[Settings]
RemoveDosDeviceNameOnStartup=1



Windows COM-Name-Arbiter

Für jeden COM-Port setzt Windows in der Registry ein Bit, damit dieser Port niemals für neue Geräte verwendet wird. Daher die endlos ansteigenden COM-Port-Nummern...
Ein Tool zum manuellen Zurücksetzen der Bits ist mein COM Name Arbiter Tool.

ComPortMan kann hier auch aufräumen, das tut es beim Dienst-Start und wenn ein COM-Port aus dem System entfernt wurde.

Beispiel: Reservierung für Ports 3, 4 und 10-256 aufheben:

[Settings]
ComNameArbiterClean=3,4,10-256

Für aktuell vorhandene Ports wird die Reservierung aber nicht aufgehoben, außerdem paßt ComPortMan die Reservierung an, wenn es einen Port ändert.


Nach dem Entfernen Gerät aus dem Windows-Gerätemanagement löschen

Wenn man mit einer großen Zahl immer neuer Geräte arbeitet, die eh nie wieder angeschlossen werden, kann man sie nach dem Entfernen aus dem Gerätemanagement löschen lassen:

Für den COM-Port:

[Settings]
RemovePortDeviceOnRemoval=1

Für das USB-Gerät:

[Settings]
RemoveUsbDeviceOnRemoval=1


Debug-Infos

Wenn es Probleme gibt, kann man u.U. anhand von Debug-Ausgaben herausfinden, was schiefläuft.
Für Ausgaben in die Log-Datei ist WriteLogFile=1 zu setzen. Standardmäßig wird eine _ComPortMan.log ins Stammverzeichnis des Windows-Laufwerks geschrieben. Mit LogFile=Pfad\Datei läßt sich ein anderes Ziel festlegen.
Für Live-Debug-Ausgaben, die man mit SysInternals DebugView einfangen kann, ist WriteDebugInfo=1 zu setzen.
Wie dedailiert die Ausgaben ausfallen, wird über den LogLevel 1 bis 5 gesteuert, wobei ab 4 extrem ins Detail geht. Beispiel:

[Settings]
LogLevel=3
WriteLogFile=1
LogFile=C:\ComPortMan.LOG
WriteDebugInfo=1

Die ComPortMan.log wird beim Start in ComPortMan_BAK.log umbenannt, eine vorhandene ComPortMan_BAK.log wird gelöscht.





Balloon-Tips



Auch wenn man dank ComPortMan ja weiß, welche Portnummern zugeordnet werden, ist es ganz nützlich, es nochmal angezeigt zu bekommen...
Wenn aktiviert zeigt ComPortMan ein kleines Hinweis-Fenster mit dem oder den zugeordneten Ports. Der BallonTip verschwindet, wenn man draufklickt oder nach Ablauf der Anzeige-Zeit. Diese beträgt 6 Sekunden plus eine halbe Sekunde pro weiterem angezeigten Port und kann in Millisekunden eingestellt werden:

[BalloonTips]
Enabled=1
Timeout=6000

Wird die Maus über dem Balloon-Tip bewegt, beginnt die Zeit von vorn.

Ab V0.9.3 gibts auch Balloon-Tips beim Entfernen, standardmäßig dann, wenn Enabled=1 ist. Standard-Anzeige-Zeit ist halb so lang wie beim Anschließen. Beides kann separat eingestellt werden:

[BalloonTips]
EnabledOnRemoval=1
TimeoutOnRemoval=3000


Die COM-Ports werden nach USB-Port sortiert. Wenn alle den selben USB-Port haben oder bei Nicht-USB-Geräten wird nach Geräte-ID sortiert.





COM-Ports abhängig von Kriterien




Man benötigt mehrere Abschnitte [ComPortsXX], in denen jeweils andere Kriterien festgelegt sind.

ComPortMan liest [ComPorts1] bis [ComPorts99] und zuletzt [ComPorts] und überprüft die dort festgelegten Kriterien. Der erste Abschnitt mit passenden Kriterien wird benutzt.

Am besten konfiguriert man Abschnitte in 10er-Schritten, dann kann mal problemlos einen Abschnitt einfügen, ohne neu zu numerieren.

Jeder Abschnit braucht mindestens ein Kriterium.

Untypisches Beipiel zum Verdeutlichen der Funktionsweise, Kriterien in grün, Ziel-Ports in violett:

[ComPorts10]
DeviceID1=USB\VID_067B&PID_2517
DeviceID2=USB\VID_1234&PID_5678
PortName1=COM5
PortName2=COM6

Dieser Abschnitt wird benutzt, wenn ein COM-Port entweder DeviceID USB\VID_067B&PID_2517 oder USB\VID_1234&PID_5678 hat angeschlossen wird.
Der Port bekommt dann COM5 zugeordnet falls verfügbar, sonst COM6. Wenn beide belegt sind, bleibt die Portnummer unverändert.

Hier besteht kein Zusammenhang zwischen den Nummern!

Typisches Beispiel um o.g. Ports auf je einer bestimmten Portnummer zu haben:

[ComPorts10]
DeviceID=USB\VID_067B&PID_2517
PortName=COM5

[ComPorts20]
DeviceID=USB\VID_1234&PID_5678
PortName=COM6

Wenn zwei verschiede Geräte die selbe Portnummer bekommen sollen (natürlich nicht gleichzeitig), numeriert man Kriterien gleichen Types, hier für die zwei verschiendenen DeviceIDs:

[ComPorts10]
DeviceID1=USB\VID_067B&PID_2517
DeviceID2=USB\VID_1212&PID_8976
PortName=COM5

Hier muß dann eine der DeviceIDs passen.


Einen bestimmten COM-Port nicht anfassen, alle anderen USB-COM-Ports auf COM3, 4 oder 5

;Samsung Modems nicht ändern
[ComPorts5]
KernelName=\Device\sscdmdm*
PortName=

;alle anderen USB-COM-Ports auf COM3, 4, 5
[ComPorts99]
DeviceID=USB\*
PortName1=COM3
PortName2=COM4
PortName3=COM5

Oder kürzer mit der Listennotation:

[ComPorts99]
DeviceID=USB\*
PortNames=COM3,COM4,COM5






COM-Port abhängig vom Kernel-Namen



Der Kernel-Name ist das wohin der "DOS device name" (COM1, COM2 usw) über einen "symbolic link" verweist.

Intere ISA oder LPC-Port haben Namen wie \Device\Serial0, \Device\Serial1 usw. Der Kernel-Name anderer Geräte wird von deren Treiber festgelegt, so dass dieser sich zur Identifikation bestimmter Ports eignet.


ComPortInfo zeigt den Kernel-Namen:

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)



Beispiel:

;Samsung und the Huawei-Modems nicht anfassen
[ComPorts10]
KernelName1=\Device\sscdmdm*
KernelName2=\Device\QCUSB_COM*

;alle anderen USB-COM-Ports
[ComPorts20]
ParentDeviceID=USB\*
PortNames=COM3,COM4




Die Nummer mit der die Kernel-Namen enden lassen keinen zuverlässigen Rückschluss auf den physischen Port an einem Multi-Port-Gerät zu! Meist sind die Nummern tatsächlich aufsteigend mit der physischen Portnummer, aber eben nicht immer.
Die Geräte-ID hilft bei echten Multi-Port-Geräten, die USB-Portnummer bei Einzel-Port-Geräten an einem gemeinsamen USB-Hub. ComPortInfo oder UsbTreeView zeigen worum es sich handelt.




COM-Port abhängig von der Device-ID




ComPortInfo zeigt die 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)



Es können Wildcards verwendet werden.


Beispiel:

;Samsung und Huawei-Modems nicht anfassen
[ComPorts1]
DeviceID1=USB\VID_04E8&PID_6601*
DeviceID2=USB\VID_12D1&PID_1001*

;alle anderen USB-COM-Ports
[ComPorts99]
ParentDeviceID=USB\*
PortNames=COM3,COM4

Viele USB-Seriell-Adapter haben keine USB-Hardware-Seriennummer über die Windows ein Gerät als das Selbe wiedererkennen könnte.
Bei USB-Geräten mit Seriennummer wird diese Bestandteil der Device-ID, bei sochen ohne wird dieser Teil der ID (ab dem letzten Backslash) durch Windows generiert, und zwar an jedem USB-Port anders. So kommt es, dass das selbe Gerät an verschiedenen USB-Ports verschiedene COM-Ports bekommt.
Zu erkennen ist das am Zeichen & an zweiter Stelle nach dem letzen Backslash.


Manche USB-COM-Ports haben keine USB\xxx Device-ID, das übergeordnete Gerät (ein USB-Hub oder Root-Hub) aber schon.

Oder einfach das Kriterium BusType nutzen:

;alle anderen USB-COM-Ports
[ComPorts99]
BusType=USB
PortNames=COM3,COM4




Weitere Beispiele:

4x Prolific-Adapter, der aus einem USB-Hub mit vier einzelnen USB-Seriell-Adaptern ist, auf COM11, 12, 13,14:
Da Windows die USB-Portnummer ans Ende der DeviceID bastelt, können wir diese nutzen.
Der Stern ist hier ein Platzhalter (Wildcard) für beliebige Zeichen, hier für den Teil der DeviceID der zufällig generiert wird,
weil das USB-Gerät keine USB-Seriennummer hat.

[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-Adapter der ein USB-MultiPortSerial-Gerät mit vier COM-Ports ist. Da die DeviceIDs auf 0000, 0001, 0002 und 0003
enden, können wie diese als Kriterium nutzen, wieder mit Platzhalter für den zufälligen Teil der DeviceID:

[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 abhängig vom FriendlyName



FrienlyName ist der lesbare Gerätename, der auch im Gerätemanager angezeigt wird.
ComPortInfo zeigt ihn:

PortName      : COM1
KernelName    : \Device\Serial0
DeviceID      : ACPI\PNP0501\1
FriendlyName  : Kommunikationsanschluss (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)



Beispiel:

;Samsung und Huawei-Modems nicht anfassen
[ComPorts10]
FriendlyName1=SAMSUNG Mobile Modem *
FriendlyName2=HUAWEI Mobile Connect *

;alle anderen USB-COM-Ports
[ComPorts20]
ParentDeviceID=USB\*
PortNames=COM3,COM4





COM-Ports abhängig vom BusType



BusType meint die Art des Anschlusses. Folgende kennt ComPortMan:
  • USB
  • PCMCIA
  • PCI
  • ISA
  • UNKNOWN

    ComPortInfo zeigt den 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



    Beispiel:

    ;jeden USB-COM-Port auf COM3 oder 4
    [ComPorts20]
    BusType=USB
    PortNames=COM3,COM4





    COM-Port abhängig von der Geräte-Klasse



    Bisher habe ich genau zwei Geräte-Klassen für COM-Ports gesehen:
  • Ports
  • Modem

    ComPortInfo zeigt die Geräte-Klasse als "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



    Beispiel:

    ;jeden COM-Port eines Modems auf COM3 oder 4
    [ComPorts20]
    Class=Modem
    PortNames=COM3,COM4





    COM-Ports abhängig vom USB Port




    Beispiel:

    [ComPorts10]
    UsbPort=1-2-3
    PortName=COM7


    ComPortInfo zeigt den 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


    Gebildet wird das von recht nach links aus den USB-Port-Nummern bis hoch zum Root-Hub. Das erste Digit ist der Index dessen USB-Host-Controllers im Windows Geräte-Manager und kann sich somit ändern wenn ein solcher entfernt oder hinzugefügt wird.
    UsbTreeView zeigt's.

    Der USB-Port als Kriterium ist auch gut geeignet um USB-Mehrfach-Adapter in der erwarteten Reihenfolge COM-Ports zuzuordnen, falls es sich beim Gerät tatsächlich um einen USB-Hub mit daran angeschlossenen Einzel-USB-Seriell-Controllern handelt. COM Port Info zeigt's.
    Die Reihenfolge in der Windows die Ports meldet stimmt leider nicht zwangläufig mit der Hardware überein.
    Mit dem letzen Teil des USB-Port-Names hat man aber die Portnummer innerhalb des Multi-Adapters als Kriterium zur Verfügung:

    Beispiel für einen Prolific 4-fach Adapter auf COM11 bis COM14 in der erwarteten Reihenfolge:

    [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


    Hinweis: Mit V0.8.3 hat sich die erste Stelle im Port-Namen geändert. Damit ist ComPortMan kompatibel mit USBDLM und UsbTreeView.









    COM-Ports abhängig von der Location-Infomation




    Beispiel:

    [ComPorts10]
    Location=Port_#0002.Hub_#0003
    PortName=COM7


    ComPortInfo zeigt die 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


    Manchmal ist die Location-Info des übergeordneten Gerätes hilfreich, die ParentLocation.

    [ComPorts10]
    ParentLocation=Port_#0002.Hub_#0003
    PortName=COM7

    Das übergeordnete Gerät zeigt ComPortInfo als "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-Ports abhängig vom Location-Path




    Beispiel:

    [ComPorts10]
    LocationPath=PCIROOT(0)#PCI(1400)#USBROOT(0)#USB(5)#USB(2)#USBMI(0)
    PortName=COM7


    ComPortInfo zeigt die LocationPath-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 sind mehrere Pfade, als Kriterium in der ComPortMan.ini wird aber ausschließlich der erste ausgewertet!

    Manche COM-Port-Geräte melden keinen Location-Path.



    Manchmal ist die LocationPath-Info des übergeordneten Gerätes hilfreich, der ParentLocationPath, der ist dann etwas kürzer als der des Ports.

    [ComPorts10]
    ParentLocationPath=PCIROOT(0)#PCI(1400)#USBROOT(0)#USB(5)#USB(2)
    PortName=COM7

    Das übergeordnete Gerät zeigt ComPortInfo als "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-Ports abhängig von der Adresse




    Viele Geräte haben einen 32-Bit Adress-Wert (CM_DRP_ADDRESS). Bei USB-Verbundgeräten mit mehreren COM-Ports ist das oft das einzige Kriterium um die Ports sicher zu unterscheiden:


    Beispiel:

    [ComPorts10]
    DeviceID=FTDIBUS\VID_0403+PID_6011+*
    Address=1
    PortName=COM21

    [ComPorts11]
    DeviceID=FTDIBUS\VID_0403+PID_6011+*
    Address=2
    PortName=COM22

    Falls die Adresse 0 oder für alle Ports gleich ist, funktioniert möglicherweise die Adresse des übergeordneten Geräts, die ParentAddress.


    ComPortInfo zeigt die Adress-Werte:

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



    Ab V0.9.8 kann ComPortMan beim Anschließen und Entfernen von COM-Port-Geräten Programme starten. Dazu dienen die Abschnitte OnArrival und OnRemoval, die genauso funktionieren wie die ComPorts-Abschnitte.

    Beispiel: Taschenrechner starten wenn ein FTDI-Gerät an Port 1-1 angeschlossen wird:

    [OnArrival20]
    DeviceID=FTDIBUS\*
    UsbPort=1-1
    open=%windir%\System32\calc.exe


    Standardmäßig startet ComPortMan Prozesse im Kontext des angemeldeten Nuzters, bei aktiver Benutzerkontensteuerung (UAC - User Account Control) ohne Admin-Rechte. Um das Programm "Als Administrator" auszuführen setzt man "elevated=1":

    [OnArrival20]
    open=%windir%\System32\calc.exe
    elevated=1

    Um das Programm im SYSTEM-Kontext zu starten, setzt man "system=1" - nur sehen kann man dann nichts, da das Programm auf dem meist unsichtbaren System-Desktop startet:

    [OnArrival20]
    open=%windir%\System32\calc.exe
    system=1


    Dem zu startenden Programm kann über die Zeile windowstyle= noch ein Fenster-Stil vorgeschlagen werden, z.B. windowstyle=max

    max         maximiert
    min         minimiert
    hidden      versteckt
    noactivate  normal, aber Fenster wird nicht aktiviert, bekommt also nicht den Fokus

    Ob das gestartete Programm zum aktiven Fenster wird, hängt davon ab ob es elevated gestartet wird oder nicht.
    Falls nicht wird es nur dann aktiv, wenn das derzeit aktive Fenster auch nicht elevated ist.

    Bei Bedarf kann noch eine Verzögerung angegeben werden, Standardmäßig in Millisekunden, es können Einheiten angegeben werden, 's' für Sekunden, 'm' für Minuten und 'h' für Stunden. Maximum sind 24h:

    delay=10s

    Mehrere Open-Kommandos

    Es können bis zu 10 Open-Kommandos ausgeführt werden - open1 bis open9 und open. Zusätzliche Parameter wie openstyle, elevated usw. müssen dann jeweils die selbe Nummer tragen.
    "delay" definiert eine Wartezeit bevor die open-Zeile ausgeführt wird. "wait" bewirkt, dass gewartet wird bis das Programm das die open-Zeile gestartet hat beendet wurde - erst dann wie die nächste open-Zeile in Angriff genommen.

    In open-Zeilen können Variablen verwendet werden:

    Variablen

    Variable           Beschreibung            Beispiel
     
    %ComPort%          COM-Port                COM9
    %ComPortNumber%    COM-Port-Nummer         9
    %KernelName%       Kernel-Name zu COMnnn   \Device\VCP0
    %DeviceID%         Geräte-ID               FTDIBUS\VID_0403+PID_6001+FT9G9I7TA\0000
    %DevicePath%       Geräte-Pfad             \\?\ftdibus#vid_0403+pid_6001+ft9g9i7ta#0000#{86e0d1e0-8089-11d0-9ce4-08003e301f73}
    %DriverKeyName%    Driver-Key-Name         {4d36e978-e325-11ce-bfc1-08002be10318}\0017
    %Class%            Geräte-Klasse           Ports
    %ClassGuid%        Geräte-Klassen-GUID     {4d36e978-e325-11ce-bfc1-08002be10318}
    %FriendlyName%     Lesbarer Geräte-Name    USB Serial Port (COM9)
    %BusType%          Anschluss-Typ           USB
    %UsbPort%          USB-Port-Chain          1-1


    Beipiel:

    [OnArrival20]
    DeviceID=FTDIBUS\*
    UsbPort=1-1
    open="%ProgramFiles(x86)%\teraterm\ttermpro.exe" /c=%ComPortNumber% /baud=9600










    Wildcards



    Bei der Konfiguration aller Kriterien können Wildcards (=Platzhalterzeichen) benutzt werden. 
    Dabei steht der Stern '*' für Null bis n Zeichen, das Fragezeichen '?' für genau ein Zeichen.

    Buchstaben werden unabhängig von Groß/Kleinschreibung ausgewertet.


    Beispiel        | passt für                | passt nicht für
    ----------------+-------------------------+------------------
    \Device\Serial? | \Device\Serial0,        | \Device\Serial20
                    | \Device\Serial9         |
    ----------------+-------------------------+------------------
    USB\VID_*       | alles was mit USB\VID_  | PCI\VEN_...
                    | beginnt                 |
    ----------------+-------------------------+------------------
    *\VID_*         | alles was USB\VID_      | PCI\VEN_...
                    | enthält                 | 
    ----------------+-------------------------+------------------
    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
    ----------------+-------------------------+------------------








    Technische Infos



    Hier ein paar Hintergrundinformatioen - was mir gerade so eingefallen ist. Manches findet sich auch an anderer Stelle in dieser Hilfe.


    Window-Dienst

    ComPortMan ist ein Window-Dienst. Window-Dienste werden als solche in die Registry eingetragen und vom "Service Control Manager" gestartet und angehalten.

    Dienste laufen meist im Kontext "Local System" und habe dort maximale Privilegien. ComPortMan ist ein Win32-Dienst, also kein Kernel-Dienst. Als Kernel-Dienst könnte man ihn mit dem Start-Typ "System" versehen - so wäre sichergestellt, dass er vor dem Nutzer-Login fertig geladen ist. Win32-Diensten ist das nicht vergönnt - hier ist "Automatisch" der frühestmögliche Start. Damit ist es möglich, dass der Nutzer eingeloggt wird, bevor ComPortMan startet, siehe auch "ComPortMan-Dienst startet zu spät" unter Probleme.



    Portnummern

    Wenn ein COM-Port-Gerät startet, legt dessen Treiber Kernel-Object mit der COM-Port-Funktionalität an und erzeugt im Win32 Namensraum einen Symbolic Link darauf, beim einem FTDI-Gerät z.B. von COM4 auf \Device\VCP0.
    Wenn es bereits einen anderen Symbolic Link von COM4 auf ein Kernel-Objekt gibt, die Portnummer also doppelt vergben wurde, gibt es drei Möglichkeiten, wie der Treiber daruf reagiert:
  • der Start des Treibers schlägt fehl, das Gerät hat dann meist den Problem-Code 10
  • des wird stillschweigend kein Symbolic Link angelegt, das zuvor vorhanden Gerät funktioniert weiter, das neue ist nicht ansprechbar
  • das neue Gerät löscht einfach den vorhanden Symblolic Link und legt seinen eigenen an (so gesehen bei FTDI)

    Die ersten beiden Fälle erkennt ComPortMan und repariert das.


    Portnummern ändern

    Im Gegensatz zu Laufwerksbuchstaben gibt es zum Ändern von COM-Port-Nummern keine Win32-API-Funktionen, man muss den Port-Namen in der Registry ändern und das COM-Port-Gerät per DIF_PROPERTYCHANGE neu starten.






    Generieren einer MSI-Datei




    Mit einer MSI-Datei kann man ComPortMan mittels Gruppenrichtlinie im Netzwerk verteilen - Admin wissen das besser als ich...

    Zum Erstellen des MSI wird das Microsoft WIX toolset genutzt. Hier sind im WiX-Script für Product- und Package-ID ein "*" konfiguriert, so dass WiX immer neue GUIDs generiert. So funktionieren Updates, zum Deinstallieren muß aber die selbe Version wie zur Installation genutzt werden.

    Hier gibts das WIX-script für ComPortMan: ComPortMan.WXS

    Und hier das Microsoft WIX toolset. Die WIX35.MSI herunterladen, mit recht anklicken -> Installieren.
    Fall ein Warndialog kommt, mit OK bestätigen (da gehts nur um die Visual Studio Integration).

    WiX instlalliert sich in den Standard-Programme-Ordner, typischerweise "C:\Programme\Windows Installer XML v3.5".

    WiX benötigt das .NET Framework 3.5 SP1.

    Dann die angepaßte ComPortMan.INI in den ComPortMan-Ordner kopieren, ebenso die ComPortMan.WXS. In der ComPortMan.WXS ComPortMan_sample.ini in ComPortMan.ini ändern.

    Dann im ComPortMan-Ordner eine CMD- oder BAT-Datei anlegen, die das MSI generiert, etwa so:


    @echo off
    set WiX_Path=%ProgramFiles%\Windows Installer XML v3.5\bin

    if not exist "%WiX_Path%" echo !!!!!!!!!!! WiX nicht gefunden !!!!!!!!!!!!! & pause & goto ExitPoint

    rem -- sicherstellen, dass der ComPortMan-Ordner der aktuelle ist --
    %~d0
    cd %~p0

    rem -- WiX candle und light ausführen, Pause falls Fehler --

    "%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 -- aufräumen --
    del ComPortMan.wixobj
    del ComPortMan.wixpdb

    :ExitPoint


    Für die x64-Version ist zweimal x86 in x64 zu ändern:
    "%WiX_Path%\candle.exe" -dProcessorArchitecture=x64 -arch x64 -out ComPortMan.wixobj ComPortMan.wxs


    Die Datei ComPortMan.wixpdb wird dort angelegt, wo auch das MSI hinkommt. Wenn man also einen alternativen Ausgabepfad angibt (-out), dann diesen auch in der Zeile mit "del ComPortMan.wixpdb" angeben.















    Probleme



    Falscher COM-Port für einen kurzen Moment

    Ein neu angeschlossenden COM-Port überprüft ComPortMan die Portnummer zum frühstmöglichen Zeitpunkt. Wenn aber eine Anwendung auch diesen frühstmöglichen Zeitpunkt nutzt, sieht sie u.U. den alten COM-Port, den ComPortMan dann gleich ändert. Das dauert je nach Treiber bis zu vier Sekunden, es sei denn man nutzt den Quick-and-dirty-Modus.


    Fehler 193

    Wenn der Start des ComPortMan-Dienstes mit Fehler 193 fehlschlägt (ERROR_BAD_EXE_FORMAT), liegt das wahrscheinlich an unzureichenden Zugriffsrechten auf die ComPortMan.EXE. Das Konto "SYSTEM" muß für den ComPortMan-Ordner mindestens das Recht "Lesen, Ausführen" haben.
    Einstellen kann man das mit Rechtsklick auf den Ordner -> Eigenschaften -> Reiter "Sicherheit".


    COM-Portnamen

    Im Gegensatz zu Laufwerksbuchstaben ist die Vergabe von COM-Port-Numern extrem simpel gestrickt:

    Immer wenn ein neues Gerät installiert wird, das einen COM-Port bereitstellt, ordnet Windows dem COM-Port die erste noch nie für einen COM-Port benutzte Nummer zu.
    Jede COM-Port-Nummer merkt sich Windows als benutzt damit niemals zwei Geräte die selbe Nummer haben.
    Leider bleiben selbst die Ports schon längst deinstallierter Geräte als reserviert markiert, so dass man hier ein lästiges endloses Hochzählen der Portnummern erhält.

    Die Rerservierung speichert Windows in der Registry unter
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\COM Name Arbiter
    Dort sind (mindestens) 32 Bytes mit je 8 Bit hinterlegt, jedes gesetzte Bit steht für einen reservierten COM-Port von 1 bis 256.

    Hier mein Tool zum manuellen Freigeben der Reservierungen, der COM Name Arbiter Tool.

    Wenn ein COM-Port im System erscheint, existiert zunächst nur ein Kernel-Object, sowas wie \Device\Serial1. Damit man unter Win32 den Port öffnen kann, wird ein "Symbolic Link" angelegt, der von sowas wie COM1 auf das Kernel-Objekt verweist. Der Versuch so einen Symbolic Link von einem bereits vorhanden COM-Namen anzulegen, schlägt fehl, das Gerät startet nicht oder hat einfach keinen Win32-Namen. Damit genau das nicht passiert, gibt es in der Registry den COM Name Arbiter.

    ComPortMan steht hier nun vor dem Dilema, dass er u.U. Ports zuordnen soll, die laut Arbiter reserviert sind.
    Deshalb schaut er alle nicht angeschlossenen Ports durch, ob sie den selben Port in der Registry hinterlegt haben. Wenn ja, wurde bis V0.94 die Einstellung auf einen anderen, freien, hohen Port geändert, der Port wird dort "geparkt", um zu garantieren, dass das Port-Gerät starten kann, falls es gleichzeitig angeschlossen wird, denn nur wenn das Gerät startet, bekommt ComPortMan eine Nachricht und kann auf den konfigurierten Wunschport ändern. Ein schönes Gefrickel...
    Ab V0.95 ist das nicht mehr nötig, da ComPortMan auch neue Geräte erkennt die nicht korrekt gestartet sind. Hier wird dann der Port entsprechend der Konfiguration geändert und das Gerät neu gestartet.



















    COM Port Info Tool



    Das Tool "COM Port Info", kurz ComPortInfo zeigt Informationen über COM-Ports, kann Portnummern ändern und tauschen, "Hardware sicher entfernen", Geräte neu starten und USB-Ports resetten (Windows XP, 8, 10 und 11).


    Anzeige-Modi

    Es gibt zwei Tabs mit den Anzeige-Modi "COM Ports" und "BusTypes": Unter "COM Ports" werden die Ports nach Nummer sortiert angezeigt, unabhängig vom BusType. Unter "BusTypes" werden die Ports in einem vereinfachten Gerätebaum wie im Gerätemanager angezeigt. Ports an einem gemeinsamen übergeordneten Gerät werden nach USB-Port sortiert (bei einem COM-Port pro USB-Port), sonstige nach Geräte-ID.

    Funktionen

    Ein Rechtsklick auf ein Gerät öffnet ein Kontextmenü. Hier werden "Safely remove" (Hardware sicher entfernen), "Restart device" (Geräte-Neustart), "Restart USB Port" (USB-Port zurücksetzen, nur bei USB-Geräten) und "Device properties" (Geräte-Eigenschaften des Geräte-Managers) angeboten. Bei COM-Ports kann zudem die Portnummer geändert oder mit einem anderen Port getauscht werden.

    Geräte-Neustart, USB-Port-Reset und das Ändern der Port-Nummer sind nur verfügbar wenn ComPortInfo mit Administrator-Rechten gestartet wurde.


    Falls der ComPortMan-Dienst läuft, analysiert ComPortInfo die ComPortMan.ini und zeigt am Ende des ersten Abschnitts die für einen Port zuständigen INI-Abschnitte.


    Optionen

    Autorefresh
    Wenn aktiviert wird die Anzeige beim Anschließen und Entfernen von Ports automatisch aktualisiert, sonst muss man dafür F5 drücken

    Show Port Parameters (GetCommState und GetCommTimeouts)

    Wenn aktiviert werden die Parameter des Ports angezeigt, so wie das letzte Programm, welches den Port benutzt hat, sie hinterlassen hat.
    Wenn hier ein Fehler ERROR_BUSY, ERROR_SHARING_VIOLATION oder ERROR_ACCESS_DENIED angezeigt wird, ist der Port von einem anderen Programm geöffnet, ComPortInfo versucht zu zeigen von welchem.

    Show default Port Parameters (GetDefaultCommConfig)

    Wenn aktiviert werden die Default-Parameter des Ports angezeigt, so wie im Geräte-Manager eingestellt. Da diese von kaum einer Anwendung abgefragt und genutzt werden, sind sie kaum relevant.

    Show Port Properties (GetCommProperties)
    Wenn aktiviert werden die Eigenschalften des Ports angezeigt, u.a. welche Datenraten und Signale unterstützt werden.


    Show ComPortMan Criteria
    Wenn aktiviert werden für die Ports Kriterien angezeigt, die sich so in der Konfiguration von ComPortMan nutzen lassen

    Font
    Erlaubt, die Schriftart für den Text im rechten Bereich einzustellen

    Background Color
    Erlaubt, die Hintergrundfarbe für den Text im rechten Bereich einzustellen

    Highlighting
    Erlaubt, die Farben und die Dauer der farblichen Hervorhebung von neu angeschlossenen und gerade entfernten Geräten einzustellen.

    Windows Theme
    Aktiviert oder deaktiviert die Nutzung des mit Windows XP eingeführten "Windows Designs". Unter Windows 10 sieht das so doof aus, dass hier zum Abschalten rate - man sieht dann bei Scrollbalken wieder was Schieber und was Hintergrund ist...

    Allow only one Instance
    Erlaubt nur eine Instanz der selben ComPortMan.exe, falls nochmal gestartet wird das vorherige Fenster aktiviert.

    Always on top
    Hält das Fenster über allen anderen die nicht nicht auch "topmost" sind.







    History



    V1.1.9 (21. Aug 2023)
  • Bugfix: Variable %ComPortNumber% war meist leer
  • Bugfix: OnArrival hat nicht funktioniert wenn ComPortMan beim Systemstart die Benachrichtigung zum Nutzer-Login verpasst

    V1.1.8 (21. Mai 2022)
  • Neu: Balloon-Tips und ComPortInfo sehen bei Anzeigeskalierung > 100% besser aus

    V1.1.7 (13. Nov 2022)
  • Bugfix: Errorlevel bei -install/-register/-uninstall/-deregister war immer 1
  • Neu: Die MSIs legen einen Eintrag in "Programme und Features" an

    V1.1.6 (13. Juni 2022)
  • Bugfix: Einstellung RemoveDosDeviceNameOnStartup=1 funktioniert jetzt
  • Neu: Kriterien Address und ParentAddress für USB-Verbundgeräte mit mehreren COM-Ports

    V1.1.5 (25. Mai 2022)
  • Bugfix: Einige Fehler beim "Quick-and-dirty Mode" behoben
  • Bugfix: ComPortInfo sortiert neue Ports zuverlässiger ein

    V1.1.4 (01. April 2022)
  • Bugfix: Balloontips haben bei Bluetooh-Adaptern mit mehreren COM-Ports nicht immer alle angezeigt
  • Neu: ComPortInfo kann die RTS/DTR-Leitungen von RS.232-Ports zwecks Identifikation blinken lassen

    V1.1.3 (07 November 2021)
  • Neu: Balloontips mit runden Ecken unter Windows 11

    V1.1.2 (11 July 2021)
  • Neu: RemovePortDeviceOnRemoval und RemoveUsbDeviceOnRemoval haben jetzt eine 30s Verzögerung um Konflikte mit Geräten zu vermeiden die bei der Treiber-Installation kurzzeitig verschwinden

    V1.1.1 (30. Mai 2021)
  • Neu: ComPortMan kann einen COM-Namen löschen wenn er nach dem Ändern eines Portnamens nicht von selbst verschwindet (manchmal nötig bei VirtualPCs virtuellen COM-Ports)

    V1.1.0 (24. Mai 2021)
  • Bugfix: Crash ComPortMan V1.0.8 bei Nutzung von ComNameArbiterClean
  • Neu: ComPortMans BallonTips und ComPortInfo unterstützen Windows 10 Anzeigeskalierung > 100%

    V1.0.8 (06. April 2021)
  • Neu: Kriterium Geräte-Klasse
  • Neu: ComPortMan und ComPortInfo sortieren Ports von Mehrfach-Adaptern nach Location und DeviceID, das korrospondiert besser mit der tatsächlichen Portbelegung

    V1.0.7 (10. Februar 2021)
  • Bugfix: ComNameArbiterClean hat seit V0.9.8 nicht richtig funktioniert

    V1.0.6 (08. Februar 2021)
  • Neu: Variable %ComPortNumber% die z.B. für COM9 zu 9 aufgelöst wird, um z.B. TeraTerm mit der COM-Port-Nummer als Parameter zu starten

    V1.0.5 (03. Januar 2021)
  • Neu: COM-Port Registry-Werte unter HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM werden nach Neustart eines Ports geprüft und korrigiert; Eigentlich macht das der Treiber des Geräts aber offenbar nicht immer. HKLM\HARDWARE\DEVICEMAP\SERIALCOMM ist ein Relikt aus Zeiten vor Plug & Play, also Windows NT 3.1 bis 4.0. Da aber (kaum zu glauben) das .NET Framework dort nach verfügbaren COM-Ports schaut, bleibt das jetzt für immer wichtig...
  • Neu: Kriterium LocationPath

    V1.0.4 (21. September 2020)
  • Bugfix: ComPortMan und ComPortInfo V1.0.3 haben mit manchen Modems nicht funktioniert

    V1.0.3 (21. September 2020)
  • Neu: ComPortMan kann Port-Nummern zuordenen falls der Registry-Wert "PortName" leer ist
  • Bugfix: Kleinigkeiten in ComPortInfo

    V1.0.0 (03. September 2020)
  • Neu: ComPortMan kann wenn nötig Port-Nummern tauschen
  • Bugfix: Abstürze ComPortInfo

    V0.9.9 (26. Juli 2020)
  • Neu: USB-Geräte werden jetzt mittels Reset des USB-Ports neu gestartet statt über den Windows Geräte-Manager (nur XP, Windows 8, 10 und 11) - geht schneller
  • Neu: "COM Port Info" mit farblicher Hervorhebung von gerade angeschlossenen und entfernten Geräten
  • Bugfix: Portzuordnung hat in V0.9.8 bei erneutem Anschließen u.U. nicht funktioniert
  • Bugfix: Ballontips haben auf manchem Windows 7 nicht funktioniert

    V0.9.8 (20. Mai 2020)
  • Neu: Programm beim Anschließen und Entfernen eines COM-Port-Gerätes ausführen
  • Neu: Balloontips im Windows 10 Stil
  • Neu: "COM Port Info" ändert COM-Port-Nummer deutlich schneller
  • Neu: "COM Port Info" zeigt mehr Infos zu COM-Ports
  • Neu: "COM Port Info" zeigt offene Handles auf COM-Ports

    V0.9.7 (12. September 2017)
  • Bugfix: QuickAndDirty=1 wurde in V0.9.6 ignoriert

    V0.9.6 (07. Februar 2017)
  • Neu: Kriterien Location und ParentLocation
  • Bugfix: In ComPortInfo hat das Generieren eines vollständigen Reports nicht funktioniert

    V0.9.5 (11. Dezember 2016)
  • Neu: _install.cmd und _uninstall.cmd in das umbenannt was sie wirklich tun: _service_register.cmd und _service_deregister.cmd; _start.cmd und stop.cmd wurden umbenannt in _service_start.cmd und _service_stop.cmd damit sie ins Namensschema passen 
  • Neu: ComPortMan erkennt auch COM-Port-Geräte die nicht starten, z.B. weil ihr Port bereits belegt ist. Um dies zu vermeiden hat ComPortMan bisher beim Entfernen auf COM200 aufwärts geändert, damit sie beim nächsten Anschließen mit Sicherheit starten und dann geändert werden können. Das ist jetzt nicht mehr nötig.
  • Neu: Wenn im Quick&Dirty-Modus ein geänderter Port entfernt wird, wird dessen Treiber versuchen den ursprünglichen Port zu löschen. Falls dieser Port inzwischen durch ein anderes Gerät benutzt wird, bemerkt ComPortMan das Löschen und stellt den Portnamen wieder her.
  • Neu: Kommandozeilen-Tool ListComPorts durch GUI-Tool ComPortInfo ersetzt

    V0.9.4 (13. July 2015)
  • Bugfix: Bei -install und -uninstall hat ComPortMan V0.9.3 nichts gemacht, nur die Hilfe geöffnet

    V0.9.3 (17. Mai 2015)
  • Bugfix: ComNameArbiterClean hat nicht richtig funktioniert
  • Bugfix: FriendlyNames wurden nicht immer korrigiert
  • Neu: BalloonTips beim Entfernen

    V0.9.2 (10. Mai 2015)
  • Neu: FriendlyName wird auch dann überprüft und korrigiert, wenn ComPortMan die Portnummer nicht geändert hat
  • Neu: Portnummen werden im "COM Name Arbiter" Registry-Schlüssel auch dann als belegt markiert, wenn ComPortMan die Portnummer nicht geändert hat
  • Neu: Portnummer-Konfilikte (Windows ordnet eine belegte Portnummer zu) werden auch dann behoben, wenn ComPortMan die Portnummer nicht geändert hat

    V0.9.1 (01. Oktober 2014)
  • Neu: COM-Ports von Geräten der Klasse "Modem" werden behandelt

    V0.9.0 (18. Februar 2014)
  • Bugfix: Für USB-Geräte die an USB3-Controller angeschlossen sind wurde der Portname nicht korrekt ermittelt

    V0.8.9 (18. Februar 2014)
  • Bugfix: Bei Ports mit Geräteinterface GUID_DEVINTERFACE_USB wurde das Entfernen des Gerates nicht verarbeitet
  • Neu: Einstellung RemoveDosDeviceNameOnRemoval

    V0.8.8.3 (17. Februar 2014)
  • Neu: Funktioniert mit Geräten mit Geräteinterface GUID_DEVINTERFACE_SERENUM_BUS_ENUMERATOR und GUID_DEVINTERFACE_USB (bisher nur GUID_DEVINTERFACE_COMPORT)
  • Bugfix: Bestimmung des USB-Ports hat mit Texas Instrumens USB3-Controllern nicht funktioniert

    V0.8.7 (15. Mai 2013)
  • Neu: Nach Entfernen eines COM-Ports kann das Gerät aus dem Gerätemanager entfernt werden, siehe Settings

    V0.8.6 (15. Mai 2013)
  • Bugfix: Wenn ein COM-Port zugeordet wird, ändert ComPortMan jetzt derzeit nicht angeschlossene Geräte die denselben COM-Port konfiguriert haben auf eine Portnummer >200. Mit derselben Portnummer würde das Gerät nicht starten.

    V0.8.5 (04. Juli 2012)
  • Bugfix: -silentstop (wird vom MSI beim Deinstallieren genutzt) war nicht implementiert

    V0.8.4 (03. Juli 2012)
  • Bugfix: -install und -uninstall haben nicht funktioniert

    V0.8.3 (10. Juni 2012)
  • Bugfix: Falscher Balloontip wenn mehrere verschiedene COM-Geräte an denselben USB-Hub angeschlossen sind
  • Änderung: Die erste Stelle im USB-Portnamen wurde geändet um kompatibel mit USBDLM und UsbTreeView zu sein

    V0.8.2 (1. März 2012)
  • Bugfix: COM-Port entfernt wenn alle konfigurierten COM-Ports belegt sind

    V0.8.1 (29. Feb 2012)
  • Bugfix: Erkennung von Multi-Adaptern hat mit manchen Geräten nicht funktioniert
  • Neu: "Quick-and-dirty Modus" ist default, siehe Settings

    V0.8.0 (27. Feb 2012)
  • Neu: Schneller "Quick-and-dirty Modus" verfügbar, siehe Settings
  • Neu: Windows COM-Port Reservierungen können entfernt werden, siehe Settings

    V0.7.0 (22. Feb 2012)
  • Neu: COM-Ports sortiert im Balloontip

    V0.6.1 (17. Feb 2012)
  • Bugfix: Beim USB-Port-Namen fehlte bei manchen Geräten die letzte USB-Portnummer

    V0.6.0 (16. Feb 2012)
  • Bugfix: Fehlerhafte Behandlung von USB Multiport-Adaptern

    V0.5.0 (15. Feb 2012)
  • Neu: COM-Ports abhängig vom USB-Port
  • Neu: Balloontips beim Anschließen eines COM-Ports

    V0.1.0 (25. Jan 2012)
  • Erste veröffentlichte Version





    Software-Lizenz ComPortMan




    Stand 24. März 2017

    1. Gegenstand des Vertrages  
      Gegenstand des Vertrages ist die beiligende Software, die
      Programmbeschreibung und Bedienungsanleitung, sowie sonstiges zugehöriges
      schriftliches Material, im folgenden auch als Software bezeichnet. Der Autor
      macht darauf aufmerksam, dass es nach dem Stand der Technik nicht möglich ist,
      Computersoftware so zu erstellen, dass sie in allen Anwendungen und
      Kombinationen fehlerfrei arbeitet. Gegenstand des Vertrages ist daher nur
      eine Software, die im Sinne der Programmbeschreibung und der
      Benutzungsanleitung grundsätzlich brauchbar ist.

    2. Lizenzgewährung
      Der Autor gewährt jedem interessierten Anwender im privaten Umfeld, öffentlichen
      Bibliotheken deren Nutzung kostenlos ist, sowie Bildungseinrichtungen eine
      kostenlose Nutzungslizenz. Eine Bildungseinrichtung gilt als solche, wenn
      Schüler und Studenten gegenüber sonstigen Mitarbeitern in der Mehrheit sind.
      Es ist dann keine explizite Lizenzerteilung erforderlich.

      Sonstigen Anwendern wird eine Testlizenz für einen Testzeitraum von 30
      Kalendertagen eingeräumt. Nach Ablauf dieser Testlizenz muss der Anwender
      entweder eine Nutzungslizenz pro Computer erwerben oder die Software muss
      von den betreffenden Computern entfernt werden.

      Der Lizenznehmer erhält das nicht ausschließliche, unwiderrufliche,
      übertragbare, zeitlich und räumlich unbeschränkte Recht, die Software auf
      der entsprechenden Anzahl von Computern innerhalb seiner Firma bzw. 
      Organisation einzusetzen.

      Die Nutzungslizenz gilt für alle Versionsnummern der Software jetzt und in
      Zukunft für die entsprechende Anzahl von Lizenzen.
      Der Lizenznehmer hat kein Recht auf Updateversorgung durch den Autor, da
      aktuelle Versionen zum Download stehen.

      Überprüfbarer Beleg für die Lizenz ist die überlassene Lizenznummer. Diese
      wird für den Betrieb der Software nicht benötigt. Die Software hat keine
      eingebauten Beschränkungen und läuft nicht ab.

      Die Software kann frei kopiert und weitergegeben werden, soweit folgende
      Bestimmungen beachtet werden:  Die Software darf nur in den vom Autor
      erstellten MSI- oder ZIP-Archiven weitergegeben werden. Keine Datei darf im
      Inhalt irgendwie verändert werden, außer für internen Gebrauch.

    3. Keine weiteren Rechtsansprüche  
      Der Autor ist sowohl Urheber als auch Eigentümer der Software, sowie in
      dieser Software verwendeter Algorithmen und Verfahren. Der Autor behält den
      Rechts- und Besitzanspruch an der Software.


    4. Keine Modifikationen oder Dekompilierung
      Es ist nicht gestattet, die Software oder Kopien im Ganzen oder teilweise
      zu verändern, zu übersetzen, zu disassemblieren oder zu dekompilieren.

    5. Redistribution
      Redistribution der unveränderten Software-Archivdateien auf CD/DVD von 
      Computer-Zeitschriften und sonstigen Publikationen ist gestattet.
      Zum Download bitte auf https://www.uwe-sieber.de/files/ComPortMan.zip verweisen.

    6. Haftungsausschluß-Erklärung
      Soweit gesetzlich zulässig, haftet der Autor oder der Händler auf keinen Fall
      für irgendwelche Schäden aus entgangenem Gewinn, Betriebsunterbrechung,
      Datenverlust, für Schäden an Hardware oder anderer Schäden gleich welcher Art,
      die aus der Benutzung dieser Software oder aus der Tatsache, dass sie nicht
      benutzt werden kann, resultieren, selbst wenn der Autor oder der Händler auf
      die Möglichkeit solcher Schäden hingewiesen oder unterrichtet wurden. In jedem
      Fall ist die gesamte Haftung seitens des Autors oder des Händlers unter
      jedweder Bestimmung begrenzt auf die Summe, die von Ihnen tatsächlich für
      diese Softwarelizenz bezahlt worden ist. Der Autor haftet nicht für Schäden,
      es sei denn, dass ein Schaden durch Vorsatz seitens des Autors verursacht
      worden ist. Gegenüber Kaufleuten wird auch die Haftung für grobe
      Fahrlässigkeit ausgeschlossen. Eine Haftung wegen evtl. vom Autor
      zugesicherten Eigenschaften bleibt unberührt. Eine Haftung für

      Mangelfolgeschäden, die nicht von der Zusicherung umfasst sind, ist


      ausgeschlossen.


    7. Gewährleistung
      Der Autor übernimmt keine Haftung für die Fehlerfreiheit der Software.
      Insbesondere übernimmt der Autor keine Gewähr dafür, dass die Software den
      Anforderungen und Zwecken des Erwerbers genügt oder mit anderen von ihm
      ausgewählten Programmen zusammenarbeitet. Die Verantwortung für die richtige
      Auswahl und die Folgen der Benutzung der Software, sowie der damit
      beabsichtigten oder erzielten Ergebnisse, trägt der Erwerber. Das gleiche gilt
      für das die Software begleitende schriftliche Material.


    8. Gesetzesanwendung
      Dieser Vertrag unterliegt der Gesetzgebung der Bundesrepublik Deutschland und
      ist so anzuwenden, als ob die betreffenden Rechtsgeschäfte in der
      Bundesrepublik Deutschland stattfänden.


    9. Auflagen
      Der Autor hat das Recht, den Vertrag und die Lizenzrechte sofort zu kündigen,
      falls Sie die Bestimmungen dieses Vertrages nicht erfüllen.