-1

我正在尝试使用 Dokan 创建文件系统驱动程序。但现在我对是否应该自己处理复杂的事情感到困惑。

一些例子:

  • CreateFile()在共享模式设置为 的情况下连续两次呼叫0
  • 删除一个打开的文件(没有FILE_SHARE_DELETE设置)。
  • FILE_GENERIC_WRITE使用 .打开文件时请求访问FIlE_SHARE_READ

在这些情况下,Windows 显然会返回错误。但我不确定它是否会由 Windows 内核自动处理,或者是我的文件系统应用程序的职责。

4

1 回答 1

2

当内核处理创建/打开文件请求(例如IoCreateFile\[Ex\])时,它只检查ShareAccess具有有效掩码的:

if (ShareAccess & ~FILE_SHARE_VALID_FLAGS) return STATUS_INVALID_PARAMETER;

并存储ShareAccessIO_STACK_LOCATION.Parameters.Create.ShareAccess然后已经 FS 驱动程序任务使用/检查它。但是通常 FS 驱动IoCheckShareAccess程序为此使用系统提供的例程(例如FatCheckShareAccess

对于删除文件 - 我们使用选项打开文件FILE_DELETE_ON_CLOSE。内核只检查在这种情况下我们DELETE请求DesiredAccess

if ((CreateOptions & FILE_DELETE_ON_CLOSE) && !(DesiredAccess & DELETE)) return STATUS_INVALID_PARAMETER;

但主要任务处理这是 FS 责任 -DeleteOnClosecreate.c

FILE_GENERIC_WRITE当文件被打开时 请求访问FIlE_SHARE_READ

此检查完全完成IoCheckShareAccess(在 中查找它的代码iosubs.c),但FS必须直接调用此例程IrpSp->Parameters.Create.ShareAccess

于 2017-01-25T10:30:16.907 回答