hasis
驱动牛犊
驱动牛犊
  • 注册日期2003-01-07
  • 最后登录2006-04-03
  • 粉丝0
  • 关注0
  • 积分57分
  • 威望12点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
阅读:5369回复: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;
}
}
大学课程加上语文吧,否则在驱网里都不会提问题:)
wywwwl
驱动大牛
驱动大牛
  • 注册日期2002-08-16
  • 最后登录2018-04-07
  • 粉丝1
  • 关注0
  • 积分-10分
  • 威望135点
  • 贡献值6点
  • 好评度76点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2005-03-22 09:05
我又精减了一下,请各位高手帮助一下啦

请问,我要实现禁止访问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;
}
}
 


这种方法倒是没有用过,不过有一种方法是filemon的方法。
就是替换ZwOpenFile和
ZwCreateFile。
琢磨悟真知
paladinii
驱动中牛
驱动中牛
  • 注册日期2003-10-28
  • 最后登录2012-03-09
  • 粉丝0
  • 关注0
  • 积分282分
  • 威望74点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-03-23 12:42
if (_stricmp(fileName.Buffer, \"\\\\Device\\\\HarddiskVolume2\\\\office\") == 0)

你的_stricmp有问题,试试 _wcsicmp( fileName.Buffer, L\"\\\\Device\\\\HarddiskVolume2\\\\office\" )
另外,不知道你用的sfilter使什么版本的?SfGetFileName函数有些Bug
Ideas for life!
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,应该从理论上没有问题,不知为什么
大学课程加上语文吧,否则在驱网里都不会提问题:)
paladinii
驱动中牛
驱动中牛
  • 注册日期2003-10-28
  • 最后登录2012-03-09
  • 粉丝0
  • 关注0
  • 积分282分
  • 威望74点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
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]
Ideas for life!
zhjie374
驱动小牛
驱动小牛
  • 注册日期2004-10-27
  • 最后登录2012-01-17
  • 粉丝2
  • 关注1
  • 积分17分
  • 威望144点
  • 贡献值1点
  • 好评度21点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-03-24 13:10
关注.
zhjie374
驱动小牛
驱动小牛
  • 注册日期2004-10-27
  • 最后登录2012-01-17
  • 粉丝2
  • 关注1
  • 积分17分
  • 威望144点
  • 贡献值1点
  • 好评度21点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-03-25 14:50
楼主,现在怎么样了??

我也准备试一试锁文件夹的操作。
paladinii
驱动中牛
驱动中牛
  • 注册日期2003-10-28
  • 最后登录2012-03-09
  • 粉丝0
  • 关注0
  • 积分282分
  • 威望74点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
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;
  }

}

这样处理就可以实现文件访问控制。



Ideas for life!
zhjie374
驱动小牛
驱动小牛
  • 注册日期2004-10-27
  • 最后登录2012-01-17
  • 粉丝2
  • 关注1
  • 积分17分
  • 威望144点
  • 贡献值1点
  • 好评度21点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2005-03-26 21:47
楼上的意思是只要修改IRP_MJ_CREATE即可??

可是我在sfilter中的SfCreate中写如DbgPrint().
调试发现,我进入(访问)一个文件的时候,DbgPrint中的信息没有打印出来。

另外,调试sfilter的时候,是不是每次都要使用*.inf 安装重新启动以后才能使用??

谢谢指教!

[编辑 -  3/28/05 by  zhjie374]
hasis
驱动牛犊
驱动牛犊
  • 注册日期2003-01-07
  • 最后登录2006-04-03
  • 粉丝0
  • 关注0
  • 积分57分
  • 威望12点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
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大佬,不好意思了。

大学课程加上语文吧,否则在驱网里都不会提问题:)
zhjie374
驱动小牛
驱动小牛
  • 注册日期2004-10-27
  • 最后登录2012-01-17
  • 粉丝2
  • 关注1
  • 积分17分
  • 威望144点
  • 贡献值1点
  • 好评度21点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2005-03-28 10:57
楼上的,用FILEMON可以看到访问某文件夹是哪个IRP.

