DDK翻译:IOCTL指令简介

IO控制指令(IOCTLs)主要用于用户态应用程序和驱动之间的沟通或者设备栈内驱动之间的沟通,这种指令通过IRP来进行传送。

 

 用户态应用程序通过调用DeviceIoControl来向驱动程序发送IOCTLs,有关DeviceIoControl的详细内容,微软的Windows SDK文档中有详细的介绍。对DeviceIoControl的调用会促使I/O管理器产生一个IRP_MJ_DEVICE_CONTROL请求并且发送给当前设备栈最顶端的驱动程序。

 

另外,上层驱动程序可以通过产生和发送IRP_MJ_DEVICE_CONTROL或者IRP_MJ_INTERNAL_DEVICE_CONTROL请求的方式向下层驱动程序发送IO控制指令。驱动程序在DispatchDeviceControl和DispatchInternalDeviceControl这两个例程中处理这些请求。

 

注:用户态应用程序不能发送IRP_MJ_INTERNAL_DEVICE_CONTROL请求。 IO控制指令也分私有和公共,有些是私有的,有些是公共的。

公共的IO控制指令一般都是一些系统定义的具有代表性的指令,并且这些指令已经写入微软的文档之中,要么在Windows Driver Kit (WDK)里边,要么在Windows SDK中。它们或许通过用户态组件调用DeviceIoControl来发送,或者通过IRP_MJ_DEVICE_CONTROL和 IRP_MJ_INTERNAL_DEVICE_CONTROL请求从一个内核态驱动发送给另外一个驱动。

 

从另一方面,私有IO控制指令专门用于设备供应商提供的软件组件之间的消息传递。一般而言,私有的IO控制指令的定义都作为供应商的特色而保存在供应商提供的头文件里,并且这种头文件没有被公开。像公共的IO控制指令一样,它们或许通过用户态组件调用DeviceIoControl来发送,或者通过IRP_MJ_DEVICE_CONTROL和 IRP_MJ_INTERNAL_DEVICE_CONTROL请求从一个内核态驱动发送给另外一个驱动。

 

当然,公共IO控制指令和私有的IO控制指令在编码上没有任何区别。不过,与那些系统定义的IO控制指令相比,设备供应商提供的IO控制指令在内部实现上还是有很多区别的。如果当前的公共IO控制指令不能满足你的需求,你可以自己定义一个私有的指令用来和其他软件组件进行消息传递。




此文章来自于【http://blog.csdn.net/caperingrabbit/article/details/5134051】

你可能感兴趣的:(windows,驱动开发)