文件系统筛选器驱动程序 - 拒绝创建文件



我创建了一个文件系统筛选器驱动程序。

我的驱动程序筛选IRP_MJ_CREATE并打印文件名。

NTSTATUS DispatchCreate(__in PDEVICE_OBJECT DeviceObject, __in PIRP Irp)
{
PFILE_OBJECT FileObject = IoGetCurrentIrpStackLocation(Irp)->FileObject;
DbgPrint("DispatchCreate() : %wZn", &FileObject->FileName;)
return DispatchPassThrough(DeviceObject, Irp);
}

这工作正常。

现在,我想在每个创建新文件的请求上都被拒绝访问。

(如果可能,"您没有权限"。

所以我尝试了一些事情。

首先,我做了以下工作。

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:\"中创建某些内容时,您有一点发言权。

目前,我不知道文件对象可能会被正常删除。

所以我做了以下更改。

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);
}

但是,出现略有不同的错误消息。

我希望它的行为与发生"拒绝访问"时完全相同,因为我没有正常权限。



还有一个问题。

与其他调度例程不同,IRP_MJ_CREATEIRP_MJ_CLOSE不需要IoCompleteRequest()

我确认即使我只有以下部分,手柄也正常返回。 (在用户模式下。

return STATUS_SUCCESS;



感谢您的阅读。

请回答我的问题。

如果您需要在过滤器中拒绝某些请求 - 不需要将其传递给连接的设备 - 您需要自己设置错误状态并完成IRP

Irp->IoStatus.Status = STATUS_ACCESS_DENIED;
IofCompleteRequest(Irp);// !!!
return STATUS_ACCESS_DENIED; // ! not Irp->IoStatus.Status - you can not access Irp after call IofCompleteRequest

与其他调度例程不同,IRP_MJ_CREATE 和 IRP_MJ_CLOSE 不会 需要 IoCompleteRequest()。

当然,这绝对是错误的。 每个 Irp 都必须通过调用完成IofCompleteRequest

相关内容

  • 没有找到相关文章

最新更新