首页 文章

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

提问于
浏览
2

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

我的驱动程序过滤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_CREATEIRP_MJ_CLOSE 不需要 IoCompleteRequest() .

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

return STATUS_SUCCESS;

谢谢你的阅读 .

请回答我的问题 .

1 回答

  • 3

    如果您需要在过滤器中拒绝某些请求 - 不需要将其传递给附加设备 - 您需要自己设置错误状态并完成 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() .

    当然这绝对是假的 . 必须通过调用 IofCompleteRequest 完成每个Irp

相关问题