hasis
驱动牛犊
驱动牛犊
  • 注册日期2003-01-07
  • 最后登录2006-04-03
  • 粉丝0
  • 关注0
  • 积分57分
  • 威望12点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
阅读:5376回复:25

如何禁止访问某一文件夹

楼主#
更多 发布于:2005-03-21 21:31
请问,我要实现禁止访问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;
    }
}

最新喜欢:

rhpengrhpeng
大学课程加上语文吧,否则在驱网里都不会提问题:)
hasis
驱动牛犊
驱动牛犊
  • 注册日期2003-01-07
  • 最后登录2006-04-03
  • 粉丝0
  • 关注0
  • 积分57分
  • 威望12点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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;
}
}
大学课程加上语文吧,否则在驱网里都不会提问题:)
hasis
驱动牛犊
驱动牛犊
  • 注册日期2003-01-07
  • 最后登录2006-04-03
  • 粉丝0
  • 关注0
  • 积分57分
  • 威望12点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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,应该从理论上没有问题,不知为什么
大学课程加上语文吧,否则在驱网里都不会提问题:)
hasis
驱动牛犊
驱动牛犊
  • 注册日期2003-01-07
  • 最后登录2006-04-03
  • 粉丝0
  • 关注0
  • 积分57分
  • 威望12点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
地板#
发布于: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大佬,不好意思了。

大学课程加上语文吧,否则在驱网里都不会提问题:)
hasis
驱动牛犊
驱动牛犊
  • 注册日期2003-01-07
  • 最后登录2006-04-03
  • 粉丝0
  • 关注0
  • 积分57分
  • 威望12点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-03-30 21:28
不成,在我这儿就会有问题,不知怎么回事,郁闷
大学课程加上语文吧,否则在驱网里都不会提问题:)
hasis
驱动牛犊
驱动牛犊
  • 注册日期2003-01-07
  • 最后登录2006-04-03
  • 粉丝0
  • 关注0
  • 积分57分
  • 威望12点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-04-13 11:09
呵呵,我的情况与poweruser相同
大学课程加上语文吧,否则在驱网里都不会提问题:)
游客

返回顶部