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
September 2023
----- 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
1 participants
920 discussions
Start a n
N
ew thread
Francisco Casas : vkd3d-shader/spirv: Use vsir_register_init() in spirv_compiler_emit_dcl_immediate_constant_buffer().
by Alexandre Julliard
26 Sep '23
26 Sep '23
Module: vkd3d Branch: master Commit: b2f262467f802122a6cadd4783497287da61384a URL:
https://gitlab.winehq.org/wine/vkd3d/-/commit/b2f262467f802122a6cadd4783497…
Author: Francisco Casas <fcasas(a)codeweavers.com> Date: Tue Sep 5 12:19:54 2023 -0300 vkd3d-shader/spirv: Use vsir_register_init() in spirv_compiler_emit_dcl_immediate_constant_buffer(). --- libs/vkd3d-shader/spirv.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c index 432c8a46..d0813dd7 100644 --- a/libs/vkd3d-shader/spirv.c +++ b/libs/vkd3d-shader/spirv.c @@ -5693,8 +5693,7 @@ static void spirv_compiler_emit_dcl_immediate_constant_buffer(struct spirv_compi vkd3d_spirv_build_op_name(builder, icb_id, "icb"); vkd3d_free(elements); - memset(®, 0, sizeof(reg)); - reg.type = VKD3DSPR_IMMCONSTBUFFER; + vsir_register_init(®, VKD3DSPR_IMMCONSTBUFFER, VKD3D_DATA_FLOAT, 0); vkd3d_symbol_make_register(®_symbol, ®); vkd3d_symbol_set_register_info(®_symbol, icb_id, SpvStorageClassPrivate, VKD3D_SHADER_COMPONENT_FLOAT, VKD3DSP_WRITEMASK_ALL);
1
0
0
0
Francisco Casas : vkd3d-shader/spirv: Use vsir_register_init() in spirv_compiler_emit_cbv_declaration().
by Alexandre Julliard
26 Sep '23
26 Sep '23
Module: vkd3d Branch: master Commit: 67f0196c3352e7246e3d4bc86f5d2f7a53e6a54c URL:
https://gitlab.winehq.org/wine/vkd3d/-/commit/67f0196c3352e7246e3d4bc86f5d2…
Author: Francisco Casas <fcasas(a)codeweavers.com> Date: Tue Sep 5 12:19:11 2023 -0300 vkd3d-shader/spirv: Use vsir_register_init() in spirv_compiler_emit_cbv_declaration(). --- libs/vkd3d-shader/spirv.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c index f3e07164..432c8a46 100644 --- a/libs/vkd3d-shader/spirv.c +++ b/libs/vkd3d-shader/spirv.c @@ -5623,15 +5623,12 @@ static void spirv_compiler_emit_cbv_declaration(struct spirv_compiler *compiler, const SpvStorageClass storage_class = SpvStorageClassUniform; struct vkd3d_push_constant_buffer_binding *push_cb; struct vkd3d_descriptor_variable_info var_info; + struct vkd3d_shader_register reg; struct vkd3d_symbol reg_symbol; unsigned int size; - struct vkd3d_shader_register reg = - { - .type = VKD3DSPR_CONSTBUFFER, - .idx[0].offset = register_id, - .idx_count = 1, - }; + vsir_register_init(®, VKD3DSPR_CONSTBUFFER, VKD3D_DATA_FLOAT, 1); + reg.idx[0].offset = register_id; size = size_in_bytes / (VKD3D_VEC4_SIZE * sizeof(uint32_t));
1
0
0
0
Francisco Casas : vkd3d-shader/spirv: Use vsir_register_init() in spirv_compiler_emit_dcl_indexable_temp().
by Alexandre Julliard
26 Sep '23
26 Sep '23
Module: vkd3d Branch: master Commit: 04529bc0b73c3c54691a13246e79f6d1d56bbb6b URL:
https://gitlab.winehq.org/wine/vkd3d/-/commit/04529bc0b73c3c54691a13246e79f…
Author: Francisco Casas <fcasas(a)codeweavers.com> Date: Tue Sep 5 12:18:28 2023 -0300 vkd3d-shader/spirv: Use vsir_register_init() in spirv_compiler_emit_dcl_indexable_temp(). --- libs/vkd3d-shader/spirv.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c index 3ce8b9c9..f3e07164 100644 --- a/libs/vkd3d-shader/spirv.c +++ b/libs/vkd3d-shader/spirv.c @@ -5443,11 +5443,8 @@ static void spirv_compiler_emit_dcl_indexable_temp(struct spirv_compiler *compil if (temp->component_count != 4) FIXME("Unhandled component count %u.\n", temp->component_count); - memset(®, 0, sizeof(reg)); - reg.type = VKD3DSPR_IDXTEMP; + vsir_register_init(®, VKD3DSPR_IDXTEMP, VKD3D_DATA_FLOAT, 1); reg.idx[0].offset = temp->register_idx; - reg.idx[1].offset = ~0u; - reg.idx_count = 1; function_location = spirv_compiler_get_current_function_location(compiler); vkd3d_spirv_begin_function_stream_insertion(builder, function_location);
1
0
0
0
Francisco Casas : vkd3d-shader/spirv: Use vsir_register_init() in spirv_compiler_emit_hull_shader_builtins().
by Alexandre Julliard
26 Sep '23
26 Sep '23
Module: vkd3d Branch: master Commit: e174f6b413fe83b9a612dfacb70d77b613120e5b URL:
https://gitlab.winehq.org/wine/vkd3d/-/commit/e174f6b413fe83b9a612dfacb70d7…
Author: Francisco Casas <fcasas(a)codeweavers.com> Date: Tue Sep 5 12:17:39 2023 -0300 vkd3d-shader/spirv: Use vsir_register_init() in spirv_compiler_emit_hull_shader_builtins(). --- libs/vkd3d-shader/spirv.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c index 62f04d02..3ce8b9c9 100644 --- a/libs/vkd3d-shader/spirv.c +++ b/libs/vkd3d-shader/spirv.c @@ -5308,10 +5308,7 @@ static void spirv_compiler_emit_hull_shader_builtins(struct spirv_compiler *comp struct vkd3d_shader_dst_param dst; memset(&dst, 0, sizeof(dst)); - dst.reg.type = VKD3DSPR_OUTPOINTID; - dst.reg.idx[0].offset = ~0u; - dst.reg.idx[1].offset = ~0u; - dst.reg.idx_count = 0; + vsir_register_init(&dst.reg, VKD3DSPR_OUTPOINTID, VKD3D_DATA_FLOAT, 0); dst.write_mask = VKD3DSP_WRITEMASK_0; spirv_compiler_emit_input_register(compiler, &dst); }
1
0
0
0
Francisco Casas : vkd3d-shader/spirv: Use vsir_register_init() in spirv_compiler_get_invocation_id().
by Alexandre Julliard
26 Sep '23
26 Sep '23
Module: vkd3d Branch: master Commit: 89d7bd7a8121be57751ee53b17e99e810d53b45f URL:
https://gitlab.winehq.org/wine/vkd3d/-/commit/89d7bd7a8121be57751ee53b17e99…
Author: Francisco Casas <fcasas(a)codeweavers.com> Date: Tue Sep 5 12:16:58 2023 -0300 vkd3d-shader/spirv: Use vsir_register_init() in spirv_compiler_get_invocation_id(). --- libs/vkd3d-shader/spirv.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c index 50c9c622..62f04d02 100644 --- a/libs/vkd3d-shader/spirv.c +++ b/libs/vkd3d-shader/spirv.c @@ -4411,11 +4411,7 @@ static uint32_t spirv_compiler_get_invocation_id(struct spirv_compiler *compiler assert(compiler->shader_type == VKD3D_SHADER_TYPE_HULL); - memset(&r, 0, sizeof(r)); - r.type = VKD3DSPR_OUTPOINTID; - r.idx[0].offset = ~0u; - r.idx[1].offset = ~0u; - r.idx_count = 0; + vsir_register_init(&r, VKD3DSPR_OUTPOINTID, VKD3D_DATA_FLOAT, 0); return spirv_compiler_get_register_id(compiler, &r); }
1
0
0
0
Francisco Casas : vkd3d-shader: Rename shader_register_init() to vsir_register_init().
by Alexandre Julliard
26 Sep '23
26 Sep '23
Module: vkd3d Branch: master Commit: 5d6899888d17a011d66e6d408086b0f704affe4d URL:
https://gitlab.winehq.org/wine/vkd3d/-/commit/5d6899888d17a011d66e6d408086b…
Author: Francisco Casas <fcasas(a)codeweavers.com> Date: Tue Aug 29 13:20:44 2023 -0400 vkd3d-shader: Rename shader_register_init() to vsir_register_init(). --- libs/vkd3d-shader/dxil.c | 6 +++--- libs/vkd3d-shader/ir.c | 6 +++--- libs/vkd3d-shader/vkd3d_shader_private.h | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/libs/vkd3d-shader/dxil.c b/libs/vkd3d-shader/dxil.c index e3a04f26..8ce54edc 100644 --- a/libs/vkd3d-shader/dxil.c +++ b/libs/vkd3d-shader/dxil.c @@ -1590,7 +1590,7 @@ static struct vkd3d_shader_dst_param *instruction_dst_params_alloc(struct vkd3d_ static void register_init_with_id(struct vkd3d_shader_register *reg, enum vkd3d_shader_register_type reg_type, enum vkd3d_data_type data_type, unsigned int id) { - shader_register_init(reg, reg_type, data_type, 1); + vsir_register_init(reg, reg_type, data_type, 1); reg->idx[0].offset = id; } @@ -2119,7 +2119,7 @@ static void dst_param_io_init(struct vkd3d_shader_dst_param *param, param->shift = 0; /* DXIL types do not have signedness. Load signed elements as unsigned. */ component_type = e->component_type == VKD3D_SHADER_COMPONENT_INT ? VKD3D_SHADER_COMPONENT_UINT : e->component_type; - shader_register_init(¶m->reg, reg_type, vkd3d_data_type_from_component_type(component_type), 0); + vsir_register_init(¶m->reg, reg_type, vkd3d_data_type_from_component_type(component_type), 0); } static void sm6_parser_init_signature(struct sm6_parser *sm6, const struct shader_signature *s, @@ -2396,7 +2396,7 @@ static void sm6_parser_emit_unhandled(struct sm6_parser *sm6, struct vkd3d_shade return; type = sm6_type_get_scalar_type(dst->type, 0); - shader_register_init(&dst->u.reg, VKD3DSPR_UNDEF, vkd3d_data_type_from_sm6_type(type), 0); + vsir_register_init(&dst->u.reg, VKD3DSPR_UNDEF, vkd3d_data_type_from_sm6_type(type), 0); /* dst->is_undefined is not set here because it flags only explicitly undefined values. */ } diff --git a/libs/vkd3d-shader/ir.c b/libs/vkd3d-shader/ir.c index fd09b70e..0073a2c7 100644 --- a/libs/vkd3d-shader/ir.c +++ b/libs/vkd3d-shader/ir.c @@ -296,7 +296,7 @@ static enum vkd3d_result flattener_flatten_phases(struct hull_flattener *normali return VKD3D_OK; } -void shader_register_init(struct vkd3d_shader_register *reg, enum vkd3d_shader_register_type reg_type, +void vsir_register_init(struct vkd3d_shader_register *reg, enum vkd3d_shader_register_type reg_type, enum vkd3d_data_type data_type, unsigned int idx_count) { reg->type = reg_type; @@ -372,7 +372,7 @@ static struct vkd3d_shader_src_param *instruction_array_create_outpointid_param( if (!(rel_addr = shader_src_param_allocator_get(&instructions->src_params, 1))) return NULL; - shader_register_init(&rel_addr->reg, VKD3DSPR_OUTPOINTID, VKD3D_DATA_UINT, 0); + vsir_register_init(&rel_addr->reg, VKD3DSPR_OUTPOINTID, VKD3D_DATA_UINT, 0); rel_addr->swizzle = 0; rel_addr->modifiers = 0; @@ -402,7 +402,7 @@ static void shader_dst_param_io_init(struct vkd3d_shader_dst_param *param, const param->write_mask = e->mask; param->modifiers = 0; param->shift = 0; - shader_register_init(¶m->reg, reg_type, vkd3d_data_type_from_component_type(e->component_type), idx_count); + vsir_register_init(¶m->reg, reg_type, vkd3d_data_type_from_component_type(e->component_type), idx_count); } static enum vkd3d_result control_point_normaliser_emit_hs_input(struct control_point_normaliser *normaliser, diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h index 6bc5f6d1..80e0bc2b 100644 --- a/libs/vkd3d-shader/vkd3d_shader_private.h +++ b/libs/vkd3d-shader/vkd3d_shader_private.h @@ -751,7 +751,7 @@ struct vkd3d_shader_register } u; }; -void shader_register_init(struct vkd3d_shader_register *reg, enum vkd3d_shader_register_type reg_type, +void vsir_register_init(struct vkd3d_shader_register *reg, enum vkd3d_shader_register_type reg_type, enum vkd3d_data_type data_type, unsigned int idx_count); struct vkd3d_shader_dst_param
1
0
0
0
Eric Pouech : winedump: Improve dumping DEBUG directory entries in PE images.
by Alexandre Julliard
25 Sep '23
25 Sep '23
Module: wine Branch: master Commit: 81c8c73de299c0d61d1fff8ad9b88a9deb5b9479 URL:
https://gitlab.winehq.org/wine/wine/-/commit/81c8c73de299c0d61d1fff8ad9b88a…
Author: Eric Pouech <epouech(a)codeweavers.com> Date: Mon Sep 25 17:48:44 2023 +0200 winedump: Improve dumping DEBUG directory entries in PE images. - always add a data dump for unknown structures - add some bits about POGO and REPRO entries - protect against too small structures Signed-off-by: Eric Pouech <epouech(a)codeweavers.com> --- include/wine/mscvpdb.h | 10 ++++++++ tools/winedump/pe.c | 63 +++++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 62 insertions(+), 11 deletions(-) diff --git a/include/wine/mscvpdb.h b/include/wine/mscvpdb.h index 29dd83e73b9..3502e0faed0 100644 --- a/include/wine/mscvpdb.h +++ b/include/wine/mscvpdb.h @@ -2820,3 +2820,13 @@ typedef struct OMFSourceModule unsigned short cSeg; unsigned int baseSrcFile[1]; } OMFSourceModule; + + +/* undocumented. IMAGE_DEBUG_TYPE_REPRO directory entry */ +typedef struct +{ + unsigned flags; /* only seen 0x20 */ + GUID guid; /* guid used in CODEVIEW debug entry */ + unsigned unk[3]; /* unknown, potentially hash of some internal parts of image */ + unsigned debug_timestamp; /* used in all DEBUG entries as timestamp (including this one) */ +} IMAGE_DEBUG_REPRO; diff --git a/tools/winedump/pe.c b/tools/winedump/pe.c index f361e1d86bd..3defdcd664b 100644 --- a/tools/winedump/pe.c +++ b/tools/winedump/pe.c @@ -2169,17 +2169,58 @@ static void dump_dir_debug_dir(const IMAGE_DEBUG_DIRECTORY* idd, int idx) dump_frame_pointer_omission(idd->PointerToRawData, idd->SizeOfData); break; case IMAGE_DEBUG_TYPE_MISC: - { - const IMAGE_DEBUG_MISC* misc = PRD(idd->PointerToRawData, idd->SizeOfData); - if (!misc) {printf("Can't get misc debug information\n"); break;} - printf(" DataType: %u (%s)\n", - (UINT)misc->DataType, (misc->DataType == IMAGE_DEBUG_MISC_EXENAME) ? "Exe name" : "Unknown"); - printf(" Length: %u\n", (UINT)misc->Length); - printf(" Unicode: %s\n", misc->Unicode ? "Yes" : "No"); - printf(" Data: %s\n", misc->Data); - } - break; - default: break; + { + const IMAGE_DEBUG_MISC* misc = PRD(idd->PointerToRawData, idd->SizeOfData); + if (!misc || idd->SizeOfData < sizeof(*misc)) {printf("Can't get MISC debug information\n"); break;} + printf(" DataType: %u (%s)\n", + (UINT)misc->DataType, (misc->DataType == IMAGE_DEBUG_MISC_EXENAME) ? "Exe name" : "Unknown"); + printf(" Length: %u\n", (UINT)misc->Length); + printf(" Unicode: %s\n", misc->Unicode ? "Yes" : "No"); + printf(" Data: %s\n", misc->Data); + } + break; + case IMAGE_DEBUG_TYPE_POGO: + { + const unsigned* data = PRD(idd->PointerToRawData, idd->SizeOfData); + const unsigned* end = (const unsigned*)((const unsigned char*)data + idd->SizeOfData); + unsigned idx = 0; + + if (!data || idd->SizeOfData < sizeof(unsigned)) {printf("Can't get PODO debug information\n"); break;} + printf(" Header: %08x\n", *(const unsigned*)data); + data++; + printf(" Index Name Offset Size\n"); + while (data + 2 < end) + { + const char* ptr; + ptrdiff_t s; + + if (!(ptr = memchr(&data[2], '\0', (const char*)end - (const char*)&data[2]))) break; + printf(" %-5u %-16s %08x %08x\n", idx, (const char*)&data[2], data[0], data[1]); + s = ptr - (const char*)&data[2] + 1; + data += 2 + ((s + sizeof(unsigned) - 1) / sizeof(unsigned)); + idx++; + } + } + break; + case IMAGE_DEBUG_TYPE_REPRO: + { + const IMAGE_DEBUG_REPRO* repro = PRD(idd->PointerToRawData, idd->SizeOfData); + if (!repro || idd->SizeOfData < sizeof(*repro)) {printf("Can't get REPRO debug information\n"); break;} + printf(" Flags: %08X\n", repro->flags); + printf(" Guid: %s\n", get_guid_str(&repro->guid)); + printf(" _unk0: %08X %u\n", repro->unk[0], repro->unk[0]); + printf(" _unk1: %08X %u\n", repro->unk[1], repro->unk[1]); + printf(" _unk2: %08X %u\n", repro->unk[2], repro->unk[2]); + printf(" Timestamp: %08X\n", repro->debug_timestamp); + } + break; + default: + { + const unsigned char* data = PRD(idd->PointerToRawData, idd->SizeOfData); + if (!data) {printf("Can't get debug information for %s\n", str); break;} + dump_data(data, idd->SizeOfData, " "); + } + break; } printf("\n"); }
1
0
0
0
Connor McAdams : uiautomationcore: Make sure event thread is started when listening for WinEvents.
by Alexandre Julliard
25 Sep '23
25 Sep '23
Module: wine Branch: master Commit: fded7c1d713c943e7e28e3d51143a5da23f20fbb URL:
https://gitlab.winehq.org/wine/wine/-/commit/fded7c1d713c943e7e28e3d51143a5…
Author: Connor McAdams <cmcadams(a)codeweavers.com> Date: Thu Sep 14 11:24:41 2023 -0400 uiautomationcore: Make sure event thread is started when listening for WinEvents. Signed-off-by: Connor McAdams <cmcadams(a)codeweavers.com> --- dlls/uiautomationcore/uia_event.c | 19 ++++++++++++++----- dlls/uiautomationcore/uia_private.h | 1 + 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/dlls/uiautomationcore/uia_event.c b/dlls/uiautomationcore/uia_event.c index 796a74d86fc..96b6ac448aa 100644 --- a/dlls/uiautomationcore/uia_event.c +++ b/dlls/uiautomationcore/uia_event.c @@ -79,8 +79,12 @@ static BOOL CALLBACK uia_win_event_enum_top_level_hwnds(HWND hwnd, LPARAM lparam return TRUE; } +static BOOL uia_clientside_event_start_event_thread(struct uia_event *event); HRESULT uia_event_add_win_event_hwnd(struct uia_event *event, HWND hwnd) { + if (!uia_clientside_event_start_event_thread(event)) + return E_FAIL; + if (hwnd == GetDesktopWindow()) EnumWindows(uia_win_event_enum_top_level_hwnds, (LPARAM)&event->u.clientside.win_event_hwnd_map); @@ -630,6 +634,14 @@ static void uia_stop_event_thread(void) LeaveCriticalSection(&event_thread_cs); } +static BOOL uia_clientside_event_start_event_thread(struct uia_event *event) +{ + if (!event->u.clientside.event_thread_started) + event->u.clientside.event_thread_started = uia_start_event_thread(); + + return event->u.clientside.event_thread_started; +} + /* * IWineUiaEvent interface. */ @@ -679,7 +691,7 @@ static ULONG WINAPI uia_event_Release(IWineUiaEvent *iface) if (event->event_type == EVENT_TYPE_CLIENTSIDE) { uia_cache_request_destroy(&event->u.clientside.cache_req); - if (event->u.clientside.git_cookie) + if (event->u.clientside.event_thread_started) uia_stop_event_thread(); uia_hwnd_map_destroy(&event->u.clientside.win_event_hwnd_map); } @@ -1160,16 +1172,13 @@ HRESULT uia_event_add_serverside_event_adviser(IWineUiaEvent *serverside_event, */ if (!event->u.clientside.git_cookie) { - if (!uia_start_event_thread()) + if (!uia_clientside_event_start_event_thread(event)) return E_FAIL; hr = register_interface_in_git((IUnknown *)&event->IWineUiaEvent_iface, &IID_IWineUiaEvent, &event->u.clientside.git_cookie); if (FAILED(hr)) - { - uia_stop_event_thread(); return hr; - } } if (!(adv_events = calloc(1, sizeof(*adv_events)))) diff --git a/dlls/uiautomationcore/uia_private.h b/dlls/uiautomationcore/uia_private.h index bd88dff30e3..c298967be00 100644 --- a/dlls/uiautomationcore/uia_private.h +++ b/dlls/uiautomationcore/uia_private.h @@ -142,6 +142,7 @@ struct uia_event void *callback_data; struct rb_tree win_event_hwnd_map; + BOOL event_thread_started; DWORD git_cookie; } clientside; struct {
1
0
0
0
Connor McAdams : uiautomationcore: Track HWNDs that need WinEvent translation.
by Alexandre Julliard
25 Sep '23
25 Sep '23
Module: wine Branch: master Commit: 81caccbf840d14abede843d4399b650e73bc52ba URL:
https://gitlab.winehq.org/wine/wine/-/commit/81caccbf840d14abede843d4399b65…
Author: Connor McAdams <cmcadams(a)codeweavers.com> Date: Wed Sep 13 13:49:31 2023 -0400 uiautomationcore: Track HWNDs that need WinEvent translation. Signed-off-by: Connor McAdams <cmcadams(a)codeweavers.com> --- dlls/uiautomationcore/uia_client.c | 4 ++ dlls/uiautomationcore/uia_event.c | 25 ++++++++++++ dlls/uiautomationcore/uia_private.h | 7 ++++ dlls/uiautomationcore/uia_utils.c | 79 +++++++++++++++++++++++++++++++++++++ 4 files changed, 115 insertions(+) diff --git a/dlls/uiautomationcore/uia_client.c b/dlls/uiautomationcore/uia_client.c index 6ec675e197e..09e0d179172 100644 --- a/dlls/uiautomationcore/uia_client.c +++ b/dlls/uiautomationcore/uia_client.c @@ -1870,6 +1870,9 @@ static HRESULT WINAPI uia_provider_attach_event(IWineUiaProvider *iface, LONG_PT &IID_IProxyProviderWinEventHandler, (void **)&winevent_handler))) { FIXME("MSAA to UIA event bridge currently unimplemented\n"); + hr = uia_event_add_win_event_hwnd(event, prov->hwnd); + if (FAILED(hr)) + WARN("Failed to add hwnd for win_event, hr %#lx\n", hr); IProxyProviderWinEventHandler_Release(winevent_handler); } else if (SUCCEEDED(IRawElementProviderFragmentRoot_QueryInterface(elroot, &IID_IRawElementProviderAdviseEvents, @@ -1954,6 +1957,7 @@ static HRESULT create_wine_uia_provider(struct uia_node *node, IRawElementProvid prov->IWineUiaProvider_iface.lpVtbl = &uia_provider_vtbl; prov->elprov = elprov; prov->ref = 1; + prov->hwnd = node->hwnd; node->prov[prov_type] = &prov->IWineUiaProvider_iface; if (!node->prov_count) node->creator_prov_type = prov_type; diff --git a/dlls/uiautomationcore/uia_event.c b/dlls/uiautomationcore/uia_event.c index 04067f39e0e..796a74d86fc 100644 --- a/dlls/uiautomationcore/uia_event.c +++ b/dlls/uiautomationcore/uia_event.c @@ -64,6 +64,29 @@ static int win_event_to_uia_event_id(int win_event) return 0; } +static BOOL CALLBACK uia_win_event_enum_top_level_hwnds(HWND hwnd, LPARAM lparam) +{ + struct rb_tree *hwnd_map = (struct rb_tree *)lparam; + HRESULT hr; + + if (!uia_hwnd_is_visible(hwnd)) + return TRUE; + + hr = uia_hwnd_map_add_hwnd(hwnd_map, hwnd); + if (FAILED(hr)) + WARN("Failed to add hwnd to map, hr %#lx\n", hr); + + return TRUE; +} + +HRESULT uia_event_add_win_event_hwnd(struct uia_event *event, HWND hwnd) +{ + if (hwnd == GetDesktopWindow()) + EnumWindows(uia_win_event_enum_top_level_hwnds, (LPARAM)&event->u.clientside.win_event_hwnd_map); + + return uia_hwnd_map_add_hwnd(&event->u.clientside.win_event_hwnd_map, hwnd); +} + /* * UI Automation event map. */ @@ -658,6 +681,7 @@ static ULONG WINAPI uia_event_Release(IWineUiaEvent *iface) uia_cache_request_destroy(&event->u.clientside.cache_req); if (event->u.clientside.git_cookie) uia_stop_event_thread(); + uia_hwnd_map_destroy(&event->u.clientside.win_event_hwnd_map); } else { @@ -834,6 +858,7 @@ static HRESULT create_clientside_uia_event(struct uia_event **out_event, int eve event->scope = scope; event->u.clientside.event_callback = cback; event->u.clientside.callback_data = cback_data; + uia_hwnd_map_init(&event->u.clientside.win_event_hwnd_map); *out_event = event; return S_OK; diff --git a/dlls/uiautomationcore/uia_private.h b/dlls/uiautomationcore/uia_private.h index e8bb4845189..bd88dff30e3 100644 --- a/dlls/uiautomationcore/uia_private.h +++ b/dlls/uiautomationcore/uia_private.h @@ -95,6 +95,7 @@ struct uia_provider { BOOL return_nested_node; BOOL parent_check_ran; BOOL has_parent; + HWND hwnd; }; static inline struct uia_provider *impl_from_IWineUiaProvider(IWineUiaProvider *iface) @@ -140,6 +141,7 @@ struct uia_event HRESULT (*event_callback)(struct uia_event *, struct uia_event_args *, SAFEARRAY *, BSTR); void *callback_data; + struct rb_tree win_event_hwnd_map; DWORD git_cookie; } clientside; struct { @@ -218,6 +220,7 @@ BOOL uia_condition_matched(HRESULT hr) DECLSPEC_HIDDEN; HRESULT create_uia_iface(IUnknown **iface, BOOL is_cui8) DECLSPEC_HIDDEN; /* uia_event.c */ +HRESULT uia_event_add_win_event_hwnd(struct uia_event *event, HWND hwnd) DECLSPEC_HIDDEN; HRESULT create_serverside_uia_event(struct uia_event **out_event, LONG process_id, LONG event_cookie) DECLSPEC_HIDDEN; HRESULT uia_event_add_provider_event_adviser(IRawElementProviderAdviseEvents *advise_events, struct uia_event *event) DECLSPEC_HIDDEN; @@ -250,3 +253,7 @@ HRESULT uia_cache_request_clone(struct UiaCacheRequest *dst, struct UiaCacheRequ HRESULT get_safearray_dim_bounds(SAFEARRAY *sa, UINT dim, LONG *lbound, LONG *elems) DECLSPEC_HIDDEN; HRESULT get_safearray_bounds(SAFEARRAY *sa, LONG *lbound, LONG *elems) DECLSPEC_HIDDEN; int uia_compare_safearrays(SAFEARRAY *sa1, SAFEARRAY *sa2, int prop_type) DECLSPEC_HIDDEN; +BOOL uia_hwnd_is_visible(HWND hwnd) DECLSPEC_HIDDEN; +HRESULT uia_hwnd_map_add_hwnd(struct rb_tree *hwnd_map, HWND hwnd) DECLSPEC_HIDDEN; +void uia_hwnd_map_init(struct rb_tree *hwnd_map) DECLSPEC_HIDDEN; +void uia_hwnd_map_destroy(struct rb_tree *hwnd_map) DECLSPEC_HIDDEN; diff --git a/dlls/uiautomationcore/uia_utils.c b/dlls/uiautomationcore/uia_utils.c index 9f27d6a0b34..9840fe4fe40 100644 --- a/dlls/uiautomationcore/uia_utils.c +++ b/dlls/uiautomationcore/uia_utils.c @@ -384,3 +384,82 @@ int uia_compare_safearrays(SAFEARRAY *sa1, SAFEARRAY *sa2, int prop_type) return 0; } + +/* + * HWND related helper functions. + */ +BOOL uia_hwnd_is_visible(HWND hwnd) +{ + RECT rect; + + if (!IsWindowVisible(hwnd)) + return FALSE; + + if (!GetWindowRect(hwnd, &rect)) + return FALSE; + + if ((rect.right - rect.left) <= 0 || (rect.bottom - rect.top) <= 0) + return FALSE; + + return TRUE; +} + +/* + * rbtree to efficiently store a collection of HWNDs. + */ +struct uia_hwnd_map_entry +{ + struct rb_entry entry; + HWND hwnd; +}; + +static int uia_hwnd_map_hwnd_compare(const void *key, const struct rb_entry *entry) +{ + struct uia_hwnd_map_entry *hwnd_entry = RB_ENTRY_VALUE(entry, struct uia_hwnd_map_entry, entry); + HWND hwnd = (HWND)key; + + return (hwnd_entry->hwnd > hwnd) - (hwnd_entry->hwnd < hwnd); +} + +static void uia_hwnd_map_free(struct rb_entry *entry, void *context) +{ + struct uia_hwnd_map_entry *hwnd_entry = RB_ENTRY_VALUE(entry, struct uia_hwnd_map_entry, entry); + + TRACE("Removing hwnd %p from map %p\n", hwnd_entry->hwnd, context); + free(hwnd_entry); +} + +static BOOL uia_hwnd_map_check_hwnd(struct rb_tree *hwnd_map, HWND hwnd) +{ + return !!rb_get(hwnd_map, hwnd); +} + +HRESULT uia_hwnd_map_add_hwnd(struct rb_tree *hwnd_map, HWND hwnd) +{ + struct uia_hwnd_map_entry *entry; + + if (uia_hwnd_map_check_hwnd(hwnd_map, hwnd)) + { + TRACE("hwnd %p already in map %p\n", hwnd, hwnd_map); + return S_OK; + } + + if (!(entry = calloc(1, sizeof(*entry)))) + return E_OUTOFMEMORY; + + TRACE("Adding hwnd %p to map %p\n", hwnd, hwnd_map); + entry->hwnd = hwnd; + rb_put(hwnd_map, hwnd, &entry->entry); + + return S_OK; +} + +void uia_hwnd_map_init(struct rb_tree *hwnd_map) +{ + rb_init(hwnd_map, uia_hwnd_map_hwnd_compare); +} + +void uia_hwnd_map_destroy(struct rb_tree *hwnd_map) +{ + rb_destroy(hwnd_map, uia_hwnd_map_free, hwnd_map); +}
1
0
0
0
Connor McAdams : uiautomationcore: Add WinEvent hook on the UIA event thread.
by Alexandre Julliard
25 Sep '23
25 Sep '23
Module: wine Branch: master Commit: 2a2c4cd7b984be5db239a7ea930ede59207560cf URL:
https://gitlab.winehq.org/wine/wine/-/commit/2a2c4cd7b984be5db239a7ea930ede…
Author: Connor McAdams <cmcadams(a)codeweavers.com> Date: Wed Sep 13 12:48:10 2023 -0400 uiautomationcore: Add WinEvent hook on the UIA event thread. Signed-off-by: Connor McAdams <cmcadams(a)codeweavers.com> --- dlls/uiautomationcore/uia_event.c | 121 +++++++++++++++++++++++++++++++++----- 1 file changed, 105 insertions(+), 16 deletions(-) diff --git a/dlls/uiautomationcore/uia_event.c b/dlls/uiautomationcore/uia_event.c index 10dc1934844..04067f39e0e 100644 --- a/dlls/uiautomationcore/uia_event.c +++ b/dlls/uiautomationcore/uia_event.c @@ -50,6 +50,20 @@ static SAFEARRAY *uia_get_desktop_rt_id(void) return uia_desktop_node_rt_id; } +static int win_event_to_uia_event_id(int win_event) +{ + switch (win_event) + { + case EVENT_OBJECT_FOCUS: return UIA_AutomationFocusChangedEventId; + case EVENT_SYSTEM_ALERT: return UIA_SystemAlertEventId; + + default: + break; + } + + return 0; +} + /* * UI Automation event map. */ @@ -247,6 +261,7 @@ struct uia_event_thread LONG ref; struct list *event_queue; + HWINEVENTHOOK hook; }; #define WM_UIA_EVENT_THREAD_STOP (WM_USER + 1) @@ -264,12 +279,18 @@ static CRITICAL_SECTION event_thread_cs = { &event_thread_cs_debug, -1, 0, 0, 0, enum uia_queue_event_type { QUEUE_EVENT_TYPE_SERVERSIDE, QUEUE_EVENT_TYPE_CLIENTSIDE, + QUEUE_EVENT_TYPE_WIN_EVENT, }; struct uia_queue_event { struct list event_queue_entry; int queue_event_type; +}; + +struct uia_queue_uia_event +{ + struct uia_queue_event queue_entry; struct uia_event_args *args; struct uia_event *event; @@ -285,14 +306,40 @@ struct uia_queue_event } u; }; -static void uia_event_queue_push(struct uia_queue_event *event) +struct uia_queue_win_event +{ + struct uia_queue_event queue_entry; + + HWINEVENTHOOK hook; + DWORD event_id; + HWND hwnd; + LONG obj_id; + LONG child_id; + DWORD thread_id; + DWORD event_time; +}; + +static void uia_event_queue_push(struct uia_queue_event *event, int queue_event_type) { + event->queue_event_type = queue_event_type; EnterCriticalSection(&event_thread_cs); + if (queue_event_type == QUEUE_EVENT_TYPE_WIN_EVENT) + { + struct uia_queue_win_event *win_event = (struct uia_queue_win_event *)event; + + if (win_event->hook != event_thread.hook) + { + free(event); + goto exit; + } + } + assert(event_thread.event_queue); list_add_tail(event_thread.event_queue, &event->event_queue_entry); PostMessageW(event_thread.hwnd, WM_UIA_EVENT_THREAD_PROCESS_QUEUE, 0, 0); +exit: LeaveCriticalSection(&event_thread_cs); } @@ -322,7 +369,7 @@ static void uia_node_lresult_release(LRESULT lr) static HRESULT uia_event_invoke(HUIANODE node, HUIANODE nav_start_node, struct uia_event_args *args, struct uia_event *event); -static HRESULT uia_raise_clientside_event(struct uia_queue_event *event) +static HRESULT uia_raise_clientside_event(struct uia_queue_uia_event *event) { HUIANODE node, nav_start_node; HRESULT hr; @@ -354,7 +401,7 @@ static HRESULT uia_raise_clientside_event(struct uia_queue_event *event) return hr; } -static HRESULT uia_raise_serverside_event(struct uia_queue_event *event) +static HRESULT uia_raise_serverside_event(struct uia_queue_uia_event *event) { HRESULT hr = S_OK; LRESULT lr, lr2; @@ -397,29 +444,70 @@ static void uia_event_thread_process_queue(struct list *event_queue) while (1) { struct uia_queue_event *event; - HRESULT hr; + HRESULT hr = S_OK; if (!(event = uia_event_queue_pop(event_queue))) break; - if (event->queue_event_type == QUEUE_EVENT_TYPE_SERVERSIDE) - hr = uia_raise_serverside_event(event); - else - hr = uia_raise_clientside_event(event); + switch (event->queue_event_type) + { + case QUEUE_EVENT_TYPE_SERVERSIDE: + case QUEUE_EVENT_TYPE_CLIENTSIDE: + { + struct uia_queue_uia_event *uia_event = (struct uia_queue_uia_event *)event; + + if (event->queue_event_type == QUEUE_EVENT_TYPE_SERVERSIDE) + hr = uia_raise_serverside_event(uia_event); + else + hr = uia_raise_clientside_event(uia_event); + + uia_event_args_release(uia_event->args); + IWineUiaEvent_Release(&uia_event->event->IWineUiaEvent_iface); + break; + } + + default: + break; + } if (FAILED(hr)) WARN("Failed to raise event type %d with hr %#lx\n", event->queue_event_type, hr); - uia_event_args_release(event->args); - IWineUiaEvent_Release(&event->event->IWineUiaEvent_iface); free(event); } } +static void CALLBACK uia_event_thread_win_event_proc(HWINEVENTHOOK hook, DWORD event_id, HWND hwnd, LONG obj_id, + LONG child_id, DWORD thread_id, DWORD event_time) +{ + struct uia_queue_win_event *win_event; + + TRACE("%p, %ld, %p, %ld, %ld, %ld, %ld\n", hook, event_id, hwnd, obj_id, child_id, thread_id, event_time); + + if (!win_event_to_uia_event_id(event_id)) + return; + + if (!(win_event = calloc(1, sizeof(*win_event)))) + { + ERR("Failed to allocate uia_queue_win_event structure\n"); + return; + } + + win_event->hook = hook; + win_event->event_id = event_id; + win_event->hwnd = hwnd; + win_event->obj_id = obj_id; + win_event->child_id = child_id; + win_event->thread_id = thread_id; + win_event->event_time = event_time; + uia_event_queue_push(&win_event->queue_entry, QUEUE_EVENT_TYPE_WIN_EVENT); +} + static DWORD WINAPI uia_event_thread_proc(void *arg) { HANDLE initialized_event = arg; struct list event_queue; + HWINEVENTHOOK hook; HWND hwnd; MSG msg; @@ -435,6 +523,8 @@ static DWORD WINAPI uia_event_thread_proc(void *arg) event_thread.hwnd = hwnd; event_thread.event_queue = &event_queue; + event_thread.hook = hook = SetWinEventHook(EVENT_MIN, EVENT_MAX, 0, uia_event_thread_win_event_proc, 0, 0, + WINEVENT_OUTOFCONTEXT); /* Initialization complete, thread can now process window messages. */ SetEvent(initialized_event); @@ -455,6 +545,7 @@ static DWORD WINAPI uia_event_thread_proc(void *arg) TRACE("Shutting down UI Automation event thread.\n"); + UnhookWinEvent(hook); DestroyWindow(hwnd); CoUninitialize(); FreeLibraryAndExitThread(huia_module, 0); @@ -664,7 +755,7 @@ static HRESULT WINAPI uia_event_set_event_data(IWineUiaEvent *iface, const GUID static HRESULT WINAPI uia_event_raise_event(IWineUiaEvent *iface, VARIANT in_node, VARIANT in_nav_start_node) { struct uia_event *event = impl_from_IWineUiaEvent(iface); - struct uia_queue_event *queue_event; + struct uia_queue_uia_event *queue_event; struct uia_event_args *args; TRACE("%p, %s, %s\n", iface, debugstr_variant(&in_node), debugstr_variant(&in_nav_start_node)); @@ -680,7 +771,6 @@ static HRESULT WINAPI uia_event_raise_event(IWineUiaEvent *iface, VARIANT in_nod return E_OUTOFMEMORY; } - queue_event->queue_event_type = QUEUE_EVENT_TYPE_CLIENTSIDE; queue_event->args = args; queue_event->event = event; queue_event->u.clientside.node = V_I4(&in_node); @@ -688,7 +778,7 @@ static HRESULT WINAPI uia_event_raise_event(IWineUiaEvent *iface, VARIANT in_nod queue_event->u.clientside.nav_start_node = V_I4(&in_nav_start_node); IWineUiaEvent_AddRef(&event->IWineUiaEvent_iface); - uia_event_queue_push(queue_event); + uia_event_queue_push(&queue_event->queue_entry, QUEUE_EVENT_TYPE_CLIENTSIDE); return S_OK; } @@ -1277,7 +1367,7 @@ static HRESULT uia_event_invoke(HUIANODE node, HUIANODE nav_start_node, struct u } else { - struct uia_queue_event *queue_event; + struct uia_queue_uia_event *queue_event; HUIANODE node2, nav_start_node2; if (!(queue_event = calloc(1, sizeof(*queue_event)))) @@ -1302,7 +1392,6 @@ static HRESULT uia_event_invoke(HUIANODE node, HUIANODE nav_start_node, struct u } } - queue_event->queue_event_type = QUEUE_EVENT_TYPE_SERVERSIDE; queue_event->args = args; queue_event->event = event; queue_event->u.serverside.node = node2; @@ -1310,7 +1399,7 @@ static HRESULT uia_event_invoke(HUIANODE node, HUIANODE nav_start_node, struct u InterlockedIncrement(&args->ref); IWineUiaEvent_AddRef(&event->IWineUiaEvent_iface); - uia_event_queue_push(queue_event); + uia_event_queue_push(&queue_event->queue_entry, QUEUE_EVENT_TYPE_SERVERSIDE); } return hr;
1
0
0
0
← Newer
1
...
11
12
13
14
15
16
17
...
92
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
Results per page:
10
25
50
100
200