Hi all
I am trying to modify the data in MDL. I would like to change the default Header to my own header. My custom header size is lesser than default header. I don't want to disturb the packet data in Netbuffer. So here my requirement is to shrink NetBufferDataLength. How can I achieve this?
here I used following code: :
for(NetBuffer=NET_BUFFER_LIST_FIRST_NB (NetBufferLists);
NetBuffer != NULL;
NetBuffer = NET_BUFFER_NEXT_NB (NetBuffer))
{
NdisChangeNetBuffer(NetBuffer,testBuffer, Buffersize);
}
for(NetBuffer=NET_BUFFER_LIST_FIRST_NB (NetBufferLists);
NetBuffer != NULL;
NetBuffer = NET_BUFFER_NEXT_NB (NetBuffer))
{
dataLength = NET_BUFFER_DATA_LENGTH (NetBuffer);
DbgPrint("Converted dataLength= %d", dataLength); tempData=(PUCHAR)NdisAllocateMemoryWithTagPriority( FilterDriverHandle, (UINT)dataLength, Tag, NormalPoolPriority
);
NdisQueryNetBuffer(NetBuffer, tempData, &BytesCopied);
DbgPrint("Bytes copied in converted data= %d", BytesCopied);
DbgPrint("Converted Data");
for(count=0;count<BytesCopied;count++)
{ DbgPrint("%d---> 0x%x \t",count, tempData[count]);
}
NdisFreeMemory((PVOID)tempData, dataLength, 0);
tempData = NULL;
}
NDIS_STATUS
NdisChangeNetBuffer(
IN PNET_BUFFER NetBufferToSend,
IN PUCHAR Modified_data,
IN ULONG BufferLength
)
{
NDIS_STATUS ndisStatus = NDIS_STATUS_SUCCESS;
PNET_BUFFER CurrentNetBuffer;
ULONG MdlOffset;
PMDL Mdl, MdlNext;
ULONG dataLength;
ULONG exit = 0;
PMDL NewMdl = NULL;
ULONG ArrayOffset=0;
SIZE_T MdlByteCount, Remain, CopySize;
do
{
CurrentNetBuffer = NetBufferToSend;
Mdl = NET_BUFFER_FIRST_MDL (CurrentNetBuffer);
MdlOffset = NET_BUFFER_DATA_OFFSET (CurrentNetBuffer);
while ((Mdl != NULL) && (MdlOffset >= (MdlByteCount = MmGetMdlByteCount(Mdl))))
{
MdlOffset -= MdlByteCount;
Mdl = Mdl->Next;
}
for (Remain = BufferLength; Mdl && (Remain > 0); Mdl = Mdl->Next)
{
PUCHAR SysVa = NULL ;
MdlNext = Mdl->Next;
MdlByteCount = MmGetMdlByteCount (Mdl);
if (MdlByteCount == 0)
{
continue;
}
ASSERT (MdlOffset < MdlByteCount);
MdlByteCount -= MdlOffset;
CopySize = min (Remain, MdlByteCount);
if(MdlNext!=NULL)
{
SysVa = MmGetSystemAddressForMdlSafe (Mdl, NormalPagePriority);
}
if(MdlNext == NULL)
{
NewMdl = NdisAllocateMdl(FilterDriverHandle, (PVOID)(Modified_data+ArrayOffset), CopySize);
}
else
{
RtlCopyMemory ( SysVa + MdlOffset, Modified_data + ArrayOffset, CopySize);
}
MdlOffset = 0;
ArrayOffset += CopySize;
Remain -= CopySize;
if(MdlNext == NULL)
{
Mdl = NewMdl;
}
}
} while(exit);
return ndisStatus;
}
Here I am expecting a new dataLength as lesser value than actual value in converted data. But that is not happing. It is still pointing to original MDL? Why? Where i did mistake?
Thanks