https://git.reactos.org/?p=reactos.git;a=commitdiff;h=19912955f6547040eb99bb...
commit 19912955f6547040eb99bbc5c695d6d1577062b5 Author: Mark Jansen mark.jansen@reactos.org AuthorDate: Mon Apr 9 00:01:30 2018 +0200 Commit: Mark Jansen mark.jansen@reactos.org CommitDate: Mon Apr 9 00:07:31 2018 +0200
[RTL] Fixes for supportedOS close elements. Imported from wine f8cca44: ntdll: Allow closing tags for 'supportedOS' elements. 697d4a7: ntdll: Allow explicitly specified asm.v2 namespace for "trustInfo". --- sdk/lib/rtl/actctx.c | 88 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 51 insertions(+), 37 deletions(-)
diff --git a/sdk/lib/rtl/actctx.c b/sdk/lib/rtl/actctx.c index 545f5fe1a1..e70363c7d1 100644 --- a/sdk/lib/rtl/actctx.c +++ b/sdk/lib/rtl/actctx.c @@ -2353,11 +2353,52 @@ static BOOL parse_file_elem(xmlbuf_t* xmlbuf, struct assembly* assembly, struct return ret; }
+static BOOL parse_supportedos_elem(xmlbuf_t *xmlbuf, struct assembly *assembly, struct actctx_loader *acl) +{ + xmlstr_t attr_name, attr_value; + BOOL end = FALSE, error; + + while (next_xml_attr(xmlbuf, &attr_name, &attr_value, &error, &end)) + { + if (xmlstr_cmp(&attr_name, IdW)) + { + COMPATIBILITY_CONTEXT_ELEMENT *compat; + UNICODE_STRING str; + GUID compat_id; + + str.Buffer = (PWSTR)attr_value.ptr; + str.Length = str.MaximumLength = (USHORT)attr_value.len * sizeof(WCHAR); + if (RtlGUIDFromString(&str, &compat_id) == STATUS_SUCCESS) + { + if (!(compat = add_compat_context(assembly))) return FALSE; + compat->Type = ACTCX_COMPATIBILITY_ELEMENT_TYPE_OS; + compat->Id = compat_id; + } + else + { + UNICODE_STRING attr_valueU = xmlstr2unicode(&attr_value); + DPRINT1("Invalid guid %wZ\n", &attr_valueU); + } + } + else + { + UNICODE_STRING attr_nameU = xmlstr2unicode(&attr_name); + UNICODE_STRING attr_valueU = xmlstr2unicode(&attr_value); + DPRINT1("unknown attr %wZ=%wZ\n", &attr_nameU, &attr_valueU); + } + } + + if (error) return FALSE; + if (end) return TRUE; + + return parse_expect_end_elem(xmlbuf, supportedOSW, asmv1W); +} + static BOOL parse_compatibility_application_elem(xmlbuf_t* xmlbuf, struct assembly* assembly, struct actctx_loader* acl) { - xmlstr_t attr_name, attr_value, elem; - BOOL end = FALSE, ret = TRUE, error; + BOOL ret = TRUE; + xmlstr_t elem;
while (ret && (ret = next_xml_elem(xmlbuf, &elem))) { @@ -2368,34 +2409,7 @@ static BOOL parse_compatibility_application_elem(xmlbuf_t* xmlbuf, struct assemb } else if (xmlstr_cmp(&elem, supportedOSW)) { - while (next_xml_attr(xmlbuf, &attr_name, &attr_value, &error, &end)) - { - if (xmlstr_cmp(&attr_name, IdW)) - { - UNICODE_STRING str; - COMPATIBILITY_CONTEXT_ELEMENT* compat; - GUID compat_id; - str.Buffer = (PWSTR)attr_value.ptr; - str.Length = str.MaximumLength = (USHORT)attr_value.len * sizeof(WCHAR); - if (RtlGUIDFromString(&str, &compat_id) == STATUS_SUCCESS) - { - if (!(compat = add_compat_context(assembly))) return FALSE; - compat->Type = ACTCX_COMPATIBILITY_ELEMENT_TYPE_OS; - compat->Id = compat_id; - } - else - { - UNICODE_STRING attr_valueU = xmlstr2unicode(&attr_value); - DPRINT1("Invalid guid %wZ\n", &attr_valueU); - } - } - else - { - UNICODE_STRING attr_nameU = xmlstr2unicode(&attr_name); - UNICODE_STRING attr_valueU = xmlstr2unicode(&attr_value); - DPRINT1("unknown attr %wZ=%wZ\n", &attr_nameU, &attr_valueU); - } - } + ret = parse_supportedos_elem(xmlbuf, assembly, acl); } else { @@ -2485,7 +2499,7 @@ static BOOL parse_requested_execution_level_elem(xmlbuf_t* xmlbuf, struct assemb
while (ret && (ret = next_xml_elem(xmlbuf, &elem))) { - if (xmlstr_cmp_end(&elem, requestedExecutionLevelW)) + if (xml_elem_cmp_end(&elem, requestedExecutionLevelW, asmv2W)) { ret = parse_end_element(xmlbuf); break; @@ -2508,12 +2522,12 @@ static BOOL parse_requested_privileges_elem(xmlbuf_t* xmlbuf, struct assembly* a
while (ret && (ret = next_xml_elem(xmlbuf, &elem))) { - if (xmlstr_cmp_end(&elem, requestedPrivilegesW)) + if (xml_elem_cmp_end(&elem, requestedPrivilegesW, asmv2W)) { ret = parse_end_element(xmlbuf); break; } - else if (xmlstr_cmp(&elem, requestedExecutionLevelW)) + else if (xml_elem_cmp(&elem, requestedExecutionLevelW, asmv2W)) ret = parse_requested_execution_level_elem(xmlbuf, assembly, acl); else { @@ -2533,12 +2547,12 @@ static BOOL parse_security_elem(xmlbuf_t *xmlbuf, struct assembly *assembly, str
while (ret && (ret = next_xml_elem(xmlbuf, &elem))) { - if (xmlstr_cmp_end(&elem, securityW)) + if (xml_elem_cmp_end(&elem, securityW, asmv2W)) { ret = parse_end_element(xmlbuf); break; } - else if (xmlstr_cmp(&elem, requestedPrivilegesW)) + else if (xml_elem_cmp(&elem, requestedPrivilegesW, asmv2W)) ret = parse_requested_privileges_elem(xmlbuf, assembly, acl); else { @@ -2558,12 +2572,12 @@ static BOOL parse_trust_info_elem(xmlbuf_t *xmlbuf, struct assembly *assembly, s
while (ret && (ret = next_xml_elem(xmlbuf, &elem))) { - if (xmlstr_cmp_end(&elem, trustInfoW)) + if (xml_elem_cmp_end(&elem, trustInfoW, asmv2W)) { ret = parse_end_element(xmlbuf); break; } - else if (xmlstr_cmp(&elem, securityW)) + else if (xml_elem_cmp(&elem, securityW, asmv2W)) ret = parse_security_elem(xmlbuf, assembly, acl); else {