IO_DPC_ROUTINE funzione di callback (wdm.h)
La routine DpcForIsr completa la manutenzione di un'operazione di I/O, dopo la restituzione di una routine InterruptService .
Sintassi
IO_DPC_ROUTINE IoDpcRoutine;
void IoDpcRoutine(
[in] PKDPC Dpc,
[in] _DEVICE_OBJECT *DeviceObject,
[in, out] _IRP *Irp,
[in, optional] PVOID Context
)
{...}
Parametri
[in] Dpc
Puntatore fornito dal chiamante a una struttura KDPC , che rappresenta l'oggetto DPC associato a questa routine DpcForIsr .
[in] DeviceObject
Puntatore fornito dal chiamante a una struttura DEVICE_OBJECT . Si tratta dell'oggetto dispositivo per il dispositivo di destinazione, creato in precedenza dalla routine AddDevice del driver.
[in, out] Irp
Puntatore fornito dal chiamante a una struttura IRP che descrive l'operazione di I/O.
[in, optional] Context
Puntatore fornito dal chiamante alle informazioni sul contesto definite dal driver, specificate in una chiamata precedente a IoRequestDpc.
Valore restituito
nessuno
Osservazioni
Per registrare una routine DpcForIsr per un oggetto dispositivo specifico, un driver deve chiamare IoInitializeDpcRequest, che determina l'allocazione e l'inizializzazione di un oggetto DPC da parte del sistema. Se sono necessarie più routine DPC, usare routine CustomDpc .
Per accodare una routine DpcForIsr per l'esecuzione, la routine InterruptService di un driver deve chiamare IoRequestDPC.
Una routine DpcForIsr è in genere responsabile almeno delle attività seguenti:
Completamento dell'operazione di I/O descritta dall'IRP ricevuto.
Dequeuing next IRP( Dequeuing next IRP).
Se il driver usa la coda IRP fornita dal sistema, la routine DpcForIsr deve chiamare IoStartNextPacket o IoStartNextPacketByKey, in modo che la routine StartIo del driver inizierà a elaborare la richiesta di I/O successiva.
Se il driver usa code IRP interne, la routine DpcForIsr deve annullare la coda dell'IRP successivo e iniziare l'elaborazione per la richiesta di I/O successiva.
Impostazione del blocco di stato di I/O nell'IRP ricevuto e chiamata di IoCompleteRequest per la richiesta completata.
Una routine DpcForIsr potrebbe anche ripetere un'operazione non riuscita o configurare il trasferimento successivo per una richiesta di I/O di grandi dimensioni suddivisa in parti più piccole.
Per altre informazioni sulle routine DpcForIsr, vedere DPC Objects and DPCs.For more information about DpcForIsr routinesr, see DPC Objects and DPCs.
Esempio
Per definire una routine di callback DpcForIsr , è innanzitutto necessario fornire una dichiarazione di funzione che identifica il tipo di routine di callback che si sta definendo. Windows fornisce un set di tipi di funzione di callback per i driver. La dichiarazione di una funzione tramite i tipi di funzione di callback consente di analizzare il codice per i driver, l'SDV ( Static Driver Verifier ) e altri strumenti di verifica di trovare errori ed è un requisito per la scrittura di driver per il sistema operativo Windows.
Ad esempio, per definire una routine di callback DpcForIsr denominata MyDpcForIsr
, usare il tipo IO_DPC_ROUTINE come illustrato nell'esempio di codice seguente:
IO_DPC_ROUTINE MyDpcForIsr;
Implementare quindi la routine di callback come indicato di seguito:
_Use_decl_annotations_
VOID
MyDpcForIsr(
PKDPC Dpc,
struct _DEVICE_OBJECT *DeviceObject,
struct _IRP *Irp,
PVOID Context
)
{
// Function body
}
Il tipo di funzione IO_DPC_ROUTINE è definito nel file di intestazione Wdm.h. Per identificare in modo più accurato gli errori quando si eseguono gli 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 utilizzate le annotazioni applicate al tipo di funzione IO_DPC_ROUTINE nel file di intestazione. Per altre informazioni sui requisiti per le dichiarazioni di funzione, vedere Dichiarazione di funzioni tramite tipi di ruolo di funzione per i driver WDM. Per informazioni su _Use_decl_annotations_
, vedere Annotazione del comportamento della funzione.
Requisiti
Requisito | Valore |
---|---|
Piattaforma di destinazione | Desktop |
Intestazione | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h) |
IRQL | Chiamato in DISPATCH_LEVEL. |