xtaddqqug
驱动牛犊
驱动牛犊
  • 注册日期2002-06-14
  • 最后登录2008-11-29
  • 粉丝0
  • 关注0
  • 积分23分
  • 威望6点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
阅读:2427回复:9

NdisRequest()函数使用问题

楼主#
更多 发布于:2004-12-12 11:42
不知哪位高手用过NdisRequest()函数,我试着在几个地方调用该函数,但都导致死机.

最新喜欢:

cyliucyliu
shortlight
驱动牛犊
驱动牛犊
  • 注册日期2003-11-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望81点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-12-16 16:18
我编了一个程序,想在PtOpenAdapter()中将网卡设为混杂状态,但是每次都蓝屏,代码是这样的:
SetPromiscMode(
IN NDIS_HANDLE BindingHandle
)
{
NDIS_STATUS Status;
ULONG Filter;
NDIS_REQUEST Request;

DbgPrint("Setting Promiscous mode\n");

Filter=NDIS_PACKET_TYPE_PROMISCUOUS;
NdisZeroMemory(&Request,sizeof(NDIS_REQUEST));
Request.RequestType=NdisRequestSetInformation;
Request.DATA.SET_INFORMATION.Oid = OID_GEN_CURRENT_PACKET_FILTER;
Request.DATA.SET_INFORMATION.InformationBuffer=&Filter;
Request.DATA.SET_INFORMATION.InformationBufferLength = sizeof(ULONG);


NdisRequest(&Status,BindingHandle,&Request);

DbgPrint("Setting promiscous mode complete\n");
return Status;
}
xtaddqqug
驱动牛犊
驱动牛犊
  • 注册日期2002-06-14
  • 最后登录2008-11-29
  • 粉丝0
  • 关注0
  • 积分23分
  • 威望6点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-12-16 18:47
我也现在也在为如何使用NdisRequest()犯愁.不过我想您不该在PtOpen*()中使用它,而应在PtOpencomplete()中用它,因为这时您才能保证BindingHandle是正确的.
shortlight
驱动牛犊
驱动牛犊
  • 注册日期2003-11-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望81点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-12-16 18:56
不好意思,我刚才说错了,是在PtBindAdapter()函数中调用,具体位置是在NdisOpenAdapter()函数调用之后,且Pending状态已经结束
bingjie
驱动小牛
驱动小牛
  • 注册日期2001-08-15
  • 最后登录2007-11-29
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-12-16 21:14
混杂模式只要调用NdisRequest就可以了啊,OID:OID_GEN_CURRENT_PACKET_FILTER, BIT: NDIS_PACKET_TYPE_PROMISCUOUS
调用该函数要确保在OpenAdapterComplete后进行,并且注意在PtRequestComplete函数里要判断是你自己发起的Requester还是其它协议发起的,如果是你自己发起的Request那么不需要再调用NdisMSetInformationComplete了。
bingjie
驱动小牛
驱动小牛
  • 注册日期2001-08-15
  • 最后登录2007-11-29
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-12-16 21:18
我编了一个程序,想在PtOpenAdapter()中将网卡设为混杂状态,但是每次都蓝屏,代码是这样的:
SetPromiscMode(
IN NDIS_HANDLE BindingHandle
)
{
NDIS_STATUS Status;
ULONG Filter;
NDIS_REQUEST Request;

DbgPrint("Setting Promiscous moden");

Filter=NDIS_PACKET_TYPE_PROMISCUOUS;
NdisZeroMemory(&Request,sizeof(NDIS_REQUEST));
Request.RequestType=NdisRequestSetInformation;
Request.DATA.SET_INFORMATION.Oid = OID_GEN_CURRENT_PACKET_FILTER;
Request.DATA.SET_INFORMATION.InformationBuffer=&Filter;
Request.DATA.SET_INFORMATION.InformationBufferLength = sizeof(ULONG);


NdisRequest(&Status,BindingHandle,&Request);

DbgPrint("Setting promiscous mode completen");
return Status;
}

必须要判断NdisRequest的返回值才知道是否执行结束,如果是Pending,那么你的Request是一个局部变量,return后必然蓝屏
xtaddqqug
驱动牛犊
驱动牛犊
  • 注册日期2002-06-14
  • 最后登录2008-11-29
  • 粉丝0
  • 关注0
  • 积分23分
  • 威望6点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-12-16 22:20
以bingjie老兄说,如果request变量是个全局变量的话,那么NdisRequest()就能在OpenAdapterComplete之后正常使用了吗?
shortlight
驱动牛犊
驱动牛犊
  • 注册日期2003-11-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望81点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-12-17 14:14
我按照bingjie老兄说的做了,系统没有蓝屏,但是却死机了,这是为什么呀?
xtaddqqug
驱动牛犊
驱动牛犊
  • 注册日期2002-06-14
  • 最后登录2008-11-29
  • 粉丝0
  • 关注0
  • 积分23分
  • 威望6点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-12-17 15:32
bingjie老兄快想想办法呀!!!
shortlight
驱动牛犊
驱动牛犊
  • 注册日期2003-11-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望81点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-12-18 09:49
我用了一个下午的时间,仅仅证明NDISRequest()不能在OpenAdapter()函数之后调用,不管用什么方式调用,系统不是死机就是蓝屏。另外,OpenAdapter()函数之后NdisIMInitializeDeviceInstanceEx()函数调用完成后,再调用MPSetInfomation()设置混杂状态也不行。看来只有从用户态发出IODeviceControl()函数调用,才有可能成功呀
游客

返回顶部