深度剖析WinPcap之(八)——打开与关闭适配器(8).doc

上传人:hw****26 文档编号:3115092 上传时间:2019-05-21 格式:DOC 页数:7 大小:54.50KB
下载 相关 举报
深度剖析WinPcap之(八)——打开与关闭适配器(8).doc_第1页
第1页 / 共7页
深度剖析WinPcap之(八)——打开与关闭适配器(8).doc_第2页
第2页 / 共7页
深度剖析WinPcap之(八)——打开与关闭适配器(8).doc_第3页
第3页 / 共7页
深度剖析WinPcap之(八)——打开与关闭适配器(8).doc_第4页
第4页 / 共7页
深度剖析WinPcap之(八)——打开与关闭适配器(8).doc_第5页
第5页 / 共7页
点击查看更多>>
资源描述

1、深度剖析 WinPcap 之( 八)打开与关闭适配器(8) 2009-09-26 21:38:25标签:关闭 打开 适配器 推送到技术圈 版 权 声 明 : 原 创 作 品 , 允 许 转 载 , 转 载 时 请 务 必 以 超 链 接 形 式 标 明 文 章 原 始 出 处 、作 者 信 息 和 本 声 明 。 否 则 将 追 究 法 律 责 任 。http:/ PacketOpenAdapterNPF 函数函数 PacketOpenAdapterNPF()的作用是打开一个使用 NPF 设备驱动的适配器。该函数被 PacketOpenAdapter()与 AddAdapter()作为内部函数

2、调用。函数原型如下:LPADAPTER PacketOpenAdapterNPF(PCHAR AdapterNameA);参数 AdapterNameA 字符串包含待打开设备的名称。函数如果成功,返回一个已经正确初始化的 ADAPTER 对象的指针。否则返回 NULL。函数的主要代码如下:LPADAPTER PacketOpenAdapterNPF(PCHAR AdapterNameA)LPADAPTER lpAdapter;CHAR SymbolicLinkAMAX_PATH;/NPF_DRIVER_NAME 定义为“NPF“CHAR NpfDriverNameMAX_WINPCAP_KEY

3、_CHARS = NPF_DRIVER_NAME;CHAR NpfServiceLocationMAX_WINPCAP_KEY_CHARS;/*连接到服务控制管理器*/scmHandle = OpenSCManager(NULL, NULL, GENERIC_READ);if(scmHandle = NULL)/连接到服务控制管理器失败error = GetLastError();else/*检查 NPF 服务是否已经存在,*如果存在则接下来可以分配并初始化 ADAPTER 对象*/设置 NPF 服务的注册表位置StringCchPrintfA(NpfServiceLocation, size

4、of(NpfServiceLocation), “SYSTEMCurrentControlSetServices%s“, NpfDriverName);/检查 NPF 注册表的键值是已否存在,如果已经存在,/这意味着驱动已经安装,/我们不再需要调用 PacketInstallDriver()函数安装驱动程序KeyRes=RegOpenKeyExA(HKEY_LOCAL_MACHINE,NpfServiceLocation,0,KEY_READ,if(KeyRes != ERROR_SUCCESS)/NPF 注册表的键值不存在,调用 PacketInstallDriver()函数Result =

5、 PacketInstallDriver();else/NPF 注册表的键值已经存在,驱动已经安装Result = TRUE;RegCloseKey(PathKey);if (Result) /驱动已经存在,检查 NPF 服务是否正在运行/打开 NPF 服务svcHandle = OpenServiceA(scmHandle, NpfDriverName, SERVICE_START | SERVICE_QUERY_STATUS );if (svcHandle != NULL) /获得服务状态QuerySStat = QueryServiceStatus(svcHandle, if(!Quer

6、ySStat | SStat.dwCurrentState != SERVICE_RUNNING)/获得服务状态失败或驱动 NPF 没有运行,启动 NPF 服务if (StartService(svcHandle, 0, NULL)=0) /如果不是服务正在运行或服务已经存在的状态,/就处理错误,函数返回 NULLerror = GetLastError();if(error!=ERROR_SERVICE_ALREADY_RUNNING /驱动 NPF 已正常运行,关闭服务控制管理器的句柄CloseServiceHandle( svcHandle );svcHandle = NULL;else

7、/打开 NPF 服务失败error = GetLastError();SetLastError(error);elseif(KeyRes != ERROR_SUCCESS) /第一次安装驱动程序失败,并且 NPF 注册表的键值不存在/再次安装驱动Result = PacketInstallDriver();elseResult = TRUE;if (Result) /NPF 的驱动程序已存在/打开 NPF 服务svcHandle = OpenServiceA(scmHandle,NpfDriverName,SERVICE_START);if (svcHandle != NULL)/打开 NPF

8、 服务成功,获取 NPF 服务的状态QuerySStat = QueryServiceStatus(svcHandle, if(!QuerySStat | SStat.dwCurrentState != SERVICE_RUNNING)/获得服务状态失败或驱动 NPF 没有运行,启动 NPF服务if (StartService(svcHandle, 0, NULL)=0) /如果不是服务正在运行或服务已经存在的状态,/就处理错误,函数返回 NULLif(error!=ERROR_SERVICE_ALREADY_RUNNING /驱动 NPF 已正常运行,关闭服务控制管理器的句柄CloseSer

9、viceHandle( svcHandle );svcHandle = NULL;else/打开 NPF 服务失败,设置错误状态error = GetLastError();SetLastError(error);if (scmHandle != NULL) /关闭服务控制管理器的句柄CloseServiceHandle(scmHandle);/*分配 ADAPTER 结构体的的内存空间 */lpAdapter=(LPADAPTER)GlobalAllocPtr(GMEM_MOVEABLE | GMEM_ZEROINIT,sizeof(ADAPTER);if (lpAdapter=NULL)/

10、分配失败,函数返回 NULL;return NULL;/设置单个数据包发送的次数为一次lpAdapter-NumWrites=1;/从原始的设备名创建 NPF 设备的名称#define DEVICE_PREFIX “Device“if (LOWORD(GetVersion() = 4)/操作系统为 Windows NT 4.0、Windows 95、Windows 98、或 Windows Me 的处理elseif (strlen(AdapterNameA) strlen(DEVICE_PREFIX)StringCchPrintfA(SymbolicLinkA, MAX_PATH, “.Global%s“, AdapterNameA + strlen(DEVICE_PREFIX);elseZeroMemory(SymbolicLinkA, sizeof(SymbolicLinkA);-待续-本文出自 “千江月” 博客,请务必保留此出处 http:/

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育教学资料库 > 精品笔记

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。