Windows Vista Tips

Windows Vista Tips > Newsgroups > Windows Vista Drivers > Re: problem with NdisReturnPackets ( ) please help me!

Reply
Thread Tools Display Modes

Re: problem with NdisReturnPackets ( ) please help me!

 
 
Thomas F. Divine
Guest
Posts: n/a

 
      06-17-2010
You call NdisReturnPackets to return packets that originated from a
higher-level protocol or filter.

You should not call NdisReturnPackets for the packets that you have
allocated yourself.

Thomas F. Divine
http://www.pcausa.com


"ftbk86" <> wrote in message
news:6fe37a2e-e018-4336-9f1d-...
> hello all:
>
> get BSOD on xp sp2. this code:
>
>
> ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
> NDIS_STATUS
> PtReceive(
> IN NDIS_HANDLE ProtocolBindingContext,
> IN NDIS_HANDLE MacReceiveContext,
> IN PVOID HeaderBuffer,
> IN UINT HeaderBufferSize,
> IN PVOID LookAheadBuffer,
> IN UINT LookAheadBufferSize,
> IN UINT PacketSize
> )
> {
> PADAPT pAdapt = (PADAPT)ProtocolBindingContext;
> PNDIS_PACKET MyPacket, Packet = NULL;
> NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
> ULONG Proc = KeGetCurrentProcessorNumber();
>
> if ((!pAdapt->MiniportHandle) || (pAdapt->MPDeviceState >
> NdisDeviceStateD0))
> {
> Status = NDIS_STATUS_FAILURE;
> }
> else do
> {
> if(FALSE){}
> else if(LookAheadBufferSize >= PacketSize)
> {
> UINT PacketLen;
> PUCHAR pPacketContent = NULL;
> PRECV_RSVD Resvd = NULL;
> PNDIS_BUFFER PacketBuffer = NULL;
>
> pPacketContent =
> (PUCHAR)ExAllocateFromNPagedLookasideList(&PageLis t_ContentLen);
> if(pPacketContent == NULL)
> {
> DbgPrint(("prreceivePacketContent == NULL\n"));
> return NDIS_STATUS_NOT_ACCEPTED ;
> }
> RtlZeroMemory(pPacketContent, MAXCHARLEN);
> RtlCopyMemory(pPacketContent,HeaderBuffer,HeaderBu fferSize);
> RtlCopyMemory(pPacketContent
> +HeaderBufferSize,LookAheadBuffer,LookAheadBufferS ize);
> PacketLen = PacketSize + HeaderBufferSize;
> NdisDprAllocatePacket(&Status, &MyPacket, pAdapt-
>>RecvPacketPoolHandle);

> if(Status == NDIS_STATUS_SUCCESS)
> {
> PUCHAR pPacket = NULL;
> Status = NdisAllocateMemoryWithTag(&pPacket,PacketLen,TAG);
> if(Status == NDIS_STATUS_SUCCESS)
> {
> NdisZeroMemory(pPacket,PacketLen);
> NdisMoveMemory(pPacket,pPacketContent,PacketLen);
>
> ExFreeToNPagedLookasideList(&PageList_ContentLen,p PacketContent);
> pPacketContent = NULL;
>
> NdisAllocateBuffer(&Status,&PacketBuffer,pAdapt-
>>RecvPacketPoolHandle,pPacket,PacketLen);

> NdisChainBufferAtFront( MyPacket, PacketBuffer );
> MyPacket->Private.Head->Next = NULL;
> MyPacket->Private.Tail = NULL;
> Resvd =(PRECV_RSVD)(MyPacket->MiniportReserved);
> Resvd->OriginalPkt = NULL;
> NDIS_SET_PACKET_HEADER_SIZE( MyPacket, HeaderBufferSize );
>
> NdisMIndicateReceivePacket(pAdapt->MiniportHandle, &MyPacket, 1);
> if ( NDIS_GET_PACKET_STATUS( MyPacket ) != NDIS_STATUS_PENDING )
> {
> NdisFreeBuffer(PacketBuffer);
> PacketBuffer = NULL;
> NdisFreeMemory(pPacket,PacketLen,0);
> pPacket = NULL;
> NdisDprFreePacket(MyPacket);
> MyPacket = NULL;
> }
> break;
> }
> }
> }
> else
> {
>
> NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress;
> PUCHAR pPacketContent = NULL;
> PUCHAR pBakBuffer = NULL;
> int PacketLen = 0;
> int OffsetSize = 0;
> PNDIS_BUFFER PacketBuffer = NULL;
> PNDIS_BUFFER OffsetBuffer = NULL;
> PNDIS_PACKET MyPacket2 = NULL;
> PRECV_RSVD Rsvd = NULL;
> UINT BytesTransferred = 0;
>
>
> HighestAcceptableAddress.HighPart = -1;
> HighestAcceptableAddress.LowPart = -1;
>
>
> Status = NdisAllocateMemory(&pPacketContent, BUFFER_SIZE,
> 0, HighestAcceptableAddress);
> if (Status != NDIS_STATUS_SUCCESS )
> {
> DbgPrint(("ptreceive :ndisallocatememory failed\\n"));
> return NDIS_STATUS_NOT_ACCEPTED ;
> }
> if(pPacketContent == NULL)
> {
> DbgPrint(("prreceivePacketContent == NULL\\n"));
> return NDIS_STATUS_NOT_ACCEPTED ;
> }
> RtlZeroMemory(pPacketContent, BUFFER_SIZE );
> NdisDprAllocatePacket(&Status, &MyPacket, pAdapt-
>>RecvPacketPoolHandle);

>
>
> //////////////////////////////////////////////////////////////////////////
> NdisAllocateMemory(&pBakBuffer, BUFFER_SIZE, 0,
> HighestAcceptableAddress);
> if(Status != NDIS_STATUS_SUCCESS)
> {
> DbgPrint(("ptreceive:allcate bak buffer failed\\n"));
> return NDIS_STATUS_NOT_ACCEPTED;
> }
> NdisMoveMemory(pBakBuffer,HeaderBuffer,HeaderBuffe rSize);
> NdisMoveMemory(pBakBuffer
> +HeaderBufferSize,LookAheadBuffer,LookAheadBufferS ize);
> PacketLen = HeaderBufferSize + PacketSize;
> NdisAllocateBuffer(&Status,&PacketBuffer,pAdapt-
>>RecvPacketPoolHandle,pPacketContent,PacketSize-LookAheadBufferSize);

> NdisChainBufferAtFront( MyPacket, PacketBuffer );
> MyPacket->Private.Head->Next = NULL;
> MyPacket->Private.Tail = NULL;
> OffsetSize = HeaderBufferSize + LookAheadBufferSize;
> //////////////////////////////////////////////////////////////////////////
>
> NdisDprAllocatePacket(&Status, &MyPacket2, pAdapt-
>>RecvPacketPoolHandle);

> NdisAllocateBuffer(&Status,&OffsetBuffer,pAdapt-
>>RecvPacketPoolHandle ,pBakBuffer,OffsetSize);

> NdisChainBufferAtFront(MyPacket2,OffsetBuffer);
> Rsvd =(PRECV_RSVD)(MyPacket->MiniportReserved);
> Rsvd->OriginalPkt = (PNDIS_PACKET)MyPacket2;
> NDIS_SET_PACKET_HEADER_SIZE( MyPacket, HeaderBufferSize );
>
> NdisTransferData(&Status, pAdapt->BindingHandle ,
> MacReceiveContext, LookAheadBufferSize, PacketSize-
> LookAheadBufferSize ,MyPacket,&BytesTransferred);
> if ( Status != NDIS_STATUS_PENDING )
> {
> PtTransferDataComplete( (NDIS_HANDLE)pAdapt, MyPacket, Status,
> BytesTransferred );
> }
> break;
> }
>
> } while(FALSE);
>
> return Status;
> }
>
> //////////////////////////////////////////////////////////////////////////////////////////////////////////
>
> VOID PtTransferDataComplete( IN NDIS_HANDLE ProtocolBindingContext,IN
> PNDIS_PACKET Packet,IN NDIS_STATUS Status,IN UINT BytesTransferred)
> {
> PADAPT pAdapt =(PADAPT)ProtocolBindingContext;
> PUCHAR pPacketContent;
>
> UINT OffsetSize;
> UINT result;
> UINT PacketLen;
> PNDIS_BUFFER PacketBuffer;
> PNDIS_PACKET OffsetPacket;
> PNDIS_BUFFER OffsetBuffer;
> PUCHAR pBakContent;
> UINT bufLength;
> NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress;
> int pMark;
> PRECV_RSVD Resvd = NULL;
> PNDIS_PACKET MyPacket = NULL;
>
> NDIS_STATUS status = NDIS_STATUS_SUCCESS;
>
> DbgPrint(("in PtTransferDataComplete\n"));
>
> HighestAcceptableAddress.LowPart = -1;
> HighestAcceptableAddress.HighPart = -1;
>
> Resvd = (PRECV_RSVD)(Packet->MiniportReserved);
> OffsetPacket = (PNDIS_PACKET)Resvd->OriginalPkt;
> if(pAdapt->MiniportHandle)
> {
> if (OffsetPacket==NULL)
> {
> NdisMTransferDataComplete(pAdapt->MiniportHandle, Packet, Status,
> BytesTransferred);
> }
> else
> {
> PUCHAR pPacket = NULL;
> pPacketContent =
> (PUCHAR)ExAllocateFromNPagedLookasideList(&PageLis t_ContentLen);
> NdisZeroMemory(pPacketContent,MAXCHARLEN);
> CopyPacket2Buffer(OffsetPacket,pPacketContent,&Off setSize);
> CopyPacket2Buffer(Packet,pPacketContent+OffsetSize ,&PacketLen);
> PacketLen += OffsetSize;
>
> NdisUnchainBufferAtFront(OffsetPacket,&OffsetBuffe r);
> NdisQueryBufferSafe(OffsetBuffer,&pBakContent,&buf Length, 32 );
> NdisFreeBuffer(OffsetBuffer);
> OffsetBuffer = NULL;
> NdisFreeMemory(pBakContent,BUFFER_SIZE,0);
> pBakContent = NULL;
> NdisDprFreePacket(OffsetPacket);
> OffsetPacket = NULL;
>
> memset(Packet->MiniportReserved,0,sizeof(Packet-
>>MiniportReserved));

>
> NdisUnchainBufferAtFront(Packet,&PacketBuffer);
> NdisQueryBufferSafe(PacketBuffer,&pBakContent,&buf Length,32);
> NdisFreeBuffer(PacketBuffer);
> PacketBuffer = NULL;
> NdisFreeMemory(pBakContent,BUFFER_SIZE,0);
> pBakContent = NULL;
> NdisDprFreePacket(Packet);
> Packet = NULL;
>
> NdisDprAllocatePacket(&Status, &MyPacket, pAdapt-
>>RecvPacketPoolHandle);

> if(Status == NDIS_STATUS_SUCCESS)
> {
> Status = NdisAllocateMemoryWithTag(&pPacket,PacketLen,TAG);
> if(Status == NDIS_STATUS_SUCCESS)
> {
> NdisZeroMemory(pPacket,PacketLen);
> NdisMoveMemory(pPacket,pPacketContent,PacketLen);
> ExFreeToNPagedLookasideList(&PageList_ContentLen,p PacketContent);
> pPacketContent = NULL;
> NdisAllocateBuffer(&status,&PacketBuffer,pAdapt-
>>RecvPacketPoolHandle,pPacket,PacketLen);

> if(status == NDIS_STATUS_SUCCESS)
> {
> NdisChainBufferAtFront(MyPacket,PacketBuffer);
> MyPacket->Private.Head->Next = NULL;
> MyPacket->Private.Tail = NULL;
> Resvd->OriginalPkt = NULL;
> NDIS_SET_PACKET_HEADER_SIZE(MyPacket,14);
> NdisMIndicateReceivePacket(pAdapt->MiniportHandle ,&MyPacket,1);
> if(NDIS_GET_PACKET_STATUS(MyPacket) != NDIS_STATUS_PENDING)
> {
> MPReturnPacket((NDIS_HANDLE)pAdapt,MyPacket);
> }
> }
> }
> }
> }
> }
> }
>
>
>
>
>
>
> ///////////////////////////////////////////////////////////////////////////////////////////////////////////
>
>
> VOID MPReturnPacket(IN NDIS_HANDLE MiniportAdapterContext, IN
> PNDIS_PACKET Packet )
> {
> PADAPT pAdapt = (PADAPT)MiniportAdapterContext;
>
> #ifdef NDIS51
> if (NdisGetPoolFromPacket(Packet) != pAdapt->RecvPacketPoolHandle)
> {
> NdisReturnPackets(&Packet, 1);
> }
> else
> #endif
> {
>
> PNDIS_PACKET MyPacket;
> PRECV_RSVD RecvRsvd;
> PNDIS_BUFFER pNdisBuffer = NULL;
> PUCHAR pPacketContent = NULL;
> ULONG PackContentLen = 0;
>
> RecvRsvd = (PRECV_RSVD)(Packet->MiniportReserved);
> MyPacket = RecvRsvd->OriginalPkt;
>
> if(MyPacket)
> {
> NdisFreePacket(Packet);
> NdisReturnPackets(&MyPacket, 1);
> }
> else
> {
> NdisUnchainBufferAtFront(Packet, &pNdisBuffer);
> if(pNdisBuffer != NULL)
> {
> NdisQueryBufferSafe( pNdisBuffer, &pPacketContent, &PackContentLen,
> 32);
> NdisFreeBuffer( pNdisBuffer );
> pNdisBuffer = NULL;
> if(pPacketContent != NULL)
> {
> NdisFreeMemory(pPacketContent, PackContentLen, 0);
> pPacketContent = NULL;
> }
> NdisDprFreePacket(Packet);
> Packet = NULL;
> }
> }
> }
> }
> ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
>
> *** Fatal System Error: 0x000000d1
> (0x00000008,0x00000002,0x00000000,0xB7E1E848)
>
> Break instruction exception - code 80000003 (first chance)
>
> A fatal system error has occurred.
> Debugger entered on first try; Bugcheck callbacks have not been
> invoked.
>
> A fatal system error has occurred.
>
> Connected to Windows XP 2600 x86 compatible target at (Thu Jun 17
> 15:19:51.677 2010 (UTC + 8:00)), ptr64 FALSE
> Loading Kernel Symbols
> .................................................. .............
> .................................
> Loading User Symbols
>
> Loading unloaded module list
> ..........
> ************************************************** *****************************
> *
> *
> * Bugcheck
> Analysis *
> *
> *
> ************************************************** *****************************
>
> Use !analyze -v to get detailed debugging information.
>
> BugCheck D1, {8, 2, 0, b7e1e848}
>
> Probably caused by : NDIS.sys ( NDIS!NdisReturnPackets+48 )
>
> Followup: MachineOwner
> ---------
>
> nt!RtlpBreakWithStatusInstruction:
> 8052b5d8 cc int 3
> 0: kd> !analyze -v
> ************************************************** *****************************
> *
> *
> * Bugcheck
> Analysis *
> *
> *
> ************************************************** *****************************
>
> DRIVER_IRQL_NOT_LESS_OR_EQUAL (d1)
> An attempt was made to access a pageable (or completely invalid)
> address at an
> interrupt request level (IRQL) that is too high. This is usually
> caused by drivers using improper addresses.
> If kernel debugger is available get stack backtrace.
> Arguments:
> Arg1: 00000008, memory referenced
> Arg2: 00000002, IRQL
> Arg3: 00000000, value 0 = read operation, 1 = write operation
> Arg4: b7e1e848, address which referenced memory
>
> Debugging Details:
> ------------------
>
>
> READ_ADDRESS: 00000008
>
> CURRENT_IRQL: 2
>
> FAULTING_IP:
> NDIS!NdisReturnPackets+48
> b7e1e848 8b7308 mov esi,dword ptr [ebx+8]
>
> DEFAULT_BUCKET_ID: DRIVER_FAULT
>
> BUGCHECK_STR: 0xD1
>
> PROCESS_NAME: System
>
> TRAP_FRAME: b8507c5c -- (.trap 0xffffffffb8507c5c)
> ErrCode = 00000000
> eax=ffffffff ebx=00000000 ecx=00000002 edx=00000002 esi=894eb8b8
> edi=89974e68
> eip=b7e1e848 esp=b8507cd0 ebp=b8507ce8 iopl=0 nv up ei pl zr
> na pe nc
> cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000
> efl=00010246
> NDIS!NdisReturnPackets+0x48:
> b7e1e848 8b7308 mov esi,dword ptr [ebx+8] ds:
> 0023:00000008=????????
> Resetting default scope
>
> LAST_CONTROL_TRANSFER: from 804f9afd to 8052b5d8
>
> STACK_TEXT:
> b8507810 804f9afd 00000003 b8507b6c 00000000 nt!
> RtlpBreakWithStatusInstruction
> b850785c 804fa6e8 00000003 00000008 b7e1e848 nt!KiBugCheckDebugBreak
> +0x19
> b8507c3c 805446d0 0000000a 00000008 00000002 nt!KeBugCheck2+0x574
> b8507c3c b7e1e848 0000000a 00000008 00000002 nt!KiTrap0E+0x238
> b8507ce8 b4b2d875 894eb8d0 00000001 8959f4d0 NDIS!NdisReturnPackets
> +0x48
> b8507d00 b4b31d39 894e5fa0 00000000 b4b31d39 afd!AfdReturnBuffer+0xe1
> b8507d24 b4b24a06 8959f4a0 8959f518 8959f4a0 afd!
> AfdFreeNPConnectionResources+0x58
> b8507d3c b4b249aa 8959f4a0 b4b237a8 b8507d68 afd!
> AfdFreeConnectionResources+0x41
> b8507d4c b4b2186a 8959f518 898a7c48 896e83e8 afd!AfdFreeConnection
> +0x5c
> b8507d68 805768ef 896e83e8 00000000 8056475c afd!AfdDoWork+0x51
> b8507d7c 80538757 898a7c48 00000000 89a2f020 nt!IopProcessWorkItem
> +0x13
> b8507dac 805cf794 898a7c48 00000000 00000000 nt!ExpWorkerThread+0xef
> b8507ddc 805460ce 80538668 00000001 00000000 nt!PspSystemThreadStartup
> +0x34
> 00000000 00000000 00000000 00000000 00000000 nt!KiThreadStartup+0x16
>
>
> STACK_COMMAND: kb
>
> FOLLOWUP_IP:
> NDIS!NdisReturnPackets+48
> b7e1e848 8b7308 mov esi,dword ptr [ebx+8]
>
> SYMBOL_STACK_INDEX: 4
>
> SYMBOL_NAME: NDIS!NdisReturnPackets+48
>
> FOLLOWUP_NAME: MachineOwner
>
> MODULE_NAME: NDIS
>
> IMAGE_NAME: NDIS.sys
>
> DEBUG_FLR_IMAGE_TIMESTAMP: 41107ec3
>
> FAILURE_BUCKET_ID: 0xD1_NDIS!NdisReturnPackets+48
>
> BUCKET_ID: 0xD1_NDIS!NdisReturnPackets+48
>
> Followup: MachineOwner
> ---------
>
>

 
Reply With Quote
 
 
 
Reply

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
What's wrong with my live.com account? Michael Elliott Windows Live Mail 43 1 Week Ago 09:36 PM
why does my cursor jump all over when I am typing petro Windows Vista Hardware 22 01-15-2011 11:32 AM
Vista32, new driver? & USB Mouse/Keyboard not working Scott J. Stringfellow Windows Vista Hardware 27 04-01-2010 05:22 PM
Cannot install ATI drivers or Catalyst Control Center Pete Russell Windows Vista Performance 9 03-28-2010 02:52 AM
WLM Get faultcode: Windows Live Communication Platform has stoped working Masse Borglund Windows Live Messenger 21 03-28-2010 12:41 AM



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59