Zum Inhalt springen

Linkerfehler bei StreamClass Treiberprogrammierung


rubycon

Empfohlene Beiträge

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 ?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 ?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...