Module: wine Branch: master Commit: f8cca445fb103812ff77bf47d6d46c454786e007 URL: https://source.winehq.org/git/wine.git/?a=commit;h=f8cca445fb103812ff77bf47d... Author: Nikolay Sivov <nsivov(a)codeweavers.com> Date: Tue Feb 20 15:57:47 2018 +0300 ntdll: Allow closing tags for 'supportedOS' elements. Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/kernel32/tests/actctx.c | 4 +-- dlls/ntdll/actctx.c | 70 ++++++++++++++++++++++++++------------------ 2 files changed, 44 insertions(+), 30 deletions(-) diff --git a/dlls/kernel32/tests/actctx.c b/dlls/kernel32/tests/actctx.c index cef11a5..263fe39 100644 --- a/dlls/kernel32/tests/actctx.c +++ b/dlls/kernel32/tests/actctx.c @@ -426,9 +426,9 @@ static const char compat_manifest_vista_7_8_10_81[] = " <assemblyIdentity version=\"1.0.0.0\" name=\"Wine.Test\" type=\"win32\"></assemblyIdentity>" " <compatibility xmlns=\"urn:schemas-microsoft-com:compatibility.v1\">" " <application>" -" <supportedOS Id=\"{e2011457-1546-43c5-a5fe-008deee3d3f0}\" />" /* Windows Vista */ +" <supportedOS Id=\"{e2011457-1546-43c5-a5fe-008deee3d3f0}\" ></supportedOS>" /* Windows Vista */ " <supportedOS Id=\"{35138b9a-5d96-4fbd-8e2d-a2440225f93a}\" />" /* Windows 7 */ -" <supportedOS Id=\"{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}\" />" /* Windows 8 */ +" <supportedOS Id=\"{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}\" ></supportedOS>" /* Windows 8 */ " <supportedOS Id=\"{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}\" />" /* Windows 10 */ " <supportedOS Id=\"{1f676c76-80e1-4239-95bb-83d0f6d0da78}\" />" /* Windows 8.1 */ " </application>" diff --git a/dlls/ntdll/actctx.c b/dlls/ntdll/actctx.c index 4a33700..27d6ad8 100644 --- a/dlls/ntdll/actctx.c +++ b/dlls/ntdll/actctx.c @@ -2245,11 +2245,50 @@ 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 + { + WARN("Invalid guid %s\n", debugstr_xmlstr(&attr_value)); + } + } + else + { + WARN("unknown attr %s=%s\n", debugstr_xmlstr(&attr_name), + debugstr_xmlstr(&attr_value)); + } + } + + 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))) { @@ -2260,32 +2299,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 - { - WARN("Invalid guid %s\n", debugstr_xmlstr(&attr_value)); - } - } - else - { - WARN("unknown attr %s=%s\n", debugstr_xmlstr(&attr_name), - debugstr_xmlstr(&attr_value)); - } - } + ret = parse_supportedos_elem(xmlbuf, assembly, acl); } else {