aulphar
驱动牛犊
驱动牛犊
  • 注册日期2004-02-23
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3439回复:33

中间层接受数据的问题请指教

楼主#
更多 发布于:2004-03-23 16:06
1.PtReceive和PtReceivePacket分别会在什么情况下调用,ddk上说的实在没看懂
2.为什么我试xpassthru总是进不去PtReceive但却可以进PtReceiveComplete
3.ptreceivepacket或MPReturnPacket中没有如ptreceive 中的LookAheadBuffer那我要拿packet的数据该怎么办

最新喜欢:

zhaihuazhaihu...
start
驱动小牛
驱动小牛
  • 注册日期2001-11-05
  • 最后登录2010-09-03
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望27点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-03-23 20:18
ptRecevie和ptReceivePacket的调用,与miniport driver的驱动调用函数有关,如果miniport调用NdisMIndicateReceivePacket ,则协议驱动调用ptReceivePacket
second
aulphar
驱动牛犊
驱动牛犊
  • 注册日期2004-02-23
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-03-24 09:04
谢谢楼上的回答不过第三个问题最关键还请再指教
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-03-25 09:00
谢谢楼上的回答不过第三个问题最关键还请再指教

NdisTransferData
start
驱动小牛
驱动小牛
  • 注册日期2001-11-05
  • 最后登录2010-09-03
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望27点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-03-25 09:02
ptreceivePacket的数据报已经完整的接收,函数参数中的packet包含有完整的数据
second
aulphar
驱动牛犊
驱动牛犊
  • 注册日期2004-02-23
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-03-25 09:42

NdisTransferData

老大是什么意思这个不是用来发送的吗
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
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;
}
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-03-25 10:18
ddk里推荐的是上述方法,返回NULL为结束。非要用FOR语句,我没试过,你可试试。
aulphar
驱动牛犊
驱动牛犊
  • 注册日期2004-02-23
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-03-26 08:57
搞定了,多谢,不过还想问一下如果我想把这些数据和应用程序共享或者传递给应用程序该怎么办
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-03-26 09:23
以前的帖子里就有例程,找找去。
aulphar
驱动牛犊
驱动牛犊
  • 注册日期2004-02-23
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-03-26 14:07
再问一句这样取出来的数据因该是包括Mac头在内的吧
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-03-26 17:34
是。不过还是自己取出来看看就明白了。
BlackLight
驱动牛犊
驱动牛犊
  • 注册日期2004-03-25
  • 最后登录2004-04-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-03-27 19:01
顶,我最近也遇到这个问题。
人与人的交流 技术与技术的交流
aulphar
驱动牛犊
驱动牛犊
  • 注册日期2004-02-23
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-03-29 15:46
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;
}
 

老大我今天写程序是了有两个问题第一个pBuff在移动的时候已经移到buffer中指相最后一块数据开始的位置,这个是小问题
第二个IN OUT PUCHAR pBuff,在调用之前要对pBuff初始化,怎么给它分配一段空间,如果初始化为NULL的话NdisMoveMemory(pBuff,BuffVA,BuffLen);根本就没办法执行,老大要怎么搞定它。
ljjlovernet
驱动小牛
驱动小牛
  • 注册日期2003-10-10
  • 最后登录2004-12-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2004-03-29 16:17
用NdisAllocateMemory();或者,ExAllocatePool()来分配非分页内存。
我是来学习的。不打扫卫生
aulphar
驱动牛犊
驱动牛犊
  • 注册日期2004-02-23
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2004-03-29 16:40
老大还有个更大的麻烦我想在PtReceivePacket中做这件事但是他是运行在Dispatch_Level而NdisMoveMemory(tBuffer,BuffVA,BuffLen);的BuffVA是一个零时变量所以NdisMoveMemory必须运行在IRQL < DISPATCH_LEVEL一运行系统就说IRPL_NOT_LESS_OR_EQUAL到底要怎么才能搞定
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2004-03-30 09:13
用NdisAllocateMemory();或者,ExAllocatePool()来分配非分页内存。

这样他就不是临时变量了,其实只要同在DISPATCH_LEVEL的函数中,临时变量也没问题。但传递0是万万不可的,要杀头的。
ljjlovernet
驱动小牛
驱动小牛
  • 注册日期2003-10-10
  • 最后登录2004-12-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2004-03-30 12:03
使用NdisMoveMemory()操作的一定要都是自己开辟的内存空间,不然就会遇到你碰到的事情。使用NdisMoveMemory()要小心,你必要时候可以把要处理的内容考出来吗。
我是来学习的。不打扫卫生
aulphar
驱动牛犊
驱动牛犊
  • 注册日期2004-02-23
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2004-03-31 11:04
用NdisAllocateMemory();或者,ExAllocatePool()来分配非分页内存。

老大我把pBuff定义成全局变量然后在DriverEntry中执行以下操作分配内存
NDIS_PHYSICAL_ADDRESS           addr;
addr.QuadPart=-1;
Status = NdisAllocateMemory(pBuff,2048,0,addr);
为什么也会重启
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2004-03-31 11:17
倒!
PASSTHRU里有的。
#define TAG 'ImPa'
PUCHAR pBuffer;
NdisAllocateMemoryWithTag(&pBuffer,2048,TAG);
...
NdisFreeMemory(pBuffer,2048,0);
NdisAllocateMemoryWithTag和NdisAllocateMemory效果是一样的,唯一的区别去看DDK;

上一页
游客

返回顶部