wuwang123xx
驱动牛犊
驱动牛犊
  • 注册日期2008-09-16
  • 最后登录2011-06-14
  • 粉丝2
  • 关注0
  • 积分38分
  • 威望321点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2308回复:9

NdisRegisterProtocol问题

楼主#
更多 发布于:2010-06-17 16:37
我在DriverEntry中写如下代码:


  NdisZeroMemory(&ProtocolCharacteristics, sizeof(NDIS_PROTOCOL_CHARACTERISTICS));
  ProtocolCharacteristics.MajorNdisVersion = 5;
  ProtocolCharacteristics.MinorNdisVersion = 0;
  ProtocolCharacteristics.Name = ProtocolName;
  ProtocolCharacteristics.OpenAdapterCompleteHandler = ProtocolOpenAdapterComplete;
  ProtocolCharacteristics.CloseAdapterCompleteHandler = ProtocolCloseAdapterComplete;
  ProtocolCharacteristics.SendCompleteHandler = ProtocolSendComplete;
  ProtocolCharacteristics.TransferDataCompleteHandler = ProtocolTransferDataComplete;
  ProtocolCharacteristics.ResetCompleteHandler = ProtocolResetComplete;
  ProtocolCharacteristics.RequestCompleteHandler = ProtocolRequestComplete;
  ProtocolCharacteristics.ReceiveHandler = ProtocolReceive;
  ProtocolCharacteristics.ReceiveCompleteHandler = ProtocolReceiveComplete;
  ProtocolCharacteristics.StatusHandler = ProtocolStatus;
  ProtocolCharacteristics.StatusCompleteHandler = ProtocolStatusComplete;
  ProtocolCharacteristics.BindAdapterHandler = ProtocolBindAdapter;
  ProtocolCharacteristics.UnbindAdapterHandler = ProtocolUnbindAdapter;
  ProtocolCharacteristics.PnPEventHandler = ProtocolPnPEvent;
  NdisRegisterProtocol((PNDIS_STATUS)&Status, &ProtocolHandle, &ProtocolCharacteristics, sizeof(NDIS_PROTOCOL_CHARACTERISTICS));
  return Status;


用Windbg跟踪发现返回的结果也是OK的。但是ProtocolBindAdapter这个函数貌似没有执行(里面有__asm int 3,没有停在这里)。不知道为什么。刚学NDIS。请高手帮忙分析下什么问题。
谢谢!
bakeyou
驱动牛犊
驱动牛犊
  • 注册日期2010-06-17
  • 最后登录2010-06-17
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望51点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2010-06-17 16:46
用ddk里面的框架吧!..你这样是折磨自己!
wuwang123xx
驱动牛犊
驱动牛犊
  • 注册日期2008-09-16
  • 最后登录2011-06-14
  • 粉丝2
  • 关注0
  • 积分38分
  • 威望321点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2010-06-17 17:00
引用第1楼bakeyou于2010-06-17 16:46发表的  :
用ddk里面的框架吧!..你这样是折磨自己!


这个和框架关系不大吧。调用NdisRegisterProtocol注册之后,不是会执行BindAdapterHandler去bind网卡的吗?我不清楚为什么它没执行。
不知道理解是否正确。
谢谢!
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
地板#
发布于:2010-06-17 17:30
按照框架去做,不要自己想当然
走走看看开源好 Solaris vs Linux
wuwang123xx
驱动牛犊
驱动牛犊
  • 注册日期2008-09-16
  • 最后登录2011-06-14
  • 粉丝2
  • 关注0
  • 积分38分
  • 威望321点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2010-06-17 17:45
引用第3楼cyliu于2010-06-17 17:30发表的  :
按照框架去做,不要自己想当然


我刚才看了DDK提供的例子。我也是照着别人的代码改的。想用windbg跟踪看看NDIS执行过程。觉得BindAdapterHandler没有执行,不知道原因。
还请你们分析下。
谢谢了!
wuwang123xx
驱动牛犊
驱动牛犊
  • 注册日期2008-09-16
  • 最后登录2011-06-14
  • 粉丝2
  • 关注0
  • 积分38分
  • 威望321点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2010-06-17 22:11
回 4楼(wuwang123xx) 的帖子
只能等我自己找到原因了。
发了几次帖子,没一个有人帮忙。哎!
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
6楼#
发布于:2010-06-18 13:53
1 这问题看看ddk例子就都明白了,根本就不是问题

2 提供的信息太少。这例子需要ndis框架,现在流程代码都没有,让别人怎么分析?

多从自己身上找问题,勿怨天尤人
走走看看开源好 Solaris vs Linux
Yanky
驱动牛犊
驱动牛犊
  • 注册日期2004-08-24
  • 最后登录2018-07-15
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望95点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于:2010-06-18 14:20
系统为什么要调用你BindAdapterHandler呢?
inf安装可以,使用ddk自带的简单修改一下。
自己枚举后手工调用也可以。
wuwang123xx
驱动牛犊
驱动牛犊
  • 注册日期2008-09-16
  • 最后登录2011-06-14
  • 粉丝2
  • 关注0
  • 积分38分
  • 威望321点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2010-06-18 15:30
引用第6楼cyliu于2010-06-18 13:53发表的  :
1 这问题看看ddk例子就都明白了,根本就不是问题

2 提供的信息太少。这例子需要ndis框架,现在流程代码都没有,让别人怎么分析?

多从自己身上找问题,勿怨天尤人


我搜索发现有人在论坛提过类似问题。
http://bbs.driverdevelop.com/read.php?tid-99604.html

你用DriverMoitor打开驱动的过程相当于临时在注册表中增加了一个服务,然后net start它。这个过程对NDIS Protocol Driver是不充分的,此时NDIS不会调用ProtocolBindAdapter(),但仍会调用ProtocolPnPEvent()。

如果想让ProtocolBindAdapter()被调用,必须通过Network Control Panel Applet (NCPA)安装协议驱动。或者参看DDK例子代码中的netcfg(Network Configuration Sample)。netcfg演示了利用INetCfg API枚举、安装、卸载网络组件。




另外在网上下载了一个例子有说到:
DDK给出了Packe协议驱动程序的安装信息文件packet.inf;将该文件同packet.sys放到同一目录下,就可以进行安装了,具体步骤如下:打开本地连接的属性窗口,进入安装功能界面。选择添加协议->从磁盘安装;然后选中对应的Packet.inf即可,安装完毕后,“本地连接 属性”栏中将会显示出新安装的协议“DDK PACKET Protocol”,此时我们就可以在应用程序中通过该驱动获取网络数据了。



现在差不多理解了。给大家添加麻烦了。
谢谢!
wuwang123xx
驱动牛犊
驱动牛犊
  • 注册日期2008-09-16
  • 最后登录2011-06-14
  • 粉丝2
  • 关注0
  • 积分38分
  • 威望321点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2010-06-18 17:51
根据前面的方法。我试了,可以跟踪到BindAdapterHandler的执行过程。




游客

返回顶部