edust
驱动中牛
驱动中牛
  • 注册日期2002-04-02
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3869回复:36

关于调用 NdisRequest() 查询网卡 MAC 地址导致蓝屏的问题?[150 分]

楼主#
更多 发布于:2002-12-16 21:13
为了能让大家明白我的问题从而更快的给我建议我尽量把问题说清楚一点:

我改写的是 XP 版的 Passthru,用于 2000 中。我的目的是想要查询我的 IMD 绑定的网卡的 MAC 地址,于是我在 MPInitialize() 的结尾部分写了如下代码:
pAdapt->Request.RequestType = NdisRequestQueryInformation;
pAdapt->Request.DATA.QUERY_INFORMATION.Oid = OID_802_3_CURRENT_ADDRESS;
pAdapt->Request.DATA.QUERY_INFORMATION.InformationBuffer = pAdapt->MACAddress;
pAdapt->Request.DATA.QUERY_INFORMATION.InformationBufferLength = 6;
pAdapt->Request.DATA.QUERY_INFORMATION.BytesWritten = 0;
pAdapt->Request.DATA.QUERY_INFORMATION.BytesNeeded = 0;
NdisRequest( &Status, pAdapt->BindingHandle, &pAdapt->Request );

Request 就定义在原来的 ADAPT 结构中:
NDIS_REQUEST Request;

但是现在程序会因此蓝屏,我把上面代码放在 PtOpenAdapterComplete() 中也是一样。

希望各路高手帮忙,还要提供什么信息尽管问,谢谢大家!!!

最新喜欢:

txysptxysp
yuxin_heu
驱动牛犊
驱动牛犊
  • 注册日期2003-01-03
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-09-25 20:07
我在passthru的基础上修改,想利用上层协议或者ndis发出的
OID_802_3_CURRENT_ADDRESS来查询网卡的mac地址。问题是这个查询
的InformationBuffer指向的是一个什么结构?我在ddk中找不到。是
不是和edust在上面定义的一样?
bangh
驱动牛犊
驱动牛犊
  • 注册日期2003-03-26
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分57分
  • 威望75点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-09-22 16:20
这个帖子的提示很不错,按此方法,我也正确地得到本机的mac;
不过,对于那些不在MPSETINFORMAION和QUERYINFORMATION中出现的oid,怎么办呢?
我在QUERYINFORMATION中自己动态分配内存,并调用ndisrequest,同样是兰屏。
按照pakcet例子的做法,在irp处理过程中调用ndisrequest来设置混杂模式,却兰屏。
各位过来人有没有找到原因和方法呢。
bingjie
驱动小牛
驱动小牛
  • 注册日期2001-08-15
  • 最后登录2007-11-29
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-12-18 14:16
至少TCP/IP协议肯定会发送查询MAC地址的请求,否则它怎么知道底层的网卡是不是被换过了。
edust
驱动中牛
驱动中牛
  • 注册日期2002-04-02
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-12-18 10:56
 
这应该是由于异步调用,你的ProtocoleRequestComplete函数处理不当造成的,实际上由于你是一个中间层,上层协议发的查询MAC地址的请求也会返回到你的PTRequestComplete函数中,因此在该函数中需要判断已经结束的这个Request是你自己发出的,还是别人发出的,是自己发出的,就取得该MAC地址,而且不需要再调用NdisMQueryInformationComplete,否则上层协议有可能释放你在Adapter中的内存,必然会出错。
若真是该原因,有两个解决办法,一是如果你自己只发出查询MAC地址的请求,无其它请求,则只需要在PTRequestComplete中检查到别人的查询,直接利用它的结果即可。二是如果还有其它请求则需要在某处做出标示,可以区分是自己的还是别人。另外Request最好动态分配,由于一步调用的关系,用一个Request变量发多个请求有可能会导致问题。


bingjie 兄当真高人也!!!

