阅读:2561回复:11
看在这么晚还加班的份上,请进来看看我禁止指定目录中一切文件操作的问题
为了防止使用者在指定目录下随意进行文件操作,所以要禁止对该目录(如 \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; } ......................... |
|
最新喜欢:![]() |
沙发#
发布于:2007-03-26 12:13
以前遇到过这个问题,忘记怎么答了!哈哈
|
|
|
板凳#
发布于:2007-03-26 16:51
前两个问题已解决,换成IFS for Windows Server 2003 SP1的sfilter,没有了SfGetFileName,问题也解决了。
现在就是第三个问题,显示中文文件名的问题,前面也有人提了,但回答都没有解决问题,大家是怎么弄的? |
|
地板#
发布于:2007-03-27 14:16
发一个IFS for Windows Server 2003 SP1的sfilter里面的create给我们看看呢。
|
|
|
地下室#
发布于:2007-03-27 18:29
还是上面的代码,if 中的移到 KeInitializeEvent 之前了。
|
|
5楼#
发布于:2007-03-27 18:55
弱弱说一句,看LZ您的代码,好像您是在IoCallDriver之后获得的文件名。
此时文件已经被打开了。如果是新建文件,存在大小为0是不奇怪的。 另外,浏览器中如果新建文件失败,会自动尝试"新建 文本文~N.txt"这类的文件名 |
|
|
6楼#
发布于:2007-03-27 18:58
我也遇见显示中文的问题
您把name转换为ANSI,然后使用%s显示试试吧 DbgPrint( "Access Denied: %s\n", ansi_name.buffer ) |
|
|
7楼#
发布于:2007-03-28 01:44
之所以把SfGetFileName放到IoCallDriver之后,也是因为放在之前的话,SfGetFileName就不能得到文件的完整路径名,只得到设备名如\\Device\\HarddiskVolume2,没有文件路径名。
|
|
8楼#
发布于:2007-03-28 09:51
虽然放在IoCallDriver前有d短文件名问题,但可以实现功能的。
|
|
|
驱动小牛
![]() |
9楼#
发布于:2007-03-28 13:54
你把这个文件下的所有create都给禁止不就完了,没有create产生的Fileobject什么操作都不能执行.
|
|
10楼#
发布于:2007-03-28 14:20
引用第6楼wht0395于2007-03-27 18:58发表的“”: 正是如此,中文可以显示了,谢谢! Unicode怎么就不行呢?那几种参数我都试过了。有没有办法将Unicode字符串直接显示出来? |
|
11楼#
发布于:2007-03-28 14:24
引用第9楼yandong_8212于2007-03-28 13:54发表的“”: 就是都禁了。问题出在 wht0395 说的那。 2003 server ifs kit中sfilter中的那个 SfGetFileName 在 IoCallDriver 之前得不到文件名,只能得到设备名,如:\Device\HarddiskVolume2,后面的路径和文件名都没有。只有将 SfGetFileName 放在 IoCallDriver 之后才可以得到文件名。怎么解决这个问题啊? |
|