庖丁解牛-----winpcap源码彻底解密(五)
来源:互联网 发布:网络游戏音乐 编辑:程序博客网 时间:2024/06/05 14:07
庖丁解牛-----winpcap源码彻底解密(五)
有人问我,wpcap.dll,packet.dll和npf.sys是怎么关联起来的,即通过调用wpcap.dll的api,怎么调用到驱动中的函数的呢?
今天我就在这里讲讲应用程序和驱动之间的通信,windows提供以下win32 api函数和驱动通信的。
Win32 API
对文件操作
对设备操作
CreateFile
打开或创建文件操作
打开或创建设备
CloseHandle
关闭文件
关闭设备
ReadFile
读文件
读设备
WriteFile
写文件
写设备
CancelIo
取消读写文件操作
取消读写设备操作
DeviceIoControl
无
对设备进行特殊操作
以 CreateFile api为例子进行讲解,应用程序调用CreateFile Api --->win 32 子系统(kernel32.dll)调用NtCreateFile Native Api(ntdll.dll)----->调用NtCreateFile系统服务进入内核模式---->通过I/O管理器创建并发送IRP-->设备驱动--->硬件
NtCreateFile函数的作用是穿越用户模式的边界,进入到内核模式,这是通过软中断实现的,进入到内核模式后,会调用系统的服务函数,调用同名的系统服务NtCreateFile,NtCreateFile系统函数通过调用I/O管理器,创建IRP并传输到设备驱动程序中。
驱动程序根据IRP,进行相应的操作。
好,将到这里,就可以回到winpcap源码了,通过前面的几节的学习,大家应该对winpcap源码有一定的了解了,对于wpcap.dll和packet.dll ,就不讲解了。这里主要针对这个问题,稍微讲解下:
在npf的packet.c文件中有以下IRP
/*设置IRP派遣函数和卸载例程*/
DriverObject->MajorFunction[IRP_MJ_CREATE] = NPF_Open;
DriverObject->MajorFunction[IRP_MJ_CLOSE] = NPF_Close;
DriverObject->MajorFunction[IRP_MJ_CLEANUP]= NPF_Cleanup;
DriverObject->MajorFunction[IRP_MJ_READ] = NPF_Read;
DriverObject->MajorFunction[IRP_MJ_WRITE] = NPF_Write;
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = NPF_IoControl;
DriverObject->DriverUnload = NPF_Unload;
在上面的章节中已经讲到对于应用程序都是通过ReadFile,WriteFile,DeviceIoControl与驱动通信的,比如设置内核缓冲区,用户缓冲区最终都是调用的DeviceIoControl,而DeviceIoControl对应的IRP就是IRP_MJ_DEVICE_CONTROL,这样就调用到了NPF_IoControl,这条路就通了,同样对于发包函数pcap_sendpacket最终也是调用的WriteFile将包发送出去,这里就可以看到和NPF_Write联系起来了,同理对于读函数,大家肯定都知道是怎么回事了,嘻嘻,好了,讲解完毕,希望对你有用。
- 庖丁解牛-----winpcap源码彻底解密(五)
- 庖丁解牛-----winpcap源码彻底解密(二)
- 庖丁解牛-----winpcap源码彻底解密(三)
- 庖丁解牛-----winpcap源码彻底解密(四)
- 庖丁解牛-----winpcap源码彻底解密
- 庖丁解牛-----winpcap源码彻底解密
- 庖丁解牛—winpcap源码彻底解密续 (12)
- 庖丁解牛-----winpcap源码彻底解密(一)
- 庖丁解牛-----winpcap源码彻底解密(一)
- 庖丁解牛-----winpcap源码彻底解密(一)
- 庖丁解牛---winpcap源码彻底解密系列的续集(6)
- 庖丁解牛---winpcap源码彻底解密系列的续集(7)
- 庖丁解牛—winpcap源码彻底解密系列的续集(8)
- 庖丁解牛—winpcap源码彻底解密系列续集(9)
- 庖丁解牛---winpcap源码彻底解密系列续集(10)
- 庖丁解牛—winpcap源码彻底解密系列续集(11)
- 庖丁解牛—winpcap源码彻底解密系列续集(13)
- 庖丁解牛-----Live555源码彻底解密(testRTSPClient流程图)
- 12月20号英语学习
- 下周MySQL学习计划安排
- TAPI 函数功能简介
- 动态链接库,创建四则运算
- 在Ubuntu Server上配置LAMP
- 庖丁解牛-----winpcap源码彻底解密(五)
- 最近翻译的ISAPI_Rewrite中文手册
- cocos2d 中的奥妙
- javascript闭包详解
- Web项目压力测试工具集锦
- 接口
- c#中String和string的区别
- 最近翻译的ISAPI_Rewrite中文手册2
- jQuery UI Datepicker中文显示