我正在尝试使用 Dokan 创建文件系统驱动程序。但现在我对是否应该自己处理复杂的事情感到困惑。
一些例子:
CreateFile()
在共享模式设置为 的情况下连续两次呼叫0
。- 删除一个打开的文件(没有
FILE_SHARE_DELETE
设置)。 FILE_GENERIC_WRITE
使用 .打开文件时请求访问FIlE_SHARE_READ
。
在这些情况下,Windows 显然会返回错误。但我不确定它是否会由 Windows 内核自动处理,或者是我的文件系统应用程序的职责。
我正在尝试使用 Dokan 创建文件系统驱动程序。但现在我对是否应该自己处理复杂的事情感到困惑。
一些例子:
CreateFile()
在共享模式设置为 的情况下连续两次呼叫0
。FILE_SHARE_DELETE
设置)。FILE_GENERIC_WRITE
使用 .打开文件时请求访问FIlE_SHARE_READ
。在这些情况下,Windows 显然会返回错误。但我不确定它是否会由 Windows 内核自动处理,或者是我的文件系统应用程序的职责。
当内核处理创建/打开文件请求(例如IoCreateFile\[Ex\]
)时,它只检查ShareAccess
具有有效掩码的:
if (ShareAccess & ~FILE_SHARE_VALID_FLAGS) return STATUS_INVALID_PARAMETER;
并存储ShareAccess
在IO_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 责任 -DeleteOnClose
在create.c
FILE_GENERIC_WRITE
当文件被打开时 请求访问FIlE_SHARE_READ
此检查完全完成IoCheckShareAccess
(在 中查找它的代码iosubs.c
),但FS
必须直接调用此例程IrpSp->Parameters.Create.ShareAccess