Interface fuer Catweasel Treiber Diese Kurzbeschreibung der Treiberschnittstelle ist geschrieben unter der Annahme, dass der Leser sich mit der Treiberprogrammierung von Windows (etwas) auskennt. Der Treiber ist ein Treiber nach dem 'windows-driver-model', WDM. Es ist ein storage device driver. Er versteht die notwendigen Kommandos fuer ein storage driver noetig fuer ein removeable media device. Zum Lesen und Schreiben mit Treiber Direktzugriff (aus einer anderen Kernel-mode Komponente heraus) koennen einfach die normalen IRPs gemaess dem Windows device driver kit (Windows DDK) gesendet werden. Beim Senden von IOcontrol und PnP IRPs ist zu beachten, dass einige von ihnen ueber die IRP Warteschlange des Arbeitsthreads des Treibers laufen und daher recht lange blockieren koennen. Um den Direktzugriff auf das Geraet auch aus dem user-space zu erlauben, erkennt der Treiber zusaetzlich zu den normalen read und write IRPs auch zwei spezielle, nicht-standard IRPs innerhalb der IOcontrol IRPs zum Lesen und Schreiben. Ist auf den Treiber keine filesystem aufgesetzt, kann man vom user space keinen offset mit SetFilePointer() angeben, die Funktion schlaegt mit 'invalid handle' fehl. Die zwei IRPs sind int der Tabelle der IOcontrol IRPs beschrieben. Mehrere Laufwerke? Der Treiber installiert ein paar mehr logische Laufwerke als vorhanden, diese erscheinen im Hardware-manager als einzelne Laufwerke. Dies kommt daher, dass fuer jedes unterstuetzte Format und reales Laufwerk ein logisches eingebunden wird. Als Namen erhalten die Laufwerke einen Bezeichner, der aus der Nummer und dem unterstuetzten Format (index davon) erstellt wird. Der Name fuer Laufwerk Eins, format Null sieht dann so aus: 'CAT1_F0'. Zum Oeffnen aus dem userspace muss wie immer noch der string '\\.\' davorhehaengt werden. Laufwerke am Controller koennen die Namen CAT1 und CAT2 haben, zuzueglich der Formatkennung. Sind mehrere Contoller installiert, sind auch Namen mit CAT3 und hoehere moeglich. Zur Erkennung des Geraetes einfach in einer Schleife die Namen CAT1_F0 bis CAT2_F0, eventuell auch bis CAT8_F0 durchprobieren. Format Null ist das Format Amiga-DD und wird immer unterstuetzt. Formate: Folgende Format sind zur Zeit unterstuetzt (3.5" Floppy): #0 Amiga-DD 880kb 80 Cyls 512 byt/sector #1 Amiga-HD 1760kb 80 Cyls 512 byt/sector Header Datei Die header Datei zum Benutzen des Treibers ist die Datei 'drvshell.h'. IOcontrol IRPs (DeviceIoControl()) Diese Kommandos vom Kernelspace als IRP_MJ_DEVICE_CONTROL IRPs senden oder vom Userspace mit DeviceIoControl(). CW_GET_VERSION Liest Version als string CW_CYLPOS_NOTIFY Aktiviert seek-Benachrichtigung. Nicht fertig implementiert. Fuer Cyl Anzeiger. CW_READ_SECS Nicht-standard Lese Routine. input zwei longs, length und offset, output data. CW_WRITE_SECS Nicht-standard Schreib Routine. input zwei longs, length und offset, danach data. CW_READ_MFM Liest MFM-Rohdaten. input ein long, track. CW_WRITE_MFM Schreibt MFM-Rohdaten. input in long, track, danach Datenpuffer. CW_GET_MEMORY Liest den Speicherinhalt des contollers (128kb) CW_GET_DEBUGTEXT Debug. Wenn reinkompiliert, liest die function-call Historie. CW_SEEK faehrt die floppy an angegebene spur. (input Data 1 byte cylindernummer) CW_GET_DEBUGBUFFER Liest einen Puffer mit debug Information CW_GET_DEBUG_VARS Liest einige Statusvariablen als Text (mit mehreren Zeilen) CW_CALIBRATE Startet Kalibrier-Messung (loescht ein paar Tracks!) und liefert Textpuffer mit Ergebnis.