Nota
L'accesso a questa pagina richiede l'autorizzazione. Puoi provare ad accedere o a cambiare directory.
L'accesso a questa pagina richiede l'autorizzazione. Puoi provare a cambiare directory.
L'elaborazione sicura degli IRP che contengono codici di controllo I/O dipende dalla definizione corretta dei codici IOCTL e dall'analisi attenta dei parametri ricevuti dal driver dall'IRP.
Quando si definiscono nuovi codici IOCTL, usare le regole seguenti:
Specificare sempre un valore functionCode uguale o maggiore di 0x800.
Specificare sempre un valore RequiredAccess . Il gestore di I/O non invia IOCTLs se il chiamante dispone di diritti di accesso insufficienti.
Non definire codici IOCTL che consentono ai chiamanti di leggere o scrivere aree non specifiche della memoria del kernel.
Quando si elaborano i codici IOCTL all'interno di un driver, usare le regole seguenti:
Ogni volta che le routine di dispatch di un driver testano i codici IOCTL ricevuti, devono sempre testare l'intero valore a 32 bit.
I driver possono usare IoValidateDeviceIoControlAccess per eseguire in modo dinamico un controllo di accesso più rigoroso rispetto a quello specificato dal valore RequiredAccess nella definizione del codice di controllo I/O.
Non leggere o scrivere più dati di quanti il buffer a cui punta Irp-AssociatedIrp.SystemBuffer possa contenere. Controllare quindi sempre Parameters.DeviceIoControl.InputBufferLength o Parameters.DeviceIoControl.OutputBufferLength nella struttura IO_STACK_LOCATION per determinare i limiti del buffer.
Azzerare sempre i buffer che il driver ha allocato, i quali conterranno i dati destinati a un'applicazione che ha originato una richiesta IOCTL. In questo modo, i dati sensibili non verranno copiati accidentalmente nell'applicazione.
Per i trasferimenti di METHOD_IN_DIRECT e METHOD_OUT_DIRECT, seguire le regole riportate sopra. Inoltre, verificare la presenza di un valore restituito NULL da MmGetSystemAddressForMdlSafe, che indica che il mapping non è riuscito o che è stato fornito un buffer di lunghezza zero.
Per i trasferimenti METHOD_NEITHER, seguire le regole fornite in Uso di I/O né in modalità buffered né in modalità diretta.