阅读:5373回复:25
如何禁止访问某一文件夹
请问,我要实现禁止访问D盘上的office文件夹的功能,依据sfilter,编写如下代码,其中的字符串匹配可以,但不能实现该功能,请问错在哪儿呢?
NTSTATUS SfCreate ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ) { NTSTATUS status; PAGED_CODE(); if (IS_MY_CONTROL_DEVICE_OBJECT(DeviceObject)) { Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST; Irp->IoStatus.Information = 0; IoCompleteRequest( Irp, IO_NO_INCREMENT ); DbgPrint(\"sfcreate error one...\\n\"); return STATUS_INVALID_DEVICE_REQUEST; } ASSERT(IS_MY_DEVICE_OBJECT( DeviceObject )); { KEVENT waitEvent; // // Initialize an event to wait for the completion routine to occur // KeInitializeEvent( &waitEvent, NotificationEvent, FALSE ); Irp->IoStatus.Status = -1; { PIO_STACK_LOCATION irpSp; PUNICODE_STRING name; GET_NAME_CONTROL nameControl; ANSI_STRING fileName; NTSTATUS status; // // Get current IRP stack // irpSp = IoGetCurrentIrpStackLocation( Irp ); // // Get the name of this file object // name = SfGetFileName( irpSp->FileObject, Irp->IoStatus.Status, &nameControl ); // // change name into ansi string // status = RtlUnicodeStringToAnsiString( &fileName, name, TRUE ); if (!NT_SUCCESS( status )) { // // Cleanup from getting the name // SfGetFileNameCleanup( &nameControl ); //return TRUE; } DbgPrint(\"FileName: %s\\n\", fileName.Buffer); if (_stricmp(fileName.Buffer, \"\\\\Device\\\\HarddiskVolume2\\\\office\") == 0) { DbgPrint(\"matching...................\\n\"); Irp->IoStatus.Status = STATUS_ACCESS_DENIED; Irp->IoStatus.Information = 0; IoCompleteRequest( Irp, IO_NO_INCREMENT ); return STATUS_ACCESS_DENIED; } } ////////////////////////////////////////////////////////////////////////// IoCopyCurrentIrpStackLocationToNext( Irp ); IoSetCompletionRoutine( Irp, SfCreateCompletion, &waitEvent, TRUE, TRUE, TRUE ); // // Call the next driver in the stack. // status = IoCallDriver( ((PSFILTER_DEVICE_EXTENSION) DeviceObject->DeviceExtension)->AttachedToDeviceObject, Irp ); // // Wait for the completion routine to be called // if (STATUS_PENDING == status) { NTSTATUS localStatus = KeWaitForSingleObject(&waitEvent, Executive, KernelMode, FALSE, NULL); ASSERT(STATUS_SUCCESS == localStatus); } ASSERT(KeReadStateEvent(&waitEvent) || !NT_SUCCESS(Irp->IoStatus.Status)); if (FlagOn(SfDebug, (SFDEBUG_GET_CREATE_NAMES|SFDEBUG_DISPLAY_CREATE_NAMES))) { SfDisplayCreateFileName( Irp ); } status = Irp->IoStatus.Status; IoCompleteRequest( Irp, IO_NO_INCREMENT ); return status; } } |
|
最新喜欢:rhpeng
|
沙发#
发布于:2005-03-22 08:35
我又精减了一下,请各位高手帮助一下啦
请问,我要实现禁止访问D盘上的office文件夹的功能,依据sfilter,编写如下代码,其中的字符串匹配可以,但不能实现该功能,请问错在哪儿呢? NTSTATUS SfCreate ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ) { NTSTATUS status; PAGED_CODE(); if (IS_MY_CONTROL_DEVICE_OBJECT(DeviceObject)) { Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST; Irp->IoStatus.Information = 0; IoCompleteRequest( Irp, IO_NO_INCREMENT ); return STATUS_INVALID_DEVICE_REQUEST; } ASSERT(IS_MY_DEVICE_OBJECT( DeviceObject )); Irp->IoStatus.Status = -1; { PIO_STACK_LOCATION irpSp; PUNICODE_STRING name; GET_NAME_CONTROL nameControl; ANSI_STRING fileName; NTSTATUS status; irpSp = IoGetCurrentIrpStackLocation( Irp ); name = SfGetFileName( irpSp->FileObject, Irp->IoStatus.Status, &nameControl ); status = RtlUnicodeStringToAnsiString( &fileName, name, TRUE ); DbgPrint(\"FileName: %s\\n\", fileName.Buffer); if (_stricmp(fileName.Buffer, \"\\\\Device\\\\HarddiskVolume2\\\\office\") == 0) { DbgPrint(\"matching...................\\n\"); Irp->IoStatus.Status = STATUS_ACCESS_DENIED; Irp->IoStatus.Information = 0; IoCompleteRequest( Irp, IO_NO_INCREMENT ); return STATUS_ACCESS_DENIED; } } ////////////////////////////////////////////////////////////////////////// IoCopyCurrentIrpStackLocationToNext( Irp ); IoSetCompletionRoutine( Irp, SfCreateCompletion, &waitEvent, TRUE, TRUE, TRUE ); status = IoCallDriver( ((PSFILTER_DEVICE_EXTENSION) DeviceObject->DeviceExtension)->AttachedToDeviceObject, Irp ); status = Irp->IoStatus.Status; IoCompleteRequest( Irp, IO_NO_INCREMENT ); return status; } } |
|
|
板凳#
发布于:2005-03-22 09:05
我又精减了一下,请各位高手帮助一下啦 这种方法倒是没有用过,不过有一种方法是filemon的方法。 就是替换ZwOpenFile和 ZwCreateFile。 |
|
|
地板#
发布于:2005-03-23 12:42
if (_stricmp(fileName.Buffer, \"\\\\Device\\\\HarddiskVolume2\\\\office\") == 0)
你的_stricmp有问题,试试 _wcsicmp( fileName.Buffer, L\"\\\\Device\\\\HarddiskVolume2\\\\office\" ) 另外,不知道你用的sfilter使什么版本的?SfGetFileName函数有些Bug |
|
|
地下室#
发布于:2005-03-23 15:06
------------
if (_stricmp(fileName.Buffer, \"\\\\Device\\\\HarddiskVolume2\\\\office\") == 0) 你的_stricmp有问题,试试 _wcsicmp( fileName.Buffer, L\"\\\\Device\\\\HarddiskVolume2\\\\office\" ) 另外,不知道你用的sfilter使什么版本的?SfGetFileName函数有些Bug ----------------- 字符串比较没有问题,从DebugView中已经看到已经匹配, 使用的IFS 2004,应该从理论上没有问题,不知为什么 |
|
|
5楼#
发布于:2005-03-24 09:00
如果如果确定比较没有问题,那就是你的程序逻辑问题,把完整代码发上来我帮你看看。
另外,你用的IFS 2004版本已经修正了SfGetFileName的Bug. 你能不能给我发个IFS 2004到我信箱。secosx@163.com谢谢!我正在找2004的。 补充一下,拒绝请求操作最好这么写。 Irp->IoStatus.Status = STATUS_ACCESS_DENIED; Irp->IoStatus.Information = 0; IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_SUCCESS;// 你原来写的是STATUS_ACCESS_DENIED [编辑 - 3/24/05 by paladinii] |
|
|
6楼#
发布于:2005-03-24 13:10
关注.
|
|
7楼#
发布于:2005-03-25 14:50
楼主,现在怎么样了??
我也准备试一试锁文件夹的操作。 |
|
8楼#
发布于:2005-03-25 19:36
楼上的这样处理文件禁用
NTSTATUS CreateDispatch(...) { // 查找禁止规则 if 找到 { Irp->IoStatus.Status = STATUS_ACCESS_DENIED; Irp->IoStatus.Information = 0; IoCompleteRequest(Irp, IO_NO_INCREMENT); return Irp->IoStatus.Status; } } 这样处理就可以实现文件访问控制。 |
|
|
9楼#
发布于:2005-03-26 21:47
楼上的意思是只要修改IRP_MJ_CREATE即可??
可是我在sfilter中的SfCreate中写如DbgPrint(). 调试发现,我进入(访问)一个文件的时候,DbgPrint中的信息没有打印出来。 另外,调试sfilter的时候,是不是每次都要使用*.inf 安装重新启动以后才能使用?? 谢谢指教! [编辑 - 3/28/05 by zhjie374] |
|
10楼#
发布于:2005-03-28 09:40
To paladinii and others:
首先非常感谢你们的帮助。这几天都不在,不好意思。 paladinii大佬提供的两个方法都没有成功: 1)return STATUS_SUCCESS; 2)return Irp->IoStatus.Status; 还是不能完成我的操作。 刚发现,原来我的代码和你的代码均是在sfCreate过程中,而其均可实现禁止创建D盘上的office目录,但如果原来有这个目录,不能完成禁止访问操作。 是不是在别的IRP处理过程中也要添加相关代码呢? 还有,非常不好意思,我的IFS是2003,不是2004,看错了,paladinii大佬,不好意思了。 |
|
|
11楼#
发布于:2005-03-28 10:57
楼上的,用FILEMON可以看到访问某文件夹是哪个IRP.
我现在也想禁止某个文件夹的访问,多交流。 |
|
12楼#
发布于:2005-03-28 20:35
在SfCreate中使用 Irp->IoStatus.Status = STATUS_ACCESS_DENIED; Irp->IoStatus.Information = 0; IoCompleteRequest(Irp, IO_NO_INCREMENT); return Irp->IoStatus.Status; 完全可以禁止这个请求,这个无庸置疑,关键是你判断if (_stricmp(fileName.Buffer, \"\\\\Device\\\\HarddiskVolume2\\\\office\") == 0) 这样处理会有问题。 |
|
|
13楼#
发布于:2005-03-30 21:28
不成,在我这儿就会有问题,不知怎么回事,郁闷
|
|
|
14楼#
发布于:2005-04-11 21:13
我也试了,在我这里也不行,可以阻止重命名和删除操作,但对于打开目录的操作不能禁止,确实比较奇怪,把IRP_MJ_CREATE都禁止了还能打开:(
我的系统是Windows2003 |
|
|
15楼#
发布于:2005-04-12 09:02
在IRP_MJ_DIRECTORY_CONTROL里面拦截
我做到了.... 但是我想禁止某个目录下所有文件为只读的,不能删除新建.却没有找到方法.. 请指教 |
|
16楼#
发布于:2005-04-12 09:40
诸位不能实现的原因都在获取文件名和规则匹配的问题上,和
Irp->IoStatus.Status = STATUS_ACCESS_DENIED; Irp->IoStatus.Information = 0; IoCompleteRequest(Irp, IO_NO_INCREMENT); 没有什么关系。禁止整个文件夹的访问比较容易,但要针对某个文件夹做只读稍微有点复杂。 |
|
|
17楼#
发布于:2005-04-12 10:06
诸位不能实现的原因都在获取文件名和规则匹配的问题上,和 匹配没有问题,我在匹配成功后用DbgPrint输出,在DbgView中可以看到,然后就执行了你说的代码,但还是可以打开文件夹。 你的系统是什么? |
|
|
18楼#
发布于:2005-04-13 11:09
呵呵,我的情况与poweruser相同
|
|
|
19楼#
发布于:2005-04-13 14:43
我的带有禁止文件夹访问的驱动跑了几年了。还是那句话仔细跟踪你的文件路径,如果驱动匹配规则没有问题就是你获取的路径不是当前访问的。有可能是之前的。如果你一心认为Irp->IoStatus.Status = STATUS_ACCESS_DENIED;
Irp->IoStatus.Information = 0; IoCompleteRequest(Irp, IO_NO_INCREMENT); 这个有问题,我的回复就到此为止了。 |
|
|
上一页
下一页