阅读:2988回复:3
[求助]在passthru上开发来实现控制网速,接收包这块总是蓝屏,高手帮忙看下
我先说下我的实现方法,大家帮忙看看有没有错误。
我在原来代码中所有的NdisMIndicateReceivePacket前都添加了判断流量的函数,如果超过流量了,就不调用NdisMIndicateReceivePacket函数,而把packet添加入链表中, 有个线程专门处理此链表,该线程延迟0.5s再调用NdisMIndicateReceivePacket(packet)通知上层收包完成了。 下面是代码: //PtRecieve函数中的部分 if (pAdapt->MiniportHandle != NULL) { Status = GetPacketSize(MyPacket, PACKET_TYPE_RECV, Status, pAdapt, TRUE);//GetPacketSize是我自己写的函数,用来判断数据量,并插入链表的。返回//NDIS_STATUS_PENDING表示超过流量了。 if(Status != NDIS_STATUS_PENDING) NdisMIndicateReceivePacket(pAdapt->MiniportHandle, &MyPacket, 1); } if(Status != NDIS_STATUS_PENDING) NdisDprFreePacket(MyPacket); //GetPacketSize部分 NDIS_STATUS GetPacketSize(PNDIS_PACKET pPacket, PACKET_TYPE_ENUM enumPacketType, NDIS_STATUS status, NDIS_HANDLE AdapterContext, BOOLEAN bNeedRelease) { NDIS_STATUS statusRet = status; UINT bNeedToSleep = 0; PMyDataStruct pDataStru = NULL; //判断部分省略了 if(bNeedToSleep) { //NdisStallExecution(50); statusRet = NDIS_STATUS_PENDING; pDataStru = (PMyDataStruct)ExAllocatePool(NonPagedPool, sizeof(MyDataStruct)); pDataStru->packet = pPacket; pDataStru->enmType = enumPacketType; pDataStru->AdapterContext = AdapterContext; pDataStru->Status = status; pDataStru->bNeedRelease = bNeedRelease; ExInterlockedInsertTailList(&list_head, &pDataStru->ListEntry, &list_lock ); KeSetEvent(&request_event, (KPRIORITY) 0, FALSE); } else { statusRet = status; } return statusRet; } //结构体部分 typedef struct _MyDataStruct { LIST_ENTRY ListEntry; PNDIS_PACKET packet; PACKET_TYPE_ENUM enmType; NDIS_STATUS Status; NDIS_HANDLE AdapterContext; BOOLEAN bNeedRelease; }MyDataStruct, *PMyDataStruct; //处理链表的线程部分 VOID DelayThread( IN PVOID Context ) { PLIST_ENTRY request; PMyDataStruct pDataStru; PNDIS_PACKET packet; PADAPT pAdapt = NULL; KeSetPriorityThread(KeGetCurrentThread(), LOW_REALTIME_PRIORITY); for (;;) { KeWaitForSingleObject(&request_event,Executive,KernelMode,FALSE,NULL); if (terminate_thread) { PsTerminateSystemThread(STATUS_SUCCESS); } while (request = ExInterlockedRemoveHeadList(&list_head,&list_lock)) { pDataStru = CONTAINING_RECORD(request, MyDataStruct, ListEntry); pAdapt = (PADAPT)(pDataStru->AdapterContext); packet = pDataStru->packet; switch (pDataStru->enmType) { case PACKET_TYPE_SEND: NdisMSendComplete(pAdapt->MiniportHandle,packet,pDataStru->Status); break; case PACKET_TYPE_RECV: NdisMIndicateReceivePacket(pAdapt, &(packet), 1); break; } if(pDataStru->bNeedRelease) NdisDprFreePacket(packet); ExFreePool(pDataStru); pDataStru = NULL; } } } 总是在DelayThread中的NdisMIndicateReceivePacket(pAdapt, &(packet), 1)蓝屏。 蓝屏报告如下:SYSTEM_THREAD_EXCEPTION_NOT_HANDLED_M (1000007e) This is a very common bugcheck. Usually the exception address pinpoints the driver/function that caused the problem. Always note this address as well as the link date of the driver/image that contains this address. Some common problems are exception code 0x80000003. This means a hard coded breakpoint or assertion was hit, but this system was booted /NODEBUG. This is not supposed to happen as developers should never have hardcoded breakpoints in retail code, but ... If this happens, make sure a debugger gets connected, and the system is booted /DEBUG. This will let us see why this breakpoint is happening. Arguments: Arg1: c0000005, The exception code that was not handled Arg2: 00000000, The address that the exception occurred at Arg3: f9f33cc0, Exception Record Address Arg4: f9f339bc, Context Record Address Debugging Details: ------------------ EXCEPTION_CODE: (NTSTATUS) 0xc0000005 - "0x%08lx" FAULTING_IP: +16 00000000 ?? ??? EXCEPTION_RECORD: f9f33cc0 -- (.exr 0xfffffffff9f33cc0) ExceptionAddress: 00000000 ExceptionCode: c0000005 (Access violation) ExceptionFlags: 00000000 NumberParameters: 2 Parameter[0]: 00000000 Parameter[1]: 00000000 Attempt to read from address 00000000 CONTEXT: f9f339bc -- (.cxr 0xfffffffff9f339bc) eax=816ed590 ebx=00000000 ecx=00000000 edx=816ed590 esi=816ed280 edi=00000000 eip=00000000 esp=f9f33d88 ebp=f9f33dac iopl=0 nv up ei pl zr na pe nc cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00010246 00000000 ?? ??? Resetting default scope CUSTOMER_CRASH_COUNT: 2 DEFAULT_BUCKET_ID: INTEL_CPU_MICROCODE_ZERO PROCESS_NAME: System ERROR_CODE: (NTSTATUS) 0xc0000005 - "0x%08lx" EXCEPTION_PARAMETER1: 00000000 EXCEPTION_PARAMETER2: 00000000 READ_ADDRESS: 00000000 FOLLOWUP_IP: passthru!DelayThread+c7 [c:\winddk\7600.16385.0\passthru\driver\passthru.c @ 591] f9d2dea7 8b55f0 mov edx,dword ptr [ebp-10h] FAILED_INSTRUCTION_ADDRESS: +2dd952f014adfdc 00000000 ?? ??? BUGCHECK_STR: 0x7E LAST_CONTROL_TRANSFER: from f9d2dea7 to 00000000 STACK_TEXT: WARNING: Frame IP not in any known module. Following frames may be wrong. f9f33d84 f9d2dea7 816ed590 f9f33da0 00000001 0x0 f9f33dac 8057dfce 00000000 00000000 00000000 passthru!DelayThread+0xc7 [c:\winddk\7600.16385.0\passthru\driver\passthru.c @ 591] f9f33ddc 804f98fa f9d2dde0 00000000 00000000 nt!PspSystemThreadStartup+0x34 00000000 00000000 00000000 00000000 00000000 nt!KiThreadStartup+0x16 好心人帮忙看下呀 |
|
沙发#
发布于:2010-12-04 19:36
顶顶更健康
|
|
板凳#
发布于:2010-12-19 14:09
要防止RtRecv返回后,数据包被释放了。而在队列里面引用数据包指针已经无意义了
|
|
|
地板#
发布于:2011-03-22 15:29
后来如何了,我现在也遇到这样的问题。
|
|