]> 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 842d588e93d8f2dabc2205cac91d9f417ef97a37..48d3ccb25501232b9a10f279b41b0ea2c600b5ce 100644 (file)
 #include "wimlib/xml.h"
 #include "wimlib/wimboot.h"
 
 #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.  */
 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
         */
 
        /* 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)  */
 
        /* 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)
 {
 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).  */
 
        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;
 
        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;
        }
                ERROR("Can't extract data: too many open files!");
                return WIMLIB_ERR_UNSUPPORTED;
        }