lingzjl
驱动牛犊
驱动牛犊
  • 注册日期2001-10-06
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
阅读:2269回复:2

TDI receive的问题

楼主#
更多 发布于:2004-04-20 15:32
如果用ClientEventReceive()响应数据到来,然后在ClientEventReceive()中拷贝indicated个数据,一切都是好的,
问题是TDI每10个字节才调用一次ClientEventReceive(),这样最后的一个字节就收不上来,必须凑足10个字节才可以。
有什么办法能让每个字节都收上来?

后来我想在ClientEventReceive()中把indicated个字节拷贝之后,再
用IoAllocateIrp和TdiBuildReceive创建一个TDI_RECEIVE的IRP,
让TdiBuildReceive()的最后一个参数指向这个IRP,
TdiBuildReceive()函数返回STATUS_MORE_PROCESSING_REQUIRED;
但是总是蓝屏,似乎是IRQL的问题,但我搞不清楚到底是啥问题。
下面是我的ClientEventReceive()函数。\"拷贝indicated个字节到我的缓冲区;\"这部分省略了,其中的address1是我的缓冲区,是用ExAllocatePool(NonPagedPool,size);分配的。

谢谢!




NTSTATUS
TDIClnEventReceive(
PVOID                pEventCtx,    // Address of event context supplied in TdiBuildSetEventHandler().
CONNECTION_CONTEXT   pConnCtx,     // Connection context (that from ZwCreateFile on endpoint and from connection event).
ULONG                Flags,        // Flag values are mapped in tdi.h, eg, TDI_RECEIVE_NORMAL.
ULONG                Indicated,    // Number of bytes currently available in TSDU.
ULONG                Available,    // Total number of bytes available (if greater than currently available, requires another Irp).
PULONG               pBytesTaken,  // Output number of bytes taken (copied from TSDU).
PVOID                pTSDU,        // Pointer to TSDU.
PIRP               * ppIrp         // Output Irp address if more bytes available than indicated and they are to be subsequently received.
)
{
DebugPrint(\"EventReceive:flags=0x%x,indicate=0x%x,available=0x%x\\n\",Flags,Indicated,Available);
IO_STATUS_BLOCK       ReqIoStatus;
pTDIClnConn            pLclConn =                    // Recast connection context pointer.
(pTDIClnConn)pConnCtx;

NTSTATUS               status =STATUS_SUCCESS ;
//完成;

PIRP         pIrpnew;

拷贝indicated个字节到我的缓冲区;

//再接收一次
 do{ EXCEPTION_POINTERS    * pExceptionInfo;      
               ULONG                   lclExceptionCode;    
               PVOID                   lclExceptionAddr;  

               pIrpnew = IoAllocateIrp(pLclConn->pDevExt->fdo->StackSize, FALSE);

 if(NULL==pIrpnew)
 {
  DebugPrint(\"pIrpnew error\\n\");
  break;
 }
 

//映射到MDL:

     PMDL pMdl = IoAllocateMdl(address1,n,FALSE,FALSE,pIrpnew);
     
 if(NULL==pMdl)
 {
  DebugPrint(\"MDL map error\\n\");
  break;
 }

_try
{
MmProbeAndLockPages(pMdl,                     // (Try to) fix buffer.
KernelMode,
IoModifyAccess
);
}
        _except(
pExceptionInfo = GetExceptionInformation(),                                                                                                                                                                                                    
lclExceptionCode = pExceptionInfo->ExceptionRecord->ExceptionCode,                                                                                                                                                                            
lclExceptionAddr = pExceptionInfo->ExceptionRecord->ExceptionAddress,                                                                                                                                                                          
EXCEPTION_EXECUTE_HANDLER                                                                                                                                                                                                                      
)                                                                                                                                                                                                                                              
{                                                                                                                                                                                                                                                    
DebugPrint(\"read:MmProbeAndLockPages() failed.  Error = 0x%x at 0x%x\\n\",
lclExceptionCode, lclExceptionAddr);
                                                                                                                                 
break;
}                  
                  
                                    
  TdiBuildReceive(pIrpnew,
              pLclConn->pDevExt->pTcpDevObj,
  pLclConn->pDevExt->pTDIClnConnArr->pConnFileObj,
  TDIClnIoCompRtnRecv,
  pLclConn->pDevExt,
  pMdl,
  TDI_RECEIVE_NORMAL,
  n
  );
  
     }while(0);

*ppIrp = pIrpnew;
*pBytesTaken = Indicated;
//DebugPrint(\"----Out of reveive routine\\n\");
return STATUS_MORE_PROCESSING_REQUIRED;

}                    

最新喜欢:

hbnhbnhbnhbnhbn...
超级肥雀
hangzhoustayer
驱动小牛
驱动小牛
  • 注册日期2002-05-08
  • 最后登录2006-06-19
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-12-11 13:16
楼主这个问题解决了吗?
HONGLIN
驱动牛犊
驱动牛犊
  • 注册日期2002-04-04
  • 最后登录2010-03-17
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望12点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-12-24 09:00
楼主这样得到的只是tcp的数据部分吧,能否得到mac呢
不再困惑
游客

返回顶部