Wild GIF12

Dieses Kartenlesegerät für GRM10-Speicherkarten (für Leica-Vermessungsgeräte), bzw. die Windows-Software dazu, hat folgende Macken:
  1. Closed source
  2. Benötigt ein echtes Parallelport mit 5-V-Pegeln (3,3 V reichen nicht)
  3. Liest die Parallelport-Adressen vom BIOS-Datenbereich (was bei PCI / PCIexpress nicht klappt, nicht einmal unter Win9x/Me)
  4. Läuft unter Win9x/Me nicht mit LPT3 (Bug, erfordert Patch)
  5. Läuft nicht mit USB2LPT (falls usb2lpt.sys-Treiber älter als Oktober 2013)
  6. Läuft nicht unter 64-Bit-Windows (verlässt sich auf Kernel-Mode-Treiber giveio.sys und mapmem.sys)
Das System ist ja auch schon recht alt. Schätzungsweise 1990. Im folgenden die Ausführungen zur Lösung.
[Foto]
So sieht das Gerät mit High-Speed-USB2LPT aus, und funktioniert so auch unter Windows 7 64bit
Dazu weitere Bilder und Downloads:

5-V-Pegel

Echte Parallelports sowie ein Exemplar einer PCIexpress-Karte hatte tatsächlich 5 V Ausgangspegel. Im Zweifelsfall mit einem Multimeter nachmessen! Einige Ausgänge werden zur Stromversorgung benutzt, auch wenn im Lesegerät eine 9-V-Batterie enthalten ist. (Diese wird bei mir nicht benötigt.)

Die Beobachtung der Pegel mit lptchk funktioniert nicht. Die Ausgangspegel brechen zu stark ein.

Das Problem taucht auch bei USB2LPT 1.7 (High-Speed) auf. Ohne lptchk. Hierfür ist eine gesonderte Lösung praktikabel, siehe unten.

Von Leica kommt jener Vorschlag [sic!] um mit 3,3-V-Laptop-LPTs zurechtzukommen. Kann nicht funktionieren, weil ohne Geräteeingriff am Pin 25 gar keine 9 Volt herauskommen. Auch hier wäre der unten angegebene Bustreiber die bessere und die Batterie schonende Lösung.

Unterstützung von PCI / PCIexpress-Karten

Hier ist dafür zu sorgen, dass die Basisadresse im BIOS-Datenbereich (ab Adresse 0040:0008) steht. Dies kann InpOut32.dll (ab Oktober 2013) erledigen, mit folgender Kommandozeile:
rundll32.exe .\inpout32.dll,Info q
Dieses Kommando muss nach Betriebssystemstart, vor dem Starten von wgif12nt, mit Administratorrechten ausgeführt werden. Es sucht vorhandene Parallelports und trägt deren Basisadresse im BIOS-Datenbereich ein, damit diese von wgif12nt.exe gefunden werden können.

Wie der Name BIOS-Datenbereich andeutet, wird dieser vom BIOS gefüllt und benutzt. Derartige PCI- und PCIexpress-Karten tauchen aber erst beim Windows-Hochlauf auf und sind für das BIOS nicht sichtbar.

Alternativ kann man die Lösung für 64-Bit-Windows benutzen, siehe unten.

Der Vorteil von entsprechend geeigneten ExpressCard-Karten ist, dass diese in Notebooks mit passendem Slot laufen und der Zugriff ohne Geschwindigkeitsverlust einhergeht. ExpressCard basiert auf PCIexpress und ist hier gleichbedeutend.

Ungeeignete ExpressCard-Karten sind USB-basiert und ensprechen solchen USB-Parallel-Adaptern, die nur für Drucker geeignet sind.

LPT3 unter Win9x/Me sowie 64-Bit-Windows

Ein Bug erlaubt hierbei nur LPT1 und LPT2. Dafür ist die EXE-Datei zu patchen. Am einfachsten, wenn man das Programm fpatch.com hat.
fpatch.com -s06668b750883e601 -p+7 -r03 WGif12NT.exe
Sucht nach der angegebenen Bytefolge und ändert das letzte Byte (die Indexmaske) auf 3.

Für 64-Bit-Windows ist noch mehr zu tun, siehe unten.

USB2LPT-Lauffähigkeit

Ich hätte nie gedacht, dass ein Programm auf die Idee kommt, unter NT im BIOS-Datenbereich nach der Portadresse zu suchen. Dieses Programm tut es!

Daher ist USB2LPT.SYS nunmehr (seit Oktober 2013) so erweitert, dass es den Datenbereich auch unter NT entsprechend patcht. Um sicher zu gehen auch im 64-Bit-Windows. Unter 9x/Me tat es der Treiber immer schon.

Ohne weitere Maßnahmen läuft nur der ATmega8-basierte USB2LPT 1.6 Low-Speed. Wegen seiner 5-V-Pegel. Das Auslesen einer 3-KByte-Datei dauert damit ca. 10 Minuten. Unter Windows 2000 oder XP. Unter Windows Vista und 7 noch einiges langsamer. Wegen der verbotenen BULK-Pipes.

Damit USB2LPT 1.7 High-Speed läuft, muss:

