阅读:5376回复: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-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,应该从理论上没有问题,不知为什么 |
|
|
地板#
发布于: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大佬,不好意思了。 |
|
|
地下室#
发布于:2005-03-30 21:28
不成,在我这儿就会有问题,不知怎么回事,郁闷
|
|
|
5楼#
发布于:2005-04-13 11:09
呵呵,我的情况与poweruser相同
|
|
|