阅读:1746回复:3
关于NDIS修改数据包的问题
以下是我的代码,我在protocolHeader.h中定义了各种结构体
但是编译的时候,总是说这个结构体对象没有定义(包含了头文件的,而且放在precomp。h也试过) NDIS_STATUS MPSend( IN NDIS_HANDLE MiniportAdapterContext, IN PNDIS_PACKET Packet, IN UINT Flags ) { PADAPT pAdapt = (PADAPT)MiniportAdapterContext; NDIS_STATUS Status; PNDIS_PACKET MyPacket; PRSVD Rsvd; PVOID MediaSpecificInfo = NULL; ULONG MediaSpecificInfoSize = 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) { //==================================================================== //---- modefy MyPacket ---------------------------------------------- PUCHAR pPacketContent; PUCHAR pBuf; ULONG nBufferSize; MDL * pNext; UINT i,j; BOOLEAN transFlag = FALSE; PNDIS_BUFFER MyBuffer; PIPHeader pIPHeader; PUDPHeader pUDPHeader; PUDPHeaderHH psdhdr; Status= NdisAllocateMemory( &pPacketContent, 2000, 0,HighestAcceptableMax); NdisQueryBufferSafe(Packet->Private.Head,&pBuf,&nBufferSize,32); NdisMoveMemory(pPacketContent,pBuf,nBufferSize); i = nBufferSize; pNext = Packet->Private.Head; //------ 把包的数据拷贝到pPacketContent里面 -------------------- for(;;) { if(pNext == Packet->Private.Tail) break; pNext = pNext->Next; if(pNext == NULL) break; NdisQueryBufferSafe(pNext,&pBuf,&nBufferSize,32); if(pBuf == NULL) goto MM; NdisMoveMemory(pPacketContent,pBuf,nBufferSize); i = i+nBufferSize; } //-------------------------------------------------------------- //--- 判断是不是要修改的包 ------------------------------------- if(pPacketContent[12] == 8 && pPacketContent[13] == 0) //if the packet is IP packet { pIPHeader = (PIPHeader)(pPacketContent+14); //point to IP Packet header unsigned long ipdest; ipdest = (ULONG)(192 + 168*256 + 17*256*256 + 48*256*256*256); if(pIPHeader->ipDestination == ipdest && pIPHeader->ipProtocol == (ULONG)17) //如果是要截获的包 { transFlag = TRUE; } } if(transFlag) { USHORT iphdrlen = (pIPHeader->iphVerLen & 0x0f) * sizeof(ULONG); UCHAR checkbuff[2000] = {0}; USHORT udplen; pUDPHeader = (PUDPHeader)(pPacketContent+14 + iphdrlen); udplen = (pUDPHeader->len); //修改源地址 pIPHeader->ipSource = 10 ; //填充UDP伪首部 psdhdr->saddr = pIPHeader->ipSource; psdhdr->daddr = pIPHeader->ipDestination; psdhdr->len = pUDPHeader->len; psdhdr->mbz = 0; psdhdr->proto = 17; //计算UDP校验和,包括所有UDP数据 NdisMoveMemory(checkbuff,&psdhdr,sizeof(psdhdr)); NdisMoveMemory(checkbuff+sizeof(psdhdr),pUDPHeader,udplen); pUDPHeader->checksum = CheckSum((USHORT *)checkbuff,sizeof(psdhdr)+udplen); //计算IP首部校验和 pIPHeader->ipChecksum = CheckSum((USHORT *)pIPHeader,iphdrlen); //============================================================================ NdisAllocateBuffer(&Status,&MyBuffer,pAdapt->SendPacketPoolHandle,pPacketContent,i); //把数据包的内容copy给MyBuffer NdisChainBufferAtFront(MyPacket, MyBuffer); //把MyBuffer关联到MyPacket Rsvd =(PRSVD)(MyPacket->ProtocolReserved); Rsvd->OriginalPkt = MyPacket; MyPacket->Private.Head->Next = NULL; MyPacket->Private.Tail = NULL; NdisSetPacketFlags(MyPacket, NDIS_FLAGS_DONT_LOOPBACK); NdisReturnPackets(&Packet, 1); NdisSend(&Status,pAdapt->BindingHandle,MyPacket); if(Status != NDIS_STATUS_PENDING) { NdisUnchainBufferAtFront(MyPacket ,&MyBuffer); //从MyPacket中解除buffer NdisQueryBufferSafe(MyBuffer, &pPacketContent, &nBufferSize,32 ); if(pPacketContent != NULL) NdisFreeMemory(pPacketContent,nBufferSize, 0); NdisFreeBuffer(MyBuffer); } //============================================================================== } else { 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); NdisMoveMemory(NDIS_OOB_DATA_FROM_PACKET(MyPacket), NDIS_OOB_DATA_FROM_PACKET(Packet), sizeof(NDIS_PACKET_OOB_DATA)); 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); } } } else { } return(Status); } |
|
|
沙发#
发布于:2008-04-14 23:19
我也正做这个,互相学习探讨吧QQ270996889 SDTZ_ZZ@126.COM
|
|
板凳#
发布于:2008-04-15 19:47
我是刚刚接触驱动,也遇到过这样的问题,之前写C++习惯了,如果是C的话,这样就编译不过去
|
|
地板#
发布于:2008-04-19 13:59
我也是刚学驱动,做的也是这个,有兴趣的联系啊,QQ:410651416
e-mail:hsjpeterlinwu@163.com |
|