Damit sinken die Übertragungszeiten auf akzeptable Werte (etwa 1 Minute für 3 Kilobyte), unabhängig von der Windows-Version. Schneller geht's nicht — es sei denn man hätte den Quelltext von wgif12nt.exe. Ein echtes Parallelport, am Notebook etwa als ExpressCard, ist die bessere Alternative.

Lauffähigkeit unter 64-Bit-Windows

Bei mir kann der Suffix .dll entfallen. Herr Markus Neu hatte bei sich den Suffix zwingend gebraucht, was ich nicht nachvollziehen kann.

Der Vorsatz .\ sorgt dafür, dass InpOut32.dll nicht zuerst im Pfad gesucht wird, sondern nur die Datei im aktuellen Verzeichnis benutzt wird. Sonst würde eine eventuell bereits global installierte ältere InpOut32.dll im %SystemRoot%\SysWOW64-Verzeichnis stören.

Das lässt sich ganz allgemein mit meiner Ausgabe von inpout32.dll (ab Oktober 2013) bewerkstelligen. Und zwar mit dieser Kommandozeile:
rundll32.exe .\InpOut32.dll,CatchIo WGif12NT.exe
Admin-Rechte sind beim erstmaligen Start erforderlich, um den enthaltenen Treiber inpoutx64.sys zu laden. Die Dateien giveio.sys und mapmem.sys kann man getrost löschen, da sie unter 64-Bit-Windows schlichtweg unbrauchbar sind.

Im Falle von PCI/PCIexpress-Karten wird das Aktualisieren des BIOS-Datenbereiches nicht benötigt. Damit LPT3 funktioniert, ist ein Patch (siehe oben) vonnöten. Im übrigen funktioniert diese Lösung auch unter 32-Bit-Windows, ohne Aktualisierung des BIOS-Datenbereiches.

USB2LPT funktioniert damit auch. Allerdings benötigt sein Treiber (zurzeit) den deaktivierten Treiberzertifizierungszwang. Dazu ist bei jedem Booten von Windows Vista oder 7 F8 zu drücken und der entsprechende Menüpunkt auszuwählen. Bei Windows 8 sowie 8.1 ist das Prozedere noch komplizierter. Zwar funktioniert USB2LPT inzwischen auch ohne Treiber, ist dann aber viel langsamer.

Zunächst funktionierte die Lösung nicht, weil der Zugriff auf den BIOS-Datenbereich bei vorgegaukeltem Windows 9x Schutzverletzungen (Exceptions) hervorbrachte. Die aktuelle Version von inpout32.dll verarbeitet jede Art von Ladebefehl aus dem BIOS-Bereich. Dazu ist ein entsprechender X86-Befehlsdekoder eingebaut.

Neu: Es steht ein 64-bittriges giveio.sys zur Verfügung, mit dem Portzugriffe aus dem User-Mode ohne Zeitverzug durch das Exception-Handling möglich sind. Er erweist sich als funktionssicher und ist sogar zertifiziert. Diese Variante ist nunmehr zu bevorzugen.

Disassemblierung der DOS-Software

Das Verständnis der Datenübertragung und des Speicherformates ist die einzige Chance, das Gerät wirklich und dauerhaft in die Zukunft zu retten. Alles andere (auch USB2LPT) ist auf Dauer nur ein Herumstümpern. Auf 16 KByte kann ja nicht so viel sein, und das DOS-Programm ist nicht allzu kompliziert. Natürlich ist die Echse mit einem Exe-Packer bearbeitet worden, aber das ist ja für den Durchschnittshacker kaum ein Problem. Die Disassemblierung der wesentlichen Bestandteile muss folgende Teile offenlegen: Den übrigen Ramsch mit dem Fenster-Manager und der Turbo-Pascal-Laufzeitbibliothek muss man der Komplexität wegen ignorieren; die Schwierigkeit besteht dabei, genau die wichtigen von den unwichtigen Routinen zu trennen. Die Segmentierung (Pascal-Units) hilft dabei. Erwartungsgemäß ist das Programm mit heißer Nadel gestrickt worden und fürchterlich strukturiert (auch das erkennt man am Disassembler).

Die Datenkompression erfolgt anscheinend nach diesem Schema:

Datenkompression/Expansion
Das Dateisystem besteht aus einem 256-Byte-Wurzelverzeichnis mit 13 für den Anwender nutzbaren nummerierten „Slots“ (keine Dateinamen) mit festlegbarer Maximalgröße in KByte-Schritten. (Wer die ganzen KByte aufbürdet ist unklar, möglicherweise benötigt das Vermessungsgerät diese Stückelung.) Die Dateien sind nach derzeitigem Erkenntnisstand immer in 8-Byte-Stückelung.

Hier noch mal das IDA5-Projekt der DOS-Software.

Ein richtiger USB-Adapter?

Ein bestens konstruierter USB-Adapter sollte ohne speziell zugeschnittene Anwendersoftware auskommen. Damit kann man auf die Daten unabhängig vom Betriebssystem zugreifen. Die Mikrocontroller-Software fällt dafür komplexer aus. Dafür gibt es zwei Implementierungsmöglichkeiten: Beide Ansätze erfordern eine Hintertür zur Speicherplatzreservierung. Die Unterstützung diverser Schutzattribute ist nicht möglich und ohnehin obsolet.


Das Musterexemplar wurde dankenswerterweise vom Vermessungsbüro Glaubitz zur Verfügung gestellt.