EVT_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE funzione di callback (wdfio.h)

[Si applica a KMDF e UMDF]

La funzione di callback dell'evento EvtIoCanceledOnQueue di un driver informa il driver che deve completare una richiesta di I/O rimossa dal framework da una coda di I/O.

Sintassi

EVT_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE EvtWdfIoQueueIoCanceledOnQueue;

void EvtWdfIoQueueIoCanceledOnQueue(
  [in] WDFQUEUE Queue,
  [in] WDFREQUEST Request
)
{...}

Parametri

[in] Queue

Handle per un oggetto coda di I/O.

[in] Request

Handle a un oggetto request.

Valore restituito

nessuno

Osservazioni

Un driver registra una funzione di callback EvtIoCanceledOnQueue quando chiama il metodo WdfIoQueueCreate . Per altre informazioni sulla chiamata a WdfIoQueueCreate, vedere Creazione di code di I/O.

Se un driver registra una funzione di callback EvtIoCanceledOnQueue per una coda di I/O, il framework chiama la funzione di callback nelle situazioni seguenti:

Dopo che il framework chiama la funzione di callback EvtIoCanceledOnQueue , il driver possiede l'oggetto request e deve completare la richiesta con un codice di stato appropriato, in EvtIoCanceledOnQueue o versioni successive. Quando il framework chiama EvtIoCanceledOnQueue, la richiesta è ancora associata alla coda di I/O, ma il driver non può ripetere la richiesta. La proprietà della richiesta rimane con il driver anche se il driver non completa la richiesta in EvtIoCanceledOnQueue. Se il driver completa la richiesta dopo che EvtIoCanceledOnQueue restituisce, non può chiamare WdfIoQueueFindRequest e WdfIoQueueRetrieveFoundRequest per riacquisire la proprietà della richiesta perché il driver ha già la proprietà della richiesta.

In genere, in EvtIoCanceledOnQueue, il driver completa la richiesta di I/O con uno stato di completamento di STATUS_CANCELLED.

In alcuni casi, il driver potrebbe aver riquerato in precedenza una richiesta di I/O a una coda manuale, forse per attendere informazioni. Ad esempio, in uno dei gestori delle richieste, un driver potrebbe inserire una richiesta di I/O associata a una transazione DMA in sospeso in una coda manuale. In questo caso, il driver tenta di annullare la transazione DMA nel suo callback EvtIoCanceledOnQueue . A seconda dei risultati dell'operazione di annullamento, il driver completa la richiesta con uno stato appropriato, in EvtIoCanceledOnQueue o versioni successive.

Il framework non chiama la funzione di callback EvtIoCanceledOnQueue per le richieste di I/O che il framework non ha mai recapitato al driver.

Il framework chiama una funzione di callback EvtIoCanceledOnQueue non appena determina che una richiesta di I/O è stata annullata, indipendentemente dal metodo di invio impostato per la coda di I/O. Pertanto, il framework può chiamare una funzione di callback EvtIoCanceledOnQueue per:

  • Richiesta in una coda che usa l'invio sequenziale, anche se il driver possiede attualmente un'altra richiesta dalla coda.
  • Richiesta in una coda per cui il driver ha impostato NumberOfPresentedRequests, anche se il driver possiede attualmente il numero massimo di richieste.
Per altre informazioni sulla funzione di callback EvtIoCanceledOnQueue , vedere Annullamento delle richieste di I/O.

La funzione di callback EvtIoCanceledOnQueue può essere chiamata in IRQL <= DISPATCH_LEVEL, a meno che il membro ExecutionLeveldella struttura WDF_OBJECT_ATTRIBUTES del dispositivo o del driver sia impostato su WdfExecutionLevelPassive.

Se IRQL è PASSIVE_LEVEL, il framework chiama la funzione di callback all'interno di un'area critica.

Esempio

Per definire una funzione di callback EvtIoCanceledOnQueue , è prima necessario specificare una dichiarazione di funzione che identifica il tipo di funzione di callback che si sta definendo. Windows fornisce un set di tipi di funzione di callback per i driver. La dichiarazione di una funzione usando i tipi di funzione callback consente l'analisi del codice per i driver, il verifica driver statico (SDV) e altri strumenti di verifica trovano errori ed è un requisito per la scrittura di driver per il sistema operativo Windows.

Per definire una funzione di callback EvtIoCanceledOnQueue , è prima necessario specificare una dichiarazione di funzione che SDV e altri strumenti di verifica richiedono. L'esempio seguente è tratto dall'esempio pcMCIA smart card driver .

EVT_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE PscrEvtIoCanceledOnQueue;

Nell'esempio pcMCIA Smart Card Driver , il driver usa una coda manuale per archiviare le richieste di notifica delle smart card in sospeso. Il driver fornisce una funzione di callback EvtIoCanceledOnQueue in cui il driver cancella il campo di notifica e completa la richiesta.

_Use_decl_annotations_
VOID
PscrEvtIoCanceledOnQueue(
    WDFQUEUE  Queue,
    WDFREQUEST  Request
    )

{
    PDEVICE_EXTENSION DeviceExtension;
    PSMARTCARD_EXTENSION smartcardExtension;

    DeviceExtension = GetDeviceExtension(WdfIoQueueGetDevice(Queue));
    smartcardExtension = (PSMARTCARD_EXTENSION) &DeviceExtension->SmartcardExtension;

    //KdPrint(("Cancelled on queue 0x%x\n", WdfRequestWdmGetIrp(Request)));

    InterlockedExchangePointer(
                             &(smartcardExtension->OsData->NotificationIrp),
                             NULL
                             );

    WdfRequestComplete(Request, STATUS_CANCELLED);
}

Il tipo di funzione EVT_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE è definito nel file di intestazione Wdfio.h. Per identificare in modo più accurato gli errori durante l'esecuzione degli strumenti di analisi del codice, assicurarsi di aggiungere l'annotazione Use_decl_annotations alla definizione della funzione. L'annotazione Use_decl_annotations garantisce che vengano usate le annotazioni applicate al tipo di funzione EVT_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE nel file di intestazione. Per altre informazioni sui requisiti per le dichiarazioni di funzione, vedere Dichiarazione di funzioni tramite tipi di ruolo per i driver KMDF. Per informazioni su Use_decl_annotations, vedere Annotazione del comportamento della funzione.

Requisiti

   
Piattaforma di destinazione Universale
Versione KMDF minima 1,0
Versione UMDF minima 2,0
Intestazione wdfio.h (includere Wdf.h)
IRQL <= DISPATCH_LEVEL (vedere sezione Osservazioni)

Vedi anche

WdfIoQueueCreate

WdfRequestForwardToIoQueue