阅读:2577回复:8
有没有办法让驱动在DISPATCH_LEVEL级别下中断?
有没有办法让驱动在DISPATCH_LEVEL级别下中断?我现在在NDIS中间层的PtReceive中拿到数据包后需要等待应用层传进来一个值才能继续执行,可PtReceive在DISPATCH_LEVEL级别 不能中断 请问大侠们 有什么方法让我等r3传过来一个值在继续下面的操作呢??
|
|
沙发#
发布于:2010-05-10 19:17
1 启动一个内核线程
2 使用队列在内核线程与PtReceive保持数据共享 3 过程: PtReceive接收到数据放到队列中;内核线程等待队列和应用层消息,队列有数据并且等待到一个用层flag, 则向上传递队列中的数据包。 4 关于在DISPATCH_LEVEL中中断,难道没有看ms的文档?明确告诉了,就不要再奢望不能实现的问题。上面是可以参考的一种解决办法。 |
|
|
板凳#
发布于:2010-05-11 09:27
回 1楼(cyliu) 的帖子
谢谢斑竹 但是怎么向上传递队列中的数据包呢? |
|
地板#
发布于:2010-05-11 10:13
回 1楼(cyliu) 的帖子
向上传递数据包是NdisMIndicateReceivePacket(pAdapt->MiniportHandle, &MyPacket, 1); 多谢了 我试试 |
|
地下室#
发布于:2010-05-14 10:35
回 1楼(cyliu) 的帖子
我在线程里面向上抛队列里的包就蓝屏。。。。。。 |
|
5楼#
发布于:2010-05-14 10:44
回 3楼(vipfengxiao) 的帖子
为什么要用NdisMIndicateReceivePacket呢,直接在驱动中开一个缓冲区保存这些报文等待应用层读取不行吗?NdisMIndicateReceivePacket应该是通知上层驱动用它的接收函数接收吧,应用层能收到这个通知么? |
|
6楼#
发布于:2010-05-14 10:46
回 1楼(cyliu) 的帖子
在这种情况下,我的理解是PtReceive还是会继续运行的吧?这样是不是仅仅实现了数据的共享啊? |
|
7楼#
发布于:2010-05-14 11:48
回 6楼(modernrabbit) 的帖子
你理解错了 这里说的向上抛就是通知上层驱动 不是抛给应用层 |
|
8楼#
发布于:2010-05-14 12:05
回 1楼(cyliu) 的帖子
我在线程向上抛数据的时候蓝屏了 我在PtRecieve里面接收到数据包后放入队列 队列定义如下: typedef struct _MYDATASTRUCT { LIST_ENTRY ListEntry; PUCHAR pPacketList;//存放数据包 UINT Packetlenth;//数据包长度 PADAPT pAdapt;//这个参数主要是取绑定的上下文 PtRecieve的第一个参数 因为在线程中向上层抛数据的时候要用到 UINT HeaderBufferSize;//数据包头的长度 ULONG number;//列表计数 } MYDATASTRUCT, *PMYDATASTRUCT; 在PtRecieve函数里是将接收到得数据包放入队列 代码如下: PMYDATASTRUCT pData; 。。。。。。 Status = NdisAllocateMemoryWithTag((PVOID *)&pData->pPacketList, BUFFER_SIZE, 'maDN'); if(Status != NDIS_STATUS_SUCCESS) { return(NDIS_STATUS_NOT_ACCEPTED); } if(pData->pPacketList == NULL) { DbgPrint("PTReceive:pData->pPacketList==NULL\n"); return(NDIS_STATUS_NOT_ACCEPTED); } NdisMoveMemory(pData->pPacketList, pPacketContent, PacketLen); pData->pAdapt = pAdapt; pData->Packetlenth=PacketLen; pData->HeaderBufferSize = HeaderBufferSize; pData->number++; InsertTailList(&linkListHead,&pData->ListEntry); 然后是在内核线程里面的处理了: if (pData->pPacketList != NULL) { DBGPRINT(("列表不为空、。。。。。。。。。。。。")); --------------------------------------------------将队列中的包取出来 NdisMoveMemory(pPacketContent, pData->pPacketList, pData->Packetlenth); PacketLen = pData->Packetlenth; { --------------------------------------------------将包处理完后开始关联包 NdisDprAllocatePacket(&Status, &MyPacket, pData->pAdapt->RecvPacketPoolHandle); if(Status == NDIS_STATUS_SUCCESS) { DbgPrint("--------------------------------------------------------线程中分配包描述符成功.\n"); NdisAllocateBuffer(&Status, &pPacketBuffer, pData->pAdapt->RecvBufferPoolHandle, pPacketContentlast,PacketLenlast); NdisChainBufferAtFront(MyPacket, pPacketBuffer); MyPacket->Private.Head->Next = NULL; MyPacket->Private.Tail = NULL; RecvRsvd=(PRECV_RSVD)(MyPacket->MiniportReserved); RecvRsvd->OriginalPkt = NULL; NDIS_SET_PACKET_HEADER_SIZE(MyPacket, pData->HeaderBufferSize); NdisMIndicateReceivePacket((pData->pAdapt)->MiniportHandle, &MyPacket, 1); ///////////到这里就蓝屏了 if(NDIS_GET_PACKET_STATUS(MyPacket) != NDIS_STATUS_PENDING) { DBGPRINT(("In PtReceive And Free Memory\n")); NdisFreeBuffer(pPacketBuffer); // NdisFreeMemory(pPacketContent, BUFFER_SIZE, 0); // // NdisFreeMemory(pData->pPacketList, BUFFER_SIZE, 0); NdisFreeMemory(pPacketContentlast, BUFFER_SIZE, 0); NdisDprFreePacket(MyPacket); } } else { DbgPrint("--------------------------------------------------------线程中分配包描述符失败.\n"); } } pEntry = RemoveTailList(&linkListHead); pData = CONTAINING_RECORD(pEntry, MYDATASTRUCT, ListEntry); pData->number--; KdPrint(("%d\n",pData->number)); } MPReturnPacket函数也进行处理了 不知道为什么到了NdisMIndicateReceivePacket((pData->pAdapt)->MiniportHandle, &MyPacket, 1);就蓝屏了 在线程里面蓝屏 在接收函数里面我也向上抛数据了正常 不知道为什么 |
|