阅读:2709回复:5
紧急求助:TDI filter接收数据问题
我做tdi filter 统计下载数据 的大小
我传了一个13k的数据文件到计算机上 , 可在TDI_RECEIVE里面只收到8k多点,其他响应TDI_RECEIVE_DATAGRAM: TDI_SET_EVENT_HANDLER: TDI_EVENT_RECEIVE: TDI_EVENT_CHAINED_RECEIVE_EXPEDITED: TDI_EVENT_RECEIVE_DATAGRAM: TDI_EVENT_RECEIVE_EXPEDITED: TDI_EVENT_CHAINED_RECEIVE: TDI_EVENT_CHAINED_RECEIVE_DATAGRAM: 中也未收到任何数据, 请问是什么原因? 难道还有其他地方接收数据? 谢谢 |
|
沙发#
发布于:2007-03-14 21:33
怎么没人回答,是不是没有人碰到这个问题?
|
|
板凳#
发布于:2007-03-15 01:23
晕倒。。。问人的时候,能不能把信息写得清楚一点,连标志位都要让人猜..?在Tdi_Receive()中的完成例程中看看,你也许会有惊喜的(或者是惊吓)...还有,依照TDI的做法,大多数情况下,优先使用ChainedRecv,然后才是EventRecv,用得最少的是Tdi_Receive.....不知道你自己里面怎么写的!
|
|
|
地板#
发布于:2007-03-15 09:50
下面是我的代码, 我测试时直接就没有经过 TDI_RECEIVE以外的路径。
而且我当我设置了 我自己的TDI_EVENT_RECEIVE事件的回调函数Tdi_RcvEvent(代码在后面)后,打开网页时会出现异常, KMODE_EXCEPTION_NOT_HANDLED, 请各位指点。 switch(pIoStack->MinorFunction) { case TDI_RECEIVE: DbgPrint("filter device receive date!"); DbgPrint("Receive date len: %ld",MmGetMdlByteCount(irp->MdlAddress)); break; case TDI_RECEIVE_DATAGRAM: DbgPrint("filter device receive Gram date!"); DbgPrint("Receive Gram date len: %ld",MmGetMdlByteCount(irp->MdlAddress)); break; case TDI_SET_EVENT_HANDLER: switch(r->EventType) { case TDI_EVENT_RECEIVE: DbgPrint("In event receive date!"); if(r->EventHandler!=NULL) { context->oldHandler = r->EventHandler; context->oldContext = r->EventContext; r->EventHandler = Tdi_RcvEvent; r->EventContext = context; } break; case TDI_EVENT_CHAINED_RECEIVE_EXPEDITED: DbgPrint("In event receive chain_receivePexpedited!"); break; case TDI_EVENT_RECEIVE_DATAGRAM: DbgPrint("In event receive gram date!"); break; case TDI_EVENT_RECEIVE_EXPEDITED: DbgPrint("In event expedited receive date!"); break; case TDI_EVENT_CHAINED_RECEIVE: DbgPrint("In event chain receive date!"); break; case TDI_EVENT_CHAINED_RECEIVE_DATAGRAM: DbgPrint("In event chain receive datagram!"); break; } } NTSTATUS Tdi_RcvEvent ( PVOID EventContext, PVOID ConnectionContext, ULONG Flags, ULONG Indicated, ULONG Available, ULONG *Taken, PVOID *Data, PIRP *irp) { TDI_EVENT_CONTEXT *ctx = (TDI_EVENT_CONTEXT*)EventContext; NTSTATUS status; DbgPrint("\nIn event receive date len: %ld\n",Indicated); status = ((PTDI_IND_RECEIVE)(ctx->oldHandler))( ctx->oldContext, ConnectionContext, Flags, Indicated, Available, Taken, Data, irp); return status; } |
|
地下室#
发布于:2007-03-17 22:23
在Tdi_Event_Recv()中,记得对返回Pending的值,进行处理...
|
|
|
5楼#
发布于:2007-03-17 22:25
如果光拿来做数据统计,是很简单的.
|
|
|