Dokan:我应该自己处理文件共享和访问权限

时间:2017-01-23 11:26:17

标签: c++ winapi filesystems driver dokan

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

一些例子:

  • 连续两次拨打CreateFile(),共享模式设为0
  • 删除已打开的文件(未设置FILE_SHARE_DELETE)。
  • 使用FILE_GENERIC_WRITE打开文件时请求FIlE_SHARE_READ访问。

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

1 个答案:

答案 0 :(得分:2)

当内核处理创建/打开文件请求时(比如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直接调用此例程