ddk 派遣函数

Windows驱动派遣函数解析
对 Windows驱动开发技术详解 第七章的(派遣函数)自我理解
2009年09月19日 星期六 14:54

对 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。

///////////////////////////////////////////////////////////////////////////////

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值