]> wimlib.net Git - wimlib/blobdiff - src/win32_apply.c
Factor out Win32 => NT path conversion and use in win32_capture.c
[wimlib] / src / win32_apply.c
index 280f7f541f46f8e3ceae71693a2711b07afec938..48d3ccb25501232b9a10f279b41b0ea2c600b5ce 100644 (file)
 #include "wimlib/xml.h"
 #include "wimlib/wimboot.h"
 
-/* TODO: Add workaround for when a stream needs to be extracted to more places
- * than this  */
-#define MAX_OPEN_HANDLES 32768
-
 struct win32_apply_ctx {
 
        /* Extract flags, the pointer to the WIMStruct, etc.  */
@@ -105,7 +101,7 @@ struct win32_apply_ctx {
 
        /* Array of open handles to filesystem streams currently being written
         */
-       HANDLE open_handles[MAX_OPEN_HANDLES];
+       HANDLE open_handles[MAX_OPEN_STREAMS];
 
        /* Number of handles in @open_handles currently open (filled in from the
         * beginning of the array)  */
@@ -514,33 +510,15 @@ current_path(struct win32_apply_ctx *ctx)
 static int
 prepare_target(struct list_head *dentry_list, struct win32_apply_ctx *ctx)
 {
+       int ret;
        NTSTATUS status;
        size_t path_max;
 
        /* Open handle to the target directory (possibly creating it).  */
 
-       if (func_RtlDosPathNameToNtPathName_U_WithStatus) {
-               status = (*func_RtlDosPathNameToNtPathName_U_WithStatus)(ctx->common.target,
-                                                                        &ctx->target_ntpath,
-                                                                        NULL, NULL);
-       } else {
-               if ((*func_RtlDosPathNameToNtPathName_U)(ctx->common.target,
-                                                        &ctx->target_ntpath,
-                                                        NULL, NULL))
-                       status = STATUS_SUCCESS;
-               else
-                       status = STATUS_NO_MEMORY;
-       }
-       if (!NT_SUCCESS(status)) {
-               if (status == STATUS_NO_MEMORY) {
-                       return WIMLIB_ERR_NOMEM;
-               } else {
-                       ERROR("\"%ls\": invalid path name "
-                             "(status=0x%08"PRIx32")",
-                             ctx->common.target, (u32)status);
-                       return WIMLIB_ERR_INVALID_PARAM;
-               }
-       }
+       ret = win32_path_to_nt_path(ctx->common.target, &ctx->target_ntpath);
+       if (ret)
+               return ret;
 
        ctx->attr.Length = sizeof(ctx->attr);
        ctx->attr.ObjectName = &ctx->target_ntpath;
@@ -1359,8 +1337,10 @@ begin_extract_stream_instance(const struct wim_lookup_table_entry *stream,
                }
        }
 
-       /* Too many open handles?  */
-       if (ctx->num_open_handles == MAX_OPEN_HANDLES) {
+       if (ctx->num_open_handles == MAX_OPEN_STREAMS) {
+               /* XXX: Fix this.  But because of the checks in
+                * extract_stream_list(), this can now only happen on a
+                * filesystem that does not support hard links.  */
                ERROR("Can't extract data: too many open files!");
                return WIMLIB_ERR_UNSUPPORTED;
        }
@@ -1476,7 +1456,7 @@ skip_nt_toplevel_component(const wchar_t *path, size_t path_nchars)
  * The path has an explicit length and is not necessarily null terminated.
  *
  * If the path just something like \??\e: then the returned pointer will point
- * just past the colon; in this case the length of the result will be 0
+ * just past the colon.  In this case the length of the result will be 0
  * characters.  */
 static const wchar_t *
 get_device_relative_path(const wchar_t *path, size_t path_nchars)