我一直在研究一些关于驱动程序开发的代码工程文章,但是对IOCTL和IRPs有一些混淆。据我所见,IOCTL似乎是从用户模式发送的,并被转换为IRPs。IRPs是操作系统和设备之间的消息,但这似乎与我所读到的描述不一致…让我觉得我可能错过了什么。
TLDR IOCTL和IRP有什么区别?
发布于 2013-09-19 17:47:43
IRPs是Windows内核结构。当I/O请求在内核系统中移动时,它们被用来表示它。例如,需要从块设备读取的文件系统生成表示其读取请求的IRP,并将其交给块设备。块设备处理IRP,将结果放入IRP,标记它完成,并告诉文件系统查看IRP以获取数据。设备可以维护他们正在处理的IRPs队列。
IOCTL是对设备的请求,通常是从用户空间应用程序接收的.它们通常用于不适合标准API的请求。例如,通常不会使用IOCTL来打开文件系统上的文件。
当程序向设备发出IOCTL时,在内核空间中创建一个IRP (通常是控制)来反映该请求。
总之,IOCTL是对设备驱动程序的一种特殊类型的“杂项”请求。IRP是一种数据结构,用于管理Windows驱动程序内核架构中的各种请求。
发布于 2014-05-21 06:06:51
IOCTL是IO控制代码的助记符,或32位值,其中定义了位字段,为IO管理器提供缓冲和其他信息。IRP或IO请求包是IO管理器创建的结构或定义的内存块,其中包含驱动程序对IO请求(包括IOCTL )执行给定操作所需的所有信息。IOCTL用于内核和用户模式,但IRP仅在内核和目标驱动程序或驱动程序堆栈中有效。
从用户空间应用程序DeviceIoControl() -> kernel32.dll -> ntdll.dll ->到内核模式-> I/O Manager -> IRP
https://stackoverflow.com/questions/18901467
复制相似问题