From: Eric Biggers Date: Sun, 15 Mar 2015 01:25:53 +0000 (-0500) Subject: win32_apply.c: try to clear attributes on existing directories X-Git-Tag: v1.8.1~74 X-Git-Url: https://wimlib.net/git/?p=wimlib;a=commitdiff_plain;h=d619be5a9d45567a740875ed90ef617967772c44 win32_apply.c: try to clear attributes on existing directories --- diff --git a/include/wimlib/win32_common.h b/include/wimlib/win32_common.h index 32428513..9b873550 100644 --- a/include/wimlib/win32_common.h +++ b/include/wimlib/win32_common.h @@ -25,6 +25,10 @@ extern NTSTATUS (WINAPI *func_NtCreateFile)(PHANDLE FileHandle, PVOID EaBuffer, ULONG EaLength); +#ifndef FILE_OPENED +# define FILE_OPENED 0x00000001 +#endif + extern NTSTATUS (WINAPI *func_NtOpenFile) (PHANDLE FileHandle, ACCESS_MASK DesiredAccess, POBJECT_ATTRIBUTES ObjectAttributes, diff --git a/src/win32_apply.c b/src/win32_apply.c index b66717ec..26814f68 100644 --- a/src/win32_apply.c +++ b/src/win32_apply.c @@ -1370,6 +1370,20 @@ create_directory(const struct wim_dentry *dentry, struct win32_apply_ctx *ctx) return WIMLIB_ERR_MKDIR; } + if (ctx->iosb.Information == FILE_OPENED) { + /* If we opened an existing directory, try to clear its file + * attributes. As far as I know, this only actually makes a + * difference in the case where a FILE_ATTRIBUTE_READONLY + * directory has a named data stream which needs to be + * extracted. You cannot create a named data stream of such a + * directory, even though this contradicts Microsoft's + * documentation for FILE_ATTRIBUTE_READONLY which states it is + * not honored for directories! */ + FILE_BASIC_INFORMATION basic_info = { .FileAttributes = FILE_ATTRIBUTE_NORMAL }; + (*func_NtSetInformationFile)(h, &ctx->iosb, &basic_info, + sizeof(basic_info), FileBasicInformation); + } + if (!dentry_is_root(dentry)) { ret = set_short_name(h, dentry, ctx); if (ret)