rubycon Geschrieben 17. August 2008 Teilen Geschrieben 17. August 2008 Hallo, als ich anhand eines Beispiels in der DDK die Treiberprogrammierung erlernen wollte, trat bei mir ein Linkerfehler auf und ich weiß beim besten Willen nicht, wo der Fehler liegt. Das Beispiel ist der Sourcecode der Sony 1394DCam, welcher im DDK bei wdm/videocap zu finden ist. Dort wird in der DriverEntry Routine eine HW_INITIALIZATION_DATA Struktur initalisiert und danach mit "StreamClassRegisterMinidriver()" der MiniTreiber registriert - die strmini.h habe ich eingebunden. Der letzte Parameter von "StreamClassRegisterMinidriver()" ist ein Zeiger, welcher auf die HW_INITIALIZATION_DATA Struktur zeigt, die ich (wie im Beispiel ) "HwInitData" nannte. Der komplette Befehl lautet bei mir also: return StreamClassRegisterMinidriver(DriverObject,RegistryPath,&HwInitData); Leider gibt Visual C++ 6.0 einen Fehler heraus: DriverEntry.obj : error LNK2001: unresolved external symbol "long __stdcall StreamClassRegisterAdapter(void *,void *,struct _HW_INITIALIZATION_DATA *)" (?StreamClassRegisterAdapter@@YGJPAX0PAU_HW_INITIALIZATION_DATA@@@Z) Kann mir da freundlicherweise jemand weiterhelfen ? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Mephisto81 Geschrieben 17. August 2008 Teilen Geschrieben 17. August 2008 Hallo, Leider gibt Visual C++ 6.0 einen Fehler heraus ich nehme an, dass du "Visual C++ 6" so angepasst hast, dass es den Compiler des entsprechenden DDKs (in neueren Versionen "WDK") inklusive der dazugehörigen Libraries verwendet? Welche Version des DDK bzw WDK verwendest du? mep Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
rubycon Geschrieben 17. August 2008 Autor Teilen Geschrieben 17. August 2008 Ich benutze DDK 2600 und Windows2000SP4. In den Settings habe ich als Lib Path sowohl w2k als auch wxp versucht - die strmini.h habe ich eingebunden und in den Lib Ordnern von w2k/wxp ist auch die stream.lib vorhanden - müßte also eigentlich funktionieren. Wenn ich das 1394dcam Beispiel mit dem DDK "builde", wird der Treiber ohne Fehler erstellt. Hier mein vereinfachter Sourcecode: #include "strmini.h" #pragma code_seg("Init") extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath) { HW_INITIALIZATION_DATA HwInitData; // HwInitializationData Struktur leeren RtlZeroMemory(&HwInitData,sizeof(HW_INITIALIZATION_DATA)); // HwInitializationData Struktur initialisieren HwInitData.HwInitializationDataSize = sizeof(HW_INITIALIZATION_DATA); // Hier wird sonst die komplette Struktur initalisiert NTSTATUS ntStatus=0; ntStatus = StreamClassRegisterMinidriver(DriverObject,RegistryPath,&HwInitData); return ntStatus; } // DriverEntry Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Mephisto81 Geschrieben 17. August 2008 Teilen Geschrieben 17. August 2008 hallo, müßte also eigentlich funktionieren. leider nein. Das DDK verwendet eine komplett andere Umgebung und Bibliotheken als Visual Studio. Es reicht nicht, die Projekteinstellungen zu editieren (zumindest liest man das überall). Im Internet findet man einige Tutorials die die Verwendung des DDK mit Visual Studio und die notwendigen Einstellungen erläutern, aber soweit ich das gelesen habe, funktioniert das nicht immer einwandfrei (ich selber habe deswegen davon abgesehen). Mein persönlicher Tipp: Benutze einen Editor, schreibe Makefiles und benutze das Build-System des DDKs - dieser Weg hat bei mir immer einwandfrei funktioniert. Viel Erfolg. mep Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
rubycon Geschrieben 17. August 2008 Autor Teilen Geschrieben 17. August 2008 Vielen dank für die Antwort, allerdings befürchte ich, daß es für mich als noch einige Zeit dauern wird, mir diese Methode anzueignen, da ich aus dem Mikroprozessorhardware/Assembler Bereich komme und mit Hochsprachen sowieso einige Verständnisprobleme habe. Ich werde es erstmal mit Visual Studio 2005 und der WDK 2008 ausprobieren und wenn es damit nicht klappt, dann muß ich eben in den sauren Apfel beißen und es mit einem normalen Editor probieren. Ist aber der Aufbau des Sourcecodes prinzipiell richtig ? Eine weitere Sache, welche ich noch nicht verstehe ist, daß die Struktur "HW_INITIALIZATION_DATA" in der strmini.h bereits mit einem Variablenbezeichner deklariert wurde,welcher auch "HW_INITIALIZATION_DATA" heißt. Wenn man dann auf ein Strukturelement zugreifen möchte, müßte es doch mit HW_INITIALIZATION_DATA.HwInitializationDataSize = sizeof(HW_INITIALIZATION_DATA); funktionieren oder mache ich da einen Denkfehler ? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Bubble Geschrieben 17. August 2008 Teilen Geschrieben 17. August 2008 da ich aus dem Mikroprozessorhardware/Assembler Bereich komme und mit Hochsprachen sowieso einige Verständnisprobleme habe. Was hast Du denn vorher im Mikroprozessorbereich gemacht? Ich möchte Dich nicht entmutigen. Treiberprogrammierung ist jedoch recht anspruchsvoll, da fehlerhafte Treiber leicht das gesamte System zum Absturz bringen können. Man sollte daher die Dokumentation relevanter Schnitstellen genau lesen und wirklich wissen, was man tut. Wenn Du noch keine Erfahrung mit C hast, dann solltest Du evtl. damit beginnen, Programme für den User-Space zu schreiben, und nicht gleich mit Treibern anzufangen. Was für einen Treiber möchtest Du denn überhaupt entwickeln? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
rubycon Geschrieben 18. August 2008 Autor Teilen Geschrieben 18. August 2008 Im Mikroprozessorbereich bin ich grade dabei, ein Betriebssystem für einen Synthesizer vom älteren Zilog Z180 auf den neuen ZNEO umzuschreiben - mit dem alten Z80 habe ich vor ca. 8 Jahren meinen ersten privaten "Heimcomputer" gebaut und ein kleines OS programmiert - hat als Hobby angefangen. Nun habe ich für den Synthesizer neben MIDI auch eine USB Schnittstelle eingebaut und eine Firmware geschrieben, welche mit dem MS StreamMiniClass Treiber "usbaudio.sys" ab WinXP auch einwandfrei funktioniert ("MIDIoverUSB"). Leider unterstützt dieser Treiber MIDI nur unter WinME,WinXP und Vista - unter Win98,Win98SE und Win2000 wird MIDI nicht unterstützt. Und da ich sowieso einige MIDI Spezialfunktionen (z.B. Routing) einbauen möchte, beschäftige ich mich mit Treiberprogrammierung. Über den portcls.sys habe ich es mit einem MiniTreiber schon geschafft, eine PCI Experimentierplatine anzusprechen, allerdings unterstützen PortClass Audiotreiber nur interne Busse wie ISA oder PCI - mit USB funktioniert da nichts, weshalb ich nur über einen StreamMiniClass Treiber gehen kann und der sollte ab Win98 alle Systeme unterstützen. Mir ist schon bewußt, daß die StreamClass wesentlich schwieriger als die PortClass ist. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
rubycon Geschrieben 18. August 2008 Autor Teilen Geschrieben 18. August 2008 Hat sich als ein typischer Anfängerfehler herausgestellt. StreamClassRegisterMinidriver( IN PVOID DriverObject, IN PVOID RegistryPath, IN PHW_INITIALIZATION_DATA &HwInitData ); Während die "normale" DriverEntry Routine so aussieht: NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ); ist die DriverEntry Routine für einen StreamClass Minitreiber anders definiert - so gilt es ab Win2000: ULONG DriverEntry( IN PVOID DriverObject, IN PVOID RegistryPath ); Natürlich stimmt IN PDRIVER_OBJECT und IN PUNICODE_STRING nicht mit IN PVOID überein, weshalb die Übergabe der beiden Zeiger fehlschlägt. Nun klappt alles bis zu diesem Punkt wunderbar - im Syser Debugger wird angezeigt, daß ein STATUS_SUCCESS zurückgegeben wird und damit der MiniTreiber erfolgreich registriert wurde. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Bubble Geschrieben 19. August 2008 Teilen Geschrieben 19. August 2008 Schön, dass Du es hinbekommen hast. Wenn Der Treiber ohnehin nur für Dich ist, dann kannst Du eh lockerer rangehen, als wenn der Treiber weiter verbreitet werden sollte. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.