KDEFERRED_ROUTINE funzione di callback (wdm.h)
La routine di callback esegue azioni, dopo la restituzione di un interruptService , di un DPC threading,
La routine CustomDpc completa la manutenzione di un'operazione di I/O, dopo la restituzione di una routine InterruptService .
La routine CustomThreadedDpc esegue l'azione di un DPC thread. Il sistema esegue questa routine quando viene eseguito il DPC thread.
La routine CustomTimerDpc viene eseguita dopo la scadenza dell'intervallo di tempo di un oggetto timer.
Sintassi
KDEFERRED_ROUTINE KdeferredRoutine;
void KdeferredRoutine(
[in] _KDPC *Dpc,
[in, optional] PVOID DeferredContext,
[in, optional] PVOID SystemArgument1,
[in, optional] PVOID SystemArgument2
)
{...}
Parametri
[in] Dpc
Puntatore fornito dal chiamante a una struttura KDPC , che rappresenta l'oggetto DPC associato a questa routine di callback.
[in, optional] DeferredContext
Per CustomDpc, un puntatore fornito dal chiamante alle informazioni sul contesto definite dal driver specificate in una chiamata precedente a KeInitializeDpc.
Per CustomThreadedDpc, specifica le informazioni sul contesto definite dal driver. Quando inizializza l'oggetto DPC, il driver ha fornito questo valore come parametro DeferredContext a KeInitializeThreadedDpc.
Puntatore fornito dal chiamante a una struttura KDPC , che rappresenta l'oggetto DPC associato a questa routine CustomTimerDpc .
[in, optional] SystemArgument1
Puntatore fornito dal chiamante alle informazioni fornite dal driver specificate in una chiamata precedente a KeInsertQueueDpc. Quando ha aggiunto il DPC alla coda DPC, il driver ha fornito questo valore come parametro SystemArgument1 a KeInsertQueueDpc.
Per CustomTimerDpc, questo valore non viene usato.
[in, optional] SystemArgument2
Specifica le informazioni sul contesto definite dal driver. Quando ha aggiunto il DPC alla coda DPC, il driver ha fornito questo valore come parametro SystemArgument2 a KeInsertQueueDpc.
Per CustomTimerDpc, questo valore non viene usato.
Valore restituito
nessuno
Osservazioni
Per creare un oggetto DPC e registrare una routine CustomDpc per tale oggetto, un driver deve chiamare KeInitializeDpc. Se è necessaria una sola routine DPC, è possibile usare una routine DpcForIsr e l'oggetto DPC allocato dal sistema.
Per accodare una routine CustomDpc per l'esecuzione, la routine InterruptService di un driver deve chiamare KeInsertQueueDpc.
Una o più routine CustomDpc possono essere usate invece di o in combinazione con una routine DpcForIsr . Un driver che gestisce diverse code IRP interne fornisce in genere una routine CustomDpc per ogni coda. Ogni routine CustomDpc è in genere responsabile almeno delle attività seguenti:
Completamento dell'operazione di I/O descritta dall'IRP corrente.
Dequeuing the next IRP from one of the driver's IRP queues.Dequeuing the next IRP queues from one of the driver's IRP queues. I driver che usano la coda IRP fornita dal sistema insieme a una routine StartIochiamano IoStartNextPacket.
Impostazione del blocco di stato di I/O nell'IRP corrente e chiamata di IoCompleteRequest per la richiesta completata.
Una routine CustomDpc 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 CustomDpc, vedere DPC Objects and DPCs.For more information about CustomDpc routines, see DPC Objects and DPCs.
Un driver registra un oggetto CustomThreadedDpc per un oggetto DPC chiamando KeInitializeThreadedDpc. Per aggiungere effettivamente il DPC alla coda DPC in modo che venga eseguita la routine CustomThreadedDpc , chiamare KeInsertQueueDpc.
Per altre informazioni sull'uso delle routine CustomThreadedDpc , vedere Introduction to Threaded DPCs (Introduzione ai controller di dominio threadati).
Una routine CustomThreadedDpc può essere eseguita in IRQL = DISPATCH_LEVEL oppure può essere eseguita in IRQL = PASSIVE_LEVEL in un thread in tempo reale.
Per creare un oggetto DPC e registrare una routine CustomTimerDpc per tale oggetto, un driver deve chiamare KeInitializeDpc.
Per accodare una routine CustomTimerDpc per l'esecuzione, una routine del driver deve chiamare KeSetTimer o KeSetTimerEx, fornendo un puntatore a oggetti DPC restituito da KeInitializeDpc. Il sistema chiama la routine CustomTimerDpc alla scadenza dell'intervallo timer.
Per altre informazioni sulle routine CustomTimerDpc , vedere Oggetti timer e controller di dominio.
Esempio
Per definire una routine di callback, è necessario innanzitutto 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 CustomDpc denominata MyCustomDpc
, usare il tipo KDEFERRED_ROUTINE, come illustrato in questo esempio di codice:
KDEFERRED_ROUTINE MyCustomDpc;
Implementare quindi la routine di callback come indicato di seguito:
_Use_decl_annotations_
VOID
MyCustomDpc(
struct _KDPC *Dpc,
PVOID DeferredContext,
PVOID SystemArgument1,
PVOID SystemArgument2
)
{
// Function body
}
Requisiti
Requisito | Valore |
---|---|
Piattaforma di destinazione | Desktop |
Intestazione | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h) |
IRQL | Chiamato in DISPATCH_LEVEL. |