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 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.