strpic
驱动小牛
驱动小牛
  • 注册日期2006-11-01
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望238点
  • 贡献值0点
  • 好评度156点
  • 原创分0分
  • 专家分0分
阅读:2369回复:11

看在这么晚还加班的份上,请进来看看我禁止指定目录中一切文件操作的问题

楼主#
更多 发布于:2007-03-26 03:21
为了防止使用者在指定目录下随意进行文件操作,所以要禁止对该目录(如 \Device\HarddiskVolume2\test\ )下所有文件的新建、打开、读写、删除、重命名、剪贴、拷贝等操作。实现起来倒也简单,在sfilter上改的,在SfCreate中过滤路径,只要是该目录下的文件,全部拒绝了,目的达到了,就剩2个问题:

1、当用资源管理器打开该目录,右键-->新建文本文件、写字板文件等的时候,会一下子出现999个0字节文件,从“新建 文本文档.txt”、“新建 文本文档(1).txt”一直到“新建 文本文档(999).txt”,这是怎么回事?

2、当将其他位置的文件复制-->粘贴到该目录下时,虽然文件内容不会被复制过来,但却会产生一个0字节的同名文件,看起来有些不爽。

3、顺便问一下,DbgPrint( "Access Denied: %wZ\n", name ) 怎么不显示中文文件名?转成ANSI_STRING也不行。

就这几个问题,是不是还要在其他地方做些什么啊?现在高手都不愿意说话,麻烦请大家给点提示也好,先谢过了!

SfCreate的代码如下:
      ...........................
        PIO_STACK_LOCATION irpSp;
        PUNICODE_STRING name;
        GET_NAME_CONTROL nameControl;
        wchar_t* myProtectPath = L"\\Device\\HarddiskVolume2\\test\\";

        KEVENT waitEvent;
        KeInitializeEvent( &waitEvent, NotificationEvent, FALSE );

        IoCopyCurrentIrpStackLocationToNext( Irp );
        IoSetCompletionRoutine(
            Irp,
            SfCreateCompletion,
            &waitEvent,
            TRUE,
            TRUE,
            TRUE );
        status = IoCallDriver( ((PSFILTER_DEVICE_EXTENSION) DeviceObject->DeviceExtension)->AttachedToDeviceObject, Irp );

        irpSp = IoGetCurrentIrpStackLocation( Irp );
        name = SfGetFileName( irpSp->FileObject,
                              Irp->IoStatus.Status,
                              &nameControl );
//        DbgPrint( "SfCreate: %wZ\n", name );
        if( wcsncmp( name->Buffer, myProtectPath, wcslen( myProtectPath ) ) == 0 )
        {
                DbgPrint( "Access Denied: %wZ\n", name );
            
                SfGetFileNameCleanup( &nameControl );

                Irp->IoStatus.Status = STATUS_ACCESS_DENIED;
                Irp->IoStatus.Information = 0;
                IoCompleteRequest( Irp, IO_NO_INCREMENT );
                return Irp->IoStatus.Status;
        }
        .........................

最新喜欢:

rhpengrhpeng
aasa2
驱动中牛
驱动中牛
  • 注册日期2004-04-01
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分525分
  • 威望339点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-03-26 12:13
以前遇到过这个问题,忘记怎么答了!哈哈
技术交流:aasa2@21cn.com QQ群:10863699
strpic
驱动小牛
驱动小牛
  • 注册日期2006-11-01
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望238点
  • 贡献值0点
  • 好评度156点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-03-26 16:51
前两个问题已解决,换成IFS for Windows Server 2003 SP1的sfilter,没有了SfGetFileName,问题也解决了。

现在就是第三个问题,显示中文文件名的问题,前面也有人提了,但回答都没有解决问题,大家是怎么弄的?
Pegram
论坛版主
论坛版主
  • 注册日期2005-12-03
  • 最后登录2013-08-23
  • 粉丝13
  • 关注5
  • 积分1333分
  • 威望4717点
  • 贡献值1点
  • 好评度78点
  • 原创分0分
  • 专家分2分
