IRP - это структуры ядра Windows. Они используются для представления запроса ввода-вывода при его перемещении по системе ядра. Например, файловая система, которая должна считывать с блочного устройства, генерирует IRP, который представляет свой запрос на чтение, и передает его блочному устройству. Блок-устройство обрабатывает IRP, помещает результаты в IRP, отмечает его завершение и сообщает файловой системе, чтобы посмотреть IRP, чтобы получить данные. Устройства могут поддерживать очереди IRP, над которыми они работают.
IOCTL - это запрос к устройству, обычно получаемому из приложения для пользовательского пространства. Обычно они используются для запросов, которые не вписываются в стандартный API. Например, вы обычно не использовали IOCTL для открытия файла в файловой системе.
Когда программа выдает IOCTL на устройство, IRP (обычно IRP_MJ_DEVICE_CONTROL) создается в пространстве ядра, чтобы отразить этот запрос.
Таким образом, IOCTL представляет собой особый тип «разного» запроса к драйверу устройства. IRP - это структура данных для управления всеми типами запросов внутри архитектуры ядра драйвера Windows.