Hallo,
ich habe ein USB Gerät gebaut, welches ich als "USB zu MIDI" Gerät für die Steuerung von z.B. Synthesizern verwenden will.
Leider unterstützt der Windows Treiber "usbaudio.sys" erst ab WinXP MIDI Funktionen - unter Win2000SP4 stürzt der Rechner während der Enumeration ab, obwohl ich mich an die "USB Device Class Definition for MIDI Devices" gehalten habe.
Da ich auch ältere Systeme unterstützen möchte ( Win98/Me/2000 ), benötige ich einen eigenen Treiber - diese Thematik ist mir aber noch völlig fremd. Allerdings fand ich heraus, daß für diese Aufgabe ein Treiber im Kernelmodus unnötig ist, welcher ja sowieso nur mit C++ zu programmieren ist.
Jetzt zu meiner eigentlichen Frage:
Ist es möglich, mit PB einen DLL Usermode Treiber zu programmieren, welcher über die API Funktionen ein virtuelles MIDI Gerät im System erzeugt und einbindet, die Daten vom USB Host abholt und sie an das erzeugte MIDI Gerät weiterleitet, so das jede MIDI Software über die API MIDI Funktionen diese Daten als normale MIDI Daten nutzen kann?
Und wenn ja, welche API Funktionen können dieses virtuelle MIDI erzeugen und einbinden ?
Vielen Dank im voraus
Holger
USB Treiberprogrammierung im User Mode ?
Mit der USB Firmware und MIDI gibts keine Probleme - da kenne ich mich sehr gut aus.
Unter WinXP funktioniert über usbaudio.sys mein USB Gerät und wird als MIDI erkannt.
Bei der Firmware gibts keine Probleme, denn auch unter Win2000 habe ich es als HID enumeriert und die Datenübertragung funktioniert.
Das Problem liegt darin, daß laut Microsoft erst ab WinXP der usbaudio.sys MIDI Funktionen bereitstellt - aber das noch nicht mal komplett ( nur MIDI Jacks aber keine MIDI Elements ). Erst Vista unterstützt es vollständig.
Ich möchte aber, daß auch unter Win98/Me/2000 mein USB Gerät als MIDI Device erkannt wird - und dafür brauche ich einen eigenen Treiber.
Unter WinXP funktioniert über usbaudio.sys mein USB Gerät und wird als MIDI erkannt.
Bei der Firmware gibts keine Probleme, denn auch unter Win2000 habe ich es als HID enumeriert und die Datenübertragung funktioniert.
Das Problem liegt darin, daß laut Microsoft erst ab WinXP der usbaudio.sys MIDI Funktionen bereitstellt - aber das noch nicht mal komplett ( nur MIDI Jacks aber keine MIDI Elements ). Erst Vista unterstützt es vollständig.
Ich möchte aber, daß auch unter Win98/Me/2000 mein USB Gerät als MIDI Device erkannt wird - und dafür brauche ich einen eigenen Treiber.
Funktioniert es eventuell mit den "Device Managment Functions" ?
http://msdn.microsoft.com/en-us/library ... S.85).aspx
Bis auf die MIDI und HID Funktionen habe ich fast noch keine API Erfahrungen ...
http://msdn.microsoft.com/en-us/library ... S.85).aspx
Bis auf die MIDI und HID Funktionen habe ich fast noch keine API Erfahrungen ...
Hm, du wirst dich wohl oder übel erstmal hier durcharbeiten müssen für die Treibergeschichte. Ein Usermode-Treiber sollte mit PB machbar sein. Einen Kernelmode-Treiber kann man mit jedem Compiler machen, der API unabhängigen Code generiert. Also nicht nur C++ aber PB scheided leider aus.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.
Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke!
Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke!

Das DDK scheint nur den Kernelmodus zu erklären und wenn es nicht anders funktioniert, werde ich C++ lernen müssen.
Aber da ich schon leichte Erfahrungen in PB habe und Windows schon auf Kernel Ebene USB- und WDMAudio Treiber hat, würde ich es bevorzugen, in PB und mit den API Funktionen zu programmieren.
Weiß vielleicht jemand einen guten Einstieg in die Usermode Programmierung ?
Aber da ich schon leichte Erfahrungen in PB habe und Windows schon auf Kernel Ebene USB- und WDMAudio Treiber hat, würde ich es bevorzugen, in PB und mit den API Funktionen zu programmieren.
Weiß vielleicht jemand einen guten Einstieg in die Usermode Programmierung ?
Ich glaube das ist was du suchst. Angeblich soll ein Beispieltreiber im DDK enthalten sein.
Hm scheint so als wäre das über einen Usermode Treiber nicht machbar. Ich frag mich grad obs unter Windows überhaupt Usermode Treiber gibt?
Edit: Interessanter Auszug aus dem Artikel:
Hm scheint so als wäre das über einen Usermode Treiber nicht machbar. Ich frag mich grad obs unter Windows überhaupt Usermode Treiber gibt?
Edit: Interessanter Auszug aus dem Artikel:
Könnte sich also lohnen mal beim Mainboard- bzw USB-Controller Hersteller nachzufragen.Einige Fremdanbieter stellen generische USB-Treiber zur Verfügung, die mithilfe von Datendateien anpasst werden können, ohne dass dabei eine Programmierung im Kernel-Modus erforderlich ist. Einige Unternehmen bieten für den Zugriff auf ihre Treiber von OLE-Automatisierungsclients, beispielsweise Microsoft Visual Basic, auch ActiveX-Komponenten (z. B. OCX) an.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.
Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke!
Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke!

Soweit ich weiß, ist auf Kernelebene der Driver Stack so augebaut, daß nach dem Hardware Bus Treiber ein Miniport- gefolgt von einem Miniclass Treiber aufsetzt - der Abschluß auf Kernelebene ist der Kernelmode Treiber, welcher durch die API Funktionen angesprochen werden kann.
Sowohl für USB-als auch für Audio Devices stellt Windows alle diese Treiber zur Verfügung - für Audio heißt er wdmaudio.drv und scheint eine DLL zu sein. Weiterhin gibt es die ksuser.dll, welche für den Datenaustausch zwischen der User- und der Systemperipherie zuständig ist.
Wäre es also nicht möglich, die USB Daten vom Host abzufragen, ein internes MIDI einzurichten und die Daten auf dieses MIDI umzuleiten -und das alles nur mit API Funktionen ?
Die API Funktion "DeviceIoControl" scheint in diesem Zusammenhang sehr interessant zu sein ...
Sowohl für USB-als auch für Audio Devices stellt Windows alle diese Treiber zur Verfügung - für Audio heißt er wdmaudio.drv und scheint eine DLL zu sein. Weiterhin gibt es die ksuser.dll, welche für den Datenaustausch zwischen der User- und der Systemperipherie zuständig ist.
Wäre es also nicht möglich, die USB Daten vom Host abzufragen, ein internes MIDI einzurichten und die Daten auf dieses MIDI umzuleiten -und das alles nur mit API Funktionen ?
Die API Funktion "DeviceIoControl" scheint in diesem Zusammenhang sehr interessant zu sein ...