深度剖析WinPcap之(三)——所涉及的Windows驱动基础知识
2009-09-11 00:00:00 来源:WEB开发网一般来说驱动程序都是在DriverEntry函数中注册派遣函数的。在DriverEntry的驱动对象pDriverObject中,有个函数指针数组MajorFunction,每个数组元素都记录着一个派遣函数的地址。通过设置该数组,可以将不同类型的IRP和对应的派遣函数关联起来。
大部分的IRP都源于文件I/O处理的API,如CreateFile、ReadFile、WriteFile、CloseHandle等函数会使操作系统产生IRP_MJ_CREATE、IRP_MJ_READ、IRP_ MJ_WRITE、IRP_MJ_CLOSE等不同类型的IRP,这些IRP会被传送到驱动程序中,调用对应的派遣函数。此外,内核中的文件I/O处理函数,如ZwCreateFile、ZwReadFile、ZwWriteFile、ZwClose也同样会创建IRP_MJ_CREATE、IRP_MJ_READ、lRP_MJ_WRITE、IRP_MJ_CLOSE等IRP,并将lRP传送到驱动程序中,调用对应的派遣函数。
处理IRP最简单的方法就是在相应的派遣函数中,将IRP的状态设置为成功,然后结束IRP的请求,并让派遣函数返回成功。结束IRP的请求使用函数IoCompleteRequest。下面为NPF中NPF_Close的代码,为处理IRP_MJ_CLOSE类型IRP的派遣函数。
NTSTATUS NPF_Close(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)
{
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return STATUS_SUCCESS;
}
函数NPF_Close设置IRP的完成状态为STATUS_SUCCESS。这样发起请求的 API(如CloseHandle)将会返回TRUE。相反,如果将IRP的完成状态设置为不成功,发起I/O请求的 API(如CloseHandle)将会返回FALSE。出现该情况时,可以使用GetLastError API获得错误代码。所得的错误代码会和IRP设置的状态一致。
除了设置IRP的完成状态,函数还要设置这个IRP请求操作了多少字节。在本代码中,将操作字节数设置成了0。如果是ReadFile产生的IRP,这个字节数代表从设备读了多少字节。如果是WriteFile产生的IRP,这个字节数代表对设备写了多少字节。最后函数通过IoCompleteR0quest函数将IRP请求结束。
IoCompleteRequest的声明如下:
VOID IoCompleteRequest(
IN PIRP Irp,
IN CCHAR PriorityBoost
);
参数Irp代表需要被结束的IRP。参数PriorityBoost代表线程恢复时的优先级别,指的是被阻塞的线程以何种优先级恢复运行。一般情况下,优先级设置为IO_NO_INCREMENT。
出处: http://eslxf.blog.51cto.com/918801/196912
- ››深度解释攻击linux服务器的四种级别
- ››剖析java.util.concurrent锁
- ››剖析Android智能手机系统的更多功能
- ››深度分析地方社区网站的内容定位
- ››剖析Windows Azure Platform框架与组成
- ››剖析使用 ObjectOutputStream 可能引起的内存泄漏...
- ››剖析EWebEditor编辑器漏洞攻击案例
- ››剖析开源云:构建 Infrastructure as a Service 块...
- ››深度剖析 Android 和 iPhone OS
- ››深度分析:HTML5能否成为Flash终结者
- ››深度挖掘 更多Windows 7快捷模式
- ››深度挖掘 Windows 7快捷模式
更多精彩
赞助商链接