+static int
+register_wim_with_wof(WIMStruct *wim, struct win32_apply_ctx *ctx)
+{
+ struct wimboot_wim *p;
+ int ret;
+
+ /* Check if already registered */
+ for (size_t i = 0; i < ctx->wimboot.num_wims; i++)
+ if (wim == ctx->wimboot.wims[i].wim)
+ return 0;
+
+ /* Not yet registered */
+
+ p = REALLOC(ctx->wimboot.wims,
+ (ctx->wimboot.num_wims + 1) * sizeof(ctx->wimboot.wims[0]));
+ if (!p)
+ return WIMLIB_ERR_NOMEM;
+ ctx->wimboot.wims = p;
+
+ ctx->wimboot.wims[ctx->wimboot.num_wims].wim = wim;
+
+ ret = hash_blob_table(wim, ctx->wimboot.wims[ctx->wimboot.num_wims].blob_table_hash);
+ if (ret)
+ return ret;
+
+ ret = wimboot_alloc_data_source_id(wim->filename,
+ wim->hdr.guid,
+ ctx->common.wim->current_image,
+ ctx->common.target,
+ &ctx->wimboot.wims[ctx->wimboot.num_wims].data_source_id,
+ &ctx->wimboot.wof_running);
+ if (ret)
+ return ret;
+
+ ctx->wimboot.num_wims++;
+ return 0;
+}
+