X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Fxml.c;h=9ef6f65f12cdc7be084a4bcdf231f45fb45cd686;hb=882dc6e5dece7f521b9de6c4337aad0411ed00da;hp=cafc14f4788cda5722cba8e837d2ce33ce097db5;hpb=5695db8f27535e50a8159a226902687fe32ffe9a;p=wimlib diff --git a/src/xml.c b/src/xml.c index cafc14f4..9ef6f65f 100644 --- a/src/xml.c +++ b/src/xml.c @@ -62,6 +62,7 @@ struct windows_info { tchar *product_name; tchar *edition_id; tchar *installation_type; + tchar *pkeyconfigversion; tchar *hal; tchar *product_type; tchar *product_suite; @@ -88,6 +89,7 @@ struct image_info { tchar *display_name; tchar *display_description; tchar *flags; + bool wimboot; struct wim_lookup_table *lookup_table; /* temporary field */ }; @@ -166,6 +168,18 @@ wim_info_get_num_images(const struct wim_info *info) return 0; } +void +wim_info_set_wimboot(struct wim_info *info, int image, bool value) +{ + info->images[image - 1].wimboot = value; +} + +bool +wim_info_get_wimboot(const struct wim_info *info, int image) +{ + return info->images[image - 1].wimboot; +} + /* Architecture constants are from w64 mingw winnt.h */ #define PROCESSOR_ARCHITECTURE_INTEL 0 #define PROCESSOR_ARCHITECTURE_MIPS 1 @@ -258,6 +272,9 @@ node_get_string(const xmlNode *string_node, tchar **tstr_ret) tchar *tstr = NULL; int ret; + if (*tstr_ret) + return 0; + for_node_child(string_node, child) { if (node_is_text(child) && child->content) { ret = utf8_to_tstr_simple(child->content, &tstr); @@ -314,6 +331,7 @@ destroy_windows_info(struct windows_info *windows_info) FREE(windows_info->hal); FREE(windows_info->product_type); FREE(windows_info->product_suite); + FREE(windows_info->pkeyconfigversion); for (size_t i = 0; i < windows_info->num_languages; i++) FREE(windows_info->languages[i]); FREE(windows_info->languages); @@ -449,7 +467,19 @@ xml_read_windows_info(const xmlNode *windows_node, ret = node_get_string(child, &windows_info->system_root); } else if (node_name_is(child, "HAL")) { ret = node_get_string(child, &windows_info->hal); + } else if (node_name_is(child, "SERVICINGDATA")) { + xmlNode *grandchild; + + for_node_child(child, grandchild) { + if (node_is_element(grandchild) && + node_name_is(grandchild, "PKEYCONFIGVERSION")) + { + ret = node_get_string(grandchild, + &windows_info->pkeyconfigversion); + } + } } + if (ret != 0) return ret; } @@ -503,6 +533,10 @@ xml_read_image_info(xmlNode *image_node, struct image_info *image_info) ret = node_get_string(child, &image_info->display_name); } else if (node_name_is(child, "DISPLAYDESCRIPTION")) { ret = node_get_string(child, &image_info->display_description); + } else if (node_name_is(child, "WIMBOOT")) { + if (node_get_u64(child) == 1) { + image_info->wimboot = true; + } } if (ret != 0) return ret; @@ -815,6 +849,21 @@ xml_write_windows_info(xmlTextWriter *writer, return rc; } + if (windows_info->pkeyconfigversion) { + rc = xmlTextWriterStartElement(writer, "SERVICINGDATA"); + if (rc < 0) + return rc; + + rc = xml_write_string(writer, "PKEYCONFIGVERSION", + windows_info->pkeyconfigversion); + if (rc) + return rc; + + rc = xmlTextWriterEndElement(writer); + if (rc < 0) + return rc; + } + if (windows_info->windows_version_exists) { rc = xml_write_windows_version(writer, &windows_info->windows_version); if (rc) @@ -912,6 +961,12 @@ xml_write_image_info(xmlTextWriter *writer, const struct image_info *image_info) if (rc) return rc; + if (image_info->wimboot) { + rc = xmlTextWriterWriteFormatElement(writer, "WIMBOOT", "%d", 1); + if (rc < 0) + return rc; + } + rc = xmlTextWriterEndElement(writer); /* */ if (rc < 0) return rc; @@ -949,6 +1004,12 @@ clone_windows_info(const struct windows_info *old, struct windows_info *new) if (ret) return ret; + if (old->pkeyconfigversion) { + new->pkeyconfigversion = TSTRDUP(old->pkeyconfigversion); + if (new->pkeyconfigversion == NULL) + return WIMLIB_ERR_NOMEM; + } + if (old->languages) { new->languages = CALLOC(old->num_languages, sizeof(new->languages[0])); if (!new->languages) @@ -1298,6 +1359,8 @@ print_image_info(const struct wim_info *wim_info, int image) print_windows_info(&image_info->windows_info); if (image_info->flags) tprintf(T("Flags: %"TS"\n"), image_info->flags); + tprintf(T("WIMBoot compatible: %"TS"\n"), + image_info->wimboot ? T("yes") : T("no")); tputchar('\n'); }