Verwalten von Pufferzugriffsmethoden in UMDF-Treibern

Wenn Sie einen UMDF-Treiber schreiben, können Sie Einstellungen für die Pufferzugriffsmethode angeben, die das Framework für Lese- und Schreibanforderungen sowie Geräte-E/A-Steuerungsanforderungen verwendet. Die Werte, die ein UMDF-Treiber bereitstellt, sind nur Einstellungen und sind nicht garantiert, dass sie vom Framework verwendet werden.

Angeben einer bevorzugten Pufferzugriffsmethode

Ab UMDF Version 2.0 ruft ein UMDF-Treiber WdfDeviceInitSetIoTypeEx auf, um bevorzugte Zugriffsmethoden für Lese-/Schreibanforderungen und für Geräte-E/A-Steuerungsanforderungen zu registrieren.

Wenn der Treiber WdfDeviceInitSetIoTypeEx nicht aufruft, verwendet UMDF die gepufferte Methode für E/A-Anforderungen an dieses Gerät.

Das Framework verwendet die folgenden Regeln, um zu bestimmen, welche Zugriffsmethode verwendet werden soll:

  • Alle UMDF-Treiber in einem Treiberstapel müssen dieselbe Methode für den Zugriff auf die Puffer eines Geräts verwenden, und das Framework bevorzugt gepufferte E/A-Vorgänge.

    Wenn UMDF feststellt, dass einige Treiber entweder gepufferte E/A oder direkte E/A für ein Gerät bevorzugen, während andere Treiber nur gepufferte E/A für das Gerät bevorzugen, verwendet UMDF gepufferte E/A für alle Treiber. Wenn einer oder mehrere Treiber eines Stapels nur gepufferte E/A-Vorgänge bevorzugen, während andere nur direkte E/A bevorzugen, protokolliert UMDF ein Ereignis im Systemereignisprotokoll und startet den Treiberstapel nicht.

    Ihr Treiber kann WdfDeviceGetDeviceStackIoType aufrufen, um die Pufferzugriffsmethoden zu ermitteln, die UMDF den Lese-/Schreibanforderungen und E/A-Steuerelementanforderungen eines Geräts zugewiesen hat.

  • In einigen Fällen weist UMDF einem Gerät direkte E/A zu, verwendet jedoch für eine oder mehrere Anforderungen des Geräts gepufferte E/A-Vorgänge, um eine optimale Leistung zu erzielen. Beispielsweise verwendet UMDF gepufferte E/A für kleine Puffer, wenn die Daten schneller in den Puffer des Treibers kopiert werden können, als die Puffer für den direkten Zugriff zuordnen kann.

    Optional kann Ihr Treiber einen DirectTransferThreshold-Wert bereitstellen, wenn er WdfDeviceInitSetIoTypeEx aufruft. Das Framework verwendet diesen Wert, um die kleinste Puffergröße zu bestimmen, für die das Framework direkte E/A verwendet. In der Regel müssen Sie diesen Wert nicht angeben, da das Framework Einstellungen verwendet, die die beste Leistung bieten.

  • UMDF verwendet direkte E/A nur für Pufferspeicher, der auf einer Speicherseitengrenze beginnt und endet. Wenn der Anfang oder das Ende eines Puffers nicht auf einer Seitengrenze liegt, verwendet UMDF gepufferte E/A-Vorgänge für diesen Teil des Puffers. Anders ausgedrückt: UMDF kann für eine große Datenübertragung, die aus mehreren E/A-Anforderungen besteht, sowohl gepufferte E/A- als auch direkte E/A-E/A-Vorgänge verwenden.

  • Für Geräte-E/A-Steuerungsanforderungen verwendet UMDF direkte E/A-Vorgänge nur, wenn der E/A-Steuerungscode (IOCTL) direkte E/A angibt, und nur dann, wenn alle UMDF-Treiber für dieses Gerät WdfDeviceInitSetIoTypeEx aufgerufen haben, um die direkte Zugriffsmethode anzugeben.

Abrufen der Zugriffsmethode für eine E/A-Anforderung

Treiber verwenden denselben Satz von Anforderungsobjektmethoden, um auf Datenpuffer zuzugreifen, unabhängig von der Pufferzugriffsmethode. Daher müssen die meisten Treiber in der Regel nicht wissen, ob UMDF gepufferte E/A- oder direkte E/A-Vorgänge für eine E/A-Anforderung verwendet.

In einigen Fällen können Sie die Leistung eines Treibers verbessern, wenn Sie die Zugriffsmethode für eine E/A-Anforderung kennen. Betrachten Sie beispielsweise ein Gerät mit hohem Durchsatz, das in der Regel direkte E/A verwendet. Wenn der Treiber eine E/A-Anforderung empfängt, kopiert er Daten aus dem freigegebenen Pufferspeicher zur Überprüfung in den lokalen Treiberspeicher.

Der Treiber erhält jedoch gelegentlich einen Puffer, der gepufferte E/A verwendet. Da der E/A-Manager diese Daten bereits in einen Zwischenpuffer kopiert hat, muss der Treiber die Parameter nicht lokal kopieren. Durch das Vermeiden des Kopiervorgangs verbessert der Treiber die Leistung.

Ein UMDF-Treiber ruft WdfRequestGetEffectiveIoType auf, um die Pufferzugriffsmethode einer E/A-Anforderung abzurufen. Wie oben beschrieben, kann sich der E/A-Typ für eine bestimmte Anforderung von den vom Framework zugewiesenen E/A-Typeinstellungen für ein Gerät unterscheiden.

Konvertieren aus gepufferten E/A-Vorgängen oder direkten E/A-Vorgängen

Ein UMDF-Treiber kann die Methode "weder" verwenden.

Die Definitionen einiger Geräte-E/A-Steuerungscodes (IOCTLs) geben jedoch an, dass die Anforderungen die Methode "weder" verwenden. Optional kann ein UMDF-Treiber die Pufferzugriffsmethode solcher Geräte-E/A-Steuerungsanforderungen in gepufferte E/A- oder direkte E/A-Vorgänge konvertieren. Führen Sie die folgenden Schritte durch:

  1. Schließen Sie die UmdfMethodNeitherAction-Direktive in einen INF DDInstall-Abschnitt der INF-Datei Ihres Treibers ein. Sie können den Wert der Direktive festlegen, um anzugeben, dass UMDF Geräte-E/A-Steuerungsanforderungen, die die Zugriffsmethode "weder" verwenden, an den Treiber übergeben soll. (Andernfalls schließt UMDF diese E/A-Anforderungen mit einem Fehler status Wert ab.)

  2. Greifen Sie auf die Puffer der E/A-Anforderung zu, indem Sie die Objektmethoden verwenden, die UMDF für gepufferte E/A-Vorgänge oder direkte E/A bereitstellt.

Sie sollten die Unterstützung von IOCTL-Anforderungen aktivieren, die die Methode "weder" verwenden, wenn Sie sicher sind, dass UMDF die Zugriffsmethode in gepufferte E/A- oder direkte E/A-Vorgänge konvertieren kann. Wenn die IOCTL beispielsweise eine benutzerdefinierte Anforderung angibt, die nicht den Unter Pufferbeschreibungen für E/A-Steuercodes beschriebenen Pufferspezifikationsregeln entspricht, kann UMDF die Puffer nicht konvertieren.