X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Fntfs-3g_capture.c;h=ca8d1b2ffe4a335002569c0a6de780a52d13e9f2;hb=88afc46984c143cbf928a3186f8cc93d819e9269;hp=717936c8eedd7471ec810cf30e9deff37d99ff11;hpb=e5e237ebe2d8a61c6721ab0ffd360c10eeb5d01d;p=wimlib diff --git a/src/ntfs-3g_capture.c b/src/ntfs-3g_capture.c index 717936c8..ca8d1b2f 100644 --- a/src/ntfs-3g_capture.c +++ b/src/ntfs-3g_capture.c @@ -65,6 +65,7 @@ struct ntfs_volume_wrapper { ntfs_volume *vol; size_t refcnt; + bool dedup_warned; }; /* Description of where data is located in an NTFS volume */ @@ -116,7 +117,7 @@ open_ntfs_attr(ntfs_inode *ni, const struct ntfs_location *loc) int read_ntfs_attribute_prefix(const struct blob_descriptor *blob, u64 size, - const struct read_blob_callbacks *cbs) + const struct consume_chunk_callback *cb) { const struct ntfs_location *loc = blob->ntfs_loc; ntfs_volume *vol = loc->volume->vol; @@ -153,7 +154,7 @@ read_ntfs_attribute_prefix(const struct blob_descriptor *blob, u64 size, } pos += to_read; bytes_remaining -= to_read; - ret = call_consume_chunk(buf, to_read, cbs); + ret = consume_chunk(cb, buf, to_read); if (ret) goto out_close_ntfs_attr; } @@ -231,6 +232,27 @@ read_reparse_header(ntfs_inode *ni, struct wim_inode *inode) return 0; } + +static void +warn_special_reparse_points(const struct wim_inode *inode, + const struct scan_params *params, + struct ntfs_volume_wrapper *volume) +{ + if (inode->i_reparse_tag == WIM_IO_REPARSE_TAG_DEDUP && + (params->add_flags & WIMLIB_ADD_FLAG_WINCONFIG) && + !volume->dedup_warned) + { + WARNING( + "Filesystem includes files deduplicated with Windows'\n" +" Data Deduplication feature, which to properly restore\n" +" would require that the chunk store in \"System Volume Information\"\n" +" be included in the WIM image. By default \"System Volume Information\"\n" +" is excluded, so you may want to use a custom capture configuration\n" +" file which includes it."); + volume->dedup_warned = true; + } +} + static int attr_type_to_wimlib_stream_type(ATTR_TYPES type) { @@ -793,6 +815,8 @@ ntfs_3g_build_dentry_tree_recursive(struct wim_dentry **root_ret, volume, AT_REPARSE_POINT); if (ret) goto out; + + warn_special_reparse_points(inode, params, volume); } /* Load the object ID. */ @@ -863,7 +887,7 @@ ntfs_3g_build_dentry_tree(struct wim_dentry **root_ret, char *path; int ret; - volume = MALLOC(sizeof(struct ntfs_volume_wrapper)); + volume = CALLOC(1, sizeof(struct ntfs_volume_wrapper)); if (!volume) return WIMLIB_ERR_NOMEM; @@ -878,7 +902,16 @@ ntfs_3g_build_dentry_tree(struct wim_dentry **root_ret, volume->vol = vol; volume->refcnt = 1; - ntfs_open_secure(vol); + /* Currently, libntfs-3g users that need to read security descriptors + * are required to call ntfs_open_secure() to open the volume's security + * descriptor index, "$Secure". This is only required to work on NTFS + * v3.0+, as older versions did not have a security descriptor index. */ + if (ntfs_open_secure(vol) && vol->major_ver >= 3) { + ERROR_WITH_ERRNO("Unable to open security descriptor index of " + "NTFS volume \"%s\"", device); + ret = WIMLIB_ERR_NTFS_3G; + goto out_put_ntfs_volume; + } /* We don't want to capture the special NTFS files such as $Bitmap. Not * to be confused with "hidden" or "system" files which are real files @@ -890,7 +923,7 @@ ntfs_3g_build_dentry_tree(struct wim_dentry **root_ret, path = MALLOC(32768); if (!path) { ret = WIMLIB_ERR_NOMEM; - goto out_put_ntfs_volume; + goto out_close_secure; } path[0] = '/'; @@ -899,10 +932,17 @@ ntfs_3g_build_dentry_tree(struct wim_dentry **root_ret, FILE_NAME_POSIX, volume, params); FREE(path); +out_close_secure: + /* Undo the effects of ntfs_open_secure(). This is not yet done + * automatically by ntfs_umount(). But NULL out the inode to + * potentially be robust against future versions doing so. */ + if (vol->secure_ni) { + ntfs_index_ctx_put(vol->secure_xsii); + ntfs_index_ctx_put(vol->secure_xsdh); + ntfs_inode_close(vol->secure_ni); + vol->secure_ni = NULL; + } out_put_ntfs_volume: - ntfs_index_ctx_put(vol->secure_xsii); - ntfs_index_ctx_put(vol->secure_xsdh); - ntfs_inode_close(vol->secure_ni); put_ntfs_volume(volume); return ret; }