我创建了一个文件系统过滤器驱动
我的驱动程序过滤IRP_MJ_CREATE并打印文件名 .
NTSTATUS DispatchCreate(__in PDEVICE_OBJECT DeviceObject, __in PIRP Irp)
{
PFILE_OBJECT FileObject = IoGetCurrentIrpStackLocation(Irp)->FileObject;
DbgPrint("DispatchCreate() : %wZ\n", &FileObject->FileName;)
return DispatchPassThrough(DeviceObject, Irp);
}
这很好用 .
现在我想在每次创建新文件的请求时获得Access Denied .
(如果可能,'you do not have permission.')
所以我尝试了一些东西 .
首先,我做了以下几点 .
NTSTATUS DispatchCreate(__in PDEVICE_OBJECT DeviceObject, __in PIRP Irp)
{
PFILE_OBJECT FileObject = IoGetCurrentIrpStackLocation(Irp)->FileObject;
PIO_STACK_LOCATION Stack = IoGetCurrentIrpStackLocation(Irp);
ULONG Option = Stack->Parameters.Create.Options;
if ((Option >> 24) == FILE_CREATE)
{
DbgPrint("DispatchCreate() : File Create Denied, %wZ, %x \n", &FileObject->FileName, Option);
return STATUS_ACCESS_VIOLATION; // or any error code
}
return DispatchPassThrough(DeviceObject, Irp);
}
这很好用,但有点奇怪 .
例如,如果您没有管理员权限,当您尝试在“C:\”中创建某些内容时,您会有一点发言权 .
这时,我不知道FileObject可能会被正常删除 .
所以我做了以下更改 .
NTSTATUS DispatchCreate(__in PDEVICE_OBJECT DeviceObject, __in PIRP Irp)
{
PFILE_OBJECT FileObject = IoGetCurrentIrpStackLocation(Irp)->FileObject;
PIO_STACK_LOCATION Stack = IoGetCurrentIrpStackLocation(Irp);
ULONG Option = Stack->Parameters.Create.Options;
if ((Option >> 24) == FILE_CREATE)
{
DbgPrint("DispatchCreate() : File Create Denied, %wZ, %x \n", &FileObject->FileName, Option);
Irp->IoStatus.Status = STATUS_ACCESS_VIOLATION;
return Irp->IoStatus.Status;
}
return DispatchPassThrough(DeviceObject, Irp);
}
但是,会出现稍微不同的错误消息 .
我希望它的行为与“拒绝访问”时的行为完全相同,因为我没有正常的权限 .
还有一个问题 .
与其他Dispatch例程不同, IRP_MJ_CREATE
和 IRP_MJ_CLOSE
不需要 IoCompleteRequest()
.
我确认即使我只有以下部分,手柄也能正常返回 . (在用户模式下 . )
return STATUS_SUCCESS;
谢谢你的阅读 .
请回答我的问题 .
1 回答
如果您需要在过滤器中拒绝某些请求 - 不需要将其传递给附加设备 - 您需要自己设置错误状态并完成
IRP
当然这绝对是假的 . 必须通过调用
IofCompleteRequest
完成每个Irp