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
- Abrufen der Zugriffsmethode für eine E/A-Anforderung
- Konvertieren aus gepufferten E/A-Vorgängen oder direkten E/A-Vorgängen
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:
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.)
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.