DRIVER_DISPATCH funzione di callback (wdm.h)
I servizi di routine di callback vari ip. Per un elenco di codici di funzione, vedere Osservazioni.
Sintassi
DRIVER_DISPATCH DriverDispatch;
NTSTATUS DriverDispatch(
[in, out] _DEVICE_OBJECT *DeviceObject,
[in, out] _IRP *Irp
)
{...}
Parametri
[in, out] 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 richiesta.
Valore restituito
Se la routine ha esito positivo, deve restituire STATUS_SUCCESS. In caso contrario, deve restituire uno dei valori di stato degli errori definiti in Ntstatus.h.
Commenti
I parametri di input per tutte le routine dispatch vengono forniti nella struttura IRP a cui punta l'IRP. I parametri aggiuntivi vengono forniti nella posizione dello stack I/O associato del driver, descritta dalla struttura IO_STACK_LOCATION e possono essere ottenuti chiamando IoGetCurrentIrpStackLocation.
In genere, tutte le routine dispatch vengono eseguite in un contesto di thread arbitrario in IRQL = PASSIVE_LEVEL, ma esistono eccezioni. Per altre informazioni, vedere Routine di invio e IRQLs.
Per altre informazioni sulle routine di invio, vedere Scrittura di routine di invio. Per altre informazioni sui provider di servizi di integrazione, vedere Gestione dei provider di servizi di integrazione.
IRP | Informazioni sull'implementazione del callback |
---|---|
IRP_MJ_CLEANUP | La routine DispatchCleanup di un driver deve essere denominata XxxDispatchCleanup, dove Xxx è un prefisso specifico del driver. La routine DriverEntry del driver deve archiviare l'indirizzo della routine DispatchCleanup in DriverObject-MajorFunction>[IRP_MJ_CLEANUP]. |
IRP_MJ_CLOSE | La routine DispatchClose di un driver deve essere denominata XxxDispatchClose, dove Xxx è un prefisso specifico del driver. La routine DriverEntry del driver deve archiviare l'indirizzo della routine DispatchClose in DriverObject-MajorFunction>[IRP_MJ_CLOSE]. |
IRP_MJ_CREATE | La routine DispatchCreate di un driver deve essere denominata XxxDispatchCreate, dove Xxx è un prefisso specifico del driver. La routine DriverEntry del driver deve archiviare l'indirizzo della routine DispatchCreate in DriverObject-MajorFunction>[IRP_MJ_CREATE]. |
IRP_MJ_CREATE o IRP_MJ_CLOSE | Un driver può fornire una singola routine DispatchCreateClose anziché le routine DispatchCreate e DispatchClose separate. La routine DispatchCreateClose di un driver deve essere denominata XxxDispatchCreateClose, dove Xxx è un prefisso specifico del driver. La routine DriverEntry del driver deve archiviare l'indirizzo della routine DispatchCreateClose in DriverObject-MajorFunction[IRP_MJ_CREATE] e in DriverObject-MajorFunction>>[IRP_MJ_CLOSE]. |
IRP_MJ_DEVICE_CONTROL | La routine DispatchDeviceControl di un driver deve essere denominata XxxDispatchDeviceControl, dove Xxx è un prefisso specifico del driver. La routine DriverEntry del driver deve archiviare l'indirizzo della routine DispatchDeviceControl in DriverObject-MajorFunction>[IRP_MJ_DEVICE_CONTROL]. Il sistema usa i flag FILE_XXX nel codice di controllo I/O per determinare se il mittente IRP ha i privilegi per inviare l'IRP all'oggetto device. I driver per Windows Server 2003 e versioni successive di Windows possono usare la routine IoValidateDeviceIoControlAccess per eseguire controlli di accesso più rigorosi all'interno di DispatchDeviceControl. |
IRP_MJ_FLUSH_BUFFERS | La routine DispatchFlushBuffers di un driver deve essere denominata XxxDispatchFlushBuffers, dove Xxx è un prefisso specifico del driver. La routine DriverEntry del driver deve archiviare l'indirizzo della routine DispatchFlushBuffers in DriverObject-MajorFunction>[IRP_MJ_FLUSH_BUFFERS]. |
IRP_MJ_INTERNAL_DEVICE_CONTROL | La routine DispatchInternalDeviceControl di un driver deve essere denominata XxxDispatchInternalDeviceControl, dove Xxx è un prefisso specifico del driver. La routine DriverEntry del driver deve archiviare l'indirizzo della routine DispatchInternalDeviceControl in DriverObject-MajorFunction>[IRP_MJ_INTERNAL_DEVICE_CONTROL]. |
IRP_MJ_PNP | La routine DispatchPnP di un driver deve essere denominata XxxDispatchPnP, dove Xxx è un prefisso specifico del driver. La routine DriverEntry del driver deve archiviare l'indirizzo della routine DispatchPnP in DriverObject-MajorFunction>[IRP_MJ_PNP]. |
IRP_MJ_POWER | La routine DispatchPower di un driver deve essere denominata XxxDispatchPower, dove Xxx è un prefisso specifico del driver. La routine DriverEntry del driver deve archiviare l'indirizzo della routine DispatchPower in DriverObject-MajorFunction>[IRP_MJ_POWER]. |
IRP_MJ_QUERY_INFORMATION | La routine DispatchQueryInformation di un driver deve essere denominata XxxDispatchQueryInformation, dove Xxx è un prefisso specifico del driver. La routine DriverEntry del driver deve archiviare l'indirizzo della routine DispatchQueryInformation in DriverObject-MajorFunction>[IRP_MJ_QUERY_INFORMATION]. |
IRP_MJ_READ | La routine DispatchRead di un driver deve essere denominata XxxDispatchRead, dove Xxx è un prefisso specifico del driver. La routine DriverEntry del driver deve archiviare l'indirizzo della routine DispatchRead in DriverObject-MajorFunction>[IRP_MJ_READ]. |
IRP_MJ_READ o IRP_MJ_WRITE | Un driver può fornire una singola routine DispatchReadWrite anziché routine DispatchRead e DispatchWrite separate. La routine DispatchReadWrite di un driver deve essere denominata XxxDispatchReadWrite, dove Xxx è un prefisso specifico del driver. La routine DriverEntry del driver deve archiviare l'indirizzo della routine DispatchReadWrite in DriverObject-MajorFunction[IRP_MJ_READ] e in DriverObject-MajorFunction>>[IRP_MJ_WRITE]. |
IRP_MJ_SET_INFORMATION | La routine DispatchSetInformation di un driver deve essere denominata XxxDispatchSetInformation, dove Xxx è un prefisso specifico del driver. La routine DriverEntry del driver deve archiviare l'indirizzo della routine DispatchSetInformation in DriverObject-MajorFunction>[IRP_MJ_SET_INFORMATION]. |
IRP_MJ_SHUTDOWN | La routine DispatchShutdown di un driver deve essere denominata XxxDispatchShutdown, dove Xxx è un prefisso specifico del driver. La routine DriverEntry del driver deve archiviare l'indirizzo della routine DispatchShutdown in DriverObject-MajorFunction>[IRP_MJ_SHUTDOWN]. Inoltre, per ricevere IRP_MJ_SHUTDOWN richieste, un driver deve chiamare IoRegisterShutdownNotification o IoRegisterLastChanceShutdownNotification per registrare la routine DispatchShutdown con il sistema. |
IRP_MJ_SYSTEM_CONTROL | La routine DispatchSystemControl di un driver deve essere denominata XxxDispatchSystemControl, dove Xxx è un prefisso specifico del driver. La routine DriverEntry del driver deve archiviare l'indirizzo della routine DispatchSystemControl in DriverObject-MajorFunction>[IRP_MJ_SYSTEM_CONTROL]. |
IRP_MJ_WRITE | La routine DispatchWrite di un driver deve essere denominata XxxDispatchWrite, dove Xxx è un prefisso specifico del driver. La routine DriverEntry del driver deve archiviare l'indirizzo della routine DispatchWrite in DriverObject-MajorFunction>[IRP_MJ_WRITE]. |
Esempio
Per definire una routine di callback, è prima necessario specificare 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 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.
Ad esempio, per definire una routine di callback DispatchCleanup denominata MyDispatchCleanup
, usare il tipo di DRIVER_DISPATCH, come illustrato in questo esempio di codice:
DRIVER_DISPATCH MyDispatchCleanup;
Implementare quindi la routine di callback come indicato di seguito:
_Use_decl_annotations_
NTSTATUS
MyDispatchCleanup(
struct _DEVICE_OBJECT *DeviceObject,
struct _IRP *Irp
)
{
// Function body
}
Il tipo di funzione DRIVER_DISPATCH viene 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 the_Use_decl_annotations_annotation alla definizione della funzione. The_Use_decl_annotations_annotation garantisce che vengano usate le annotazioni applicate al tipo di funzione DRIVER_DISPATCH 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 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 PASSIVE_LEVEL (vedere la sezione Osservazioni). |