是的我只是单单查询网卡的 MAC 地址,刚才我试了一下你说的第一种方法,确实有效!!!但同时我也有一点顾虑,因为总感觉是在依赖别人发出的 Request,我想问的是:上层协议总是会查询下层网卡的 MAC 地址吗?如果是这样的话那我就不需要为了这一个单独的操作来建立一套内部 Request 机制了!

看了老兄上面的话我现在对 PCAUSA 的 PIM 里面的内部 Request 机制有了更进一步的认识,真是非常感谢啊!!!

至于我的那段程序错在哪里,虽然还没有试过,但我想就是老兄你说的那样:是我对 PtRequestComplete 的处理不当!现在我使用你的第一种策略已经搞定了,以后有时间我会把第二种也试一下的!

再次表示感谢!!!又领悟到了一些东西:)
bingjie
驱动小牛
驱动小牛
  • 注册日期2001-08-15
  • 最后登录2007-11-29
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-12-18 09:05
为了能让大家明白我的问题从而更快的给我建议我尽量把问题说清楚一点:

我改写的是 XP 版的 Passthru,用于 2000 中。我的目的是想要查询我的 IMD 绑定的网卡的 MAC 地址,于是我在 MPInitialize() 的结尾部分写了如下代码:
pAdapt->Request.RequestType = NdisRequestQueryInformation;
pAdapt->Request.DATA.QUERY_INFORMATION.Oid = OID_802_3_CURRENT_ADDRESS;
pAdapt->Request.DATA.QUERY_INFORMATION.InformationBuffer = pAdapt->MACAddress;
pAdapt->Request.DATA.QUERY_INFORMATION.InformationBufferLength = 6;
pAdapt->Request.DATA.QUERY_INFORMATION.BytesWritten = 0;
pAdapt->Request.DATA.QUERY_INFORMATION.BytesNeeded = 0;
NdisRequest( &Status, pAdapt->BindingHandle, &pAdapt->Request );

Request 就定义在原来的 ADAPT 结构中:
NDIS_REQUEST Request;

但是现在程序会因此蓝屏,我把上面代码放在 PtOpenAdapterComplete() 中也是一样。

希望各路高手帮忙,还要提供什么信息尽管问,谢谢大家!!!

这应该是由于异步调用,你的ProtocoleRequestComplete函数处理不当造成的,实际上由于你是一个中间层,上层协议发的查询MAC地址的请求也会返回到你的PTRequestComplete函数中,因此在该函数中需要判断已经结束的这个Request是你自己发出的,还是别人发出的,是自己发出的,就取得该MAC地址,而且不需要再调用NdisMQueryInformationComplete,否则上层协议有可能释放你在Adapter中的内存,必然会出错。
   若真是该原因,有两个解决办法,一是如果你自己只发出查询MAC地址的请求,无其它请求,则只需要在PTRequestComplete中检查到别人的查询,直接利用它的结果即可。二是如果还有其它请求则需要在某处做出标示,可以区分是自己的还是别人。另外Request最好动态分配,由于一步调用的关系,用一个Request变量发多个请求有可能会导致问题。
edust
驱动中牛
驱动中牛
  • 注册日期2002-04-02
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-12-17 21:00
 
对了,你试试指针的指针!反正NDIS中好多都要用到指针的指针!我也不知道,你就试试了!!好运!!


monkeyy,你是对的,这应该是错误之一,在看过你的回复之后我对照了一下 PCAUSA 的 PIM 代码,发现确实如你所说:
pTCPH_IRequest->m_NdisRequest.DATA.QUERY_INFORMATION.InformationBuffer = &pTCPH_AEReserved->m_Address;

这里的 m_Address 定义为:
CHAR m_Address[ ETH_LENGTH_OF_ADDRESS ];
(ETH_LENGTH_OF_ADDRESS 在某处被定义成了 6)



不过可能其它地方还有错误,因为这样改动之后蓝屏依旧!

谢谢 monkeyy!
我确实很菜,大家继续帮忙,谢谢!
leepyzh
禁止发言
禁止发言
  • 注册日期2001-04-27
  • 最后登录2018-05-30
  • 粉丝0
  • 关注0
  • 积分3668分
  • 威望18340点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于:2002-12-17 19:54
用户被禁言,该主题自动屏蔽!
monkeyy
驱动中牛
驱动中牛
  • 注册日期2001-12-06
  • 最后登录2010-10-10
  • 粉丝0
  • 关注0
  • 积分315分
  • 威望84点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-12-17 18:51
对了,你试试指针的指针!反正NDIS中好多都要用到指针的指针!我也不知道,你就试试了!!好运!!
听说老虎会吃人,所以从没想过去摸老虎的屁股。:( :(
ydyuse
驱动老牛
驱动老牛
  • 注册日期2002-07-25
  • 最后登录2005-03-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-12-17 11:54
可用
__try
{
__try
{
}
__except()
{
}
__finally
{
}
来捕获到而异常,从而进行精确的定位。
另外一种方法是调试。

生命驱动,活力无限!
ydyuse
驱动老牛
驱动老牛
  • 注册日期2002-07-25
  • 最后登录2005-03-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-12-17 11:52
我试了一下,改成了:
UCHAR MACAddress[7];

结果还是一样,我把蓝屏信息抄下来了:
*** STOP: 0x000000D1 (0x00000000,0x00000002,0x00000001,0xED4C1B0B1)

DRIVER_IRQL_NOT_LESS_OR_EQUAL


原因:驱动程序在DISPATCH_LEVEL_IRQ或之上接触分页内存。

驱动程序可能使用了一个假的指针。
参数1:被引用的地址
参数2:引用时的IRQL
参数3:访问类型1-写 0-读
可使用它的第四个错误检查参数(发生引用的地址)可找到有问题的源代码行。


生命驱动,活力无限!
edust
驱动中牛
驱动中牛
  • 注册日期2002-04-02
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-12-17 11:40
我试了一下,改成了:
UCHAR MACAddress[7];

结果还是一样,我把蓝屏信息抄下来了:
*** STOP: 0x000000D1 (0x00000000,0x00000002,0x00000001,0xED4C1B0B1)

DRIVER_IRQL_NOT_LESS_OR_EQUAL
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-12-17 11:26
用 uchar
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-12-17 11:25
你设成7看看?
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
edust
驱动中牛
驱动中牛
  • 注册日期2002-04-02
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-12-17 10:56
 
错误是驱动程序可能使用一个假的指针。
估计是:
CHAR MACAddress[6];
用法有错。


这个 CHAR 数组定义在 ADAPT 结构中,它在程序给每一个 Adapter 分配 ADAPT 空间时已经分配了空间了啊,ydyuse 能说一下你的怀疑吗,6 是不是不够大?
edust
驱动中牛
驱动中牛
  • 注册日期2002-04-02
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2002-12-17 10:51
 
应该在openadapter成功以后才去查询

可我是在 MPInitialize 结尾处才查的啊,而 MPInitialize 又是在 PtBindAdapter 中由 NdisIMInitializeDeviceInstanceEx 触发的,此时 NdisOpenAdapter 操作已经完成了。


 
看看你的build.wrn,里面有没有什么这方面的警告?

我的程序一个警告都没有,奇怪!:(

[编辑 -  12/17/02 by  edust]
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2002-12-17 10:25
看看你的build.wrn,里面有没有什么这方面的警告?
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
ydyuse
驱动老牛
驱动老牛
  • 注册日期2002-07-25
  • 最后登录2005-03-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2002-12-17 10:02
错误是驱动程序可能使用一个假的指针。
估计是:
CHAR MACAddress[6];
用法有错。

生命驱动,活力无限!
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2002-12-17 09:50
应该在openadapter成功以后才去查询
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
edust
驱动中牛
驱动中牛
  • 注册日期2002-04-02
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2002-12-17 09:32
 
你是在注册协议之前查询的还是注册以后查询的?


是在之后啊,我现在是在 MPInitialize 的末尾查询,协议已经注册了。
上一页
游客

返回顶部