supported_features->timestamps = 1;
- /* Note: Windows does not support case sensitive filenames! At least
- * not without changing the registry and rebooting... */
+ if (vol_flags & FILE_CASE_SENSITIVE_SEARCH) {
+ /*
+ * The filesystem supports case-sensitive filenames. But does
+ * the operating system as well? This normally requires the
+ * registry setting ObCaseInsensitive=0. We can test it
+ * indirectly by attempting to open the "\SystemRoot" symbolic
+ * link using a name with the wrong case. If we get
+ * STATUS_OBJECT_NAME_NOT_FOUND instead of STATUS_ACCESS_DENIED,
+ * then case-sensitive names must be enabled.
+ */
+ UNICODE_STRING path;
+ OBJECT_ATTRIBUTES attr;
+ HANDLE h;
+ NTSTATUS status;
+
+ RtlInitUnicodeString(&path, L"\\systemroot");
+ InitializeObjectAttributes(&attr, &path, 0, NULL, NULL);
+
+ status = NtOpenSymbolicLinkObject(&h, 0, &attr);
+ if (status == STATUS_OBJECT_NAME_NOT_FOUND)
+ supported_features->case_sensitive_filenames = 1;
+ }
return 0;
}
int ret;
/* DELETE is needed for set_short_name(); GENERIC_READ and GENERIC_WRITE
- * are needed for adjust_compression_attribute(); WRITE_DAC is needed to
- * remove the directory's DACL if the directory already existed */
- perms = GENERIC_READ | GENERIC_WRITE | WRITE_DAC;
+ * are needed for adjust_compression_attribute(). */
+ perms = GENERIC_READ | GENERIC_WRITE;
if (!dentry_is_root(dentry))
perms |= DELETE;
/* FILE_ATTRIBUTE_SYSTEM is needed to ensure that
* FILE_ATTRIBUTE_ENCRYPTED doesn't get set before we want it to be. */
-retry:
status = create_file(&h, perms, NULL, FILE_ATTRIBUTE_SYSTEM,
FILE_OPEN_IF, FILE_DIRECTORY_FILE, dentry, ctx);
if (unlikely(!NT_SUCCESS(status))) {
- if (status == STATUS_ACCESS_DENIED) {
- if (perms & WRITE_DAC) {
- perms &= ~WRITE_DAC;
- goto retry;
- }
- if (perms & DELETE) {
- perms &= ~DELETE;
- goto retry;
- }
- }
const wchar_t *path = current_path(ctx);
winnt_error(status, L"Can't create directory \"%ls\"", path);