|
Guest
Posts: n/a
|
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(("prreceive PacketContent == 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(("prreceive PacketContent == 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
> ---------
>
>
|
|