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 2018
----- 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
670 discussions
Start a n
N
ew thread
Józef Kucia : wined3d: Introduce separate function for OpenGL formats initialisation.
by Alexandre Julliard
20 Sep '18
20 Sep '18
Module: wine Branch: master Commit: 6a38579d0ff7db6d4b5105e12283d488f7671065 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=6a38579d0ff7db6d4b5105e1…
Author: Józef Kucia <jkucia(a)codeweavers.com> Date: Thu Sep 20 09:01:59 2018 +0200 wined3d: Introduce separate function for OpenGL formats initialisation. Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com> Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/wined3d/adapter_gl.c | 2 +- dlls/wined3d/directx.c | 2 +- dlls/wined3d/utils.c | 22 ++++++++++++++++------ dlls/wined3d/wined3d_private.h | 3 ++- 4 files changed, 20 insertions(+), 9 deletions(-) diff --git a/dlls/wined3d/adapter_gl.c b/dlls/wined3d/adapter_gl.c index 0948741..9c074d3 100644 --- a/dlls/wined3d/adapter_gl.c +++ b/dlls/wined3d/adapter_gl.c @@ -4279,7 +4279,7 @@ BOOL wined3d_adapter_gl_init(struct wined3d_adapter *adapter, DWORD wined3d_crea return FALSE; } - if (!wined3d_adapter_init_format_info(adapter, &caps_gl_ctx)) + if (!wined3d_adapter_gl_init_format_info(adapter, &caps_gl_ctx)) { ERR("Failed to initialize GL format info.\n"); wined3d_caps_gl_ctx_destroy(&caps_gl_ctx); diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c index b6c6ecb..345e7b7 100644 --- a/dlls/wined3d/directx.c +++ b/dlls/wined3d/directx.c @@ -2490,7 +2490,7 @@ static BOOL wined3d_adapter_no3d_init(struct wined3d_adapter *adapter) adapter->vram_bytes_used = 0; TRACE("Emulating 0x%s bytes of video ram.\n", wine_dbgstr_longlong(adapter->vram_bytes)); - if (!wined3d_adapter_init_format_info(adapter, NULL)) + if (!wined3d_adapter_init_format_info(adapter)) return FALSE; adapter->vertex_pipe = &none_vertex_pipe; diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c index a7bcedf..4f9fc13 100644 --- a/dlls/wined3d/utils.c +++ b/dlls/wined3d/utils.c @@ -3947,17 +3947,27 @@ static void init_format_depth_bias_scale(struct wined3d_adapter *adapter, } } -/* Context activation is done by the caller. */ -BOOL wined3d_adapter_init_format_info(struct wined3d_adapter *adapter, struct wined3d_caps_gl_ctx *ctx) +BOOL wined3d_adapter_init_format_info(struct wined3d_adapter *adapter) { - struct wined3d_gl_info *gl_info = &adapter->gl_info; - if (!init_format_base_info(adapter)) return FALSE; if (!init_format_block_info(adapter)) goto fail; if (!init_format_decompress_info(adapter)) goto fail; - if (!ctx) /* WINED3D_NO3D */ - return TRUE; + return TRUE; + +fail: + heap_free(adapter->formats); + adapter->formats = NULL; + return FALSE; +} + +/* Context activation is done by the caller. */ +BOOL wined3d_adapter_gl_init_format_info(struct wined3d_adapter *adapter, struct wined3d_caps_gl_ctx *ctx) +{ + struct wined3d_gl_info *gl_info = &adapter->gl_info; + + if (!wined3d_adapter_init_format_info(adapter)) + return FALSE; if (!init_format_texture_info(adapter, gl_info)) goto fail; if (!init_format_vertex_info(adapter, gl_info)) goto fail; diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index f01ad17..d8d5b04 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -2690,7 +2690,8 @@ struct wined3d_caps_gl_ctx GLuint test_program_id; }; -BOOL wined3d_adapter_init_format_info(struct wined3d_adapter *adapter, +BOOL wined3d_adapter_init_format_info(struct wined3d_adapter *adapter) DECLSPEC_HIDDEN; +BOOL wined3d_adapter_gl_init_format_info(struct wined3d_adapter *adapter, struct wined3d_caps_gl_ctx *ctx) DECLSPEC_HIDDEN; UINT64 adapter_adjust_memory(struct wined3d_adapter *adapter, INT64 amount) DECLSPEC_HIDDEN;
1
0
0
0
Józef Kucia : wined3d: Introduce get_format_by_idx() helper function.
by Alexandre Julliard
20 Sep '18
20 Sep '18
Module: wine Branch: master Commit: a84dad34aeee55ef109e3791c6209254c293197e URL:
https://source.winehq.org/git/wine.git/?a=commit;h=a84dad34aeee55ef109e3791…
Author: Józef Kucia <jkucia(a)codeweavers.com> Date: Thu Sep 20 09:01:58 2018 +0200 wined3d: Introduce get_format_by_idx() helper function. In preparation for variable-sized format structures. Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com> Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/wined3d/utils.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c index d190c89..a7bcedf 100644 --- a/dlls/wined3d/utils.c +++ b/dlls/wined3d/utils.c @@ -1925,6 +1925,11 @@ static inline int get_format_idx(enum wined3d_format_id format_id) return -1; } +static struct wined3d_format *get_format_by_idx(const struct wined3d_adapter *adapter, int fmt_idx) +{ + return &adapter->formats[fmt_idx]; +} + static struct wined3d_format *get_format_internal(const struct wined3d_adapter *adapter, enum wined3d_format_id format_id) { @@ -1936,7 +1941,7 @@ static struct wined3d_format *get_format_internal(const struct wined3d_adapter * return NULL; } - return &adapter->formats[fmt_idx]; + return get_format_by_idx(adapter, fmt_idx); } static void copy_format(struct wined3d_format *dst_format, const struct wined3d_format *src_format) @@ -2729,8 +2734,8 @@ static void init_format_fbo_compat_info(const struct wined3d_adapter *adapter, { for (i = 0; i < WINED3D_FORMAT_COUNT; ++i) { + struct wined3d_format *format = get_format_by_idx(adapter, i); BOOL fallback_fmt_used = FALSE, regular_fmt_used = FALSE; - struct wined3d_format *format = &adapter->formats[i]; GLenum rt_internal = format->rtInternal; GLint value; @@ -2843,7 +2848,7 @@ static void init_format_fbo_compat_info(const struct wined3d_adapter *adapter, for (i = 0; i < WINED3D_FORMAT_COUNT; ++i) { - struct wined3d_format *format = &adapter->formats[i]; + struct wined3d_format *format = get_format_by_idx(adapter, i); if (!format->glInternal) continue; @@ -3629,7 +3634,7 @@ static void apply_format_fixups(struct wined3d_adapter *adapter, struct wined3d_ for (i = 0; i < WINED3D_FORMAT_COUNT; ++i) { - struct wined3d_format *format = &adapter->formats[i]; + struct wined3d_format *format = get_format_by_idx(adapter, i); if (!(format->flags[WINED3D_GL_RES_TYPE_TEX_2D] & WINED3DFMT_FLAG_TEXTURE)) continue; @@ -3727,7 +3732,7 @@ static BOOL init_typeless_formats(const struct wined3d_adapter *adapter) if (!(ds_format = get_format_internal(adapter, typeless_depth_stencil_formats[i].depth_stencil_id))) return FALSE; - typeless_ds_format = &adapter->formats[WINED3D_FORMAT_COUNT + i]; + typeless_ds_format = get_format_by_idx(adapter, WINED3D_FORMAT_COUNT + i); typeless_ds_format->id = typeless_depth_stencil_formats[i].typeless_id; copy_format(typeless_ds_format, ds_format); for (j = 0; j < ARRAY_SIZE(typeless_ds_format->flags); ++j) @@ -3764,7 +3769,7 @@ static void init_format_gen_mipmap_info(const struct wined3d_adapter *adapter, for (i = 0; i < WINED3D_FORMAT_COUNT; ++i) { - struct wined3d_format *format = &adapter->formats[i]; + struct wined3d_format *format = get_format_by_idx(adapter, i); for (j = 0; j < ARRAY_SIZE(format->flags); ++j) if (!(~format->flags[j] & (WINED3DFMT_FLAG_RENDERTARGET | WINED3DFMT_FLAG_FILTERING))) @@ -3921,7 +3926,7 @@ static void init_format_depth_bias_scale(struct wined3d_adapter *adapter, for (i = 0; i < WINED3D_FORMAT_COUNT; ++i) { - struct wined3d_format *format = &adapter->formats[i]; + struct wined3d_format *format = get_format_by_idx(adapter, i); if (format->flags[WINED3D_GL_RES_TYPE_RB] & WINED3DFMT_FLAG_DEPTH) { @@ -3987,14 +3992,14 @@ const struct wined3d_format *wined3d_get_format(const struct wined3d_adapter *ad return get_format_internal(adapter, WINED3DFMT_UNKNOWN); } - format = &adapter->formats[idx]; + format = get_format_by_idx(adapter, idx); if (resource_usage & WINED3DUSAGE_DEPTHSTENCIL && wined3d_format_is_typeless(format)) { for (i = 0; i < ARRAY_SIZE(typeless_depth_stencil_formats); ++i) { if (typeless_depth_stencil_formats[i].typeless_id == format_id) - return &adapter->formats[WINED3D_FORMAT_COUNT + i]; + return get_format_by_idx(adapter, WINED3D_FORMAT_COUNT + i); } FIXME("Cannot find depth/stencil typeless format %s (%#x).\n",
1
0
0
0
Michael Stefaniuc : winmm: Use the ARRAY_SIZE() macro.
by Alexandre Julliard
20 Sep '18
20 Sep '18
Module: wine Branch: master Commit: 24f47812165a5dcb2b22825e47ccccbbd7437b8b URL:
https://source.winehq.org/git/wine.git/?a=commit;h=24f47812165a5dcb2b22825e…
Author: Michael Stefaniuc <mstefani(a)winehq.org> Date: Wed Sep 19 21:01:11 2018 +0200 winmm: Use the ARRAY_SIZE() macro. Signed-off-by: Michael Stefaniuc <mstefani(a)winehq.org> Signed-off-by: Andrew Eikum <aeikum(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/winmm/driver.c | 2 +- dlls/winmm/lolvldrv.c | 10 +++++----- dlls/winmm/mci.c | 20 +++++++++----------- dlls/winmm/mmio.c | 2 +- dlls/winmm/playsound.c | 10 +++++----- dlls/winmm/waveform.c | 2 +- dlls/winmm/winmm.c | 3 +-- 7 files changed, 23 insertions(+), 26 deletions(-) diff --git a/dlls/winmm/driver.c b/dlls/winmm/driver.c index feecc92..0117c60 100644 --- a/dlls/winmm/driver.c +++ b/dlls/winmm/driver.c @@ -396,7 +396,7 @@ HDRVR WINAPI OpenDriver(LPCWSTR lpDriverName, LPCWSTR lpSectionName, LPARAM lPar if (lsn == NULL) { static const WCHAR wszDrivers32[] = {'D','r','i','v','e','r','s','3','2',0}; - lstrcpynW(libName, lpDriverName, sizeof(libName) / sizeof(WCHAR)); + lstrcpynW(libName, lpDriverName, ARRAY_SIZE(libName)); if ((lpDrv = DRIVER_TryOpenDriver32(libName, lParam))) goto the_end; diff --git a/dlls/winmm/lolvldrv.c b/dlls/winmm/lolvldrv.c index 35bd6a0..95f454f 100644 --- a/dlls/winmm/lolvldrv.c +++ b/dlls/winmm/lolvldrv.c @@ -181,7 +181,7 @@ void MMDRV_Free(HANDLE hndl, LPWINE_MLD mld) if ((UINT_PTR)hndl & 0x8000) { UINT_PTR idx = (UINT_PTR)hndl & ~0x8000; - if (idx < sizeof(MM_MLDrvs) / sizeof(MM_MLDrvs[0])) { + if (idx < ARRAY_SIZE(MM_MLDrvs)) { MM_MLDrvs[idx] = NULL; HeapFree(GetProcessHeap(), 0, mld); return; @@ -261,7 +261,7 @@ LPWINE_MLD MMDRV_Get(HANDLE _hndl, UINT type, BOOL bCanBeID) hndl != (UINT16)-1 && hndl != (UINT)-1) { if (hndl & 0x8000) { UINT idx = hndl & ~0x8000; - if (idx < sizeof(MM_MLDrvs) / sizeof(MM_MLDrvs[0])) { + if (idx < ARRAY_SIZE(MM_MLDrvs)) { __TRY { mld = MM_MLDrvs[idx]; @@ -424,7 +424,7 @@ static BOOL MMDRV_Install(LPCSTR drvRegName, LPCSTR drvFileName, BOOL bIsMapper) * drivers !! * If not just increase size of MMDrvs */ - assert(MMDrvsHi <= sizeof(MMDrvs)/sizeof(MMDrvs[0])); + assert(MMDrvsHi <= ARRAY_SIZE(MMDrvs)); memset(lpDrv, 0, sizeof(*lpDrv)); @@ -589,7 +589,7 @@ void MMDRV_Exit(void) unsigned int i; TRACE("()\n"); - for (i = 0; i < sizeof(MM_MLDrvs) / sizeof(MM_MLDrvs[0]); i++) + for (i = 0; i < ARRAY_SIZE(MM_MLDrvs); i++) { if (MM_MLDrvs[i] != NULL) { @@ -602,7 +602,7 @@ void MMDRV_Exit(void) } /* unload driver, in reverse order of loading */ - i = sizeof(MMDrvs) / sizeof(MMDrvs[0]); + i = ARRAY_SIZE(MMDrvs); while (i-- > 0) { MMDRV_ExitPerType(&MMDrvs[i], MMDRV_AUX); diff --git a/dlls/winmm/mci.c b/dlls/winmm/mci.c index 56a537d..0319a0b 100644 --- a/dlls/winmm/mci.c +++ b/dlls/winmm/mci.c @@ -551,7 +551,7 @@ static UINT MCI_GetDevTypeFromResource(LPCWSTR lpstrName) WCHAR buf[32]; UINT uDevType; for (uDevType = MCI_DEVTYPE_FIRST; uDevType <= MCI_DEVTYPE_LAST; uDevType++) { - if (LoadStringW(hWinMM32Instance, uDevType, buf, sizeof(buf) / sizeof(WCHAR))) { + if (LoadStringW(hWinMM32Instance, uDevType, buf, ARRAY_SIZE(buf))) { /* FIXME: ignore digits suffix */ if (!strcmpiW(buf, lpstrName)) return uDevType; @@ -668,7 +668,7 @@ static UINT MCI_GetCommandTable(UINT uDevType) /* well try to load id */ if (uDevType >= MCI_DEVTYPE_FIRST && uDevType <= MCI_DEVTYPE_LAST) { - if (LoadStringW(hWinMM32Instance, uDevType, buf, sizeof(buf) / sizeof(WCHAR))) { + if (LoadStringW(hWinMM32Instance, uDevType, buf, ARRAY_SIZE(buf))) { str = buf; } } else if (uDevType == 0) { @@ -1450,9 +1450,9 @@ DWORD WINAPI mciSendStringW(LPCWSTR lpstrCommand, LPWSTR lpstrRet, { static const WCHAR wszOpenWait[] = {'o','p','e','n',' ','%','s',' ','w','a','i','t',0}; WCHAR buf[138], retbuf[6]; - snprintfW(buf, sizeof(buf)/sizeof(WCHAR), wszOpenWait, dev); + snprintfW(buf, ARRAY_SIZE(buf), wszOpenWait, dev); /* open via mciSendString handles quoting, dev!file syntax and alias creation */ - if ((dwRet = mciSendStringW(buf, retbuf, sizeof(retbuf)/sizeof(WCHAR), 0)) != 0) + if ((dwRet = mciSendStringW(buf, retbuf, ARRAY_SIZE(retbuf), 0)) != 0) goto errCleanUp; auto_open = strtoulW(retbuf, NULL, 10); TRACE("auto-opened %u for %s\n", auto_open, debugstr_w(dev)); @@ -1746,10 +1746,8 @@ static DWORD MCI_Open(DWORD dwParam, LPMCI_OPEN_PARMSW lpParms) if (dwParam & MCI_OPEN_TYPE_ID) { WORD uDevType = LOWORD(lpParms->lpstrDeviceType); - if (uDevType < MCI_DEVTYPE_FIRST || - uDevType > MCI_DEVTYPE_LAST || - !LoadStringW(hWinMM32Instance, uDevType, - strDevTyp, sizeof(strDevTyp) / sizeof(WCHAR))) { + if (uDevType < MCI_DEVTYPE_FIRST || uDevType > MCI_DEVTYPE_LAST || + !LoadStringW(hWinMM32Instance, uDevType, strDevTyp, ARRAY_SIZE(strDevTyp))) { dwRet = MCIERR_BAD_INTEGER; goto errCleanUp; } @@ -1946,7 +1944,7 @@ static DWORD MCI_SysInfo(UINT uDevID, DWORD dwFlags, LPMCI_SYSINFO_PARMSW lpParm RegQueryInfoKeyW( hKey, 0, 0, 0, &cnt, 0, 0, 0, 0, 0, 0, 0); RegCloseKey( hKey ); } - if (GetPrivateProfileStringW(wszMci, 0, wszNull, buf, sizeof(buf) / sizeof(buf[0]), wszSystemIni)) + if (GetPrivateProfileStringW(wszMci, 0, wszNull, buf, ARRAY_SIZE(buf), wszSystemIni)) for (s = buf; *s; s += strlenW(s) + 1) cnt++; } } else { @@ -2016,7 +2014,7 @@ static DWORD MCI_SysInfo(UINT uDevID, DWORD dwFlags, LPMCI_SYSINFO_PARMSW lpParm if (RegQueryInfoKeyW( hKey, 0, 0, 0, &cnt, 0, 0, 0, 0, 0, 0, 0) == ERROR_SUCCESS && lpParms->dwNumber <= cnt) { - DWORD bufLen = sizeof(buf)/sizeof(buf[0]); + DWORD bufLen = ARRAY_SIZE(buf); if (RegEnumKeyExW(hKey, lpParms->dwNumber - 1, buf, &bufLen, 0, 0, 0, 0) == ERROR_SUCCESS) s = buf; @@ -2024,7 +2022,7 @@ static DWORD MCI_SysInfo(UINT uDevID, DWORD dwFlags, LPMCI_SYSINFO_PARMSW lpParm RegCloseKey( hKey ); } if (!s) { - if (GetPrivateProfileStringW(wszMci, 0, wszNull, buf, sizeof(buf) / sizeof(buf[0]), wszSystemIni)) { + if (GetPrivateProfileStringW(wszMci, 0, wszNull, buf, ARRAY_SIZE(buf), wszSystemIni)) { for (p = buf; *p; p += strlenW(p) + 1, cnt++) { TRACE("%d: %s\n", cnt, debugstr_w(p)); if (cnt == lpParms->dwNumber - 1) { diff --git a/dlls/winmm/mmio.c b/dlls/winmm/mmio.c index d8af787..b4155b6 100644 --- a/dlls/winmm/mmio.c +++ b/dlls/winmm/mmio.c @@ -315,7 +315,7 @@ static LPMMIOPROC MMIO_InstallIOProc(FOURCC fccIOProc, LPMMIOPROC pIOProc, } /* remove it, but only if it isn't builtin */ if ((*ppListNode) >= defaultProcs && - (*ppListNode) < defaultProcs + sizeof(defaultProcs) / sizeof(defaultProcs[0])) { + (*ppListNode) < defaultProcs + ARRAY_SIZE(defaultProcs)) { WARN("Tried to remove built-in mmio proc. Skipping\n"); } else { /* Okay, nuke it */ diff --git a/dlls/winmm/playsound.c b/dlls/winmm/playsound.c index 6525db5..2731e7b 100644 --- a/dlls/winmm/playsound.c +++ b/dlls/winmm/playsound.c @@ -60,7 +60,7 @@ static HMMIO get_mmioFromFile(LPCWSTR lpszName) ret = mmioOpenW((LPWSTR)lpszName, NULL, MMIO_ALLOCBUF | MMIO_READ | MMIO_DENYWRITE); if (ret != 0) return ret; - if (SearchPathW(NULL, lpszName, dotwav, sizeof(buf)/sizeof(buf[0]), buf, &dummy)) + if (SearchPathW(NULL, lpszName, dotwav, ARRAY_SIZE(buf), buf, &dummy)) { return mmioOpenW(buf, NULL, MMIO_ALLOCBUF | MMIO_READ | MMIO_DENYWRITE); @@ -86,11 +86,11 @@ static HMMIO get_mmioFromProfile(UINT uFlags, LPCWSTR lpszName) static const WCHAR wszNull[] = {0}; TRACE("searching in SystemSound list for %s\n", debugstr_w(lpszName)); - GetProfileStringW(wszSounds, lpszName, wszNull, str, sizeof(str)/sizeof(str[0])); + GetProfileStringW(wszSounds, lpszName, wszNull, str, ARRAY_SIZE(str)); if (lstrlenW(str) == 0) { if (uFlags & SND_NODEFAULT) goto next; - GetProfileStringW(wszSounds, wszDefault, wszNull, str, sizeof(str)/sizeof(str[0])); + GetProfileStringW(wszSounds, wszDefault, wszNull, str, ARRAY_SIZE(str)); if (lstrlenW(str) == 0) goto next; } for (ptr = str; *ptr && *ptr != ','; ptr++); @@ -108,8 +108,8 @@ static HMMIO get_mmioFromProfile(UINT uFlags, LPCWSTR lpszName) DWORD len; err = 1; /* error */ - len = GetModuleFileNameW(0, str, sizeof(str)/sizeof(str[0])); - if (len > 0 && len < sizeof(str)/sizeof(str[0])) + len = GetModuleFileNameW(0, str, ARRAY_SIZE(str)); + if (len > 0 && len < ARRAY_SIZE(str)) { for (ptr = str + lstrlenW(str) - 1; ptr >= str; ptr--) { diff --git a/dlls/winmm/waveform.c b/dlls/winmm/waveform.c index 0a259c0..959773c 100644 --- a/dlls/winmm/waveform.c +++ b/dlls/winmm/waveform.c @@ -4354,7 +4354,7 @@ UINT WINAPI mixerGetLineInfoA(HMIXEROBJ hmix, LPMIXERLINEA lpmliA, mliW.Target.wMid = lpmliA->Target.wMid; mliW.Target.wPid = lpmliA->Target.wPid; mliW.Target.vDriverVersion = lpmliA->Target.vDriverVersion; - MultiByteToWideChar( CP_ACP, 0, lpmliA->Target.szPname, -1, mliW.Target.szPname, sizeof(mliW.Target.szPname)/sizeof(WCHAR)); + MultiByteToWideChar(CP_ACP, 0, lpmliA->Target.szPname, -1, mliW.Target.szPname, ARRAY_SIZE(mliW.Target.szPname)); break; default: WARN("Unsupported fdwControls=0x%08x\n", fdwInfo); diff --git a/dlls/winmm/winmm.c b/dlls/winmm/winmm.c index 487bbff..0f0cd94 100644 --- a/dlls/winmm/winmm.c +++ b/dlls/winmm/winmm.c @@ -1445,8 +1445,7 @@ static MMRESULT midistream_post_message_and_wait(WINE_MIDIStream* lpMidiStrm, UI if (GetCurrentThreadId() != lpMidiStrm->dwThreadID) { DWORD ret; hObjects[1] = lpMidiStrm->hThread; - ret = WaitForMultipleObjects(sizeof(hObjects)/sizeof(hObjects[0]), hObjects, - FALSE, INFINITE); + ret = WaitForMultipleObjects(ARRAY_SIZE(hObjects), hObjects, FALSE, INFINITE); if (ret != WAIT_OBJECT_0) { CloseHandle(hObjects[0]); WARN("bad WaitForSingleObject (%u)\n", ret);
1
0
0
0
Sven Baars : comctl32: Add NULL checks to SetWindowSubclass (Valgrind).
by Alexandre Julliard
20 Sep '18
20 Sep '18
Module: wine Branch: master Commit: 04847e68f87b26eeef5cbe6a852b1f3914f956e4 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=04847e68f87b26eeef5cbe6a…
Author: Sven Baars <sven.wine(a)gmail.com> Date: Wed Sep 19 19:44:18 2018 +0200 comctl32: Add NULL checks to SetWindowSubclass (Valgrind). Signed-off-by: Sven Baars <sven.wine(a)gmail.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/comctl32/commctrl.c | 3 +++ dlls/comctl32/tests/subclass.c | 31 +++++++++++++++++++++++-------- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/dlls/comctl32/commctrl.c b/dlls/comctl32/commctrl.c index 45b93bd..c228b64 100644 --- a/dlls/comctl32/commctrl.c +++ b/dlls/comctl32/commctrl.c @@ -1082,6 +1082,9 @@ BOOL WINAPI SetWindowSubclass (HWND hWnd, SUBCLASSPROC pfnSubclass, TRACE ("(%p, %p, %lx, %lx)\n", hWnd, pfnSubclass, uIDSubclass, dwRef); + if (!hWnd || !pfnSubclass) + return FALSE; + /* Since the window procedure that we set here has two additional arguments, * we can't simply set it as the new window procedure of the window. So we * set our own window procedure and then calculate the other two arguments diff --git a/dlls/comctl32/tests/subclass.c b/dlls/comctl32/tests/subclass.c index 75a1343..41ba065 100644 --- a/dlls/comctl32/tests/subclass.c +++ b/dlls/comctl32/tests/subclass.c @@ -218,46 +218,61 @@ static LRESULT WINAPI wnd_proc_sub(HWND hwnd, UINT message, WPARAM wParam, LPARA static void test_subclass(void) { + BOOL ret; HWND hwnd = CreateWindowExA(0, "TestSubclass", "Test subclass", WS_OVERLAPPEDWINDOW, 100, 100, 200, 200, 0, 0, 0, NULL); ok(hwnd != NULL, "failed to create test subclass wnd\n"); - pSetWindowSubclass(hwnd, wnd_proc_sub, 2, 0); + ret = pSetWindowSubclass(hwnd, wnd_proc_sub, 2, 0); + ok(ret == TRUE, "Expected TRUE\n"); SendMessageA(hwnd, WM_USER, 1, 0); SendMessageA(hwnd, WM_USER, 2, 0); ok_sequence(Sub_BasicTest, "Basic"); - pSetWindowSubclass(hwnd, wnd_proc_sub, 2, DELETE_SELF); + ret = pSetWindowSubclass(hwnd, wnd_proc_sub, 2, DELETE_SELF); + ok(ret == TRUE, "Expected TRUE\n"); SendMessageA(hwnd, WM_USER, 1, 1); ok_sequence(Sub_DeletedTest, "Deleted"); SendMessageA(hwnd, WM_USER, 1, 0); ok_sequence(Sub_AfterDeletedTest, "After Deleted"); - pSetWindowSubclass(hwnd, wnd_proc_sub, 2, 0); + ret = pSetWindowSubclass(hwnd, wnd_proc_sub, 2, 0); + ok(ret == TRUE, "Expected TRUE\n"); orig_proc_3 = (WNDPROC)SetWindowLongPtrA(hwnd, GWLP_WNDPROC, (LONG_PTR)wnd_proc_3); SendMessageA(hwnd, WM_USER, 1, 0); SendMessageA(hwnd, WM_USER, 2, 0); ok_sequence(Sub_OldAfterNewTest, "Old after New"); - pSetWindowSubclass(hwnd, wnd_proc_sub, 4, 0); + ret = pSetWindowSubclass(hwnd, wnd_proc_sub, 4, 0); + ok(ret == TRUE, "Expected TRUE\n"); SendMessageA(hwnd, WM_USER, 1, 0); ok_sequence(Sub_MixTest, "Mix"); /* Now the fun starts */ - pSetWindowSubclass(hwnd, wnd_proc_sub, 4, SEND_NEST); + ret = pSetWindowSubclass(hwnd, wnd_proc_sub, 4, SEND_NEST); + ok(ret == TRUE, "Expected TRUE\n"); SendMessageA(hwnd, WM_USER, 1, 1); ok_sequence(Sub_MixAndNestTest, "Mix and nest"); - pSetWindowSubclass(hwnd, wnd_proc_sub, 4, SEND_NEST | DELETE_SELF); + ret = pSetWindowSubclass(hwnd, wnd_proc_sub, 4, SEND_NEST | DELETE_SELF); + ok(ret == TRUE, "Expected TRUE\n"); SendMessageA(hwnd, WM_USER, 1, 1); ok_sequence(Sub_MixNestDelTest, "Mix, nest, del"); - pSetWindowSubclass(hwnd, wnd_proc_sub, 4, 0); - pSetWindowSubclass(hwnd, wnd_proc_sub, 5, DELETE_PREV); + ret = pSetWindowSubclass(hwnd, wnd_proc_sub, 4, 0); + ok(ret == TRUE, "Expected TRUE\n"); + ret = pSetWindowSubclass(hwnd, wnd_proc_sub, 5, DELETE_PREV); + ok(ret == TRUE, "Expected TRUE\n"); SendMessageA(hwnd, WM_USER, 1, 1); ok_sequence(Sub_MixDelPrevTest, "Mix and del prev"); + ret = pSetWindowSubclass(NULL, wnd_proc_sub, 1, 0); + ok(ret == FALSE, "Expected FALSE\n"); + + ret = pSetWindowSubclass(hwnd, NULL, 1, 0); + ok(ret == FALSE, "Expected FALSE\n"); + DestroyWindow(hwnd); }
1
0
0
0
Fabian Maurer : shell32/brsfolder: Add shortcut to delete folders with the delete key.
by Alexandre Julliard
20 Sep '18
20 Sep '18
Module: wine Branch: master Commit: 43f44ffb3779ff23c863d9b3297f92720e7e3733 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=43f44ffb3779ff23c863d9b3…
Author: Fabian Maurer <dark.shadow4(a)web.de> Date: Fri Sep 14 22:01:41 2018 +0200 shell32/brsfolder: Add shortcut to delete folders with the delete key. Signed-off-by: Fabian Maurer <dark.shadow4(a)web.de> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/shell32/brsfolder.c | 93 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) diff --git a/dlls/shell32/brsfolder.c b/dlls/shell32/brsfolder.c index 91936bd..d771d0b 100644 --- a/dlls/shell32/brsfolder.c +++ b/dlls/shell32/brsfolder.c @@ -38,6 +38,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(shell); +#define SHV_CHANGE_NOTIFY (WM_USER + 0x1111) + /* original margins and control size */ typedef struct tagLAYOUT_DATA { @@ -53,6 +55,7 @@ typedef struct tagbrowse_info LPITEMIDLIST pidlRet; LAYOUT_DATA *layout; /* filled by LayoutInit, used by LayoutUpdate */ SIZE szMin; + ULONG hNotify; /* change notification handle */ } browse_info; typedef struct tagTV_ITEMDATA @@ -635,6 +638,30 @@ static LRESULT BrsFolder_Treeview_Keydown(browse_info *info, LPNMTVKEYDOWN keydo case VK_F2: BrsFolder_Rename(info, selected_item); break; + case VK_DELETE: + { + const ITEMIDLIST *item_id; + ISFHelper *psfhlp; + HRESULT hr; + TVITEMW item; + TV_ITEMDATA *item_data; + + item.mask = TVIF_PARAM; + item.mask = TVIF_HANDLE|TVIF_PARAM; + item.hItem = selected_item; + SendMessageW(info->hwndTreeView, TVM_GETITEMW, 0, (LPARAM)&item); + item_data = (TV_ITEMDATA *)item.lParam; + item_id = item_data->lpi; + + hr = IShellFolder_QueryInterface(item_data->lpsfParent, &IID_ISFHelper, (void**)&psfhlp); + if(FAILED(hr)) + return 0; + + /* perform the item deletion - tree view gets updated over shell notification */ + ISFHelper_DeleteItems(psfhlp, 1, &item_id); + ISFHelper_Release(psfhlp); + } + break; } return 0; } @@ -680,6 +707,8 @@ static LRESULT BrsFolder_OnNotify( browse_info *info, UINT CtlID, LPNMHDR lpnmh static BOOL BrsFolder_OnCreate( HWND hWnd, browse_info *info ) { + LPITEMIDLIST computer_pidl; + SHChangeNotifyEntry ntreg; LPBROWSEINFOW lpBrowseInfo = info->lpBrowseInfo; info->hWnd = hWnd; @@ -745,6 +774,14 @@ static BOOL BrsFolder_OnCreate( HWND hWnd, browse_info *info ) else ERR("treeview control missing!\n"); + /* Register for change notifications */ + SHGetFolderLocation(NULL, CSIDL_DESKTOP, NULL, 0, &computer_pidl); + + ntreg.pidl = computer_pidl; + ntreg.fRecursive = TRUE; + + info->hNotify = SHChangeNotifyRegister(hWnd, SHCNRF_InterruptLevel, SHCNE_ALLEVENTS, SHV_CHANGE_NOTIFY, 1, &ntreg); + browsefolder_callback( info->lpBrowseInfo, hWnd, BFFM_INITIALIZED, 0 ); return TRUE; @@ -1001,9 +1038,62 @@ static INT BrsFolder_OnDestroy(browse_info *info) info->layout = NULL; } + SHChangeNotifyDeregister(info->hNotify); + return 0; } +/* Find a treeview node by recursively walking the treeview */ +static HTREEITEM BrsFolder_FindItemByPidl(browse_info *info, LPCITEMIDLIST pidl, HTREEITEM hItem) +{ + TV_ITEMW item; + TV_ITEMDATA *item_data; + HRESULT hr; + + item.mask = TVIF_HANDLE | TVIF_PARAM; + item.hItem = hItem; + SendMessageW(info->hwndTreeView, TVM_GETITEMW, 0, (LPARAM)&item); + item_data = (TV_ITEMDATA *)item.lParam; + + hr = IShellFolder_CompareIDs(item_data->lpsfParent, 0, item_data->lpifq, pidl); + if(SUCCEEDED(hr) && !HRESULT_CODE(hr)) + return hItem; + + hItem = (HTREEITEM)SendMessageW(info->hwndTreeView, TVM_GETNEXTITEM, TVGN_CHILD, (LPARAM)hItem); + + while (hItem) + { + HTREEITEM newItem = BrsFolder_FindItemByPidl(info, pidl, hItem); + if (newItem) + return newItem; + hItem = (HTREEITEM)SendMessageW(info->hwndTreeView, TVM_GETNEXTITEM, TVGN_NEXT, (LPARAM)hItem); + } + return NULL; +} + +static LRESULT BrsFolder_OnChange(browse_info *info, const LPCITEMIDLIST *pidls, LONG event) +{ + BOOL ret = TRUE; + + TRACE("(%p)->(%p, %p, 0x%08x)\n", info, pidls[0], pidls[1], event); + + switch (event) + { + case SHCNE_RMDIR: + case SHCNE_DELETE: + { + HTREEITEM handle_root = (HTREEITEM)SendMessageW(info->hwndTreeView, TVM_GETNEXTITEM, TVGN_ROOT, 0); + HTREEITEM handle_item = BrsFolder_FindItemByPidl(info, pidls[0], handle_root); + + if (handle_item) + SendMessageW(info->hwndTreeView, TVM_DELETEITEM, 0, (LPARAM)handle_item); + + break; + } + } + return ret; +} + /************************************************************************* * BrsFolderDlgProc32 (not an exported API function) */ @@ -1064,6 +1154,9 @@ static INT_PTR CALLBACK BrsFolderDlgProc( HWND hWnd, UINT msg, WPARAM wParam, case BFFM_SETEXPANDED: /* unicode only */ return BrsFolder_OnSetExpanded(info, (LPVOID)lParam, (BOOL)wParam, NULL); + case SHV_CHANGE_NOTIFY: + return BrsFolder_OnChange(info, (const LPCITEMIDLIST*)wParam, (LONG)lParam); + case WM_DESTROY: return BrsFolder_OnDestroy(info); }
1
0
0
0
Fabian Maurer : shell32/brsfolder: Add shortcut to rename folders with the F2 key.
by Alexandre Julliard
20 Sep '18
20 Sep '18
Module: wine Branch: master Commit: 2e25a43f3fb6230460447bae6fb5db2edbd4a42f URL:
https://source.winehq.org/git/wine.git/?a=commit;h=2e25a43f3fb6230460447bae…
Author: Fabian Maurer <dark.shadow4(a)web.de> Date: Fri Sep 14 22:01:40 2018 +0200 shell32/brsfolder: Add shortcut to rename folders with the F2 key. Signed-off-by: Fabian Maurer <dark.shadow4(a)web.de> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/shell32/brsfolder.c | 36 +++++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/dlls/shell32/brsfolder.c b/dlls/shell32/brsfolder.c index daddf1e..91936bd 100644 --- a/dlls/shell32/brsfolder.c +++ b/dlls/shell32/brsfolder.c @@ -613,6 +613,32 @@ static LRESULT BrsFolder_Treeview_Rename(browse_info *info, NMTVDISPINFOW *pnmtv return 0; } +static HRESULT BrsFolder_Rename(browse_info *info, HTREEITEM rename) +{ + SendMessageW(info->hwndTreeView, TVM_SELECTITEM, TVGN_CARET, (LPARAM)rename); + SendMessageW(info->hwndTreeView, TVM_EDITLABELW, 0, (LPARAM)rename); + return S_OK; +} + +static LRESULT BrsFolder_Treeview_Keydown(browse_info *info, LPNMTVKEYDOWN keydown) +{ + HTREEITEM selected_item; + + /* Old dialog doesn't support those advanced features */ + if (!(info->lpBrowseInfo->ulFlags & BIF_NEWDIALOGSTYLE)) + return 0; + + selected_item = (HTREEITEM)SendMessageW(info->hwndTreeView, TVM_GETNEXTITEM, TVGN_CARET, 0); + + switch (keydown->wVKey) + { + case VK_F2: + BrsFolder_Rename(info, selected_item); + break; + } + return 0; +} + static LRESULT BrsFolder_OnNotify( browse_info *info, UINT CtlID, LPNMHDR lpnmh ) { NMTREEVIEWW *pnmtv = (NMTREEVIEWW *)lpnmh; @@ -640,6 +666,9 @@ static LRESULT BrsFolder_OnNotify( browse_info *info, UINT CtlID, LPNMHDR lpnmh case TVN_ENDLABELEDITW: return BrsFolder_Treeview_Rename( info, (LPNMTVDISPINFOW)pnmtv ); + case TVN_KEYDOWN: + return BrsFolder_Treeview_Keydown( info, (LPNMTVKEYDOWN)pnmtv ); + default: WARN("unhandled (%d)\n", pnmtv->hdr.code); break; @@ -721,13 +750,6 @@ static BOOL BrsFolder_OnCreate( HWND hWnd, browse_info *info ) return TRUE; } -static HRESULT BrsFolder_Rename(browse_info *info, HTREEITEM rename) -{ - SendMessageW(info->hwndTreeView, TVM_SELECTITEM, TVGN_CARET, (LPARAM)rename); - SendMessageW(info->hwndTreeView, TVM_EDITLABELW, 0, (LPARAM)rename); - return S_OK; -} - static HRESULT BrsFolder_NewFolder(browse_info *info) { DWORD flags = BrowseFlagsToSHCONTF(info->lpBrowseInfo->ulFlags);
1
0
0
0
Alex Henrie : imm32: Avoid using GCC's typeof extension.
by Alexandre Julliard
20 Sep '18
20 Sep '18
Module: wine Branch: master Commit: 1d65be607d2cb0eef090656f491c3d8bd694d1f3 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=1d65be607d2cb0eef090656f…
Author: Alex Henrie <alexhenrie24(a)gmail.com> Date: Wed Sep 19 22:44:34 2018 -0600 imm32: Avoid using GCC's typeof extension. Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com> Signed-off-by: Aric Stewart <aric(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/imm32/imm.c | 34 ++++++++++++++++------------------ 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/dlls/imm32/imm.c b/dlls/imm32/imm.c index f235e22..28eb00f 100644 --- a/dlls/imm32/imm.c +++ b/dlls/imm32/imm.c @@ -40,7 +40,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(imm); #define IMM_INIT_MAGIC 0x19650412 BOOL WINAPI User32InitializeImmEntryTable(DWORD); -#define MAKE_FUNCPTR(f) typeof(f) * p##f typedef struct _tagImmHkl{ struct list entry; HKL hkl; @@ -51,24 +50,23 @@ typedef struct _tagImmHkl{ HWND UIWnd; /* Function Pointers */ - MAKE_FUNCPTR(ImeInquire); - MAKE_FUNCPTR(ImeConfigure); - MAKE_FUNCPTR(ImeDestroy); - MAKE_FUNCPTR(ImeEscape); - MAKE_FUNCPTR(ImeSelect); - MAKE_FUNCPTR(ImeSetActiveContext); - MAKE_FUNCPTR(ImeToAsciiEx); - MAKE_FUNCPTR(NotifyIME); - MAKE_FUNCPTR(ImeRegisterWord); - MAKE_FUNCPTR(ImeUnregisterWord); - MAKE_FUNCPTR(ImeEnumRegisterWord); - MAKE_FUNCPTR(ImeSetCompositionString); - MAKE_FUNCPTR(ImeConversionList); - MAKE_FUNCPTR(ImeProcessKey); - MAKE_FUNCPTR(ImeGetRegisterWordStyle); - MAKE_FUNCPTR(ImeGetImeMenuItems); + BOOL (WINAPI *pImeInquire)(IMEINFO *, WCHAR *, const WCHAR *); + BOOL (WINAPI *pImeConfigure)(HKL, HWND, DWORD, void *); + BOOL (WINAPI *pImeDestroy)(UINT); + LRESULT (WINAPI *pImeEscape)(HIMC, UINT, void *); + BOOL (WINAPI *pImeSelect)(HIMC, BOOL); + BOOL (WINAPI *pImeSetActiveContext)(HIMC, BOOL); + UINT (WINAPI *pImeToAsciiEx)(UINT, UINT, const BYTE *, DWORD *, UINT, HIMC); + BOOL (WINAPI *pNotifyIME)(HIMC, DWORD, DWORD, DWORD); + BOOL (WINAPI *pImeRegisterWord)(const WCHAR *, DWORD, const WCHAR *); + BOOL (WINAPI *pImeUnregisterWord)(const WCHAR *, DWORD, const WCHAR *); + UINT (WINAPI *pImeEnumRegisterWord)(REGISTERWORDENUMPROCW, const WCHAR *, DWORD, const WCHAR *, void *); + BOOL (WINAPI *pImeSetCompositionString)(HIMC, DWORD, const void *, DWORD, const void *, DWORD); + DWORD (WINAPI *pImeConversionList)(HIMC, const WCHAR *, CANDIDATELIST *, DWORD, UINT); + BOOL (WINAPI *pImeProcessKey)(HIMC, UINT, LPARAM, const BYTE *); + UINT (WINAPI *pImeGetRegisterWordStyle)(UINT, STYLEBUFW *); + DWORD (WINAPI *pImeGetImeMenuItems)(HIMC, DWORD, DWORD, IMEMENUITEMINFOW *, IMEMENUITEMINFOW *, DWORD); } ImmHkl; -#undef MAKE_FUNCPTR typedef struct tagInputContextData {
1
0
0
0
Alexandre Julliard : server: Allow specifying the security descriptor for a new process.
by Alexandre Julliard
20 Sep '18
20 Sep '18
Module: wine Branch: master Commit: ac7ae92af1f53db3a240e266e1ba73466c8327a5 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=ac7ae92af1f53db3a240e266…
Author: Alexandre Julliard <julliard(a)winehq.org> Date: Thu Sep 20 13:39:28 2018 +0200 server: Allow specifying the security descriptor for a new process. Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/advapi32/tests/security.c | 3 --- dlls/kernel32/process.c | 5 +++-- include/wine/server_protocol.h | 5 ++--- server/process.c | 33 +++++++++++++++++++++++++-------- server/process.h | 3 ++- server/protocol.def | 2 +- server/request.c | 2 +- server/request.h | 7 +++---- server/trace.c | 2 +- 9 files changed, 38 insertions(+), 24 deletions(-) Diff:
https://source.winehq.org/git/wine.git/?a=commitdiff;h=ac7ae92af1f53db3a240…
1
0
0
0
Alexandre Julliard : server: Create the initial thread as a separate request.
by Alexandre Julliard
20 Sep '18
20 Sep '18
Module: wine Branch: master Commit: 39afcaac4a7a713188c5c23f5fe5114fc360c8d4 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=39afcaac4a7a713188c5c23f…
Author: Alexandre Julliard <julliard(a)winehq.org> Date: Thu Sep 20 13:26:35 2018 +0200 server: Create the initial thread as a separate request. Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/advapi32/tests/security.c | 1 - dlls/kernel32/process.c | 98 ++++++++++++++++++++++++++++++++++++++---- include/wine/server_protocol.h | 16 +++---- server/process.c | 9 +--- server/protocol.def | 10 ++--- server/request.h | 18 +++----- server/trace.c | 10 ++--- 7 files changed, 110 insertions(+), 52 deletions(-) Diff:
https://source.winehq.org/git/wine.git/?a=commitdiff;h=39afcaac4a7a713188c5…
1
0
0
0
Alexandre Julliard : server: Specify the process in which to create a new thread.
by Alexandre Julliard
20 Sep '18
20 Sep '18
Module: wine Branch: master Commit: 0fd450af5bad816f7134b5ce6a5b81fb7b962b44 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=0fd450af5bad816f7134b5ce…
Author: Alexandre Julliard <julliard(a)winehq.org> Date: Thu Sep 20 13:19:49 2018 +0200 server: Specify the process in which to create a new thread. Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/ntdll/thread.c | 1 + include/wine/server_protocol.h | 4 +++- server/protocol.def | 3 ++- server/request.h | 9 +++++---- server/thread.c | 31 +++++++++++++++++++++++++++---- server/trace.c | 3 ++- 6 files changed, 40 insertions(+), 11 deletions(-) diff --git a/dlls/ntdll/thread.c b/dlls/ntdll/thread.c index 7fa087d..8171638 100644 --- a/dlls/ntdll/thread.c +++ b/dlls/ntdll/thread.c @@ -605,6 +605,7 @@ NTSTATUS WINAPI RtlCreateUserThread( HANDLE process, SECURITY_DESCRIPTOR *descr, SERVER_START_REQ( new_thread ) { + req->process = wine_server_obj_handle( process ); req->access = THREAD_ALL_ACCESS; req->suspend = suspended; req->request_fd = request_pipe[0]; diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h index d31a1d4..02734bc 100644 --- a/include/wine/server_protocol.h +++ b/include/wine/server_protocol.h @@ -766,10 +766,12 @@ struct get_new_process_info_reply struct new_thread_request { struct request_header __header; + obj_handle_t process; unsigned int access; int suspend; int request_fd; /* VARARG(objattr,object_attributes); */ + char __pad_28[4]; }; struct new_thread_reply { @@ -6534,6 +6536,6 @@ union generic_reply struct terminate_job_reply terminate_job_reply; }; -#define SERVER_PROTOCOL_VERSION 561 +#define SERVER_PROTOCOL_VERSION 562 #endif /* __WINE_WINE_SERVER_PROTOCOL_H */ diff --git a/server/protocol.def b/server/protocol.def index 46669d6..1c2e130 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -766,8 +766,9 @@ struct rawinput_device @END -/* Create a new thread from the context of the parent */ +/* Create a new thread */ @REQ(new_thread) + obj_handle_t process; /* process in which to create thread */ unsigned int access; /* wanted access rights */ int suspend; /* new thread should be suspended on creation */ int request_fd; /* fd for request pipe */ diff --git a/server/request.h b/server/request.h index ff2da53..d7a4c8d 100644 --- a/server/request.h +++ b/server/request.h @@ -752,10 +752,11 @@ C_ASSERT( sizeof(struct get_new_process_info_request) == 16 ); C_ASSERT( FIELD_OFFSET(struct get_new_process_info_reply, success) == 8 ); C_ASSERT( FIELD_OFFSET(struct get_new_process_info_reply, exit_code) == 12 ); C_ASSERT( sizeof(struct get_new_process_info_reply) == 16 ); -C_ASSERT( FIELD_OFFSET(struct new_thread_request, access) == 12 ); -C_ASSERT( FIELD_OFFSET(struct new_thread_request, suspend) == 16 ); -C_ASSERT( FIELD_OFFSET(struct new_thread_request, request_fd) == 20 ); -C_ASSERT( sizeof(struct new_thread_request) == 24 ); +C_ASSERT( FIELD_OFFSET(struct new_thread_request, process) == 12 ); +C_ASSERT( FIELD_OFFSET(struct new_thread_request, access) == 16 ); +C_ASSERT( FIELD_OFFSET(struct new_thread_request, suspend) == 20 ); +C_ASSERT( FIELD_OFFSET(struct new_thread_request, request_fd) == 24 ); +C_ASSERT( sizeof(struct new_thread_request) == 32 ); C_ASSERT( FIELD_OFFSET(struct new_thread_reply, tid) == 8 ); C_ASSERT( FIELD_OFFSET(struct new_thread_reply, handle) == 12 ); C_ASSERT( sizeof(struct new_thread_reply) == 16 ); diff --git a/server/thread.c b/server/thread.c index d671377..7162fc3 100644 --- a/server/thread.c +++ b/server/thread.c @@ -1271,19 +1271,40 @@ unsigned int get_supported_cpu_mask(void) DECL_HANDLER(new_thread) { struct thread *thread; + struct process *process; struct unicode_str name; const struct security_descriptor *sd; const struct object_attributes *objattr = get_req_object_attributes( &sd, &name, NULL ); int request_fd = thread_get_inflight_fd( current, req->request_fd ); - if (request_fd == -1 || fcntl( request_fd, F_SETFL, O_NONBLOCK ) == -1) + if (!(process = get_process_from_handle( req->process, PROCESS_CREATE_THREAD ))) { if (request_fd != -1) close( request_fd ); - set_error( STATUS_INVALID_HANDLE ); return; } - if ((thread = create_thread( request_fd, current->process, sd ))) + if (process != current->process) + { + if (request_fd != -1) /* can't create a request fd in a different process */ + { + close( request_fd ); + set_error( STATUS_INVALID_PARAMETER ); + goto done; + } + if (process->running_threads) /* only the initial thread can be created in another process */ + { + set_error( STATUS_ACCESS_DENIED ); + goto done; + } + } + else if (request_fd == -1 || fcntl( request_fd, F_SETFL, O_NONBLOCK ) == -1) + { + if (request_fd != -1) close( request_fd ); + set_error( STATUS_INVALID_HANDLE ); + goto done; + } + + if ((thread = create_thread( request_fd, process, sd ))) { thread->system_regs = current->system_regs; if (req->suspend) thread->suspend++; @@ -1292,10 +1313,12 @@ DECL_HANDLER(new_thread) req->access, objattr->attributes ))) { /* thread object will be released when the thread gets killed */ - return; + goto done; } kill_thread( thread, 1 ); } +done: + release_object( process ); } /* initialize a new thread */ diff --git a/server/trace.c b/server/trace.c index 3054a18..a419ddf 100644 --- a/server/trace.c +++ b/server/trace.c @@ -1261,7 +1261,8 @@ static void dump_get_new_process_info_reply( const struct get_new_process_info_r static void dump_new_thread_request( const struct new_thread_request *req ) { - fprintf( stderr, " access=%08x", req->access ); + fprintf( stderr, " process=%04x", req->process ); + fprintf( stderr, ", access=%08x", req->access ); fprintf( stderr, ", suspend=%d", req->suspend ); fprintf( stderr, ", request_fd=%d", req->request_fd ); dump_varargs_object_attributes( ", objattr=", cur_size );
1
0
0
0
← Newer
1
...
18
19
20
21
22
23
24
...
67
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
Results per page:
10
25
50
100
200