监听以太网(二) 关于Packet32 续

系统 1948 0

监听以太网 (二 ) Packet32 包说明续

Article last modified on 2002-9-17

The information in this article applies to:

--Microsoft Windwos NTx

--- Microsoft Windwos 9x

--WinPcap: the Free Packet Capture Architecture for Windows

Packet32 包中的函数说明 :

No.2.   PacketOpenAdapter ( 打开网卡 )

根据传入的设备名,打开它。

LPADAPTER PacketOpenAdapter(

LPTSTR AdapterName

);

Parameters

AdapterName:

[in] 要打开的设备的名字。

Return Values

如果打开成功,返回一个指针,它指向一个正确初始化了的 ADAPTER Object

否则,返回 NULL

Usage:

      
        
          
            
              [C/C++] 
        
              
              
            
          
        
      
    
      
        
          
            
              C/C++ Usage Sample 
        
              
              
            
          
        
      
    

LPADAPTER      adapter;

adapter = PacketOpenAdapter(pStr+rewind);

 

Remarks:

这个函数尝试加载并启动 packet driver ,这样,管理 driver 对于应用程序来说就十分的透明了。

              

               Windows9X 版本的 NPF driver 用的是 ASCII 编码,而 WindowsNTx 用的是 Unicode 编码。所以提请注意这个输入参数 AdapterName ,在 Windows9X 下,必须是正确的编码格式!在 WindowsNTx 下,这个函数能够监测到 ASCII 编码,并在送给 driver 之前先转换为 Unicode 编码。

 

这个函数的操作大致为:

               首先调用 OpenSCManager ,以 Administrators 的身份连接 Service Control Manager ,权限是 SC_MANAGER_ALL_ACCESS 。这也说明,使用 Packet.dll 你必须是本机管理员组成员。

               如果可以连接 SCM ,检查 NPF 注册表项是否存在。如果存在,说明 driver 已经安装了,就不需要我们调用 PacketInstallDriver 了。

               NPF 注册表项:

HKEY_LOCAL_MACHINE\

SYSTEM\

CurrentControlSet\

Services\

   NPF

如果不存在此键,则调用 PacketInstallDriver 安装当前路径下的 driver npf.sys

如果这次 PacketInstallDriver 安装也失败了,就到系统路径下查找并安装这个驱动。

              

               如果以上操作都成功的话,调用 OpenService 打开 NPF 服务。如果服务存在的话,就调用 QueryServiceStatus 查询当前服务状态。这就是我们的 driver 的状态。

               如果这个服务没有启动,就调用 StartService 启动之。

              

               确认服务启动之后,检查 AdapterName 是否是 ASCII 编码,是的话,就转换为 Unicode

 

               由于一般输入参数 AdapterNAme 类似于这样:

\Device\NPF_{A67CEC3B-C099-47E0-B096-480B01FAF348}

所以,我们会重新组织一个设备名 SymbolicLink

“Packet_” 的前缀 + AdapterName[8]

也就是:

\\.\Packet_NPF_{A67CEC3B-C099-47E0-B096-480B01FAF348}

 

先尝试着 CreateFile 函数能不能马上用这个 SymbolicLink 名字打开设备。

如果可以,就调用 PacketSetReadEvt 函数打开一个 open 事件等。

否则,调用 DefineDosDevice 定义一个新的 MS-DOS 设备:

名字类似于 ” Packet_NPF_{A67CEC3B-C099-47E0-B096-480B01FAF348}”

通过这个 DOS 设备名,我们的应用层程序才能向驱动发出请求。

接着,调用 CreateFile 函数来建立并打开一个联系设备的文件句柄 (GENERIC_WRITE| GENERIC_READ OPEN_EXISTING)

之后,调用 PacketSetReadEvt 函数打开一个 open 事件等。

 

(To be continued)

 

Writen by zhengyun@tomosoft.com

 

本文档所包含的信息代表了在发布之日, ZhengYun 对所讨论问题的当前看法, Zhengyun 不保证所给信息在发布之日以后的准确性。

本文档仅供参考。对本文档中的信息, Zhengyun 不做任何明示或默示的保证。

 



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=12691


监听以太网(二) 关于Packet32 续


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论