阅读:3436回复:33
中间层接受数据的问题请指教
1.PtReceive和PtReceivePacket分别会在什么情况下调用,ddk上说的实在没看懂
2.为什么我试xpassthru总是进不去PtReceive但却可以进PtReceiveComplete 3.ptreceivepacket或MPReturnPacket中没有如ptreceive 中的LookAheadBuffer那我要拿packet的数据该怎么办 |
|
最新喜欢:![]() |
沙发#
发布于:2004-03-23 20:18
ptRecevie和ptReceivePacket的调用,与miniport driver的驱动调用函数有关,如果miniport调用NdisMIndicateReceivePacket ,则协议驱动调用ptReceivePacket
|
|
|
板凳#
发布于:2004-03-24 09:04
谢谢楼上的回答不过第三个问题最关键还请再指教
|
|
地板#
发布于:2004-03-25 09:00
谢谢楼上的回答不过第三个问题最关键还请再指教 NdisTransferData |
|
地下室#
发布于:2004-03-25 09:02
ptreceivePacket的数据报已经完整的接收,函数参数中的packet包含有完整的数据
|
|
|
5楼#
发布于:2004-03-25 09:42
老大是什么意思这个不是用来发送的吗 |
|
6楼#
发布于:2004-03-25 10:02
NdisTransferData是用来接收的,你要把DDK看仔细了,不过如START所讲PtReceivePacket
被调用时,完整的数据已经在PACKET中了,不用这个函数,是我说错了。 你要取出PACKET中的数据应做如下操作: void CopyPacket2Buffer(IN PNDIS_PACKET pPacket, IN OUT PUCHAR pBuff, IN OUT PUINT pLength) { PNDIS_BUFFER BuffDT; PUCHAR BuffVA; UINT BuffLen; *pLength=0; BuffLen=0; NdisQueryPacket(pPacket,NULL,NULL,&BuffDT,NULL); while(BuffDT!=(PNDIS_BUFFER)NULL) { NdisQueryBuffer(BuffDT,&BuffVA,&BuffLen); NdisMoveMemory(pBuff,BuffVA,BuffLen); pBuff=pBuff+BuffLen; *pLength+=BuffLen; NdisGetNextBuffer(BuffDT,&BuffDT); } return; } |
|
7楼#
发布于:2004-03-25 10:18
ddk里推荐的是上述方法,返回NULL为结束。非要用FOR语句,我没试过,你可试试。
|
|
8楼#
发布于:2004-03-26 08:57
搞定了,多谢,不过还想问一下如果我想把这些数据和应用程序共享或者传递给应用程序该怎么办
|
|
9楼#
发布于:2004-03-26 09:23
以前的帖子里就有例程,找找去。
|
|
10楼#
发布于:2004-03-26 14:07
再问一句这样取出来的数据因该是包括Mac头在内的吧
|
|
11楼#
发布于:2004-03-26 17:34
是。不过还是自己取出来看看就明白了。
|
|
12楼#
发布于:2004-03-27 19:01
顶,我最近也遇到这个问题。
|
|
|
13楼#
发布于:2004-03-29 15:46
NdisTransferData是用来接收的,你要把DDK看仔细了,不过如START所讲PtReceivePacket 老大我今天写程序是了有两个问题第一个pBuff在移动的时候已经移到buffer中指相最后一块数据开始的位置,这个是小问题 第二个IN OUT PUCHAR pBuff,在调用之前要对pBuff初始化,怎么给它分配一段空间,如果初始化为NULL的话NdisMoveMemory(pBuff,BuffVA,BuffLen);根本就没办法执行,老大要怎么搞定它。 |
|
14楼#
发布于:2004-03-29 16:17
用NdisAllocateMemory();或者,ExAllocatePool()来分配非分页内存。
|
|
|
15楼#
发布于:2004-03-29 16:40
老大还有个更大的麻烦我想在PtReceivePacket中做这件事但是他是运行在Dispatch_Level而NdisMoveMemory(tBuffer,BuffVA,BuffLen);的BuffVA是一个零时变量所以NdisMoveMemory必须运行在IRQL < DISPATCH_LEVEL一运行系统就说IRPL_NOT_LESS_OR_EQUAL到底要怎么才能搞定
|
|
16楼#
发布于:2004-03-30 09:13
用NdisAllocateMemory();或者,ExAllocatePool()来分配非分页内存。 这样他就不是临时变量了,其实只要同在DISPATCH_LEVEL的函数中,临时变量也没问题。但传递0是万万不可的,要杀头的。 |
|
17楼#
发布于:2004-03-30 12:03
使用NdisMoveMemory()操作的一定要都是自己开辟的内存空间,不然就会遇到你碰到的事情。使用NdisMoveMemory()要小心,你必要时候可以把要处理的内容考出来吗。
|
|
|
18楼#
发布于:2004-03-31 11:04
用NdisAllocateMemory();或者,ExAllocatePool()来分配非分页内存。 老大我把pBuff定义成全局变量然后在DriverEntry中执行以下操作分配内存 NDIS_PHYSICAL_ADDRESS addr; addr.QuadPart=-1; Status = NdisAllocateMemory(pBuff,2048,0,addr); 为什么也会重启 |
|
19楼#
发布于:2004-03-31 11:17
倒!
PASSTHRU里有的。 #define TAG 'ImPa' PUCHAR pBuffer; NdisAllocateMemoryWithTag(&pBuffer,2048,TAG); ... NdisFreeMemory(pBuffer,2048,0); NdisAllocateMemoryWithTag和NdisAllocateMemory效果是一样的,唯一的区别去看DDK; |
|
上一页
下一页