winehq.org
Sign In
Sign Up
Sign In
Sign Up
Manage this list
×
Keyboard Shortcuts
Thread View
j
: Next unread message
k
: Previous unread message
j a
: Jump to all threads
j l
: Jump to MailingList overview
2025
February
January
2024
December
November
October
September
August
July
June
May
April
March
February
January
2023
December
November
October
September
August
July
June
May
April
March
February
January
2022
December
November
October
September
August
July
June
May
April
March
February
January
2021
December
November
October
September
August
July
June
May
April
March
February
January
2020
December
November
October
September
August
July
June
May
April
March
February
January
2019
December
November
October
September
August
July
June
May
April
March
February
January
2018
December
November
October
September
August
July
June
May
April
March
February
January
2017
December
November
October
September
August
July
June
May
April
March
February
January
2016
December
November
October
September
August
July
June
May
April
March
February
January
2015
December
November
October
September
August
July
June
May
April
March
February
January
2014
December
November
October
September
August
July
June
May
April
March
February
January
2013
December
November
October
September
August
July
June
May
April
March
February
January
2012
December
November
October
September
August
July
June
May
April
March
February
January
2011
December
November
October
September
August
July
June
May
April
March
February
January
2010
December
November
October
September
August
July
June
May
April
March
February
January
2009
December
November
October
September
August
July
June
May
April
March
February
January
2008
December
November
October
September
August
July
June
May
April
March
February
January
2007
December
November
October
September
August
July
June
May
April
March
February
January
2006
December
November
October
September
August
July
June
May
April
March
February
January
2005
December
November
October
September
August
July
June
May
April
March
February
January
2004
December
November
October
September
August
July
June
May
April
March
February
January
2003
December
November
October
September
August
July
June
May
April
March
February
January
2002
December
November
October
September
August
July
June
May
April
March
February
January
2001
December
November
October
September
August
July
June
May
April
March
February
List overview
wine-commits
May 2021
----- 2025 -----
February 2025
January 2025
----- 2024 -----
December 2024
November 2024
October 2024
September 2024
August 2024
July 2024
June 2024
May 2024
April 2024
March 2024
February 2024
January 2024
----- 2023 -----
December 2023
November 2023
October 2023
September 2023
August 2023
July 2023
June 2023
May 2023
April 2023
March 2023
February 2023
January 2023
----- 2022 -----
December 2022
November 2022
October 2022
September 2022
August 2022
July 2022
June 2022
May 2022
April 2022
March 2022
February 2022
January 2022
----- 2021 -----
December 2021
November 2021
October 2021
September 2021
August 2021
July 2021
June 2021
May 2021
April 2021
March 2021
February 2021
January 2021
----- 2020 -----
December 2020
November 2020
October 2020
September 2020
August 2020
July 2020
June 2020
May 2020
April 2020
March 2020
February 2020
January 2020
----- 2019 -----
December 2019
November 2019
October 2019
September 2019
August 2019
July 2019
June 2019
May 2019
April 2019
March 2019
February 2019
January 2019
----- 2018 -----
December 2018
November 2018
October 2018
September 2018
August 2018
July 2018
June 2018
May 2018
April 2018
March 2018
February 2018
January 2018
----- 2017 -----
December 2017
November 2017
October 2017
September 2017
August 2017
July 2017
June 2017
May 2017
April 2017
March 2017
February 2017
January 2017
----- 2016 -----
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
----- 2015 -----
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
----- 2014 -----
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
----- 2013 -----
December 2013
November 2013
October 2013
September 2013
August 2013
July 2013
June 2013
May 2013
April 2013
March 2013
February 2013
January 2013
----- 2012 -----
December 2012
November 2012
October 2012
September 2012
August 2012
July 2012
June 2012
May 2012
April 2012
March 2012
February 2012
January 2012
----- 2011 -----
December 2011
November 2011
October 2011
September 2011
August 2011
July 2011
June 2011
May 2011
April 2011
March 2011
February 2011
January 2011
----- 2010 -----
December 2010
November 2010
October 2010
September 2010
August 2010
July 2010
June 2010
May 2010
April 2010
March 2010
February 2010
January 2010
----- 2009 -----
December 2009
November 2009
October 2009
September 2009
August 2009
July 2009
June 2009
May 2009
April 2009
March 2009
February 2009
January 2009
----- 2008 -----
December 2008
November 2008
October 2008
September 2008
August 2008
July 2008
June 2008
May 2008
April 2008
March 2008
February 2008
January 2008
----- 2007 -----
December 2007
November 2007
October 2007
September 2007
August 2007
July 2007
June 2007
May 2007
April 2007
March 2007
February 2007
January 2007
----- 2006 -----
December 2006
November 2006
October 2006
September 2006
August 2006
July 2006
June 2006
May 2006
April 2006
March 2006
February 2006
January 2006
----- 2005 -----
December 2005
November 2005
October 2005
September 2005
August 2005
July 2005
June 2005
May 2005
April 2005
March 2005
February 2005
January 2005
----- 2004 -----
December 2004
November 2004
October 2004
September 2004
August 2004
July 2004
June 2004
May 2004
April 2004
March 2004
February 2004
January 2004
----- 2003 -----
December 2003
November 2003
October 2003
September 2003
August 2003
July 2003
June 2003
May 2003
April 2003
March 2003
February 2003
January 2003
----- 2002 -----
December 2002
November 2002
October 2002
September 2002
August 2002
July 2002
June 2002
May 2002
April 2002
March 2002
February 2002
January 2002
----- 2001 -----
December 2001
November 2001
October 2001
September 2001
August 2001
July 2001
June 2001
May 2001
April 2001
March 2001
February 2001
wine-commits@winehq.org
2 participants
770 discussions
Start a n
N
ew thread
Dmitry Timoshkov : msxml3: When saving XML use encoding specified in the processing instruction.
by Alexandre Julliard
31 May '21
31 May '21
Module: wine Branch: master Commit: 2ea0d5470eec92cf34d90f6d3b1addabcc04ce25 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=2ea0d5470eec92cf34d90f6d…
Author: Dmitry Timoshkov <dmitry(a)baikal.ru> Date: Fri May 28 13:38:42 2021 +0300 msxml3: When saving XML use encoding specified in the processing instruction. Otherwise when a PI node with not default encoding is assigned to a document then saving an XML leads to document being encoded as UTF-8 while XML declaration has what PI specifies. Signed-off-by: Dmitry Timoshkov <dmitry(a)baikal.ru> Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/msxml3/domdoc.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 68 insertions(+), 2 deletions(-) diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c index c67e570a8ea..45fbd6f43aa 100644 --- a/dlls/msxml3/domdoc.c +++ b/dlls/msxml3/domdoc.c @@ -2563,6 +2563,63 @@ static int XMLCALL domdoc_stream_save_closecallback(void *ctx) return 0; } +static char *xmldoc_encoding(IXMLDOMDocument3 *doc) +{ + HRESULT hr; + IXMLDOMNode *node; + char *encoding = NULL; + + hr = IXMLDOMDocument3_get_firstChild(doc, &node); + if (hr == S_OK) + { + DOMNodeType type; + + hr = IXMLDOMNode_get_nodeType(node, &type); + if (hr == S_OK && type == NODE_PROCESSING_INSTRUCTION) + { + IXMLDOMProcessingInstruction *pi; + IXMLDOMNode *item; + IXMLDOMNamedNodeMap *node_map; + + hr = IXMLDOMNode_QueryInterface(node, &IID_IXMLDOMProcessingInstruction, (void **)&pi); + if (hr == S_OK) + { + hr = IXMLDOMNode_get_attributes(node, &node_map); + if (hr == S_OK) + { + static const WCHAR encodingW[] = {'e','n','c','o','d','i','n','g',0}; + BSTR bstr; + + bstr = SysAllocString(encodingW); + hr = IXMLDOMNamedNodeMap_getNamedItem(node_map, bstr, &item); + SysFreeString(bstr); + if (hr == S_OK) + { + VARIANT var; + + hr = IXMLDOMNode_get_nodeValue(item, &var); + if (hr == S_OK) + { + if (V_VT(&var) == VT_BSTR) + encoding = (char *)xmlchar_from_wchar(V_BSTR(&var)); + + VariantClear(&var); + } + } + + IXMLDOMNamedNodeMap_Release(node_map); + } + + IXMLDOMProcessingInstruction_Release(pi); + } + } + + IXMLDOMNode_Release(node); + } + + return encoding; +} + static HRESULT WINAPI domdoc_save( IXMLDOMDocument3 *iface, VARIANT destination ) @@ -2601,8 +2658,12 @@ static HRESULT WINAPI domdoc_save( ret = IUnknown_QueryInterface(pUnk, &IID_IStream, (void**)&stream); if(ret == S_OK) { + char *encoding = xmldoc_encoding(iface); + + TRACE("using encoding %s\n", encoding ? debugstr_a(encoding) : "default"); ctx = xmlSaveToIO(domdoc_stream_save_writecallback, - domdoc_stream_save_closecallback, stream, NULL, XML_SAVE_NO_DECL); + domdoc_stream_save_closecallback, stream, encoding, XML_SAVE_NO_DECL); + heap_free(encoding); if(!ctx) { @@ -2616,6 +2677,7 @@ static HRESULT WINAPI domdoc_save( case VT_BSTR: case VT_BSTR | VT_BYREF: { + char *encoding; /* save with file path */ HANDLE handle = CreateFileW( (V_VT(&destination) & VT_BYREF)? *V_BSTRREF(&destination) : V_BSTR(&destination), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); @@ -2625,8 +2687,12 @@ static HRESULT WINAPI domdoc_save( return E_FAIL; } + encoding = xmldoc_encoding(iface); + TRACE("using encoding %s\n", encoding ? debugstr_a(encoding) : "default"); ctx = xmlSaveToIO(domdoc_save_writecallback, domdoc_save_closecallback, - handle, NULL, XML_SAVE_NO_DECL); + handle, encoding, XML_SAVE_NO_DECL); + heap_free(encoding); + if (!ctx) { CloseHandle(handle);
1
0
0
0
Dmitry Timoshkov : msxml3: Implement IXMLDOMNamedNodeMap::getNamedItem() for a processing instruction node.
by Alexandre Julliard
31 May '21
31 May '21
Module: wine Branch: master Commit: a39df8bb61568e66d2aca521fd1703fbb73108ea URL:
https://source.winehq.org/git/wine.git/?a=commit;h=a39df8bb61568e66d2aca521…
Author: Dmitry Timoshkov <dmitry(a)baikal.ru> Date: Fri May 28 13:38:37 2021 +0300 msxml3: Implement IXMLDOMNamedNodeMap::getNamedItem() for a processing instruction node. Signed-off-by: Dmitry Timoshkov <dmitry(a)baikal.ru> Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/msxml3/pi.c | 45 ++++++++++++++++++++++++++++++++++++++++++--- dlls/msxml3/tests/domdoc.c | 5 ----- 2 files changed, 42 insertions(+), 8 deletions(-) diff --git a/dlls/msxml3/pi.c b/dlls/msxml3/pi.c index f37f3c01630..606d8dc3571 100644 --- a/dlls/msxml3/pi.c +++ b/dlls/msxml3/pi.c @@ -817,6 +817,27 @@ static const struct IXMLDOMProcessingInstructionVtbl dom_pi_vtbl = dom_pi_put_data }; +static xmlAttrPtr node_has_prop(const xmlNode *node, const xmlChar *name) +{ + xmlAttrPtr prop; + + /* xmlHasNsProp accepts only nodes of type XML_ELEMENT_NODE, + * so we have to look for an attribute in the node by hand. + */ + + prop = node->properties; + + while (prop) + { + if (xmlStrEqual(prop->name, name)) + return prop; + + prop = prop->next; + } + + return NULL; +} + static HRESULT dom_pi_get_qualified_item(const xmlNodePtr node, BSTR name, BSTR uri, IXMLDOMNode **item) { @@ -826,10 +847,28 @@ static HRESULT dom_pi_get_qualified_item(const xmlNodePtr node, BSTR name, BSTR static HRESULT dom_pi_get_named_item(const xmlNodePtr node, BSTR name, IXMLDOMNode **item) { - FIXME("(%p)->(%s %p): stub\n", node, debugstr_w(name), item ); - if (item) + xmlChar *nameA; + xmlAttrPtr attr; + + TRACE("(%p)->(%s %p)\n", node, debugstr_w(name), item); + + if (!item) return E_POINTER; + + nameA = xmlchar_from_wchar(name); + if (!nameA) return E_OUTOFMEMORY; + + attr = node_has_prop(node, nameA); + heap_free(nameA); + + if (!attr) + { *item = NULL; - return S_FALSE; + return S_FALSE; + } + + *item = create_node((xmlNodePtr)attr); + + return S_OK; } static HRESULT dom_pi_set_named_item(xmlNodePtr node, IXMLDOMNode *newItem, IXMLDOMNode **namedItem) diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index 3dcfdb8fd39..12482962c4b 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -8579,13 +8579,9 @@ todo_wine item = NULL; hr = IXMLDOMNamedNodeMap_getNamedItem(node_map, _bstr_("encoding"), &item); -todo_wine ok(hr == S_OK, "got 0x%08x\n", hr); -todo_wine ok(item != NULL, "got NULL\n"); -if (hr == S_OK) -{ hr = IXMLDOMNode_get_nodeName(item, &bstr); ok(hr == S_OK, "got 0x%08x\n", hr); ok(!lstrcmpW(bstr, L"encoding"), "got %s\n", wine_dbgstr_w(bstr)); @@ -8597,7 +8593,6 @@ if (hr == S_OK) ok(V_VT(&var) == VT_BSTR, "got %u\n", V_VT(&var)); ok(!lstrcmpW(V_BSTR(&var), L"windows-1252"), "got %s\n", wine_dbgstr_w(V_BSTR(&var))); VariantClear(&var); -} IXMLDOMNamedNodeMap_Release(node_map); IXMLDOMNode_Release(node);
1
0
0
0
Dmitry Timoshkov : msxml3: Implement ::get_attributes() for "xml" processing instruction node.
by Alexandre Julliard
31 May '21
31 May '21
Module: wine Branch: master Commit: 769aac0021c23754c46dd9cceaf52a42df77f04d URL:
https://source.winehq.org/git/wine.git/?a=commit;h=769aac0021c23754c46dd9cc…
Author: Dmitry Timoshkov <dmitry(a)baikal.ru> Date: Fri May 28 13:38:32 2021 +0300 msxml3: Implement ::get_attributes() for "xml" processing instruction node. Signed-off-by: Dmitry Timoshkov <dmitry(a)baikal.ru> Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/msxml3/pi.c | 144 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 143 insertions(+), 1 deletion(-) diff --git a/dlls/msxml3/pi.c b/dlls/msxml3/pi.c index cea95708087..f37f3c01630 100644 --- a/dlls/msxml3/pi.c +++ b/dlls/msxml3/pi.c @@ -34,6 +34,7 @@ #include "ole2.h" #include "msxml6.h" +#include "xmlparser.h" #include "msxml_private.h" #include "wine/debug.h" @@ -287,6 +288,138 @@ static HRESULT WINAPI dom_pi_get_nextSibling( return node_get_next_sibling(&This->node, domNode); } +static HRESULT xml_get_value(xmlChar **p, xmlChar **value) +{ + xmlChar *v; + int len; + + while (isspace(**p)) *p += 1; + if (**p != '=') return XML_E_MISSINGEQUALS; + *p += 1; + + while (isspace(**p)) *p += 1; + if (**p != '"') return XML_E_MISSINGQUOTE; + *p += 1; + + v = *p; + while (**p && **p != '"') *p += 1; + if (!**p) return XML_E_EXPECTINGCLOSEQUOTE; + len = *p - v; + if (!len) return XML_E_MISSINGNAME; + *p += 1; + + *value = heap_alloc(len + 1); + if (!*value) return E_OUTOFMEMORY; + memcpy(*value, v, len); + *(*value + len) = 0; + + return S_OK; +} + +static void set_prop(xmlNodePtr node, xmlAttrPtr attr) +{ + xmlAttrPtr prop; + + if (!node->properties) + { + node->properties = attr; + return; + } + + prop = node->properties; + while (prop->next) prop = prop->next; + + prop->next = attr; +} + +static HRESULT parse_xml_decl(xmlNodePtr node) +{ + xmlChar *version, *encoding, *standalone, *p; + xmlAttrPtr attr; + HRESULT hr = S_OK; + + if (!node->content) return S_OK; + + version = encoding = standalone = NULL; + + p = node->content; + + while (*p) + { + while (isspace(*p)) p++; + if (!*p) break; + + if (!strncmp((const char *)p, "version", 7)) + { + p += 7; + if ((hr = xml_get_value(&p, &version)) != S_OK) goto fail; + } + else if (!strncmp((const char *)p, "encoding", 8)) + { + p += 8; + if ((hr = xml_get_value(&p, &encoding)) != S_OK) goto fail; + } + else if (!strncmp((const char *)p, "standalone", 10)) + { + p += 10; + if ((hr = xml_get_value(&p, &standalone)) != S_OK) goto fail; + } + else + { + FIXME("unexpected XML attribute %s\n", debugstr_a((const char *)p)); + hr = XML_E_UNEXPECTED_ATTRIBUTE; + goto fail; + } + } + + /* xmlSetProp/xmlSetNsProp accept only nodes of type XML_ELEMENT_NODE, + * so we have to create and assign attributes to a node by hand. + */ + + if (version) + { + attr = xmlSetNsProp(NULL, NULL, (const xmlChar *)"version", version); + if (attr) + { + attr->doc = node->doc; + set_prop(node, attr); + } + else hr = E_OUTOFMEMORY; + } + if (encoding) + { + attr = xmlSetNsProp(NULL, NULL, (const xmlChar *)"encoding", encoding); + if (attr) + { + attr->doc = node->doc; + set_prop(node, attr); + } + else hr = E_OUTOFMEMORY; + } + if (standalone) + { + attr = xmlSetNsProp(NULL, NULL, (const xmlChar *)"standalone", standalone); + if (attr) + { + attr->doc = node->doc; + set_prop(node, attr); + } + else hr = E_OUTOFMEMORY; + } + +fail: + if (hr != S_OK) + { + xmlFreePropList(node->properties); + node->properties = NULL; + } + + heap_free(version); + heap_free(encoding); + heap_free(standalone); + return hr; +} + static HRESULT WINAPI dom_pi_get_attributes( IXMLDOMProcessingInstruction *iface, IXMLDOMNamedNodeMap** map) @@ -307,7 +440,16 @@ static HRESULT WINAPI dom_pi_get_attributes( if (!strcmpW(name, xmlW)) { - FIXME("created dummy map for <?xml ?>\n"); + if (!This->node.node->properties) + { + hr = parse_xml_decl(This->node.node); + if (hr != S_OK) + { + SysFreeString(name); + return S_FALSE; + } + } + *map = create_nodemap(This->node.node, &dom_pi_attr_map); SysFreeString(name); return S_OK;
1
0
0
0
Rémi Bernon : server: Send HID report data with the WM_INPUT messages.
by Alexandre Julliard
31 May '21
31 May '21
Module: wine Branch: master Commit: fc64aa7e7cdf715738ed411afb4da69064939a2b URL:
https://source.winehq.org/git/wine.git/?a=commit;h=fc64aa7e7cdf715738ed411a…
Author: Rémi Bernon <rbernon(a)codeweavers.com> Date: Fri May 28 16:12:21 2021 +0200 server: Send HID report data with the WM_INPUT messages. Wine-Bug:
https://bugs.winehq.org/show_bug.cgi?id=50506
Signed-off-by: Rémi Bernon <rbernon(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/user32/message.c | 5 ++++- dlls/user32/rawinput.c | 4 ++-- include/wine/server_protocol.h | 7 +++++-- server/protocol.def | 3 +++ server/queue.c | 15 ++++++++++++++- server/request.h | 6 +++--- server/trace.c | 5 +++-- tools/make_requests | 2 +- 8 files changed, 35 insertions(+), 12 deletions(-) diff --git a/dlls/user32/message.c b/dlls/user32/message.c index 886c10e36bd..6f0f58a5f3f 100644 --- a/dlls/user32/message.c +++ b/dlls/user32/message.c @@ -3298,11 +3298,14 @@ NTSTATUS send_hardware_message( HWND hwnd, const INPUT *input, const RAWINPUT *r switch (rawinput->header.dwType) { case RIM_TYPEHID: - assert( rawinput->data.hid.dwCount <= 1 ); req->input.hw.rawinput.hid.device = HandleToUlong( rawinput->header.hDevice ); req->input.hw.rawinput.hid.param = rawinput->header.wParam; req->input.hw.rawinput.hid.usage_page = hid_usage_page; req->input.hw.rawinput.hid.usage = hid_usage; + req->input.hw.rawinput.hid.count = rawinput->data.hid.dwCount; + req->input.hw.rawinput.hid.length = rawinput->data.hid.dwSizeHid; + wine_server_add_data( req, rawinput->data.hid.bRawData, + rawinput->data.hid.dwCount * rawinput->data.hid.dwSizeHid ); break; default: assert( 0 ); diff --git a/dlls/user32/rawinput.c b/dlls/user32/rawinput.c index 87f7175a6c1..41d627c62c2 100644 --- a/dlls/user32/rawinput.c +++ b/dlls/user32/rawinput.c @@ -397,8 +397,8 @@ BOOL rawinput_from_hardware_message(RAWINPUT *rawinput, const struct hardware_ms rawinput->header.hDevice = ULongToHandle( msg_data->rawinput.hid.device ); rawinput->header.wParam = 0; - rawinput->data.hid.dwCount = 0; - rawinput->data.hid.dwSizeHid = 0; + rawinput->data.hid.dwCount = msg_data->rawinput.hid.count; + rawinput->data.hid.dwSizeHid = msg_data->rawinput.hid.length; memcpy( rawinput->data.hid.bRawData, msg_data + 1, size ); } else diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h index 96b91c503a9..83b6bdb3e22 100644 --- a/include/wine/server_protocol.h +++ b/include/wine/server_protocol.h @@ -286,6 +286,8 @@ union rawinput unsigned int param; unsigned short usage_page; unsigned short usage; + unsigned int count; + unsigned int length; } hid; }; @@ -2763,7 +2765,8 @@ struct send_hardware_message_request user_handle_t win; hw_input_t input; unsigned int flags; - char __pad_52[4]; + /* VARARG(report,bytes); */ + char __pad_60[4]; }; struct send_hardware_message_reply { @@ -6309,7 +6312,7 @@ union generic_reply /* ### protocol_version begin ### */ -#define SERVER_PROTOCOL_VERSION 709 +#define SERVER_PROTOCOL_VERSION 710 /* ### protocol_version end ### */ diff --git a/server/protocol.def b/server/protocol.def index 142064d30d3..8a68c9a5eb7 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -302,6 +302,8 @@ union rawinput unsigned int param; /* rawinput message param */ unsigned short usage_page;/* HID usage page */ unsigned short usage; /* HID usage */ + unsigned int count; /* HID report count */ + unsigned int length; /* HID report length */ } hid; }; @@ -2068,6 +2070,7 @@ enum message_type user_handle_t win; /* window handle */ hw_input_t input; /* input data */ unsigned int flags; /* flags (see below) */ + VARARG(report,bytes); /* HID report data */ @REPLY int wait; /* do we need to wait for a reply? */ int prev_x; /* previous cursor position */ diff --git a/server/queue.c b/server/queue.c index 76ee469ffef..e4903bcb79f 100644 --- a/server/queue.c +++ b/server/queue.c @@ -1995,6 +1995,7 @@ static void queue_custom_hardware_message( struct desktop *desktop, user_handle_ struct hardware_msg_data *msg_data; struct rawinput_message raw_msg; struct message *msg; + data_size_t report_size = 0; switch (input->hw.msg) { @@ -2007,9 +2008,21 @@ static void queue_custom_hardware_message( struct desktop *desktop, user_handle_ raw_msg.message = input->hw.msg; raw_msg.hid_report = NULL; + if (input->hw.rawinput.type == RIM_TYPEHID) + { + raw_msg.hid_report = get_req_data(); + report_size = input->hw.rawinput.hid.length * input->hw.rawinput.hid.count; + } + + if (report_size != get_req_data_size()) + { + set_error( STATUS_INVALID_PARAMETER ); + return; + } + msg_data = &raw_msg.data; msg_data->info = 0; - msg_data->size = sizeof(*msg_data); + msg_data->size = sizeof(*msg_data) + report_size; msg_data->flags = 0; msg_data->rawinput = input->hw.rawinput; diff --git a/server/request.h b/server/request.h index cd65f79c757..ddf356c3e3f 100644 --- a/server/request.h +++ b/server/request.h @@ -693,7 +693,7 @@ C_ASSERT( sizeof(client_ptr_t) == 8 ); C_ASSERT( sizeof(data_size_t) == 4 ); C_ASSERT( sizeof(file_pos_t) == 8 ); C_ASSERT( sizeof(generic_map_t) == 16 ); -C_ASSERT( sizeof(hw_input_t) == 32 ); +C_ASSERT( sizeof(hw_input_t) == 40 ); C_ASSERT( sizeof(int) == 4 ); C_ASSERT( sizeof(ioctl_code_t) == 4 ); C_ASSERT( sizeof(irp_params_t) == 32 ); @@ -1355,8 +1355,8 @@ C_ASSERT( FIELD_OFFSET(struct post_quit_message_request, exit_code) == 12 ); C_ASSERT( sizeof(struct post_quit_message_request) == 16 ); C_ASSERT( FIELD_OFFSET(struct send_hardware_message_request, win) == 12 ); C_ASSERT( FIELD_OFFSET(struct send_hardware_message_request, input) == 16 ); -C_ASSERT( FIELD_OFFSET(struct send_hardware_message_request, flags) == 48 ); -C_ASSERT( sizeof(struct send_hardware_message_request) == 56 ); +C_ASSERT( FIELD_OFFSET(struct send_hardware_message_request, flags) == 56 ); +C_ASSERT( sizeof(struct send_hardware_message_request) == 64 ); C_ASSERT( FIELD_OFFSET(struct send_hardware_message_reply, wait) == 8 ); C_ASSERT( FIELD_OFFSET(struct send_hardware_message_reply, prev_x) == 12 ); C_ASSERT( FIELD_OFFSET(struct send_hardware_message_reply, prev_y) == 16 ); diff --git a/server/trace.c b/server/trace.c index cebcc217e3a..8bfc9e56cc5 100644 --- a/server/trace.c +++ b/server/trace.c @@ -404,9 +404,9 @@ static void dump_rawinput( const char *prefix, const union rawinput *rawinput ) rawinput->kbd.message, rawinput->kbd.vkey, rawinput->kbd.scan ); break; case RIM_TYPEHID: - fprintf( stderr, "%s{type=HID,device=%04x,param=%04x,page=%04hx,usage=%04hx}", + fprintf( stderr, "%s{type=HID,device=%04x,param=%04x,page=%04hx,usage=%04hx,count=%u,length=%u}", prefix, rawinput->hid.device, rawinput->hid.param, rawinput->hid.usage_page, - rawinput->hid.usage ); + rawinput->hid.usage, rawinput->hid.count, rawinput->hid.length ); break; default: fprintf( stderr, "%s{type=%04x}", prefix, rawinput->type ); @@ -2727,6 +2727,7 @@ static void dump_send_hardware_message_request( const struct send_hardware_messa fprintf( stderr, " win=%08x", req->win ); dump_hw_input( ", input=", &req->input ); fprintf( stderr, ", flags=%08x", req->flags ); + dump_varargs_bytes( ", report=", cur_size ); } static void dump_send_hardware_message_reply( const struct send_hardware_message_reply *req ) diff --git a/tools/make_requests b/tools/make_requests index a70b29df3d2..1c4e5977c8b 100755 --- a/tools/make_requests +++ b/tools/make_requests @@ -52,7 +52,7 @@ my %formats = "luid_t" => [ 8, 4, "&dump_luid" ], "generic_map_t" => [ 16, 4, "&dump_generic_map" ], "ioctl_code_t" => [ 4, 4, "&dump_ioctl_code" ], - "hw_input_t" => [ 32, 8, "&dump_hw_input" ], + "hw_input_t" => [ 40, 8, "&dump_hw_input" ], ); my @requests = ();
1
0
0
0
Rémi Bernon : server: Support variable sized hardware_msg_data allocation.
by Alexandre Julliard
31 May '21
31 May '21
Module: wine Branch: master Commit: 109de6087374459d7656ab45240d2e2edae64a45 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=109de6087374459d7656ab45…
Author: Rémi Bernon <rbernon(a)codeweavers.com> Date: Fri May 28 16:12:20 2021 +0200 server: Support variable sized hardware_msg_data allocation. The RIM_TYPEHID messages will have to carry the variable length HID report. Wine-Bug:
https://bugs.winehq.org/show_bug.cgi?id=50506
Signed-off-by: Rémi Bernon <rbernon(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- server/queue.c | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/server/queue.c b/server/queue.c index 6c59b02a9b6..76ee469ffef 100644 --- a/server/queue.c +++ b/server/queue.c @@ -348,13 +348,13 @@ static int assign_thread_input( struct thread *thread, struct thread_input *new_ /* allocate a hardware message and its data */ static struct message *alloc_hardware_message( lparam_t info, struct hw_msg_source source, - unsigned int time ) + unsigned int time, data_size_t extra_size ) { struct hardware_msg_data *msg_data; struct message *msg; if (!(msg = mem_alloc( sizeof(*msg) ))) return NULL; - if (!(msg_data = mem_alloc( sizeof(*msg_data) ))) + if (!(msg_data = mem_alloc( sizeof(*msg_data) + extra_size ))) { free( msg ); return NULL; @@ -363,9 +363,9 @@ static struct message *alloc_hardware_message( lparam_t info, struct hw_msg_sour msg->type = MSG_HARDWARE; msg->time = time; msg->data = msg_data; - msg->data_size = sizeof(*msg_data); + msg->data_size = sizeof(*msg_data) + extra_size; - memset( msg_data, 0, sizeof(*msg_data) ); + memset( msg_data, 0, sizeof(*msg_data) + extra_size ); msg_data->info = info; msg_data->size = msg->data_size; msg_data->source = source; @@ -399,7 +399,7 @@ static void set_cursor_pos( struct desktop *desktop, int x, int y ) return; } - if (!(msg = alloc_hardware_message( 0, source, get_tick_count() ))) return; + if (!(msg = alloc_hardware_message( 0, source, get_tick_count(), 0 ))) return; msg->msg = WM_MOUSEMOVE; msg->x = x; @@ -1665,6 +1665,7 @@ struct rawinput_message unsigned int time; unsigned int message; struct hardware_msg_data data; + const void *hid_report; }; /* check if process is supposed to receive a WM_INPUT message and eventually queue it */ @@ -1676,6 +1677,7 @@ static int queue_rawinput_message( struct process* process, void *arg ) struct desktop *target_desktop = NULL, *desktop = NULL; struct thread *target_thread = NULL, *foreground = NULL; struct message *msg; + data_size_t report_size; int wparam = RIM_INPUT; if (raw_msg->data.rawinput.type == RIM_TYPEMOUSE) @@ -1703,7 +1705,10 @@ static int queue_rawinput_message( struct process* process, void *arg ) wparam = RIM_INPUTSINK; } - if (!(msg = alloc_hardware_message( raw_msg->data.info, raw_msg->source, raw_msg->time ))) + if (raw_msg->data.rawinput.type != RIM_TYPEHID || !raw_msg->hid_report) report_size = 0; + else report_size = raw_msg->data.size - sizeof(raw_msg->data); + + if (!(msg = alloc_hardware_message( raw_msg->data.info, raw_msg->source, raw_msg->time, report_size ))) goto done; msg->win = device->target; @@ -1711,6 +1716,7 @@ static int queue_rawinput_message( struct process* process, void *arg ) msg->wparam = wparam; msg->lparam = 0; memcpy( msg->data, &raw_msg->data, sizeof(raw_msg->data) ); + if (report_size) memcpy( (struct hardware_msg_data *)msg->data + 1, raw_msg->hid_report, report_size ); if (raw_msg->message == WM_INPUT_DEVICE_CHANGE && raw_msg->data.rawinput.type == RIM_TYPEHID) { @@ -1792,6 +1798,7 @@ static int queue_mouse_message( struct desktop *desktop, user_handle_t win, cons raw_msg.source = source; raw_msg.time = time; raw_msg.message = WM_INPUT; + raw_msg.hid_report = NULL; msg_data = &raw_msg.data; msg_data->info = input->mouse.info; @@ -1818,7 +1825,7 @@ static int queue_mouse_message( struct desktop *desktop, user_handle_t win, cons if (!(flags & (1 << i))) continue; flags &= ~(1 << i); - if (!(msg = alloc_hardware_message( input->mouse.info, source, time ))) return 0; + if (!(msg = alloc_hardware_message( input->mouse.info, source, time, 0 ))) return 0; msg_data = msg->data; msg->win = get_user_full_handle( win ); @@ -1928,6 +1935,7 @@ static int queue_keyboard_message( struct desktop *desktop, user_handle_t win, c raw_msg.source = source; raw_msg.time = time; raw_msg.message = WM_INPUT; + raw_msg.hid_report = NULL; msg_data = &raw_msg.data; msg_data->info = input->kbd.info; @@ -1948,7 +1956,7 @@ static int queue_keyboard_message( struct desktop *desktop, user_handle_t win, c return 0; } - if (!(msg = alloc_hardware_message( input->kbd.info, source, time ))) return 0; + if (!(msg = alloc_hardware_message( input->kbd.info, source, time, 0 ))) return 0; msg_data = msg->data; msg->win = get_user_full_handle( win ); @@ -1997,6 +2005,7 @@ static void queue_custom_hardware_message( struct desktop *desktop, user_handle_ raw_msg.source = source; raw_msg.time = get_tick_count(); raw_msg.message = input->hw.msg; + raw_msg.hid_report = NULL; msg_data = &raw_msg.data; msg_data->info = 0; @@ -2010,7 +2019,7 @@ static void queue_custom_hardware_message( struct desktop *desktop, user_handle_ return; } - if (!(msg = alloc_hardware_message( 0, source, get_tick_count() ))) return; + if (!(msg = alloc_hardware_message( 0, source, get_tick_count(), 0 ))) return; msg->win = get_user_full_handle( win ); msg->msg = input->hw.msg;
1
0
0
0
Rémi Bernon : user32: Implement WM_INPUT / RIM_TYPEHID message dispatch.
by Alexandre Julliard
31 May '21
31 May '21
Module: wine Branch: master Commit: 1128a37e77bd02e43d0612e506a743508f8ecd4c URL:
https://source.winehq.org/git/wine.git/?a=commit;h=1128a37e77bd02e43d0612e5…
Author: Rémi Bernon <rbernon(a)codeweavers.com> Date: Fri May 28 16:12:19 2021 +0200 user32: Implement WM_INPUT / RIM_TYPEHID message dispatch. Without any HID report data for now. Wine-Bug:
https://bugs.winehq.org/show_bug.cgi?id=50506
Signed-off-by: Rémi Bernon <rbernon(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/user32/message.c | 9 +++++++++ dlls/user32/rawinput.c | 30 ++++++++++++++++++++++++++++++ dlls/user32/user_private.h | 2 ++ server/queue.c | 1 + server/trace.c | 1 + 5 files changed, 43 insertions(+) diff --git a/dlls/user32/message.c b/dlls/user32/message.c index be178072e6f..886c10e36bd 100644 --- a/dlls/user32/message.c +++ b/dlls/user32/message.c @@ -3255,6 +3255,14 @@ NTSTATUS send_hardware_message( HWND hwnd, const INPUT *input, const RAWINPUT *r hid_usage_page = ((USAGE *)rawinput->data.hid.bRawData)[0]; hid_usage = ((USAGE *)rawinput->data.hid.bRawData)[1]; } + if (input->u.hi.uMsg == WM_INPUT) + { + if (!rawinput_device_get_usages( rawinput->header.hDevice, &hid_usage_page, &hid_usage )) + { + WARN( "unable to get HID usages for device %p\n", rawinput->header.hDevice ); + return STATUS_INVALID_HANDLE; + } + } } SERVER_START_REQ( send_hardware_message ) @@ -3284,6 +3292,7 @@ NTSTATUS send_hardware_message( HWND hwnd, const INPUT *input, const RAWINPUT *r req->input.hw.lparam = MAKELONG( input->u.hi.wParamL, input->u.hi.wParamH ); switch (input->u.hi.uMsg) { + case WM_INPUT: case WM_INPUT_DEVICE_CHANGE: req->input.hw.rawinput.type = rawinput->header.dwType; switch (rawinput->header.dwType) diff --git a/dlls/user32/rawinput.c b/dlls/user32/rawinput.c index efc736625d5..87f7175a6c1 100644 --- a/dlls/user32/rawinput.c +++ b/dlls/user32/rawinput.c @@ -267,6 +267,21 @@ static struct device *find_device_from_handle(HANDLE handle) } +BOOL rawinput_device_get_usages(HANDLE handle, USAGE *usage_page, USAGE *usage) +{ + struct device *device; + + *usage_page = *usage = 0; + + if (!(device = find_device_from_handle(handle))) return FALSE; + if (device->info.dwType != RIM_TYPEHID) return FALSE; + + *usage_page = device->info.u.hid.usUsagePage; + *usage = device->info.u.hid.usUsage; + return TRUE; +} + + struct rawinput_thread_data *rawinput_thread_data(void) { struct user_thread_info *thread_info = get_user_thread_info(); @@ -280,6 +295,8 @@ struct rawinput_thread_data *rawinput_thread_data(void) BOOL rawinput_from_hardware_message(RAWINPUT *rawinput, const struct hardware_msg_data *msg_data) { + SIZE_T size; + rawinput->header.dwType = msg_data->rawinput.type; if (msg_data->rawinput.type == RIM_TYPEMOUSE) { @@ -371,6 +388,19 @@ BOOL rawinput_from_hardware_message(RAWINPUT *rawinput, const struct hardware_ms rawinput->data.keyboard.Message = msg_data->rawinput.kbd.message; rawinput->data.keyboard.ExtraInformation = msg_data->info; } + else if (msg_data->rawinput.type == RIM_TYPEHID) + { + size = msg_data->size - sizeof(*msg_data); + if (size > rawinput->header.dwSize - sizeof(*rawinput)) return FALSE; + + rawinput->header.dwSize = FIELD_OFFSET( RAWINPUT, data.hid.bRawData ) + size; + rawinput->header.hDevice = ULongToHandle( msg_data->rawinput.hid.device ); + rawinput->header.wParam = 0; + + rawinput->data.hid.dwCount = 0; + rawinput->data.hid.dwSizeHid = 0; + memcpy( rawinput->data.hid.bRawData, msg_data + 1, size ); + } else { FIXME("Unhandled rawinput type %#x.\n", msg_data->rawinput.type); diff --git a/dlls/user32/user_private.h b/dlls/user32/user_private.h index cb780f0c963..0838ba28b32 100644 --- a/dlls/user32/user_private.h +++ b/dlls/user32/user_private.h @@ -28,6 +28,7 @@ #include "winuser.h" #include "winreg.h" #include "winternl.h" +#include "hidusage.h" #include "wine/heap.h" #define GET_WORD(ptr) (*(const WORD *)(ptr)) @@ -239,6 +240,7 @@ struct tagWND; struct hardware_msg_data; extern BOOL rawinput_from_hardware_message(RAWINPUT *rawinput, const struct hardware_msg_data *msg_data); +extern BOOL rawinput_device_get_usages(HANDLE handle, USAGE *usage_page, USAGE *usage); extern struct rawinput_thread_data *rawinput_thread_data(void); extern void keyboard_init(void) DECLSPEC_HIDDEN; diff --git a/server/queue.c b/server/queue.c index 07d4c7e0885..6c59b02a9b6 100644 --- a/server/queue.c +++ b/server/queue.c @@ -1990,6 +1990,7 @@ static void queue_custom_hardware_message( struct desktop *desktop, user_handle_ switch (input->hw.msg) { + case WM_INPUT: case WM_INPUT_DEVICE_CHANGE: raw_msg.foreground = NULL; raw_msg.desktop = NULL; diff --git a/server/trace.c b/server/trace.c index 7125c6f4370..cebcc217e3a 100644 --- a/server/trace.c +++ b/server/trace.c @@ -436,6 +436,7 @@ static void dump_hw_input( const char *prefix, const hw_input_t *input ) dump_uint64( ",lparam=", &input->hw.lparam ); switch (input->hw.msg) { + case WM_INPUT: case WM_INPUT_DEVICE_CHANGE: dump_rawinput( ",rawinput=", &input->hw.rawinput ); }
1
0
0
0
Rémi Bernon : user32: Inform rawinput_from_hardware_message of available buffer size.
by Alexandre Julliard
31 May '21
31 May '21
Module: wine Branch: master Commit: ae7458aca6d174212b03d37e7daabb8deafb5e0e URL:
https://source.winehq.org/git/wine.git/?a=commit;h=ae7458aca6d174212b03d37e…
Author: Rémi Bernon <rbernon(a)codeweavers.com> Date: Fri May 28 16:12:18 2021 +0200 user32: Inform rawinput_from_hardware_message of available buffer size. Wine-Bug:
https://bugs.winehq.org/show_bug.cgi?id=50506
Signed-off-by: Rémi Bernon <rbernon(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/user32/message.c | 1 + dlls/user32/rawinput.c | 7 +++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/dlls/user32/message.c b/dlls/user32/message.c index 9af33c3291e..be178072e6f 100644 --- a/dlls/user32/message.c +++ b/dlls/user32/message.c @@ -2292,6 +2292,7 @@ static BOOL process_rawinput_message( MSG *msg, UINT hw_id, const struct hardwar if (msg->message == WM_INPUT) { + thread_data->buffer->header.dwSize = RAWINPUT_BUFFER_SIZE; if (!rawinput_from_hardware_message( thread_data->buffer, msg_data )) return FALSE; thread_data->hw_id = hw_id; msg->lParam = (LPARAM)hw_id; diff --git a/dlls/user32/rawinput.c b/dlls/user32/rawinput.c index 115513ea144..efc736625d5 100644 --- a/dlls/user32/rawinput.c +++ b/dlls/user32/rawinput.c @@ -564,7 +564,7 @@ UINT WINAPI DECLSPEC_HOTPATCH GetRawInputBuffer(RAWINPUT *data, UINT *data_size, struct hardware_msg_data *msg_data; struct rawinput_thread_data *thread_data; RAWINPUT *rawinput; - UINT count = 0, rawinput_size, next_size, overhead; + UINT count = 0, remaining, rawinput_size, next_size, overhead; BOOL is_wow64; int i; @@ -617,12 +617,15 @@ UINT WINAPI DECLSPEC_HOTPATCH GetRawInputBuffer(RAWINPUT *data, UINT *data_size, } SERVER_END_REQ; + remaining = *data_size; for (i = 0; i < count; ++i) { - rawinput_from_hardware_message(data, msg_data); + data->header.dwSize = remaining; + if (!rawinput_from_hardware_message(data, msg_data)) break; if (overhead) memmove((char *)&data->data + overhead, &data->data, data->header.dwSize - sizeof(RAWINPUTHEADER)); data->header.dwSize += overhead; + remaining -= data->header.dwSize; data = NEXTRAWINPUTBLOCK(data); msg_data = (struct hardware_msg_data *)((char *)msg_data + msg_data->size); }
1
0
0
0
Rémi Bernon : server: Add hardware_msg_data size for variable size messages.
by Alexandre Julliard
31 May '21
31 May '21
Module: wine Branch: master Commit: e8498788e8dd8be128d3425806dd47315d04f6b0 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=e8498788e8dd8be128d34258…
Author: Rémi Bernon <rbernon(a)codeweavers.com> Date: Fri May 28 16:12:17 2021 +0200 server: Add hardware_msg_data size for variable size messages. Wine-Bug:
https://bugs.winehq.org/show_bug.cgi?id=50506
Signed-off-by: Rémi Bernon <rbernon(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/user32/rawinput.c | 2 +- include/wine/server_protocol.h | 4 +++- server/protocol.def | 2 ++ server/queue.c | 15 ++++++++++----- 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/dlls/user32/rawinput.c b/dlls/user32/rawinput.c index e4e7bad508f..115513ea144 100644 --- a/dlls/user32/rawinput.c +++ b/dlls/user32/rawinput.c @@ -624,7 +624,7 @@ UINT WINAPI DECLSPEC_HOTPATCH GetRawInputBuffer(RAWINPUT *data, UINT *data_size, data->header.dwSize - sizeof(RAWINPUTHEADER)); data->header.dwSize += overhead; data = NEXTRAWINPUTBLOCK(data); - msg_data++; + msg_data = (struct hardware_msg_data *)((char *)msg_data + msg_data->size); } if (count == 0 && next_size == 0) *data_size = 0; diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h index e200bd670fc..96b91c503a9 100644 --- a/include/wine/server_protocol.h +++ b/include/wine/server_protocol.h @@ -292,6 +292,8 @@ union rawinput struct hardware_msg_data { lparam_t info; + data_size_t size; + int __pad; unsigned int hw_id; unsigned int flags; struct hw_msg_source source; @@ -6307,7 +6309,7 @@ union generic_reply /* ### protocol_version begin ### */ -#define SERVER_PROTOCOL_VERSION 708 +#define SERVER_PROTOCOL_VERSION 709 /* ### protocol_version end ### */ diff --git a/server/protocol.def b/server/protocol.def index 93e2f56e037..142064d30d3 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -308,6 +308,8 @@ union rawinput struct hardware_msg_data { lparam_t info; /* extra info */ + data_size_t size; /* size of hardware message data */ + int __pad; unsigned int hw_id; /* unique id */ unsigned int flags; /* hook flags */ struct hw_msg_source source; /* message source */ diff --git a/server/queue.c b/server/queue.c index 5d65e030112..07d4c7e0885 100644 --- a/server/queue.c +++ b/server/queue.c @@ -367,6 +367,7 @@ static struct message *alloc_hardware_message( lparam_t info, struct hw_msg_sour memset( msg_data, 0, sizeof(*msg_data) ); msg_data->info = info; + msg_data->size = msg->data_size; msg_data->source = source; return msg; } @@ -1794,6 +1795,7 @@ static int queue_mouse_message( struct desktop *desktop, user_handle_t win, cons msg_data = &raw_msg.data; msg_data->info = input->mouse.info; + msg_data->size = sizeof(*msg_data); msg_data->flags = flags; msg_data->rawinput.type = RIM_TYPEMOUSE; msg_data->rawinput.mouse.x = x - desktop->cursor.x; @@ -1929,6 +1931,7 @@ static int queue_keyboard_message( struct desktop *desktop, user_handle_t win, c msg_data = &raw_msg.data; msg_data->info = input->kbd.info; + msg_data->size = sizeof(*msg_data); msg_data->flags = input->kbd.flags; msg_data->rawinput.type = RIM_TYPEKEYBOARD; msg_data->rawinput.kbd.message = message_code; @@ -1996,6 +1999,7 @@ static void queue_custom_hardware_message( struct desktop *desktop, user_handle_ msg_data = &raw_msg.data; msg_data->info = 0; + msg_data->size = sizeof(*msg_data); msg_data->flags = 0; msg_data->rawinput = input->hw.rawinput; @@ -3295,16 +3299,17 @@ DECL_HANDLER(get_rawinput_buffer) { struct message *msg = LIST_ENTRY( ptr, struct message, entry ); struct hardware_msg_data *data = msg->data; + data_size_t extra_size = data->size - sizeof(*data); ptr = list_next( &input->msg_list, ptr ); if (msg->msg != WM_INPUT) continue; - next_size = req->rawinput_size; + next_size = req->rawinput_size + extra_size; if (size + next_size > req->buffer_size) break; - if (cur + sizeof(*data) > buf + get_reply_max_size()) break; - if (cur + sizeof(*data) > buf + buf_size) + if (cur + data->size > buf + get_reply_max_size()) break; + if (cur + data->size > buf + buf_size) { - buf_size += buf_size / 2; + buf_size += buf_size / 2 + extra_size; if (!(tmp = realloc( buf, buf_size ))) { set_error( STATUS_NO_MEMORY ); @@ -3314,7 +3319,7 @@ DECL_HANDLER(get_rawinput_buffer) buf = tmp; } - memcpy(cur, data, sizeof(*data)); + memcpy( cur, data, data->size ); list_remove( &msg->entry ); free_message( msg );
1
0
0
0
Roberto Pungartnik : ntdll: Fix IOCTL_AFD_WINE_SENDMSG irda member misreference.
by Alexandre Julliard
31 May '21
31 May '21
Module: wine Branch: master Commit: c2351cd9b44910a9be03f0c84e7fbb992a783adf URL:
https://source.winehq.org/git/wine.git/?a=commit;h=c2351cd9b44910a9be03f0c8…
Author: Roberto Pungartnik <rpungartnik(a)gmail.com> Date: Sat May 29 12:43:54 2021 -0300 ntdll: Fix IOCTL_AFD_WINE_SENDMSG irda member misreference. Signed-off-by: Roberto Augusto Pungartnik <rpungartnik(a)gmail.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/ntdll/unix/socket.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dlls/ntdll/unix/socket.c b/dlls/ntdll/unix/socket.c index 6112a1260cb..db65752a031 100644 --- a/dlls/ntdll/unix/socket.c +++ b/dlls/ntdll/unix/socket.c @@ -255,10 +255,10 @@ static socklen_t sockaddr_to_unix( const struct WS_sockaddr *wsaddr, int wsaddrl memcpy( &win, wsaddr, sizeof(win) ); uaddr->irda.sir_family = AF_IRDA; if (sscanf( win.irdaServiceName, "LSAP-SEL%u", &lsap_sel ) == 1) - uaddr->sir_lsap_sel = lsap_sel; + uaddr->irda.sir_lsap_sel = lsap_sel; else { - uaddr->sir_lsap_sel = LSAP_ANY; + uaddr->irda.sir_lsap_sel = LSAP_ANY; memcpy( uaddr->irda.sir_name, win.irdaServiceName, sizeof(win.irdaServiceName) ); } memcpy( &uaddr->irda.sir_addr, win.irdaDeviceID, sizeof(win.irdaDeviceID) );
1
0
0
0
Rémi Bernon : dinput: Rename wReserved to wReportId in DIDEVICEOBJECTINSTANCE.
by Alexandre Julliard
31 May '21
31 May '21
Module: wine Branch: master Commit: 2d629228ddd71d8c308da755c91b667a895dc4f8 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=2d629228ddd71d8c308da755…
Author: Rémi Bernon <rbernon(a)codeweavers.com> Date: Mon May 31 10:23:59 2021 +0200 dinput: Rename wReserved to wReportId in DIDEVICEOBJECTINSTANCE. Signed-off-by: Rémi Bernon <rbernon(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/dinput/ansi.c | 2 +- include/dinput.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dlls/dinput/ansi.c b/dlls/dinput/ansi.c index 431b812aeb2..390b2f56581 100644 --- a/dlls/dinput/ansi.c +++ b/dlls/dinput/ansi.c @@ -92,7 +92,7 @@ static void dideviceobjectinstance_wtoa( const DIDEVICEOBJECTINSTANCEW *in, DIDE out->wUsage = in->wUsage; out->dwDimension = in->dwDimension; out->wExponent = in->wExponent; - out->wReserved = in->wReserved; + out->wReportId = in->wReportId; } static void dideviceinstance_wtoa( const DIDEVICEINSTANCEW *in, DIDEVICEINSTANCEA *out ) diff --git a/include/dinput.h b/include/dinput.h index 2d183bbc944..a073054b388 100644 --- a/include/dinput.h +++ b/include/dinput.h @@ -358,7 +358,7 @@ typedef struct DIDEVICEOBJECTINSTANCEA { WORD wUsage; DWORD dwDimension; WORD wExponent; - WORD wReserved; + WORD wReportId; } DIDEVICEOBJECTINSTANCEA, *LPDIDEVICEOBJECTINSTANCEA; typedef const DIDEVICEOBJECTINSTANCEA *LPCDIDEVICEOBJECTINSTANCEA; @@ -377,7 +377,7 @@ typedef struct DIDEVICEOBJECTINSTANCEW { WORD wUsage; DWORD dwDimension; WORD wExponent; - WORD wReserved; + WORD wReportId; } DIDEVICEOBJECTINSTANCEW, *LPDIDEVICEOBJECTINSTANCEW; typedef const DIDEVICEOBJECTINSTANCEW *LPCDIDEVICEOBJECTINSTANCEW;
1
0
0
0
← Newer
1
2
3
4
5
6
...
77
Older →
Jump to page:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
Results per page:
10
25
50
100
200