WEB开发网
开发学院操作系统windows 2008 深度剖析WinPcap之(三)——所涉及的Windows驱动基... 阅读

深度剖析WinPcap之(三)——所涉及的Windows驱动基础知识

 2009-09-11 00:00:00 来源:WEB开发网   
核心提示: 一般来说驱动程序都是在DriverEntry函数中注册派遣函数的,在DriverEntry的驱动对象pDriverObject中,深度剖析WinPcap之(三)——所涉及的Windows驱动基础知识(6),有个函数指针数组MajorFunction,每个数组元素都记录着一个派遣函数的地址,指的是

一般来说驱动程序都是在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

上一页  1 2 3 4 5 6 

Tags:深度 剖析 WinPcap

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接