阅读:2129回复:13
passthru中NdisRequest应该放在哪个函数中较好?
在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()函数中,这样的话每接收到一个包都会发出这个请求,无疑会影响到包的处理速度。 请各位高手不惜赐教,指点迷津。谢谢 |
|
|
沙发#
发布于:2003-10-26 20:12
在QueryInformationHandler处理,判断OID,可以得到地址。
|
|
板凳#
发布于:2003-10-26 21:13
以arthurtu老兄的意思是根本不需要自己发出NdisRequest请求,在QueryInformationHandler里直接就可以拦截到这样的OID吗?
还有,我刚才把上面的那段代码放到了InitializeHandler的快结束的地方,程序没有蓝屏,一切正常,但是我用来存放地址的全局变量中的值没有改变,一直是为0! |
|
|
地板#
发布于:2003-10-26 21:38
是的。
|
|
地下室#
发布于:2003-10-26 21:41
我马上就试试,如果能成,回来我就给分:)
|
|
|
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状态,这一状态应该在哪拦截啊? |
|
|
6楼#
发布于:2003-10-27 11:24
arthurtu老兄我在QueryInformationHandler里加了以下代码: 我靠,I服了You! 你这是谁拷贝给谁啊? |
|
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老兄指正 |
|
|
8楼#
发布于:2003-10-27 13:39
你没看DDK的文档关于MiniportQueryInformation的说明吧?
MiniportQueryInformation是协议层用来查询网卡的参数的,比如mac地址,网卡速度等等,InformationBuffer是协议传过来的数据,要你把信息写到这个缓冲区里面的,你却用它来拷贝到。。。 能成么?passthru安装以后,都有一个passthru 的Miniport对应真是的miniport,你的NdisRequest的BindHandle用真实网卡Handle就可以了,你不必在MPQueryInformation里面做什么,本来MPQueryInformation就是是简单地将你的请求发给对应的真实网卡驱动的。 informationbuffer 拷到myMac 啊,不对吗,总不能是myMac拷到informationbuffer 吧。 |
|
9楼#
发布于:2003-10-27 13:43
而且。。。
看你的代码,似乎是InformationBuffer指向MyMac,通过调用以后,你又在MPQueryInformation这个地方拦住,将InformationBuffer的数据拷贝到MyMac, 乱了套了。 |
|
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])); } 见笑见笑。 |
|
11楼#
发布于:2003-10-27 15:08
MAC_ADDR_LEN == 6;
|
|
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的批评对我同样的重要,所以也就如此处理了:) |
|
|
13楼#
发布于:2003-10-27 21:57
建议翻翻以前的旧帖子,有讨论的更清楚、更详细的。
|
|