Introduzione ai codici di controllo di I/O

I codici di controllo I/O (IOCTL) vengono usati per la comunicazione tra applicazioni e driver in modalità utente o per la comunicazione interna tra i driver in uno stack. I codici di controllo di I/O vengono inviati usando i provider di integrazione.

Le applicazioni in modalità utente inviano IOCTLs ai driver chiamando DeviceIoControl, descritto in Microsoft Windows SDK documentazione. Le chiamate a DeviceIoControl causano la creazione di una richiesta di IRP_MJ_DEVICE_CONTROL da parte del gestore di I/O e l'invio al driver più alto.

Inoltre, i driver di livello superiore possono inviare IOCTLs ai driver di livello inferiore creando e inviando richieste di IRP_MJ_DEVICE_CONTROL o di IRP_MJ_INTERNAL_DEVICE_CONTROL . I driver elaborano queste richieste nelle routine DispatchDeviceControl e DispatchInternalDeviceControl . Le applicazioni in modalità utente non possono inviare richieste di IRP_MJ_INTERNAL_DEVICE_CONTROL .

Alcuni IOCTL sono "pubblici" e alcuni sono "privati". IOCTL pubblici sono in genere definiti dal sistema e documentati da Microsoft, in Windows Driver Kit (WDK) o Windows SDK. Possono essere inviati tramite chiamate di un componente in modalità utente a DeviceIoControl oppure possono essere inviate da un driver in modalità kernel a un altro, usando IRP_MJ_DEVICE_CONTROL o IRP_MJ_INTERNAL_DEVICE_CONTROL richieste. Esempi di IOCTL pubblici includono codici di controllo I/O porta SCSI e richieste di controllo interno del mouse I8042prt.

IOCTLs privati, d'altra parte, sono destinati a essere utilizzati esclusivamente dai componenti software di un fornitore per comunicare tra loro. IOCTLs privati sono in genere definiti in un file di intestazione fornito dal fornitore e non sono documentati pubblicamente. Come gli IOCTL pubblici, possono essere inviati tramite chiamate di un componente in modalità utente a DeviceIoControl oppure possono essere inviate da un driver in modalità kernel a un altro, usando richieste IRP_MJ_DEVICE_CONTROL o IRP_MJ_INTERNAL_DEVICE_CONTROL .

Non esiste alcuna differenza tra il codice di IOCTL pubblico e privato. Esistono tuttavia differenze nei codici interni che possono essere usati nei codici IOCT definiti dal fornitore, rispetto a quelli usati per IOCTL definiti dal sistema. Se gli IOCTL pubblici disponibili non soddisfano le proprie esigenze, è possibile definire nuovi IOCTL privati che i componenti software possono usare per comunicare tra loro. Per altre informazioni, vedere Definizione dei codici di controllo di I/O.