我正在尝试使用Dokan创建文件系统驱动程序。但是现在我对自己是否应该处理复杂的东西感到困惑。
一些例子:
CreateFile()
,共享模式设为0
。FILE_SHARE_DELETE
)。FILE_GENERIC_WRITE
打开文件时请求FIlE_SHARE_READ
访问。在这些情况下,Windows显然会返回错误。但我不确定它是由Windows内核自动处理还是我的文件系统应用程序的职责。
答案 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
直接调用此例程