阅读:1617回复:4
可恶:驱动给应用程序发数据,蓝屏!
问题描述:
“一个包过滤防火墙,当防护墙驱动检测到攻击时,将数据包的信息(源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;也蓝了 请教驱动大牛,这是什么原因??在下不甚感激 |
|
沙发#
发布于:2008-07-11 16:42
在线等待高人指点!!!
|
|
板凳#
发布于:2008-07-11 18:35
救命呀!!!
|
|
地板#
发布于:2008-07-12 08:44
版主 ,帮忙呀!
|
|
地下室#
发布于:2008-07-14 15:50
我以前也出现过,现在记不清不怎么样的。
可以给你一些建议, 首先你检查一下你的IO_CODE是否正确,你这种一种是用BUFFED型,跟踪看看,一般都是内存地址无效或是IRQL造成的。 可以用共享内存的方式来替代。 |
|