对 Windows驱动开发技术详解 第七章的(派遣函数)自我理解
BY:ALALMN—飞龙 QQ:316118740 BLOG:http://hi.baidu.com/alalmn
派遣函数其实就相当于应用程序的事件响应一样。
///
派遣函数
就是在入口点下(DriverEntry)的
pDriverObject->MajorFunction[......]
pDriverObject->MajorFunction[IRP_MJ_CREATE] = HelloDDKDispatchRoutine;
这就叫做派遣函数
///
IRP类型
IRP_MJ_CREATE 创建设备,CreatFile会产生此IRP
IRP_MJ_CLOSE 关闭设备,CloseHandle会产生此IRP
IRP_MJ_CLEANUP 清除工作,CloseHandle会产生此IRP
IRP_MJ_DEVICE_CONTROL DeviceIoControl函数会产生此IRP
IRP_MJ_PNP 即插即用消息,NT式驱动不支持此种IRP,只有WDM驱动才支持此种IRP
IRP_MJ_POWER 在操作系统处理电源消息时,产生此IRP
IRP_MJ_QUERY_INFORMATION 获取文件长度,GetFileSize会产生此IRP
IRP_MJ_READ 读取设备内容,ReadFile会产生此IRP
IRP_MJ_SET_INFORMATION 设置文件长度,GetFileSize会产生此IRP
IRP_MJ_SHUTDOWN 关闭系统前会产生此IRP
IRP_MJ_SYSTEM_CONTROL 系统内部产生的控制信息,类似于内核调用DeviceIoControl函数
IRP_MJ_WRITE 对设备进行WriteFile时会产生此IRP
///
结束IRP
VOID
IoCompleteRequest(
IN PIRP Irp, //代表需要被结束的IRP。
IN CCHAR PriorityBoost //代表线程恢复时的优先级别。
);
PriorityBoost优先级别。
IO_NO_INCREMENT 不增加优先级
IO_CD_ROM_INCREMENT 光驱设备增加优先级
IO_DISK_INCREMENT 磁盘设备增加优先级
IO_KEYBOARD_INCREMENT 键盘设备增加优先级
IO_MOUSE_INCREMENT 鼠标设备增加优先级
IO_NAMED_PIPE_INCREMENT 命名管道增加优先级
IO_NETWORK_INCREMENT 网络设备增加优先级
IO_PARALLEL_INCREMENT 并口设备增加优先级
IO_SERLAL_INCREMENT 串口设备增加优先级
IO_SOUND_INCREMENT 声卡设备增加优先级
IO_VIDEO_INCREMENT 视频设备增加优先级
SEMAPHORE_INCREMENT 信号灯增加优先级
///
H:/Windows驱动开发技术详解/chapter07/DispatchTest/Test/
运行下面的程序用Dbgview监控 会发现出现了这个消息
KdPrint(("Enter HelloDDKDispatchRoutine/n"));
KdPrint(("Leave HelloDDKDispatchRoutine/n"));
这是应为Test.EXE
使用了CreateFile文件操作
而在驱动程序中定义了pDriverObject->MajorFunction[IRP_MJ_CREATE] = HelloDDKDispatchRoutine;
IRP_MJ_CREATE 创建设备,CreatFile会产生此IRP
这样就启动了HelloDDKDispatchRoutine函数
其实很好理解就是跟应用程序程序的事件响应是一样的。
///
派遣函数设置pIrp->IoStatus.Information 告诉ReadFile实际读取了多少字节。这个数值对应ReadFile的第4个参数。
读取文件
BOOL ReadFile(
HANDLE hFile, //文件的句柄
LPVOID lpBuffer, //用于保存读入数据的一个缓冲区
DWORD nNumberOfBytesToRead, //要读入的字符数
LPDWORD lpNumberOfBytesRead, //指向实际读取字节数的指针
LPOVERLAPPED lpOverlapped //如文件打开时指定了FILE_FLAG_OVERLAPPED,那么必须,用这个参数引用一个特殊的结构。该结构定义了一次异步读取操作。否则,应将这个参数设为NULL
);
写入文件
BOOL WriteFile(
HANDLE hFile, // 文件句柄
LPCVOID lpBuffer, // 数据缓存区指针
DWORD nNumberOfBytesToWrite, // 你要写的字节数
LPDWORD lpNumberOfBytesWritten, // 用于保存实际写入字节数的存储区域的指针
LPOVERLAPPED lpOverlapped // OVERLAPPED结构体指针
);
///
DeviceIoControl与驱动交互
BOOL DeviceIoControl(
HANDLE hDevice, //已经打开的设备
DWORD dwIoControlCode, //控制码
LPVOID lpInBuffer, //输入缓冲区
DWORD nInBufferSize, //输入缓冲区大小
LPVOID lpOutBuffer, //输出缓冲区
DWORD nOutBufferSize, //输出缓冲区大小
LPDWORD lpBytesReturned, //实际返回字节数
LPOVERLAPPED lpOverlapped //是否OVERLAP操作
);
///
#define CTL_CODE(DeviceType, Function, Method, Access)
DeviceType //设备对象的类型,这个类型应和创建设备(IoCreateDevice)时的类型相匹配。一般是形如FILE_DEVICE_XX的宏。
Function //这是驱动程序定义的IOCTL码。其中:
//0X0000到0X7FFF:为微软保留。
//0X800到0XFFF:由程序员自己定义。
Method //这个是操作模式,可以是一列四种模式之一。
//METHOD_BUFFERED 使用缓冲区方式操作。
//METHOD_IN_DIRECT 使用直接写方式操作。
//METHOD_OUT_DIRECT 使用直接读方式操作。
//METHOD_NEITHER 使用其他方式操作。
Access //访问权限,如果没有特殊要求,一般使用FILE_ANY_ACCESS。
///