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个工作日内予以改正。