阅读:1601回复:10
在Ptreceive 中安装这一段程序,死机。附代码
在Ptreceive()中,我的程序运行
Packet = NdisGetReceivedPacket();总是NULL,所以我将过滤的程序 写在if(Packet!=NULL) ......; else 过滤; 也就是直接修改HeaderBuffer,和Lookaheadbuffer中的值;但是只要一安装程序,死机(不蓝屏,但是鼠标键盘都没反映了) 代码如下: Packet = NdisGetReceivedPacket(....); if(Packet != NULL) {........;} else { DbgPrint(\"==>xpassthru Protocol PtReceive RePacket!:\"); NdisMoveMemory(&EthHeader,HeaderBuffer,sizeof(ETHHDR)); if(!(EthHeader.Type ^ ETHERTYPE_IP))//根据HeaderBuffer的内容, //判断下一个协议是否是IP { NdisMoveMemory(&IpHeader,LookAheadBuffer,sizeof(IPHDR)); if( IpHeader.Saddr == Htonl(FilterIpAddress) )//判断LookAheadBuffer中的地址 //是否是要过滤的地址 { DbgPrint(\"==>HAVE FILTER THE IP ADDRESS ************************\"); IpHeader.Saddr = Htonl(ConvertoIpAddress); IpHeader.Cksum = CheckSum(( PUSHORT )&IpHeader, sizeof(IPHDR)); NdisMoveMemory( LookAheadBuffer, &IpHeader, sizeof(IPHDR) ); } } if ( !(IpHeader.Ipp ^ IPPROTO_TCP) ) //判断下一个协议是否TCP { DbgPrint(\"==>NEXT PORTOCOL IS TCP PROTOCOL ************************\"); NdisMoveMemory(&TcpHeader,(PUCHAR)LookAheadBuffer+sizeof(IPHDR),sizeof(TCPHDR)); if ( TcpHeader.Sport == Htons(HTTP_PORT) )//判断过滤的端口号 { DbgPrint(\"==>HAVE FILTER THE HTTP PORT 8080 ************************\"); TcpHeader.Sport = 0x8888; NdisMoveMemory((PUCHAR)LookAheadBuffer+sizeof(IPHDR),&TcpHeader,sizeof(TCPHDR)); } } } |
|
|
沙发#
发布于:2003-01-20 14:17
有哪位大虾个我一点指点,不胜感谢:)
|
|
|
板凳#
发布于:2003-01-20 17:55
IPHDR,ETHHDR 是怎么定义的?
|
|
地板#
发布于:2003-01-21 18:59
IPHDR,he ETHER,是没有错的。是从TCP/IP的协议栈中COPY出来的
|
|
|
地下室#
发布于:2003-01-21 20:33
我加到代码里,没事啊。2000+sp3
把你的代码放上来我编译了试试 |
|
5楼#
发布于:2003-06-26 16:51
你做的和我要做的大致相同,不知道你的问题解决了没有?
我的实现中还需要有对端口号的改写,我找不到实现的函数,不知道你能否给我一些指点呢? |
|
6楼#
发布于:2003-06-26 16:53
你做的和我要做的大致相同,不知道你的问题解决了没有?
我的实现中还需要有对端口号的改写,我找不到实现的函数,不知道你能否给我一些指点呢? 下面是我的一个帖子: 1、我已经知道 UNIT NDIS_GET__PACKET_PROTOCOL_TYPE (IN PNDIS_PACKET Packet) 可以判断packet的协议类型是否为TCP/IP,但是要更进一步判断是否为http请求呢? 找不到答案 故请问:如何实现,存放具体协议类型的位置再packet的哪个地方 2、已经知道 NdisChainBufferAtFront 可以将一个buffer链接到packet的最前面,但能否用它实现再次封包呢? 找不到答案 故请问:如何create一个新的IP包头,如何修改为http请求的包的port号,再次封包是否会产生IP包因超出最大长度限制而分包的问题 |
|
7楼#
发布于:2003-06-26 20:42
guitar_string :
如要判断是否http包则要分析TCP header中的端口号了,80:http 110:pop3 25:smtp是传输层了 |
|
8楼#
发布于:2003-06-26 21:05
我的错误原因是:
程序里在 没有帖出的函数里有个死循环:) |
|
|
9楼#
发布于:2003-06-26 21:08
antspower:
你是怎样调试驱动的? |
|
10楼#
发布于:2003-06-27 08:35
驱动不是由我调用啊,他什么时候调用使用NDIS说了算
或者我没明白你的意思 |
|
|