阅读:1538回复:15
各位大牛请看看到底是什么原因???
我想实现对一个具体文件的只读处理,看了坛子里以前的帖子,先是在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; } 可是驱动一加载,系统马上蓝屏,我仔细看了好几遍代码,应该是没问题的,我实在是想不出解决的方法了,请各位大牛帮忙看看上述的两种实现文件只读控制的方法有什么问题,或者还有更好的方法,请不吝赐教! 多谢!!! |
|
沙发#
发布于:2007-05-15 09:41
没有人回帖子,继续郁闷中!!!
|
|
板凳#
发布于:2007-05-15 09:54
用户被禁言,该主题自动屏蔽! |
|
地板#
发布于:2007-05-15 10:02
Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
|
|
地下室#
发布于:2007-05-15 11:14
引用第2楼tracera于2007-05-15 09:54发表的 : 我在return Irp->IoStatus.Status后就没有再对IRP进行处理! 不知道你说的“完成后不能再碰IRP”是什么意思?能说得具体点吗? 谢谢!!! |
|
5楼#
发布于:2007-05-15 11:17
引用第3楼yaolixing于2007-05-15 10:02发表的 : 我把Irp->IoStatus.Status = STATUS_ACCESS_DENIED改成了Irp->IoStatus.Status = STATUS_NOT_SUPPORTED,可是一样会出现系统蓝屏的现象,不知道你是这么改的吗? 多谢!!! |
|
6楼#
发布于:2007-05-15 11:31
引用第4楼test001于2007-05-15 11:14发表的 : 晕,应该IoCompleteRequest( Irp, IO_NO_INCREMENT ); 后面不要使用Irp了。说得是不要使用return Irp->IoStatus.Status方式返回数据。 |
|
|
7楼#
发布于:2007-05-15 12:40
引用第6楼cyliu于2007-05-15 11:31发表的 : 见笑,见笑了,因为是初学,实在有很多问题不懂,还望各位大牛多多见谅! 再次表示感谢!!! 但是我有一个疑问,如果不使用return Irp->IoStatus.Status方式返回数据,那应该用什么方式呢? 应该不会是直接返回STATUS_SUCCESS吧? |
|
8楼#
发布于:2007-05-15 13:06
Irp->XXX
这里不是访问了Irp了吗,说了不要再访问Irp了 |
|
9楼#
发布于:2007-05-15 14:02
用户被禁言,该主题自动屏蔽! |
|
10楼#
发布于:2007-05-16 13:08
1. 在Read、Write例程中尽量不要尝试获取文件名,建议在Create中获取;
2. 对文件的只读控制,如下方法是经过千锤百炼的,请不要怀疑: IrpSp->Parameters.Create.FileAttributes |= FILE_ATTRIBUTE_READONLY; 唯一要注意的是,上面的代码要在Create下发FSD之前来设置。 |
|
|
11楼#
发布于:2007-05-18 16:13
引用第9楼tracera于2007-05-15 14:02发表的 : 参照toolflat大牛的代码,我已经实现了对特定文件的禁止删除操作,可是经过测试又有新的问题了,对具体的文件如果进行删除操作,系统会提示文件无法删除,但是以后对该文件的任何操作,系统都会谈出一个提示框“该文件正在被其他进程使用,请关闭该文件”,不知道这是什么原因? 恳请各位大牛救救小弟吧! |
|
驱动小牛
![]() |
12楼#
发布于:2007-05-18 16:30
[quote]引用第10楼devia于2007-05-16 13:08发表的 :
1. 在Read、Write例程中尽量不要尝试获取文件名,建议在Create中获取; quote] 通过FileObject,还是可以的. |
|
13楼#
发布于:2007-05-20 18:14
引用第10楼devia于2007-05-16 13:08发表的 : 如果我想禁止删除特定文件的操作,应该是在SET_INFORMATION的处理函数中做的,而且肯定要获取当前请求的文件名与特定文件进行比较,那么在SET_INFORMATION的处理函数中获取文件名可以吗? |
|
14楼#
发布于:2007-05-22 17:39
引用第10楼devia于2007-05-16 13:08发表的 : 真理啊 ![]() ![]() ![]() |
|
15楼#
发布于:2007-05-23 10:00
ntStatus = Irp->IoStatus.Status; IoCompleteRequest(Irp, IO_NO_INCREMENT); // 我们不会有未决的操作,所以总是返回状态码return ntStatus;
或许是这样,我也不太明白 |
|