Я пытаюсь создать драйвер файловой системы с 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;
но главная задача справиться с этим — ответственность ФС — искать DeleteOnClose
в create.c
Запрос
FILE_GENERIC_WRITE
доступ, когда файл был открыт с
FIlE_SHARE_READ
эта проверка точно сделана в IoCheckShareAccess
(ищите это код в iosubs.c
) но FS
должен напрямую вызвать эту процедуру с IrpSp->Parameters.Create.ShareAccess
Других решений пока нет …