В чем разница между IOCTL и IRP

Я работал над некоторыми codeproject. статьи о разработке драйверов, но есть некоторая путаница в отношении IOCTL и IRP. Из того, что я видел, кажется, что IOCTL отправляются из пользовательского режима и транслируются в IRP. И IRP - это сообщения между ОС и устройством, но это, похоже, не совпадает с описаниями, которые я читаю... что заставляет меня думать, что я мог что-то упустить.

TLDR В чем разница между IOCTL и IRP?


person cylus    schedule 19.09.2013    source источник


Ответы (2)


IRP — это структуры ядра Windows. Они используются для представления запроса ввода-вывода, когда он перемещается по системе ядра. Например, файловая система, которой требуется чтение с блочного устройства, генерирует IRP, представляющий ее запрос на чтение, и передает его блочному устройству. Блочное устройство обрабатывает IRP, помещает результаты в IRP, помечает его как выполненное и указывает файловой системе просмотреть IRP для получения данных. Устройства могут поддерживать очереди IRP, над которыми они работают.

IOCTL — это запрос к устройству, обычно полученный от приложения пользовательского пространства. Обычно они используются для запросов, которые не вписываются в стандартный API. Например, вы обычно не используете IOCTL для открытия файла в файловой системе.

Когда программа отправляет IOCTL на устройство, IRP (обычно IRP_MJ_DEVICE_CONTROL) создается в пространстве ядра для отражения этого запроса.

Таким образом, IOCTL — это особый тип «разного» запроса к драйверу устройства. IRP — это структура данных для управления всеми видами запросов внутри архитектуры ядра драйвера Windows.

person David Schwartz    schedule 19.09.2013

IOCTL является мнемоническим кодом управления вводом-выводом или 32-битным значением с определенными в нем битовыми полями, которые предоставляют диспетчеру ввода-вывода информацию о буферизации и другую информацию. IRP или пакет запроса ввода-вывода — это структура или определенный фрагмент памяти, созданный диспетчером ввода-вывода, который содержит всю информацию, необходимую драйверу для выполнения заданного действия над запросом ввода-вывода, включая IOCTL. IOCTL используется как в режиме ядра, так и в пользовательском режиме, но IRP действителен только в пределах ядра и целевого драйвера или стека драйверов.

из пользовательского приложения DeviceIoControl() -> kernel32.dll -> ntdll.dll -> момент перехода из пользовательского режима в режим ядра -> Диспетчер ввода-вывода -> IRP

person PU.    schedule 21.05.2014