test001
驱动小牛
驱动小牛
  • 注册日期2006-11-12
  • 最后登录2008-11-07
  • 粉丝0
  • 关注0
  • 积分990分
  • 威望170点
  • 贡献值0点
  • 好评度169点
  • 原创分0分
  • 专家分0分
阅读:1803回复:13

各位大牛帮帮忙,以前的问题还没解决,现在又遇到新的问题了!

楼主#
更多 发布于:2007-05-19 12:42
我想实现对固定文件夹下禁止删除操作,参照了以前的帖子上说的方法,即在IRP_MJ_SET_INFORMATION的处理函数里判断irpSp->Parameters.SetFile.FileInformationClass是否等于FileDispositionInformation。
于是我就在sfilter的基础上修改的,代码如下:
    DriverObject->MajorFunction[IRP_MJ_SET_INFORMATION] = SfSetInformation;

NTSTATUS
SfSetInformation (
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    )
{
   NTSTATUS status;
   PIO_STACK_LOCATION irpSp;
   PUNICODE_STRING name;
   GET_NAME_CONTROL nameControl;
   int cmpresult;
   wchar_t* testDirPath = L"\\Device\\HarddiskVolume1\\test";

   irpSp = IoGetCurrentIrpStackLocation(Irp);
   name = SfGetFileName( irpSp->FileObject, Irp->IoStatus.Status, &nameControl );
   cmpresult = wcsncmp( name->Buffer, testDirPath, wcslen( testDirPath ) );
   if( cmpresult == 0 )
   {
     DbgPrint("===========比较结果一致==========\n");
    if(irpSp->Parameters.SetFile.FileInformationClass == FileDispositionInformation)
    {
        DbgPrint("----------------------禁止删除文件--------------------\n");
        Irp->IoStatus.Status = STATUS_ACCESS_DENIED;
        Irp->IoStatus.Information = 0;
        IoCompleteRequest(Irp, IO_NO_INCREMENT);
        return STATUS_ACCESS_DENIED;
    }
   }
   IoSkipCurrentIrpStackLocation( Irp );
   return IoCallDriver( ((PSFILTER_DEVICE_EXTENSION) DeviceObject->DeviceExtension)->AttachedToDeviceObject, Irp );
}
可是驱动加载后,系统就死机了,不知道是什么原因,恳请各位大牛帮帮忙!!!
test001
驱动小牛
驱动小牛
  • 注册日期2006-11-12
  • 最后登录2008-11-07
  • 粉丝0
  • 关注0
  • 积分990分
  • 威望170点
  • 贡献值0点
  • 好评度169点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-05-20 18:02
怎么都没人回帖子,是我的问题太菜了吗?
zqq_tt
驱动牛犊
驱动牛犊
  • 注册日期2003-05-07
  • 最后登录2007-12-25
  • 粉丝0
  • 关注0
  • 积分114分
  • 威望13点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-05-20 19:43
wchar_t* testDirPath = L"\\Device\\HarddiskVolume1\\test";放到外面试一下
zqq_tt
驱动牛犊
驱动牛犊
  • 注册日期2003-05-07
  • 最后登录2007-12-25
  • 粉丝0
  • 关注0
  • 积分114分
  • 威望13点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-05-20 19:47
要不就是name = SfGetFileName( irpSp->FileObject, Irp->IoStatus.Status, &nameControl );
这句话惹得祸,因为你在SfGetFileName中申请了空间,可有时候这就会导致错误
test001
驱动小牛
驱动小牛
  • 注册日期2006-11-12
  • 最后登录2008-11-07
  • 粉丝0
  • 关注0
  • 积分990分
  • 威望170点
  • 贡献值0点
  • 好评度169点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-05-21 10:37
引用第3楼zqq_tt于2007-05-20 19:47发表的  :
要不就是name = SfGetFileName( irpSp->FileObject, Irp->IoStatus.Status, &nameControl );
这句话惹得祸,因为你在SfGetFileName中申请了空间,可有时候这就会导致错误


