Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
El procesamiento seguro de los IRP que contienen códigos de control de E/S depende de definir correctamente los códigos IOCTL y examinar cuidadosamente los parámetros que recibe el controlador con el IRP.
Al definir nuevos códigos IOCTL, use las siguientes reglas:
Especifique siempre un valor functionCode igual o mayor que 0x800.
Especifique siempre un valor RequiredAccess . El administrador de E/S no envía IOCTLs si el autor de la llamada no tiene suficientes derechos de acceso.
No defina códigos IOCTL que permitan a los autores de llamadas leer o escribir áreas no específicas de la memoria del kernel.
Al procesar códigos IOCTL dentro de un controlador, use las reglas siguientes:
Siempre que las rutinas de envío de un controlador prueben los códigos IOCTL recibidos, siempre deben probar el valor completo de 32 bits.
Los controladores pueden usar IoValidateDeviceIoControlAccess para realizar dinámicamente una comprobación de acceso más estricta que la especificada por el valor RequiredAccess en la definición del código de control de E/S.
Nunca lea o escriba más datos que el búfer al que apunta Irp-AssociatedIrp.SystemBuffer> puede contener. Por lo tanto, compruebe siempre Parameters.DeviceIoControl.InputBufferLength o Parameters.DeviceIoControl.OutputBufferLength en la estructura de IO_STACK_LOCATION para determinar los límites del búfer.
Siempre cero búferes asignados por controladores que contendrán datos destinados a una aplicación que originó una solicitud IOCTL. De este modo, no copiará accidentalmente datos confidenciales en la aplicación.
Para las transferencias de METHOD_IN_DIRECT y METHOD_OUT_DIRECT, siga las reglas anteriores. Además, compruebe si hay un valor devuelto NULL de MmGetSystemAddressForMdlSafe, lo que indica que se produjo un error en la asignación o que se proporcionó un búfer de longitud cero.
Para las transferencias de METHOD_NEITHER, siga las reglas que se proporcionan en Uso de I/O sin búfer ni directa.