bswy1973
驱动牛犊
驱动牛犊
  • 注册日期2004-06-12
  • 最后登录2010-05-14
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望29点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
阅读:3729回复:15

Passthru中,这样设置混杂模式怎么错了??请指教

楼主#
更多 发布于:2005-06-27 18:43
  我在PtBindAdpater()函数结束的地方启一个线程。在这个线程中实现混杂模式设置。但是蓝屏。线程中代码如下:

NDIS_STATUS st;
NDIS_REQUEST *pRequest;
NDIS_OID oiddata;

oiddata=NDIS_PACKET_TYPE_PROMISCUOUS;

/*设置为混杂模式*/
pRequest=ExAllocatePool(NonPagedPool,sizeof(NDIS_REQUEST));//分配内存
if(NULL==pRequest)
{
   DBGPRINT("Can not allocate buffer for requestn");
}
pRequest->RequestType=NdisRequestSetInformation;//设置请求命令
pRequest->DATA.SET_INFORMATION.Oid=OID_GEN_CURRENT_PACKET_FILTER;
pRequest->DATA.SET_INFORMATION.InformationBuffer=&oiddata;
pRequest->DATA.SET_INFORMATION.InformationBufferLength=sizeof(NDIS_OID);

NdisRequest(&st,pAdapt->BindingHandle,pRequest);//发送请求
if(st!=NDIS_STATUS_PENDING)
{
  if(pRequest){
    DBGPRINT("Free request\n");
   ExFreePool(pRequest);
  }
}

为什么错了??,错误提示:一个没有处理的线程异常。
如果注释了NdisRequest()代码,就没有问题。但这样没有到达设置混杂模式的目的。

有什么更好的方法设置网卡混杂模式吗???

先谢了

最新喜欢:

WY.lslrtWY.lsl...
bswy1973
驱动牛犊
驱动牛犊
  • 注册日期2004-06-12
  • 最后登录2010-05-14
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望29点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-06-27 18:48
不使用应用层发IRP的方法设置,直接在驱动中怎么设置??
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2005-06-27 19:05
在PtRequestComplete中对passhtru直接发送的request做了特别处理了吗,和protocol driver发送的requst做了区分没有?
bswy1973
驱动牛犊
驱动牛犊
  • 注册日期2004-06-12
  • 最后登录2010-05-14
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望29点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-06-27 19:41
没有,也不知道怎么做。
我刚才搜了一下。不知道http://bbs.zndev.com/read.php?tid=9249这里的方法是否可行?如果直接在MPSetInformation里实现:
if (pAdapt->Medium == g_MediumArray[0]){

  if (OID_GEN_CURRENT_PACKET_FILTER == Oid){
  
   memcpy(&aMode,InformationBuffer,sizeof(ULONG));

   aMode |= NDIS_PACKET_TYPE_PROMISCUOUS;

   memcpy(InformationBuffer,&aMode,sizeof(ULONG));
  }

}
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2005-06-27 20:16
1。在passthru直接发送NdisRequst是完全可以,只是需要在PtRequestComplete里要判断一下如果是自己requset,就不要再调用NdisMSetInformationComplete往上传了,注意了这个细节,就应该没有问题了
2。你上面的做法肯定不行。因为设置混杂模式,必须把这个Request真正发送到miniport driver,由
miniport driver去真正设置网卡。
bswy1973
驱动牛犊
驱动牛犊
  • 注册日期2004-06-12
  • 最后登录2010-05-14
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望29点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-06-27 20:32
if (pAdapt->Medium == MediumArray[0]){

       if (OID_GEN_CURRENT_PACKET_FILTER == Oid){

              RtlCopyMemory(&aMode,InformationBuffer,sizeof(ULONG));

              aMode |= NDIS_PACKET_TYPE_PROMISCUOUS;

              RtlCopyMemory(InformationBuffer,&aMode,sizeof(ULONG));
              DbgPrint("here\r\n");
       }

}
上面的方法虽然不蓝屏,的确也运行到里面了,但是否真的设为混杂模式了,可是正如zhaock大侠说的,没有真正设置吧。

还有一问。你说的passthru直接发送,最好是在哪个地方发送比较好,是按最上面的代码那样吗?目的一加载就是混杂模式???

PtRequestComplete怎么来区分是不是自己的request?可不可以用NDIS_REQUEST结构中的 MacReserved[]来作标记?
bswy1973
驱动牛犊
驱动牛犊
  • 注册日期2004-06-12
  • 最后登录2010-05-14
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望29点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-06-27 21:53
根据zhaock大侠的帮助,解决了!!但不知道对不对

仍然用第一部分的代码,加在PtBindAdpater()的后面,但是用的NDIS_REQUEST_EX结构作为Request。在其中增加一个标志,以方便在PtRequestComplete()识别是自己的Request.
在PtBindAdpater()中的代码如下:

oiddata=NDIS_PACKET_TYPE_PROMISCUOUS;

