阅读:1918回复:6
TDI Filter问题求教
在TDI截获发送和来自TCP/UDP的数据(hook TCP和UDP设备),
对截获的数据处理后送出. 在截获和处理接收数据(TDI_RECEIVE)时不知道如何做, 数据可以通过EventReceiveXxx,也可以通过完成用户提交的 TDI_RECEIVE的Irp获得. 向大家求教,应该怎么截获并处理(解密)接收数据呢? 谢谢! |
|
最新喜欢:aasa1 |
沙发#
发布于:2002-10-29 17:12
你好象什么都明白,还问什么呢?
|
|
板凳#
发布于:2002-10-29 17:49
你好象什么都明白,还问什么呢? 谢谢fracker的回贴. 我不知道应该在下面四个函数中哪个中截获数据, TdiReceiveComplete TdiReceiveOnEventHandler TdiChainedReceiveEventHandler TdiReceiveEventHandler 我试在TdiReceiveComplete和TdiReceiveOnEventHandler 中处理接收的数据,但不能使用 MmGetMdlVirtualAddress(Isp->MdlAddress) 得到的数据指针. 不知道这种思路对不对? 如果对的话,又怎样得到正确的指向数据的指针呢? 向大家请教. 我是新手,第一次写驱动,请大家多帮助. |
|
地板#
发布于:2002-10-30 10:17
根据我的理解,拦截Complete系列的函数都是没有意义的。因为这些函数都是在数据处理完了以后,用来释放资源的。
我觉得你应该拦截以下东东: TDI_RECEIVE(TCP) TDI_RECEIVE_DATAGRAM(UDP) 这两个好像一般都不会被调用。 TDI_SET_EVENT_HANDLER TDI_EVENT_RECEIVE TDI_EVENT_CHAINED_RECEIVE TDI_EVENT_RECEIVE_EXPEDITED TDI_EVENT_CHAINED_RECEIVE_EXPEDITED TDI_EVENT_RECEIVE_DATAGRAM TDI_EVENT_CHAINED_RECEIVE_DATAGRAM 拦截以上事件的回掉函数,因该可以拦截到数据,这是我根据DDK的理解的,没有编程实践过,所以有些数据可能多余,你自己揣摩吧。 |
|
地下室#
发布于:2002-10-30 10:36
[quote]你好象什么都明白,还问什么呢? 谢谢fracker的回贴. 我不知道应该在下面四个函数中哪个中截获数据, TdiReceiveComplete TdiReceiveOnEventHandler TdiChainedReceiveEventHandler TdiReceiveEventHandler 我试在TdiReceiveComplete和TdiReceiveOnEventHandler 中处理接收的数据,但不能使用 MmGetMdlVirtualAddress(Isp->MdlAddress) 得到的数据指针. 不知道这种思路对不对? 如果对的话,又怎样得到正确的指向数据的指针呢? 向大家请教. 我是新手,第一次写驱动,请大家多帮助. [/quote] 都要还要加上UDP的那几个EVENT。 你要仔细看TDI的文档。 |
|
|
5楼#
发布于:2002-10-30 11:23
谢谢资深专家fracker,版主gjpland. 谢谢大家的支持. 我这就去试,仔细读DDK,并将结果贴出来, 遇到问题继续向大家求教. |
|
6楼#
发布于:2002-11-07 18:20
首先祝贺fracker成为版主!
经过大家指导和自己一段时间的摸索, 将自己在TDI处理数据的一些体会贴出来,不对之处请大家指点. 谢谢版主fracker和gjpland的帮助,给分. 发送数据拦截处理: TDI_SEND TDI_SEND_DATAGRAM 接收数据拦截处理: TDI_EVENT_RECEIVE TDI_EVENT_CHAINED_RECEIVE TDI_EVENT_RECEIVE_EXPEDITED TDI_EVENT_CHAINED_RECEIVE_EXPEDITED TDI_RECEIVE_COMPLETE TDI_RECEIVE_ON_EVENT_COMPLETE TDI_EVENT_RECEIVE_DATAGRAM TDI_EVENT_CHAINED_RECEIVE_DATAGRAM TDI_RECEIVE_DG_COMPLETE TDI_RECEIVE_DG_ON_EVENT_COMPLETE fracker讲不拦截Complete系列的函数, 试验中我发现如果发送端一次发送的数据很多(>IP包长度), TDI_EVENT_RECEIVE(TDI_EVENT_RECEIVE_DATAGRAM)事件只 发生一次,用户会发出TDI_RECEIVE请求获得剩下的数据. 我想出的办法就是通过拦截Complete来获得剩下的数据, 不知道这种思路对不对? DDK文档讲CHAINED系列得到的数据是只读的, 我试着修改过,也成功了,这种做法是否正确? |
|