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.
Uruchamianie kolejki we/wy
Gdy sterownik wywołuje WdfIoQueueCreate w celu utworzenia kolejki I/O, platforma automatycznie umożliwia kolejce odbieranie żądań I/O i dostarczanie ich do sterownika.
Sterowniki zwykle wywołują WdfIoQueueCreate w funkcji EvtDriverDeviceAdd jako funkcji wywołania zwrotnego. Framework może rozpocząć dostarczanie żądań we/wy do sterownika po powrocie funkcji wywołania zwrotnego EvtDriverDeviceAdd.
Jeśli sterownik używa kolejek we/wy zarządzanych przez zasilanie, system nie może rozpocząć dostarczania żądań do sterownika, dopóki urządzenie nie znajdzie się w stanie roboczym, a framework nie wywoła funkcji wywołania zwrotnego EvtDeviceD0Entry.
Zatrzymywanie i ponowne uruchamianie kolejki we/wy
Sterownik może wywołać WdfIoQueueStop lub WdfIoQueueStopSynchronously, aby tymczasowo uniemożliwić platformie dostarczanie żądań we/wy z kolejki we/wy. Aby wznowić dostarczanie żądań we/wy, sterownik wywołuje WdfIoQueueStart.
Jeśli sterownik korzysta z kolejek we/wy zarządzanych przez zasilanie, platforma automatycznie zatrzymuje kolejki urządzenia, gdy urządzenie opuści stan roboczy (D0), a platforma ponownie uruchamia kolejki, gdy stan urządzenia powróci do D0.
Dodawanie Żądań do Kolejki We/Wy
Gdy system wysyła żądanie odczytu, zapisu lub kontroli we/wy do sterownika, platforma umieszcza to żądanie w kolejce we/wy. Sterownik może kontrolować typy żądań, które framework przechowuje w każdej kolejce, poprzez wywołanie WdfDeviceConfigureRequestDispatching.
Sterownik może również przekierować żądania otrzymane z frameworku, wywołując WdfRequestForwardToIoQueue.
uzyskiwanie żądań z kolejki we/wy
Jeśli sterownik określa sekwencyjną lub równoległą metodę rozsyłania dla kolejki we/wy, odbiera żądania w procedurach obsługi żądań.
Jeśli sterownik określi metodę wysyłania ręcznego lub sekwencyjnego, może uzyskać żądania, wywołując WdfIoQueueRetrieveNextRequest lub WdfIoQueueRetrieveRequestByFileObject.
szukanie żądania I/O
Jeśli sterownik określi ręczną metodę wysyłania dla kolejki we/wy, można użyć następujących kroków, aby wyszukać określone żądania w kolejce:
Użyj WdfIoQueueFindRequest, aby zlokalizować żądanie zgodne z kryteriami określonymi przez sterownik.
Wywołaj WdfIoQueueRetrieveFoundRequest, aby pobrać żądanie zlokalizowane przez WdfIoQueueFindRequest.
#D0 przeczyszczanie lub opróżnianie kolejki we/wy
#B0 Czyszczenie #C1 kolejki I/O oznacza wstrzymanie dodawania żądań I/O do kolejki i anulowanie żądań, które znajdują się już w kolejce.
Opróżnianie kolejki we/wy oznacza wstrzymanie wstawiania żądań we/wy do kolejki, zezwalając jednocześnie na dostarczenie żądań znajdujących się już w kolejce do sterownika.
Sterowniki zwykle przeczyszczają lub opróżniają kolejki tylko wtedy, gdy kolejki nie mają zarządzania energią. W przypadku kolejek we/wy zarządzanych energią sterowniki mogą zapewnić funkcje wywołania zwrotnego EvtIoStop i EvtIoResume.
Jeśli niektóre kolejki sterownika nie są zarządzane przez zasilanie, możesz przeczyścić lub opróżnić kolejkę, jeśli skojarzone z nim urządzenie lub kanał we/wy staną się niedostępne. Zazwyczaj można przeczyścić kolejkę, zamiast opróżnić, chyba że istnieje duże prawdopodobieństwo, że każde żądanie zawiera bardzo ważne informacje. Na przykład sterownik urządzenia sieciowego może przeczyścić kolejki, podczas gdy sterownik urządzenia magazynowego prawdopodobnie opróżnia kolejki.
Jeśli chcesz, aby sterownik przeczyścił lub opróżnił kolejkę we/wy, sterownik może wywołać jedną z następujących metod obiektu kolejki:
#B0 #A1 WdfIoQueuePurge #A2 #C3 lub #B4 #A5 WdfIoQueuePurgeSynchronously #A6 #A7, w celu zatrzymania przyjmowania żądań we/wy w kolejce oraz anulowania nieprzetworzonych żądań.
#B0 #A1 WdfIoQueueDrain #A2 #C3 lub #B4 #A5 WdfIoQueueDrainSynchronously #A6 #A7, aby zatrzymać kolejkowanie żądań we/wy w kolejce we/wy, zezwalając na dostarczanie i przetwarzanie już zakolejkowanych żądań.
Zachowaj ostrożność podczas wywoływania WdfIoQueueDrain i WdfIoQueueDrainSynchronously. Ponieważ operacja opróżniania czeka na ukończenie żądań, możesz opróżnić kolejkę tylko wtedy, gdy masz pewność, że oczekujące żądania kolejki zostaną ukończone w odpowiednim czasie. Jeśli nie wiesz, jak długo potrwa zakończenie żądań wejścia-wyjścia i dopuszczalne jest anulowanie zaległych żądań, rozważ opróżnienie kolejki.
Przenoszenie żądań z jednej kolejki wejścia/wyjścia do innej
Po odebraniu przez Twój sterownik żądania we/wy, może być konieczne ponowne umieszczenie tego żądania w innej kolejce we/wy. W tym celu sterownik wywołuje WdfRequestForwardToIoQueue lub WdfRequestForwardToParentDeviceIoQueue, co dodaje żądanie na koniec określonej kolejki. W końcu platforma ponownie dostarczy żądanie do sterownika przy użyciu metody wysyłania określonej kolejki. Aby uzyskać więcej informacji na temat przenoszenia żądań we/wy z jednej kolejki we/wy do innej, zobacz w Ponowne kolejkowanie żądań we/wy.
Przechwycenie żądania We/Wy przed jego zakolejkowaniem
Istnieje możliwość przechwycenia żądania we/wy przez sterownik, zanim framework umieści żądanie w kolejce we/wy. Aby przechwycić żądania I/O, sterownik musi wywołać funkcję WdfDeviceInitSetIoInCallerContextCallback, aby zarejestrować funkcję wywołania zwrotnego EvtIoInCallerContext.
Ramy kojarzą funkcję zwrotną EvtIoInCallerContext z urządzeniem. W rezultacie struktura wywołuje funkcję wywołania zwrotnego EvtIoInCallerContext za każdym razem, gdy odbiera żądanie wysyłane przez system do urządzenia.
Zazwyczaj, gdy funkcja wywołania zwrotnego EvtIoInCallerContext otrzymuje żądanie, przeprowadza wstępne przetwarzanie tego żądania. Następnie funkcja wywołania zwrotnego wywołuje #B0 #A1 WdfDeviceEnqueueRequest #A2 #A3, która zwraca żądanie do frameworku. Ramy mogą następnie umieścić żądanie w odpowiedniej kolejce I/O, tak jakby nie wywołały funkcji wywołania zwrotnego EvtIoInCallerContext.
pl-PL: Głównym powodem, dla którego sterownik może dostarczyć funkcję wywołania zwrotnego EvtIoInCallerContext, jest to, że musi obsługiwać operacje we/wy wspierające metodę we/wy ani buforowane ani bezpośrednie operacje we/wy. W przypadku tej metody we/wy sterownik musi uzyskać dostęp do odebranych buforów w kontekście procesu, w którym zainicjowano żądanie we/wy. Aby uzyskać więcej informacji, zobacz Uzyskiwanie dostępu do buforów danych w sterownikach Framework-Based.
Uzyskiwanie właściwości kolejki we/wy
Aby uzyskać właściwości obiektu kolejki struktury, sterownik może wywołać następujące metody:
WdfIoQueueGetDevice, aby uzyskać uchwyt do obiektu urządzenia, do którego należy obiekt kolejki.
#B0 WdfIoQueueGetState, aby uzyskać informacje o stanie kolejki.