/*设置为混杂模式*/
pRequest=ExAllocatePool(NonPagedPool,sizeof(NDIS_REQUEST_EX));//分配内存
if(NULL==pRequest)
{
       DBGPRINT(("Can not allocate buffer for requestn"));
}
pRequest->Self = 1;
pRequest->Request.RequestType=NdisRequestSetInformation;//设置请求命令
pRequest->Request.DATA.SET_INFORMATION.Oid=OID_GEN_CURRENT_PACKET_FILTER;
pRequest->Request.DATA.SET_INFORMATION.InformationBuffer=&oiddata;
pRequest->Request.DATA.SET_INFORMATION.InformationBufferLength=sizeof(NDIS_OID);

NdisRequest(&st,pAdapt->BindingHandle,&(pRequest->Request));//发送请求
if(st!=NDIS_STATUS_PENDING)
{
       if(pRequest){
              DBGPRINT(("Free request\n"));
              ExFreePool(pRequest);
       }
}
在PtRequestComplete()中的代码如下:
   if( NdisRequest != &(pAdapt->Request) )
   {
      
      PNDIS_REQUEST_EX pLocalRequest = (PNDIS_REQUEST_EX )NdisRequest;
      
      if( pLocalRequest->Self == 1 )
      {
             DbgPrint("ExFreePool(NdisRequest)\r\n");
             ExFreePool(NdisRequest);
             return;
      }

      (*pLocalRequest->RequestCompleteHandler )( pAdapt, pLocalRequest, Status );

      return;
   }


但加载这个混杂模式的驱动后,我就不能上网了。我用的是ADSL,登录连接时提示:检测的回环。
请教高手,这是什么原因??是混杂模式造成的吗?
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于:2005-06-27 22:26
很可能,因为设置为混杂模式后,网卡把往外发送的的包,自己也都会接收一份.你选择adsl连接建立以后,再设置混杂模式看看,可不可以正常工作
bswy1973
驱动牛犊
驱动牛犊
  • 注册日期2004-06-12
  • 最后登录2010-05-14
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望29点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-06-28 09:00
我试了,先连接上后,再安装驱动。
但安装驱动时会提示:将断开VPN,是否继续安装。继续安装后ADSL就断开了。也不能在连接了。
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
9楼#
发布于:2005-06-28 14:31
不要重新安装passthru,建议通过deviceiocontrol,由应用程序来控制,什么时候,设置混杂模式,当adsl拨号连接成功后,再由应用程序通知驱动,设置混杂模式。
确实也不用总设置混杂模式吧。一般是抓包的时候,才设置
bswy1973
驱动牛犊
驱动牛犊
  • 注册日期2004-06-12
  • 最后登录2010-05-14
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望29点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2005-06-28 17:51
老大,这样设置好象不对呀。
我现在就有一个程序对我的网卡不断发包,但大都被网卡丢了。应该全部收到才对。

为什么????
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
11楼#
发布于:2005-06-28 18:08
这个问题和adsl不能上网了是同一个问题吗?
bswy1973
驱动牛犊
驱动牛犊
  • 注册日期2004-06-12
  • 最后登录2010-05-14
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望29点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2005-06-28 20:00
不是ADSL上网。我是在局域网中测试的。
并且在网卡属性页上显示的是发送的包很多,而接收的包几乎没有!!

由于这个网卡只是另一个程序接收发过来的包,在网卡属性页上显示的应该是接收的包很多,发送的包没有呀!!

太奇怪了。仅仅这样设置一下,怎么就把接收的包变为发送的计数呢??
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
13楼#
发布于:2005-06-28 20:54
问题比较怪,为什么你要在passthru里设置混杂模式.如果为了抓包,写一个protocol驱动就够了, sniffer,winpcap就都是protocol driver.
bswy1973
驱动牛犊
驱动牛犊
  • 注册日期2004-06-12
  • 最后登录2010-05-14
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望29点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2005-06-28 23:25
嗨,这终就是问题呀。
bswy1973
驱动牛犊
驱动牛犊
  • 注册日期2004-06-12
  • 最后登录2010-05-14
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望29点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2005-06-29 20:51
给大家汇报一下。这个问题解决了。也十分感谢zhaock的分析。

解决方法还是在MpSetInformation()函数里加一段代码。只需在设置属性前加下面一段代码:

     if (OID_GEN_CURRENT_PACKET_FILTER == Oid){

           RtlCopyMemory(&aMode,InformationBuffer,sizeof(ULONG));

           aMode |= NDIS_PACKET_TYPE_PROMISCUOUS;

           RtlCopyMemory(InformationBuffer,&aMode,sizeof(ULONG));
           DbgPrint("here\r\n");
     }

我是用一个共享HUB测试的。加载这个混杂模式的驱动后,passthru可以收到接在该HUB上的其他机子发送的任何包。也可以截获到从外部发到这个HUB其他主机的包。

当然没有这个设置就不能截获其他主机的包了。这个我也测试过。
游客

返回顶部