Hello everyone!
I am writting ndis lw filter which is supposed to filter packets and drop those with specified port or content.
I searched some archives, and then write in the FilterSendNetBufferLists function as follow:
PNET_BUFFER_LIST fNetBufferLists = NULL; //queue the NBL which would be freed
PNET_BUFFER_LIST fNetBufferListstmp = NULL;
PNET_BUFFER_LIST sNetBufferLists = NULL; // queue the NBL which would be sended
PNET_BUFFER_LIST sNetBufferListstmp = NULL;
USHORT flag;
do
{
CurrNbl = NetBufferLists;
while (CurrNbl)
{
NextNbl = NET_BUFFER_LIST_NEXT_NBL(CurrNbl);
for(pCurrentNetBuffer = NET_BUFFER_LIST_FIRST_NB(CurrNbl);
pCurrentNetBuffer != NULL;
pCurrentNetBuffer = NET_BUFFER_NEXT_NB(pCurrentNetBuffer))
{
…
NdisGetDataBuffer(pCurrentNetBuffer,scanlength,pPakData,1,0)
if( (flag = search(pPakData, scanlength)) == STREAM_POLICY_DENY )
goto ExitNBFilter;
…
}
ExitNBFilter:
if( flag & STREAM_POLICY_DENY){
if( fNetBufferListstmp != NULL ){
NET_BUFFER_LIST_NEXT_NBL(fNetBufferListstmp) = CurrNbl;
fNetBufferListstmp = CurrNbl;
NET_BUFFER_LIST_NEXT_NBL(fNetBufferListstmp) = NULL;
}
else
{
fNetBufferLists = CurrNbl;
fNetBufferListstmp = CurrNbl;
NET_BUFFER_LIST_NEXT_NBL(fNetBufferListstmp) = NULL;
}
}
else
{
if( sNetBufferListstmp != NULL ){
NET_BUFFER_LIST_NEXT_NBL(sNetBufferListstmp) = CurrNbl;
sNetBufferListstmp = CurrNbl;
NET_BUFFER_LIST_NEXT_NBL(sNetBufferListstmp) = NULL;
}
else
{
sNetBufferLists = CurrNbl;
sNetBufferListstmp = CurrNbl;
NET_BUFFER_LIST_NEXT_NBL(sNetBufferListstmp) = NULL;
}
}
CurrNbl= NextNbl;
}
if(fNetBufferLists != NULL)
NdisReturnNetBufferLists(pFilter->FilterHandle, fNetBufferLists, SendFlags);
if(sNetBufferLists != NULL)
NdisFSendNetBufferLists(pFilter->FilterHandle, sNetBufferLists, PortNumber, SendFlags);
}while (bFalse);
Then i test the dirver, and the bulescreen happened, the info in windbg is like this:
STACK_COMMAND: kb
FOLLOWUP_IP:
ndislwf!FilterSendNetBufferLists+775 [z:\coding\app_ndis\filter.c @ 1465]
8dfe12e5 8b4d14 mov ecx,dword ptr [ebp+14h]
FAULTING_SOURCE_CODE:
1464: NdisReturnNetBufferLists(pFilter->FilterHandle, fNetBufferLists, SendFlags);
1465: NdisFSendNetBufferLists(pFilter->FilterHandle, sNetBufferLists, PortNumber, SendFlags);
1466:
1467: }
1468: while (bFalse);
There are error codes, but i can’t find why.
I am newbie, Thanks a lot for your time!