4

我一直在阅读有关驱动程序开发的一些代码项目文章,但对 IOCTL 和 IRP 有一些困惑。从我所看到的来看,IOCTL 似乎是从用户模式发送的,并被转换为 IRP。IRP 是操作系统和设备之间的消息,但这似乎与我正在阅读的描述不一致......让我认为我可能遗漏了一些东西。

TLDR IOCTL 和 IRP 有什么区别?

4

2 回答 2

15

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

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

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

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

于 2013-09-19T17:47:43.830 回答
4

IOCTL 是 IO 控制代码的助记符,或者是一个 32 位值,其中定义了位字段,为 IO 管理器提供缓冲和其他信息。IRP 或 IO 请求数据包是由 IO 管理器创建的结构或已定义的内存块,其中包含驱动程序对 IO 请求执行给定操作所需的所有信息,包括 IOCTL。IOCTL 用于内核和用户模式,但 IRP 仅在内核和目标驱动程序或驱动程序堆栈内有效。

从用户空间应用 DeviceIoControl() -> kernel32.dll -> ntdll.dll -> 从用户模式到内核模式的那一刻 -> I/O Manager -> IRP

于 2014-05-21T06:06:51.623 回答