我现在也想禁止某个文件夹的访问,多交流。
paladinii
驱动中牛
驱动中牛
  • 注册日期2003-10-28
  • 最后登录2012-03-09
  • 粉丝0
  • 关注0
  • 积分282分
  • 威望74点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
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)
这样处理会有问题。
Ideas for life!
hasis
驱动牛犊
驱动牛犊
  • 注册日期2003-01-07
  • 最后登录2006-04-03
  • 粉丝0
  • 关注0
  • 积分57分
  • 威望12点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2005-03-30 21:28
不成,在我这儿就会有问题,不知怎么回事,郁闷
大学课程加上语文吧,否则在驱网里都不会提问题:)
poweruser
驱动老牛
驱动老牛
  • 注册日期2003-02-26
  • 最后登录2008-07-18
  • 粉丝0
  • 关注0
  • 积分652分
  • 威望72点
  • 贡献值0点
  • 好评度64点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2005-04-11 21:13
我也试了,在我这里也不行,可以阻止重命名和删除操作,但对于打开目录的操作不能禁止,确实比较奇怪,把IRP_MJ_CREATE都禁止了还能打开:(

我的系统是Windows2003
老虎不发威,你当我是Hello Kitty!
zhjie374
驱动小牛
驱动小牛
  • 注册日期2004-10-27
  • 最后登录2012-01-17
  • 粉丝2
  • 关注1
  • 积分17分
  • 威望144点
  • 贡献值1点
  • 好评度21点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2005-04-12 09:02
在IRP_MJ_DIRECTORY_CONTROL里面拦截

我做到了....

但是我想禁止某个目录下所有文件为只读的,不能删除新建.却没有找到方法..

请指教
paladinii
驱动中牛
驱动中牛
  • 注册日期2003-10-28
  • 最后登录2012-03-09
  • 粉丝0
  • 关注0
  • 积分282分
  • 威望74点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2005-04-12 09:40
诸位不能实现的原因都在获取文件名和规则匹配的问题上,和
Irp->IoStatus.Status = STATUS_ACCESS_DENIED;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp, IO_NO_INCREMENT);

没有什么关系。禁止整个文件夹的访问比较容易,但要针对某个文件夹做只读稍微有点复杂。
Ideas for life!
poweruser
驱动老牛
驱动老牛
  • 注册日期2003-02-26
  • 最后登录2008-07-18
  • 粉丝0
  • 关注0
  • 积分652分
  • 威望72点
  • 贡献值0点
  • 好评度64点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2005-04-12 10:06
诸位不能实现的原因都在获取文件名和规则匹配的问题上,和
Irp->IoStatus.Status = STATUS_ACCESS_DENIED;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp, IO_NO_INCREMENT);

没有什么关系。禁止整个文件夹的访问比较容易,但要针对某个文件夹做只读稍微有点复杂。


匹配没有问题,我在匹配成功后用DbgPrint输出,在DbgView中可以看到,然后就执行了你说的代码,但还是可以打开文件夹。

你的系统是什么?
老虎不发威,你当我是Hello Kitty!
hasis
驱动牛犊
驱动牛犊
  • 注册日期2003-01-07
  • 最后登录2006-04-03
  • 粉丝0
  • 关注0
  • 积分57分
  • 威望12点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2005-04-13 11:09
呵呵,我的情况与poweruser相同
大学课程加上语文吧,否则在驱网里都不会提问题:)
paladinii
驱动中牛
驱动中牛
  • 注册日期2003-10-28
  • 最后登录2012-03-09
  • 粉丝0
  • 关注0
  • 积分282分
  • 威望74点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2005-04-13 14:43
我的带有禁止文件夹访问的驱动跑了几年了。还是那句话仔细跟踪你的文件路径,如果驱动匹配规则没有问题就是你获取的路径不是当前访问的。有可能是之前的。如果你一心认为Irp->IoStatus.Status = STATUS_ACCESS_DENIED;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp, IO_NO_INCREMENT);

这个有问题,我的回复就到此为止了。
Ideas for life!
上一页
游客

返回顶部