文件系统筛选器驱动程序 - 拒绝创建文件
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);
}
这很好用。
现在我想在每次创建新文件的请求时都拒绝访问。
(如果可能,'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);
}
但是,会出现一条略有不同的错误消息。
我希望它的行为与发生 "Access Denied" 时完全相同,因为我没有正常权限。
还有一个问题。
与其他 Dispatch 例程不同,IRP_MJ_CREATE
和 IRP_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
Unlike other Dispatch routines, IRP_MJ_CREATE and IRP_MJ_CLOSE do not
need IoCompleteRequest().
当然这是绝对错误的。每个 Irp 必须通过调用 IofCompleteRequest
完成
我创建了一个文件系统过滤驱动程序。
我的驱动程序过滤 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);
}
这很好用。
现在我想在每次创建新文件的请求时都拒绝访问。
(如果可能,'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);
}
但是,会出现一条略有不同的错误消息。
我希望它的行为与发生 "Access Denied" 时完全相同,因为我没有正常权限。
还有一个问题。
与其他 Dispatch 例程不同,IRP_MJ_CREATE
和 IRP_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
Unlike other Dispatch routines, IRP_MJ_CREATE and IRP_MJ_CLOSE do not need IoCompleteRequest().
当然这是绝对错误的。每个 Irp 必须通过调用 IofCompleteRequest