阅读:2233回复:3
如何才能修改数据包呢?
我就是在msendpacket中加入这段程序,功能是将发出的数据包重新赋值
高手帮忙看看我写的有什么问题啊,一运行就重启? BOOLEAN IMBuildMyPacket( IN PADAPT pAdapt, IN PNDIS_PACKET original_packet, //原始包 OUT PNDIS_PACKET MyPacket//修改包 ) { PSEND_RSVD SendRsvd; NDIS_STATUS Status; NDIS_PHYSICAL_ADDRESS phyaddr = {-1}; PVOID pcontent = NULL; ULONG total_length = 0, current_length = 0; PNDIS_BUFFER MyBuffer,ndis_buffer; PVOID address = NULL; PVOID pNewData; PUCHAR pData; pEthHdr pEhr; UINT i; // 分配新的内存 Status = NdisAllocateMemory((PVOID)&pcontent, 2014, 0, phyaddr); if (NDIS_STATUS_SUCCESS != Status) return FALSE; NdisZeroMemory(pcontent, 2014); // 把包中的数据Copy到自己的Buffer中来。 NdisQueryPacket(original_packet, NULL, NULL, &ndis_buffer, &total_length); while (NULL != ndis_buffer) { NdisQueryBufferSafe(ndis_buffer, &address, ¤t_length, NormalPagePriority); NdisMoveMemory(pcontent, address, current_length); (PUCHAR)pcontent += current_length; NdisGetNextBuffer(ndis_buffer, &ndis_buffer); } Status = NdisAllocateMemory((PVOID)&pNewData,total_length,0,phyaddr); if (NDIS_STATUS_SUCCESS != Status) return FALSE; NdisZeroMemory(pNewData, total_length); NdisMoveMemory(pNewData, pcontent, current_length); pEhr = (pEthHdr)pNewData; pData = (PUCHAR)(pEhr+1); for (i = 0;i < (total_length-sizeof(EthHdr)); i++) { *pData++ = (UCHAR)i;//重新赋值 } // 分配新的一个Buffer描述符 NdisAllocateBuffer(&Status, &MyBuffer, pAdapt->SendPacketPoolHandle, pNewData, total_length); if (NDIS_STATUS_SUCCESS != Status) { NdisFreeMemory(pcontent, 2014, 0); return FALSE; } SendRsvd = (PSEND_RSVD)(MyPacket->MiniportReserved); SendRsvd->OriginalPkt = MyPacket; NdisChainBufferAtFront(MyPacket, MyBuffer); return TRUE; } |
|
沙发#
发布于:2007-11-19 16:09
内存错误,检查一下,或者softice调一下。
最明显的错误就是下面: 如果数据超过2k,怎么办? 你没有处理。 while (NULL != ndis_buffer) { NdisQueryBufferSafe(ndis_buffer, &address, ¤t_length, NormalPagePriority); NdisMoveMemory(pcontent, address, current_length); (PUCHAR)pcontent += current_length; NdisGetNextBuffer(ndis_buffer, &ndis_buffer); } |
|
|
板凳#
发布于:2007-12-06 11:12
确实在取包的地方有问题
while(BuffDT!=(PNDIS_BUFFER)NULL) { //NdisQueryBuffer(BuffDT,&BuffVA,&BuffLen); NdisQueryBufferSafe(BuffDT,&BuffVA,&BuffLen,NormalPagePriority); RtlCopyMemory(pBuff,BuffVA,BuffLen); //NdisMoveMemory(pBuff,BuffVA,BuffLen); //irql =disptch_level(2)就会出错 pBuff=pBuff+BuffLen; *pLength+=BuffLen; NdisGetNextBuffer(BuffDT,&BuffDT); } if (BuffVA!=NULL) NdisFreeMemory(BuffVA,BUFFER_SIZE,0); 可到了free的地方就出c2错误(BAD_POOL_CALLER) |
|
地板#
发布于:2007-12-06 19:46
写的很好!
|
|
|