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.
Operacja we/wy urządzenia w toku (na przykład żądanie odczytu kilku bloków z dysku) może zostać anulowana przez aplikację, system lub sterownik. Jeśli operacja wejścia/wyjścia urządzenia zostanie anulowana, menedżer próbuje anulować wszystkie nieprzetworzone żądania wejścia/wyjścia skojarzone z tą operacją. Sterowniki urządzenia można zarejestrować, aby otrzymywać powiadomienia, gdy menedżer we/wy próbuje anulować żądania we/wy, a sterowniki mogą anulować żądania, których są właścicielami, poprzez oznaczenie ich stanu ukończenia jako STATUS_CANCELLED.
Framework obsługuje niektóre prace związane z anulowaniem dla sterowników opartych na frameworku. Jeśli operacja we/wy urządzenia zostanie anulowana, platforma ukończy następujące żądania we/wy (ze stanem ukończenia STATUS_CANCELLED), które są skojarzone z anulowaną operacją:
Niedostarczone żądania we/wy, które framework umieścił w domyślnej kolejce we/wy sterownika.
Niedostarczone żądania I/O, które platforma przekazała do innej kolejki, ponieważ sterownik wywołał WdfDeviceConfigureRequestDispatching.
Ponieważ struktura anuluje te żądania, nie dostarcza ich do sterownika.
Po dostarczeniu przez framework żądania we/wy do sterownika, sterownik jest właścicielem żądania, a framework nie może go anulować. W tym momencie tylko sterownik może anulować żądanie we/wy, ale struktura musi powiadomić sterownik, że żądanie powinno zostać anulowane. Sterowniki otrzymują to powiadomienie, przekazując funkcję wywołania zwrotnego EvtRequestCancel.
Czasami sterownik odbiera żądanie we/wy z kolejki we/wy, ale zamiast przetwarzać żądanie, sterownik ponownie kolejkuje żądanie do tej samej lub innej kolejki we/wy na potrzeby późniejszego przetwarzania. Przykłady tej sytuacji obejmują następujące elementy:
Struktura dostarcza żądanie we/wy do jednej z procedur obsługi żądań sterownika, a następnie sterownik wywołuje WdfRequestForwardToIoQueue (lub WdfRequestForwardToParentDeviceIoQueue), aby umieścić je w innej kolejce lub WdfRequestRequeue z powrotem w tej samej.
Struktura dostarcza żądanie we/wy do evtIoInCallerContext funkcji wywołania zwrotnego, sterownik wywołuje WdfDeviceEnqueueRequest przekazać żądanie z powrotem do struktury, a struktura następnie umieszcza żądanie w jednej z kolejek we/wy sterownika.
W takich przypadkach platforma może anulować żądanie we/wy, ponieważ żądanie znajduje się w kolejce we/wy. Jeśli jednak sterownik zarejestrował funkcję callback EvtIoCanceledOnQueue dla kolejki we/wy, w której znajduje się żądanie, ramy wywołują tę funkcję, zamiast anulować żądanie, gdy skojarzona operacja we/wy jest anulowana. Jeśli struktura wywołuje funkcję wywołania zwrotnego EvtIoCanceledOnQueue, sterownik musi ukończyć żądanie.
Podsumowując, gdy operacja we/wy zostanie anulowana, platforma zawsze anuluje wszystkie skojarzone żądania we/wy, które nigdy nie zostały dostarczone do sterownika. Jeśli sterownik odbiera żądanie, a następnie ponownie je kolejkuje, platforma anuluje żądanie (jeśli żądanie znajduje się w kolejce), chyba że sterownik zdefiniuje funkcję wywołania zwrotnego EvtIoCanceledOnQueue w przypadku kolejki we/wy.
Wywoływanie elementu WdfRequestMarkCancelable lub WdfRequestMarkCancelableEx
Sterownik może wywoływać WdfRequestMarkCancelable lub WdfRequestMarkCancelableEx, aby zarejestrować funkcję wywołania zwrotnego EvtRequestCancel. Jeśli sterownik wywoła WdfRequestMarkCancelable lub WdfRequestMarkCancelableEx, a operacja we/wy skojarzona z żądaniem zostanie anulowana, struktura wywołuje funkcję wywołania zwrotnego sterownika EvtRequestCancel, aby mógł anulować żądanie we/wy.
Sterownik powinien wywołać WdfRequestMarkCancelable lub WdfRequestMarkCancelableEx, jeśli zamierza utrzymywać żądanie przez stosunkowo długi czas. Na przykład sterownik może być musiał poczekać na odpowiedź urządzenia lub może poczekać, aż niższe sterowniki zakończą zestaw żądań utworzonych przez sterownik po odebraniu pojedynczego żądania.
Jeśli sterownik nie wywoła WdfRequestMarkCancelable lub WdfRequestMarkCancelableEx, albo jeśli sterownik wywoła WdfRequestUnmarkCancelable po wywołaniu WdfRequestMarkCancelable lub WdfRequestMarkCancelableEx, to nie jest świadomy anulowania i dlatego obsługuje żądanie w sposób, w jaki zazwyczaj je obsługuje.
Wywoływanie elementu WdfRequestIsCanceled
Jeśli sterownik nie wywołał WdfRequestMarkCancelable lub WdfRequestMarkCancelableEx do zarejestrowania EvtRequestCancel funkcji wywołania zwrotnego, może wywołać WdfRequestIsCanceled, aby ustalić, czy menedżer we/wy próbował anulować żądanie we/wy. Jeśli WdfRequestIsCanceled zwraca TRUE, a sterownik jest właścicielem żądania, sterownik powinien anulować żądanie. Jeśli sterownik nie jest właścicielem żądania, nie powinien wywoływać WdfRequestIsCanceled.
Sterownik, który nie wywołał WdfRequestMarkCancelable lub WdfRequestMarkCancelableEx, może wywołać WdfRequestIsCanceled w następujących okolicznościach:
Sterownik, który czeka na przerwania urządzenia, może wywołać WdfRequestIsCanceled w swojej funkcji wywołania zwrotnego EvtInterruptDpc.
Sterownik, który sonduje swoje urządzenie, może wywołać WdfRequestIsCanceled z jego wątku sondowania.
Sterownik, który rozbija transakcję DMA na kilka mniejszych transferów, może wywołać WdfRequestIsCanceled po zakończeniu każdego transferu.
Sterownik, który odbiera duże żądanie odczytu lub zapisu i dzieli je na kilka mniejszych żądań, może wywołać WdfRequestIsCanceled po tym, jak docelowy I/O sterownika zakończy każde z mniejszych żądań, jeśli sterownik nie wywołał WdfRequestMarkCancelable lub WdfRequestMarkCancelableEx dla otrzymanego żądania.
Anulowanie żądania
Anulowanie żądania we/wy może obejmować dowolne z następujących elementów:
Przerywanie trwającej operacji we/wy.
Nie przesyłaj żądania do celu I/O.
Wywołanie WdfRequestCancelSentRequest, aby spróbować anulować żądanie przesłane wcześniej przez sterownik do obiektu docelowego we/wy.
Jeśli sterownik anuluje żądanie we/wy dla obiektu żądania odebranego przez sterownik z frameworka, sterownik musi zawsze wykonać żądanie, wywołując WdfRequestComplete, WdfRequestCompleteWithInformationlub WdfRequestCompleteWithPriorityBoost, z parametrem Status STATUS_CANCELLED. (Jeśli sterownik wywołał WdfRequestCreate w celu utworzenia obiektu żądania, sterownik powinien wywołać WdfObjectDelete zamiast kończyć żądanie).
Synchronizowanie anulowania
Aby uzyskać informacje na temat synchronizowania kodu, który anuluje żądania wejścia/wyjścia (I/O), zobacz: