hust_wu
驱动牛犊
驱动牛犊
  • 注册日期2003-10-10
  • 最后登录2003-11-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2129回复:13

passthru中NdisRequest应该放在哪个函数中较好?

楼主#
更多 发布于:2003-10-26 19:49
在passthru里我想取得本机的MAC地址,NdisRequest应该放在哪个函数里面?我试着把它放在PtBindAdapter函数里面,但是不能成功。
具体位置:
在do {} while(false)循环的下面一句,下面是我添加的代码:
NdisIMInitializeDeviceInstanceEx(DriverHandle, &Param->ParameterData.StringData,       pAdapt);

} while(FALSE);
pAdapt->Request.RequestType = NdisRequestQueryInformation;
pAdapt->Request.DATA.QUERY_INFORMATION.Oid =
OID_802_3_CURRENT_ADDRESS;
pAdapt->Request.DATA.QUERY_INFORMATION.InformationBuffer = (PVOID)myMac;
pAdapt->Request.DATA.QUERY_INFORMATION.InformationBufferLength = 6;
NdisRequest (Status,
pAdapt->BindingHandle,
&pAdapt->Request);

好象这个时候miniport.c中的MPInitialize函数还没有成功返回,全局变量pAdaptList的值都还是为空。
我实在不知道,我的这个请求应该放在哪比较好,我也不能把它放在PtReceivePacket()函数中,这样的话每接收到一个包都会发出这个请求,无疑会影响到包的处理速度。

请各位高手不惜赐教,指点迷津。谢谢
每一天都应该在进步
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2003-10-26 20:12
在QueryInformationHandler处理,判断OID,可以得到地址。
hust_wu
驱动牛犊
驱动牛犊
  • 注册日期2003-10-10
  • 最后登录2003-11-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-10-26 21:13
以arthurtu老兄的意思是根本不需要自己发出NdisRequest请求,在QueryInformationHandler里直接就可以拦截到这样的OID吗?

还有,我刚才把上面的那段代码放到了InitializeHandler的快结束的地方,程序没有蓝屏,一切正常,但是我用来存放地址的全局变量中的值没有改变,一直是为0!
每一天都应该在进步
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2003-10-26 21:38
是的。
hust_wu
驱动牛犊
驱动牛犊
  • 注册日期2003-10-10
  • 最后登录2003-11-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-10-26 21:41
我马上就试试,如果能成,回来我就给分:)
每一天都应该在进步
hust_wu
驱动牛犊
驱动牛犊
  • 注册日期2003-10-10
  • 最后登录2003-11-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-10-27 09:55
arthurtu老兄我在QueryInformationHandler里加了以下代码:
if (Oid == OID_802_3_CURRENT_ADDRESS && Status == NDIS_STATUS_SUCCESS)
{
NdisMoveMemory((PVOID)myMac, InformationBuffer, 6);
}
是在NdisRequest之后,但是myMac的值还是0。我在想,NdisRequest返回的应该是PENDING状态,这一状态应该在哪拦截啊?
每一天都应该在进步
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
6楼#
发布于:2003-10-27 11:24
arthurtu老兄我在QueryInformationHandler里加了以下代码:
if (Oid == OID_802_3_CURRENT_ADDRESS && Status == NDIS_STATUS_SUCCESS)
{
NdisMoveMemory((PVOID)myMac, InformationBuffer, 6);
}
是在NdisRequest之后,但是myMac的值还是0。我在想,NdisRequest返回的应该是PENDING状态,这一状态应该在哪拦截啊?

我靠,I服了You!
你这是谁拷贝给谁啊?
hust_wu
驱动牛犊
驱动牛犊
  • 注册日期2003-10-10
  • 最后登录2003-11-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-10-27 13:23
informationbuffer 拷到myMac 啊,不对吗,总不能是myMac拷到informationbuffer 吧。
passthru程序结构我没有搞懂,这里我是按athurtu老兄说的,直接在MpQueryInformation里拦截OID为OID_802_3_CURRENT_ADDRESS然后从informationbuffer里把数据拷出来。我把知道fracker老兄的意思是不是说应该把myMac的地址值付给informationbuffer。如果是这意思,那肯定不对,因为informationbuffer是一个传入参数。
还请fracker老兄指正
每一天都应该在进步
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
8楼#
发布于:2003-10-27 13:39
你没看DDK的文档关于MiniportQueryInformation的说明吧?
MiniportQueryInformation是协议层用来查询网卡的参数的,比如mac地址,网卡速度等等,InformationBuffer是协议传过来的数据,要你把信息写到这个缓冲区里面的,你却用它来拷贝到。。。
能成么?passthru安装以后,都有一个passthru 的Miniport对应真是的miniport,你的NdisRequest的BindHandle用真实网卡Handle就可以了,你不必在MPQueryInformation里面做什么,本来MPQueryInformation就是是简单地将你的请求发给对应的真实网卡驱动的。

informationbuffer 拷到myMac 啊,不对吗,总不能是myMac拷到informationbuffer 吧。
passthru程序结构我没有搞懂,这里我是按athurtu老兄说的,直接在MpQueryInformation里拦截OID为OID_802_3_CURRENT_ADDRESS然后从informationbuffer里把数据拷出来。我把知道fracker老兄的意思是不是说应该把myMac的地址值付给informationbuffer。如果是这意思,那肯定不对,因为informationbuffer是一个传入参数。
还请fracker老兄指正
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
9楼#
发布于:2003-10-27 13:43
而且。。。
看你的代码,似乎是InformationBuffer指向MyMac,通过调用以后,你又在MPQueryInformation这个地方拦住,将InformationBuffer的数据拷贝到MyMac,
乱了套了。
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
10楼#
发布于:2003-10-27 15:06
不好意思,是我说错了,在PtRequestComplete里面处理。

// get mac address here
        if ( Oid == OID_802_3_CURRENT_ADDRESS))
        {
            NdisMoveMemory(&MacAddr[0],
                NdisRequest->DATA.QUERY_INFORMATION.InformationBuffer, MAC_ADDR_LEN);
            KdPrint((\"get mac address: %X-%X-%X-%X-%X-%X!\\n\",
                MacAddr[0],
                MacAddr[1],
                MacAddr[2],
                MacAddr[3],
                MacAddr[4],
                rMacAddr[5]));
        }

见笑见笑。
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
11楼#
发布于:2003-10-27 15:08
MAC_ADDR_LEN == 6;
hust_wu
驱动牛犊
驱动牛犊
  • 注册日期2003-10-10
  • 最后登录2003-11-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-10-27 20:00
谢谢两位的指教,按照arthurtu的指点,我取到了MAC地址。
有几点不明白的地方还要向两们请教:
两位从两个不同的方向都给予了我帮助。arthurtu老兄是直接的。
而fracker老兄的批评当然也让我获益非浅。

1.我一直以为PtRequestComplete只是用来处理自己发出的NdisRequest请求的,从现在的情况来看这个函数应该是用来处理所有的状态处于pending的NdisRequest请求的。不知道我说的对不对。
2.MpQueryInformation主要是用来处理上层协议发出的NdisRequest请求,自己能处理的就直接可以把数据送给InformationBuffer,不能处理的则调用NdisRequest往真实的Miniport发出请求,同样如果调用的NdisRequest返回的状态是SUCCESS那么我在MpQueryInformation中的拦截应该也是可以的对不对?
fracker说InformationBuffer是用来往里面填入数据的,这说得很对,但如果是要MpQueryInformation继续调用NdisRequest来处理的话,那么InformationBuffer中的数据也不是由MpQueryInformation来填入的,而且如果调用的NdisRequest直接返回SUCCESS状态,那么此时的拦截应该是可以的。我这样的理解是不是对的?两位老大!

先兑现该给的分了,两人一样的多。这对arthrutu好象有点不大公平,不过为了表示我真的觉得fracker的批评对我同样的重要,所以也就如此处理了:)
每一天都应该在进步
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
13楼#
发布于:2003-10-27 21:57
建议翻翻以前的旧帖子,有讨论的更清楚、更详细的。
游客

返回顶部