redice1986
驱动牛犊
驱动牛犊
  • 注册日期2008-06-03
  • 最后登录2008-07-21
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望12点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
阅读:1617回复:4

可恶:驱动给应用程序发数据,蓝屏!

楼主#
更多 发布于:2008-07-11 16:37
问题描述:
“一个包过滤防火墙,当防护墙驱动检测到攻击时,将数据包的信息(源Ip,数据包类型)发送给用户态应用程序,用户态程序将其写入日志数据库中。”
为了实现上述驱动给应用程序发送数据,我采用了这样的思路,在应用程序中,独立线程执行如下代码:
    while(1)
    {
        memset(&attack_infor,0,sizeof(Attack_Infor));
        ret=DeviceIoControl(driverHandle,
            IADS_NEWATTACK_EVENT,
            NULL,
            0,
            (LPVOID)&attack_infor,
            sizeof(Attack_Infor),
            &bytesReturned,
            NULL);//同步进行,驱动不返回就阻塞
        if(!ret) continue;
               //将驱动返回的数据写入日志数据库
       //WriteLogToMdb(&attack_infor);
    }
//上述DeviceIoControl采用同步模式(最后一个参数为NULL),当驱动处理未返回时,就阻塞了。

驱动中分发例程做如下处理:

            case IADS_NEWATTACK_EVENT://读取攻击日志
                while(1)
                {
                    NdisAcquireSpinLock(&AttackInforLock);
                    if(attack_infor.flag)//如果有日志则返回,否则就阻塞
                        {
                             DbgPrint("有新的攻击日志!");
                             NdisMoveMemory(ioBuffer,&attack_infor,sizeof(Attack_Infor));
                             Irp->IoStatus.Information=sizeof(Attack_Infor);
                             NdisReleaseSpinLock(&AttackInforLock);
                             break;
                        }
                    NdisReleaseSpinLock(&AttackInforLock);
                }
                break;        

其中:ioBuffer=Irp->AssociatedIrp.SystemBuffer;
        
测试发现,没有注释NdisMoveMemory(ioBuffer,&attack_infor,sizeof(Attack_Infor));这句时就蓝屏,注释了就不蓝了。
我把这一句换成ioBuffer[0]=1;也蓝了


请教驱动大牛,这是什么原因??在下不甚感激
redice1986
驱动牛犊
驱动牛犊
  • 注册日期2008-06-03
  • 最后登录2008-07-21
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望12点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-07-11 16:42
在线等待高人指点!!!
redice1986
驱动牛犊
驱动牛犊
  • 注册日期2008-06-03
  • 最后登录2008-07-21
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望12点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-07-11 18:35
救命呀!!!
redice1986
驱动牛犊
驱动牛犊
  • 注册日期2008-06-03
  • 最后登录2008-07-21
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望12点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地板#
发布于:2008-07-12 08:44
版主 ,帮忙呀!
havegone
驱动牛犊
驱动牛犊
  • 注册日期2008-01-17
  • 最后登录2012-03-13
  • 粉丝1
  • 关注1
  • 积分29分
  • 威望229点
  • 贡献值0点
  • 好评度21点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2008-07-14 15:50
我以前也出现过,现在记不清不怎么样的。
可以给你一些建议,
首先你检查一下你的IO_CODE是否正确,你这种一种是用BUFFED型,跟踪看看,一般都是内存地址无效或是IRQL造成的。
可以用共享内存的方式来替代。
游客

返回顶部