Dokan:我应该自己处理文件共享和访问权限吗
Dokan: Should I handle file sharing and access rights myself
我正在尝试使用 Dokan 创建文件系统驱动程序。但现在我对是否应该自己处理复杂的事情感到困惑。
一些示例:
- 连续两次调用
CreateFile()
,共享模式设置为 0
。
- 删除打开的文件(未设置
FILE_SHARE_DELETE
)。
- 在使用
FIlE_SHARE_READ
打开文件后请求 FILE_GENERIC_WRITE
访问权限。
在这些条件下,Windows显然会return出错。但我不确定它会由 Windows 内核自动处理,还是我的文件系统应用程序的职责。
当内核处理 create/open 文件请求时(例如 IoCreateFile\[Ex\]
),它只检查 ShareAccess
是否具有有效掩码:
if (ShareAccess & ~FILE_SHARE_VALID_FLAGS) return STATUS_INVALID_PARAMETER;
并将 ShareAccess
存储在 IO_STACK_LOCATION.Parameters.Create.ShareAccess
中,然后 FS 驱动程序任务 use/check 它。但是通常 FS 驱动程序使用系统提供的 IoCheckShareAccess
routine for this (look for example FatCheckShareAccess
)
对于删除文件 - 我们使用选项 FILE_DELETE_ON_CLOSE
打开文件。内核只检查在这种情况下我们在 DesiredAccess
中请求 DELETE
if ((CreateOptions & FILE_DELETE_ON_CLOSE) && !(DesiredAccess & DELETE)) return STATUS_INVALID_PARAMETER;
但主要任务处理这是 FS 的责任 - 搜索 DeleteOnClose
in create.c
Request FILE_GENERIC_WRITE
access when the file has been opened with
FIlE_SHARE_READ
此检查完全在 IoCheckShareAccess
(look for it code in iosubs.c
中完成)但 FS
必须直接使用 IrpSp->Parameters.Create.ShareAccess
调用此例程
我正在尝试使用 Dokan 创建文件系统驱动程序。但现在我对是否应该自己处理复杂的事情感到困惑。
一些示例:
- 连续两次调用
CreateFile()
,共享模式设置为0
。 - 删除打开的文件(未设置
FILE_SHARE_DELETE
)。 - 在使用
FIlE_SHARE_READ
打开文件后请求FILE_GENERIC_WRITE
访问权限。
在这些条件下,Windows显然会return出错。但我不确定它会由 Windows 内核自动处理,还是我的文件系统应用程序的职责。
当内核处理 create/open 文件请求时(例如 IoCreateFile\[Ex\]
),它只检查 ShareAccess
是否具有有效掩码:
if (ShareAccess & ~FILE_SHARE_VALID_FLAGS) return STATUS_INVALID_PARAMETER;
并将 ShareAccess
存储在 IO_STACK_LOCATION.Parameters.Create.ShareAccess
中,然后 FS 驱动程序任务 use/check 它。但是通常 FS 驱动程序使用系统提供的 IoCheckShareAccess
routine for this (look for example FatCheckShareAccess
)
对于删除文件 - 我们使用选项 FILE_DELETE_ON_CLOSE
打开文件。内核只检查在这种情况下我们在 DesiredAccess
DELETE
if ((CreateOptions & FILE_DELETE_ON_CLOSE) && !(DesiredAccess & DELETE)) return STATUS_INVALID_PARAMETER;
但主要任务处理这是 FS 的责任 - 搜索 DeleteOnClose
in create.c
Request
FILE_GENERIC_WRITE
access when the file has been opened withFIlE_SHARE_READ
此检查完全在 IoCheckShareAccess
(look for it code in iosubs.c
中完成)但 FS
必须直接使用 IrpSp->Parameters.Create.ShareAccess