Udostępnij przez


Synchronizowanie kodu anulowania i uzupełniania

Jeśli sterownik wywołuje funkcję WdfRequestMarkCancelable lub WdfRequestMarkCancelableEx, aby uczynić żądanie we/wy anulowalnym, istnieje możliwość wystąpienia problemu z synchronizacją. Na przykład sterownik i urządzenie mogą wykonywać operacje we/wy urządzenia asynchronicznie za pomocą funkcji wywołania zwrotnego EvtInterruptIsr i EvtInterruptDpc, a funkcje wywołania zwrotnego EvtInterruptDpc i EvtRequestCancel mogą zawierać wywołania do WdfRequestComplete.

Sterownik musi wywołać element WdfRequestComplete tylko raz, aby ukończyć lub anulować żądanie. Jeśli jednak funkcje zwrotne EvtInterruptDpc i EvtRequestCancel nie są ze sobą zsynchronizowane, framework może wywołać jedną, gdy druga jest wykonywana.

Unikanie tego problemu jest łatwe, jeśli sterownik korzysta z automatycznej synchronizacji platformy, ponieważ automatyczna synchronizacja gwarantuje, że funkcje wywołania zwrotnego będą wywoływane pojedynczo.

Jeśli sterownik nie korzysta z automatycznej synchronizacji platformy, może użyć blokad platformy , aby zsynchronizować kod anulowania i ukończenia.

Niezależnie od tego, czy sterownik korzysta z automatycznej synchronizacji platformy, czy zapewnia własną synchronizację, funkcja wywołania zwrotnego EvtRequestCancel sterownika musi wywołać funkcję WdfRequestComplete , aby anulować żądanie. Funkcja EvtInterruptDpc sterownika powinna wywołać funkcję WdfRequestUnmarkCancelable w następujący sposób:

Status = WdfRequestUnmarkCancelable(Request);
if( Status != STATUS_CANCELLED ) {
    WdfRequestComplete(Request, RequestStatus);
    }

Ten kod gwarantuje, że sterownik nie wywołuje elementu WdfRequestComplete w celu ukończenia żądania, jeśli sterownik już go nazwał, aby anulować żądanie.

Aby uzyskać więcej informacji na temat reguł, których musi przestrzegać twój sterownik podczas wywoływania WdfRequestUnmarkCancelable, patrz WdfRequestUnmarkCancelable.