2024年4月11日发(作者:)

标 题: 【原创】【成果3.5】驱动和应用层的三种通信方式

作 者: sislcb

时 间: 2008-01-04,11:57

链 接: /?t=57666

驱动程序和客户应用程序经常需要进行数据交换,但我们知道驱动程序和客户应用程

序可能不在同一个地址空间,因此操作系统必须解决两者之间的数据交换。

驱动层和应用层通信,主要是靠DeviceIoControl函数,下面是该函数的原型:

BOOL DeviceIoControl (

HANDLE hDevice, // 设备句柄

DWORD dwIoControlCode, // IOCTL请求操作代码

LPVOID lpInBuffer, // 输入缓冲区地址

DWORD nInBufferSize, // 输入缓冲区大小

LPVOID lpOutBuffer, // 输出缓冲区地址

DWORD nOutBufferSize, // 输出缓冲区大小

LPDWORD lpBytesReturned, // 存放返回字节数的指针

LPOVERLAPPED lpOverlapped // 用于同步操作的Overlapped结构体指针

);

dwIoControlCode

要进行操作的控制码。驱动程序可以通过CTL_CODE宏来组合定义一个控制码,并在

IRP_MJ_DEVICE_CONTROL的实现中进行控制码的操作。在驱动层,irpStack->Parame

rolCode表示了这个控制码。

IOCTL请求有四种缓冲策略,下面一一介绍。

1、 输入输出缓冲I/O(METHOD_BUFFERED)

2、 直接输入缓冲输出I/O(METHOD_IN_DIRECT)

3、 缓冲输入直接输出I/O(METHOD_OUT_DIRECT)

4、 上面三种方法都不是(METHOD_NEITHER)

为了对这些类型更详细的描述,请看msdn上的解释,我抄录如下:

"缓冲"方法(METHOD_BUFFERED)