Condividi tramite


Puntatori di flusso e annullamento di IRP

Se un frame ha un puntatore di flusso bloccato a cui fa riferimento, non è possibile annullare l'IRP corrispondente a questo frame. Vedere Blocco e sblocco dei puntatori di flusso.

La tabella seguente elenca le tecniche che il minidriver può usare per supportare l'annullamento di IRP. La strategia di annullamento deve essere basata sui requisiti di accesso al flusso del minidriver, come descritto nella colonna più a sinistra.

Se è necessario.. Procedere nel modo seguente Commenti

Breve accesso ai dati di flusso in un singolo punto di accesso

Chiamare KsPinGetLeadingEdgeStreamPointer con il parametro State impostato su KSSTREAM_POINTER_STATE_LOCKED. Chiamare quindi KsStreamPointerUnlock o KsStreamPointerAdvanceOffsetsAndUnlock immediatamente dopo il completamento dell'elaborazione.

Fornisce velocità di risposta rapida per l'annullamento a meno che il thread non blocchi tra l'acquisizione del puntatore e lo sblocco.

Durata indefinita del tempo di accesso, ma può rimettere l'attestazione nel contesto di un callback di annullamento

Chiamare KsStreamPointerClone per clonare un puntatore di flusso bloccato (in genere il bordo principale), sbloccarlo e rispondere a CancelCallback. Il callback si verifica con il blocco di rotazione della coda, quindi in DISPATCH_LEVEL. Di conseguenza, la routine CancelCallback fornita dal fornitore non può eseguire la manipolazione della coda o le funzioni di chiamata che acquisiscono un mutex. Nella routine di callback, invece, il minidriver verifica che i dati associati non saranno accessibili in un secondo momento e quindi chiama KsStreamPointerDelete.

Può essere più difficile da implementare, ma spesso offre il migliore equilibrio tra l'accesso efficiente e la risposta rapida all'annullamento.

Accesso periodico a un frame e può tollerare la scomparsa del frame tra gli accessi

Mantenere un clone sbloccato e chiamare KsStreamPointerLock per bloccarlo in fase di accesso. Se il frame viene annullato, il tentativo successivo di bloccare il puntatore di flusso ha esito negativo e il minidriver può chiamare KsStreamPointerDelete.

Come per la prima opzione, la velocità di risposta all'annullamento è una funzione della durata del blocco del puntatore di flusso.

Durata indefinita del tempo di accesso e non può rimettere l'attestazione in risposta a un callback

Mantenere un puntatore di flusso clone bloccato per qualsiasi intervallo di tempo per impedire l'annullamento. Per creare un puntatore di flusso clone, chiamare KsStreamPointerClone. Chiamare quindi KsStreamPointerLock e KsStreamPointerUnlock per bloccare o sbloccare il clone.

La velocità di risposta all'annullamento potrebbe essere scarsa. È consigliabile usare i timeout del puntatore di flusso con questa tecnica.

Se un frame ha un puntatore di flusso a cui fa riferimento, il minidriver può chiamare KsStreamPointerGetIrp per accedere all'IRP corrispondente a questo frame. Per recuperare l'elenco dei descrittori di memoria (MDL) associato a un frame, chiamare KsStreamPointerGetMdl.