阅读:1802回复:13
各位大牛帮帮忙,以前的问题还没解决,现在又遇到新的问题了!
我想实现对固定文件夹下禁止删除操作,参照了以前的帖子上说的方法,即在IRP_MJ_SET_INFORMATION的处理函数里判断irpSp->Parameters.SetFile.FileInformationClass是否等于FileDispositionInformation。
于是我就在sfilter的基础上修改的,代码如下: DriverObject->MajorFunction[IRP_MJ_SET_INFORMATION] = SfSetInformation; NTSTATUS SfSetInformation ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ) { NTSTATUS status; PIO_STACK_LOCATION irpSp; PUNICODE_STRING name; GET_NAME_CONTROL nameControl; int cmpresult; wchar_t* testDirPath = L"\\Device\\HarddiskVolume1\\test"; irpSp = IoGetCurrentIrpStackLocation(Irp); name = SfGetFileName( irpSp->FileObject, Irp->IoStatus.Status, &nameControl ); cmpresult = wcsncmp( name->Buffer, testDirPath, wcslen( testDirPath ) ); if( cmpresult == 0 ) { DbgPrint("===========比较结果一致==========\n"); if(irpSp->Parameters.SetFile.FileInformationClass == FileDispositionInformation) { DbgPrint("----------------------禁止删除文件--------------------\n"); Irp->IoStatus.Status = STATUS_ACCESS_DENIED; Irp->IoStatus.Information = 0; IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_ACCESS_DENIED; } } IoSkipCurrentIrpStackLocation( Irp ); return IoCallDriver( ((PSFILTER_DEVICE_EXTENSION) DeviceObject->DeviceExtension)->AttachedToDeviceObject, Irp ); } 可是驱动加载后,系统就死机了,不知道是什么原因,恳请各位大牛帮帮忙!!! |
|
沙发#
发布于:2007-05-20 18:02
怎么都没人回帖子,是我的问题太菜了吗?
|
|
板凳#
发布于:2007-05-20 19:43
wchar_t* testDirPath = L"\\Device\\HarddiskVolume1\\test";放到外面试一下
|
|
地板#
发布于:2007-05-20 19:47
要不就是name = SfGetFileName( irpSp->FileObject, Irp->IoStatus.Status, &nameControl );
这句话惹得祸,因为你在SfGetFileName中申请了空间,可有时候这就会导致错误 |
|
地下室#
发布于:2007-05-21 10:37
引用第3楼zqq_tt于2007-05-20 19:47发表的 : 那这种情况下怎么获取文件名呢? 谢谢!!! |
|
5楼#
发布于:2007-05-21 12:25
wcsncmp( name->Buffer, testDirPath, wcslen( testDirPath ) );
这里的name->Buffer应该不是NULL结尾的c字符串吧,所以这里比较有问题,改成下面的试试 wcsncmp( name->Buffer, testDirPath, min(name->Length >> 2, wcslen( testDirPath )) ); |
|
6楼#
发布于:2007-05-21 14:21
引用第5楼tooflat于2007-05-21 12:25发表的 : 这就去试试! |
|
7楼#
发布于:2007-05-21 15:44
tooflat老大,我试了一下,先是编译出错“signed/unsigned不匹配”,后来我强制转换了类型如下:wcsncmp( name->Buffer, testDirPath, min((unsigned)name->Length >> 2, wcslen( testDirPath )) );
编译没问题了,可是还是死机,我快要崩溃了!!! |
|
8楼#
发布于:2007-05-21 16:41
在sfcreate中试试
|
|
9楼#
发布于:2007-05-21 17:23
引用第8楼jhust于2007-05-21 16:41发表的 : 如果在fcreate函数中进行处理,有什么好的判断文件删除操作的方法吗? 我以前也在sfcreate函数中试过,判断的条件是irpSp->Parameters.Create.SecurityContext->DesiredAccess & DELETE,可是这样做虽然能够禁止删除,但是以后再打开该文件时,系统提示“该文件已经被其他的程序访问,进程无法该文件”,这个问题没法解决! 你有什么好的方法? |
|
10楼#
发布于:2007-05-22 08:32
1. 拦截文件删除操作在 IRP_MJ_SET_INFORMATION 例程中判断是正确的;
2. 文件删除有两种情况: a。文件进回收站 --- FileRenameInformation b。文件彻底删除 --- FileDispositionInformation 3. 已经重复了N次了,获取文件名的操作尽量在IRP_MJ_CREATE例程中, 后面只是查找、跟踪而已! 这可以说是一条文件过滤驱动的设计原则; |
|
|
11楼#
发布于:2007-05-22 08:41
|
|
|
12楼#
发布于:2007-05-22 12:25
除了devia说的,另外测试方式似乎也许有些问题。这么几句话,采用逐渐加代码或着二分法测试应该很快就能确定出问题所在。 问题找到了,再提问题也许更好。
|
|
|
13楼#
发布于:2007-05-22 15:19
谢谢各位大侠的建议!
|
|