阅读:1461回复:3
yangmin26,请问你以前发的代码相关问题,关于包的修改与转发!也请其他高手帮帮忙了!
以下是miniport模块的mpsend部分代码,基于篇幅考虑,省略了小部分代码,我想问的问题是,在释放pPacketContent(NdisFreeMemory(pPacketContent, 2000, 0);)之前,怎样将pPacketContent缓冲区的能容重新封包再进行转发,而不是用微软的封包方式进行转发?我想修改pPacketcontent缓冲区的内容,然后对它进行封包,再转发出去?谢谢
NDIS_STATUS MPSend( IN NDIS_HANDLE MiniportAdapterContext, IN PNDIS_PACKET Packet, IN UINT Flags ) { DbgPrint(\"MPSend\\n\"); NdisQueryPacket(Packet,NULL,NULL,NULL,&PacketSize); ntStatus = NdisAllocateMemory(&pPacketContent,2000,0,HighestAcceptableMax); if(ntStatus != NDIS_STATUS_SUCCESS) { return ntStatus; } NdisZeroMemory(pPacketContent,2000); NdisQueryBufferSafe(Packet->Private.Head,&pBuf,&BufLength,32); NdisMoveMemory(pPacketContent,pBuf,BufLength); i = BufLength; pNext = Packet->Private.Head; for(;;) { if(pNext == Packet->Private.Tail) break; pNext = pNext->Next; if(pNext == NULL) break; NdisQueryBufferSafe(pNext,&pBuf,&BufLength,32); NdisMoveMemory(pPacketContent+i,pBuf,BufLength); i+=BufLength; } PacketBuffer=pPacketContent; PacketBufferLen=i; DbgPrint(\"包大小%d\\n\",i); memset(buffer,0,256); sprintf(buffer,\"对方MAC %02X-%02X-%02X-%02X-%02X-%02X\\n\", ((PETHHDR)pPacketContent)->eh_dst[0], ((PETHHDR)pPacketContent)->eh_dst[1], ((PETHHDR)pPacketContent)->eh_dst[2], ((PETHHDR)pPacketContent)->eh_dst[3], ((PETHHDR)pPacketContent)->eh_dst[4], ((PETHHDR)pPacketContent)->eh_dst[5]); DbgPrint(buffer); memset(buffer,0,256); sprintf(buffer,\"本地MAC %02X-%02X-%02X-%02X-%02X-%02X\\n\", ((PETHHDR)pPacketContent)->eh_src[0], ((PETHHDR)pPacketContent)->eh_src[1], ((PETHHDR)pPacketContent)->eh_src[2], ((PETHHDR)pPacketContent)->eh_src[3], ((PETHHDR)pPacketContent)->eh_src[4], ((PETHHDR)pPacketContent)->eh_src[5]); DbgPrint(buffer); memset(buffer,0,256); sprintf(buffer,\"0x%02X%02X\",((PETHHDR)pPacketContent)->eh_type[0],((PETHHDR)pPacketContent)->eh_type[1]); DbgPrint(\"%s\",buffer); if(strcmp(buffer,IP)==0)//IP数据包 { DbgPrint(\"IP GET!\\n\"); pIPHeader=(PIPHeader)((PCHAR)pPacketContent+14); { memset(buffer,0,256); sprintf(buffer,\" IPv %d \",(pIPHeader->ver_len>>4)&15); DbgPrint(\"\\n%s\", buffer); memset(buffer,0,256); //发送端地址 memset(buffer,0,256); sprintf(buffer,\" 源地址:%d.%d.%d.%d \",pIPHeader->src_addr[0],pIPHeader->src_addr[1],pIPHeader->src_addr[2],pIPHeader->src_addr[3]); DbgPrint(\"%s\", buffer); //接收端地址 memset(buffer,0,256); sprintf(buffer,\" 目标地址:%d.%d.%d.%d \",pIPHeader->des_addr[0],pIPHeader->des_addr[1],pIPHeader->des_addr[2],pIPHeader->des_addr[3]); DbgPrint(\"%s\", buffer); } switch(pIPHeader->protocol) { case PROT_ICMP: DbgPrint(\"ICMP\\n\"); break; case PROT_IGMP: DbgPrint(\"IGMP\\n\"); break; case PROT_TCP: DbgPrint(\"TCP\\n\"); { pTCPHeader=(PTCPHeader)((PCHAR)pIPHeader+((pIPHeader->ver_len&15)*32/8)); //发送端端口 memset(buffer,0,256); sprintf(buffer,\" 发送端端口:%d \",pTCPHeader->src_port[0]*0x100+pTCPHeader->src_port[1]); DbgPrint(\"%s\",buffer); //接收端端口 memset(buffer,0,256); sprintf(buffer,\" 接收端端口:%d \",pTCPHeader->des_port[0]*0x100+pTCPHeader->des_port[1]); DbgPrint(\"%s\",buffer); //在释放pPacketContent之前,怎样将pPacketContent缓冲区的能容重新封包,而不是用下面的微软的封包方式进行? NdisFreeMemory(pPacketContent, 2000, 0); ASSERT (pAdapt->pSecondaryAdapt); pAdapt = pAdapt->pSecondaryAdapt; if (IsIMDeviceStateOn (pAdapt) == FALSE) { return NDIS_STATUS_FAILURE; } NdisAllocatePacket(&Status, &MyPacket, pAdapt->SendPacketPoolHandle); if (Status == NDIS_STATUS_SUCCESS) { PNDIS_PACKET_EXTENSION Old, New; Rsvd = (PRSVD)(MyPacket->ProtocolReserved); Rsvd->OriginalPkt = Packet; MyPacket->Private.Flags = Flags; MyPacket->Private.Head = Packet->Private.Head; MyPacket->Private.Tail = Packet->Private.Tail; NdisSetPacketFlags(MyPacket, NDIS_FLAGS_DONT_LOOPBACK); NdisIMCopySendPerPacketInfo(MyPacket, Packet); NDIS_GET_PACKET_MEDIA_SPECIFIC_INFO(Packet, &MediaSpecificInfo, &MediaSpecificInfoSize); if (MediaSpecificInfo || MediaSpecificInfoSize) { NDIS_SET_PACKET_MEDIA_SPECIFIC_INFO(MyPacket, MediaSpecificInfo, MediaSpecificInfoSize); } NdisSend(&Status, pAdapt->BindingHandle, MyPacket); if (Status != NDIS_STATUS_PENDING) { NdisIMCopySendCompletePerPacketInfo (Packet, MyPacket); NdisFreePacket(MyPacket); } } return(Status); } 在释放pPacketContent(NdisFreeMemory(pPacketContent, 2000, 0);)之前,怎样将pPacketContent缓冲区的能容重新封包再进行转发,而不是用下面的微软的封包方式进行? NdisAllocatePacket(&Status,&MyPacket,pAdapt->SendPacketPoolHandle); if (Status == NDIS_STATUS_SUCCESS) { PNDIS_PACKET_EXTENSION Old, New; Rsvd = (PRSVD)(MyPacket->ProtocolReserved); Rsvd->OriginalPkt = Packet; MyPacket->Private.Flags = Flags; MyPacket->Private.Head = Packet->Private.Head; MyPacket->Private.Tail = Packet->Private.Tail; NdisSetPacketFlags(MyPacket, NDIS_FLAGS_DONT_LOOPBACK); ..................... 谢谢! [编辑 - 4/26/04 by jackieky] |
|
沙发#
发布于:2004-04-27 10:51
NdisChainBufferAtBack
|
|
|
板凳#
发布于:2004-04-27 21:42
start:你看这个思路对吗?但是编译的时候出错:
错误如下: c:\\xpassthru\\SEND.C(329) : error C2039: \'SendBufferPoolHandle\' : is not a member of \'_ADAPT\' c:\\xpassthru\\xpassthru.h(54) : see declaration of \'_ADAPT\' c:\\xpassthru\\SEND.C(330) : warning C4022: \'NdisAllocateBuffer\' : pointer mismatch for actual parameter 4 c:\\xpassthru\\SEND.C(330) : error C2198: \'NdisAllocateBuffer\' : too few actual parameters 部分代码如下: NdisAllocateBuffer(&Status, &pPacketBuffer, pAdapt->SendBufferPoolHandle, pPacketContent, PacketBufferLen); if (Status == NDIS_STATUS_SUCCESS) { DbgPrint(\"\\n copy packet\\n\"); NdisChainBufferAtBack(MyPacket,pPacketBuffer); NdisSend(&Status, pAdapt->BindingHandle, MyPacket); if (Status != NDIS_STATUS_PENDING) { NdisIMCopySendCompletePerPacketInfo (Packet, MyPacket); NdisFreeBuffer(pPacketBuffer); NdisFreeMemory(pPacketContent, 2000, 0); NdisFreePacket(MyPacket); } } |
|
地板#
发布于:2004-05-07 08:38
上面这个问题解决了,但是一装上驱动后机器就立刻重起,重新开机后说什么查找到新硬件,发现机器上多了一个新的网络设备,但是他的驱动是有问题的,搞得我上网都上不了了,费了好大的劲才能把它给卸掉。以前也碰到过类似问题,不知道是为何。
|
|