Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Jeśli piszesz sterownik UMDF, możesz określić preferencje dla metody dostępu do bufora, której struktura używa dla żądań odczytu i zapisu, a także żądań kontroli we/wy urządzenia. Wartości, które udostępnia sterownik UMDF, są tylko preferencjami i nie mają gwarancji, że są używane przez strukturę.
- określanie preferowanej metody dostępu buforu
- pobieranie sposobu dostępu dla żądania we/wy
- Konwertowanie ani z buforowanego we/wy, ani z bezpośredniego we/wy
określanie preferowanej metody dostępu buforu
Począwszy od UMDF w wersji 2.0, sterownik UMDF wywołuje WdfDeviceInitSetIoTypeEx do rejestrowania preferowanych metod dostępu dla żądań odczytu/zapisu i żądań kontroli we/wy urządzenia.
Jeśli sterownik nie wywołuje WdfDeviceInitSetIoTypeEx, UMDF korzysta z metody buforowanej dla żądań I/O do tego urządzenia.
Struktura używa następujących reguł, aby określić, która metoda dostępu ma być używana:
Wszystkie sterowniki UMDF w stosie sterowników muszą używać tej samej metody uzyskiwania dostępu do buforów urządzenia, a framework preferuje buforowe operacje I/O.
Jeśli funkcja UMDF ustali, że niektóre sterowniki preferują buforowane we/wy lub bezpośrednie we/wy dla urządzenia, podczas gdy inne sterowniki preferują tylko buforowane we/wy dla urządzenia, funkcja UMDF używa buforowanego we/wy dla wszystkich sterowników. Jeśli co najmniej jeden sterownik stosu preferuje tylko buforowane we/wy, podczas gdy inne wolą tylko bezpośrednie we/wy, UMDF rejestruje zdarzenie w dzienniku zdarzeń systemu i nie uruchamia stosu sterowników.
Sterownik może wywołać WdfDeviceGetDeviceStackIoType, aby określić metody dostępu do buforu, które UMDF przypisał do żądań odczytu/zapisu urządzenia oraz żądań kontroli we/wy.
W niektórych przypadkach UMDF przypisuje bezpośrednie we/wy do urządzenia, ale dla najlepszej wydajności używa buforowanego we/wy dla jednego lub więcej żądań urządzenia. Na przykład, UMDF używa buforowanego I/O dla małych buforów, jeśli może skopiować dane do buforu sterownika szybciej, niż może mapować bufory do bezpośredniego dostępu.
Opcjonalnie sterownik może podać wartość DirectTransferThreshold, gdy wywołuje WdfDeviceInitSetIoTypeEx. Struktura używa tej wartości do określenia najmniejszego rozmiaru buforu, dla którego struktura będzie używać bezpośrednich operacji we/wy. Zazwyczaj nie trzeba podawać tej wartości, ponieważ platforma używa ustawień zapewniających najlepszą wydajność.
UMDF używa bezpośredniego we/wy tylko dla przestrzeni buforu, która zaczyna się i kończy na granicy strony pamięci. Jeśli początek lub koniec buforu nie znajdują się na granicy strony, UMDF używa buforowanego I/O dla tej części buforu. Innymi słowy, UMDF może wykorzystywać zarówno buforowane operacje we/wy, jak i bezpośrednie we/wy do przeprowadzenia dużego transferu danych składającego się z kilku żądań we/wy.
W przypadku żądań kontrolnych we/wy urządzeń, UMDF używa bezpośredniego we/wy tylko wtedy, gdy kod kontrolny we/wy (IOCTL) określa bezpośrednie we/wy i tylko wtedy, gdy wszystkie sterowniki UMDF dla tego urządzenia wywołały WdfDeviceInitSetIoTypeEx, aby określić metodę bezpośredniego dostępu.
Odzyskiwanie metody dostępu dla żądania We/Wy
Sterowniki używają tego samego zestawu metod obiektu żądania, aby uzyskać dostęp do danych, niezależnie od metody dostępu buforu. W związku z tym większość kierowców zazwyczaj nie musi wiedzieć, czy UMDF używa buforowanego I/O, czy bezpośredniego I/O dla żądania I/O.
W niektórych przypadkach możesz poprawić wydajność sterownika, jeśli znasz metodę dostępu dla żądania we/wy. Rozważmy na przykład urządzenie o wysokiej przepływności, które zwykle używa bezpośredniego we/wy. Gdy sterownik odbiera żądanie we/wy, kopiuje dane z udostępnionego miejsca buforu do pamięci lokalnego sterownika w celu weryfikacji.
Sterownik może jednak od czasu do czasu odbierać bufor, który używa buforowanego I/O. Ponieważ menedżer we/wy skopiował już te dane do buforu pośredniego, sterownik nie musi kopiować parametrów lokalnie. Unikając operacji kopiowania, sterownik poprawia wydajność.
Sterownik UMDF wywołuje WdfRequestGetEffectiveIoType, aby uzyskać metodę dostępu do buforu żądania we/wy. Jak opisano powyżej, typ we/wy dla określonego żądania może różnić się od ustawień typu we/wy przypisanego przez platformę dla urządzenia.
Konwersja z buforowanego I/O ani z bezpośredniego I/O
Sterownik UMDF nie może użyć metody "ani".
Jednak definicje niektórych kodów kontroli wejścia/wyjścia urządzenia (IOCTLs) określają, że żądania używają metody "ani". Opcjonalnie sterownik UMDF może przekonwertować metodę dostępu do bufora w takich żądaniach kontroli urządzenia we/wy na buforowane we/wy lub bezpośrednie we/wy. Wykonaj następujące kroki:
Uwzględnij dyrektywę UmdfMethodNeitherAction w sekcji INF DDInstall pliku INF sterownika. Można ustawić wartość dyrektywy, aby wskazać, że UMDF powinien przekazywać żądania sterowania urządzeniem we/wy, które używają metody dostępu „żadna”, do sterownika. (W przeciwnym razie UMDF kończy te żądania we/wy ze statusem błędu).
Uzyskaj dostęp do buforów żądań we/wy, używając metod obiektów, które UMDF zapewnia dla buforowanego we/wy lub bezpośredniego we/wy.
Należy włączyć obsługę żądań IOCTL, które używają metody "neither" tylko wtedy, gdy masz pewność, że UMDF może przekonwertować metodę dostępu na buforowane wejście/wyjście lub bezpośrednie wejście/wyjście. Jeśli na przykład IOCTL określa dostosowane żądanie, które nie jest zgodne z regułami specyfikacji buforu opisanymi w Opisy buforów dla kodów sterowania we/wy, UMDF nie może przekonwertować tych buforów.