tian19
驱动牛犊
驱动牛犊
  • 注册日期2004-04-24
  • 最后登录2008-01-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1158回复:2

怎样在两个tcp头之间插入数据

楼主#
更多 发布于:2004-09-10 13:19
我要修改包,原来在一个TCP头前加了一个TCP头,现在要进行改进,还要在两个TCP头之间加入一个4字节的数字,请问如何修改。PNDIS_BUFFER pMyBuffer = NULL;
PNDIS_PACKET pMyPacket = NULL;
PVOID pBufferToSend = NULL; // Point to the data. memory new allocated.
NDIS_STATUS Status;
PRSVD Rsvd;
UINT BytesCopied,BytesToCopy;
PHEADER_DATA8023 pHeader8023;
PHEADER_DATA8022 pHeader8022;
PIP_HEADER pIpHeader = NULL; // for the new allocated memory.
PTCP_HEADER pTcpHeader = NULL; // for the new allocated memory.
PUDP_HEADER pUdpHeader = NULL; // for the new allocated memory.
UINT IpHeaderLength;

pHeader8023 = (PHEADER_DATA8023)pEtherHeader;
pHeader8022 = (PHEADER_DATA8022)pEtherHeader;

if(((NetToHostS(pHeader8023->Type)==TYPE_IP)
&&(pHeader8023->ipProtocol==IP_TCP))
||((NetToHostS(pHeader8022->Type)<ETHER_TYPE_MINIMUM)
&&(pHeader8022->ipProtocol==IP_TCP)))
{
TotalPacketLength += sizeof(TCP_HEADER); // We'll copy the TCP header.
Status = NdisAllocateMemory(&pBufferToSend,
TotalPacketLength,
0,
HighestAcceptableMax);
}
else
{
TotalPacketLength += sizeof(UDP_HEADER); // We'll copy the UDP header.
Status = NdisAllocateMemory(&pBufferToSend,
TotalPacketLength,
0,
HighestAcceptableMax);
}

if(NDIS_STATUS_SUCCESS != Status)
{
NdisMSendComplete(
pAdapter->pPrimaryAdapt->MiniportHandle,
Packet,
Status);
return Status;
}

NdisAllocateBuffer(&Status,
&pMyBuffer,
pAdapter->SendBufferPoolHandle,
pBufferToSend,
TotalPacketLength);
if(NDIS_STATUS_SUCCESS == Status)
{
NdisAllocatePacket(&Status,
&pMyPacket,
pAdapter->SendPacketPoolHandle);
if(NDIS_STATUS_SUCCESS == Status)
{
Rsvd = (PRSVD)(pMyPacket->ProtocolReserved);
Rsvd->IsOurs = TRUE;
Rsvd->OriginalPkt = Packet;
// Rsvd->pBufferToSend = pBufferToSend;

pMyPacket->Private.Flags = NdisGetPacketFlags(Packet);
NdisSetPacketFlags(pMyPacket, NDIS_FLAGS_DONT_LOOPBACK);
pMyPacket->Private.Head = pMyBuffer;
pMyPacket->Private.Tail = pMyBuffer;

//
// Copy the OOB Offset from the original packet to the new
// packet.
//
NdisMoveMemory(NDIS_OOB_DATA_FROM_PACKET(pMyPacket),
NDIS_OOB_DATA_FROM_PACKET(Packet),
sizeof(NDIS_PACKET_OOB_DATA));
//
// Copy the per packet info into the new packet
// This includes ClassificationHandle, etc.
// Make sure other stuff is not copied !!!
//
NdisIMCopySendPerPacketInfo(pMyPacket, Packet);

if(NetToHostS(pHeader8023->Type) == TYPE_IP)
{
pIpHeader = (PIP_HEADER)((PUCHAR)pBufferToSend+14);
IpHeaderLength = ((pHeader8023->ipVerLen)&0X0F)<<2;
if(pHeader8023->ipProtocol == IP_TCP)
{
BytesToCopy = 14 + IpHeaderLength + sizeof(TCP_HEADER);
NdisCopyFromPacketToPacket(pMyPacket,
0,
BytesToCopy,
Packet,
0,
&BytesCopied);
BytesToCopy = TotalPacketLength - BytesToCopy;
NdisCopyFromPacketToPacket(pMyPacket,
BytesCopied,
BytesToCopy,
Packet,
14 + IpHeaderLength,
&BytesCopied);

// pIpHeader = (PIP_HEADER)((PUCHAR)pBufferToSend + 14);
pIpHeader->ipLength = HostToNetS(
(USHORT)((UINT)NetToHostS(pIpHeader->ipLength)+sizeof(TCP_HEADER)));
pIpHeader->ipChecksum = 0;
pIpHeader->ipChecksum = CheckSum(0, (PUSHORT)pIpHeader, IpHeaderLength);

pTcpHeader = (PTCP_HEADER)((PUCHAR)pIpHeader + IpHeaderLength);
DbgPrint("Our H323App sending TCP packet, Dest Port:%d\n",
NetToHostS(pTcpHeader->destPort));
pTcpHeader->destPort = HostToNetS(WEB_PORT); // Translate the port to 80.
pTcpHeader->dataOffset = (pTcpHeader->dataOffset &0X0F)|0x50;
pTcpHeader->urgentPointer = 0;
pTcpHeader->checkSum = 0;
pTcpHeader->checkSum = CheckSumTcp(
pIpHeader,
pTcpHeader);


}
sword3i
驱动牛犊
驱动牛犊
  • 注册日期2003-07-25
  • 最后登录2013-01-07
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望112点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-09-10 16:16
楼主的原来在一个TCP头前加了一个TCP头是什么意思?还有两个TCP头之间加入一个4字节的数字?
呵呵,也不太明白,如果你是指在二个tcp包之间在增加一个TCP包呢,还是在原来的包里面增加4个字节
随风奔跑自由是方向 追逐雷和闪电的力量 把浩瀚的海洋装进我胸膛 即使再小的帆也能远航 随风飞翔有梦作翅膀 敢爱敢做勇敢闯一闯 哪怕遇见再大的风险再大的浪 也会有默契的目光 努力蹭分! ..................
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-09-12 13:03
一样的修改,注意校验正确
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
游客

返回顶部