阅读:3729回复:15
Passthru中,这样设置混杂模式怎么错了??请指教
我在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()代码,就没有问题。但这样没有到达设置混杂模式的目的。 有什么更好的方法设置网卡混杂模式吗??? 先谢了 |
|
最新喜欢:![]() |
沙发#
发布于:2005-06-27 18:48
不使用应用层发IRP的方法设置,直接在驱动中怎么设置??
|
|
板凳#
发布于:2005-06-27 19:05
在PtRequestComplete中对passhtru直接发送的request做了特别处理了吗,和protocol driver发送的requst做了区分没有?
|
|
地板#
发布于: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)); } } |
|
地下室#
发布于:2005-06-27 20:16
1。在passthru直接发送NdisRequst是完全可以,只是需要在PtRequestComplete里要判断一下如果是自己requset,就不要再调用NdisMSetInformationComplete往上传了,注意了这个细节,就应该没有问题了
2。你上面的做法肯定不行。因为设置混杂模式,必须把这个Request真正发送到miniport driver,由 miniport driver去真正设置网卡。 |
|
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[]来作标记? |
|
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,登录连接时提示:检测的回环。 请教高手,这是什么原因??是混杂模式造成的吗? |
|
7楼#
发布于:2005-06-27 22:26
很可能,因为设置为混杂模式后,网卡把往外发送的的包,自己也都会接收一份.你选择adsl连接建立以后,再设置混杂模式看看,可不可以正常工作
|
|
8楼#
发布于:2005-06-28 09:00
我试了,先连接上后,再安装驱动。
但安装驱动时会提示:将断开VPN,是否继续安装。继续安装后ADSL就断开了。也不能在连接了。 |
|
9楼#
发布于:2005-06-28 14:31
不要重新安装passthru,建议通过deviceiocontrol,由应用程序来控制,什么时候,设置混杂模式,当adsl拨号连接成功后,再由应用程序通知驱动,设置混杂模式。
确实也不用总设置混杂模式吧。一般是抓包的时候,才设置 |
|
10楼#
发布于:2005-06-28 17:51
老大,这样设置好象不对呀。
我现在就有一个程序对我的网卡不断发包,但大都被网卡丢了。应该全部收到才对。 为什么???? |
|
11楼#
发布于:2005-06-28 18:08
这个问题和adsl不能上网了是同一个问题吗?
|
|
12楼#
发布于:2005-06-28 20:00
不是ADSL上网。我是在局域网中测试的。
并且在网卡属性页上显示的是发送的包很多,而接收的包几乎没有!! 由于这个网卡只是另一个程序接收发过来的包,在网卡属性页上显示的应该是接收的包很多,发送的包没有呀!! 太奇怪了。仅仅这样设置一下,怎么就把接收的包变为发送的计数呢?? |
|
13楼#
发布于:2005-06-28 20:54
问题比较怪,为什么你要在passthru里设置混杂模式.如果为了抓包,写一个protocol驱动就够了, sniffer,winpcap就都是protocol driver.
|
|
14楼#
发布于:2005-06-28 23:25
嗨,这终就是问题呀。
|
|
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其他主机的包。 当然没有这个设置就不能截获其他主机的包了。这个我也测试过。 |
|