test001
驱动小牛
驱动小牛
  • 注册日期2006-11-12
  • 最后登录2008-11-07
  • 粉丝0
  • 关注0
  • 积分990分
  • 威望170点
  • 贡献值0点
  • 好评度169点
  • 原创分0分
  • 专家分0分
阅读:1539回复:15

各位大牛请看看到底是什么原因???

楼主#
更多 发布于:2007-05-14 17:52
  我想实现对一个具体文件的只读处理,看了坛子里以前的帖子,先是在IRP_MJ_CREAT的处理函数中设置文件的属性为只读的方法,代码如下:
 irpSp = IoGetCurrentIrpStackLocation( Irp );
  irpSp->Parameters.Create.FileAttributes = FILE_ATTRIBUTE_READONLY;
可是驱动加载后并没有实现对文件的只读控制。

然后我又采用拦截IRP_MJ_WRITE的方法,IRP_MJ_WRITE处理函数的相关代码如下:
irpSp = IoGetCurrentIrpStackLocation(Irp);
name = SfGetFileName(irpSp->FileObject,Irp->IoStatus.Status,&nameControl );
  
if(cmpresult = wcsncmp(name->Buffer,testfilePath,wcslen(testfilePath))==0)
{
    SfGetFileNameCleanup( &nameControl );
    Irp->IoStatus.Status = STATUS_ACCESS_DENIED;
    Irp->IoStatus.Information = 0;
    IoCompleteRequest( Irp, IO_NO_INCREMENT );
    return Irp->IoStatus.Status;
}

可是驱动一加载,系统马上蓝屏,我仔细看了好几遍代码,应该是没问题的,我实在是想不出解决的方法了,请各位大牛帮忙看看上述的两种实现文件只读控制的方法有什么问题,或者还有更好的方法,请不吝赐教!
多谢!!!
test001
驱动小牛
驱动小牛
  • 注册日期2006-11-12
  • 最后登录2008-11-07
  • 粉丝0
  • 关注0
  • 积分990分
  • 威望170点
  • 贡献值0点
  • 好评度169点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-05-15 09:41
没有人回帖子,继续郁闷中!!!
tracera
禁止发言
禁止发言
  • 注册日期2006-01-09
  • 最后登录2018-09-25
  • 粉丝8
  • 关注0
  • 积分-5788分
  • 威望135321点
  • 贡献值0点
  • 好评度625点
  • 原创分1分
  • 专家分0分
  • 社区居民
板凳#
发布于:2007-05-15 09:54
用户被禁言,该主题自动屏蔽!
yaolixing
驱动小牛
驱动小牛
  • 注册日期2006-06-27
  • 最后登录2010-07-15
  • 粉丝1
  • 关注0
  • 积分991分
  • 威望135点
  • 贡献值0点
  • 好评度124点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-05-15 10:02
  Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
test001
驱动小牛
驱动小牛
  • 注册日期2006-11-12
  • 最后登录2008-11-07
  • 粉丝0
  • 关注0
  • 积分990分
  • 威望170点
  • 贡献值0点
  • 好评度169点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-05-15 11:14
引用第2楼tracera于2007-05-15 09:54发表的  :
IoCompleteRequest( Irp, IO_NO_INCREMENT );
    return Irp->IoStatus.Status;
}
完成后不能在碰irp了.


我在return Irp->IoStatus.Status后就没有再对IRP进行处理!
不知道你说的“完成后不能再碰IRP”是什么意思?能说得具体点吗?
谢谢!!!
test001
驱动小牛
驱动小牛
  • 注册日期2006-11-12
  • 最后登录2008-11-07
  • 粉丝0
  • 关注0
  • 积分990分
  • 威望170点
  • 贡献值0点
  • 好评度169点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-05-15 11:17
引用第3楼yaolixing于2007-05-15 10:02发表的  :
  Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;


我把Irp->IoStatus.Status = STATUS_ACCESS_DENIED改成了Irp->IoStatus.Status = STATUS_NOT_SUPPORTED,可是一样会出现系统蓝屏的现象,不知道你是这么改的吗?
多谢!!!
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
6楼#
发布于:2007-05-15 11:31
引用第4楼test001于2007-05-15 11:14发表的  :


我在return Irp->IoStatus.Status后就没有再对IRP进行处理!
不知道你说的“完成后不能再碰IRP”是什么意思?能说得具体点吗?
谢谢!!!


晕,应该IoCompleteRequest( Irp, IO_NO_INCREMENT ); 后面不要使用Irp了。说得是不要使用return Irp->IoStatus.Status方式返回数据。
走走看看开源好 Solaris vs Linux
test001
驱动小牛
驱动小牛
  • 注册日期2006-11-12
  • 最后登录2008-11-07
  • 粉丝0
  • 关注0
  • 积分990分
  • 威望170点
  • 贡献值0点
  • 好评度169点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-05-15 12:40
引用第6楼cyliu于2007-05-15 11:31发表的  :


晕,应该IoCompleteRequest( Irp, IO_NO_INCREMENT ); 后面不要使用Irp了。说得是不要使用return Irp->IoStatus.Status方式返回数据。


见笑,见笑了,因为是初学,实在有很多问题不懂,还望各位大牛多多见谅!
再次表示感谢!!!

