监听以太网
        
      
      
        (二
      
      
        ) 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


 
					 
					