阅读:2284回复:2
TDI receive的问题
如果用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; } |
|
最新喜欢:hbnhbn...
|
沙发#
发布于:2004-12-24 09:00
楼主这样得到的只是tcp的数据部分吧,能否得到mac呢
|
|
|
板凳#
发布于:2004-12-11 13:16
楼主这个问题解决了吗?
|
|