但是我有一个疑问,如果不使用return Irp->IoStatus.Status方式返回数据,那应该用什么方式呢?
应该不会是直接返回STATUS_SUCCESS吧?
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-05-15 13:06
Irp->XXX
这里不是访问了Irp了吗,说了不要再访问Irp了
tracera
禁止发言
禁止发言
  • 注册日期2006-01-09
  • 最后登录2018-09-25
  • 粉丝8
  • 关注0
  • 积分-5788分
  • 威望135321点
  • 贡献值0点
  • 好评度625点
  • 原创分1分
  • 专家分0分
  • 社区居民
9楼#
发布于:2007-05-15 14:02
用户被禁言,该主题自动屏蔽!
devia
论坛版主
论坛版主
  • 注册日期2005-05-14
  • 最后登录2016-04-05
  • 粉丝3
  • 关注0
  • 积分1029分
  • 威望712点
  • 贡献值1点
  • 好评度555点
  • 原创分8分
  • 专家分4分
10楼#
发布于:2007-05-16 13:08
1. 在Read、Write例程中尽量不要尝试获取文件名,建议在Create中获取;
2. 对文件的只读控制,如下方法是经过千锤百炼的,请不要怀疑:
    IrpSp->Parameters.Create.FileAttributes |= FILE_ATTRIBUTE_READONLY;

唯一要注意的是,上面的代码要在Create下发FSD之前来设置。
人总在矛盾中徘徊。。。
test001
驱动小牛
驱动小牛
  • 注册日期2006-11-12
  • 最后登录2008-11-07
  • 粉丝0
  • 关注0
  • 积分990分
  • 威望170点
  • 贡献值0点
  • 好评度169点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2007-05-18 16:13
引用第9楼tracera于2007-05-15 14:02发表的  :
if(irpSp->Parameters.Create.SecurityContext->DesiredAccess & DELETE)
{
    DbgPrint("============DELETE==========n");
    //这样表示文件删除?是不是我只要把DELETE标志去掉就可以禁止删除了?
    Irp->IoStatus.Status = STATUS_ACCESS_DENIED;
.......


参照toolflat大牛的代码,我已经实现了对特定文件的禁止删除操作,可是经过测试又有新的问题了,对具体的文件如果进行删除操作,系统会提示文件无法删除,但是以后对该文件的任何操作,系统都会谈出一个提示框“该文件正在被其他进程使用,请关闭该文件”,不知道这是什么原因?
恳请各位大牛救救小弟吧!
yandong_8212
驱动小牛
驱动小牛
  • 注册日期2006-07-28
  • 最后登录2011-02-11
  • 粉丝0
  • 关注0
  • 积分1046分
  • 威望464点
  • 贡献值1点
  • 好评度173点
  • 原创分0分
  • 专家分1分
12楼#
发布于:2007-05-18 16:30
[quote]引用第10楼devia于2007-05-16 13:08发表的  :
1. 在Read、Write例程中尽量不要尝试获取文件名,建议在Create中获取;
quote]

通过FileObject,还是可以的.
商务MSN:YanDong_8212@163.com
test001
驱动小牛
驱动小牛
  • 注册日期2006-11-12
  • 最后登录2008-11-07
  • 粉丝0
  • 关注0
  • 积分990分
  • 威望170点
  • 贡献值0点
  • 好评度169点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2007-05-20 18:14
引用第10楼devia于2007-05-16 13:08发表的  :
1. 在Read、Write例程中尽量不要尝试获取文件名,建议在Create中获取;
2. 对文件的只读控制,如下方法是经过千锤百炼的,请不要怀疑:
    IrpSp->Parameters.Create.FileAttributes |= FILE_ATTRIBUTE_READONLY;

唯一要注意的是,上面的代码要在Create下发FSD之前来设置。


如果我想禁止删除特定文件的操作,应该是在SET_INFORMATION的处理函数中做的,而且肯定要获取当前请求的文件名与特定文件进行比较,那么在SET_INFORMATION的处理函数中获取文件名可以吗?
qiweixue
驱动小牛
驱动小牛
  • 注册日期2004-07-21
  • 最后登录2011-12-19
  • 粉丝0
  • 关注0
  • 积分1006分
  • 威望274点
  • 贡献值0点
  • 好评度268点
  • 原创分1分
  • 专家分0分
14楼#
发布于:2007-05-22 17:39
引用第10楼devia于2007-05-16 13:08发表的  :
1. 在Read、Write例程中尽量不要尝试获取文件名,建议在Create中获取;
2. 对文件的只读控制,如下方法是经过千锤百炼的,请不要怀疑:
    IrpSp->Parameters.Create.FileAttributes |= FILE_ATTRIBUTE_READONLY;

唯一要注意的是,上面的代码要在Create下发FSD之前来设置。


真理啊
baisix
驱动牛犊
驱动牛犊
  • 注册日期2007-01-19
  • 最后登录2019-03-04
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望114点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
  • 社区居民
15楼#
发布于:2007-05-23 10:00
ntStatus = Irp->IoStatus.Status; IoCompleteRequest(Irp, IO_NO_INCREMENT); // 我们不会有未决的操作,所以总是返回状态码return ntStatus;

或许是这样,我也不太明白
游客

返回顶部