Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Безопасная обработка IRP, содержащих коды управления ввода-вывода, зависит от правильного определения кодов IOCTL и тщательного изучения параметров, которые драйвер получает с IRP.
При определении новых кодов IOCTL используйте следующие правила:
Всегда указывайте значение FunctionCode , равное или больше 0x800.
Всегда укажите значение RequiredAccess . Диспетчер операций ввода-вывода не отправляет IOCTLs, если вызывающая сторона имеет недостаточно прав доступа.
Не определяйте коды IOCTL, которые позволяют вызывающим пользователям читать или записывать неспецифические области памяти ядра.
При обработке кодов IOCTL в драйвере используйте следующие правила:
Каждый раз, когда диспетчерские подпрограммы драйвера проверяют полученные коды IOCTL, они всегда должны проверять всё 32-разрядное значение.
Драйверы могут использовать IoValidateDeviceIoControlAccess для более строгой динамической проверки доступа, чем та, которая указана значением RequiredAccess в определении кода управления вводом-выводом.
Никогда не считывайте или не записывайте больше данных, чем может содержать буфер, на который указывает Irp-AssociatedIrp.SystemBuffer>. Поэтому всегда проверяйте Parameters.DeviceIoControl.InputBufferLength или Parameters.DeviceIoControl.OutputBufferLength в структуре IO_STACK_LOCATION , чтобы определить ограничения буфера.
Всегда обнуляйте буферы, которые выделяются драйвером и будут содержать данные, предназначенные для приложения, из которого поступил запрос IOCTL. Таким образом, вы не будете случайно копировать конфиденциальные данные в приложение.
Для передачи METHOD_IN_DIRECT и METHOD_OUT_DIRECT следуйте вышеуказанным правилам. Кроме того, проверьте возвращаемое значение NULL из MmGetSystemAddressForMdlSafe, указывающее, что сопоставление завершилось сбоем или что буфер нулевой длины был предоставлен.
Для передачи METHOD_NEITHER следуйте правилам, указанным в разделе "Использование ни буферизованного, ни прямого ввода-вывода".