Condividi tramite


Routine DispatchDeviceControl e DispatchInternalDeviceControl

Le routine di invio di un driver (vedere DRIVER_DISPATCH) gestiscono gli INDIRIZZI IP con codici di funzione I/O di IRP_MJ_DEVICE_CONTROL e IRP_MJ_INTERNAL_DEVICE_CONTROL rispettivamente.

Per ogni tipo comune di dispositivo periferico, il sistema definisce un set di codici di controllo I/O per le richieste di IRP_MJ_DEVICE_CONTROL . I nuovi driver per ogni tipo di dispositivo devono supportare queste richieste. Nella maggior parte dei casi, questi codici di controllo I/O pubblici per ogni tipo di dispositivo non vengono esportati in applicazioni in modalità utente.

Alcuni di questi codici di controllo I/O definiti dal sistema vengono usati da driver di livello superiore che creano INDIRIZZI DI rete per il driver di dispositivo sottostante chiamando IoBuildDeviceIoControlRequest. Altri vengono usati dai componenti Win32 per comunicare con un driver di dispositivo sottostante chiamando la funzione Win32 DeviceIoControl (descritta in Microsoft Windows SDK documentazione) che, a sua volta, chiama un servizio di sistema. Il gestore I/O configura un'IRP e archivia il codice della funzione principale IRP_MJ_DEVICE_CONTROL e il codice di controllo I/O specificato nella struttura di IO_STACK_LOCATION in Parameters.DeviceIoControl.IoControlCode. Quindi, il gestore I/O chiama la routine DispatchDeviceControl del driver di livello più alto nella catena.

Per determinati driver forniti dal sistema progettati per interagire con e supportare nuovi driver, il sistema operativo definisce anche un set di codici di controllo I/O per le richieste di IRP_MJ_INTERNAL_DEVICE_CONTROL . Nella maggior parte dei casi, questi codici di controllo di I/O pubblici consentono ai driver di componente aggiuntivo di livello superiore di interagire con un driver di dispositivo sottostante.

Ad esempio, i driver paralleli forniti dal sistema supportano un set di codici di controllo I/O interni che i driver forniti dal fornitore inviano nelle richieste di IRP_MJ_INTERNAL_DEVICE_CONTROL . Per altre informazioni, vedere Richieste di controllo del dispositivo interno per porte parallele e richieste di controllo del dispositivo interno per i dispositivi paralleli.

Quasi tutte le operazioni richieste tramite codici di controllo I/O definiti dal sistema usano l'I/O con buffer, perché questo tipo di richiesta richiede raramente il trasferimento di grandi quantità di dati. Vale a dire, anche i driver che configurano gli oggetti dispositivo per I/O diretti vengono inviati IRP per le richieste di controllo dei dispositivi con dati da trasferire o fuori dal buffer in Irp-AssociatedIrp.SystemBuffer> (ad eccezione di determinati tipi di driver di dispositivo di livello più alto con driver multimediali Win32 strettamente associati).

Inoltre, un driver può definire un set di codici di controllo I/O privati che altri driver possono usare per comunicare con esso. I nuovi codici di controllo I/O pubblici possono essere aggiunti al sistema solo con la collaborazione di Microsoft Corporation, perché i codici di controllo I/O pubblici sono incorporati nel sistema operativo stesso.

Per informazioni specifiche sul set di codici di controllo di I/O pubblici che devono supportare diversi tipi di driver e sulla definizione di codici di controllo I/O privati, vedere le sezioni di riferimento specifiche del dispositivo di Windows Driver Kit (WDK).