IOCTL和IRP之间有什么区别

cyl*_*lus 3 c kernel driver wdk

我一直在研究驱动程序开发的一些代码项目文章,但对IOCTL和IRP有一些困惑.从我所看到的,似乎IOCTL是从usermode发送的,并转换为IRP.而且IRP是操作系统和设备之间的消息,但这似乎与我正在阅读的描述排列在一起......让我觉得我可能会遗漏一些东西.

TLDR IOCTL和IRP有什么区别?

Dav*_*rtz 12

IRP是Windows内核结构.它们用于表示在内核系统中移动时的I/O请求.例如,需要从块设备读取的文件系统生成表示其读取请求的IRP并将其交给块设备.块设备处理IRP,将结果放入IRP,标记它完成,并告诉文件系统查看IRP以获取数据.设备可以维护他们正在处理的IRP队列.

IOCTL是对设备的请求,通常从用户空间应用程序接收.它们通常用于不适合标准API的请求.例如,您通常不会使用IOCTL在文件系统上打开文件.

当程序向设备发出IOCTL时,会在内核空间中创建IRP(通常为IRP_MJ_DEVICE_CONTROL)以反映该请求.

总之,IOCTL是对设备驱动程序的特殊类型的"杂项"请求.IRP是用于管理Windows驱动程序内核体系结构内的各种请求的数据结构.