vipfengxiao
驱动牛犊
驱动牛犊
  • 注册日期2009-12-29
  • 最后登录2011-12-21
  • 粉丝1
  • 关注0
  • 积分79分
  • 威望681点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2509回复:8

有没有办法让驱动在DISPATCH_LEVEL级别下中断?

楼主#
更多 发布于:2010-05-10 19:04
                          有没有办法让驱动在DISPATCH_LEVEL级别下中断?我现在在NDIS中间层的PtReceive中拿到数据包后需要等待应用层传进来一个值才能继续执行,可PtReceive在DISPATCH_LEVEL级别 不能中断 请问大侠们 有什么方法让我等r3传过来一个值在继续下面的操作呢??
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
沙发#
发布于:2010-05-10 19:17
1 启动一个内核线程

2 使用队列在内核线程与PtReceive保持数据共享

3 过程:

   PtReceive接收到数据放到队列中;内核线程等待队列和应用层消息,队列有数据并且等待到一个用层flag, 则向上传递队列中的数据包。

4 关于在DISPATCH_LEVEL中中断,难道没有看ms的文档?明确告诉了,就不要再奢望不能实现的问题。上面是可以参考的一种解决办法。
走走看看开源好 Solaris vs Linux
vipfengxiao
驱动牛犊
驱动牛犊
  • 注册日期2009-12-29
  • 最后登录2011-12-21
  • 粉丝1
  • 关注0
  • 积分79分
  • 威望681点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2010-05-11 09:27
回 1楼(cyliu) 的帖子
谢谢斑竹  但是怎么向上传递队列中的数据包呢?
vipfengxiao
驱动牛犊
驱动牛犊
  • 注册日期2009-12-29
  • 最后登录2011-12-21
  • 粉丝1
  • 关注0
  • 积分79分
  • 威望681点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2010-05-11 10:13
回 1楼(cyliu) 的帖子
向上传递数据包是NdisMIndicateReceivePacket(pAdapt->MiniportHandle, &MyPacket, 1);  多谢了 我试试
vipfengxiao
驱动牛犊
驱动牛犊
  • 注册日期2009-12-29
  • 最后登录2011-12-21
  • 粉丝1
  • 关注0
  • 积分79分
  • 威望681点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2010-05-14 10:35
回 1楼(cyliu) 的帖子
我在线程里面向上抛队列里的包就蓝屏。。。。。。
modernrabbit
驱动牛犊
驱动牛犊
  • 注册日期2009-03-31
  • 最后登录2013-02-18
  • 粉丝1
  • 关注0
  • 积分30分
  • 威望281点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分1分
5楼#
发布于:2010-05-14 10:44
回 3楼(vipfengxiao) 的帖子
为什么要用NdisMIndicateReceivePacket呢,直接在驱动中开一个缓冲区保存这些报文等待应用层读取不行吗?NdisMIndicateReceivePacket应该是通知上层驱动用它的接收函数接收吧,应用层能收到这个通知么?
modernrabbit
驱动牛犊
驱动牛犊
  • 注册日期2009-03-31
  • 最后登录2013-02-18
  • 粉丝1
  • 关注0
  • 积分30分
  • 威望281点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分1分
6楼#
发布于:2010-05-14 10:46
回 1楼(cyliu) 的帖子
在这种情况下,我的理解是PtReceive还是会继续运行的吧?这样是不是仅仅实现了数据的共享啊?
vipfengxiao
驱动牛犊
驱动牛犊
  • 注册日期2009-12-29
  • 最后登录2011-12-21
  • 粉丝1
  • 关注0
  • 积分79分
  • 威望681点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2010-05-14 11:48
回 6楼(modernrabbit) 的帖子
你理解错了 这里说的向上抛就是通知上层驱动 不是抛给应用层
vipfengxiao
驱动牛犊
驱动牛犊
  • 注册日期2009-12-29
  • 最后登录2011-12-21
  • 粉丝1
  • 关注0
  • 积分79分
  • 威望681点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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);就蓝屏了
在线程里面蓝屏 在接收函数里面我也向上抛数据了正常  不知道为什么

游客

返回顶部