Udostępnij przez


Metody wysyłania żądań wejścia/wyjścia

Gdy sterownik wywołuje WdfIoQueueCreate w celu utworzenia kolejki we/wy, określa metodę wysyłania kolejki. Platforma udostępnia trzy metody wysyłania: sekwencyjne, równoległei ręczne. Sterownik może określić dowolną z tych metod wysyłania dla każdej kolejki wejścia/wyjścia, w tym domyślnej kolejki wejścia/wyjścia urządzenia.

Sterownik ustawia metodę wysyłania kolejki, określając wartość typu WDF_IO_QUEUE_DISPATCH_TYPEw strukturze WDF_IO_QUEUE_CONFIG kolejki.

Aby uzyskać przykładowe zastosowania każdej metody dystrybucji, zobacz Przykładowe zastosowania kolejek we/wy.

sekwencyjne wysyłanie

Jeśli sterownik lub urządzenie może przetwarzać tylko jedno żądanie we/wy z kolejki w danym momencie, należy skonfigurować kolejki we/wy urządzenia do używania sekwencyjnego wysyłania, który jest również nazywany synchroniczne wysyłanie. W przypadku tego typu wysyłania platforma dostarcza żądania do sterownika pojedynczo. Struktura nie dostarcza kolejnego żądania, dopóki sterownik nie zakończy, nie anulujelub nie przekieruje ponownie poprzedniego żądania.

Gdy platforma dostarczy żądanie do jednego z programów obsługi żądań sterownika, sterownik przetwarza żądanie. Jeśli sterownik przekazuje żądanie do ogólnego obiektu docelowego we/wy , zazwyczaj wywołuje jedną z metod synchronicznych obiektu docelowego we/wy. Aby uzyskać więcej informacji na temat tych metod, zobacz Wysyłanie żądań WE/WY synchronicznie. Sterownik musi ostatecznie ukończyć lub anulować każde żądanie odebrane z kolejki wejścia/wyjścia (I/O).

Sterownik, który skonfigurował kolejkę we/wy na potrzeby sekwencyjnego wysyłania, może wywołać WdfIoQueueRetrieveNextRequest lub WdfIoQueueRetrieveRequestByFileObject, aby uzyskać inne żądanie z kolejki, przed zakończeniem lub anulowaniem ostatniego odebranego żądania. Możesz to zrobić w głównym sterowniku, aby sterownik mógł rozpocząć następną operację sprzętową, podczas gdy funkcja wywołania zwrotnego EvtInterruptDpc sterownika nadal przetwarza dane z poprzedniej operacji sprzętowej.

Jeśli utworzysz kilka kolejek we/wy i skonfigurujesz je na potrzeby sekwencyjnego wysyłania, platforma wysyła żądania z każdej kolejki sekwencyjnie, ale kolejki są uruchamiane równolegle. Jeśli sterownik lub urządzenie może przetwarzać tylko jedno żądanie każdego typu, musisz użyć jednej kolejki we/wy z funkcją wywołania zwrotnego EvtIoDefault.

równoległe wysyłanie

Jeśli sterownik i urządzenie mogą przetwarzać wiele żądań we/wy jednocześnie, możesz skonfigurować kolejki we/wy urządzenia do używania równoległego wysyłania, aby sterownik mógł przetwarzać żądania asynchronicznie. Ta metoda wysyłania jest również nazywana asynchronicznym wysyłaniem.

Jeśli sterownik konfiguruje kolejkę we/wy do korzystania z wysyłania równoległego, platforma dostarcza żądania we/wy do sterownika, gdy tylko będą dostępne w kolejce. Wynikiem jest to, że sterownik może musiał przetwarzać kilka żądań jednocześnie.

Za każdym razem, gdy jeden z procedur obsługi żądań sterownika odbiera żądanie, sterownik musi przetworzyć żądanie, a następnie ukończyć żądanie. Jeśli sterownik przekazuje żądanie do ogólnego docelowego obiektu we/wy, zazwyczaj wywołuje jedną z asynchronicznych metod tego obiektu. Aby uzyskać więcej informacji na temat tych metod, zobacz Asynchroniczne wysyłanie żądań we/wy. Sterownik musi ostatecznie ukończyć lub anulować każde żądanie odebrane z kolejki I/O.

Sterownik korzystający z wysyłania równoległego może wywołać WdfIoQueueStop lub WdfIoQueueStopSynchronously, aby tymczasowo zatrzymać kolejkę, a następnie wywołać WdfIoQueueStart, aby ponownie uruchomić kolejkę.

ręczne wysyłanie

Jeśli chcesz, aby sterownik miał pełną kontrolę nad dostarczaniem żądań we/wy, możesz skonfigurować kolejkę we/wy urządzenia do korzystania z ręcznego wysyłania, co oznacza, że struktura nie dostarcza żądań do sterownika, chyba że sterownik wyraźnie prosi o to.

Aby uzyskać żądanie z kolejki ręcznej, sterownik może wywołać WdfIoQueueRetrieveNextRequest lub WdfIoQueueRetrieveRequestByFileObject w pętli, która sonduje kolejkę. Alternatywnie sterownik może wywołać WdfIoQueueReadyNotify, aby zarejestrować funkcję wywołania zwrotnego, którą platforma wywoła, gdy co najmniej jedno żądanie będzie dostępne w kolejce. Po tym jak framework wywoła funkcję zwrotną, sterownik może w pętli wywołać WdfIoQueueRetrieveNextRequest lub WdfIoQueueRetrieveRequestByFileObject, aby pobrać żądania.

Gdy sterownik uzyska żądanie z kolejki, musi przetworzyć żądanie. Sterownik musi ostatecznie ukończyć lub anulować każde żądanie.