繁体   English   中英

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

[英]File System Filter Driver - Deny file creation

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

我的驱动程序过滤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);
}

这很好。

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

(如果可能,“您没有许可。”)

所以我尝试了几件事。

首先,我做了以下工作。

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_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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM