深度剖析WinPcap之(八) - 打开与关闭适配器(5)
更新时间:2024-01-25 16:21:01 阅读量: 教育文库 文档下载
- 深度剖析水瓶女的真实性格推荐度:
- 相关推荐
深度剖析WinPcap之(八)——打开与关闭适配器(5) 2009-09-24 20:30:35 标签:WinPcap 打开 关闭 适配器 [推送到技术圈] 版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。
http://eslxf.blog.51cto.com/918801/205038
1.4.2.3 pcap_activate_win32函数
在函数pcap_create()中把p->activate_op操作句柄设为 pcap_activate_win32()函数。函数pcap_activate_win32()为激活捕捉实例做各种准备工作。
函数的主要代码如下:
static int pcap_activate_win32(pcap_t *p) {
NetType type;
/* 初始化WinSock*/ wsockinit();
/*调用packet.dll的函数PacketOpenAdapter()打开适配器*/
p->adapter = PacketOpenAdapter(p->opt.source);
if (p->adapter == NULL) {//错误,函数返回 }
/*调用packet.dll的函数PacketGetNetType()获取网络类型*/ if(PacketGetNetType (p->adapter,&type) == FALSE)
…
{ }
/*设置链路类型*/ switch (type.LinkType) {
case NdisMediumWan:
p->linktype = DLT_EN10MB; break;
//错误,函数返回 …
case NdisMedium802_3:
p->linktype = DLT_EN10MB; /*
* 这大概是一个真正的以太网捕获;给它数据链路层类型链表设
置为DLT_EN10MB与 DLT_DOCSIS,因此一个应用程序可以让你选择它的类型,以防万一正在捕获DOCSIS网络数据包,是由一个Cisco网线调制器终端系统发送到以太网上的(它不发送一个以太网协议头到线上,而是发送原始的DOCSIS数据帧到线上)。
*/
p->dlt_list = (u_int *) malloc(sizeof(u_int) * 2); /*如果分配失败,仅留下空链表*/ if (p->dlt_list != NULL) { } break;
p->dlt_list[0] = DLT_EN10MB; p->dlt_list[1] = DLT_DOCSIS; p->dlt_count = 2;
…
default:
p->linktype = DLT_EN10MB;
/*一个未知的适配器假定为以太
网适配器*/
}
break;
/* 设置网络适配器的过滤模式为混杂模式*/ if (p->opt.promisc) {//混杂模式
if (PacketSetHwFilter(p->adapter,
NDIS_PACKET_TYPE_PROMISCUOUS) == FALSE)
}
{ }
//错误,函数返回 …
else
{//非混杂模式
if (PacketSetHwFilter(p->adapter,
NDIS_PACKET_TYPE_ALL_LOCAL) == FALSE)
}
{ }
//错误,函数返回 …
/*设置pcap_t结构体中的缓冲区大小*/
p->bufsize = WIN32_DEFAULT_USER_BUFFER_SIZE;
/*分配在捕获过程中使用的数据包结构体*/
if((p->Packet = PacketAllocatePacket())==NULL) { }
//错误,函数返回
…
if(!(p->adapter->Flags & INFO_FLAG_DAG_CARD)) { /*
* 传统的适配器 */
/*
* 如果缓冲区的大小不是显式的设定,默认为 WIN32_DEFAULT_US
ER_BUFFER_SIZE。
*/
if (p->opt.buffer_size == 0)
p->opt.buffer_size = WIN32_DEFAULT_KERNEL_BUFFER_SIZE;
//设置内核NPF的缓冲区
if(PacketSetBuff(p->adapter,p->opt.buffer_size)==FALSE) { }
p->buffer = (u_char *)malloc(p->bufsize);
//错误,函数返回 …
if (p->buffer == NULL) { }
//错误,函数返回 …
/*初始化捕获过程中使用的数据包结构体*/
PacketInitPacket(p->Packet,(BYTE*)p->buffer,p->bufsize);
}
/*设置读取超时时间*/
PacketSetReadTimeout(p->adapter, p->md.timeout);
/*设置常规的NPF进行读取与设置过滤的操作句柄*/
/* 告诉驱动程序 只有存储了至少16K的数据后,才能复制数据*/ if(PacketSetMinToCopy(p->adapter,16000)==FALSE) { }
//错误,函数返回 …
p->read_op = pcap_read_win32_npf;
p->setfilter_op = pcap_setfilter_win32_npf;
p->setdirection_op = NULL; /*没有实现*/
p->inject_op = pcap_inject_win32;/* 发送单个数据包的操作*/
p->set_datalink_op = NULL; /*不能改变数据链路层的类型*/ p->getnonblock_op = pcap_getnonblock_win32; p->setnonblock_op = pcap_setnonblock_win32;
p->stats_op = pcap_stats_win32; p->setbuff_op = pcap_setbuff_win32; p->setmode_op = pcap_setmode_win32;
p->setmintocopy_op = pcap_setmintocopy_win32; p->cleanup_op = pcap_cleanup_win32;
return (0);
bad: }
函数首先调用wsockinit()函数初始化WinSock,然后调用packet.dll提供的函数PacketOpenAdapter()打开适配器。
接着调用packet.dll提供的函数PacketGetNetType()获取网络类型。根据网络类型设置链路类型。此处我们只分析常规的以太网捕获。
接下来调用packet.dll提供的函数PacketSetHwFilter()设置网络适pcap_cleanup_win32(p); return (PCAP_ERROR);
配器的过滤模式为混杂模式。
然后设置用户层与内核捕获数据的缓冲区大小分别为WIN32_DEFAULT_USER_BUFFER_SIZE(256KB)与WIN32_DEFAULT_KERNEL_BUFFER_SIZE(1MB),并设置内核缓冲区,分配用户缓冲区,并进行初始化。
设置驱动程序只有存储了至少16K的数据后,才能复制数据到用户空间,设置读取超时时间。
设置NPF进行读取的操作句柄为pcap_read_win32_npf()函数与设置过滤的操作句柄为pcap_setfilter_win32_npf函数。
设置发送单个数据包的操作句柄为pcap_inject_win32函数。设置下列
函数句柄。
p->getnonblock_op = pcap_getnonblock_win32; p->setnonblock_op = pcap_setnonblock_win32; p->stats_op = pcap_stats_win32;
p->setbuff_op = pcap_setbuff_win32; p->setmode_op = pcap_setmode_win32;
p->setmintocopy_op = pcap_setmintocopy_win32; p->cleanup_op = pcap_cleanup_win32; 最后函数返回 。
其中函数wsockinit()主要调用WSAStartup()系统函数实现Winsocket的初始化。
把p->cleanup_op清除操作设置为pcap_cleanup_win32 ()函数,使得与pcap_open_live()函数对应的pcap_close()函数调用,调用该函数正确释放各种资源。
本文出自 “千江月” 博客,请务必保留此出处http://eslxf.blog.51cto.com/918801/205038
正在阅读:
深度剖析WinPcap之(八) - 打开与关闭适配器(5)01-25
竣工环境保护验收监测程序 word版06-27
技术状态管理计划(含表格)06-08
1 概述05-18
绪论06-28
西华大学过程控制复习题06-22
matlab选修课 答案详解 实验指导书Matlab软件应用与开发 - 图文10-24
河北司法警官学院通知11-12
第12届中国金融风险经理论坛流程01-28
年度健康教育工作计划简易版04-28
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 适配器
- 剖析
- 深度
- 关闭
- 打开
- WinPcap
- 九年级语文下册第一单元1诗两首第1课时我爱这土地教案新版新人教版
- 二年级下册美术教案
- 大满镇中心学校校史
- 爱学习爱读书主题班会教案 - 图文
- 调查报告
- 教学楼施工组织设计 - 图文
- 土建安装全套计算规则
- 医学系统设计实验
- 合同能源管理(EMC)行业发展前景分析报告 - 目录 - 图文
- Mapgis数据投影步骤 - 图文
- 人力资源规划
- 小学图书室消防安全管理制度
- hjd80 说明书
- ansys旋转经典命令流
- 浙江大学学习心得
- 内蒙古乌兰察布市集宁一中东校区高二上学期期中数学试卷和解析(文科)
- 2018年春季国旗下讲话安排表及内容
- 教育心理学第4章练习题及答案
- 小学数学苏教版四年级下册第三单元第4课《积的变化规律》优质课公开课教案教师资格证面试试讲教案
- 大学生创业基础试题库