1,318
社区成员
发帖
与我相关
我的任务
分享
VOID
FilterSendNetBufferLists(
IN NDIS_HANDLE FilterModuleContext,
IN PNET_BUFFER_LIST NetBufferLists,
IN NDIS_PORT_NUMBER PortNumber,
IN ULONG SendFlags
)
/*++
Routine Description:
Send Net Buffer List handler
This function is an optional function for filter drivers. If provided, NDIS
will call this function to transmit a linked list of NetBuffers, described by a
NetBuferList, over the network. If this handler is NULL, NDIS will skip calling
this fitler when sending a NetBufferList and will call the next lower fitler
in the stack with a non_NULL FilterSendNetBufferList handleror the miniport driver.
A filter that doesn't provide a FilerSendNetBufferList handler can not initiate a
send o its own.
Arguments:
FilterModuleContext: Pointer to our filter context area.
NetBufferLists: Pointer to a List of NetBufferLists.
PortNumber - Port Number to which this send is targetted
SendFlags- Specifies if the call is at DISPATCH_LEVEL
Return Value:
NDIS_STATUS_SUCCESS:
NDIS_STATUS_PENDING:
NDIS_STATUS_INVALID_PACKET:
NDIS_STATUS_RESOURCES:
NDIS_STATUS_FAILURE:
NOTE: The filter will act like a passthru filter.
--*/
{
PMS_FILTER pFilter = (PMS_FILTER)FilterModuleContext;
PNET_BUFFER_LIST CurrNbl;
BOOLEAN DispatchLevel;
BOOLEAN bFalse = FALSE;
PNET_BUFFER pCurrentNB;
PMDL pMdl;
PNET_BUFFER_LIST pCopyNBL = NULL;
UINT NetBufferDataLength = 0;
UINT mdlOffSet = 0;
UINT offset = 0;
PUCHAR pOriginalMdlData = NULL;
PUCHAR pNewBufferData = NULL;
UINT OriginalMdlDataLen = 0;
UINT NewBufferDataLen = 0;
//UINT BytesToCopy = 0;
PNET_BUFFER_LIST pNewNetBufferList = NULL;
PNET_BUFFER_LIST pNewNetBufferListTail = NULL;
DEBUGP(DL_TRACE, ("===>SendNetBufferList: NBL = %p.\n", NetBufferLists));
do
{
DispatchLevel = NDIS_TEST_SEND_AT_DISPATCH_LEVEL(SendFlags);
if (pFilter->TrackSends)
{
FILTER_ACQUIRE_LOCK(&pFilter->Lock, DispatchLevel);
CurrNbl = NetBufferLists;
while (CurrNbl)
{
pFilter->OutstandingSends++;
FILTER_LOG_SEND_REF(1, pFilter, CurrNbl, pFilter->OutstandingSends);
pCurrentNB = NET_BUFFER_LIST_FIRST_NB(CurrNbl);
while(pCurrentNB)
{
NetBufferDataLength = NET_BUFFER_DATA_LENGTH(pCurrentNB);
DEBUGP(DL_TEST,("This NetBufferDataLength is %d\n",NetBufferDataLength));
//BytesToCopy = NetBufferDataLength - mdlOffSet;
pCopyNBL = allocateNetBuffAndNetBufferList(pFilter,2048);
//Ensure the pCopyNBL is not NULL
if(pCopyNBL != NULL)
{
pCopyNBL->SourceHandle = pFilter->FilterHandle;
//NET_BUFFER_DATA_LENGTH(NET_BUFFER_LIST_FIRST_NB(pCopyNBL)) = NetBufferDataLength;
if(pNewNetBufferList == NULL && pNewNetBufferListTail == NULL)
{
pNewNetBufferList = pNewNetBufferListTail = pCopyNBL;
}
else
{
pNewNetBufferListTail->Next = pCopyNBL;
pNewNetBufferListTail = pCopyNBL;
}
NdisQueryMdl(NET_BUFFER_FIRST_MDL(NET_BUFFER_LIST_FIRST_NB(pCopyNBL)),(PVOID)&pNewBufferData,&NewBufferDataLen,NormalPagePriority);
DEBUGP(DL_TEST,("The NewBufferDataLen is %d\n",NewBufferDataLen));
}
else
{
DEBUGP(DL_TEST,("SQVDS:Test the allocateNetBuffAndNetBufferList:allocateNetBuffAndNetBufferList failed!\n"));
break;
}
//pMdl = NET_BUFFER_CURRENT_MDL(pCurrentNB);
pMdl = NET_BUFFER_FIRST_MDL(pCurrentNB);
//mdlOffSet = NET_BUFFER_CURRENT_MDL_OFFSET(pCurrentNB);
DEBUGP(DL_TEST,("This NetBuffer's Mdl off set is %d\n",mdlOffSet));
while(pMdl)
{
NdisQueryMdl(pMdl,(PVOID)&pOriginalMdlData,&OriginalMdlDataLen,NormalPagePriority);
DEBUGP(DL_TEST,("The OriginalMdlDataLen is %d\n",OriginalMdlDataLen));
//NdisMoveMemory(pNewBufferData+offset, pOriginalMdlData+mdlOffSet,pMdl->ByteCount - mdlOffSet);
NdisMoveMemory(pNewBufferData+offset,pOriginalMdlData,pMdl->ByteCount);
//offset += (pMdl->ByteCount - mdlOffSet);
offset += pMdl->ByteCount;
pMdl = pMdl->Next;
//mdlOffSet = 0;
}
DEBUGP(DL_TEST,("After the copy finish, the offset is %d\n",offset));
NET_BUFFER_DATA_LENGTH(NET_BUFFER_LIST_FIRST_NB(pCopyNBL)) = offset;
offset = 0;
pCurrentNB = NET_BUFFER_NEXT_NB(pCurrentNB);
}
CurrNbl = NET_BUFFER_LIST_NEXT_NBL(CurrNbl);
}
pNewNetBufferListTail->Next = NULL;
FILTER_RELEASE_LOCK(&pFilter->Lock, DispatchLevel);
}
else
{
DEBUGP(DL_TEST,("The track is not TRUE.......................SQVDS!\n"));
}
//SendFlags = NDIS_SEND_FLAGS_DISPATCH_LEVEL;
//To tell the
NdisFSendNetBufferListsComplete(pFilter->FilterHandle, NetBufferLists, DispatchLevel?NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL:0);
NdisFSendNetBufferLists(pFilter->FilterHandle, pNewNetBufferList, PortNumber, SendFlags);
DEBUGP(DL_TEST,("NdisFSendNetBufferLists finish!\n"));
}
while (bFalse);
DEBUGP(DL_TRACE, ("<===SendNetBufferList. \n"));
}