地板#
发布于:2007-03-27 14:16
发一个IFS for Windows Server 2003 SP1的sfilter里面的create给我们看看呢。
《寒江独钓》与《竹林蹊径》的合作作者。精通USB开发,设计了CY001 USB驱动套件(http://bbs.driverdevelop.com/read.php?tid-119314.html)。
strpic
驱动小牛
驱动小牛
  • 注册日期2006-11-01
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望238点
  • 贡献值0点
  • 好评度156点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-03-27 18:29
还是上面的代码,if 中的移到 KeInitializeEvent 之前了。
wht0395
驱动小牛
驱动小牛
  • 注册日期2006-07-06
  • 最后登录2009-06-10
  • 粉丝0
  • 关注0
  • 积分583分
  • 威望135点
  • 贡献值0点
  • 好评度122点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-03-27 18:55
弱弱说一句,看LZ您的代码,好像您是在IoCallDriver之后获得的文件名。
此时文件已经被打开了。如果是新建文件,存在大小为0是不奇怪的。

另外,浏览器中如果新建文件失败,会自动尝试"新建 文本文~N.txt"这类的文件名
什么不懂的学生
wht0395
驱动小牛
驱动小牛
  • 注册日期2006-07-06
  • 最后登录2009-06-10
  • 粉丝0
  • 关注0
  • 积分583分
  • 威望135点
  • 贡献值0点
  • 好评度122点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-03-27 18:58
我也遇见显示中文的问题

您把name转换为ANSI,然后使用%s显示试试吧
DbgPrint( "Access Denied: %s\n", ansi_name.buffer )
什么不懂的学生
strpic
驱动小牛
驱动小牛
  • 注册日期2006-11-01
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望238点
  • 贡献值0点
  • 好评度156点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-03-28 01:44
之所以把SfGetFileName放到IoCallDriver之后,也是因为放在之前的话,SfGetFileName就不能得到文件的完整路径名,只得到设备名如\\Device\\HarddiskVolume2,没有文件路径名。
wht0395
驱动小牛
驱动小牛
  • 注册日期2006-07-06
  • 最后登录2009-06-10
  • 粉丝0
  • 关注0
  • 积分583分
  • 威望135点
  • 贡献值0点
  • 好评度122点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-03-28 09:51
虽然放在IoCallDriver前有d短文件名问题,但可以实现功能的。
什么不懂的学生
yandong_8212
驱动小牛
驱动小牛
  • 注册日期2006-07-28
  • 最后登录2011-02-11
  • 粉丝0
  • 关注0
  • 积分1046分
  • 威望464点
  • 贡献值1点
  • 好评度173点
  • 原创分0分
  • 专家分1分
9楼#
发布于:2007-03-28 13:54
你把这个文件下的所有create都给禁止不就完了,没有create产生的Fileobject什么操作都不能执行.
商务MSN:YanDong_8212@163.com
strpic
驱动小牛
驱动小牛
  • 注册日期2006-11-01
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望238点
  • 贡献值0点
  • 好评度156点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2007-03-28 14:20
引用第6楼wht03952007-03-27 18:58发表的“”:
我也遇见显示中文的问题

您把name转换为ANSI,然后使用%s显示试试吧
DbgPrint( "Access Denied: %sn", ansi_name.buffer )


正是如此,中文可以显示了,谢谢!

Unicode怎么就不行呢?那几种参数我都试过了。有没有办法将Unicode字符串直接显示出来?
strpic
驱动小牛
驱动小牛
  • 注册日期2006-11-01
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望238点
  • 贡献值0点
  • 好评度156点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2007-03-28 14:24
引用第9楼yandong_82122007-03-28 13:54发表的“”:
你把这个文件下的所有create都给禁止不就完了,没有create产生的Fileobject什么操作都不能执行.


就是都禁了。问题出在 wht0395 说的那。

2003 server ifs kit中sfilter中的那个 SfGetFileName 在 IoCallDriver 之前得不到文件名,只能得到设备名,如:\Device\HarddiskVolume2,后面的路径和文件名都没有。只有将 SfGetFileName 放在 IoCallDriver 之后才可以得到文件名。怎么解决这个问题啊?
游客

返回顶部