那这种情况下怎么获取文件名呢?
谢谢!!!
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-05-21 12:25
wcsncmp( name->Buffer, testDirPath, wcslen( testDirPath ) );
这里的name->Buffer应该不是NULL结尾的c字符串吧,所以这里比较有问题,改成下面的试试
wcsncmp( name->Buffer, testDirPath, min(name->Length >> 2, wcslen( testDirPath )) );
test001
驱动小牛
驱动小牛
  • 注册日期2006-11-12
  • 最后登录2008-11-07
  • 粉丝0
  • 关注0
  • 积分990分
  • 威望170点
  • 贡献值0点
  • 好评度169点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-05-21 14:21
引用第5楼tooflat于2007-05-21 12:25发表的  :
wcsncmp( name->Buffer, testDirPath, wcslen( testDirPath ) );
这里的name->Buffer应该不是NULL结尾的c字符串吧,所以这里比较有问题,改成下面的试试
wcsncmp( name->Buffer, testDirPath, min(name->Length >> 2, wcslen( testDirPath )) );


这就去试试!
test001
驱动小牛
驱动小牛
  • 注册日期2006-11-12
  • 最后登录2008-11-07
  • 粉丝0
  • 关注0
  • 积分990分
  • 威望170点
  • 贡献值0点
  • 好评度169点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-05-21 15:44
tooflat老大,我试了一下,先是编译出错“signed/unsigned不匹配”,后来我强制转换了类型如下:wcsncmp( name->Buffer, testDirPath, min((unsigned)name->Length >> 2, wcslen( testDirPath )) );
编译没问题了,可是还是死机,我快要崩溃了!!!
jhust
驱动牛犊
驱动牛犊
  • 注册日期2006-06-26
  • 最后登录2008-04-16
  • 粉丝0
  • 关注0
  • 积分250分
  • 威望26点
  • 贡献值0点
  • 好评度25点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-05-21 16:41
在sfcreate中试试
test001
驱动小牛
驱动小牛
  • 注册日期2006-11-12
  • 最后登录2008-11-07
  • 粉丝0
  • 关注0
  • 积分990分
  • 威望170点
  • 贡献值0点
  • 好评度169点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2007-05-21 17:23
引用第8楼jhust于2007-05-21 16:41发表的  :
在sfcreate中试试


如果在fcreate函数中进行处理,有什么好的判断文件删除操作的方法吗?
我以前也在sfcreate函数中试过,判断的条件是irpSp->Parameters.Create.SecurityContext->DesiredAccess & DELETE,可是这样做虽然能够禁止删除,但是以后再打开该文件时,系统提示“该文件已经被其他的程序访问,进程无法该文件”,这个问题没法解决!
你有什么好的方法?
devia
论坛版主
论坛版主
  • 注册日期2005-05-14
  • 最后登录2016-04-05
  • 粉丝3
  • 关注0
  • 积分1029分
  • 威望712点
  • 贡献值1点
  • 好评度555点
  • 原创分8分
  • 专家分4分
10楼#
发布于:2007-05-22 08:32
1. 拦截文件删除操作在 IRP_MJ_SET_INFORMATION 例程中判断是正确的;
2. 文件删除有两种情况:
    a。文件进回收站  --- FileRenameInformation
    b。文件彻底删除  --- FileDispositionInformation
3. 已经重复了N次了,获取文件名的操作尽量在IRP_MJ_CREATE例程中,
     后面只是查找、跟踪而已! 这可以说是一条文件过滤驱动的设计原则;
人总在矛盾中徘徊。。。
devia
论坛版主
论坛版主
  • 注册日期2005-05-14
  • 最后登录2016-04-05
  • 粉丝3
  • 关注0
  • 积分1029分
  • 威望712点
  • 贡献值1点
  • 好评度555点
  • 原创分8分
  • 专家分4分
11楼#
发布于:2007-05-22 08:41
人总在矛盾中徘徊。。。
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
12楼#
发布于:2007-05-22 12:25
除了devia说的,另外测试方式似乎也许有些问题。这么几句话,采用逐渐加代码或着二分法测试应该很快就能确定出问题所在。 问题找到了,再提问题也许更好。
走走看看开源好 Solaris vs Linux
test001
驱动小牛
驱动小牛
  • 注册日期2006-11-12
  • 最后登录2008-11-07
  • 粉丝0
  • 关注0
  • 积分990分
  • 威望170点
  • 贡献值0点
  • 好评度169点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2007-05-22 15:19
谢谢各位大侠的建议!
游客

返回顶部