Wine-Devel
By thread
wine-devel@list.winehq.org
By month
Messages by month
- ----- 2026 -----
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- 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
June 2018
- 68 participants
- 1149 messages
[PATCH 1/6] d3d11: Introduce get_resource_properties() helper function.
by Józef Kucia
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
dlls/d3d11/view.c | 259 +++++++++++++++++++-----------------------------------
1 file changed, 90 insertions(+), 169 deletions(-)
diff --git a/dlls/d3d11/view.c b/dlls/d3d11/view.c
index 164a1839e633..93d0b78655c1 100644
--- a/dlls/d3d11/view.c
+++ b/dlls/d3d11/view.c
@@ -25,6 +25,74 @@
WINE_DEFAULT_DEBUG_CHANNEL(d3d11);
+static HRESULT get_resource_properties(ID3D11Resource *resource, D3D11_RESOURCE_DIMENSION *dimension,
+ DXGI_FORMAT *format, unsigned int *miplevel_count, unsigned int *layer_count)
+{
+ ID3D11Resource_GetType(resource, dimension);
+ switch (*dimension)
+ {
+ case D3D11_RESOURCE_DIMENSION_BUFFER:
+ return S_OK;
+
+ case D3D11_RESOURCE_DIMENSION_TEXTURE1D:
+ {
+ const struct d3d_texture1d *texture;
+
+ if (!(texture = unsafe_impl_from_ID3D11Texture1D((ID3D11Texture1D *)resource)))
+ {
+ ERR("Cannot get implementation from ID3D11Texture1D.\n");
+ return E_FAIL;
+ }
+
+ *format = texture->desc.Format;
+ if (miplevel_count)
+ *miplevel_count = texture->desc.MipLevels;
+ *layer_count = texture->desc.ArraySize;
+ break;
+ }
+
+ case D3D11_RESOURCE_DIMENSION_TEXTURE2D:
+ {
+ const struct d3d_texture2d *texture;
+
+ if (!(texture = unsafe_impl_from_ID3D11Texture2D((ID3D11Texture2D *)resource)))
+ {
+ ERR("Cannot get implementation from ID3D11Texture2D.\n");
+ return E_FAIL;
+ }
+
+ *format = texture->desc.Format;
+ if (miplevel_count)
+ *miplevel_count = texture->desc.MipLevels;
+ *layer_count = texture->desc.ArraySize;
+ break;
+ }
+
+ case D3D11_RESOURCE_DIMENSION_TEXTURE3D:
+ {
+ const struct d3d_texture3d *texture;
+
+ if (!(texture = unsafe_impl_from_ID3D11Texture3D((ID3D11Texture3D *)resource)))
+ {
+ ERR("Cannot get implementation from ID3D11Texture3D.\n");
+ return E_FAIL;
+ }
+
+ *format = texture->desc.Format;
+ if (miplevel_count)
+ *miplevel_count = texture->desc.MipLevels;
+ *layer_count = texture->desc.Depth;
+ break;
+ }
+
+ default:
+ WARN("Invalid resource dimension %#x.\n", *dimension);
+ return E_INVALIDARG;
+ }
+
+ return S_OK;
+}
+
static HRESULT set_dsv_desc_from_resource(D3D11_DEPTH_STENCIL_VIEW_DESC *desc, ID3D11Resource *resource)
{
D3D11_RESOURCE_DIMENSION dimension;
@@ -113,10 +181,10 @@ static HRESULT set_dsv_desc_from_resource(D3D11_DEPTH_STENCIL_VIEW_DESC *desc, I
return S_OK;
}
- default:
- ERR("Unhandled resource dimension %#x.\n", dimension);
case D3D11_RESOURCE_DIMENSION_BUFFER:
case D3D11_RESOURCE_DIMENSION_TEXTURE3D:
+ default:
+ WARN("Invalid resource dimension %#x.\n", dimension);
return E_INVALIDARG;
}
}
@@ -126,36 +194,22 @@ static HRESULT normalize_dsv_desc(D3D11_DEPTH_STENCIL_VIEW_DESC *desc, ID3D11Res
D3D11_RESOURCE_DIMENSION dimension;
unsigned int layer_count;
DXGI_FORMAT format;
+ HRESULT hr;
- ID3D11Resource_GetType(resource, &dimension);
+ if (FAILED(hr = get_resource_properties(resource, &dimension, &format, NULL, &layer_count)))
+ return hr;
switch (dimension)
{
case D3D11_RESOURCE_DIMENSION_TEXTURE1D:
- {
- const struct d3d_texture1d *texture;
-
if (desc->ViewDimension != D3D11_DSV_DIMENSION_TEXTURE1D
&& desc->ViewDimension != D3D11_DSV_DIMENSION_TEXTURE1DARRAY)
{
WARN("Incompatible dimensions %#x, %#x.\n", dimension, desc->ViewDimension);
return E_INVALIDARG;
}
-
- if (!(texture = unsafe_impl_from_ID3D11Texture1D((ID3D11Texture1D *)resource)))
- {
- ERR("Cannot get implementation from ID3D11Texture1D.\n");
- return E_FAIL;
- }
-
- format = texture->desc.Format;
- layer_count = texture->desc.ArraySize;
break;
- }
case D3D11_RESOURCE_DIMENSION_TEXTURE2D:
- {
- const struct d3d_texture2d *texture;
-
if (desc->ViewDimension != D3D11_DSV_DIMENSION_TEXTURE2D
&& desc->ViewDimension != D3D11_DSV_DIMENSION_TEXTURE2DARRAY
&& desc->ViewDimension != D3D11_DSV_DIMENSION_TEXTURE2DMS
@@ -164,26 +218,13 @@ static HRESULT normalize_dsv_desc(D3D11_DEPTH_STENCIL_VIEW_DESC *desc, ID3D11Res
WARN("Incompatible dimensions %#x, %#x.\n", dimension, desc->ViewDimension);
return E_INVALIDARG;
}
-
- if (!(texture = unsafe_impl_from_ID3D11Texture2D((ID3D11Texture2D *)resource)))
- {
- ERR("Cannot get implementation from ID3D11Texture2D.\n");
- return E_FAIL;
- }
-
- format = texture->desc.Format;
- layer_count = texture->desc.ArraySize;
break;
- }
case D3D11_RESOURCE_DIMENSION_BUFFER:
case D3D11_RESOURCE_DIMENSION_TEXTURE3D:
+ default:
WARN("Invalid resource dimension %#x.\n", dimension);
return E_INVALIDARG;
-
- default:
- ERR("Unhandled resource dimension %#x.\n", dimension);
- return E_FAIL;
}
if (desc->Format == DXGI_FORMAT_UNKNOWN)
@@ -337,46 +378,30 @@ static HRESULT normalize_rtv_desc(D3D11_RENDER_TARGET_VIEW_DESC *desc, ID3D11Res
D3D11_RESOURCE_DIMENSION dimension;
unsigned int layer_count;
DXGI_FORMAT format;
+ HRESULT hr;
- ID3D11Resource_GetType(resource, &dimension);
+ if (FAILED(hr = get_resource_properties(resource, &dimension, &format, NULL, &layer_count)))
+ return hr;
switch (dimension)
{
case D3D11_RESOURCE_DIMENSION_BUFFER:
- {
if (desc->ViewDimension != D3D11_RTV_DIMENSION_BUFFER)
{
WARN("Incompatible dimensions %#x, %#x.\n", dimension, desc->ViewDimension);
return E_INVALIDARG;
}
return S_OK;
- }
case D3D11_RESOURCE_DIMENSION_TEXTURE1D:
- {
- const struct d3d_texture1d *texture;
-
if (desc->ViewDimension != D3D11_RTV_DIMENSION_TEXTURE1D
&& desc->ViewDimension != D3D11_RTV_DIMENSION_TEXTURE1DARRAY)
{
WARN("Incompatible dimensions %#x, %#x.\n", dimension, desc->ViewDimension);
return E_INVALIDARG;
}
-
- if (!(texture = unsafe_impl_from_ID3D11Texture1D((ID3D11Texture1D *)resource)))
- {
- ERR("Cannot get implementation from ID3D11Texture1D.\n");
- return E_FAIL;
- }
-
- format = texture->desc.Format;
- layer_count = texture->desc.ArraySize;
break;
- }
case D3D11_RESOURCE_DIMENSION_TEXTURE2D:
- {
- const struct d3d_texture2d *texture;
-
if (desc->ViewDimension != D3D11_RTV_DIMENSION_TEXTURE2D
&& desc->ViewDimension != D3D11_RTV_DIMENSION_TEXTURE2DARRAY
&& desc->ViewDimension != D3D11_RTV_DIMENSION_TEXTURE2DMS
@@ -385,42 +410,19 @@ static HRESULT normalize_rtv_desc(D3D11_RENDER_TARGET_VIEW_DESC *desc, ID3D11Res
WARN("Incompatible dimensions %#x, %#x.\n", dimension, desc->ViewDimension);
return E_INVALIDARG;
}
-
- if (!(texture = unsafe_impl_from_ID3D11Texture2D((ID3D11Texture2D *)resource)))
- {
- ERR("Cannot get implementation from ID3D11Texture2D.\n");
- return E_FAIL;
- }
-
- format = texture->desc.Format;
- layer_count = texture->desc.ArraySize;
break;
- }
case D3D11_RESOURCE_DIMENSION_TEXTURE3D:
- {
- const struct d3d_texture3d *texture;
-
if (desc->ViewDimension != D3D11_RTV_DIMENSION_TEXTURE3D)
{
WARN("Incompatible dimensions %#x, %#x.\n", dimension, desc->ViewDimension);
return E_INVALIDARG;
}
-
- if (!(texture = unsafe_impl_from_ID3D11Texture3D((ID3D11Texture3D *)resource)))
- {
- ERR("Cannot get implementation from ID3D11Texture3D.\n");
- return E_FAIL;
- }
-
- format = texture->desc.Format;
- layer_count = texture->desc.Depth;
break;
- }
default:
- ERR("Unhandled resource dimension %#x.\n", dimension);
- return E_FAIL;
+ WARN("Invalid resource dimension %#x.\n", dimension);
+ return E_INVALIDARG;
}
if (desc->Format == DXGI_FORMAT_UNKNOWN)
@@ -612,7 +614,7 @@ static HRESULT set_srv_desc_from_resource(D3D11_SHADER_RESOURCE_VIEW_DESC *desc,
}
default:
- ERR("Unhandled resource dimension %#x.\n", dimension);
+ WARN("Invalid resource dimension %#x.\n", dimension);
return E_INVALIDARG;
}
}
@@ -622,12 +624,13 @@ static HRESULT normalize_srv_desc(D3D11_SHADER_RESOURCE_VIEW_DESC *desc, ID3D11R
unsigned int miplevel_count, layer_count;
D3D11_RESOURCE_DIMENSION dimension;
DXGI_FORMAT format;
+ HRESULT hr;
- ID3D11Resource_GetType(resource, &dimension);
+ if (FAILED(hr = get_resource_properties(resource, &dimension, &format, &miplevel_count, &layer_count)))
+ return hr;
switch (dimension)
{
case D3D11_RESOURCE_DIMENSION_BUFFER:
- {
if (desc->ViewDimension != D3D11_SRV_DIMENSION_BUFFER
&& desc->ViewDimension != D3D11_SRV_DIMENSION_BUFFEREX)
{
@@ -640,35 +643,17 @@ static HRESULT normalize_srv_desc(D3D11_SHADER_RESOURCE_VIEW_DESC *desc, ID3D11R
return E_INVALIDARG;
}
return S_OK;
- }
case D3D11_RESOURCE_DIMENSION_TEXTURE1D:
- {
- const struct d3d_texture1d *texture;
-
if (desc->ViewDimension != D3D11_SRV_DIMENSION_TEXTURE1D
&& desc->ViewDimension != D3D11_SRV_DIMENSION_TEXTURE1DARRAY)
{
WARN("Incompatible dimensions %#x, %#x.\n", dimension, desc->ViewDimension);
return E_INVALIDARG;
}
-
- if (!(texture = unsafe_impl_from_ID3D11Texture1D((ID3D11Texture1D *)resource)))
- {
- ERR("Cannot get implementation from ID3D11Texture1D.\n");
- return E_FAIL;
- }
-
- format = texture->desc.Format;
- miplevel_count = texture->desc.MipLevels;
- layer_count = texture->desc.ArraySize;
break;
- }
case D3D11_RESOURCE_DIMENSION_TEXTURE2D:
- {
- const struct d3d_texture2d *texture;
-
if (desc->ViewDimension != D3D11_SRV_DIMENSION_TEXTURE2D
&& desc->ViewDimension != D3D11_SRV_DIMENSION_TEXTURE2DARRAY
&& desc->ViewDimension != D3D11_SRV_DIMENSION_TEXTURE2DMS
@@ -679,44 +664,19 @@ static HRESULT normalize_srv_desc(D3D11_SHADER_RESOURCE_VIEW_DESC *desc, ID3D11R
WARN("Incompatible dimensions %#x, %#x.\n", dimension, desc->ViewDimension);
return E_INVALIDARG;
}
-
- if (!(texture = unsafe_impl_from_ID3D11Texture2D((ID3D11Texture2D *)resource)))
- {
- ERR("Cannot get implementation from ID3D11Texture2D.\n");
- return E_FAIL;
- }
-
- format = texture->desc.Format;
- miplevel_count = texture->desc.MipLevels;
- layer_count = texture->desc.ArraySize;
break;
- }
case D3D11_RESOURCE_DIMENSION_TEXTURE3D:
- {
- const struct d3d_texture3d *texture;
-
if (desc->ViewDimension != D3D11_SRV_DIMENSION_TEXTURE3D)
{
WARN("Incompatible dimensions %#x, %#x.\n", dimension, desc->ViewDimension);
return E_INVALIDARG;
}
-
- if (!(texture = unsafe_impl_from_ID3D11Texture3D((ID3D11Texture3D *)resource)))
- {
- ERR("Cannot get implementation from ID3D11Texture3D.\n");
- return E_FAIL;
- }
-
- format = texture->desc.Format;
- miplevel_count = texture->desc.MipLevels;
- layer_count = 1;
break;
- }
default:
- ERR("Unhandled resource dimension %#x.\n", dimension);
- return E_FAIL;
+ WARN("Invalid resource dimension %#x.\n", dimension);
+ return E_INVALIDARG;
}
if (desc->Format == DXGI_FORMAT_UNKNOWN)
@@ -883,88 +843,49 @@ static HRESULT normalize_uav_desc(D3D11_UNORDERED_ACCESS_VIEW_DESC *desc, ID3D11
D3D11_RESOURCE_DIMENSION dimension;
unsigned int layer_count;
DXGI_FORMAT format;
+ HRESULT hr;
- ID3D11Resource_GetType(resource, &dimension);
+ if (FAILED(hr = get_resource_properties(resource, &dimension, &format, NULL, &layer_count)))
+ return hr;
switch (dimension)
{
case D3D11_RESOURCE_DIMENSION_BUFFER:
- {
if (desc->ViewDimension != D3D11_UAV_DIMENSION_BUFFER)
{
WARN("Incompatible dimensions %#x, %#x.\n", dimension, desc->ViewDimension);
return E_INVALIDARG;
}
return S_OK;
- }
case D3D11_RESOURCE_DIMENSION_TEXTURE1D:
- {
- const struct d3d_texture1d *texture;
-
if (desc->ViewDimension != D3D11_UAV_DIMENSION_TEXTURE1D
&& desc->ViewDimension != D3D11_UAV_DIMENSION_TEXTURE1DARRAY)
{
WARN("Incompatible dimensions %#x, %#x.\n", dimension, desc->ViewDimension);
return E_INVALIDARG;
}
-
- if (!(texture = unsafe_impl_from_ID3D11Texture1D((ID3D11Texture1D *)resource)))
- {
- ERR("Cannot get implementation from ID3D11Texture1D.\n");
- return E_FAIL;
- }
-
- format = texture->desc.Format;
- layer_count = texture->desc.ArraySize;
break;
- }
case D3D11_RESOURCE_DIMENSION_TEXTURE2D:
- {
- const struct d3d_texture2d *texture;
-
if (desc->ViewDimension != D3D11_UAV_DIMENSION_TEXTURE2D
&& desc->ViewDimension != D3D11_UAV_DIMENSION_TEXTURE2DARRAY)
{
WARN("Incompatible dimensions %#x, %#x.\n", dimension, desc->ViewDimension);
return E_INVALIDARG;
}
-
- if (!(texture = unsafe_impl_from_ID3D11Texture2D((ID3D11Texture2D *)resource)))
- {
- ERR("Cannot get implementation from ID3D11Texture2D.\n");
- return E_FAIL;
- }
-
- format = texture->desc.Format;
- layer_count = texture->desc.ArraySize;
break;
- }
case D3D11_RESOURCE_DIMENSION_TEXTURE3D:
- {
- const struct d3d_texture3d *texture;
-
if (desc->ViewDimension != D3D11_UAV_DIMENSION_TEXTURE3D)
{
WARN("Incompatible dimensions %#x, %#x.\n", dimension, desc->ViewDimension);
return E_INVALIDARG;
}
-
- if (!(texture = unsafe_impl_from_ID3D11Texture3D((ID3D11Texture3D *)resource)))
- {
- ERR("Cannot get implementation from ID3D11Texture3D.\n");
- return E_FAIL;
- }
-
- format = texture->desc.Format;
- layer_count = texture->desc.Depth;
break;
- }
default:
- ERR("Unhandled resource dimension %#x.\n", dimension);
- return E_FAIL;
+ WARN("Invalid resource dimension %#x.\n", dimension);
+ return E_INVALIDARG;
}
if (desc->Format == DXGI_FORMAT_UNKNOWN)
--
2.16.4
June 19, 2018
[PATCH] winedbg: Get rid of ifdefs.
by Józef Kucia
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
Backend functions are enclosed in #ifdef.
---
programs/winedbg/be_arm.c | 4 ----
programs/winedbg/be_arm64.c | 4 ----
programs/winedbg/be_ppc.c | 4 ----
programs/winedbg/be_x86_64.c | 4 ----
4 files changed, 16 deletions(-)
diff --git a/programs/winedbg/be_arm.c b/programs/winedbg/be_arm.c
index e3c8f72db65e..ad0e2857cda2 100644
--- a/programs/winedbg/be_arm.c
+++ b/programs/winedbg/be_arm.c
@@ -1891,12 +1891,8 @@ static BOOL be_arm_store_integer(const struct dbg_lvalue* lvalue, unsigned size,
static BOOL be_arm_get_context(HANDLE thread, dbg_ctx_t *ctx)
{
-#ifdef __arm__
ctx->ctx.ContextFlags = CONTEXT_ALL;
return GetThreadContext(thread, &ctx->ctx);
-#else
- WINE_FIXME("Cannot debug an ARM process on this architecture.\n");
-#endif
}
static BOOL be_arm_set_context(HANDLE thread, const dbg_ctx_t *ctx)
diff --git a/programs/winedbg/be_arm64.c b/programs/winedbg/be_arm64.c
index a87921f437f8..bca86b825740 100644
--- a/programs/winedbg/be_arm64.c
+++ b/programs/winedbg/be_arm64.c
@@ -280,12 +280,8 @@ void be_arm64_disasm_one_insn(ADDRESS64 *addr, int display)
static BOOL be_arm64_get_context(HANDLE thread, dbg_ctx_t *ctx)
{
-#ifdef __aarch64__
ctx->ctx.ContextFlags = CONTEXT_ALL;
return GetThreadContext(thread, &ctx->ctx);
-#else
- WINE_FIXME("Cannot debug an ARM64 process on this architecture.\n");
-#endif
}
static BOOL be_arm64_set_context(HANDLE thread, const dbg_ctx_t *ctx)
diff --git a/programs/winedbg/be_ppc.c b/programs/winedbg/be_ppc.c
index 54bcb5960a39..ff6ece6df3ae 100644
--- a/programs/winedbg/be_ppc.c
+++ b/programs/winedbg/be_ppc.c
@@ -182,12 +182,8 @@ static BOOL be_ppc_store_integer(const struct dbg_lvalue* lvalue, unsigned size,
static BOOL be_ppc_get_context(HANDLE thread, dbg_ctx_t *ctx)
{
-#ifdef __powerpc__
ctx->ctx.ContextFlags = CONTEXT_ALL;
return GetThreadContext(thread, &ctx->ctx);
-#else
- WINE_FIXME("Cannot debug a PowerPC process on this architecture.\n");
-#endif
}
static BOOL be_ppc_set_context(HANDLE thread, const dbg_ctx_t *ctx)
diff --git a/programs/winedbg/be_x86_64.c b/programs/winedbg/be_x86_64.c
index b7f75c6bdba6..136229fbd66c 100644
--- a/programs/winedbg/be_x86_64.c
+++ b/programs/winedbg/be_x86_64.c
@@ -676,12 +676,8 @@ static BOOL be_x86_64_store_integer(const struct dbg_lvalue* lvalue, unsigned si
static BOOL be_x86_64_get_context(HANDLE thread, dbg_ctx_t *ctx)
{
-#ifdef __x86_64__
ctx->ctx.ContextFlags = CONTEXT_ALL;
return GetThreadContext(thread, &ctx->ctx);
-#else
- WINE_FIXME("Cannot debug an x86-64 process on this architecture.\n");
-#endif
}
static BOOL be_x86_64_set_context(HANDLE thread, const dbg_ctx_t *ctx)
--
2.16.4
June 19, 2018
Re: [PATCH 2/4 v2] msi: Re-publish product if previous installation with different package is detected
by Hans Leidekker
Signed-off-by: Hans Leidekker <hans(a)codeweavers.com>
June 19, 2018
[PATCH 2/4 v2] msi: Re-publish product if previous installation with different package is detected
by Piotr Caban
Signed-off-by: Piotr Caban <piotr(a)codeweavers.com>
---
dlls/msi/action.c | 50 +++++++++++++++++++++++++++++++++++++++++++-------
dlls/msi/msipriv.h | 1 +
dlls/msi/package.c | 4 ++--
3 files changed, 46 insertions(+), 9 deletions(-)
June 19, 2018
Re: [PATCH 4/4] msi: Add ProductToBeRegistered property tests
by Hans Leidekker
Signed-off-by: Hans Leidekker <hans(a)codeweavers.com>
June 19, 2018
Re: [PATCH 2/2] wsdapi/tests: Add tests for AppSequence in Probe message. [v2]
by Huw Davies
Signed-off-by: Huw Davies <huw(a)codeweavers.com>
June 19, 2018
Re: [PATCH 3/4] msi: Add REINSTALLMODE=v installation mode test
by Hans Leidekker
Signed-off-by: Hans Leidekker <hans(a)codeweavers.com>
June 19, 2018
Re: [PATCH 2/4] msi: Re-publish product if previous installation with different package is detected
by Hans Leidekker
> diff --git a/dlls/msi/action.c b/dlls/msi/action.c
> index 74917afdd1..ba351b45bc 100644
> --- a/dlls/msi/action.c
> +++ b/dlls/msi/action.c
> @@ -4473,6 +4473,7 @@ static UINT ACTION_PublishProduct(MSIPACKAGE *package)
> UINT rc;
> HKEY hukey = NULL, hudkey = NULL;
> MSIRECORD *uirow;
> + BOOL republish = FALSE;
>
> if (!list_empty(&package->patches))
> {
> @@ -4481,14 +4482,65 @@ static UINT ACTION_PublishProduct(MSIPACKAGE *package)
> goto end;
> }
>
> - /* FIXME: also need to publish if the product is in advertise mode */
> - if (!msi_check_publish(package))
> - return ERROR_SUCCESS;
> -
> rc = MSIREG_OpenProductKey(package->ProductCode, NULL, package->Context,
> - &hukey, TRUE);
> - if (rc != ERROR_SUCCESS)
> - goto end;
> + &hukey, FALSE);
> + if (rc == ERROR_SUCCESS)
> + {
> + WCHAR *package_code;
> +
> + package_code = msi_reg_get_val_str(hukey, INSTALLPROPERTY_PACKAGECODEW);
> + if (package_code)
> + {
> + WCHAR guid[MAX_PATH], packed[SQUASHED_GUID_SIZE], *p;
> + MSIHANDLE hdb, suminfo;
> + DWORD size;
> +
> + hdb = alloc_msihandle(&package->db->hdr);
> + if (!hdb)
> + {
> + RegCloseKey(hukey);
> + return ERROR_NOT_ENOUGH_MEMORY;
> + }
> +
> + rc = MsiGetSummaryInformationW(hdb, NULL, 0, &suminfo);
> + MsiCloseHandle(hdb);
> + if (rc == ERROR_SUCCESS)
> + {
> + size = sizeof(guid);
> + rc = MsiSummaryInfoGetPropertyW(suminfo, PID_REVNUMBER, NULL, NULL, NULL, guid, &size);
> + MsiCloseHandle(suminfo);
> + }
> + if (rc == ERROR_SUCCESS)
> + {
> + p = strchrW(guid, ';');
> + if (p) *p = 0;
> + squash_guid(guid, packed);
This duplicates code to retrieve the package code in msi_publish_product_properties.
You could use get_package_code from package.c, which avoids creating a handle.
June 19, 2018
Re: [PATCH 1/2] wsdapi: Add support for parsing AppSequence header. [v2]
by Huw Davies
Signed-off-by: Huw Davies <huw(a)codeweavers.com>
June 19, 2018
Re: [PATCH 1/4] msi: Add support for ProductToBeRegistered property
by Hans Leidekker
Signed-off-by: Hans Leidekker <hans(a)codeweavers.com>
June 19, 2018
[PATCH 2/2] wsdapi/tests: Add tests for AppSequence in Probe message. [v2]
by Owen Rudge
v2: Fix missing string null terminator.
Signed-off-by: Owen Rudge <orudge(a)codeweavers.com>
---
dlls/wsdapi/tests/discovery.c | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
June 19, 2018
[PATCH 1/2] wsdapi: Add support for parsing AppSequence header. [v2]
by Owen Rudge
Signed-off-by: Owen Rudge <orudge(a)codeweavers.com>
---
dlls/wsdapi/soap.c | 92
+++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 91 insertions(+), 1 deletion(-)
June 19, 2018
Re: [PATCH 2/2] wsdapi/tests: Add tests for AppSequence in Probe message.
by Owen Rudge
> This is failing for me:
Ah, think I missed a null character off the wide GUID string - I expect it'll be that. Thanks for letting me know.
Owen
June 19, 2018
Re: [PATCH 2/2] wsdapi/tests: Add tests for AppSequence in Probe message.
by Huw Davies
On Mon, Jun 18, 2018 at 10:41:55PM +0100, Owen Rudge wrote:
> Signed-off-by: Owen Rudge <orudge(a)codeweavers.com>
> ---
> dlls/wsdapi/tests/discovery.c | 18 ++++++++++++++++++
> 1 file changed, 18 insertions(+)
>
>
> diff --git a/dlls/wsdapi/tests/discovery.c b/dlls/wsdapi/tests/discovery.c
> index 84aa67d663..13b6de0b34 100644
> --- a/dlls/wsdapi/tests/discovery.c
> +++ b/dlls/wsdapi/tests/discovery.c
> @@ -48,6 +48,7 @@ static const char testProbeMessage[] = "<?xml version=\"1.0\" encoding=\"utf-8\"
> "xmlns:grog=\"http://more.tests/\"><soap:Header><wsa:To>urn:schemas-xmlsoap-org:ws:2005:04:discovery</wsa:To>"
> "<wsa:Action>http://schemas.xmlsoap.org/ws/2005/04/discovery/Probe</wsa:Action>"
> "<wsa:MessageID>urn:uuid:%s</wsa:MessageID>"
> + "<wsd:AppSequence InstanceId=\"21\" SequenceId=\"urn:uuid:638abee8-124d-4b6a-8b85-8cf2837a2fd2\" MessageNumber=\"14\"></wsd:AppSequence>"
> "<grog:Perry>ExtraInfo</grog:Perry></soap:Header>"
> "<soap:Body><wsd:Probe><wsd:Types>grog:Cider</wsd:Types><grog:Lager>MoreInfo</grog:Lager></wsd:Probe></soap:Body></soap:Envelope>";
>
> @@ -533,6 +534,7 @@ static HRESULT WINAPI IWSDiscoveryPublisherNotifyImpl_ProbeHandler(IWSDiscoveryP
> static const WCHAR perry[] = {'P','e','r','r','y',0};
> static const WCHAR extra_info[] = {'E','x','t','r','a','I','n','f','o',0};
> WSD_PROBE *probe_msg = (WSD_PROBE *) pSoap->Body;
> + WSD_APP_SEQUENCE *appseq = (WSD_APP_SEQUENCE *) pSoap->Header.AppSequence;
>
> ok(pSoap->Body != NULL, "pSoap->Body == NULL\n");
> ok(pSoap->Header.To != NULL && lstrcmpW(pSoap->Header.To, discoveryTo) == 0,
> @@ -556,6 +558,22 @@ static HRESULT WINAPI IWSDiscoveryPublisherNotifyImpl_ProbeHandler(IWSDiscoveryP
> if ((ret != RPC_S_OK) || (UuidEqual(&uuid, &probe_message_id, &ret) == FALSE)) return S_OK;
> }
>
> + ok(appseq != NULL, "pSoap->Header.AppSequence == NULL\n");
> +
> + if (appseq != NULL)
> + {
> + static const WCHAR seq_id[] = {'u','r','n',':','u','u','i','d',':','6','3','8','a','b','e','e','8','-',
> + '1','2','4','d','-','4','b','6','a','-','8','b','8','5','-',
> + '8','c','f','2','8','3','7','a','2','f','d','2'};
> +
> + ok(appseq->InstanceId == 21, "pSoap->Header.AppSequence->InstanceId = %s\n",
> + wine_dbgstr_longlong(appseq->InstanceId));
> + ok(lstrcmpW(appseq->SequenceId, seq_id) == 0, "pSoap->Header.AppSequence->SequenceId = '%s'\n",
> + wine_dbgstr_w(appseq->SequenceId));
> + ok(appseq->MessageNumber == 14, "pSoap->Header.AppSequence->MessageNumber = %s\n",
> + wine_dbgstr_longlong(appseq->MessageNumber));
> + }
> +
> verify_wsdxml_any_text("pSoap->Header.AnyHeaders", pSoap->Header.AnyHeaders, uri_more_tests_no_slash,
> prefix_grog, perry, extra_info);
>
>
This is failing for me:
../../../tools/runtest -q -P wine -T ../../.. -M wsdapi.dll -p wsdapi_test.exe.so discovery && touch discovery.ok
0009:fixme:hnetcfg:fw_profile_get_FirewallEnabled 0x164100, 0x32fcd2
0009:fixme:winsock:set_dont_fragment IP_DONTFRAGMENT for IPv4 not supported in this platform
0038:fixme:webservices:WsReadToStartElement name and/or namespace not verified
0037:fixme:webservices:WsReadToStartElement name and/or namespace not verified
0034:fixme:webservices:WsReadToStartElement name and/or namespace not verified
0038:fixme:webservices:WsReadToStartElement name and/or namespace not verified
0034:fixme:webservices:WsReadToStartElement name and/or namespace not verified
0037:fixme:webservices:WsReadToStartElement name and/or namespace not verified
0038:fixme:webservices:WsReadToStartElement name and/or namespace not verified
0034:fixme:webservices:WsReadToStartElement name and/or namespace not verified
0038:fixme:webservices:WsReadToStartElement name and/or namespace not verified
0038:fixme:webservices:WsReadToStartElement name and/or namespace not verified
0037:fixme:webservices:WsReadToStartElement name and/or namespace not verified
0038:fixme:webservices:WsReadToStartElement name and/or namespace not verified
discovery.c:571: Test failed: pSoap->Header.AppSequence->SequenceId = 'L"urn:uuid:638abee8-124d-4b6a-8b85-8cf2837a2fd2"'
0034:fixme:webservices:WsReadToStartElement name and/or namespace not verified
discovery.c:571: Test failed: pSoap->Header.AppSequence->SequenceId = 'L"urn:uuid:638abee8-124d-4b6a-8b85-8cf2837a2fd2"'
0037:fixme:webservices:WsReadToStartElement name and/or namespace not verified
discovery.c:571: Test failed: pSoap->Header.AppSequence->SequenceId = 'L"urn:uuid:638abee8-124d-4b6a-8b85-8cf2837a2fd2"'
0038:fixme:webservices:WsReadToStartElement name and/or namespace not verified
discovery.c:571: Test failed: pSoap->Header.AppSequence->SequenceId = 'L"urn:uuid:638abee8-124d-4b6a-8b85-8cf2837a2fd2"'
004a:fixme:webservices:WsReadToStartElement name and/or namespace not verified
0046:fixme:webservices:WsReadToStartElement name and/or namespace not verified
0049:fixme:webservices:WsReadToStartElement name and/or namespace not verified
004a:fixme:webservices:WsReadToStartElement name and/or namespace not verified
0049:fixme:webservices:WsReadToStartElement name and/or namespace not verified
0046:fixme:webservices:WsReadToStartElement name and/or namespace not verified
004a:fixme:webservices:WsReadToStartElement name and/or namespace not verified
004a:fixme:webservices:WsReadToStartElement name and/or namespace not verified
0049:fixme:webservices:WsReadToStartElement name and/or namespace not verified
004a:fixme:webservices:WsReadToStartElement name and/or namespace not verified
0046:fixme:webservices:WsReadToStartElement name and/or namespace not verified
004a:fixme:webservices:WsReadToStartElement name and/or namespace not verified
make: *** [Makefile:225: discovery.ok] Error 4
June 19, 2018
[PATCH 2/2] wsdapi/tests: Add tests for AppSequence in Probe message.
by Owen Rudge
Signed-off-by: Owen Rudge <orudge(a)codeweavers.com>
---
dlls/wsdapi/tests/discovery.c | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
June 18, 2018
[PATCH 1/2] wsdapi: Add support for parsing AppSequence header.
by Owen Rudge
Signed-off-by: Owen Rudge <orudge(a)codeweavers.com>
---
dlls/wsdapi/soap.c | 92
+++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 91 insertions(+), 1 deletion(-)
June 18, 2018
Status of Bug 35902
by Farmboy0
Hello everyone,
I was wondering what the holdup with the staging patchset for Bug 35902 is.
Is there anything to be left done in order to integrate the patches into
wine?
Regards
Farmboy0
June 18, 2018
[PATCH 4/4] msi: Add ProductToBeRegistered property tests
by Piotr Caban
Signed-off-by: Piotr Caban <piotr(a)codeweavers.com>
---
dlls/msi/tests/package.c | 12 ++++++++++++
1 file changed, 12 insertions(+)
June 18, 2018
[PATCH 3/4] msi: Add REINSTALLMODE=v installation mode test
by Piotr Caban
Signed-off-by: Piotr Caban <piotr(a)codeweavers.com>
---
dlls/msi/tests/package.c | 25 +++++++++++++++++++------
1 file changed, 19 insertions(+), 6 deletions(-)
June 18, 2018
[PATCH 2/4] msi: Re-publish product if previous installation with different package is detected
by Piotr Caban
Signed-off-by: Piotr Caban <piotr(a)codeweavers.com>
---
dlls/msi/action.c | 66
+++++++++++++++++++++++++++++++++++++++++++++++++------
1 file changed, 59 insertions(+), 7 deletions(-)
June 18, 2018
[PATCH 1/4] msi: Add support for ProductToBeRegistered property
by Piotr Caban
Signed-off-by: Piotr Caban <piotr(a)codeweavers.com>
---
dlls/msi/action.c | 3 ++-
dlls/msi/msipriv.h | 1 +
dlls/msi/package.c | 11 ++++++++++-
3 files changed, 13 insertions(+), 2 deletions(-)
June 18, 2018
Re: [PATCH v2 1/3] gdiplus: Fix a memory leak.
by Vincent Povirk
Signed-off-by: Vincent Povirk <vincent(a)codeweavers.com>
June 18, 2018
Re: [PATCH v3] vbscript: Treat \r as a newline separator.
by Jacek Caban
Signed-off-by: Jacek Caban <jacek(a)codeweavers.com>
June 18, 2018
Re: [PATCH] urlmon/tests: Use the available ARRAY_SIZE() macro
by Jacek Caban
Signed-off-by: Jacek Caban <jacek(a)codeweavers.com>
June 18, 2018
Re: [PATCH v2 3/3] gdiplus: Avoid calling GdipFillPath() with an empty path.
by Vincent Povirk
This breaks a test:
graphics.c:1764: Test failed: Expected 4, got 0
0060:fixme:gdiplus:GdipGetNearestColor (0x88120, 0x23f96c): Passing
color unmodified
0060:fixme:gdiplus:GdipMeasureDriverString Ignoring flags 100
Makefile:327: recipe for target 'graphics.ok' failed
make: *** [graphics.ok] Error 1
June 18, 2018
Re: [PATCH v2 2/3] gdiplus: Report error for brush_fill_path().
by Vincent Povirk
I don't think we should trust that MSDN's list of possible errors is
complete. Since we don't expect any of the error cases (at least after
patch 3), I think it would be good enough to set GenericError without
checking GetLastError.
June 18, 2018
[PATCH v2 3/3] gdiplus: Avoid calling GdipFillPath() with an empty path.
by Zhiyi Zhang
There is no point filling an empty path. And an empty
path will cause SelectClipPath() used in brush_fill_path()
to return error.
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
---
dlls/gdiplus/graphics.c | 3 +++
dlls/gdiplus/tests/graphics.c | 47 +++++++++++++++++++++++++++++++++++
2 files changed, 50 insertions(+)
diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c
index 030019cb4b..3ba3f0f4f4 100644
--- a/dlls/gdiplus/graphics.c
+++ b/dlls/gdiplus/graphics.c
@@ -4268,6 +4268,9 @@ GpStatus WINGDIPAPI GdipFillPath(GpGraphics *graphics, GpBrush *brush, GpPath *p
if(!brush || !graphics || !path)
return InvalidParameter;
+ if (!path->pathdata.Count)
+ return Ok;
+
if(graphics->busy)
return ObjectBusy;
diff --git a/dlls/gdiplus/tests/graphics.c b/dlls/gdiplus/tests/graphics.c
index ae75c0efc1..5eb0a8a4d0 100644
--- a/dlls/gdiplus/tests/graphics.c
+++ b/dlls/gdiplus/tests/graphics.c
@@ -1539,6 +1539,52 @@ static void test_GdipFillClosedCurveI(void)
ReleaseDC(hwnd, hdc);
}
+static void test_GdipFillPath(void)
+{
+ GpStatus status;
+ GpGraphics *graphics;
+ GpSolidFill *brush;
+ GpPath *path;
+ HDC hdc = GetDC(hwnd);
+
+ ok(hdc != NULL, "Expected HDC to be initialized\n");
+ status = GdipCreateFromHDC(hdc, &graphics);
+ expect(Ok, status);
+ ok(graphics != NULL, "Expected graphics to be initialized\n");
+ status = GdipCreateSolidFill((ARGB)0xffffffff, &brush);
+ expect(Ok, status);
+ ok(brush != NULL, "Expected brush to be initialized\n");
+ status = GdipCreatePath(FillModeAlternate, &path);
+ expect(Ok, status);
+ ok(path != NULL, "Expected path to be initialized\n");
+
+ /* Empty path */
+ GdipResetPath(path);
+ status = GdipFillPath(graphics, (GpBrush *)brush, path);
+ expect(Ok, status);
+
+ /* Not closed path */
+ GdipResetPath(path);
+ status = GdipAddPathLineI(path, 0, 0, 2, 2);
+ expect(Ok, status);
+ status = GdipAddPathLineI(path, 2, 2, 4, 0);
+ expect(Ok, status);
+ status = GdipFillPath(graphics, (GpBrush *)brush, path);
+ expect(Ok, status);
+
+ /* Closed path */
+ GdipResetPath(path);
+ status = GdipAddPathRectangle(path, 0, 0, 4, 4);
+ expect(Ok, status);
+ status = GdipFillPath(graphics, (GpBrush *)brush, path);
+ expect(Ok, status);
+
+ GdipDeletePath(path);
+ GdipDeleteBrush((GpBrush *)brush);
+ GdipDeleteGraphics(graphics);
+ ReleaseDC(hwnd, hdc);
+}
+
static void test_Get_Release_DC(void)
{
GpStatus status;
@@ -6795,6 +6841,7 @@ START_TEST(graphics)
test_GdipDrawImagePointsRect();
test_GdipFillClosedCurve();
test_GdipFillClosedCurveI();
+ test_GdipFillPath();
test_GdipDrawString();
test_GdipGetNearestColor();
test_GdipGetVisibleClipBounds();
--
2.17.1
June 18, 2018
[PATCH v2 2/3] gdiplus: Report error for brush_fill_path().
by Zhiyi Zhang
Operation should be skipped if SelectClipPath() returns any
error. And we should report unexpected error to the caller.
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
---
dlls/gdiplus/graphics.c | 32 ++++++++++++++++++++++++++------
1 file changed, 26 insertions(+), 6 deletions(-)
diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c
index 894e879233..030019cb4b 100644
--- a/dlls/gdiplus/graphics.c
+++ b/dlls/gdiplus/graphics.c
@@ -1050,8 +1050,10 @@ static BOOL brush_can_fill_path(GpBrush *brush, BOOL is_fill)
}
}
-static void brush_fill_path(GpGraphics *graphics, GpBrush* brush)
+static GpStatus brush_fill_path(GpGraphics *graphics, GpBrush *brush)
{
+ DWORD error;
+ GpStatus status = Ok;
switch (brush->bt)
{
case BrushTypeSolidColor:
@@ -1064,13 +1066,25 @@ static void brush_fill_path(GpGraphics *graphics, GpBrush* brush)
RECT rc;
/* partially transparent fill */
- SelectClipPath(graphics->hdc, RGN_AND);
+ if (!SelectClipPath(graphics->hdc, RGN_AND))
+ {
+ error = GetLastError();
+ if (error == ERROR_CAN_NOT_COMPLETE)
+ status = GenericError;
+ else if (error == ERROR_INVALID_PARAMETER)
+ status = InvalidParameter;
+ else if (error == ERROR_NOT_ENOUGH_MEMORY)
+ status = OutOfMemory;
+ DeleteObject(bmp);
+ break;
+ }
if (GetClipBox(graphics->hdc, &rc) != NULLREGION)
{
HDC hdc = CreateCompatibleDC(NULL);
if (!hdc)
{
+ status = OutOfMemory;
DeleteObject(bmp);
break;
}
@@ -1091,7 +1105,11 @@ static void brush_fill_path(GpGraphics *graphics, GpBrush* brush)
HBRUSH gdibrush, old_brush;
gdibrush = create_gdi_brush(brush);
- if (!gdibrush) return;
+ if (!gdibrush)
+ {
+ status = OutOfMemory;
+ break;
+ }
old_brush = SelectObject(graphics->hdc, gdibrush);
FillPath(graphics->hdc);
@@ -1100,6 +1118,8 @@ static void brush_fill_path(GpGraphics *graphics, GpBrush* brush)
break;
}
}
+
+ return status;
}
static BOOL brush_can_fill_pixels(GpBrush *brush)
@@ -4205,7 +4225,7 @@ static GpStatus GDI32_GdipFillPath(GpGraphics *graphics, GpBrush *brush, GpPath
if(retval == Ok)
{
EndPath(graphics->hdc);
- brush_fill_path(graphics, brush);
+ retval = brush_fill_path(graphics, brush);
}
gdi_transform_release(graphics);
@@ -4511,13 +4531,13 @@ static GpStatus GDI32_GdipFillRegion(GpGraphics* graphics, GpBrush* brush,
Rectangle(graphics->hdc, rc.left, rc.top, rc.right, rc.bottom);
EndPath(graphics->hdc);
- brush_fill_path(graphics, brush);
+ status = brush_fill_path(graphics, brush);
}
RestoreDC(graphics->hdc, save_state);
- return Ok;
+ return status;
}
static GpStatus SOFTWARE_GdipFillRegion(GpGraphics *graphics, GpBrush *brush,
--
2.17.1
June 18, 2018
[PATCH v2 1/3] gdiplus: Fix a memory leak.
by Zhiyi Zhang
bmp is leaked if fail to create hdc.
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
---
dlls/gdiplus/graphics.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c
index 76aabe74bf..894e879233 100644
--- a/dlls/gdiplus/graphics.c
+++ b/dlls/gdiplus/graphics.c
@@ -1069,7 +1069,11 @@ static void brush_fill_path(GpGraphics *graphics, GpBrush* brush)
{
HDC hdc = CreateCompatibleDC(NULL);
- if (!hdc) break;
+ if (!hdc)
+ {
+ DeleteObject(bmp);
+ break;
+ }
SelectObject(hdc, bmp);
gdi_alpha_blend(graphics, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top,
--
2.17.1
June 18, 2018
Re: [PATCH] gdiplus: Check return value of SelectClipPath in brush_fill_path().
by Zhiyi Zhang
Hi Vincent,
I tested open paths for path to region function manually. It works on Windows and Wine.
So we have to consider empty path on Wine only. In case any error happens in
SelectClipPath(), further operation is canceled and error is reported to the
caller. V2 is sent.
Thanks,
Zhiyi
On Sat 6 16 23:26, Vincent Povirk wrote:
> If converting a path to a region fails for an open path, then our code
> in get_path_hrgn is also wrong. From reading gdi32 code, think it will
> work as long as there are points in the path, but the only way to be
> sure is to add a test.
>
> If we check for failure in SelectClipPath, I agree that we should not
> continue the operation for any error. I think we should report failure
> to the caller if it's an error we don't expect. That would also help
> explain why it's correct to silently ignore the failure.
>
> On Sat, Jun 16, 2018 at 9:31 AM, Zhiyi Zhang <zzhang(a)codeweavers.com> wrote:
>> Hi Vincent,
>>
>> Yes, we could check if a path is empty just like get_path_hrgn did.
>> I also worried that a not empty but open path will also make SelectClipPath()
>> fail. Is there any function to check if a path is closed? I couldn't found any.
>> As for SelectClipPath() last error, I don't think any further operation should
>> be continued if any error occurs.
>> So we add a check for empty path and also skip further operation if SelectClipPath()
>> returns any error. Is that enough?
>>
>> Thanks,
>> Zhiyi
>>
>> On Fri 6 15 23:55, Vincent Povirk wrote:
>>> It looks like we also encountered this case in get_path_hrgn. Maybe we
>>> shouldn't call brush_fill_pixels if the path is empty? If we're going
>>> to ignore errors, I think we should at least check GetLastError() to
>>> make sure it's one we expect.
>>>
>>> On Fri, Jun 15, 2018 at 4:04 AM, Zhiyi Zhang <zzhang(a)codeweavers.com> wrote:
>>>> For Crossover bug 16126.
>>>>
>>>> When GraphicPath is empty, filling path with gdi32 will
>>>> result in a DC with empty path. When SelectClipPath() is
>>>> called with such a DC, it will fail because it requires
>>>> a closed path in DC. Thus further operation should be canceled.
>>>>
>>>> Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
>>>> ---
>>>> dlls/gdiplus/graphics.c | 5 +++--
>>>> 1 file changed, 3 insertions(+), 2 deletions(-)
>>>>
>>>> diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c
>>>> index 76aabe74bf..2a95d686fa 100644
>>>> --- a/dlls/gdiplus/graphics.c
>>>> +++ b/dlls/gdiplus/graphics.c
>>>> @@ -1052,6 +1052,7 @@ static BOOL brush_can_fill_path(GpBrush *brush, BOOL is_fill)
>>>>
>>>> static void brush_fill_path(GpGraphics *graphics, GpBrush* brush)
>>>> {
>>>> + BOOL success;
>>>> switch (brush->bt)
>>>> {
>>>> case BrushTypeSolidColor:
>>>> @@ -1064,8 +1065,8 @@ static void brush_fill_path(GpGraphics *graphics, GpBrush* brush)
>>>> RECT rc;
>>>> /* partially transparent fill */
>>>>
>>>> - SelectClipPath(graphics->hdc, RGN_AND);
>>>> - if (GetClipBox(graphics->hdc, &rc) != NULLREGION)
>>>> + success = SelectClipPath(graphics->hdc, RGN_AND);
>>>> + if (success && GetClipBox(graphics->hdc, &rc) != NULLREGION)
>>>> {
>>>> HDC hdc = CreateCompatibleDC(NULL);
>>>>
>>>> --
>>>> 2.17.1
>>>>
>>>>
>>>>
June 18, 2018
Re: [PATCH v7 4/8] ntdll: Return BIOS info from NtQuerySystemInformation on Linux
by Alex Henrie
On Mon, Jun 18, 2018 at 5:26 AM Huw Davies <huw(a)codeweavers.com> wrote:
>
> On Mon, Jun 18, 2018 at 12:21:52PM +0100, Huw Davies wrote:
> > On Mon, Jun 18, 2018 at 05:09:32AM -0600, Alex Henrie wrote:
> > > Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
> > > ---
> > > dlls/ntdll/nt.c | 172 ++++++++++++++++++++++++++++++++++++++++
> > > dlls/ntdll/tests/info.c | 11 ++-
> > > 2 files changed, 181 insertions(+), 2 deletions(-)
> > >
> > > diff --git a/dlls/ntdll/nt.c b/dlls/ntdll/nt.c
> > > index dc0ce04f42..40e36c0ffd 100644
> > > --- a/dlls/ntdll/nt.c
> > > +++ b/dlls/ntdll/nt.c
> > > @@ -1850,6 +1879,127 @@ static NTSTATUS create_logical_proc_info(SYSTEM_LOGICAL_PROCESSOR_INFORMATION **
> > > }
> > > #endif
> > >
> > > +static inline void copy_smbios_string(char **buffer, char *s, size_t len)
> > > +{
> > > + if (!len) return;
> > > + strcpy(*buffer, s);
> > > + *buffer += len + 1;
> > > +}
> > > +
> > > +#ifdef linux
> > > +
> > > +#define FWSS 128 /* firmware string size */
> > > +
> > > +static void get_smbios_string(const char *path, char *s, size_t *len)
> > > +{
> > > + FILE *file = fopen(path, "r");
> > > + if (!file)
> > > + {
> > > + *len = 0;
> > > + return;
> > > + }
> > > +
> > > + *len = fread(s, 1, FWSS - 1, file);
> >
> > That's pretty ugly. This function really shouldn't
> > assume the size of the buffer is has to play with.
We're talking about Linux-specific code, and FWSS is used in both
get_smbios_string and get_firmware_info, so it's not much of an
assumption.
> Note, it may be more convenient to use a separate
> 'size' [in] parameter rather than use len as [in,out].
The helper function doesn't need to support more than one buffer size,
so passing the buffer size is redundant.
I'd want to hear at least one more Wine developer's opinion before
making a change.
-Alex
June 18, 2018
Re: [PATCH v7 4/8] ntdll: Return BIOS info from NtQuerySystemInformation on Linux
by Marvin
Hi,
While running your changed tests on Windows, I think I found new failures.
Being a bot and all I'm not very good at pattern recognition, so I might be
wrong, but could you please double-check?
Full results can be found at
https://testbot.winehq.org/JobDetails.pl?Key=39218
Your paranoid android.
=== wvistau64 (32 bit info) ===
info.c:1855: Test failed: Expected STATUS_SUCCESS, got c0000022
0890:info: unhandled exception c0000005 at 002D0000
=== wvistau64_zh_CN (32 bit info) ===
info.c:1855: Test failed: Expected STATUS_SUCCESS, got c0000022
0bb8:info: unhandled exception c0000005 at 00370000
=== wvistau64_fr (32 bit info) ===
info.c:1855: Test failed: Expected STATUS_SUCCESS, got c0000022
0830:info: unhandled exception c0000005 at 00340000
=== wvistau64_he (32 bit info) ===
info.c:1855: Test failed: Expected STATUS_SUCCESS, got c0000022
0bd8:info: unhandled exception c0000005 at 002D0000
=== w2008s64 (32 bit info) ===
info.c:1855: Test failed: Expected STATUS_SUCCESS, got c0000022
086c:info: unhandled exception c0000005 at 003D0000
=== w7u (32 bit info) ===
info.c:1855: Test failed: Expected STATUS_SUCCESS, got c0000022
=== w7pro64 (32 bit info) ===
info.c:1855: Test failed: Expected STATUS_SUCCESS, got c0000022
0ab8:info: unhandled exception c0000005 at 00340000
=== w8 (32 bit info) ===
info.c:1855: Test failed: Expected STATUS_SUCCESS, got c0000022
0f4c:info: unhandled exception c0000005 at 00310000
=== w864 (32 bit info) ===
info.c:1855: Test failed: Expected STATUS_SUCCESS, got c0000022
0a18:info: unhandled exception c0000005 at 003D0000
=== w1064 (32 bit info) ===
info.c:1855: Test failed: Expected STATUS_SUCCESS, got c0000022
0a10:info: unhandled exception c0000005 at 00390000
June 18, 2018
Re: [PATCH v7 4/8] ntdll: Return BIOS info from NtQuerySystemInformation on Linux
by Huw Davies
On Mon, Jun 18, 2018 at 12:21:52PM +0100, Huw Davies wrote:
> On Mon, Jun 18, 2018 at 05:09:32AM -0600, Alex Henrie wrote:
> > Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
> > ---
> > dlls/ntdll/nt.c | 172 ++++++++++++++++++++++++++++++++++++++++
> > dlls/ntdll/tests/info.c | 11 ++-
> > 2 files changed, 181 insertions(+), 2 deletions(-)
> >
> > diff --git a/dlls/ntdll/nt.c b/dlls/ntdll/nt.c
> > index dc0ce04f42..40e36c0ffd 100644
> > --- a/dlls/ntdll/nt.c
> > +++ b/dlls/ntdll/nt.c
> > @@ -1850,6 +1879,127 @@ static NTSTATUS create_logical_proc_info(SYSTEM_LOGICAL_PROCESSOR_INFORMATION **
> > }
> > #endif
> >
> > +static inline void copy_smbios_string(char **buffer, char *s, size_t len)
> > +{
> > + if (!len) return;
> > + strcpy(*buffer, s);
> > + *buffer += len + 1;
> > +}
> > +
> > +#ifdef linux
> > +
> > +#define FWSS 128 /* firmware string size */
> > +
> > +static void get_smbios_string(const char *path, char *s, size_t *len)
> > +{
> > + FILE *file = fopen(path, "r");
> > + if (!file)
> > + {
> > + *len = 0;
> > + return;
> > + }
> > +
> > + *len = fread(s, 1, FWSS - 1, file);
>
> That's pretty ugly. This function really shouldn't
> assume the size of the buffer is has to play with.
Note, it may be more convenient to use a separate
'size' [in] parameter rather than use len as [in,out].
Huw.
June 18, 2018
Re: [PATCH v7 4/8] ntdll: Return BIOS info from NtQuerySystemInformation on Linux
by Huw Davies
On Mon, Jun 18, 2018 at 05:09:32AM -0600, Alex Henrie wrote:
> Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
> ---
> dlls/ntdll/nt.c | 172 ++++++++++++++++++++++++++++++++++++++++
> dlls/ntdll/tests/info.c | 11 ++-
> 2 files changed, 181 insertions(+), 2 deletions(-)
>
> diff --git a/dlls/ntdll/nt.c b/dlls/ntdll/nt.c
> index dc0ce04f42..40e36c0ffd 100644
> --- a/dlls/ntdll/nt.c
> +++ b/dlls/ntdll/nt.c
> @@ -1850,6 +1879,127 @@ static NTSTATUS create_logical_proc_info(SYSTEM_LOGICAL_PROCESSOR_INFORMATION **
> }
> #endif
>
> +static inline void copy_smbios_string(char **buffer, char *s, size_t len)
> +{
> + if (!len) return;
> + strcpy(*buffer, s);
> + *buffer += len + 1;
> +}
> +
> +#ifdef linux
> +
> +#define FWSS 128 /* firmware string size */
> +
> +static void get_smbios_string(const char *path, char *s, size_t *len)
> +{
> + FILE *file = fopen(path, "r");
> + if (!file)
> + {
> + *len = 0;
> + return;
> + }
> +
> + *len = fread(s, 1, FWSS - 1, file);
That's pretty ugly. This function really shouldn't
assume the size of the buffer is has to play with.
> + fclose(file);
> +
> + if (*len >= 1 && s[*len - 1] == '\n')
> + {
> + s[*len - 1] = 0;
> + (*len)--;
> + }
> + else
> + {
> + s[*len] = 0;
> + }
> +}
> +
> +static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti,
> + ULONG available_len, ULONG *required_len)
> +{
> + switch (sfti->ProviderSignature)
> + {
> + case RSMB:
> + {
> + char bios_vendor[FWSS], bios_version[FWSS], bios_date[FWSS];
> + size_t bios_vendor_len, bios_version_len, bios_date_len;
> + char *buffer = (char*)sfti->TableBuffer;
> + BYTE string_count;
> + struct smbios_prologue *prologue;
> + struct smbios_bios *bios;
> +
> + get_smbios_string("/sys/class/dmi/id/bios_vendor", bios_vendor, &bios_vendor_len);
> + get_smbios_string("/sys/class/dmi/id/bios_version", bios_version, &bios_version_len);
> + get_smbios_string("/sys/class/dmi/id/bios_date", bios_date, &bios_date_len);
> +
June 18, 2018
Re: [PATCH v2] msvcrt: Use already existent oneexit_table functions for _onexit and _c_exit
by Piotr Caban
Hi Fabian,
On 06/17/18 19:48, Fabian Maurer wrote:
> -#define LOCK_EXIT _mlock(_EXIT_LOCK1)
> -#define UNLOCK_EXIT _munlock(_EXIT_LOCK1)
It's still needed to hold the exit lock. Older versions of msvcrt were
doing it (I didn't test if newer versions are still using this lock).
Thanks,
Piotr
June 18, 2018
Re: [PATCH v7 2/8] ntdll/tests: Add SystemFirmwareTableInformation tests
by Marvin
Hi,
While running your changed tests on Windows, I think I found new failures.
Being a bot and all I'm not very good at pattern recognition, so I might be
wrong, but could you please double-check?
Full results can be found at
https://testbot.winehq.org/JobDetails.pl?Key=39216
Your paranoid android.
=== wvistau64 (32 bit info) ===
info.c:1848: Test failed: Expected STATUS_SUCCESS, got c0000022
0890:info: unhandled exception c0000005 at 002D0000
=== wvistau64_zh_CN (32 bit info) ===
info.c:1848: Test failed: Expected STATUS_SUCCESS, got c0000022
0bcc:info: unhandled exception c0000005 at 00590000
=== wvistau64_fr (32 bit info) ===
info.c:1848: Test failed: Expected STATUS_SUCCESS, got c0000022
072c:info: unhandled exception c0000005 at 00370000
=== wvistau64_he (32 bit info) ===
info.c:1848: Test failed: Expected STATUS_SUCCESS, got c0000022
0be4:info: unhandled exception c0000005 at 003C0000
=== w2008s64 (32 bit info) ===
info.c:1848: Test failed: Expected STATUS_SUCCESS, got c0000022
0ac8:info: unhandled exception c0000005 at 003D0000
=== w7u (32 bit info) ===
info.c:1848: Test failed: Expected STATUS_SUCCESS, got c0000022
=== w7pro64 (32 bit info) ===
info.c:1848: Test failed: Expected STATUS_SUCCESS, got c0000022
0a98:info: unhandled exception c0000005 at 003C0000
=== w8 (32 bit info) ===
info.c:1848: Test failed: Expected STATUS_SUCCESS, got c0000022
0e78:info: unhandled exception c0000005 at 005A0000
=== w864 (32 bit info) ===
info.c:1848: Test failed: Expected STATUS_SUCCESS, got c0000022
09e8:info: unhandled exception c0000005 at 00350000
=== w1064 (32 bit info) ===
info.c:1848: Test failed: Expected STATUS_SUCCESS, got c0000022
0a10:info: unhandled exception c0000005 at 003A0000
June 18, 2018
[PATCH v7 8/8] ntdll: Return chassis info from NtQuerySystemInformation on Linux
by Alex Henrie
Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
---
dlls/ntdll/nt.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 49 insertions(+)
diff --git a/dlls/ntdll/nt.c b/dlls/ntdll/nt.c
index bce7348ba6..9fcb9a8155 100644
--- a/dlls/ntdll/nt.c
+++ b/dlls/ntdll/nt.c
@@ -108,6 +108,17 @@ struct smbios_board {
BYTE serial;
};
+struct smbios_chassis {
+ BYTE type;
+ BYTE length;
+ WORD handle;
+ BYTE vendor;
+ BYTE shape;
+ BYTE version;
+ BYTE serial;
+ BYTE asset_tag;
+};
+
#include "poppack.h"
/* Firmware table providers */
@@ -1946,12 +1957,15 @@ static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti
size_t system_vendor_len, system_product_len, system_version_len, system_serial_len;
char board_vendor[FWSS], board_product[FWSS], board_version[FWSS], board_serial[FWSS];
size_t board_vendor_len, board_product_len, board_version_len, board_serial_len;
+ char chassis_vendor[FWSS], chassis_version[FWSS], chassis_serial[FWSS], chassis_asset_tag[FWSS];
+ size_t chassis_vendor_len, chassis_version_len, chassis_serial_len, chassis_asset_tag_len;
char *buffer = (char*)sfti->TableBuffer;
BYTE string_count;
struct smbios_prologue *prologue;
struct smbios_bios *bios;
struct smbios_system *system;
struct smbios_board *board;
+ struct smbios_chassis *chassis;
get_smbios_string("/sys/class/dmi/id/bios_vendor", bios_vendor, &bios_vendor_len);
get_smbios_string("/sys/class/dmi/id/bios_version", bios_version, &bios_version_len);
@@ -1964,6 +1978,10 @@ static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti
get_smbios_string("/sys/class/dmi/id/board_name", board_product, &board_product_len);
get_smbios_string("/sys/class/dmi/id/board_version", board_version, &board_version_len);
get_smbios_string("/sys/class/dmi/id/board_serial", board_serial, &board_serial_len);
+ get_smbios_string("/sys/class/dmi/id/chassis_vendor", chassis_vendor, &chassis_vendor_len);
+ get_smbios_string("/sys/class/dmi/id/chassis_version", chassis_version, &chassis_version_len);
+ get_smbios_string("/sys/class/dmi/id/chassis_serial", chassis_serial, &chassis_serial_len);
+ get_smbios_string("/sys/class/dmi/id/chassis_tag", chassis_asset_tag, &chassis_asset_tag_len);
*required_len = sizeof(struct smbios_prologue);
@@ -1977,6 +1995,10 @@ static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti
*required_len += sizeof(struct smbios_board);
*required_len += max(board_vendor_len + board_product_len + board_version_len + board_serial_len + 5, 2);
+ *required_len += sizeof(struct smbios_chassis);
+ *required_len += max(chassis_vendor_len + chassis_version_len + chassis_serial_len +
+ chassis_asset_tag_len + 5, 2);
+
sfti->TableBufferLength = *required_len;
*required_len += FIELD_OFFSET(SYSTEM_FIRMWARE_TABLE_INFORMATION, TableBuffer);
@@ -2065,6 +2087,33 @@ static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti
copy_smbios_string(&buffer, board_version, board_version_len);
copy_smbios_string(&buffer, board_serial, board_serial_len);
memset(buffer, 0, 1);
+ buffer++;
+ }
+ else
+ {
+ memset(buffer, 0, 2);
+ buffer += 2;
+ }
+
+ string_count = 0;
+ chassis = (struct smbios_chassis*)buffer;
+ chassis->type = 3;
+ chassis->length = sizeof(struct smbios_chassis);
+ chassis->handle = 0;
+ chassis->vendor = chassis_vendor_len ? ++string_count : 0;
+ chassis->shape = 0x2; /* unknown */
+ chassis->version = chassis_version_len ? ++string_count : 0;
+ chassis->serial = chassis_serial_len ? ++string_count : 0;
+ chassis->asset_tag = chassis_asset_tag_len ? ++string_count : 0;
+ buffer += sizeof(struct smbios_chassis);
+
+ if (string_count)
+ {
+ copy_smbios_string(&buffer, chassis_vendor, chassis_vendor_len);
+ copy_smbios_string(&buffer, chassis_version, chassis_version_len);
+ copy_smbios_string(&buffer, chassis_serial, chassis_serial_len);
+ copy_smbios_string(&buffer, chassis_asset_tag, chassis_asset_tag_len);
+ memset(buffer, 0, 1);
}
else
{
--
2.17.1
June 18, 2018
[PATCH v7 7/8] ntdll: Return board info from NtQuerySystemInformation on Linux
by Alex Henrie
Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
---
dlls/ntdll/nt.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 46 insertions(+)
diff --git a/dlls/ntdll/nt.c b/dlls/ntdll/nt.c
index 401e3b473d..bce7348ba6 100644
--- a/dlls/ntdll/nt.c
+++ b/dlls/ntdll/nt.c
@@ -98,6 +98,16 @@ struct smbios_system {
BYTE serial;
};
+struct smbios_board {
+ BYTE type;
+ BYTE length;
+ WORD handle;
+ BYTE vendor;
+ BYTE product;
+ BYTE version;
+ BYTE serial;
+};
+
#include "poppack.h"
/* Firmware table providers */
@@ -1934,11 +1944,14 @@ static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti
size_t bios_vendor_len, bios_version_len, bios_date_len;
char system_vendor[FWSS], system_product[FWSS], system_version[FWSS], system_serial[FWSS];
size_t system_vendor_len, system_product_len, system_version_len, system_serial_len;
+ char board_vendor[FWSS], board_product[FWSS], board_version[FWSS], board_serial[FWSS];
+ size_t board_vendor_len, board_product_len, board_version_len, board_serial_len;
char *buffer = (char*)sfti->TableBuffer;
BYTE string_count;
struct smbios_prologue *prologue;
struct smbios_bios *bios;
struct smbios_system *system;
+ struct smbios_board *board;
get_smbios_string("/sys/class/dmi/id/bios_vendor", bios_vendor, &bios_vendor_len);
get_smbios_string("/sys/class/dmi/id/bios_version", bios_version, &bios_version_len);
@@ -1947,6 +1960,10 @@ static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti
get_smbios_string("/sys/class/dmi/id/product", system_product, &system_product_len);
get_smbios_string("/sys/class/dmi/id/product_version", system_version, &system_version_len);
get_smbios_string("/sys/class/dmi/id/product_serial", system_serial, &system_serial_len);
+ get_smbios_string("/sys/class/dmi/id/board_vendor", board_vendor, &board_vendor_len);
+ get_smbios_string("/sys/class/dmi/id/board_name", board_product, &board_product_len);
+ get_smbios_string("/sys/class/dmi/id/board_version", board_version, &board_version_len);
+ get_smbios_string("/sys/class/dmi/id/board_serial", board_serial, &board_serial_len);
*required_len = sizeof(struct smbios_prologue);
@@ -1957,6 +1974,9 @@ static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti
*required_len += max(system_vendor_len + system_product_len + system_version_len +
system_serial_len + 5, 2);
+ *required_len += sizeof(struct smbios_board);
+ *required_len += max(board_vendor_len + board_product_len + board_version_len + board_serial_len + 5, 2);
+
sfti->TableBufferLength = *required_len;
*required_len += FIELD_OFFSET(SYSTEM_FIRMWARE_TABLE_INFORMATION, TableBuffer);
@@ -2019,6 +2039,32 @@ static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti
copy_smbios_string(&buffer, system_version, system_version_len);
copy_smbios_string(&buffer, system_serial, system_serial_len);
memset(buffer, 0, 1);
+ buffer++;
+ }
+ else
+ {
+ memset(buffer, 0, 2);
+ buffer += 2;
+ }
+
+ string_count = 0;
+ board = (struct smbios_board*)buffer;
+ board->type = 2;
+ board->length = sizeof(struct smbios_board);
+ board->handle = 0;
+ board->vendor = board_vendor_len ? ++string_count : 0;
+ board->product = board_product_len ? ++string_count : 0;
+ board->version = board_version_len ? ++string_count : 0;
+ board->serial = board_serial_len ? ++string_count : 0;
+ buffer += sizeof(struct smbios_board);
+
+ if (string_count)
+ {
+ copy_smbios_string(&buffer, board_vendor, board_vendor_len);
+ copy_smbios_string(&buffer, board_product, board_product_len);
+ copy_smbios_string(&buffer, board_version, board_version_len);
+ copy_smbios_string(&buffer, board_serial, board_serial_len);
+ memset(buffer, 0, 1);
}
else
{
--
2.17.1
June 18, 2018
[PATCH v7 6/8] ntdll: Return system info from NtQuerySystemInformation on Linux
by Alex Henrie
Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
---
dlls/ntdll/nt.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 47 insertions(+)
diff --git a/dlls/ntdll/nt.c b/dlls/ntdll/nt.c
index 40e36c0ffd..401e3b473d 100644
--- a/dlls/ntdll/nt.c
+++ b/dlls/ntdll/nt.c
@@ -88,6 +88,16 @@ struct smbios_bios {
UINT64 characteristics;
};
+struct smbios_system {
+ BYTE type;
+ BYTE length;
+ WORD handle;
+ BYTE vendor;
+ BYTE product;
+ BYTE version;
+ BYTE serial;
+};
+
#include "poppack.h"
/* Firmware table providers */
@@ -1922,20 +1932,31 @@ static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti
{
char bios_vendor[FWSS], bios_version[FWSS], bios_date[FWSS];
size_t bios_vendor_len, bios_version_len, bios_date_len;
+ char system_vendor[FWSS], system_product[FWSS], system_version[FWSS], system_serial[FWSS];
+ size_t system_vendor_len, system_product_len, system_version_len, system_serial_len;
char *buffer = (char*)sfti->TableBuffer;
BYTE string_count;
struct smbios_prologue *prologue;
struct smbios_bios *bios;
+ struct smbios_system *system;
get_smbios_string("/sys/class/dmi/id/bios_vendor", bios_vendor, &bios_vendor_len);
get_smbios_string("/sys/class/dmi/id/bios_version", bios_version, &bios_version_len);
get_smbios_string("/sys/class/dmi/id/bios_date", bios_date, &bios_date_len);
+ get_smbios_string("/sys/class/dmi/id/sys_vendor", system_vendor, &system_vendor_len);
+ get_smbios_string("/sys/class/dmi/id/product", system_product, &system_product_len);
+ get_smbios_string("/sys/class/dmi/id/product_version", system_version, &system_version_len);
+ get_smbios_string("/sys/class/dmi/id/product_serial", system_serial, &system_serial_len);
*required_len = sizeof(struct smbios_prologue);
*required_len += sizeof(struct smbios_bios);
*required_len += max(bios_vendor_len + bios_version_len + bios_date_len + 4, 2);
+ *required_len += sizeof(struct smbios_system);
+ *required_len += max(system_vendor_len + system_product_len + system_version_len +
+ system_serial_len + 5, 2);
+
sfti->TableBufferLength = *required_len;
*required_len += FIELD_OFFSET(SYSTEM_FIRMWARE_TABLE_INFORMATION, TableBuffer);
@@ -1972,6 +1993,32 @@ static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti
copy_smbios_string(&buffer, bios_version, bios_version_len);
copy_smbios_string(&buffer, bios_date, bios_date_len);
memset(buffer, 0, 1);
+ buffer++;
+ }
+ else
+ {
+ memset(buffer, 0, 2);
+ buffer += 2;
+ }
+
+ string_count = 0;
+ system = (struct smbios_system*)buffer;
+ system->type = 1;
+ system->length = sizeof(struct smbios_system);
+ system->handle = 0;
+ system->vendor = system_vendor_len ? ++string_count : 0;
+ system->product = system_product_len ? ++string_count : 0;
+ system->version = system_version_len ? ++string_count : 0;
+ system->serial = system_serial_len ? ++string_count : 0;
+ buffer += sizeof(struct smbios_system);
+
+ if (string_count)
+ {
+ copy_smbios_string(&buffer, system_vendor, system_vendor_len);
+ copy_smbios_string(&buffer, system_product, system_product_len);
+ copy_smbios_string(&buffer, system_version, system_version_len);
+ copy_smbios_string(&buffer, system_serial, system_serial_len);
+ memset(buffer, 0, 1);
}
else
{
--
2.17.1
June 18, 2018
[PATCH v7 5/8] kernel32: Connect GetSystemFirmwareTable to NtQuerySystemInformation
by Alex Henrie
Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
---
dlls/kernel32/cpu.c | 29 +++++++++++++++++++++++++++++
dlls/kernel32/process.c | 10 ----------
dlls/kernel32/tests/version.c | 2 +-
3 files changed, 30 insertions(+), 11 deletions(-)
diff --git a/dlls/kernel32/cpu.c b/dlls/kernel32/cpu.c
index ec1fd0f90d..8397fbe729 100644
--- a/dlls/kernel32/cpu.c
+++ b/dlls/kernel32/cpu.c
@@ -336,3 +336,32 @@ DWORD64 WINAPI GetEnabledXStateFeatures(void)
FIXME("\n");
return 0;
}
+
+/***********************************************************************
+ * GetSystemFirmwareTable (KERNEL32.@)
+ */
+UINT WINAPI GetSystemFirmwareTable(DWORD provider, DWORD id, void *buffer, DWORD size)
+{
+ ULONG buffer_size = FIELD_OFFSET(SYSTEM_FIRMWARE_TABLE_INFORMATION, TableBuffer) + size;
+ SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti = HeapAlloc(GetProcessHeap(), 0, buffer_size);
+ NTSTATUS status;
+
+ if (!sfti)
+ {
+ SetLastError(ERROR_OUTOFMEMORY);
+ return 0;
+ }
+
+ sfti->ProviderSignature = provider;
+ sfti->Action = SystemFirmwareTable_Get;
+ sfti->TableID = id;
+
+ status = NtQuerySystemInformation(SystemFirmwareTableInformation, sfti, buffer_size, &buffer_size);
+ buffer_size -= FIELD_OFFSET(SYSTEM_FIRMWARE_TABLE_INFORMATION, TableBuffer);
+ if (buffer_size <= size)
+ memcpy(buffer, sfti->TableBuffer, buffer_size);
+
+ if (status) SetLastError(RtlNtStatusToDosError(status));
+ HeapFree(GetProcessHeap(), 0, sfti);
+ return buffer_size;
+}
diff --git a/dlls/kernel32/process.c b/dlls/kernel32/process.c
index ff56e9a692..6adf08d257 100644
--- a/dlls/kernel32/process.c
+++ b/dlls/kernel32/process.c
@@ -4126,16 +4126,6 @@ HRESULT WINAPI UnregisterApplicationRestart(void)
return S_OK;
}
-/***********************************************************************
- * GetSystemFirmwareTable (KERNEL32.@)
- */
-UINT WINAPI GetSystemFirmwareTable(DWORD provider, DWORD id, PVOID buffer, DWORD size)
-{
- FIXME("(%d %d %p %d):stub\n", provider, id, buffer, size);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return 0;
-}
-
struct proc_thread_attr
{
DWORD_PTR attr;
diff --git a/dlls/kernel32/tests/version.c b/dlls/kernel32/tests/version.c
index 08e8f0fb58..e33ce9cd42 100644
--- a/dlls/kernel32/tests/version.c
+++ b/dlls/kernel32/tests/version.c
@@ -717,7 +717,7 @@ void test_GetSystemFirmwareTable(void)
pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, 16, &expected_len);
if (expected_len == 0) /* xp, 2003 */
{
- skip("SystemFirmwareTableInformation is not available\n");
+ win_skip("SystemFirmwareTableInformation is not available\n");
HeapFree(GetProcessHeap(), 0, sfti);
return;
}
--
2.17.1
June 18, 2018
[PATCH v7 4/8] ntdll: Return BIOS info from NtQuerySystemInformation on Linux
by Alex Henrie
Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
---
dlls/ntdll/nt.c | 172 ++++++++++++++++++++++++++++++++++++++++
dlls/ntdll/tests/info.c | 11 ++-
2 files changed, 181 insertions(+), 2 deletions(-)
diff --git a/dlls/ntdll/nt.c b/dlls/ntdll/nt.c
index dc0ce04f42..40e36c0ffd 100644
--- a/dlls/ntdll/nt.c
+++ b/dlls/ntdll/nt.c
@@ -66,6 +66,35 @@
WINE_DEFAULT_DEBUG_CHANNEL(ntdll);
+#include "pshpack1.h"
+
+struct smbios_prologue {
+ BYTE calling_method;
+ BYTE major_version;
+ BYTE minor_version;
+ BYTE revision;
+ DWORD length;
+};
+
+struct smbios_bios {
+ BYTE type;
+ BYTE length;
+ WORD handle;
+ BYTE vendor;
+ BYTE version;
+ WORD start;
+ BYTE date;
+ BYTE size;
+ UINT64 characteristics;
+};
+
+#include "poppack.h"
+
+/* Firmware table providers */
+#define ACPI 0x41435049
+#define FIRM 0x4649524D
+#define RSMB 0x52534D42
+
/*
* Token
*/
@@ -1850,6 +1879,127 @@ static NTSTATUS create_logical_proc_info(SYSTEM_LOGICAL_PROCESSOR_INFORMATION **
}
#endif
+static inline void copy_smbios_string(char **buffer, char *s, size_t len)
+{
+ if (!len) return;
+ strcpy(*buffer, s);
+ *buffer += len + 1;
+}
+
+#ifdef linux
+
+#define FWSS 128 /* firmware string size */
+
+static void get_smbios_string(const char *path, char *s, size_t *len)
+{
+ FILE *file = fopen(path, "r");
+ if (!file)
+ {
+ *len = 0;
+ return;
+ }
+
+ *len = fread(s, 1, FWSS - 1, file);
+ fclose(file);
+
+ if (*len >= 1 && s[*len - 1] == '\n')
+ {
+ s[*len - 1] = 0;
+ (*len)--;
+ }
+ else
+ {
+ s[*len] = 0;
+ }
+}
+
+static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti,
+ ULONG available_len, ULONG *required_len)
+{
+ switch (sfti->ProviderSignature)
+ {
+ case RSMB:
+ {
+ char bios_vendor[FWSS], bios_version[FWSS], bios_date[FWSS];
+ size_t bios_vendor_len, bios_version_len, bios_date_len;
+ char *buffer = (char*)sfti->TableBuffer;
+ BYTE string_count;
+ struct smbios_prologue *prologue;
+ struct smbios_bios *bios;
+
+ get_smbios_string("/sys/class/dmi/id/bios_vendor", bios_vendor, &bios_vendor_len);
+ get_smbios_string("/sys/class/dmi/id/bios_version", bios_version, &bios_version_len);
+ get_smbios_string("/sys/class/dmi/id/bios_date", bios_date, &bios_date_len);
+
+ *required_len = sizeof(struct smbios_prologue);
+
+ *required_len += sizeof(struct smbios_bios);
+ *required_len += max(bios_vendor_len + bios_version_len + bios_date_len + 4, 2);
+
+ sfti->TableBufferLength = *required_len;
+
+ *required_len += FIELD_OFFSET(SYSTEM_FIRMWARE_TABLE_INFORMATION, TableBuffer);
+
+ if (available_len < *required_len)
+ {
+ return STATUS_BUFFER_TOO_SMALL;
+ }
+
+ prologue = (struct smbios_prologue*)buffer;
+ prologue->calling_method = 0;
+ prologue->major_version = 2;
+ prologue->minor_version = 0;
+ prologue->revision = 0;
+ prologue->length = sfti->TableBufferLength - sizeof(struct smbios_prologue);
+ buffer += sizeof(struct smbios_prologue);
+
+ string_count = 0;
+ bios = (struct smbios_bios*)buffer;
+ bios->type = 0;
+ bios->length = sizeof(struct smbios_bios);
+ bios->handle = 0;
+ bios->vendor = bios_vendor_len ? ++string_count : 0;
+ bios->version = bios_version_len ? ++string_count : 0;
+ bios->start = 0;
+ bios->date = bios_date_len ? ++string_count : 0;
+ bios->size = 0;
+ bios->characteristics = 0x4; /* not supported */
+ buffer += sizeof(struct smbios_bios);
+
+ if (string_count)
+ {
+ copy_smbios_string(&buffer, bios_vendor, bios_vendor_len);
+ copy_smbios_string(&buffer, bios_version, bios_version_len);
+ copy_smbios_string(&buffer, bios_date, bios_date_len);
+ memset(buffer, 0, 1);
+ }
+ else
+ {
+ memset(buffer, 0, 2);
+ }
+
+ return STATUS_SUCCESS;
+ }
+ default:
+ {
+ FIXME("info_class SYSTEM_FIRMWARE_TABLE_INFORMATION\n");
+ return STATUS_NOT_IMPLEMENTED;
+ }
+ }
+}
+
+#else
+
+static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti,
+ ULONG available_len, ULONG *required_len)
+{
+ FIXME("info_class SYSTEM_FIRMWARE_TABLE_INFORMATION\n");
+ sfti->TableBufferLength = 0;
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+#endif
+
/******************************************************************************
* NtQuerySystemInformation [NTDLL.@]
* ZwQuerySystemInformation [NTDLL.@]
@@ -2359,6 +2509,28 @@ NTSTATUS WINAPI NtQuerySystemInformation(
else ret = STATUS_INFO_LENGTH_MISMATCH;
}
break;
+ case SystemFirmwareTableInformation:
+ {
+ SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti = (SYSTEM_FIRMWARE_TABLE_INFORMATION*)SystemInformation;
+ len = FIELD_OFFSET(SYSTEM_FIRMWARE_TABLE_INFORMATION, TableBuffer);
+ if (Length < len)
+ {
+ ret = STATUS_INFO_LENGTH_MISMATCH;
+ break;
+ }
+
+ switch (sfti->Action)
+ {
+ case SystemFirmwareTable_Get:
+ ret = get_firmware_info(sfti, Length, &len);
+ break;
+ default:
+ len = 0;
+ ret = STATUS_NOT_IMPLEMENTED;
+ FIXME("info_class SYSTEM_FIRMWARE_TABLE_INFORMATION\n");
+ }
+ }
+ break;
default:
FIXME("(0x%08x,%p,0x%08x,%p) stub\n",
SystemInformationClass,SystemInformation,Length,ResultLength);
diff --git a/dlls/ntdll/tests/info.c b/dlls/ntdll/tests/info.c
index 804a0ac902..d1c451157d 100644
--- a/dlls/ntdll/tests/info.c
+++ b/dlls/ntdll/tests/info.c
@@ -59,6 +59,12 @@ static DWORD one_before_last_pid = 0;
#define FIRM 0x4649524D
#define RSMB 0x52534D42
+#ifdef linux
+static const int firmware_todo = 0;
+#else
+static const int firmware_todo = 1;
+#endif
+
static BOOL InitFunctionPtrs(void)
{
/* All needed functions are NT based, so using GetModuleHandle is a good check */
@@ -842,12 +848,11 @@ static void test_query_firmware(void)
ok(!!sfti, "Failed to allocate memory\n");
status = pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, 15, &len1);
-todo_wine
ok(status == STATUS_INFO_LENGTH_MISMATCH || broken(status == STATUS_INVALID_INFO_CLASS) /* xp */,
"Expected STATUS_INFO_LENGTH_MISMATCH, got %08x\n", status);
if (len1 == 0) /* xp, 2003 */
{
- skip("SystemFirmwareTableInformation is not available\n");
+ win_skip("SystemFirmwareTableInformation is not available\n");
HeapFree(GetProcessHeap(), 0, sfti);
return;
}
@@ -862,6 +867,7 @@ todo_wine
sfti->TableID = 0;
status = pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, 16, &len1);
+todo_wine_if(firmware_todo)
ok(status == STATUS_BUFFER_TOO_SMALL, "Expected STATUS_BUFFER_TOO_SMALL, got %08x\n", status);
ok(len1 >= 16, "Expected length >= 16, got %u\n", len1);
ok(sfti->TableBufferLength == len1 - 16, "Expected length %u, got %u\n", len1 - 16, sfti->TableBufferLength);
@@ -873,6 +879,7 @@ todo_wine
{
sfti->TableID = i;
status = pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, len1, &len2);
+todo_wine_if(firmware_todo)
ok(status == STATUS_SUCCESS, "Table %u: Expected STATUS_SUCCESS, got %08x\n", i, status);
ok(len2 == len1, "Table %u: Expected length %u, got %u\n", i, len1, len2);
ok(sfti->TableBufferLength == len1 - 16,
--
2.17.1
June 18, 2018
[PATCH v7 3/8] kernel32/tests: Add GetSystemFirmwareTable tests
by Alex Henrie
Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
---
dlls/kernel32/tests/version.c | 41 +++++++++++++++++++++++++++++++++++
1 file changed, 41 insertions(+)
diff --git a/dlls/kernel32/tests/version.c b/dlls/kernel32/tests/version.c
index eb78a383d2..08e8f0fb58 100644
--- a/dlls/kernel32/tests/version.c
+++ b/dlls/kernel32/tests/version.c
@@ -26,11 +26,17 @@
#include "winternl.h"
static BOOL (WINAPI * pGetProductInfo)(DWORD, DWORD, DWORD, DWORD, DWORD *);
+static NTSTATUS (WINAPI * pNtQuerySystemInformation)(SYSTEM_INFORMATION_CLASS, void *, ULONG, ULONG *);
static NTSTATUS (WINAPI * pRtlGetVersion)(RTL_OSVERSIONINFOEXW *);
#define GET_PROC(func) \
p##func = (void *)GetProcAddress(hmod, #func);
+/* Firmware table providers */
+#define ACPI 0x41435049
+#define FIRM 0x4649524D
+#define RSMB 0x52534D42
+
static void init_function_pointers(void)
{
HMODULE hmod;
@@ -41,6 +47,7 @@ static void init_function_pointers(void)
hmod = GetModuleHandleA("ntdll.dll");
+ GET_PROC(NtQuerySystemInformation);
GET_PROC(RtlGetVersion);
}
@@ -697,6 +704,39 @@ static void test_VerifyVersionInfo(void)
ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError());
}
+void test_GetSystemFirmwareTable(void)
+{
+ ULONG expected_len, i;
+ UINT len;
+ SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 16);
+ UCHAR *smbios_table = NULL;
+
+ ok(!!sfti, "Failed to allocate memory\n");
+ sfti->ProviderSignature = RSMB;
+ sfti->Action = SystemFirmwareTable_Get;
+ pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, 16, &expected_len);
+ if (expected_len == 0) /* xp, 2003 */
+ {
+ skip("SystemFirmwareTableInformation is not available\n");
+ HeapFree(GetProcessHeap(), 0, sfti);
+ return;
+ }
+ sfti = HeapReAlloc(GetProcessHeap(), 0, sfti, expected_len);
+ ok(!!sfti, "Failed to allocate memory\n");
+ pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, expected_len, &expected_len);
+
+ expected_len -= 16;
+ smbios_table = HeapAlloc(GetProcessHeap(), 0, expected_len);
+ for (i = 0; i < 100; i++)
+ {
+ len = GetSystemFirmwareTable(RSMB, i, smbios_table, expected_len);
+ ok(len == expected_len, "Table %u: Expected length %u, got %u\n", i, expected_len, len);
+ }
+
+ HeapFree(GetProcessHeap(), 0, sfti);
+ HeapFree(GetProcessHeap(), 0, smbios_table);
+}
+
START_TEST(version)
{
init_function_pointers();
@@ -704,4 +744,5 @@ START_TEST(version)
test_GetProductInfo();
test_GetVersionEx();
test_VerifyVersionInfo();
+ test_GetSystemFirmwareTable();
}
--
2.17.1
June 18, 2018
[PATCH v7 2/8] ntdll/tests: Add SystemFirmwareTableInformation tests
by Alex Henrie
Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
---
dlls/ntdll/tests/info.c | 60 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 60 insertions(+)
diff --git a/dlls/ntdll/tests/info.c b/dlls/ntdll/tests/info.c
index 6c93c3cd58..804a0ac902 100644
--- a/dlls/ntdll/tests/info.c
+++ b/dlls/ntdll/tests/info.c
@@ -54,6 +54,11 @@ static DWORD one_before_last_pid = 0;
} \
} while(0)
+/* Firmware table providers */
+#define ACPI 0x41435049
+#define FIRM 0x4649524D
+#define RSMB 0x52534D42
+
static BOOL InitFunctionPtrs(void)
{
/* All needed functions are NT based, so using GetModuleHandle is a good check */
@@ -826,6 +831,57 @@ static void test_query_logicalprocex(void)
}
}
+static void test_query_firmware(void)
+{
+ ULONG len1, len2;
+ NTSTATUS status;
+ SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti;
+ int i;
+
+ sfti = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 16);
+ ok(!!sfti, "Failed to allocate memory\n");
+
+ status = pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, 15, &len1);
+todo_wine
+ ok(status == STATUS_INFO_LENGTH_MISMATCH || broken(status == STATUS_INVALID_INFO_CLASS) /* xp */,
+ "Expected STATUS_INFO_LENGTH_MISMATCH, got %08x\n", status);
+ if (len1 == 0) /* xp, 2003 */
+ {
+ skip("SystemFirmwareTableInformation is not available\n");
+ HeapFree(GetProcessHeap(), 0, sfti);
+ return;
+ }
+ ok(len1 == 16, "Expected length 16, got %u\n", len1);
+
+ status = pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, 16, &len1);
+ ok(status == STATUS_NOT_IMPLEMENTED, "Expected STATUS_NOT_IMPLEMENTED, got %08x\n", status);
+ ok(len1 == 0, "Expected length 0, got %u\n", len1);
+
+ sfti->ProviderSignature = RSMB;
+ sfti->Action = SystemFirmwareTable_Get;
+ sfti->TableID = 0;
+
+ status = pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, 16, &len1);
+ ok(status == STATUS_BUFFER_TOO_SMALL, "Expected STATUS_BUFFER_TOO_SMALL, got %08x\n", status);
+ ok(len1 >= 16, "Expected length >= 16, got %u\n", len1);
+ ok(sfti->TableBufferLength == len1 - 16, "Expected length %u, got %u\n", len1 - 16, sfti->TableBufferLength);
+
+ sfti = HeapReAlloc(GetProcessHeap(), 0, sfti, len1);
+ ok(!!sfti, "Failed to allocate memory\n");
+
+ for (i = 0; i < 100; i++)
+ {
+ sfti->TableID = i;
+ status = pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, len1, &len2);
+ ok(status == STATUS_SUCCESS, "Table %u: Expected STATUS_SUCCESS, got %08x\n", i, status);
+ ok(len2 == len1, "Table %u: Expected length %u, got %u\n", i, len1, len2);
+ ok(sfti->TableBufferLength == len1 - 16,
+ "Table %u: Expected length %u, got %u\n", i, len1 - 16, sfti->TableBufferLength);
+ }
+
+ HeapFree(GetProcessHeap(), 0, sfti);
+}
+
static void test_query_processor_power_info(void)
{
NTSTATUS status;
@@ -2267,6 +2323,10 @@ START_TEST(info)
trace("Starting test_process_debug_flags()\n");
test_query_process_debug_flags(argc, argv);
+ /* 0x4C SystemFirmwareTableInformation */
+ trace("Starting test_query_firmware()\n");
+ test_query_firmware();
+
/* belongs to its own file */
trace("Starting test_readvirtualmemory()\n");
test_readvirtualmemory();
--
2.17.1
June 18, 2018
[PATCH v7 1/8] include: Add SYSTEM_FIRMWARE_TABLE_INFORMATION to winternl.h
by Alex Henrie
Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
---
include/winternl.h | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/include/winternl.h b/include/winternl.h
index 58c475dfff..6e0bd987b6 100644
--- a/include/winternl.h
+++ b/include/winternl.h
@@ -1579,6 +1579,23 @@ typedef struct _SYSTEM_TIME_ADJUSTMENT {
BOOLEAN TimeAdjustmentDisabled;
} SYSTEM_TIME_ADJUSTMENT, *PSYSTEM_TIME_ADJUSTMENT;
+typedef enum _SYSTEM_FIRMWARE_TABLE_ACTION
+{
+ SystemFirmwareTable_Enumerate = 0,
+ SystemFirmwareTable_Get = 1
+} SYSTEM_FIRMWARE_TABLE_ACTION, *PSYSTEM_FIRMWARE_TABLE_ACTION;
+
+/* System Information Class 0x4C */
+
+typedef struct _SYSTEM_FIRMWARE_TABLE_INFORMATION
+{
+ ULONG ProviderSignature;
+ SYSTEM_FIRMWARE_TABLE_ACTION Action;
+ ULONG TableID;
+ ULONG TableBufferLength;
+ UCHAR TableBuffer[1];
+} SYSTEM_FIRMWARE_TABLE_INFORMATION, *PSYSTEM_FIRMWARE_TABLE_INFORMATION;
+
typedef struct _TIME_FIELDS
{ CSHORT Year;
CSHORT Month;
--
2.17.1
June 18, 2018
Re: [PATCH v6 4/8] ntdll: Return BIOS info from NtQuerySystemInformation on Linux
by Alex Henrie
On Mon, Jun 18, 2018 at 2:17 AM Huw Davies <huw(a)codeweavers.com> wrote:
>
> On Sun, Jun 17, 2018 at 11:38:10PM -0600, Alex Henrie wrote:
> > +static void get_smbios_string(const char *path, char *s, size_t *len)
> > +{
> > + FILE *file = fopen(path, "r");
> > + if (!file)
> > + {
> > + *len = 0;
> > + return;
> > + }
> > +
> > + *len = fread(s, 1, 127, file);
>
> You could pass the size of the buffer using len as an [in,out]
> parameter, then you wouldn't need the magic number.
Let's just make it a #define.
-Alex
June 18, 2018
Re: [PATCH] msi: Mark exported wine functions CDECL.
by Hans Leidekker
Signed-off-by: Hans Leidekker <hans(a)codeweavers.com>
June 18, 2018
Re: [PATCH v6 4/8] ntdll: Return BIOS info from NtQuerySystemInformation on Linux
by Huw Davies
On Sun, Jun 17, 2018 at 11:38:10PM -0600, Alex Henrie wrote:
> Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
> ---
> dlls/ntdll/nt.c | 170 ++++++++++++++++++++++++++++++++++++++++
> dlls/ntdll/tests/info.c | 11 ++-
> 2 files changed, 179 insertions(+), 2 deletions(-)
>
> diff --git a/dlls/ntdll/nt.c b/dlls/ntdll/nt.c
> index dc0ce04f42..2a4ef783cd 100644
> --- a/dlls/ntdll/nt.c
> +++ b/dlls/ntdll/nt.c
> @@ -1850,6 +1879,125 @@ static NTSTATUS create_logical_proc_info(SYSTEM_LOGICAL_PROCESSOR_INFORMATION **
> }
> #endif
>
> +static inline void copy_smbios_string(char **buffer, char *s, size_t len)
> +{
> + if (!len) return;
> + strcpy(*buffer, s);
> + *buffer += len + 1;
> +}
> +
> +#ifdef linux
> +
> +static void get_smbios_string(const char *path, char *s, size_t *len)
> +{
> + FILE *file = fopen(path, "r");
> + if (!file)
> + {
> + *len = 0;
> + return;
> + }
> +
> + *len = fread(s, 1, 127, file);
You could pass the size of the buffer using len as an [in,out]
parameter, then you wouldn't need the magic number.
> + fclose(file);
> +
> + if (*len >= 1 && s[*len - 1] == '\n')
> + {
> + s[*len - 1] = 0;
> + (*len)--;
> + }
> + else
> + {
> + s[*len] = 0;
> + }
> +}
> +
> +static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti,
> + ULONG available_len, ULONG *required_len)
> +{
> + switch (sfti->ProviderSignature)
> + {
> + case RSMB:
> + {
> + char bios_vendor[128], bios_version[128], bios_date[128];
> + size_t bios_vendor_len, bios_version_len, bios_date_len;
> + char *buffer = (char*)sfti->TableBuffer;
> + BYTE string_count;
> + struct smbios_prologue *prologue;
> + struct smbios_bios *bios;
> +
> + get_smbios_string("/sys/class/dmi/id/bios_vendor", bios_vendor, &bios_vendor_len);
> + get_smbios_string("/sys/class/dmi/id/bios_version", bios_version, &bios_version_len);
> + get_smbios_string("/sys/class/dmi/id/bios_date", bios_date, &bios_date_len);
> +
> + *required_len = sizeof(struct smbios_prologue);
> +
> + *required_len += sizeof(struct smbios_bios);
> + *required_len += max(bios_vendor_len + bios_version_len + bios_date_len + 4, 2);
> +
> + sfti->TableBufferLength = *required_len;
> +
> + *required_len += FIELD_OFFSET(SYSTEM_FIRMWARE_TABLE_INFORMATION, TableBuffer);
> +
> + if (available_len < *required_len)
> + {
> + return STATUS_BUFFER_TOO_SMALL;
> + }
> +
> + prologue = (struct smbios_prologue*)buffer;
> + prologue->calling_method = 0;
> + prologue->major_version = 2;
> + prologue->minor_version = 0;
> + prologue->revision = 0;
> + prologue->length = sfti->TableBufferLength - sizeof(struct smbios_prologue);
> + buffer += sizeof(struct smbios_prologue);
> +
> + string_count = 0;
> + bios = (struct smbios_bios*)buffer;
> + bios->type = 0;
> + bios->length = sizeof(struct smbios_bios);
> + bios->handle = 0;
> + bios->vendor = bios_vendor_len ? ++string_count : 0;
> + bios->version = bios_version_len ? ++string_count : 0;
> + bios->start = 0;
> + bios->date = bios_date_len ? ++string_count : 0;
> + bios->size = 0;
> + bios->characteristics = 0x4; /* not supported */
> + buffer += sizeof(struct smbios_bios);
> +
> + if (string_count)
> + {
> + copy_smbios_string(&buffer, bios_vendor, bios_vendor_len);
> + copy_smbios_string(&buffer, bios_version, bios_version_len);
> + copy_smbios_string(&buffer, bios_date, bios_date_len);
> + memset(buffer, 0, 1);
> + }
> + else
> + {
> + memset(buffer, 0, 2);
> + }
> +
> + return STATUS_SUCCESS;
> + }
> + default:
> + {
> + FIXME("info_class SYSTEM_FIRMWARE_TABLE_INFORMATION\n");
> + return STATUS_NOT_IMPLEMENTED;
> + }
> + }
> +}
> +
> +#else
> +
> +static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti,
> + ULONG available_len, ULONG *required_len)
> +{
> + FIXME("info_class SYSTEM_FIRMWARE_TABLE_INFORMATION\n");
> + sfti->TableBufferLength = 0;
> + return STATUS_NOT_IMPLEMENTED;
> +}
> +
> +#endif
> +
> /******************************************************************************
> * NtQuerySystemInformation [NTDLL.@]
> * ZwQuerySystemInformation [NTDLL.@]
> @@ -2359,6 +2507,28 @@ NTSTATUS WINAPI NtQuerySystemInformation(
> else ret = STATUS_INFO_LENGTH_MISMATCH;
> }
> break;
> + case SystemFirmwareTableInformation:
> + {
> + SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti = (SYSTEM_FIRMWARE_TABLE_INFORMATION*)SystemInformation;
> + len = FIELD_OFFSET(SYSTEM_FIRMWARE_TABLE_INFORMATION, TableBuffer);
> + if (Length < len)
> + {
> + ret = STATUS_INFO_LENGTH_MISMATCH;
> + break;
> + }
> +
> + switch (sfti->Action)
> + {
> + case SystemFirmwareTable_Get:
> + ret = get_firmware_info(sfti, Length, &len);
> + break;
> + default:
> + len = 0;
> + ret = STATUS_NOT_IMPLEMENTED;
> + FIXME("info_class SYSTEM_FIRMWARE_TABLE_INFORMATION\n");
> + }
> + }
> + break;
> default:
> FIXME("(0x%08x,%p,0x%08x,%p) stub\n",
> SystemInformationClass,SystemInformation,Length,ResultLength);
> diff --git a/dlls/ntdll/tests/info.c b/dlls/ntdll/tests/info.c
> index 804a0ac902..d1c451157d 100644
> --- a/dlls/ntdll/tests/info.c
> +++ b/dlls/ntdll/tests/info.c
> @@ -59,6 +59,12 @@ static DWORD one_before_last_pid = 0;
> #define FIRM 0x4649524D
> #define RSMB 0x52534D42
>
> +#ifdef linux
> +static const int firmware_todo = 0;
> +#else
> +static const int firmware_todo = 1;
> +#endif
> +
> static BOOL InitFunctionPtrs(void)
> {
> /* All needed functions are NT based, so using GetModuleHandle is a good check */
> @@ -842,12 +848,11 @@ static void test_query_firmware(void)
> ok(!!sfti, "Failed to allocate memory\n");
>
> status = pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, 15, &len1);
> -todo_wine
> ok(status == STATUS_INFO_LENGTH_MISMATCH || broken(status == STATUS_INVALID_INFO_CLASS) /* xp */,
> "Expected STATUS_INFO_LENGTH_MISMATCH, got %08x\n", status);
> if (len1 == 0) /* xp, 2003 */
> {
> - skip("SystemFirmwareTableInformation is not available\n");
> + win_skip("SystemFirmwareTableInformation is not available\n");
> HeapFree(GetProcessHeap(), 0, sfti);
> return;
> }
> @@ -862,6 +867,7 @@ todo_wine
> sfti->TableID = 0;
>
> status = pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, 16, &len1);
> +todo_wine_if(firmware_todo)
> ok(status == STATUS_BUFFER_TOO_SMALL, "Expected STATUS_BUFFER_TOO_SMALL, got %08x\n", status);
> ok(len1 >= 16, "Expected length >= 16, got %u\n", len1);
> ok(sfti->TableBufferLength == len1 - 16, "Expected length %u, got %u\n", len1 - 16, sfti->TableBufferLength);
> @@ -873,6 +879,7 @@ todo_wine
> {
> sfti->TableID = i;
> status = pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, len1, &len2);
> +todo_wine_if(firmware_todo)
> ok(status == STATUS_SUCCESS, "Table %u: Expected STATUS_SUCCESS, got %08x\n", i, status);
> ok(len2 == len1, "Table %u: Expected length %u, got %u\n", i, len1, len2);
> ok(sfti->TableBufferLength == len1 - 16,
> --
> 2.17.1
>
>
>
June 18, 2018
Re: [PATCH] riched20/tests: Use the available ARRAY_SIZE() macro
by Huw Davies
Signed-off-by: Huw Davies <huw(a)codeweavers.com>
June 18, 2018
Re: [PATCH] riched32/tests: Use the available ARRAY_SIZE() macro
by Huw Davies
Signed-off-by: Huw Davies <huw(a)codeweavers.com>
June 18, 2018
Re: [PATCH v6 2/8] ntdll/tests: Add SystemFirmwareTableInformation tests
by Alex Henrie
On Sun, Jun 17, 2018 at 11:47 PM Marvin <testbot(a)winehq.org> wrote:
>
> Hi,
>
> While running your changed tests on Windows, I think I found new failures.
> Being a bot and all I'm not very good at pattern recognition, so I might be
> wrong, but could you please double-check?
> Full results can be found at
> https://testbot.winehq.org/JobDetails.pl?Key=39211
>
> Your paranoid android.
>
>
> === wxppro (32 bit info) ===
> The task timed out
>
> === wvistau64 (32 bit info) ===
> info.c:1848: Test failed: Expected STATUS_SUCCESS, got c0000022
> 0a4c:info: unhandled exception c0000005 at 003D0000
>
> === wvistau64_zh_CN (32 bit info) ===
> info.c:1848: Test failed: Expected STATUS_SUCCESS, got c0000022
> 0bbc:info: unhandled exception c0000005 at 00360000
>
> === wvistau64_fr (32 bit info) ===
> info.c:1848: Test failed: Expected STATUS_SUCCESS, got c0000022
> 06a8:info: unhandled exception c0000005 at 002D0000
>
> === wvistau64_he (32 bit info) ===
> info.c:1848: Test failed: Expected STATUS_SUCCESS, got c0000022
> 0bd8:info: unhandled exception c0000005 at 002C0000
>
> === w2008s64 (32 bit info) ===
> info.c:1848: Test failed: Expected STATUS_SUCCESS, got c0000022
> 0870:info: unhandled exception c0000005 at 002D0000
>
> === w7u (32 bit info) ===
> info.c:1848: Test failed: Expected STATUS_SUCCESS, got c0000022
>
> === w7pro64 (32 bit info) ===
> info.c:1848: Test failed: Expected STATUS_SUCCESS, got c0000022
> 0ac4:info: unhandled exception c0000005 at 00340000
>
> === w8 (32 bit info) ===
> info.c:1848: Test failed: Expected STATUS_SUCCESS, got c0000022
> 0ecc:info: unhandled exception c0000005 at 003E0000
>
> === w864 (32 bit info) ===
> info.c:1848: Test failed: Expected STATUS_SUCCESS, got c0000022
> 0758:info: unhandled exception c0000005 at 00370000
>
> === w1064 (32 bit info) ===
> info.c:1848: Test failed: Expected STATUS_SUCCESS, got c0000022
> 0af4:info: unhandled exception c0000005 at 002D0000
These are all preëxisting failures, see
https://testbot.winehq.org/JobDetails.pl?Key=39215
-Alex
June 18, 2018
Re: [PATCH v6 4/8] ntdll: Return BIOS info from NtQuerySystemInformation on Linux
by Marvin
Hi,
While running your changed tests on Windows, I think I found new failures.
Being a bot and all I'm not very good at pattern recognition, so I might be
wrong, but could you please double-check?
Full results can be found at
https://testbot.winehq.org/JobDetails.pl?Key=39213
Your paranoid android.
=== wvistau64 (32 bit info) ===
info.c:1855: Test failed: Expected STATUS_SUCCESS, got c0000022
0864:info: unhandled exception c0000005 at 002D0000
=== wvistau64_zh_CN (32 bit info) ===
info.c:1855: Test failed: Expected STATUS_SUCCESS, got c0000022
0bb8:info: unhandled exception c0000005 at 002C0000
=== wvistau64_fr (32 bit info) ===
info.c:1855: Test failed: Expected STATUS_SUCCESS, got c0000022
072c:info: unhandled exception c0000005 at 002E0000
=== wvistau64_he (32 bit info) ===
info.c:1855: Test failed: Expected STATUS_SUCCESS, got c0000022
0bd8:info: unhandled exception c0000005 at 00340000
=== w2008s64 (32 bit info) ===
info.c:1855: Test failed: Expected STATUS_SUCCESS, got c0000022
0888:info: unhandled exception c0000005 at 003C0000
=== w7u (32 bit info) ===
info.c:1855: Test failed: Expected STATUS_SUCCESS, got c0000022
=== w7pro64 (32 bit info) ===
info.c:1855: Test failed: Expected STATUS_SUCCESS, got c0000022
0aa4:info: unhandled exception c0000005 at 00340000
=== w8 (32 bit info) ===
info.c:1855: Test failed: Expected STATUS_SUCCESS, got c0000022
0ed8:info: unhandled exception c0000005 at 00670000
=== w864 (32 bit info) ===
info.c:1855: Test failed: Expected STATUS_SUCCESS, got c0000022
0a20:info: unhandled exception c0000005 at 002D0000
=== w1064 (32 bit info) ===
info.c:1855: Test failed: Expected STATUS_SUCCESS, got c0000022
0b6c:info: unhandled exception c0000005 at 00390000
June 18, 2018
Re: [PATCH v6 2/8] ntdll/tests: Add SystemFirmwareTableInformation tests
by Marvin
Hi,
While running your changed tests on Windows, I think I found new failures.
Being a bot and all I'm not very good at pattern recognition, so I might be
wrong, but could you please double-check?
Full results can be found at
https://testbot.winehq.org/JobDetails.pl?Key=39211
Your paranoid android.
=== wxppro (32 bit info) ===
The task timed out
=== wvistau64 (32 bit info) ===
info.c:1848: Test failed: Expected STATUS_SUCCESS, got c0000022
0a4c:info: unhandled exception c0000005 at 003D0000
=== wvistau64_zh_CN (32 bit info) ===
info.c:1848: Test failed: Expected STATUS_SUCCESS, got c0000022
0bbc:info: unhandled exception c0000005 at 00360000
=== wvistau64_fr (32 bit info) ===
info.c:1848: Test failed: Expected STATUS_SUCCESS, got c0000022
06a8:info: unhandled exception c0000005 at 002D0000
=== wvistau64_he (32 bit info) ===
info.c:1848: Test failed: Expected STATUS_SUCCESS, got c0000022
0bd8:info: unhandled exception c0000005 at 002C0000
=== w2008s64 (32 bit info) ===
info.c:1848: Test failed: Expected STATUS_SUCCESS, got c0000022
0870:info: unhandled exception c0000005 at 002D0000
=== w7u (32 bit info) ===
info.c:1848: Test failed: Expected STATUS_SUCCESS, got c0000022
=== w7pro64 (32 bit info) ===
info.c:1848: Test failed: Expected STATUS_SUCCESS, got c0000022
0ac4:info: unhandled exception c0000005 at 00340000
=== w8 (32 bit info) ===
info.c:1848: Test failed: Expected STATUS_SUCCESS, got c0000022
0ecc:info: unhandled exception c0000005 at 003E0000
=== w864 (32 bit info) ===
info.c:1848: Test failed: Expected STATUS_SUCCESS, got c0000022
0758:info: unhandled exception c0000005 at 00370000
=== w1064 (32 bit info) ===
info.c:1848: Test failed: Expected STATUS_SUCCESS, got c0000022
0af4:info: unhandled exception c0000005 at 002D0000
June 18, 2018
[PATCH v6 8/8] ntdll: Return chassis info from NtQuerySystemInformation on Linux
by Alex Henrie
Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
---
dlls/ntdll/nt.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 49 insertions(+)
diff --git a/dlls/ntdll/nt.c b/dlls/ntdll/nt.c
index 312fc711b6..eb5749e450 100644
--- a/dlls/ntdll/nt.c
+++ b/dlls/ntdll/nt.c
@@ -108,6 +108,17 @@ struct smbios_board {
BYTE serial;
};
+struct smbios_chassis {
+ BYTE type;
+ BYTE length;
+ WORD handle;
+ BYTE vendor;
+ BYTE shape;
+ BYTE version;
+ BYTE serial;
+ BYTE asset_tag;
+};
+
#include "poppack.h"
/* Firmware table providers */
@@ -1944,12 +1955,15 @@ static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti
size_t system_vendor_len, system_product_len, system_version_len, system_serial_len;
char board_vendor[128], board_product[128], board_version[128], board_serial[128];
size_t board_vendor_len, board_product_len, board_version_len, board_serial_len;
+ char chassis_vendor[128], chassis_version[128], chassis_serial[128], chassis_asset_tag[128];
+ size_t chassis_vendor_len, chassis_version_len, chassis_serial_len, chassis_asset_tag_len;
char *buffer = (char*)sfti->TableBuffer;
BYTE string_count;
struct smbios_prologue *prologue;
struct smbios_bios *bios;
struct smbios_system *system;
struct smbios_board *board;
+ struct smbios_chassis *chassis;
get_smbios_string("/sys/class/dmi/id/bios_vendor", bios_vendor, &bios_vendor_len);
get_smbios_string("/sys/class/dmi/id/bios_version", bios_version, &bios_version_len);
@@ -1962,6 +1976,10 @@ static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti
get_smbios_string("/sys/class/dmi/id/board_name", board_product, &board_product_len);
get_smbios_string("/sys/class/dmi/id/board_version", board_version, &board_version_len);
get_smbios_string("/sys/class/dmi/id/board_serial", board_serial, &board_serial_len);
+ get_smbios_string("/sys/class/dmi/id/chassis_vendor", chassis_vendor, &chassis_vendor_len);
+ get_smbios_string("/sys/class/dmi/id/chassis_version", chassis_version, &chassis_version_len);
+ get_smbios_string("/sys/class/dmi/id/chassis_serial", chassis_serial, &chassis_serial_len);
+ get_smbios_string("/sys/class/dmi/id/chassis_tag", chassis_asset_tag, &chassis_asset_tag_len);
*required_len = sizeof(struct smbios_prologue);
@@ -1975,6 +1993,10 @@ static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti
*required_len += sizeof(struct smbios_board);
*required_len += max(board_vendor_len + board_product_len + board_version_len + board_serial_len + 5, 2);
+ *required_len += sizeof(struct smbios_chassis);
+ *required_len += max(chassis_vendor_len + chassis_version_len + chassis_serial_len +
+ chassis_asset_tag_len + 5, 2);
+
sfti->TableBufferLength = *required_len;
*required_len += FIELD_OFFSET(SYSTEM_FIRMWARE_TABLE_INFORMATION, TableBuffer);
@@ -2063,6 +2085,33 @@ static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti
copy_smbios_string(&buffer, board_version, board_version_len);
copy_smbios_string(&buffer, board_serial, board_serial_len);
memset(buffer, 0, 1);
+ buffer++;
+ }
+ else
+ {
+ memset(buffer, 0, 2);
+ buffer += 2;
+ }
+
+ string_count = 0;
+ chassis = (struct smbios_chassis*)buffer;
+ chassis->type = 3;
+ chassis->length = sizeof(struct smbios_chassis);
+ chassis->handle = 0;
+ chassis->vendor = chassis_vendor_len ? ++string_count : 0;
+ chassis->shape = 0x2; /* unknown */
+ chassis->version = chassis_version_len ? ++string_count : 0;
+ chassis->serial = chassis_serial_len ? ++string_count : 0;
+ chassis->asset_tag = chassis_asset_tag_len ? ++string_count : 0;
+ buffer += sizeof(struct smbios_chassis);
+
+ if (string_count)
+ {
+ copy_smbios_string(&buffer, chassis_vendor, chassis_vendor_len);
+ copy_smbios_string(&buffer, chassis_version, chassis_version_len);
+ copy_smbios_string(&buffer, chassis_serial, chassis_serial_len);
+ copy_smbios_string(&buffer, chassis_asset_tag, chassis_asset_tag_len);
+ memset(buffer, 0, 1);
}
else
{
--
2.17.1
June 18, 2018
[PATCH v6 7/8] ntdll: Return board info from NtQuerySystemInformation on Linux
by Alex Henrie
Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
---
dlls/ntdll/nt.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 46 insertions(+)
diff --git a/dlls/ntdll/nt.c b/dlls/ntdll/nt.c
index 534b362c9e..312fc711b6 100644
--- a/dlls/ntdll/nt.c
+++ b/dlls/ntdll/nt.c
@@ -98,6 +98,16 @@ struct smbios_system {
BYTE serial;
};
+struct smbios_board {
+ BYTE type;
+ BYTE length;
+ WORD handle;
+ BYTE vendor;
+ BYTE product;
+ BYTE version;
+ BYTE serial;
+};
+
#include "poppack.h"
/* Firmware table providers */
@@ -1932,11 +1942,14 @@ static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti
size_t bios_vendor_len, bios_version_len, bios_date_len;
char system_vendor[128], system_product[128], system_version[128], system_serial[128];
size_t system_vendor_len, system_product_len, system_version_len, system_serial_len;
+ char board_vendor[128], board_product[128], board_version[128], board_serial[128];
+ size_t board_vendor_len, board_product_len, board_version_len, board_serial_len;
char *buffer = (char*)sfti->TableBuffer;
BYTE string_count;
struct smbios_prologue *prologue;
struct smbios_bios *bios;
struct smbios_system *system;
+ struct smbios_board *board;
get_smbios_string("/sys/class/dmi/id/bios_vendor", bios_vendor, &bios_vendor_len);
get_smbios_string("/sys/class/dmi/id/bios_version", bios_version, &bios_version_len);
@@ -1945,6 +1958,10 @@ static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti
get_smbios_string("/sys/class/dmi/id/product", system_product, &system_product_len);
get_smbios_string("/sys/class/dmi/id/product_version", system_version, &system_version_len);
get_smbios_string("/sys/class/dmi/id/product_serial", system_serial, &system_serial_len);
+ get_smbios_string("/sys/class/dmi/id/board_vendor", board_vendor, &board_vendor_len);
+ get_smbios_string("/sys/class/dmi/id/board_name", board_product, &board_product_len);
+ get_smbios_string("/sys/class/dmi/id/board_version", board_version, &board_version_len);
+ get_smbios_string("/sys/class/dmi/id/board_serial", board_serial, &board_serial_len);
*required_len = sizeof(struct smbios_prologue);
@@ -1955,6 +1972,9 @@ static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti
*required_len += max(system_vendor_len + system_product_len + system_version_len +
system_serial_len + 5, 2);
+ *required_len += sizeof(struct smbios_board);
+ *required_len += max(board_vendor_len + board_product_len + board_version_len + board_serial_len + 5, 2);
+
sfti->TableBufferLength = *required_len;
*required_len += FIELD_OFFSET(SYSTEM_FIRMWARE_TABLE_INFORMATION, TableBuffer);
@@ -2017,6 +2037,32 @@ static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti
copy_smbios_string(&buffer, system_version, system_version_len);
copy_smbios_string(&buffer, system_serial, system_serial_len);
memset(buffer, 0, 1);
+ buffer++;
+ }
+ else
+ {
+ memset(buffer, 0, 2);
+ buffer += 2;
+ }
+
+ string_count = 0;
+ board = (struct smbios_board*)buffer;
+ board->type = 2;
+ board->length = sizeof(struct smbios_board);
+ board->handle = 0;
+ board->vendor = board_vendor_len ? ++string_count : 0;
+ board->product = board_product_len ? ++string_count : 0;
+ board->version = board_version_len ? ++string_count : 0;
+ board->serial = board_serial_len ? ++string_count : 0;
+ buffer += sizeof(struct smbios_board);
+
+ if (string_count)
+ {
+ copy_smbios_string(&buffer, board_vendor, board_vendor_len);
+ copy_smbios_string(&buffer, board_product, board_product_len);
+ copy_smbios_string(&buffer, board_version, board_version_len);
+ copy_smbios_string(&buffer, board_serial, board_serial_len);
+ memset(buffer, 0, 1);
}
else
{
--
2.17.1
June 18, 2018
[PATCH v6 6/8] ntdll: Return system info from NtQuerySystemInformation on Linux
by Alex Henrie
Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
---
dlls/ntdll/nt.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 47 insertions(+)
diff --git a/dlls/ntdll/nt.c b/dlls/ntdll/nt.c
index 2a4ef783cd..534b362c9e 100644
--- a/dlls/ntdll/nt.c
+++ b/dlls/ntdll/nt.c
@@ -88,6 +88,16 @@ struct smbios_bios {
UINT64 characteristics;
};
+struct smbios_system {
+ BYTE type;
+ BYTE length;
+ WORD handle;
+ BYTE vendor;
+ BYTE product;
+ BYTE version;
+ BYTE serial;
+};
+
#include "poppack.h"
/* Firmware table providers */
@@ -1920,20 +1930,31 @@ static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti
{
char bios_vendor[128], bios_version[128], bios_date[128];
size_t bios_vendor_len, bios_version_len, bios_date_len;
+ char system_vendor[128], system_product[128], system_version[128], system_serial[128];
+ size_t system_vendor_len, system_product_len, system_version_len, system_serial_len;
char *buffer = (char*)sfti->TableBuffer;
BYTE string_count;
struct smbios_prologue *prologue;
struct smbios_bios *bios;
+ struct smbios_system *system;
get_smbios_string("/sys/class/dmi/id/bios_vendor", bios_vendor, &bios_vendor_len);
get_smbios_string("/sys/class/dmi/id/bios_version", bios_version, &bios_version_len);
get_smbios_string("/sys/class/dmi/id/bios_date", bios_date, &bios_date_len);
+ get_smbios_string("/sys/class/dmi/id/sys_vendor", system_vendor, &system_vendor_len);
+ get_smbios_string("/sys/class/dmi/id/product", system_product, &system_product_len);
+ get_smbios_string("/sys/class/dmi/id/product_version", system_version, &system_version_len);
+ get_smbios_string("/sys/class/dmi/id/product_serial", system_serial, &system_serial_len);
*required_len = sizeof(struct smbios_prologue);
*required_len += sizeof(struct smbios_bios);
*required_len += max(bios_vendor_len + bios_version_len + bios_date_len + 4, 2);
+ *required_len += sizeof(struct smbios_system);
+ *required_len += max(system_vendor_len + system_product_len + system_version_len +
+ system_serial_len + 5, 2);
+
sfti->TableBufferLength = *required_len;
*required_len += FIELD_OFFSET(SYSTEM_FIRMWARE_TABLE_INFORMATION, TableBuffer);
@@ -1970,6 +1991,32 @@ static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti
copy_smbios_string(&buffer, bios_version, bios_version_len);
copy_smbios_string(&buffer, bios_date, bios_date_len);
memset(buffer, 0, 1);
+ buffer++;
+ }
+ else
+ {
+ memset(buffer, 0, 2);
+ buffer += 2;
+ }
+
+ string_count = 0;
+ system = (struct smbios_system*)buffer;
+ system->type = 1;
+ system->length = sizeof(struct smbios_system);
+ system->handle = 0;
+ system->vendor = system_vendor_len ? ++string_count : 0;
+ system->product = system_product_len ? ++string_count : 0;
+ system->version = system_version_len ? ++string_count : 0;
+ system->serial = system_serial_len ? ++string_count : 0;
+ buffer += sizeof(struct smbios_system);
+
+ if (string_count)
+ {
+ copy_smbios_string(&buffer, system_vendor, system_vendor_len);
+ copy_smbios_string(&buffer, system_product, system_product_len);
+ copy_smbios_string(&buffer, system_version, system_version_len);
+ copy_smbios_string(&buffer, system_serial, system_serial_len);
+ memset(buffer, 0, 1);
}
else
{
--
2.17.1
June 18, 2018
[PATCH v6 5/8] kernel32: Connect GetSystemFirmwareTable to NtQuerySystemInformation
by Alex Henrie
Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
---
dlls/kernel32/cpu.c | 29 +++++++++++++++++++++++++++++
dlls/kernel32/process.c | 10 ----------
dlls/kernel32/tests/version.c | 2 +-
3 files changed, 30 insertions(+), 11 deletions(-)
diff --git a/dlls/kernel32/cpu.c b/dlls/kernel32/cpu.c
index ec1fd0f90d..8397fbe729 100644
--- a/dlls/kernel32/cpu.c
+++ b/dlls/kernel32/cpu.c
@@ -336,3 +336,32 @@ DWORD64 WINAPI GetEnabledXStateFeatures(void)
FIXME("\n");
return 0;
}
+
+/***********************************************************************
+ * GetSystemFirmwareTable (KERNEL32.@)
+ */
+UINT WINAPI GetSystemFirmwareTable(DWORD provider, DWORD id, void *buffer, DWORD size)
+{
+ ULONG buffer_size = FIELD_OFFSET(SYSTEM_FIRMWARE_TABLE_INFORMATION, TableBuffer) + size;
+ SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti = HeapAlloc(GetProcessHeap(), 0, buffer_size);
+ NTSTATUS status;
+
+ if (!sfti)
+ {
+ SetLastError(ERROR_OUTOFMEMORY);
+ return 0;
+ }
+
+ sfti->ProviderSignature = provider;
+ sfti->Action = SystemFirmwareTable_Get;
+ sfti->TableID = id;
+
+ status = NtQuerySystemInformation(SystemFirmwareTableInformation, sfti, buffer_size, &buffer_size);
+ buffer_size -= FIELD_OFFSET(SYSTEM_FIRMWARE_TABLE_INFORMATION, TableBuffer);
+ if (buffer_size <= size)
+ memcpy(buffer, sfti->TableBuffer, buffer_size);
+
+ if (status) SetLastError(RtlNtStatusToDosError(status));
+ HeapFree(GetProcessHeap(), 0, sfti);
+ return buffer_size;
+}
diff --git a/dlls/kernel32/process.c b/dlls/kernel32/process.c
index ff56e9a692..6adf08d257 100644
--- a/dlls/kernel32/process.c
+++ b/dlls/kernel32/process.c
@@ -4126,16 +4126,6 @@ HRESULT WINAPI UnregisterApplicationRestart(void)
return S_OK;
}
-/***********************************************************************
- * GetSystemFirmwareTable (KERNEL32.@)
- */
-UINT WINAPI GetSystemFirmwareTable(DWORD provider, DWORD id, PVOID buffer, DWORD size)
-{
- FIXME("(%d %d %p %d):stub\n", provider, id, buffer, size);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return 0;
-}
-
struct proc_thread_attr
{
DWORD_PTR attr;
diff --git a/dlls/kernel32/tests/version.c b/dlls/kernel32/tests/version.c
index 08e8f0fb58..e33ce9cd42 100644
--- a/dlls/kernel32/tests/version.c
+++ b/dlls/kernel32/tests/version.c
@@ -717,7 +717,7 @@ void test_GetSystemFirmwareTable(void)
pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, 16, &expected_len);
if (expected_len == 0) /* xp, 2003 */
{
- skip("SystemFirmwareTableInformation is not available\n");
+ win_skip("SystemFirmwareTableInformation is not available\n");
HeapFree(GetProcessHeap(), 0, sfti);
return;
}
--
2.17.1
June 18, 2018
[PATCH v6 4/8] ntdll: Return BIOS info from NtQuerySystemInformation on Linux
by Alex Henrie
Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
---
dlls/ntdll/nt.c | 170 ++++++++++++++++++++++++++++++++++++++++
dlls/ntdll/tests/info.c | 11 ++-
2 files changed, 179 insertions(+), 2 deletions(-)
diff --git a/dlls/ntdll/nt.c b/dlls/ntdll/nt.c
index dc0ce04f42..2a4ef783cd 100644
--- a/dlls/ntdll/nt.c
+++ b/dlls/ntdll/nt.c
@@ -66,6 +66,35 @@
WINE_DEFAULT_DEBUG_CHANNEL(ntdll);
+#include "pshpack1.h"
+
+struct smbios_prologue {
+ BYTE calling_method;
+ BYTE major_version;
+ BYTE minor_version;
+ BYTE revision;
+ DWORD length;
+};
+
+struct smbios_bios {
+ BYTE type;
+ BYTE length;
+ WORD handle;
+ BYTE vendor;
+ BYTE version;
+ WORD start;
+ BYTE date;
+ BYTE size;
+ UINT64 characteristics;
+};
+
+#include "poppack.h"
+
+/* Firmware table providers */
+#define ACPI 0x41435049
+#define FIRM 0x4649524D
+#define RSMB 0x52534D42
+
/*
* Token
*/
@@ -1850,6 +1879,125 @@ static NTSTATUS create_logical_proc_info(SYSTEM_LOGICAL_PROCESSOR_INFORMATION **
}
#endif
+static inline void copy_smbios_string(char **buffer, char *s, size_t len)
+{
+ if (!len) return;
+ strcpy(*buffer, s);
+ *buffer += len + 1;
+}
+
+#ifdef linux
+
+static void get_smbios_string(const char *path, char *s, size_t *len)
+{
+ FILE *file = fopen(path, "r");
+ if (!file)
+ {
+ *len = 0;
+ return;
+ }
+
+ *len = fread(s, 1, 127, file);
+ fclose(file);
+
+ if (*len >= 1 && s[*len - 1] == '\n')
+ {
+ s[*len - 1] = 0;
+ (*len)--;
+ }
+ else
+ {
+ s[*len] = 0;
+ }
+}
+
+static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti,
+ ULONG available_len, ULONG *required_len)
+{
+ switch (sfti->ProviderSignature)
+ {
+ case RSMB:
+ {
+ char bios_vendor[128], bios_version[128], bios_date[128];
+ size_t bios_vendor_len, bios_version_len, bios_date_len;
+ char *buffer = (char*)sfti->TableBuffer;
+ BYTE string_count;
+ struct smbios_prologue *prologue;
+ struct smbios_bios *bios;
+
+ get_smbios_string("/sys/class/dmi/id/bios_vendor", bios_vendor, &bios_vendor_len);
+ get_smbios_string("/sys/class/dmi/id/bios_version", bios_version, &bios_version_len);
+ get_smbios_string("/sys/class/dmi/id/bios_date", bios_date, &bios_date_len);
+
+ *required_len = sizeof(struct smbios_prologue);
+
+ *required_len += sizeof(struct smbios_bios);
+ *required_len += max(bios_vendor_len + bios_version_len + bios_date_len + 4, 2);
+
+ sfti->TableBufferLength = *required_len;
+
+ *required_len += FIELD_OFFSET(SYSTEM_FIRMWARE_TABLE_INFORMATION, TableBuffer);
+
+ if (available_len < *required_len)
+ {
+ return STATUS_BUFFER_TOO_SMALL;
+ }
+
+ prologue = (struct smbios_prologue*)buffer;
+ prologue->calling_method = 0;
+ prologue->major_version = 2;
+ prologue->minor_version = 0;
+ prologue->revision = 0;
+ prologue->length = sfti->TableBufferLength - sizeof(struct smbios_prologue);
+ buffer += sizeof(struct smbios_prologue);
+
+ string_count = 0;
+ bios = (struct smbios_bios*)buffer;
+ bios->type = 0;
+ bios->length = sizeof(struct smbios_bios);
+ bios->handle = 0;
+ bios->vendor = bios_vendor_len ? ++string_count : 0;
+ bios->version = bios_version_len ? ++string_count : 0;
+ bios->start = 0;
+ bios->date = bios_date_len ? ++string_count : 0;
+ bios->size = 0;
+ bios->characteristics = 0x4; /* not supported */
+ buffer += sizeof(struct smbios_bios);
+
+ if (string_count)
+ {
+ copy_smbios_string(&buffer, bios_vendor, bios_vendor_len);
+ copy_smbios_string(&buffer, bios_version, bios_version_len);
+ copy_smbios_string(&buffer, bios_date, bios_date_len);
+ memset(buffer, 0, 1);
+ }
+ else
+ {
+ memset(buffer, 0, 2);
+ }
+
+ return STATUS_SUCCESS;
+ }
+ default:
+ {
+ FIXME("info_class SYSTEM_FIRMWARE_TABLE_INFORMATION\n");
+ return STATUS_NOT_IMPLEMENTED;
+ }
+ }
+}
+
+#else
+
+static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti,
+ ULONG available_len, ULONG *required_len)
+{
+ FIXME("info_class SYSTEM_FIRMWARE_TABLE_INFORMATION\n");
+ sfti->TableBufferLength = 0;
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+#endif
+
/******************************************************************************
* NtQuerySystemInformation [NTDLL.@]
* ZwQuerySystemInformation [NTDLL.@]
@@ -2359,6 +2507,28 @@ NTSTATUS WINAPI NtQuerySystemInformation(
else ret = STATUS_INFO_LENGTH_MISMATCH;
}
break;
+ case SystemFirmwareTableInformation:
+ {
+ SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti = (SYSTEM_FIRMWARE_TABLE_INFORMATION*)SystemInformation;
+ len = FIELD_OFFSET(SYSTEM_FIRMWARE_TABLE_INFORMATION, TableBuffer);
+ if (Length < len)
+ {
+ ret = STATUS_INFO_LENGTH_MISMATCH;
+ break;
+ }
+
+ switch (sfti->Action)
+ {
+ case SystemFirmwareTable_Get:
+ ret = get_firmware_info(sfti, Length, &len);
+ break;
+ default:
+ len = 0;
+ ret = STATUS_NOT_IMPLEMENTED;
+ FIXME("info_class SYSTEM_FIRMWARE_TABLE_INFORMATION\n");
+ }
+ }
+ break;
default:
FIXME("(0x%08x,%p,0x%08x,%p) stub\n",
SystemInformationClass,SystemInformation,Length,ResultLength);
diff --git a/dlls/ntdll/tests/info.c b/dlls/ntdll/tests/info.c
index 804a0ac902..d1c451157d 100644
--- a/dlls/ntdll/tests/info.c
+++ b/dlls/ntdll/tests/info.c
@@ -59,6 +59,12 @@ static DWORD one_before_last_pid = 0;
#define FIRM 0x4649524D
#define RSMB 0x52534D42
+#ifdef linux
+static const int firmware_todo = 0;
+#else
+static const int firmware_todo = 1;
+#endif
+
static BOOL InitFunctionPtrs(void)
{
/* All needed functions are NT based, so using GetModuleHandle is a good check */
@@ -842,12 +848,11 @@ static void test_query_firmware(void)
ok(!!sfti, "Failed to allocate memory\n");
status = pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, 15, &len1);
-todo_wine
ok(status == STATUS_INFO_LENGTH_MISMATCH || broken(status == STATUS_INVALID_INFO_CLASS) /* xp */,
"Expected STATUS_INFO_LENGTH_MISMATCH, got %08x\n", status);
if (len1 == 0) /* xp, 2003 */
{
- skip("SystemFirmwareTableInformation is not available\n");
+ win_skip("SystemFirmwareTableInformation is not available\n");
HeapFree(GetProcessHeap(), 0, sfti);
return;
}
@@ -862,6 +867,7 @@ todo_wine
sfti->TableID = 0;
status = pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, 16, &len1);
+todo_wine_if(firmware_todo)
ok(status == STATUS_BUFFER_TOO_SMALL, "Expected STATUS_BUFFER_TOO_SMALL, got %08x\n", status);
ok(len1 >= 16, "Expected length >= 16, got %u\n", len1);
ok(sfti->TableBufferLength == len1 - 16, "Expected length %u, got %u\n", len1 - 16, sfti->TableBufferLength);
@@ -873,6 +879,7 @@ todo_wine
{
sfti->TableID = i;
status = pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, len1, &len2);
+todo_wine_if(firmware_todo)
ok(status == STATUS_SUCCESS, "Table %u: Expected STATUS_SUCCESS, got %08x\n", i, status);
ok(len2 == len1, "Table %u: Expected length %u, got %u\n", i, len1, len2);
ok(sfti->TableBufferLength == len1 - 16,
--
2.17.1
June 18, 2018
[PATCH v6 3/8] kernel32/tests: Add GetSystemFirmwareTable tests
by Alex Henrie
Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
---
dlls/kernel32/tests/version.c | 41 +++++++++++++++++++++++++++++++++++
1 file changed, 41 insertions(+)
diff --git a/dlls/kernel32/tests/version.c b/dlls/kernel32/tests/version.c
index eb78a383d2..08e8f0fb58 100644
--- a/dlls/kernel32/tests/version.c
+++ b/dlls/kernel32/tests/version.c
@@ -26,11 +26,17 @@
#include "winternl.h"
static BOOL (WINAPI * pGetProductInfo)(DWORD, DWORD, DWORD, DWORD, DWORD *);
+static NTSTATUS (WINAPI * pNtQuerySystemInformation)(SYSTEM_INFORMATION_CLASS, void *, ULONG, ULONG *);
static NTSTATUS (WINAPI * pRtlGetVersion)(RTL_OSVERSIONINFOEXW *);
#define GET_PROC(func) \
p##func = (void *)GetProcAddress(hmod, #func);
+/* Firmware table providers */
+#define ACPI 0x41435049
+#define FIRM 0x4649524D
+#define RSMB 0x52534D42
+
static void init_function_pointers(void)
{
HMODULE hmod;
@@ -41,6 +47,7 @@ static void init_function_pointers(void)
hmod = GetModuleHandleA("ntdll.dll");
+ GET_PROC(NtQuerySystemInformation);
GET_PROC(RtlGetVersion);
}
@@ -697,6 +704,39 @@ static void test_VerifyVersionInfo(void)
ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError());
}
+void test_GetSystemFirmwareTable(void)
+{
+ ULONG expected_len, i;
+ UINT len;
+ SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 16);
+ UCHAR *smbios_table = NULL;
+
+ ok(!!sfti, "Failed to allocate memory\n");
+ sfti->ProviderSignature = RSMB;
+ sfti->Action = SystemFirmwareTable_Get;
+ pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, 16, &expected_len);
+ if (expected_len == 0) /* xp, 2003 */
+ {
+ skip("SystemFirmwareTableInformation is not available\n");
+ HeapFree(GetProcessHeap(), 0, sfti);
+ return;
+ }
+ sfti = HeapReAlloc(GetProcessHeap(), 0, sfti, expected_len);
+ ok(!!sfti, "Failed to allocate memory\n");
+ pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, expected_len, &expected_len);
+
+ expected_len -= 16;
+ smbios_table = HeapAlloc(GetProcessHeap(), 0, expected_len);
+ for (i = 0; i < 100; i++)
+ {
+ len = GetSystemFirmwareTable(RSMB, i, smbios_table, expected_len);
+ ok(len == expected_len, "Table %u: Expected length %u, got %u\n", i, expected_len, len);
+ }
+
+ HeapFree(GetProcessHeap(), 0, sfti);
+ HeapFree(GetProcessHeap(), 0, smbios_table);
+}
+
START_TEST(version)
{
init_function_pointers();
@@ -704,4 +744,5 @@ START_TEST(version)
test_GetProductInfo();
test_GetVersionEx();
test_VerifyVersionInfo();
+ test_GetSystemFirmwareTable();
}
--
2.17.1
June 18, 2018
[PATCH v6 2/8] ntdll/tests: Add SystemFirmwareTableInformation tests
by Alex Henrie
Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
---
dlls/ntdll/tests/info.c | 60 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 60 insertions(+)
diff --git a/dlls/ntdll/tests/info.c b/dlls/ntdll/tests/info.c
index 6c93c3cd58..804a0ac902 100644
--- a/dlls/ntdll/tests/info.c
+++ b/dlls/ntdll/tests/info.c
@@ -54,6 +54,11 @@ static DWORD one_before_last_pid = 0;
} \
} while(0)
+/* Firmware table providers */
+#define ACPI 0x41435049
+#define FIRM 0x4649524D
+#define RSMB 0x52534D42
+
static BOOL InitFunctionPtrs(void)
{
/* All needed functions are NT based, so using GetModuleHandle is a good check */
@@ -826,6 +831,57 @@ static void test_query_logicalprocex(void)
}
}
+static void test_query_firmware(void)
+{
+ ULONG len1, len2;
+ NTSTATUS status;
+ SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti;
+ int i;
+
+ sfti = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 16);
+ ok(!!sfti, "Failed to allocate memory\n");
+
+ status = pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, 15, &len1);
+todo_wine
+ ok(status == STATUS_INFO_LENGTH_MISMATCH || broken(status == STATUS_INVALID_INFO_CLASS) /* xp */,
+ "Expected STATUS_INFO_LENGTH_MISMATCH, got %08x\n", status);
+ if (len1 == 0) /* xp, 2003 */
+ {
+ skip("SystemFirmwareTableInformation is not available\n");
+ HeapFree(GetProcessHeap(), 0, sfti);
+ return;
+ }
+ ok(len1 == 16, "Expected length 16, got %u\n", len1);
+
+ status = pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, 16, &len1);
+ ok(status == STATUS_NOT_IMPLEMENTED, "Expected STATUS_NOT_IMPLEMENTED, got %08x\n", status);
+ ok(len1 == 0, "Expected length 0, got %u\n", len1);
+
+ sfti->ProviderSignature = RSMB;
+ sfti->Action = SystemFirmwareTable_Get;
+ sfti->TableID = 0;
+
+ status = pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, 16, &len1);
+ ok(status == STATUS_BUFFER_TOO_SMALL, "Expected STATUS_BUFFER_TOO_SMALL, got %08x\n", status);
+ ok(len1 >= 16, "Expected length >= 16, got %u\n", len1);
+ ok(sfti->TableBufferLength == len1 - 16, "Expected length %u, got %u\n", len1 - 16, sfti->TableBufferLength);
+
+ sfti = HeapReAlloc(GetProcessHeap(), 0, sfti, len1);
+ ok(!!sfti, "Failed to allocate memory\n");
+
+ for (i = 0; i < 100; i++)
+ {
+ sfti->TableID = i;
+ status = pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, len1, &len2);
+ ok(status == STATUS_SUCCESS, "Table %u: Expected STATUS_SUCCESS, got %08x\n", i, status);
+ ok(len2 == len1, "Table %u: Expected length %u, got %u\n", i, len1, len2);
+ ok(sfti->TableBufferLength == len1 - 16,
+ "Table %u: Expected length %u, got %u\n", i, len1 - 16, sfti->TableBufferLength);
+ }
+
+ HeapFree(GetProcessHeap(), 0, sfti);
+}
+
static void test_query_processor_power_info(void)
{
NTSTATUS status;
@@ -2267,6 +2323,10 @@ START_TEST(info)
trace("Starting test_process_debug_flags()\n");
test_query_process_debug_flags(argc, argv);
+ /* 0x4C SystemFirmwareTableInformation */
+ trace("Starting test_query_firmware()\n");
+ test_query_firmware();
+
/* belongs to its own file */
trace("Starting test_readvirtualmemory()\n");
test_readvirtualmemory();
--
2.17.1
June 18, 2018
[PATCH v6 1/8] include: Add SYSTEM_FIRMWARE_TABLE_INFORMATION to winternl.h
by Alex Henrie
Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
---
include/winternl.h | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/include/winternl.h b/include/winternl.h
index 58c475dfff..6e0bd987b6 100644
--- a/include/winternl.h
+++ b/include/winternl.h
@@ -1579,6 +1579,23 @@ typedef struct _SYSTEM_TIME_ADJUSTMENT {
BOOLEAN TimeAdjustmentDisabled;
} SYSTEM_TIME_ADJUSTMENT, *PSYSTEM_TIME_ADJUSTMENT;
+typedef enum _SYSTEM_FIRMWARE_TABLE_ACTION
+{
+ SystemFirmwareTable_Enumerate = 0,
+ SystemFirmwareTable_Get = 1
+} SYSTEM_FIRMWARE_TABLE_ACTION, *PSYSTEM_FIRMWARE_TABLE_ACTION;
+
+/* System Information Class 0x4C */
+
+typedef struct _SYSTEM_FIRMWARE_TABLE_INFORMATION
+{
+ ULONG ProviderSignature;
+ SYSTEM_FIRMWARE_TABLE_ACTION Action;
+ ULONG TableID;
+ ULONG TableBufferLength;
+ UCHAR TableBuffer[1];
+} SYSTEM_FIRMWARE_TABLE_INFORMATION, *PSYSTEM_FIRMWARE_TABLE_INFORMATION;
+
typedef struct _TIME_FIELDS
{ CSHORT Year;
CSHORT Month;
--
2.17.1
June 18, 2018
Re: [PATCH 2/2] user32/tests: Skip tests for window messages if we failed to receive foreground status.
by Zebediah Figura
On 17/06/18 16:20, Marvin wrote:
> Hi,
>
> While running your changed tests on Windows, I think I found new failures.
> Being a bot and all I'm not very good at pattern recognition, so I might be
> wrong, but could you please double-check?
> Full results can be found at
> https://testbot.winehq.org/JobDetails.pl?Key=39204
>
> Your paranoid android.
>
>
> === w7pro64 (64 bit input) ===
> input.c:2055: Test failed: expected WM_NCHITTEST message
> input.c:2082: Test failed: expected loop with WM_NCHITTEST messages
> input.c:2135: Test failed: expected WM_LBUTTONDOWN message
> input.c:2136: Test failed: expected WM_LBUTTONUP message
>
>
This failure is in a different test, and should not be affected by my
changes. A similar failure can be seen here:
http://test.winehq.org/data/8e9ea7a8a163147012908bad696a539454654d8f/win7_n…
June 17, 2018
[PATCH] riched20/tests: Use the available ARRAY_SIZE() macro
by Michael Stefaniuc
Signed-off-by: Michael Stefaniuc <mstefani(a)winehq.org>
---
dlls/riched20/tests/editor.c | 62 ++++++++++++++++++++-----------------------
dlls/riched20/tests/richole.c | 4 +--
2 files changed, 31 insertions(+), 35 deletions(-)
diff --git a/dlls/riched20/tests/editor.c b/dlls/riched20/tests/editor.c
index 2a6907bfe7..85c607becf 100644
--- a/dlls/riched20/tests/editor.c
+++ b/dlls/riched20/tests/editor.c
@@ -340,14 +340,12 @@ static void test_EM_FINDTEXT(BOOL unicode)
hwndRichEdit = new_richedit(NULL);
/* Empty rich edit control */
- run_tests_EM_FINDTEXT(hwndRichEdit, "1", find_tests,
- sizeof(find_tests)/sizeof(struct find_s), unicode);
+ run_tests_EM_FINDTEXT(hwndRichEdit, "1", find_tests, ARRAY_SIZE(find_tests), unicode);
SendMessageA(hwndRichEdit, WM_SETTEXT, 0, (LPARAM)haystack);
/* Haystack text */
- run_tests_EM_FINDTEXT(hwndRichEdit, "2", find_tests2,
- sizeof(find_tests2)/sizeof(struct find_s), unicode);
+ run_tests_EM_FINDTEXT(hwndRichEdit, "2", find_tests2, ARRAY_SIZE(find_tests2), unicode);
/* Setting a format on an arbitrary range should have no effect in search
results. This tests correct offset reporting across runs. */
@@ -359,8 +357,7 @@ static void test_EM_FINDTEXT(BOOL unicode)
SendMessageA(hwndRichEdit, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf2);
/* Haystack text, again */
- run_tests_EM_FINDTEXT(hwndRichEdit, "2-bis", find_tests2,
- sizeof(find_tests2)/sizeof(struct find_s), unicode);
+ run_tests_EM_FINDTEXT(hwndRichEdit, "2-bis", find_tests2, ARRAY_SIZE(find_tests2), unicode);
/* Yet another range */
cf2.dwMask = CFM_BOLD | cf2.dwMask;
@@ -369,8 +366,7 @@ static void test_EM_FINDTEXT(BOOL unicode)
SendMessageA(hwndRichEdit, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf2);
/* Haystack text, again */
- run_tests_EM_FINDTEXT(hwndRichEdit, "2-bisbis", find_tests2,
- sizeof(find_tests2)/sizeof(struct find_s), unicode);
+ run_tests_EM_FINDTEXT(hwndRichEdit, "2-bisbis", find_tests2, ARRAY_SIZE(find_tests2), unicode);
DestroyWindow(hwndRichEdit);
}
@@ -404,7 +400,7 @@ static void test_EM_GETLINE(void)
SendMessageA(hwndRichEdit, WM_SETTEXT, 0, (LPARAM)text);
memset(origdest, 0xBB, nBuf);
- for (i = 0; i < sizeof(gl)/sizeof(struct getline_s); i++)
+ for (i = 0; i < ARRAY_SIZE(gl); i++)
{
int nCopied;
int expected_nCopied = min(gl[i].buffer_len, strlen(gl[i].text));
@@ -509,7 +505,7 @@ static void test_EM_LINELENGTH(void)
{15, 4}, /* Line 3: |wine */
};
SendMessageA(hwndRichEdit, WM_SETTEXT, 0, (LPARAM)text1);
- for (i = 0; i < sizeof(offset_test1)/sizeof(offset_test1[0]); i++) {
+ for (i = 0; i < ARRAY_SIZE(offset_test1); i++) {
result = SendMessageA(hwndRichEdit, EM_LINELENGTH, offset_test1[i][0], 0);
ok(result == offset_test1[i][1], "Length of line at offset %d is %ld, expected %d\n",
offset_test1[i][0], result, offset_test1[i][1]);
@@ -2049,7 +2045,7 @@ static void test_EM_AUTOURLDETECT(void)
urlRet=SendMessageA(hwndRichEdit, EM_AUTOURLDETECT, (WPARAM)"h", (LPARAM)"h");
ok(urlRet==E_INVALIDARG, "Bad wParam2: urlRet is: %d\n", urlRet);
/* for each url, check the text to see if CFE_LINK effect is present */
- for (i = 0; i < sizeof(urls)/sizeof(struct urls_s); i++) {
+ for (i = 0; i < ARRAY_SIZE(urls); i++) {
SendMessageA(hwndRichEdit, EM_AUTOURLDETECT, FALSE, 0);
SendMessageA(hwndRichEdit, WM_SETTEXT, 0, (LPARAM)urls[i].text);
@@ -2063,10 +2059,10 @@ static void test_EM_AUTOURLDETECT(void)
DestroyWindow(hwndRichEdit);
/* Test detection of URLs within normal text - WM_SETTEXT case. */
- for (i = 0; i < sizeof(urls)/sizeof(struct urls_s); i++) {
+ for (i = 0; i < ARRAY_SIZE(urls); i++) {
hwndRichEdit = new_richedit(parent);
- for (j = 0; j < sizeof(templates_delim) / sizeof(const char *); j++) {
+ for (j = 0; j < ARRAY_SIZE(templates_delim); j++) {
char * at_pos;
int at_offset;
int end_offset;
@@ -2117,7 +2113,7 @@ static void test_EM_AUTOURLDETECT(void)
}
}
- for (j = 0; j < sizeof(templates_non_delim) / sizeof(const char *); j++) {
+ for (j = 0; j < ARRAY_SIZE(templates_non_delim); j++) {
char * at_pos;
int at_offset;
int end_offset;
@@ -2158,7 +2154,7 @@ static void test_EM_AUTOURLDETECT(void)
}
}
- for (j = 0; j < sizeof(templates_xten_delim) / sizeof(const char *); j++) {
+ for (j = 0; j < ARRAY_SIZE(templates_xten_delim); j++) {
char * at_pos;
int at_offset;
int end_offset;
@@ -2213,7 +2209,7 @@ static void test_EM_AUTOURLDETECT(void)
}
}
- for (j = 0; j < sizeof(templates_neutral_delim) / sizeof(const char *); j++) {
+ for (j = 0; j < ARRAY_SIZE(templates_neutral_delim); j++) {
char * at_pos, * end_pos;
int at_offset;
int end_offset;
@@ -2421,7 +2417,7 @@ static void test_EM_AUTOURLDETECT(void)
*/
/* Set entire text in one go, like WM_SETTEXT */
- for (j = 0; j < sizeof(templates_delim) / sizeof(const char *); j++) {
+ for (j = 0; j < ARRAY_SIZE(templates_delim); j++) {
char * at_pos;
int at_offset;
int end_offset;
@@ -2476,7 +2472,7 @@ static void test_EM_AUTOURLDETECT(void)
}
/* Set selection with X to the URL */
- for (j = 0; j < sizeof(templates_delim) / sizeof(const char *); j++) {
+ for (j = 0; j < ARRAY_SIZE(templates_delim); j++) {
char * at_pos;
int at_offset;
int end_offset;
@@ -2530,7 +2526,7 @@ static void test_EM_AUTOURLDETECT(void)
}
/* Set selection with X to the first character of the URL, then the rest */
- for (j = 0; j < sizeof(templates_delim) / sizeof(const char *); j++) {
+ for (j = 0; j < ARRAY_SIZE(templates_delim); j++) {
char * at_pos;
int at_offset;
int end_offset;
@@ -2598,7 +2594,7 @@ static void test_EM_AUTOURLDETECT(void)
hwndRichEdit = new_richedit(parent);
/* Set selection with X to the URL */
- for (j = 0; j < sizeof(templates_delim) / sizeof(const char *); j++) {
+ for (j = 0; j < ARRAY_SIZE(templates_delim); j++) {
char * at_pos;
int at_offset;
int end_offset;
@@ -2649,7 +2645,7 @@ static void test_EM_AUTOURLDETECT(void)
}
/* Set selection with X to the first character of the URL, then the rest */
- for (j = 0; j < sizeof(templates_delim) / sizeof(const char *); j++) {
+ for (j = 0; j < ARRAY_SIZE(templates_delim); j++) {
char * at_pos;
int at_offset;
int end_offset;
@@ -4933,7 +4929,7 @@ static void test_EM_EXSETSEL(void)
{
HWND hwndRichEdit = new_richedit(NULL);
int i;
- const int num_tests = sizeof(exsetsel_tests)/sizeof(struct exsetsel_s);
+ const int num_tests = ARRAY_SIZE(exsetsel_tests);
/* sending some text to the window */
SendMessageA(hwndRichEdit, WM_SETTEXT, 0, (LPARAM)"testing selection");
@@ -4988,7 +4984,7 @@ static void test_EM_SETSEL(void)
char buffA[32] = {0};
HWND hwndRichEdit = new_richedit(NULL);
int i;
- const int num_tests = sizeof(exsetsel_tests)/sizeof(struct exsetsel_s);
+ const int num_tests = ARRAY_SIZE(exsetsel_tests);
/* sending some text to the window */
SendMessageA(hwndRichEdit, WM_SETTEXT, 0, (LPARAM)"testing selection");
@@ -5623,7 +5619,7 @@ static void test_EM_FORMATRANGE(void)
SendMessageA(hwndRichEdit, EM_FORMATRANGE, FALSE, 0);
- for (i = 0; i < sizeof(fmtstrings)/sizeof(fmtstrings[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(fmtstrings); i++)
{
GETTEXTLENGTHEX gtl;
SIZE stringsize;
@@ -5831,7 +5827,7 @@ static void test_EM_STREAMIN(void)
};
const WCHAR streamText5[] = { 'T', 'e', 's', 't', 'S', 'o', 'm', 'e', 'T', 'e', 'x', 't' };
- int length5 = sizeof(streamText5) / sizeof(WCHAR);
+ int length5 = ARRAY_SIZE(streamText5);
struct StringWithLength cookieForStream5 = {
sizeof(streamText5),
(char *)streamText5,
@@ -6868,7 +6864,7 @@ static void test_EN_LINK(void)
GetCursorPos(&orig_cursor_pos);
SetCursorPos(0, 0);
- for (i = 0; i < sizeof(link_notify_tests)/sizeof(link_notify_tests[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(link_notify_tests); i++)
{
link_notify_test("cursor position simulated", i, hwnd, parent,
link_notify_tests[i].msg, link_notify_tests[i].wParam, link_notify_tests[i].lParam,
@@ -6878,7 +6874,7 @@ static void test_EN_LINK(void)
ClientToScreen(hwnd, &cursor_screen_pos);
SetCursorPos(cursor_screen_pos.x, cursor_screen_pos.y);
- for (i = 0; i < sizeof(link_notify_tests)/sizeof(link_notify_tests[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(link_notify_tests); i++)
{
link_notify_test("cursor position set", i, hwnd, parent,
link_notify_tests[i].msg, link_notify_tests[i].wParam, link_notify_tests[i].lParam,
@@ -8178,7 +8174,7 @@ static void test_EM_FINDWORDBREAK_W(void)
int i;
HWND hwndRichEdit = new_richeditW(NULL);
ok(IsWindowUnicode(hwndRichEdit), "window should be unicode\n");
- for (i = 0; i < sizeof(delimiter_tests)/sizeof(delimiter_tests[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(delimiter_tests); i++)
{
WCHAR wbuf[2];
int result;
@@ -8212,7 +8208,7 @@ static void test_EM_FINDWORDBREAK_A(void)
HWND hwndRichEdit = new_richedit(NULL);
ok(!IsWindowUnicode(hwndRichEdit), "window should not be unicode\n");
- for (i = 0; i < sizeof(delimiter_tests)/sizeof(delimiter_tests[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(delimiter_tests); i++)
{
int result;
char buf[2];
@@ -8256,7 +8252,7 @@ static void test_enter(void)
HWND hwndRichEdit = new_richedit(NULL);
UINT i,j;
- for (i = 0; i < sizeof(testenteritems)/sizeof(testenteritems[0]); i++) {
+ for (i = 0; i < ARRAY_SIZE(testenteritems); i++) {
char buf[1024] = {0};
LRESULT result;
@@ -8538,7 +8534,7 @@ static void test_alignment_style(void)
EDITSTREAM es;
int i;
- for (i = 0; i < sizeof(align_style) / sizeof(align_style[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(align_style); i++)
{
DWORD dwStyle, new_align;
@@ -8646,8 +8642,8 @@ static void test_rtf(void)
result = SendMessageA( edit, EM_STREAMIN, SF_RTF, (LPARAM)&es );
ok( result == 11, "got %ld\n", result );
- result = SendMessageW( edit, WM_GETTEXT, sizeof(buf)/sizeof(buf[0]), (LPARAM)buf );
- ok( result == sizeof(expect_specials)/sizeof(expect_specials[0]), "got %ld\n", result );
+ result = SendMessageW( edit, WM_GETTEXT, ARRAY_SIZE(buf), (LPARAM)buf );
+ ok( result == ARRAY_SIZE(expect_specials), "got %ld\n", result );
ok( !memcmp( buf, expect_specials, sizeof(expect_specials) ), "got %s\n", wine_dbgstr_w(buf) );
/* Show that \rtlpar propagates to the second paragraph and is
diff --git a/dlls/riched20/tests/richole.c b/dlls/riched20/tests/richole.c
index c4fe425dfa..aaf52bcfdd 100644
--- a/dlls/riched20/tests/richole.c
+++ b/dlls/riched20/tests/richole.c
@@ -247,8 +247,8 @@ static void test_ITextDocument_Open(void)
tomReadOnly|tomShareDenyWrite, tomReadOnly|tomShareDenyRead
};
- int tomNumSingle = sizeof(tomConstantsSingle)/sizeof(tomConstantsSingle[0]);
- int tomNumMulti = sizeof(tomConstantsMulti)/sizeof(tomConstantsMulti[0]);
+ int tomNumSingle = ARRAY_SIZE(tomConstantsSingle);
+ int tomNumMulti = ARRAY_SIZE(tomConstantsMulti);
int i;
V_VT(&testfile) = VT_BSTR;
--
2.14.4
June 17, 2018
[PATCH] riched32/tests: Use the available ARRAY_SIZE() macro
by Michael Stefaniuc
Signed-off-by: Michael Stefaniuc <mstefani(a)winehq.org>
---
dlls/riched32/tests/editor.c | 23 ++++++++++-------------
1 file changed, 10 insertions(+), 13 deletions(-)
diff --git a/dlls/riched32/tests/editor.c b/dlls/riched32/tests/editor.c
index 6fe4005599..7751d2b402 100644
--- a/dlls/riched32/tests/editor.c
+++ b/dlls/riched32/tests/editor.c
@@ -104,7 +104,7 @@ static void test_WM_SETTEXT(void)
* for line breaking (only \n adds a line break)
*/
- for (i = 0; i < sizeof(testitems)/sizeof(testitems[0]); i++) {
+ for (i = 0; i < ARRAY_SIZE(testitems); i++) {
char buf[1024] = {0};
LRESULT result;
@@ -410,7 +410,7 @@ static void test_EM_GETLINE(void)
}
memset(origdest, 0xBB, nBuf);
- for (i = 0; i < sizeof(gl)/sizeof(struct getline_s); i++)
+ for (i = 0; i < ARRAY_SIZE(gl); i++)
{
int nCopied, expected_nCopied, expected_bytes_written;
char gl_text[1024];
@@ -504,7 +504,7 @@ static void test_EM_LINELENGTH(void)
}
ok(result == 9, "Incorrect line count of %ld\n", result);
- for (i = 0; i < sizeof(offset_test)/sizeof(offset_test[0]); i++) {
+ for (i = 0; i < ARRAY_SIZE(offset_test); i++) {
result = SendMessageA(hwndRichEdit, EM_LINELENGTH, offset_test[i][0], 0);
ok(result == offset_test[i][1], "Length of line at offset %d is %ld, expected %d\n",
offset_test[i][0], result, offset_test[i][1]);
@@ -525,7 +525,7 @@ static void test_EM_LINELENGTH(void)
{16, 4}, /* Line 3: |wine */
};
SendMessageA(hwndRichEdit, WM_SETTEXT, 0, (LPARAM)text1);
- for (i = 0; i < sizeof(offset_test1)/sizeof(offset_test1[0]); i++) {
+ for (i = 0; i < ARRAY_SIZE(offset_test1); i++) {
result = SendMessageA(hwndRichEdit, EM_LINELENGTH, offset_test1[i][0], 0);
todo_wine_if (offset_test1[i][2])
ok(result == offset_test1[i][1], "Length of line at offset %d is %ld, expected %d\n",
@@ -781,20 +781,17 @@ static void test_EM_FINDTEXT(void)
HWND hwndRichEdit = new_richedit(NULL);
/* Empty rich edit control */
- run_tests_EM_FINDTEXT(hwndRichEdit, "1", find_tests,
- sizeof(find_tests)/sizeof(struct find_s));
+ run_tests_EM_FINDTEXT(hwndRichEdit, "1", find_tests, ARRAY_SIZE(find_tests));
SendMessageA(hwndRichEdit, WM_SETTEXT, 0, (LPARAM)haystack);
/* Haystack text */
- run_tests_EM_FINDTEXT(hwndRichEdit, "2", find_tests2,
- sizeof(find_tests2)/sizeof(struct find_s));
+ run_tests_EM_FINDTEXT(hwndRichEdit, "2", find_tests2, ARRAY_SIZE(find_tests2));
SendMessageA(hwndRichEdit, WM_SETTEXT, 0, (LPARAM)haystack2);
/* Haystack text 2 (with EOL characters) */
- run_tests_EM_FINDTEXT(hwndRichEdit, "3", find_tests3,
- sizeof(find_tests3)/sizeof(struct find_s));
+ run_tests_EM_FINDTEXT(hwndRichEdit, "3", find_tests3, ARRAY_SIZE(find_tests3));
DestroyWindow(hwndRichEdit);
}
@@ -1178,7 +1175,7 @@ static void test_enter(void)
HWND hwndRichEdit = new_richedit(NULL);
UINT i,j;
- for (i = 0; i < sizeof(testenteritems)/sizeof(testenteritems[0]); i++) {
+ for (i = 0; i < ARRAY_SIZE(testenteritems); i++) {
char buf[1024] = {0};
LRESULT result;
@@ -1321,7 +1318,7 @@ static void test_EM_EXSETSEL(void)
{
HWND hwndRichEdit = new_richedit(NULL);
int i;
- const int num_tests = sizeof(exsetsel_tests)/sizeof(struct exsetsel_s);
+ const int num_tests = ARRAY_SIZE(exsetsel_tests);
/* sending some text to the window */
SendMessageA(hwndRichEdit, WM_SETTEXT, 0, (LPARAM)"testing selection");
@@ -1378,7 +1375,7 @@ static void test_EM_SETSEL(void)
char buffA[32] = {0};
HWND hwndRichEdit = new_richedit(NULL);
int i;
- const int num_tests = sizeof(exsetsel_tests)/sizeof(struct exsetsel_s);
+ const int num_tests = ARRAY_SIZE(exsetsel_tests);
/* sending some text to the window */
SendMessageA(hwndRichEdit, WM_SETTEXT, 0, (LPARAM)"testing selection");
--
2.14.4
June 17, 2018
[PATCH 3/3] oleaut32/tests: Use a better type to avoid a cast
by Michael Stefaniuc
Signed-off-by: Michael Stefaniuc <mstefani(a)winehq.org>
---
dlls/oleaut32/tests/safearray.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/dlls/oleaut32/tests/safearray.c b/dlls/oleaut32/tests/safearray.c
index dc23f58a40..bb4ed78185 100644
--- a/dlls/oleaut32/tests/safearray.c
+++ b/dlls/oleaut32/tests/safearray.c
@@ -765,7 +765,7 @@ static void test_SafeArrayAllocDestroyDescriptor(void)
{
SAFEARRAY *sa;
HRESULT hres;
- int i;
+ UINT i;
/* Failure cases */
hres = SafeArrayAllocDescriptor(0, &sa);
@@ -789,7 +789,7 @@ static void test_SafeArrayAllocDestroyDescriptor(void)
if (hres == S_OK)
{
- ok(SafeArrayGetDim(sa) == (UINT)i, "Dimension is %d; should be %d\n",
+ ok(SafeArrayGetDim(sa) == i, "Dimension is %d; should be %d\n",
SafeArrayGetDim(sa), i);
hres = SafeArrayDestroyDescriptor(sa);
--
2.14.4
June 17, 2018
[PATCH 2/3] oleaut32/tests: Avoid an ARRAY_SIZE-like macro
by Michael Stefaniuc
Also use a better type for the dimension variable.
Signed-off-by: Michael Stefaniuc <mstefani(a)winehq.org>
---
dlls/oleaut32/tests/safearray.c | 36 +++++++++++++++++-------------------
1 file changed, 17 insertions(+), 19 deletions(-)
diff --git a/dlls/oleaut32/tests/safearray.c b/dlls/oleaut32/tests/safearray.c
index 8a215df04c..dc23f58a40 100644
--- a/dlls/oleaut32/tests/safearray.c
+++ b/dlls/oleaut32/tests/safearray.c
@@ -828,11 +828,9 @@ static void test_SafeArrayCreateLockDestroy(void)
SAFEARRAY *sa;
HRESULT hres;
VARTYPE vt;
- int dimension;
-
-#define NUM_DIMENSIONS (int)(sizeof(sab) / sizeof(sab[0]))
+ UINT dimension;
- for (dimension = 0; dimension < NUM_DIMENSIONS; dimension++)
+ for (dimension = 0; dimension < ARRAY_SIZE(sab); dimension++)
{
sab[dimension].lLbound = 0;
sab[dimension].cElements = 8;
@@ -850,7 +848,7 @@ static void test_SafeArrayCreateLockDestroy(void)
/* Don't test 0 sized dimensions, as Windows has a bug which allows this */
- for (dimension = 0; dimension < NUM_DIMENSIONS; dimension++)
+ for (dimension = 0; dimension < ARRAY_SIZE(sab); dimension++)
sab[dimension].cElements = 8;
/* Test all VARTYPES in 1-4 dimensions */
@@ -870,7 +868,7 @@ static void test_SafeArrayCreateLockDestroy(void)
if (sa)
{
- ok(SafeArrayGetDim(sa) == (UINT)dimension,
+ ok(SafeArrayGetDim(sa) == dimension,
"VARTYPE %d (@%d dimensions) cDims is %d, expected %d\n",
vt, dimension, SafeArrayGetDim(sa), dimension);
ok(SafeArrayGetElemsize(sa) == dwLen || vt == VT_R8,
@@ -1007,13 +1005,13 @@ static void test_LockUnlock(void)
hres = SafeArrayUnlock(NULL);
ok(hres == E_INVALIDARG, "Lock NULL array hres 0x%x\n", hres);
- for (dimension = 0; dimension < NUM_DIMENSIONS; dimension++)
+ for (dimension = 0; dimension < ARRAY_SIZE(sab); dimension++)
{
sab[dimension].lLbound = 0;
sab[dimension].cElements = 8;
}
- sa = SafeArrayCreate(VT_UI1, NUM_DIMENSIONS, sab);
+ sa = SafeArrayCreate(VT_UI1, ARRAY_SIZE(sab), sab);
/* Test maximum locks */
test_LockUnlock_Vector:
@@ -1054,27 +1052,27 @@ test_LockUnlock_Vector:
static void test_SafeArrayGetPutElement(void)
{
SAFEARRAYBOUND sab[4];
- LONG indices[NUM_DIMENSIONS], index;
+ LONG indices[ARRAY_SIZE(sab)], index;
SAFEARRAY *sa;
HRESULT hres;
int value = 0, gotvalue, dimension;
IRecordInfoImpl *irec;
unsigned int x,y,z,a;
- for (dimension = 0; dimension < NUM_DIMENSIONS; dimension++)
+ for (dimension = 0; dimension < ARRAY_SIZE(sab); dimension++)
{
sab[dimension].lLbound = dimension * 2 + 1;
sab[dimension].cElements = dimension * 3 + 1;
}
- sa = SafeArrayCreate(VT_INT, NUM_DIMENSIONS, sab);
+ sa = SafeArrayCreate(VT_INT, ARRAY_SIZE(sab), sab);
if (!sa)
return; /* Some early versions can't handle > 3 dims */
ok(sa->cbElements == sizeof(value), "int size mismatch\n");
/* Failure cases */
- for (x = 0; x < NUM_DIMENSIONS; x++)
+ for (x = 0; x < ARRAY_SIZE(sab); x++)
{
indices[0] = sab[0].lLbound;
indices[1] = sab[1].lLbound;
@@ -1384,16 +1382,16 @@ static void test_SafeArrayCopyData(void)
return;
}
- for (dimension = 0; dimension < NUM_DIMENSIONS; dimension++)
+ for (dimension = 0; dimension < ARRAY_SIZE(sab); dimension++)
{
sab[dimension].lLbound = dimension * 2 + 2;
sab[dimension].cElements = dimension * 3 + 1;
size *= sab[dimension].cElements;
}
- sa = SafeArrayCreate(VT_INT, NUM_DIMENSIONS, sab);
+ sa = SafeArrayCreate(VT_INT, ARRAY_SIZE(sab), sab);
ok(sa != NULL, "Copy test couldn't create array\n");
- sacopy = SafeArrayCreate(VT_INT, NUM_DIMENSIONS, sab);
+ sacopy = SafeArrayCreate(VT_INT, ARRAY_SIZE(sab), sab);
ok(sacopy != NULL, "Copy test couldn't create copy array\n");
if (!sa || !sacopy)
@@ -1453,7 +1451,7 @@ static void test_SafeArrayCopyData(void)
hres = SafeArrayDestroy(sacopy);
ok(hres == S_OK, "got 0x%08x\n", hres);
- sacopy = SafeArrayCreate(VT_INT, NUM_DIMENSIONS, sab);
+ sacopy = SafeArrayCreate(VT_INT, ARRAY_SIZE(sab), sab);
ok(sacopy != NULL, "Copy test couldn't create copy array\n");
ok(sacopy->fFeatures == FADF_HAVEVARTYPE, "0x%04x\n", sacopy->fFeatures);
@@ -1491,7 +1489,7 @@ static void test_SafeArrayCopyData(void)
"got 0x%04x\n", sacopy->fFeatures);
SafeArrayDestroy(sacopy);
- sacopy = SafeArrayCreate(VT_UI1, NUM_DIMENSIONS, sab);
+ sacopy = SafeArrayCreate(VT_UI1, ARRAY_SIZE(sab), sab);
ok(sacopy != NULL, "Copy test couldn't create copy array\n");
ok(sacopy->fFeatures == FADF_HAVEVARTYPE, "0x%04x\n", sacopy->fFeatures);
hres = SafeArrayCopyData(sa, sacopy);
@@ -1507,7 +1505,7 @@ static void test_SafeArrayCreateEx(void)
SAFEARRAYBOUND sab[4];
SAFEARRAY *sa;
HRESULT hres;
- int dimension;
+ UINT dimension;
if (!pSafeArrayCreateEx)
{
@@ -1515,7 +1513,7 @@ static void test_SafeArrayCreateEx(void)
return;
}
- for (dimension = 0; dimension < NUM_DIMENSIONS; dimension++)
+ for (dimension = 0; dimension < ARRAY_SIZE(sab); dimension++)
{
sab[dimension].lLbound = 0;
sab[dimension].cElements = 8;
--
2.14.4
June 17, 2018
[PATCH 1/3] oleaut32/tests: Use the available ARRAY_SIZE() macro
by Michael Stefaniuc
Signed-off-by: Michael Stefaniuc <mstefani(a)winehq.org>
---
dlls/oleaut32/tests/olefont.c | 2 +-
dlls/oleaut32/tests/olepicture.c | 8 +++---
dlls/oleaut32/tests/safearray.c | 8 +++---
dlls/oleaut32/tests/tmarshal.c | 2 +-
dlls/oleaut32/tests/typelib.c | 26 ++++++++---------
dlls/oleaut32/tests/usrmarshal.c | 4 +--
dlls/oleaut32/tests/varformat.c | 16 +++++------
dlls/oleaut32/tests/vartest.c | 62 ++++++++++++++++++++--------------------
dlls/oleaut32/tests/vartype.c | 24 +++++++---------
9 files changed, 75 insertions(+), 77 deletions(-)
diff --git a/dlls/oleaut32/tests/olefont.c b/dlls/oleaut32/tests/olefont.c
index f9c5625701..10e2a4cf2f 100644
--- a/dlls/oleaut32/tests/olefont.c
+++ b/dlls/oleaut32/tests/olefont.c
@@ -420,7 +420,7 @@ static void test_font_events_disp(void)
hr = IFont_QueryInterface(pFont, &IID_IFontDisp, (void **)&pFontDisp);
EXPECT_HR(hr, S_OK);
- for (i = 0; i < sizeof(font_dispids)/sizeof(font_dispids[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(font_dispids); i++)
{
switch (font_dispids[i].dispid)
{
diff --git a/dlls/oleaut32/tests/olepicture.c b/dlls/oleaut32/tests/olepicture.c
index 7db1d844ba..50ba7652d8 100644
--- a/dlls/oleaut32/tests/olepicture.c
+++ b/dlls/oleaut32/tests/olepicture.c
@@ -501,7 +501,7 @@ static void test_Invoke(void)
/* DISPID_PICT_RENDER */
hdc = create_render_dc();
- for (i = 0; i < sizeof(args)/sizeof(args[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(args); i++)
V_VT(&args[i]) = VT_I4;
V_I4(&args[0]) = 0;
@@ -679,7 +679,7 @@ static HRESULT picture_render(IPicture *iface, HDC hdc, LONG x, LONG y, LONG cx,
IPicture_QueryInterface(iface, &IID_IDispatch, (void**)&disp);
/* This is broken on 64 bits - accepted pointer argument type is still VT_I4 */
- for (i = 0; i < sizeof(args)/sizeof(args[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(args); i++)
V_VT(&args[i]) = VT_I4;
/* pack arguments and call */
@@ -884,7 +884,7 @@ static void test_OleLoadPicturePath(void)
{emptyW, &IID_IPicture, NULL},
};
- for (i = 0; i < sizeof(invalid_parameters)/sizeof(invalid_parameters[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(invalid_parameters); i++)
{
pic = (IPicture *)0xdeadbeef;
hres = OleLoadPicturePath(invalid_parameters[i].szURLorPath, NULL, 0, 0,
@@ -924,7 +924,7 @@ static void test_OleLoadPicturePath(void)
WriteFile(file, bmpimage, sizeof(bmpimage), &size, NULL);
CloseHandle(file);
- MultiByteToWideChar(CP_ACP, 0, temp_file, -1, temp_fileW + 8, sizeof(temp_fileW)/sizeof(WCHAR) - 8);
+ MultiByteToWideChar(CP_ACP, 0, temp_file, -1, temp_fileW + 8, ARRAY_SIZE(temp_fileW) - 8);
/* Try a normal DOS path. */
hres = OleLoadPicturePath(temp_fileW + 8, NULL, 0, 0, &IID_IPicture, (void **)&pic);
diff --git a/dlls/oleaut32/tests/safearray.c b/dlls/oleaut32/tests/safearray.c
index 5ff29b3c3e..8a215df04c 100644
--- a/dlls/oleaut32/tests/safearray.c
+++ b/dlls/oleaut32/tests/safearray.c
@@ -567,7 +567,7 @@ static void test_safearray(void)
hres = SafeArrayDestroy(a);
ok(hres == S_OK,"SAD failed with hres %x\n", hres);
- for (i=0;i<sizeof(vttypes)/sizeof(vttypes[0]);i++) {
+ for (i = 0; i < ARRAY_SIZE(vttypes); i++) {
if ((i == VT_I8 || i == VT_UI8) && has_i8)
{
vttypes[i].elemsize = sizeof(LONG64);
@@ -704,7 +704,7 @@ static void test_safearray(void)
if (!pSafeArrayAllocDescriptorEx)
return;
- for (i = 0; i < sizeof(vttypes)/sizeof(vttypes[0]); i++) {
+ for (i = 0; i < ARRAY_SIZE(vttypes); i++) {
a = NULL;
hres = pSafeArrayAllocDescriptorEx(vttypes[i].vt,1,&a);
ok(hres == S_OK, "SafeArrayAllocDescriptorEx gave hres 0x%x\n", hres);
@@ -1457,7 +1457,7 @@ static void test_SafeArrayCopyData(void)
ok(sacopy != NULL, "Copy test couldn't create copy array\n");
ok(sacopy->fFeatures == FADF_HAVEVARTYPE, "0x%04x\n", sacopy->fFeatures);
- for (i = 0; i < sizeof(ignored_copy_features)/sizeof(USHORT); i++)
+ for (i = 0; i < ARRAY_SIZE(ignored_copy_features); i++)
{
USHORT feature = ignored_copy_features[i];
USHORT orig = sacopy->fFeatures;
@@ -1765,7 +1765,7 @@ static void test_SafeArrayCopy(void)
ok(sa->fFeatures == 0, "got src features 0x%04x\n", sa->fFeatures);
sa->cbElements = 16;
- for (i = 0; i < sizeof(ignored_copy_features)/sizeof(USHORT); i++)
+ for (i = 0; i < ARRAY_SIZE(ignored_copy_features); i++)
{
USHORT feature = ignored_copy_features[i];
diff --git a/dlls/oleaut32/tests/tmarshal.c b/dlls/oleaut32/tests/tmarshal.c
index 00cb4646c5..b48b7855db 100644
--- a/dlls/oleaut32/tests/tmarshal.c
+++ b/dlls/oleaut32/tests/tmarshal.c
@@ -725,7 +725,7 @@ static HRESULT WINAPI Widget_VarArg(
static BOOL mystruct_uint_ordered(MYSTRUCT *mystruct)
{
int i;
- for (i = 0; i < sizeof(mystruct->uarr)/sizeof(mystruct->uarr[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(mystruct->uarr); i++)
if (mystruct->uarr[i] != i)
return FALSE;
return TRUE;
diff --git a/dlls/oleaut32/tests/typelib.c b/dlls/oleaut32/tests/typelib.c
index 4d5314e1ab..03031743df 100644
--- a/dlls/oleaut32/tests/typelib.c
+++ b/dlls/oleaut32/tests/typelib.c
@@ -627,7 +627,7 @@ static void test_CreateDispTypeInfo(void)
OLECHAR *name = func1;
ifdata.pmethdata = methdata;
- ifdata.cMembers = sizeof(methdata) / sizeof(methdata[0]);
+ ifdata.cMembers = ARRAY_SIZE(methdata);
methdata[0].szName = SysAllocString(func1);
methdata[0].ppdata = parms1;
@@ -1350,7 +1350,7 @@ static LSTATUS myRegDeleteTreeW(HKEY hKey, LPCWSTR lpszSubKey, REGSAM view)
dwMaxSubkeyLen++;
dwMaxValueLen++;
dwMaxLen = max(dwMaxSubkeyLen, dwMaxValueLen);
- if (dwMaxLen > sizeof(szNameBuf)/sizeof(WCHAR))
+ if (dwMaxLen > ARRAY_SIZE(szNameBuf))
{
/* Name too big: alloc a buffer for it */
if (!(lpszName = HeapAlloc( GetProcessHeap(), 0, dwMaxLen*sizeof(WCHAR))))
@@ -1483,7 +1483,7 @@ static void test_QueryPathOfRegTypeLib(DWORD arch)
if (!do_typelib_reg_key(&uid, 5, 37, arch, base, FALSE)) return;
if (arch == 64 && !do_typelib_reg_key(&uid, 5, 37, 32, wrongW, FALSE)) return;
- for (i = 0; i < sizeof(td)/sizeof(td[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(td); i++)
{
ret = QueryPathOfRegTypeLib(&uid, td[i].maj, td[i].min, LOCALE_NEUTRAL, &path);
ok(ret == td[i].ret, "QueryPathOfRegTypeLib(%u.%u) returned %08x\n", td[i].maj, td[i].min, ret);
@@ -2309,7 +2309,7 @@ static void test_CreateTypeLib(SYSKIND sys) {
SysFreeString(V_BSTR(¶mdescex.varDefaultValue));
WideCharToMultiByte(CP_ACP, 0, defaultW, -1, nameA, sizeof(nameA), NULL, NULL);
- MultiByteToWideChar(CP_ACP, 0, nameA, -1, nameW, sizeof(nameW)/sizeof(nameW[0]));
+ MultiByteToWideChar(CP_ACP, 0, nameA, -1, nameW, ARRAY_SIZE(nameW));
hres = ITypeInfo2_GetFuncDesc(ti2, 3, &pfuncdesc);
ok(hres == S_OK, "got %08x\n", hres);
@@ -3041,7 +3041,7 @@ static void test_CreateTypeLib(SYSKIND sys) {
ok(hres == S_OK, "got: %08x\n", hres);
ok(cnames == 0, "got: %u\n", cnames);
- hres = ITypeInfo_GetNames(ti, pfuncdesc->memid, names, sizeof(names) / sizeof(*names), &cnames);
+ hres = ITypeInfo_GetNames(ti, pfuncdesc->memid, names, ARRAY_SIZE(names), &cnames);
ok(hres == S_OK, "got: %08x\n", hres);
ok(cnames == 1, "got: %u\n", cnames);
ok(!memcmp(names[0], func1W, sizeof(func1W)), "got names[0]: %s\n", wine_dbgstr_w(names[0]));
@@ -3145,7 +3145,7 @@ static void test_CreateTypeLib(SYSKIND sys) {
SysFreeString(name);
SysFreeString(helpfile);
- hres = ITypeInfo_GetNames(ti, pfuncdesc->memid, names, sizeof(names) / sizeof(*names), &cnames);
+ hres = ITypeInfo_GetNames(ti, pfuncdesc->memid, names, ARRAY_SIZE(names), &cnames);
ok(hres == S_OK, "got: %08x\n", hres);
ok(cnames == 3, "got: %u\n", cnames);
ok(!memcmp(names[0], func2W, sizeof(func2W)), "got names[0]: %s\n", wine_dbgstr_w(names[0]));
@@ -3375,7 +3375,7 @@ static void test_CreateTypeLib(SYSKIND sys) {
SysFreeString(name);
SysFreeString(helpfile);
- hres = ITypeInfo_GetNames(ti, pfuncdesc->memid, names, sizeof(names) / sizeof(*names), &cnames);
+ hres = ITypeInfo_GetNames(ti, pfuncdesc->memid, names, ARRAY_SIZE(names), &cnames);
ok(hres == S_OK, "got: %08x\n", hres);
ok(cnames == 1, "got: %u\n", cnames);
ok(!memcmp(names[0], func1W, sizeof(func1W)), "got names[0]: %s\n", wine_dbgstr_w(names[0]));
@@ -3474,7 +3474,7 @@ static void test_CreateTypeLib(SYSKIND sys) {
SysFreeString(name);
SysFreeString(helpfile);
- hres = ITypeInfo_GetNames(ti, pfuncdesc->memid, names, sizeof(names) / sizeof(*names), &cnames);
+ hres = ITypeInfo_GetNames(ti, pfuncdesc->memid, names, ARRAY_SIZE(names), &cnames);
ok(hres == S_OK, "got: %08x\n", hres);
ok(cnames == 1, "got: %u\n", cnames);
ok(!memcmp(names[0], func1W, sizeof(func1W)), "got names[0]: %s\n", wine_dbgstr_w(names[0]));
@@ -4701,7 +4701,7 @@ static void test_dump_typelib(const char *name)
{
WCHAR wszName[MAX_PATH];
ITypeLib *typelib;
- int ticount = sizeof(info)/sizeof(info[0]);
+ int ticount = ARRAY_SIZE(info);
int iface, func;
MultiByteToWideChar(CP_ACP, 0, name, -1, wszName, MAX_PATH);
@@ -4739,7 +4739,7 @@ static void test_dump_typelib(const char *name)
HRESULT hr;
GUID guid;
- MultiByteToWideChar(CP_ACP, 0, ti->uuid, -1, guidW, sizeof(guidW)/sizeof(guidW[0]));
+ MultiByteToWideChar(CP_ACP, 0, ti->uuid, -1, guidW, ARRAY_SIZE(guidW));
IIDFromString(guidW, &guid);
expect_guid(&guid, &typeattr->guid);
@@ -5002,7 +5002,7 @@ static void test_register_typelib(BOOL system_registration)
}
- StringFromGUID2(&attr->guid, uuidW, sizeof(uuidW) / sizeof(uuidW[0]));
+ StringFromGUID2(&attr->guid, uuidW, ARRAY_SIZE(uuidW));
WideCharToMultiByte(CP_ACP, 0, uuidW, -1, uuid, sizeof(uuid), NULL, NULL);
sprintf(key_name, "Interface\\%s", uuid);
@@ -5050,7 +5050,7 @@ static void test_register_typelib(BOOL system_registration)
if((attr->typekind == TKIND_INTERFACE && (attr->wTypeFlags & TYPEFLAG_FOLEAUTOMATION)) ||
attr->typekind == TKIND_DISPATCH)
{
- StringFromGUID2(&attr->guid, uuidW, sizeof(uuidW) / sizeof(uuidW[0]));
+ StringFromGUID2(&attr->guid, uuidW, ARRAY_SIZE(uuidW));
WideCharToMultiByte(CP_ACP, 0, uuidW, -1, uuid, sizeof(uuid), NULL, NULL);
sprintf(key_name, "Interface\\%s", uuid);
@@ -6204,7 +6204,7 @@ static void test_stub(void)
WCHAR guidW[40];
REGSAM opposite = side ^ (KEY_WOW64_64KEY | KEY_WOW64_32KEY);
- StringFromGUID2(&interfaceguid, guidW, sizeof(guidW)/sizeof(guidW[0]));
+ StringFromGUID2(&interfaceguid, guidW, ARRAY_SIZE(guidW));
/* Delete the opposite interface key */
lr = RegOpenKeyExA(HKEY_CLASSES_ROOT, "Interface", 0, KEY_READ | opposite, &hkey);
diff --git a/dlls/oleaut32/tests/usrmarshal.c b/dlls/oleaut32/tests/usrmarshal.c
index b9478d1b69..5ea13e418b 100644
--- a/dlls/oleaut32/tests/usrmarshal.c
+++ b/dlls/oleaut32/tests/usrmarshal.c
@@ -416,7 +416,7 @@ static void test_marshal_LPSAFEARRAY(void)
/* Test an array of VT_BSTR */
sab[0].lLbound = 3;
- sab[0].cElements = sizeof(values) / sizeof(values[0]);
+ sab[0].cElements = ARRAY_SIZE(values);
lpsa = SafeArrayCreate(VT_BSTR, 1, sab);
expected_bstr_size = 0;
@@ -463,7 +463,7 @@ static void test_marshal_LPSAFEARRAY(void)
ok(next - buffer == expected, "Marshaled %u bytes, expected %u\n", (ULONG) (next - buffer), expected);
ok(lpsa2 != NULL, "LPSAFEARRAY didn't unmarshal, result %p\n", next);
- for (i = 0; i < sizeof(values) / sizeof(values[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(values); i++)
{
BSTR gotvalue = NULL;
diff --git a/dlls/oleaut32/tests/varformat.c b/dlls/oleaut32/tests/varformat.c
index 69476aa5d3..d713894870 100644
--- a/dlls/oleaut32/tests/varformat.c
+++ b/dlls/oleaut32/tests/varformat.c
@@ -80,7 +80,7 @@ static void test_VarFormatNumber(void)
CHECKPTR(VarFormatNumber);
- GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, buff, sizeof(buff)/sizeof(char));
+ GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, buff, ARRAY_SIZE(buff));
if (buff[0] != '.' || buff[1])
{
skip("Skipping VarFormatNumber tests as decimal separator is '%s'\n", buff);
@@ -127,7 +127,7 @@ static const char *szVarFmtFail = "VT %d|0x%04x Format %s: expected 0x%08x, '%s'
#define VARFMT(vt,v,val,fmt,ret,str) do { \
out = NULL; \
V_VT(&in) = (vt); v(&in) = val; \
- if (fmt) MultiByteToWideChar(CP_ACP, 0, fmt, -1, buffW, sizeof(buffW)/sizeof(WCHAR)); \
+ if (fmt) MultiByteToWideChar(CP_ACP, 0, fmt, -1, buffW, ARRAY_SIZE(buffW)); \
hres = pVarFormat(&in,fmt ? buffW : NULL,fd,fw,flags,&out); \
if (SUCCEEDED(hres)) WideCharToMultiByte(CP_ACP, 0, out, -1, buff, sizeof(buff),0,0); \
else buff[0] = '\0'; \
@@ -224,7 +224,7 @@ static const FMTDATERES VarFormat_namedtime_results[] =
};
#define VNUMFMT(vt,v) \
- for (i = 0; i < sizeof(VarFormat_results)/sizeof(FMTRES); i++) \
+ for (i = 0; i < ARRAY_SIZE(VarFormat_results); i++) \
{ \
VARFMT(vt,v,1,VarFormat_results[i].fmt,S_OK,VarFormat_results[i].one_res); \
VARFMT(vt,v,0,VarFormat_results[i].fmt,S_OK,VarFormat_results[i].zero_res); \
@@ -256,13 +256,13 @@ static void test_VarFormat(void)
skip("Skipping VarFormat tests for non English language\n");
return;
}
- GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, buff, sizeof(buff)/sizeof(char));
+ GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, buff, ARRAY_SIZE(buff));
if (buff[0] != '.' || buff[1])
{
skip("Skipping VarFormat tests as decimal separator is '%s'\n", buff);
return;
}
- GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_IDIGITS, buff, sizeof(buff)/sizeof(char));
+ GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_IDIGITS, buff, ARRAY_SIZE(buff));
if (buff[0] != '2' || buff[1])
{
skip("Skipping VarFormat tests as decimal places is '%s'\n", buff);
@@ -296,7 +296,7 @@ static void test_VarFormat(void)
VARFMT(VT_BOOL|VT_BYREF,V_BOOLREF,&bFalse,"True/False",S_OK,"False");
/* Dates */
- for (i = 0; i < sizeof(VarFormat_date_results)/sizeof(FMTDATERES); i++)
+ for (i = 0; i < ARRAY_SIZE(VarFormat_date_results); i++)
{
if (i < 7)
fd = i + 1; /* Test first day */
@@ -308,14 +308,14 @@ static void test_VarFormat(void)
}
/* Named time formats */
- GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_STIMEFORMAT, buff, sizeof(buff)/sizeof(char));
+ GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_STIMEFORMAT, buff, ARRAY_SIZE(buff));
if (strcmp(buff, "h:mm:ss tt"))
{
skip("Skipping named time tests as time format is '%s'\n", buff);
}
else
{
- for (i = 0; i < sizeof(VarFormat_namedtime_results)/sizeof(FMTDATERES); i++)
+ for (i = 0; i < ARRAY_SIZE(VarFormat_namedtime_results); i++)
{
fd = 0;
VARFMT(VT_DATE,V_DATE,VarFormat_namedtime_results[i].val,
diff --git a/dlls/oleaut32/tests/vartest.c b/dlls/oleaut32/tests/vartest.c
index 429ffbbb2e..c00968e225 100644
--- a/dlls/oleaut32/tests/vartest.c
+++ b/dlls/oleaut32/tests/vartest.c
@@ -537,7 +537,7 @@ static const char *vtstr(int x)
return "VT_BSTR_BLOB/VT_ILLEGALMASKED/VT_TYPEMASK";
default:
- vtstr_current %= sizeof(vtstr_buffer)/sizeof(*vtstr_buffer);
+ vtstr_current %= ARRAY_SIZE(vtstr_buffer);
sprintf(vtstr_buffer[vtstr_current], "unknown variant type %d", x);
return vtstr_buffer[vtstr_current++];
}
@@ -545,7 +545,7 @@ static const char *vtstr(int x)
static const char *variantstr( const VARIANT *var )
{
- vtstr_current %= sizeof(vtstr_buffer)/sizeof(*vtstr_buffer);
+ vtstr_current %= ARRAY_SIZE(vtstr_buffer);
switch(V_VT(var))
{
case VT_I1:
@@ -664,7 +664,7 @@ static void test_var_call2( int line, HRESULT (WINAPI *func)(LPVARIANT,LPVARIANT
static int strcmp_wa(const WCHAR *strw, const char *stra)
{
WCHAR buf[512];
- MultiByteToWideChar(CP_ACP, 0, stra, -1, buf, sizeof(buf)/sizeof(buf[0]));
+ MultiByteToWideChar(CP_ACP, 0, stra, -1, buf, ARRAY_SIZE(buf));
return lstrcmpW(strw, buf);
}
@@ -792,7 +792,7 @@ static void test_VariantClear(void)
* Also demonstrates that null pointers in 'v' are not dereferenced.
* Individual variant tests should test VariantClear() with non-NULL values.
*/
- for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(ExtraFlags); i++)
{
VARTYPE vt;
@@ -921,7 +921,7 @@ static void test_VariantCopy(void)
*/
/* vSrc == vDst */
- for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(ExtraFlags); i++)
{
for (vt = 0; vt <= VT_BSTR_BLOB; vt++)
{
@@ -949,7 +949,7 @@ static void test_VariantCopy(void)
memset(&vSrc, 0, sizeof(vSrc));
V_VT(&vSrc) = VT_UI1;
- for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(ExtraFlags); i++)
{
for (vt = 0; vt <= VT_BSTR_BLOB; vt++)
{
@@ -975,7 +975,7 @@ static void test_VariantCopy(void)
}
/* Test that VariantClear() checks vSrc for validity before copying */
- for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(ExtraFlags); i++)
{
for (vt = 0; vt <= VT_BSTR_BLOB; vt++)
{
@@ -1079,7 +1079,7 @@ static void test_VariantCopyInd(void)
memset(buffer, 0, sizeof(buffer));
/* vSrc == vDst */
- for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(ExtraFlags); i++)
{
if (ExtraFlags[i] & VT_ARRAY)
continue; /* Native crashes on NULL safearray */
@@ -1130,7 +1130,7 @@ static void test_VariantCopyInd(void)
V_VT(&vSrc) = VT_UI1|VT_BYREF;
V_BYREF(&vSrc) = &buffer;
- for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(ExtraFlags); i++)
{
for (vt = 0; vt <= VT_BSTR_BLOB; vt++)
{
@@ -1156,7 +1156,7 @@ static void test_VariantCopyInd(void)
}
/* bad src */
- for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(ExtraFlags); i++)
{
if (ExtraFlags[i] & VT_ARRAY)
continue; /* Native crashes on NULL safearray */
@@ -1276,7 +1276,7 @@ static HRESULT convert_str( const char *str, INT dig, ULONG flags,
NUMPARSE *np, BYTE rgb[128], LCID lcid )
{
OLECHAR buff[128];
- MultiByteToWideChar( CP_ACP,0, str, -1, buff, sizeof(buff)/sizeof(WCHAR) );
+ MultiByteToWideChar( CP_ACP,0, str, -1, buff, ARRAY_SIZE( buff ));
memset( rgb, FAILDIG, 128 );
memset( np, 255, sizeof(*np) );
np->cDig = dig;
@@ -2291,7 +2291,7 @@ static void test_VarAbs(void)
/* Test all possible V_VT values.
*/
- for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(ExtraFlags); i++)
{
VARTYPE vt;
@@ -2354,7 +2354,7 @@ static void test_VarAbs(void)
hres = pVarAbs(&v,&vDst);
ok(hres == S_OK && V_VT(&vDst) == VT_CY && V_CY(&vDst).int64 == 10000,
"VarAbs(CY): expected 0x0 got 0x%X\n", hres);
- GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, buff, sizeof(buff)/sizeof(char));
+ GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, buff, ARRAY_SIZE(buff));
if (buff[1])
{
trace("Skipping VarAbs(BSTR) as decimal separator is '%s'\n", buff);
@@ -2392,7 +2392,7 @@ static void test_VarNot(void)
CHECKPTR(VarNot);
/* Test all possible V_VT values */
- for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(ExtraFlags); i++)
{
VARTYPE vt;
@@ -2523,7 +2523,7 @@ static void test_VarSub(void)
VariantInit(&result);
/* Test all possible flag/vt combinations & the resulting vt type */
- for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(ExtraFlags); i++)
{
VARTYPE leftvt, rightvt, resvt;
@@ -3254,7 +3254,7 @@ static void test_VarFix(void)
CHECKPTR(VarFix);
/* Test all possible V_VT values */
- for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(ExtraFlags); i++)
{
VARTYPE vt;
@@ -3369,7 +3369,7 @@ static void test_VarInt(void)
CHECKPTR(VarInt);
/* Test all possible V_VT values */
- for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(ExtraFlags); i++)
{
VARTYPE vt;
@@ -3490,7 +3490,7 @@ static void test_VarNeg(void)
* native version. This at least ensures (as with all tests here) that
* we will notice if/when new vtypes/flags are added in native.
*/
- for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(ExtraFlags); i++)
{
VARTYPE vt;
@@ -3677,7 +3677,7 @@ static void test_VarRound(void)
VARROUND(DATE,-1.449,1,DATE,-1.4);
/* replace the decimal separator */
- GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, buff, sizeof(buff)/sizeof(char));
+ GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, buff, ARRAY_SIZE(buff));
if (!buff[1]) {
szNumMin[2] = buff[0];
szNum[1] = buff[0];
@@ -3721,7 +3721,7 @@ static void test_VarRound(void)
"VarRound: expected 0x0,%d got 0x%X,%d\n", VT_NULL, hres, V_VT(&vDst));
/* VT_DECIMAL */
- for (i = 0; i < sizeof(decimal_round_data)/sizeof(struct decimal_round_t); i++)
+ for (i = 0; i < ARRAY_SIZE(decimal_round_data); i++)
{
const struct decimal_round_t *ptr = &decimal_round_data[i];
DECIMAL *pdec;
@@ -3786,7 +3786,7 @@ static void test_VarXor(void)
CHECKPTR(VarXor);
/* Test all possible flag/vt combinations & the resulting vt type */
- for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(ExtraFlags); i++)
{
VARTYPE leftvt, rightvt, resvt;
@@ -4520,7 +4520,7 @@ static void test_VarOr(void)
CHECKPTR(VarOr);
/* Test all possible flag/vt combinations & the resulting vt type */
- for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(ExtraFlags); i++)
{
VARTYPE leftvt, rightvt, resvt;
@@ -5252,7 +5252,7 @@ static void test_VarEqv(void)
CHECKPTR(VarEqv);
/* Test all possible flag/vt combinations & the resulting vt type */
- for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(ExtraFlags); i++)
{
VARTYPE leftvt, rightvt, resvt;
@@ -5396,7 +5396,7 @@ static void test_VarMul(void)
rbstr = SysAllocString(sz12);
/* Test all possible flag/vt combinations & the resulting vt type */
- for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(ExtraFlags); i++)
{
VARTYPE leftvt, rightvt, resvt;
@@ -5567,7 +5567,7 @@ static void test_VarAdd(void)
rbstr = SysAllocString(sz12);
/* Test all possible flag/vt combinations & the resulting vt type */
- for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(ExtraFlags); i++)
{
VARTYPE leftvt, rightvt, resvt;
@@ -6231,7 +6231,7 @@ static void test_VarAnd(void)
false_str = SysAllocString(szFalse);
/* Test all possible flag/vt combinations & the resulting vt type */
- for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(ExtraFlags); i++)
{
VARTYPE leftvt, rightvt, resvt;
@@ -6947,7 +6947,7 @@ static void test_VarCmp(void)
bstr1few = SysAllocString(sz1few);
/* Test all possible flag/vt combinations & the resulting vt type */
- for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(ExtraFlags); i++)
{
VARTYPE leftvt, rightvt;
@@ -7183,7 +7183,7 @@ static void test_VarPow(void)
num3_str = SysAllocString(str3);
/* Test all possible flag/vt combinations & the resulting vt type */
- for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(ExtraFlags); i++)
{
VARTYPE leftvt, rightvt, resvt;
@@ -7709,7 +7709,7 @@ static void test_VarDiv(void)
num2_str = SysAllocString(str2);
/* Test all possible flag/vt combinations & the resulting vt type */
- for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(ExtraFlags); i++)
{
VARTYPE leftvt, rightvt, resvt;
@@ -8082,7 +8082,7 @@ static void test_VarIdiv(void)
num2_str = SysAllocString(str2);
/* Test all possible flag/vt combinations & the resulting vt type */
- for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(ExtraFlags); i++)
{
VARTYPE leftvt, rightvt, resvt;
@@ -8648,7 +8648,7 @@ static void test_VarImp(void)
false_str = SysAllocString(szFalse);
/* Test all possible flag/vt combinations & the resulting vt type */
- for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(ExtraFlags); i++)
{
VARTYPE leftvt, rightvt, resvt;
diff --git a/dlls/oleaut32/tests/vartype.c b/dlls/oleaut32/tests/vartype.c
index 9be2eb2901..e93a6e6a8d 100644
--- a/dlls/oleaut32/tests/vartype.c
+++ b/dlls/oleaut32/tests/vartype.c
@@ -112,7 +112,7 @@ static BOOL has_locales;
#define CONVERT_STR(func,str,flags) \
SetLastError(0); \
- if (str) MultiByteToWideChar(CP_ACP,0,str,-1,buff,sizeof(buff)/sizeof(WCHAR)); \
+ if (str) MultiByteToWideChar(CP_ACP,0,str,-1,buff,ARRAY_SIZE(buff)); \
hres = func(str ? buff : NULL,in,flags,&out)
#define COPYTEST(val, vt, srcval, dstval, srcref, dstref, fs) do { \
@@ -2944,7 +2944,7 @@ static void test_VarDateFromDec(void)
#define DFS(str) \
buff[0] = '\0'; out = 0.0; \
- if (str) MultiByteToWideChar(CP_ACP,0,str,-1,buff,sizeof(buff)/sizeof(WCHAR)); \
+ if (str) MultiByteToWideChar(CP_ACP,0,str,-1,buff,ARRAY_SIZE(buff)); \
hres = VarDateFromStr(str ? buff : NULL,lcid,LOCALE_NOUSEROVERRIDE,&out)
#define MKRELDATE(day,mth) st.wMonth = mth; st.wDay = day; \
@@ -3091,7 +3091,7 @@ static void test_VarDateFromStr(void)
DFS("1.2.3 4 5 6"); EXPECT_DBL(38812.04309027778);
DFS("1 2 3 4.5.6"); EXPECT_DBL(37623.17020833334);
- for (i = 0; i < sizeof(BadDateStrings)/sizeof(char*); i++)
+ for (i = 0; i < ARRAY_SIZE(BadDateStrings); i++)
{
DFS(BadDateStrings[i]); EXPECT_MISMATCH;
}
@@ -4816,12 +4816,12 @@ static void test_VarBstrCmp(void)
/* These two strings are considered equal even though one is
* NULL-terminated and the other not.
*/
- bstr2 = SysAllocStringLen(s1, sizeof(s1) / sizeof(WCHAR));
+ bstr2 = SysAllocStringLen(s1, ARRAY_SIZE(s1));
VARBSTRCMP(bstr,bstr2,0,VARCMP_EQ);
SysFreeString(bstr2);
/* These two strings are not equal */
- bstr2 = SysAllocStringLen(s2, sizeof(s2) / sizeof(WCHAR));
+ bstr2 = SysAllocStringLen(s2, ARRAY_SIZE(s2));
VARBSTRCMP(bstr,bstr2,0,VARCMP_LT);
SysFreeString(bstr2);
@@ -5235,8 +5235,7 @@ if (0)
ret = VarBstrCat(str1, str2, &res);
ok(ret == S_OK, "VarBstrCat failed: %08x\n", ret);
ok(res != NULL, "Expected a string\n");
- ok(SysStringLen(res) == sizeof(sz1sz2) / sizeof(WCHAR) - 1,
- "Unexpected length\n");
+ ok(SysStringLen(res) == ARRAY_SIZE(sz1sz2) - 1, "Unexpected length\n");
ok(!memcmp(res, sz1sz2, sizeof(sz1sz2)), "Unexpected value\n");
SysFreeString(res);
@@ -5244,14 +5243,13 @@ if (0)
SysFreeString(str1);
/* Concatenation of two strings with embedded NULLs */
- str1 = SysAllocStringLen(s1, sizeof(s1) / sizeof(WCHAR));
- str2 = SysAllocStringLen(s2, sizeof(s2) / sizeof(WCHAR));
+ str1 = SysAllocStringLen(s1, ARRAY_SIZE(s1));
+ str2 = SysAllocStringLen(s2, ARRAY_SIZE(s2));
ret = VarBstrCat(str1, str2, &res);
ok(ret == S_OK, "VarBstrCat failed: %08x\n", ret);
ok(res != NULL, "Expected a string\n");
- ok(SysStringLen(res) == sizeof(s1s2) / sizeof(WCHAR),
- "Unexpected length\n");
+ ok(SysStringLen(res) == ARRAY_SIZE(s1s2), "Unexpected length\n");
ok(!memcmp(res, s1s2, sizeof(s1s2)), "Unexpected value\n");
SysFreeString(res);
@@ -5893,13 +5891,13 @@ static void test_bstr_cache(void)
/* Fill the bucket with cached entries.
We roll our own, to show that the cache doesn't use
the bstr length field to determine bucket allocation. */
- for(i=0; i < sizeof(strs)/sizeof(*strs); i++)
+ for(i=0; i < ARRAY_SIZE(strs); i++)
{
DWORD_PTR *ptr = CoTaskMemAlloc(64);
ptr[0] = 0;
strs[i] = (BSTR)(ptr + 1);
}
- for(i=0; i < sizeof(strs)/sizeof(*strs); i++)
+ for(i=0; i < ARRAY_SIZE(strs); i++)
SysFreeString(strs[i]);
/* Following allocation will be made from cache */
--
2.14.4
June 17, 2018
[PATCH] winedbg: Use the available ARRAY_SIZE() macro
by Michael Stefaniuc
Signed-off-by: Michael Stefaniuc <mstefani(a)winehq.org>
---
programs/winedbg/crashdlg.c | 13 ++++++-------
programs/winedbg/gdbproxy.c | 12 ++++++------
programs/winedbg/tgt_active.c | 6 +++---
3 files changed, 15 insertions(+), 16 deletions(-)
diff --git a/programs/winedbg/crashdlg.c b/programs/winedbg/crashdlg.c
index 4e02a4bb7c..5c913ff7a1 100644
--- a/programs/winedbg/crashdlg.c
+++ b/programs/winedbg/crashdlg.c
@@ -38,8 +38,8 @@ int msgbox_res_id(HWND hwnd, UINT textId, UINT captionId, UINT uType)
{
WCHAR caption[256];
WCHAR text[256];
- LoadStringW(GetModuleHandleW(NULL), captionId, caption, sizeof(caption)/sizeof(caption[0]));
- LoadStringW(GetModuleHandleW(NULL), textId, text, sizeof(text)/sizeof(text[0]));
+ LoadStringW(GetModuleHandleW(NULL), captionId, caption, ARRAY_SIZE(caption));
+ LoadStringW(GetModuleHandleW(NULL), textId, text, ARRAY_SIZE(text));
return MessageBoxW(hwnd, text, caption, uType);
}
@@ -116,8 +116,7 @@ static void set_message_with_filename(HWND hDlg)
WCHAR originalText[1000];
WCHAR newText[1000 + MAX_PROGRAM_NAME_LENGTH];
- GetDlgItemTextW(hDlg, IDC_STATIC_TXT1, originalText,
- sizeof(originalText)/sizeof(originalText[0]));
+ GetDlgItemTextW(hDlg, IDC_STATIC_TXT1, originalText, ARRAY_SIZE(originalText));
wsprintfW(newText, originalText, g_ProgramName);
SetDlgItemTextW(hDlg, IDC_STATIC_TXT1, newText);
}
@@ -150,11 +149,11 @@ static void save_crash_log( HWND hwnd )
memset( &save, 0, sizeof(save) );
lstrcpyW( path, default_name );
- LoadStringW( GetModuleHandleW(0), IDS_TEXT_FILES, buffer, sizeof(buffer)/sizeof(buffer[0]) );
+ LoadStringW( GetModuleHandleW(0), IDS_TEXT_FILES, buffer, ARRAY_SIZE(buffer));
p = buffer + lstrlenW(buffer) + 1;
lstrcpyW(p, txt_files);
p += lstrlenW(p) + 1;
- LoadStringW( GetModuleHandleW(0), IDS_ALL_FILES, p, sizeof(buffer)/sizeof(buffer[0]) - (p - buffer) );
+ LoadStringW( GetModuleHandleW(0), IDS_ALL_FILES, p, ARRAY_SIZE(buffer) - (p - buffer) );
p += lstrlenW(p) + 1;
lstrcpyW(p, all_files);
p += lstrlenW(p) + 1;
@@ -189,7 +188,7 @@ static void save_crash_log( HWND hwnd )
}
else err = GetLastError();
- LoadStringW( GetModuleHandleW(0), IDS_SAVE_ERROR, buffer, sizeof(buffer)/sizeof(WCHAR) );
+ LoadStringW( GetModuleHandleW(0), IDS_SAVE_ERROR, buffer, ARRAY_SIZE(buffer));
FormatMessageW( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL, err, 0, (LPWSTR)&p, 0, NULL);
MessageBoxW( 0, p, buffer, MB_OK | MB_ICONERROR);
diff --git a/programs/winedbg/gdbproxy.c b/programs/winedbg/gdbproxy.c
index 7f59ce1df6..b8387fe0ec 100644
--- a/programs/winedbg/gdbproxy.c
+++ b/programs/winedbg/gdbproxy.c
@@ -391,7 +391,7 @@ static void handle_debug_event(struct gdb_context* gdbctx, DEBUG_EVENT* de)
memory_get_string_indirect(gdbctx->process,
de->u.CreateProcessInfo.lpImageName,
de->u.CreateProcessInfo.fUnicode,
- u.buffer, sizeof(u.buffer) / sizeof(WCHAR));
+ u.buffer, ARRAY_SIZE(u.buffer));
dbg_set_process_name(gdbctx->process, u.buffer);
if (gdbctx->trace & GDBPXY_TRC_WIN32_EVENT)
@@ -423,7 +423,7 @@ static void handle_debug_event(struct gdb_context* gdbctx, DEBUG_EVENT* de)
memory_get_string_indirect(gdbctx->process,
de->u.LoadDll.lpImageName,
de->u.LoadDll.fUnicode,
- u.buffer, sizeof(u.buffer) / sizeof(WCHAR));
+ u.buffer, ARRAY_SIZE(u.buffer));
if (gdbctx->trace & GDBPXY_TRC_WIN32_EVENT)
fprintf(stderr, "%04x:%04x: loads DLL %s @%p (%u<%u>)\n",
de->dwProcessId, de->dwThreadId,
@@ -1146,7 +1146,7 @@ static enum packet_return packet_verbose(struct gdb_context* gdbctx)
if (gdbctx->trace & GDBPXY_TRC_COMMAND)
fprintf(stderr, "trying to process a verbose packet %*.*s\n",
gdbctx->in_packet_len, gdbctx->in_packet_len, gdbctx->in_packet);
- for (i = 0; i < sizeof(verbose_details)/sizeof(verbose_details[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(verbose_details); i++)
{
if (klen == verbose_details[i].len &&
!memcmp(gdbctx->in_packet, verbose_details[i].name, verbose_details[i].len))
@@ -1934,11 +1934,11 @@ static BOOL extract_packets(struct gdb_context* gdbctx)
assert(plen);
/* FIXME: should use bsearch if packet_entries was sorted */
- for (i = 0; i < sizeof(packet_entries)/sizeof(packet_entries[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(packet_entries); i++)
{
if (packet_entries[i].key == gdbctx->in_buf[1]) break;
}
- if (i == sizeof(packet_entries)/sizeof(packet_entries[0]))
+ if (i == ARRAY_SIZE(packet_entries))
{
if (gdbctx->trace & GDBPXY_TRC_COMMAND_ERROR)
fprintf(stderr, "Unknown packet request %*.*s\n",
@@ -2178,7 +2178,7 @@ static BOOL gdb_init_context(struct gdb_context* gdbctx, unsigned flags, unsigne
gdbctx->in_trap = FALSE;
gdbctx->trace = /*GDBPXY_TRC_PACKET | GDBPXY_TRC_COMMAND |*/ GDBPXY_TRC_COMMAND_ERROR | GDBPXY_TRC_COMMAND_FIXME | GDBPXY_TRC_WIN32_EVENT;
gdbctx->process = NULL;
- for (i = 0; i < sizeof(gdbctx->wine_segs) / sizeof(gdbctx->wine_segs[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(gdbctx->wine_segs); i++)
gdbctx->wine_segs[i] = 0;
/* wait for first trap */
diff --git a/programs/winedbg/tgt_active.c b/programs/winedbg/tgt_active.c
index e5fd07da92..c5569e6adf 100644
--- a/programs/winedbg/tgt_active.c
+++ b/programs/winedbg/tgt_active.c
@@ -360,7 +360,7 @@ static unsigned dbg_handle_debug_event(DEBUG_EVENT* de)
fetch_module_name(de->u.CreateProcessInfo.lpImageName,
de->u.CreateProcessInfo.fUnicode,
de->u.CreateProcessInfo.lpBaseOfImage,
- u.buffer, sizeof(u.buffer) / sizeof(WCHAR), TRUE);
+ u.buffer, ARRAY_SIZE(u.buffer), TRUE);
WINE_TRACE("%04x:%04x: create process '%s'/%p @%p (%u<%u>)\n",
de->dwProcessId, de->dwThreadId,
@@ -455,7 +455,7 @@ static unsigned dbg_handle_debug_event(DEBUG_EVENT* de)
fetch_module_name(de->u.LoadDll.lpImageName,
de->u.LoadDll.fUnicode,
de->u.LoadDll.lpBaseOfDll,
- u.buffer, sizeof(u.buffer) / sizeof(WCHAR), FALSE);
+ u.buffer, ARRAY_SIZE(u.buffer), FALSE);
WINE_TRACE("%04x:%04x: loads DLL %s @%p (%u<%u>)\n",
de->dwProcessId, de->dwThreadId,
@@ -708,7 +708,7 @@ static const char *get_windows_version(void)
GetVersionExW( (OSVERSIONINFOW *)&info );
- for (i = 0; i < sizeof(version_table) / sizeof(version_table[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(version_table); i++)
{
if (version_table[i].type == info.wProductType &&
version_table[i].platform == info.dwPlatformId &&
--
2.14.4
June 17, 2018
Re: [PATCH 2/2] user32/tests: Skip tests for window messages if we failed to receive foreground status.
by Marvin
Hi,
While running your changed tests on Windows, I think I found new failures.
Being a bot and all I'm not very good at pattern recognition, so I might be
wrong, but could you please double-check?
Full results can be found at
https://testbot.winehq.org/JobDetails.pl?Key=39204
Your paranoid android.
=== w7pro64 (64 bit input) ===
input.c:2055: Test failed: expected WM_NCHITTEST message
input.c:2082: Test failed: expected loop with WM_NCHITTEST messages
input.c:2135: Test failed: expected WM_LBUTTONDOWN message
input.c:2136: Test failed: expected WM_LBUTTONUP message
June 17, 2018
[PATCH 2/2] user32/tests: Skip tests for window messages if we failed to receive foreground status.
by Zebediah Figura
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
This should be a better way of checking for failure since it addresses the
root cause, and should hopefully also fix an intermittent test failure on
Wine.
dlls/user32/tests/input.c | 31 ++++++++++++++++++-------------
1 file changed, 18 insertions(+), 13 deletions(-)
diff --git a/dlls/user32/tests/input.c b/dlls/user32/tests/input.c
index 2185cda..8fa1de2 100644
--- a/dlls/user32/tests/input.c
+++ b/dlls/user32/tests/input.c
@@ -691,14 +691,17 @@ static struct message sent_messages[MAXKEYMESSAGES];
static UINT sent_messages_cnt;
/* Verify that only specified key state transitions occur */
-static void compare_and_check(int id, BYTE *ks1, BYTE *ks2, const struct sendinput_test_s *test)
+static void compare_and_check(int id, BYTE *ks1, BYTE *ks2,
+ const struct sendinput_test_s *test, BOOL foreground)
{
int i, failcount = 0;
const struct transition_s *t = test->expected_transitions;
UINT actual_cnt = 0;
const struct message *expected = test->expected_messages;
- while (t->wVk) {
+ while (t->wVk && foreground) {
+ /* We won't receive any information from GetKeyboardState() if we're
+ * not the foreground window. */
BOOL matched = ((ks1[t->wVk]&0x80) == (t->before_state&0x80)
&& (ks2[t->wVk]&0x80) == (~t->before_state&0x80));
@@ -781,6 +784,13 @@ static void compare_and_check(int id, BYTE *ks1, BYTE *ks2, const struct sendinp
expected++;
continue;
}
+ else if (!(expected->flags & hook) && !foreground)
+ {
+ /* If we weren't able to receive foreground status, we won't get
+ * any window messages. */
+ expected++;
+ continue;
+ }
/* NT4 doesn't send SYSKEYDOWN/UP to hooks, only KEYDOWN/UP */
else if ((expected->flags & hook) &&
(expected->message == WM_SYSKEYDOWN || expected->message == WM_SYSKEYUP) &&
@@ -817,7 +827,7 @@ static void compare_and_check(int id, BYTE *ks1, BYTE *ks2, const struct sendinp
expected++;
}
/* skip all optional trailing messages */
- while (expected->message && (expected->flags & optional))
+ while (expected->message && ((expected->flags & optional) || (!(expected->flags & hook) && !foreground)))
expected++;
@@ -897,6 +907,7 @@ static void test_Input_blackbox(void)
int ii;
BYTE ks1[256], ks2[256];
LONG_PTR prevWndProc;
+ BOOL foreground;
HWND window;
HHOOK hook;
@@ -910,7 +921,9 @@ static void test_Input_blackbox(void)
NULL, NULL);
ok(window != NULL, "error: %d\n", (int) GetLastError());
SetWindowPos( window, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE );
- SetForegroundWindow( window );
+ foreground = SetForegroundWindow( window );
+ if (!foreground)
+ skip("Failed to set foreground window; some tests will be skipped.\n");
if (!(hook = SetWindowsHookExA(WH_KEYBOARD_LL, hook_proc, GetModuleHandleA( NULL ), 0)))
{
@@ -939,15 +952,7 @@ static void test_Input_blackbox(void)
pSendInput(1, (INPUT*)&i, sizeof(TEST_INPUT));
empty_message_queue();
GetKeyboardState(ks2);
- if (!ii && sent_messages_cnt <= 1 && !memcmp( ks1, ks2, sizeof(ks1) ))
- {
- win_skip( "window doesn't receive the queued input\n" );
- /* release the key */
- i.u.ki.dwFlags |= KEYEVENTF_KEYUP;
- pSendInput(1, (INPUT*)&i, sizeof(TEST_INPUT));
- break;
- }
- compare_and_check(ii, ks1, ks2, &sendinput_test[ii]);
+ compare_and_check(ii, ks1, ks2, &sendinput_test[ii], foreground);
}
empty_message_queue();
--
2.7.4
June 17, 2018
[PATCH 1/2] user32/tests: Ignore all non-keyboard messages in test_Input_blackbox().
by Zebediah Figura
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/user32/tests/input.c | 11 +----------
1 file changed, 1 insertion(+), 10 deletions(-)
diff --git a/dlls/user32/tests/input.c b/dlls/user32/tests/input.c
index e52f7d2..2185cda 100644
--- a/dlls/user32/tests/input.c
+++ b/dlls/user32/tests/input.c
@@ -848,16 +848,7 @@ static LRESULT CALLBACK WndProc2(HWND hWnd, UINT Msg, WPARAM wParam,
{
if (winetest_debug > 1) trace("MSG: %8x W:%8lx L:%8lx\n", Msg, wParam, lParam);
- if (Msg != WM_PAINT &&
- Msg != WM_NCPAINT &&
- Msg != WM_SYNCPAINT &&
- Msg != WM_ERASEBKGND &&
- Msg != WM_NCHITTEST &&
- Msg != WM_GETTEXT &&
- Msg != WM_GETICON &&
- Msg != WM_IME_SELECT &&
- Msg != WM_DEVICECHANGE &&
- Msg != WM_TIMECHANGE)
+ if ((Msg >= WM_KEYFIRST && Msg <= WM_KEYLAST) || Msg == WM_SYSCOMMAND)
{
ok(sent_messages_cnt < MAXKEYMESSAGES, "Too many messages\n");
if (sent_messages_cnt < MAXKEYMESSAGES)
--
2.7.4
June 17, 2018
[PATCH v2] msvcrt: Use already existent oneexit_table functions for _onexit and _c_exit
by Fabian Maurer
For that to work, MSVCRT__register_onexit_function and
MSVCRT__execute_onexit_table have to available all the time,
not only when _MSVCR_VER>=140
tests based on code by Piotr Caban
v2:
Create exit_event2 in test function, so it exists in child process
Signed-off-by: Fabian Maurer <dark.shadow4(a)web.de>
---
dlls/msvcrt/exit.c | 68 ++++++++++-------------------------
dlls/ucrtbase/tests/misc.c | 74 +++++++++++++++++++++++++++++++++++++-
2 files changed, 91 insertions(+), 51 deletions(-)
diff --git a/dlls/msvcrt/exit.c b/dlls/msvcrt/exit.c
index 7e1805569c..c90f7df953 100644
--- a/dlls/msvcrt/exit.c
+++ b/dlls/msvcrt/exit.c
@@ -25,13 +25,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(msvcrt);
-/* MT */
-#define LOCK_EXIT _mlock(_EXIT_LOCK1)
-#define UNLOCK_EXIT _munlock(_EXIT_LOCK1)
-
-static MSVCRT__onexit_t *MSVCRT_atexit_table = NULL;
-static int MSVCRT_atexit_table_size = 0;
-static int MSVCRT_atexit_registered = 0; /* Points to free slot */
static MSVCRT_purecall_handler purecall_handler = NULL;
typedef struct MSVCRT__onexit_table_t
@@ -41,6 +34,11 @@ typedef struct MSVCRT__onexit_table_t
MSVCRT__onexit_t *_end;
} MSVCRT__onexit_table_t;
+static MSVCRT__onexit_table_t MSVCRT_atexit_table;
+
+int CDECL MSVCRT__register_onexit_function(MSVCRT__onexit_table_t *table, MSVCRT__onexit_t func);
+int CDECL MSVCRT__execute_onexit_table(MSVCRT__onexit_table_t *table);
+
typedef void (__stdcall *_tls_callback_type)(void*,ULONG,void*);
static _tls_callback_type tls_atexit_callback;
@@ -65,17 +63,8 @@ void (*CDECL _aexit_rtn)(int) = MSVCRT__exit;
static void __MSVCRT__call_atexit(void)
{
/* Note: should only be called with the exit lock held */
- TRACE("%d atext functions to call\n", MSVCRT_atexit_registered);
if (tls_atexit_callback) tls_atexit_callback(NULL, DLL_PROCESS_DETACH, NULL);
- /* Last registered gets executed first */
- while (MSVCRT_atexit_registered > 0)
- {
- MSVCRT_atexit_registered--;
- TRACE("next is %p\n",MSVCRT_atexit_table[MSVCRT_atexit_registered]);
- if (MSVCRT_atexit_table[MSVCRT_atexit_registered])
- (*MSVCRT_atexit_table[MSVCRT_atexit_registered])();
- TRACE("returned\n");
- }
+ MSVCRT__execute_onexit_table(&MSVCRT_atexit_table);
}
/*********************************************************************
@@ -276,9 +265,7 @@ void CDECL MSVCRT__c_exit(void)
void CDECL MSVCRT__cexit(void)
{
TRACE("(void)\n");
- LOCK_EXIT;
__MSVCRT__call_atexit();
- UNLOCK_EXIT;
}
/*********************************************************************
@@ -291,26 +278,8 @@ MSVCRT__onexit_t CDECL MSVCRT__onexit(MSVCRT__onexit_t func)
if (!func)
return NULL;
- LOCK_EXIT;
- if (MSVCRT_atexit_registered > MSVCRT_atexit_table_size - 1)
- {
- MSVCRT__onexit_t *newtable;
- TRACE("expanding table\n");
- newtable = MSVCRT_calloc(MSVCRT_atexit_table_size + 32, sizeof(void *));
- if (!newtable)
- {
- TRACE("failed!\n");
- UNLOCK_EXIT;
- return NULL;
- }
- memcpy (newtable, MSVCRT_atexit_table, MSVCRT_atexit_table_size*sizeof(void *));
- MSVCRT_atexit_table_size += 32;
- MSVCRT_free (MSVCRT_atexit_table);
- MSVCRT_atexit_table = newtable;
- }
- MSVCRT_atexit_table[MSVCRT_atexit_registered] = func;
- MSVCRT_atexit_registered++;
- UNLOCK_EXIT;
+ MSVCRT__register_onexit_function(&MSVCRT_atexit_table, func);
+
return func;
}
@@ -359,6 +328,16 @@ int CDECL MSVCRT__crt_atexit(void (*func)(void))
return MSVCRT__onexit((MSVCRT__onexit_t)func) == (MSVCRT__onexit_t)func ? 0 : -1;
}
+/*********************************************************************
+ * _register_thread_local_exe_atexit_callback (UCRTBASE.@)
+ */
+void CDECL _register_thread_local_exe_atexit_callback(_tls_callback_type callback)
+{
+ TRACE("(%p)\n", callback);
+ tls_atexit_callback = callback;
+}
+
+#endif /* _MSVCR_VER>=140 */
/*********************************************************************
* _initialize_onexit_table (UCRTBASE.@)
@@ -457,17 +436,6 @@ int CDECL MSVCRT__execute_onexit_table(MSVCRT__onexit_table_t *table)
return 0;
}
-/*********************************************************************
- * _register_thread_local_exe_atexit_callback (UCRTBASE.@)
- */
-void CDECL _register_thread_local_exe_atexit_callback(_tls_callback_type callback)
-{
- TRACE("(%p)\n", callback);
- tls_atexit_callback = callback;
-}
-
-#endif /* _MSVCR_VER>=140 */
-
#if _MSVCR_VER>=71
/*********************************************************************
* _set_purecall_handler (MSVCR71.@)
diff --git a/dlls/ucrtbase/tests/misc.c b/dlls/ucrtbase/tests/misc.c
index 354fab1e94..ed5bb0589c 100644
--- a/dlls/ucrtbase/tests/misc.c
+++ b/dlls/ucrtbase/tests/misc.c
@@ -125,6 +125,8 @@ static int (CDECL *p_fesetround)(int);
static void (CDECL *p___setusermatherr)(MSVCRT_matherr_func);
static int* (CDECL *p_errno)(void);
static char* (CDECL *p_asctime)(const struct tm *);
+static void (CDECL *p_exit)(int);
+static int (CDECL *p__crt_atexit)(void (CDECL*)(void));
static void test__initialize_onexit_table(void)
{
@@ -429,6 +431,8 @@ static BOOL init(void)
p___setusermatherr = (void*)GetProcAddress(module, "__setusermatherr");
p_errno = (void*)GetProcAddress(module, "_errno");
p_asctime = (void*)GetProcAddress(module, "asctime");
+ p__crt_atexit = (void*)GetProcAddress(module, "_crt_atexit");
+ p_exit = (void*)GetProcAddress(module, "exit");
return TRUE;
}
@@ -765,6 +769,70 @@ static void test_asctime(void)
ok(!strcmp(ret, "Thu Jan 1 00:00:00 1970\n"), "asctime returned %s\n", ret);
}
+static void test_exit(const char *argv0)
+{
+ HANDLE exit_event1, exit_event2;
+ PROCESS_INFORMATION proc;
+ STARTUPINFOA startup = {0};
+ char path[MAX_PATH];
+ DWORD ret;
+
+ exit_event1 = CreateEventA(NULL, FALSE, FALSE, "exit_event1");
+ exit_event2 = CreateEventA(NULL, FALSE, FALSE, "exit_event2");
+
+ sprintf(path, "%s misc exit", argv0);
+ startup.cb = sizeof(startup);
+ CreateProcessA(NULL, path, NULL, NULL, TRUE, 0, NULL, NULL, &startup, &proc);
+ winetest_wait_child_process(proc.hProcess);
+
+ ret = WaitForSingleObject(exit_event1, 0);
+ ok(ret == WAIT_OBJECT_0, "exit_event1 was not set (%x)\n", ret);
+
+ CloseHandle(exit_event1);
+ CloseHandle(exit_event2);
+}
+
+static void CDECL at_exit_func1(void)
+{
+ HANDLE exit_event1 = CreateEventA(NULL, FALSE, FALSE, "exit_event1");
+ HANDLE exit_event2 = CreateEventA(NULL, FALSE, FALSE, "exit_event2");
+ DWORD ret;
+
+ ok(exit_event1 != NULL, "CreateEvent failed: %d\n", GetLastError());
+ ok(exit_event2 != NULL, "CreateEvent failed: %d\n", GetLastError());
+
+ ret = WaitForSingleObject(exit_event2, 0);
+ ok(ret == WAIT_OBJECT_0, "exit_event2 was not set (%x)\n", ret);
+
+ SetEvent(exit_event1);
+ CloseHandle(exit_event1);
+ CloseHandle(exit_event2);
+}
+
+static void CDECL at_exit_func2(void)
+{
+ HANDLE exit_event1 = CreateEventA(NULL, FALSE, FALSE, "exit_event1");
+ HANDLE exit_event2 = CreateEventA(NULL, FALSE, FALSE, "exit_event2");
+ DWORD ret;
+
+ ok(exit_event1 != NULL, "CreateEvent failed: %d\n", GetLastError());
+ ok(exit_event2 != NULL, "CreateEvent failed: %d\n", GetLastError());
+
+ ret = WaitForSingleObject(exit_event1, 0);
+ ok(ret == WAIT_TIMEOUT, "exit_event1 should not be set (%x)\n", ret);
+
+ SetEvent(exit_event2);
+ CloseHandle(exit_event1);
+ CloseHandle(exit_event2);
+}
+
+static void test_call_exit(void)
+{
+ ok(!p__crt_atexit(at_exit_func1), "_crt_atexit failed\n");
+ ok(!p__crt_atexit(at_exit_func2), "_crt_atexit failed\n");
+ p_exit(0);
+}
+
START_TEST(misc)
{
int arg_c;
@@ -775,7 +843,10 @@ START_TEST(misc)
arg_c = winetest_get_mainargs(&arg_v);
if(arg_c == 3) {
- test__get_narrow_winmain_command_line(NULL);
+ if(!strcmp(arg_v[2], "cmd"))
+ test__get_narrow_winmain_command_line(NULL);
+ else if(!strcmp(arg_v[2], "exit"))
+ test_call_exit();
return;
}
@@ -791,4 +862,5 @@ START_TEST(misc)
test_isblank();
test_math_errors();
test_asctime();
+ test_exit(arg_v[0]);
}
--
2.17.1
June 17, 2018
Re: [PATCH] msvcrt: Use already existent oneexit_table functions for _onexit and _c_exit
by Marvin
Hi,
While running your changed tests on Windows, I think I found new failures.
Being a bot and all I'm not very good at pattern recognition, so I might be
wrong, but could you please double-check?
Full results can be found at
https://testbot.winehq.org/JobDetails.pl?Key=39191
Your paranoid android.
=== wvistau64 (32 bit misc) ===
misc.c:803: Test failed: exit_event2 was not set (102)
ucrtbase:misc has unaccounted for failure messages
ucrtbase:misc returned success despite having failures
=== wvistau64_zh_CN (32 bit misc) ===
misc.c:803: Test failed: exit_event2 was not set (102)
ucrtbase:misc has unaccounted for failure messages
ucrtbase:misc returned success despite having failures
=== wvistau64_fr (32 bit misc) ===
misc.c:803: Test failed: exit_event2 was not set (102)
ucrtbase:misc has unaccounted for failure messages
ucrtbase:misc returned success despite having failures
=== wvistau64_he (32 bit misc) ===
misc.c:803: Test failed: exit_event2 was not set (102)
ucrtbase:misc has unaccounted for failure messages
ucrtbase:misc returned success despite having failures
=== w7u (32 bit misc) ===
misc.c:803: Test failed: exit_event2 was not set (102)
ucrtbase:misc has unaccounted for failure messages
ucrtbase:misc returned success despite having failures
=== w1064 (32 bit misc) ===
misc.c:803: Test failed: exit_event2 was not set (102)
ucrtbase:misc has unaccounted for failure messages
ucrtbase:misc returned success despite having failures
=== wvistau64 (64 bit misc) ===
misc.c:803: Test failed: exit_event2 was not set (102)
ucrtbase:misc has unaccounted for failure messages
ucrtbase:misc returned success despite having failures
=== w1064 (64 bit misc) ===
misc.c:803: Test failed: exit_event2 was not set (102)
ucrtbase:misc has unaccounted for failure messages
ucrtbase:misc returned success despite having failures
June 17, 2018
[PATCH] msvcrt: Use already existent oneexit_table functions for _onexit and _c_exit
by Fabian Maurer
For that to work, MSVCRT__register_onexit_function and
MSVCRT__execute_onexit_table have to available all the time,
not only when _MSVCR_VER>=140
tests based on code by Piotr Caban
Signed-off-by: Fabian Maurer <dark.shadow4(a)web.de>
---
dlls/msvcrt/exit.c | 68 ++++++++++-------------------------
dlls/ucrtbase/tests/misc.c | 72 +++++++++++++++++++++++++++++++++++++-
2 files changed, 89 insertions(+), 51 deletions(-)
diff --git a/dlls/msvcrt/exit.c b/dlls/msvcrt/exit.c
index 7e1805569c..c90f7df953 100644
--- a/dlls/msvcrt/exit.c
+++ b/dlls/msvcrt/exit.c
@@ -25,13 +25,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(msvcrt);
-/* MT */
-#define LOCK_EXIT _mlock(_EXIT_LOCK1)
-#define UNLOCK_EXIT _munlock(_EXIT_LOCK1)
-
-static MSVCRT__onexit_t *MSVCRT_atexit_table = NULL;
-static int MSVCRT_atexit_table_size = 0;
-static int MSVCRT_atexit_registered = 0; /* Points to free slot */
static MSVCRT_purecall_handler purecall_handler = NULL;
typedef struct MSVCRT__onexit_table_t
@@ -41,6 +34,11 @@ typedef struct MSVCRT__onexit_table_t
MSVCRT__onexit_t *_end;
} MSVCRT__onexit_table_t;
+static MSVCRT__onexit_table_t MSVCRT_atexit_table;
+
+int CDECL MSVCRT__register_onexit_function(MSVCRT__onexit_table_t *table, MSVCRT__onexit_t func);
+int CDECL MSVCRT__execute_onexit_table(MSVCRT__onexit_table_t *table);
+
typedef void (__stdcall *_tls_callback_type)(void*,ULONG,void*);
static _tls_callback_type tls_atexit_callback;
@@ -65,17 +63,8 @@ void (*CDECL _aexit_rtn)(int) = MSVCRT__exit;
static void __MSVCRT__call_atexit(void)
{
/* Note: should only be called with the exit lock held */
- TRACE("%d atext functions to call\n", MSVCRT_atexit_registered);
if (tls_atexit_callback) tls_atexit_callback(NULL, DLL_PROCESS_DETACH, NULL);
- /* Last registered gets executed first */
- while (MSVCRT_atexit_registered > 0)
- {
- MSVCRT_atexit_registered--;
- TRACE("next is %p\n",MSVCRT_atexit_table[MSVCRT_atexit_registered]);
- if (MSVCRT_atexit_table[MSVCRT_atexit_registered])
- (*MSVCRT_atexit_table[MSVCRT_atexit_registered])();
- TRACE("returned\n");
- }
+ MSVCRT__execute_onexit_table(&MSVCRT_atexit_table);
}
/*********************************************************************
@@ -276,9 +265,7 @@ void CDECL MSVCRT__c_exit(void)
void CDECL MSVCRT__cexit(void)
{
TRACE("(void)\n");
- LOCK_EXIT;
__MSVCRT__call_atexit();
- UNLOCK_EXIT;
}
/*********************************************************************
@@ -291,26 +278,8 @@ MSVCRT__onexit_t CDECL MSVCRT__onexit(MSVCRT__onexit_t func)
if (!func)
return NULL;
- LOCK_EXIT;
- if (MSVCRT_atexit_registered > MSVCRT_atexit_table_size - 1)
- {
- MSVCRT__onexit_t *newtable;
- TRACE("expanding table\n");
- newtable = MSVCRT_calloc(MSVCRT_atexit_table_size + 32, sizeof(void *));
- if (!newtable)
- {
- TRACE("failed!\n");
- UNLOCK_EXIT;
- return NULL;
- }
- memcpy (newtable, MSVCRT_atexit_table, MSVCRT_atexit_table_size*sizeof(void *));
- MSVCRT_atexit_table_size += 32;
- MSVCRT_free (MSVCRT_atexit_table);
- MSVCRT_atexit_table = newtable;
- }
- MSVCRT_atexit_table[MSVCRT_atexit_registered] = func;
- MSVCRT_atexit_registered++;
- UNLOCK_EXIT;
+ MSVCRT__register_onexit_function(&MSVCRT_atexit_table, func);
+
return func;
}
@@ -359,6 +328,16 @@ int CDECL MSVCRT__crt_atexit(void (*func)(void))
return MSVCRT__onexit((MSVCRT__onexit_t)func) == (MSVCRT__onexit_t)func ? 0 : -1;
}
+/*********************************************************************
+ * _register_thread_local_exe_atexit_callback (UCRTBASE.@)
+ */
+void CDECL _register_thread_local_exe_atexit_callback(_tls_callback_type callback)
+{
+ TRACE("(%p)\n", callback);
+ tls_atexit_callback = callback;
+}
+
+#endif /* _MSVCR_VER>=140 */
/*********************************************************************
* _initialize_onexit_table (UCRTBASE.@)
@@ -457,17 +436,6 @@ int CDECL MSVCRT__execute_onexit_table(MSVCRT__onexit_table_t *table)
return 0;
}
-/*********************************************************************
- * _register_thread_local_exe_atexit_callback (UCRTBASE.@)
- */
-void CDECL _register_thread_local_exe_atexit_callback(_tls_callback_type callback)
-{
- TRACE("(%p)\n", callback);
- tls_atexit_callback = callback;
-}
-
-#endif /* _MSVCR_VER>=140 */
-
#if _MSVCR_VER>=71
/*********************************************************************
* _set_purecall_handler (MSVCR71.@)
diff --git a/dlls/ucrtbase/tests/misc.c b/dlls/ucrtbase/tests/misc.c
index 354fab1e94..de27daaed9 100644
--- a/dlls/ucrtbase/tests/misc.c
+++ b/dlls/ucrtbase/tests/misc.c
@@ -125,6 +125,8 @@ static int (CDECL *p_fesetround)(int);
static void (CDECL *p___setusermatherr)(MSVCRT_matherr_func);
static int* (CDECL *p_errno)(void);
static char* (CDECL *p_asctime)(const struct tm *);
+static void (CDECL *p_exit)(int);
+static int (CDECL *p__crt_atexit)(void (CDECL*)(void));
static void test__initialize_onexit_table(void)
{
@@ -429,6 +431,8 @@ static BOOL init(void)
p___setusermatherr = (void*)GetProcAddress(module, "__setusermatherr");
p_errno = (void*)GetProcAddress(module, "_errno");
p_asctime = (void*)GetProcAddress(module, "asctime");
+ p__crt_atexit = (void*)GetProcAddress(module, "_crt_atexit");
+ p_exit = (void*)GetProcAddress(module, "exit");
return TRUE;
}
@@ -765,6 +769,68 @@ static void test_asctime(void)
ok(!strcmp(ret, "Thu Jan 1 00:00:00 1970\n"), "asctime returned %s\n", ret);
}
+static void test_exit(const char *argv0)
+{
+ HANDLE exit_event1;
+ PROCESS_INFORMATION proc;
+ STARTUPINFOA startup = {0};
+ char path[MAX_PATH];
+ DWORD ret;
+
+ exit_event1 = CreateEventA(NULL, FALSE, FALSE, "exit_event1");
+
+ sprintf(path, "%s misc exit", argv0);
+ startup.cb = sizeof(startup);
+ CreateProcessA(NULL, path, NULL, NULL, TRUE, 0, NULL, NULL, &startup, &proc);
+ winetest_wait_child_process(proc.hProcess);
+
+ ret = WaitForSingleObject(exit_event1, 0);
+ ok(ret == WAIT_OBJECT_0, "exit_event1 was not set (%x)\n", ret);
+
+ CloseHandle(exit_event1);
+}
+
+static void CDECL at_exit_func1(void)
+{
+ HANDLE exit_event1 = CreateEventA(NULL, FALSE, FALSE, "exit_event1");
+ HANDLE exit_event2 = CreateEventA(NULL, FALSE, FALSE, "exit_event2");
+ DWORD ret;
+
+ ok(exit_event1 != NULL, "CreateEvent failed: %d\n", GetLastError());
+ ok(exit_event2 != NULL, "CreateEvent failed: %d\n", GetLastError());
+
+ ret = WaitForSingleObject(exit_event2, 0);
+ ok(ret == WAIT_OBJECT_0, "exit_event2 was not set (%x)\n", ret);
+
+ SetEvent(exit_event1);
+ CloseHandle(exit_event1);
+ CloseHandle(exit_event2);
+}
+
+static void CDECL at_exit_func2(void)
+{
+ HANDLE exit_event1 = CreateEventA(NULL, FALSE, FALSE, "exit_event1");
+ HANDLE exit_event2 = CreateEventA(NULL, FALSE, FALSE, "exit_event2");
+ DWORD ret;
+
+ ok(exit_event1 != NULL, "CreateEvent failed: %d\n", GetLastError());
+ ok(exit_event2 != NULL, "CreateEvent failed: %d\n", GetLastError());
+
+ ret = WaitForSingleObject(exit_event1, 0);
+ ok(ret == WAIT_TIMEOUT, "exit_event1 should not be set (%x)\n", ret);
+
+ SetEvent(exit_event2);
+ CloseHandle(exit_event1);
+ CloseHandle(exit_event2);
+}
+
+static void test_call_exit(void)
+{
+ ok(!p__crt_atexit(at_exit_func1), "_crt_atexit failed\n");
+ ok(!p__crt_atexit(at_exit_func2), "_crt_atexit failed\n");
+ p_exit(0);
+}
+
START_TEST(misc)
{
int arg_c;
@@ -775,7 +841,10 @@ START_TEST(misc)
arg_c = winetest_get_mainargs(&arg_v);
if(arg_c == 3) {
- test__get_narrow_winmain_command_line(NULL);
+ if(!strcmp(arg_v[2], "cmd"))
+ test__get_narrow_winmain_command_line(NULL);
+ else if(!strcmp(arg_v[2], "exit"))
+ test_call_exit();
return;
}
@@ -791,4 +860,5 @@ START_TEST(misc)
test_isblank();
test_math_errors();
test_asctime();
+ test_exit(arg_v[0]);
}
--
2.17.1
June 17, 2018
[PATCH] winetest: Increase maximum tag length.
by Zebediah Figura
This should hopefully make those failures surrounding newtb-wvistau64-zh-CN go away.
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
programs/winetest/winetest.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/programs/winetest/winetest.h b/programs/winetest/winetest.h
index e74f126..0446ad5 100644
--- a/programs/winetest/winetest.h
+++ b/programs/winetest/winetest.h
@@ -66,7 +66,7 @@ enum report_type {
R_QUIET
};
-#define MAXTAGLEN 20
+#define MAXTAGLEN 30
extern char *tag;
extern char *email;
extern BOOL aborting;
--
2.7.4
June 17, 2018
[PATCH v2 2/2] hnetcfg: Store the UNC path in INetFwAuthorizedApplication_put_ProcessImageFileName().
by Zebediah Figura
Fixes test failures when running from virtual drive.
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
v2: add some changes I forgot to commit...
dlls/hnetcfg/Makefile.in | 2 +-
dlls/hnetcfg/apps.c | 32 +++++++++++++++++++++++++++-----
dlls/hnetcfg/tests/Makefile.in | 2 +-
dlls/hnetcfg/tests/policy.c | 15 ++++++++++++++-
4 files changed, 43 insertions(+), 8 deletions(-)
diff --git a/dlls/hnetcfg/Makefile.in b/dlls/hnetcfg/Makefile.in
index 3744368..44c9cb5 100644
--- a/dlls/hnetcfg/Makefile.in
+++ b/dlls/hnetcfg/Makefile.in
@@ -1,5 +1,5 @@
MODULE = hnetcfg.dll
-IMPORTS = oleaut32 ole32 advapi32
+IMPORTS = oleaut32 ole32 advapi32 mpr
C_SRCS = \
apps.c \
diff --git a/dlls/hnetcfg/apps.c b/dlls/hnetcfg/apps.c
index fda714e..34ef108 100644
--- a/dlls/hnetcfg/apps.c
+++ b/dlls/hnetcfg/apps.c
@@ -29,6 +29,7 @@
#include "netfw.h"
#include "wine/debug.h"
+#include "wine/heap.h"
#include "wine/unicode.h"
#include "hnetcfg_private.h"
@@ -263,18 +264,39 @@ static HRESULT WINAPI fw_app_get_ProcessImageFileName(
}
static HRESULT WINAPI fw_app_put_ProcessImageFileName(
- INetFwAuthorizedApplication *iface,
- BSTR imageFileName )
+ INetFwAuthorizedApplication *iface, BSTR image )
{
fw_app *This = impl_from_INetFwAuthorizedApplication( iface );
+ UNIVERSAL_NAME_INFOW *info;
+ WCHAR *netpath;
+ DWORD res;
+ DWORD sz;
- FIXME("%p, %s\n", This, debugstr_w(imageFileName));
+ FIXME("%p, %s\n", This, debugstr_w(image));
- if (!imageFileName || !imageFileName[0])
+ if (!image || !image[0])
return E_INVALIDARG;
+ sz = 0;
+ res = WNetGetUniversalNameW(image, UNIVERSAL_NAME_INFO_LEVEL, NULL, &sz);
+ if (res == WN_MORE_DATA)
+ {
+ if (!(netpath = heap_alloc(sz)))
+ return E_OUTOFMEMORY;
+
+ info = (UNIVERSAL_NAME_INFOW *)&netpath;
+ res = WNetGetUniversalNameW(image, UNIVERSAL_NAME_INFO_LEVEL, &info, &sz);
+ if (res == NO_ERROR)
+ {
+ SysFreeString(This->filename);
+ This->filename = SysAllocString(info->lpUniversalName);
+ }
+ heap_free(netpath);
+ return HRESULT_FROM_WIN32(res);
+ }
+
SysFreeString( This->filename );
- This->filename = SysAllocString( imageFileName );
+ This->filename = SysAllocString(image);
return This->filename ? S_OK : E_OUTOFMEMORY;
}
diff --git a/dlls/hnetcfg/tests/Makefile.in b/dlls/hnetcfg/tests/Makefile.in
index 8315b4b..922370a 100644
--- a/dlls/hnetcfg/tests/Makefile.in
+++ b/dlls/hnetcfg/tests/Makefile.in
@@ -1,5 +1,5 @@
TESTDLL = hnetcfg.dll
-IMPORTS = ole32 uuid oleaut32 advapi32
+IMPORTS = ole32 uuid oleaut32 advapi32 mpr
C_SRCS = \
policy.c
diff --git a/dlls/hnetcfg/tests/policy.c b/dlls/hnetcfg/tests/policy.c
index 012bbcd..f2d1372 100644
--- a/dlls/hnetcfg/tests/policy.c
+++ b/dlls/hnetcfg/tests/policy.c
@@ -106,9 +106,12 @@ static void test_NetFwAuthorizedApplication(void)
{
INetFwAuthorizedApplication *app;
static WCHAR empty[] = {0};
+ UNIVERSAL_NAME_INFOW *info;
+ WCHAR netpath[MAX_PATH];
WCHAR image[MAX_PATH];
HRESULT hr;
BSTR bstr;
+ DWORD sz;
hr = CoCreateInstance(&CLSID_NetFwAuthorizedApplication, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
&IID_INetFwAuthorizedApplication, (void**)&app);
@@ -135,9 +138,19 @@ static void test_NetFwAuthorizedApplication(void)
ok(hr == S_OK, "got: %08x\n", hr);
SysFreeString(bstr);
+ info = (UNIVERSAL_NAME_INFOW *)&netpath;
+ sz = sizeof(netpath);
+ hr = WNetGetUniversalNameW(image, UNIVERSAL_NAME_INFO_LEVEL, &info, &sz);
+ if (hr != NO_ERROR)
+ {
+ info->lpUniversalName = netpath + sizeof(*info)/sizeof(WCHAR);
+ lstrcpyW(info->lpUniversalName, image);
+ }
+
hr = INetFwAuthorizedApplication_get_ProcessImageFileName(app, &bstr);
ok(hr == S_OK, "got: %08x\n", hr);
- ok(!lstrcmpiW(bstr,image), "got: %s\n", wine_dbgstr_w(bstr));
+ ok(!lstrcmpW(bstr,info->lpUniversalName), "expected %s, got %s\n",
+ wine_dbgstr_w(info->lpUniversalName), wine_dbgstr_w(bstr));
SysFreeString(bstr);
INetFwAuthorizedApplication_Release(app);
--
2.7.4
June 17, 2018
[PATCH v2 1/2] hnetcfg/tests: Fix BSTR usage in test_NetFwAuthorizedApplication().
by Zebediah Figura
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/hnetcfg/tests/policy.c | 52 ++++++++++++++++++++-------------------------
1 file changed, 23 insertions(+), 29 deletions(-)
diff --git a/dlls/hnetcfg/tests/policy.c b/dlls/hnetcfg/tests/policy.c
index 4ee19d8..012bbcd 100644
--- a/dlls/hnetcfg/tests/policy.c
+++ b/dlls/hnetcfg/tests/policy.c
@@ -105,48 +105,42 @@ static void test_interfaces(void)
static void test_NetFwAuthorizedApplication(void)
{
INetFwAuthorizedApplication *app;
+ static WCHAR empty[] = {0};
+ WCHAR image[MAX_PATH];
HRESULT hr;
+ BSTR bstr;
hr = CoCreateInstance(&CLSID_NetFwAuthorizedApplication, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
&IID_INetFwAuthorizedApplication, (void**)&app);
ok(hr == S_OK, "got: %08x\n", hr);
- if(hr == S_OK)
- {
- BSTR image = SysAllocStringLen( NULL, MAX_PATH );
- static WCHAR empty[] = {0};
- BSTR bstr;
- if (!GetModuleFileNameW( NULL, image, MAX_PATH ))
- {
- ok(0, "Failed to get filename\n");
- SysFreeString( image );
- return;
- }
+ hr = GetModuleFileNameW(NULL, image, sizeof(image));
+ ok(hr, "GetModuleFileName failed: %u\n", GetLastError());
- hr = INetFwAuthorizedApplication_get_ProcessImageFileName(app, NULL);
- ok(hr == E_POINTER, "got: %08x\n", hr);
+ hr = INetFwAuthorizedApplication_get_ProcessImageFileName(app, NULL);
+ ok(hr == E_POINTER, "got: %08x\n", hr);
- hr = INetFwAuthorizedApplication_get_ProcessImageFileName(app, &bstr);
- ok(hr == S_OK || hr == HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY), "got: %08x\n", hr);
- ok(!bstr, "got: %s\n", wine_dbgstr_w(bstr));
+ hr = INetFwAuthorizedApplication_get_ProcessImageFileName(app, &bstr);
+ ok(hr == S_OK || hr == HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY), "got: %08x\n", hr);
+ ok(!bstr, "got: %s\n", wine_dbgstr_w(bstr));
- hr = INetFwAuthorizedApplication_put_ProcessImageFileName(app, NULL);
- ok(hr == E_INVALIDARG || hr == HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND), "got: %08x\n", hr);
+ hr = INetFwAuthorizedApplication_put_ProcessImageFileName(app, NULL);
+ ok(hr == E_INVALIDARG || hr == HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND), "got: %08x\n", hr);
- hr = INetFwAuthorizedApplication_put_ProcessImageFileName(app, empty);
- ok(hr == E_INVALIDARG || hr == HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND), "got: %08x\n", hr);
+ hr = INetFwAuthorizedApplication_put_ProcessImageFileName(app, empty);
+ ok(hr == E_INVALIDARG || hr == HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND), "got: %08x\n", hr);
- hr = INetFwAuthorizedApplication_put_ProcessImageFileName(app, image);
- ok(hr == S_OK, "got: %08x\n", hr);
+ bstr = SysAllocString(image);
+ hr = INetFwAuthorizedApplication_put_ProcessImageFileName(app, bstr);
+ ok(hr == S_OK, "got: %08x\n", hr);
+ SysFreeString(bstr);
- hr = INetFwAuthorizedApplication_get_ProcessImageFileName(app, &bstr);
- ok(hr == S_OK, "got: %08x\n", hr);
- ok(!lstrcmpiW(bstr,image), "got: %s\n", wine_dbgstr_w(bstr));
- SysFreeString( bstr );
+ hr = INetFwAuthorizedApplication_get_ProcessImageFileName(app, &bstr);
+ ok(hr == S_OK, "got: %08x\n", hr);
+ ok(!lstrcmpiW(bstr,image), "got: %s\n", wine_dbgstr_w(bstr));
+ SysFreeString(bstr);
- SysFreeString( image );
- INetFwAuthorizedApplication_Release(app);
- }
+ INetFwAuthorizedApplication_Release(app);
}
START_TEST(policy)
--
2.7.4
June 17, 2018
[PATCH] ntdll: Add stub for WinSqmSetDWORD
by Fabian Maurer
This is an undocumented win7 function appearently used to telemetry.
It's used by some native win7 dlls.
Signed-off-by: Fabian Maurer <dark.shadow4(a)web.de>
---
dlls/ntdll/misc.c | 10 ++++++++++
dlls/ntdll/ntdll.spec | 1 +
2 files changed, 11 insertions(+)
diff --git a/dlls/ntdll/misc.c b/dlls/ntdll/misc.c
index 88e8b33324..85000ab225 100644
--- a/dlls/ntdll/misc.c
+++ b/dlls/ntdll/misc.c
@@ -484,3 +484,13 @@ void WINAPI DbgUiRemoteBreakin( void *arg )
{
FIXME("stub\n");
}
+
+/***********************************************************************
+ * WinSqmSetDWORD (NTDLL.@)
+ *
+ * SQM seems to be used for telemetry
+ */
+void WINAPI WinSqmSetDWORD(HANDLE session, DWORD datapoint_id, DWORD datapoint_value)
+{
+ FIXME("(%p, %d, %d): stub\n", session, datapoint_id, datapoint_value);
+}
diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec
index fb505e2208..1c366649e0 100644
--- a/dlls/ntdll/ntdll.spec
+++ b/dlls/ntdll/ntdll.spec
@@ -1032,6 +1032,7 @@
@ stdcall -ret64 VerSetConditionMask(int64 long long)
@ stdcall WinSqmEndSession(long)
@ stdcall WinSqmIsOptedIn()
+@ stdcall WinSqmSetDWORD(ptr long long)
@ stdcall WinSqmStartSession(ptr long long)
@ stdcall -private ZwAcceptConnectPort(ptr long ptr long ptr ptr) NtAcceptConnectPort
@ stdcall -private ZwAccessCheck(ptr long long ptr ptr ptr ptr ptr) NtAccessCheck
--
2.17.1
June 17, 2018
[PATCH] ntdll: Add stub for RtlExpandEnvironmentStrings
by Fabian Maurer
This function is used by some native win7 dlls
Signed-off-by: Fabian Maurer <dark.shadow4(a)web.de>
---
dlls/ntdll/env.c | 8 ++++++++
dlls/ntdll/ntdll.spec | 1 +
2 files changed, 9 insertions(+)
diff --git a/dlls/ntdll/env.c b/dlls/ntdll/env.c
index a5bdf0f050..328ba79aaa 100644
--- a/dlls/ntdll/env.c
+++ b/dlls/ntdll/env.c
@@ -362,6 +362,14 @@ NTSTATUS WINAPI RtlExpandEnvironmentStrings_U(PCWSTR renv, const UNICODE_STRING*
return (count) ? STATUS_SUCCESS : STATUS_BUFFER_TOO_SMALL;
}
+/******************************************************************************
+ * RtlExpandEnvironmentStrings [NTDLL.@]
+ */
+NTSTATUS WINAPI RtlExpandEnvironmentStrings(PVOID environment, PWSTR src, SIZE_T src_length, PWSTR dst, SIZE_T dst_length, PSIZE_T return_length)
+{
+ FIXME("(%p, %p, %lu, %p, %lu, %p): stub\n", environment, src, src_length, dst, dst_length, return_length);
+ return STATUS_NOT_IMPLEMENTED;
+}
static inline void normalize( void *base, WCHAR **ptr )
{
diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec
index 45cedb74f5..fb505e2208 100644
--- a/dlls/ntdll/ntdll.spec
+++ b/dlls/ntdll/ntdll.spec
@@ -596,6 +596,7 @@
@ stdcall RtlEraseUnicodeString(ptr)
@ stdcall RtlExitUserProcess(long)
@ stdcall RtlExitUserThread(long)
+@ stdcall RtlExpandEnvironmentStrings(ptr ptr long ptr long ptr)
@ stdcall RtlExpandEnvironmentStrings_U(ptr ptr ptr ptr)
@ stub RtlExtendHeap
@ stdcall -arch=win32 -ret64 RtlExtendedIntegerMultiply(int64 long)
--
2.17.1
June 17, 2018
Re: [PATCH 2/2] msvcp120: Add test for Concurrent_vector_swap.
by Piotr Caban
Signed-off-by: Piotr Caban <piotr(a)codeweavers.com>
June 17, 2018
Re: [PATCH 1/2] msvcp120: Add test for Concurrent_vector_assign.
by Piotr Caban
Signed-off-by: Piotr Caban <piotr(a)codeweavers.com>
June 17, 2018
Re: [PATCH 2/2] msvcp120: Add test for Concurrent_vector_swap.
by Piotr Caban
Signed-off-by: Piotr Caban <piotr(a)codeweavers.com>
June 17, 2018
Re: [PATCH 1/2] msvcp120: Add test for Concurrent_vector_assign.
by Piotr Caban
Signed-off-by: Piotr Caban <piotr(a)codeweavers.com>
June 17, 2018
[PATCH 3/3] comctl32/taskdialog: Add support for command links.
by Zhiyi Zhang
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
---
dlls/comctl32/taskdialog.c | 62 +++++++++++++++++++++++++++++---
dlls/comctl32/tests/taskdialog.c | 61 +++++++++++++++++--------------
2 files changed, 93 insertions(+), 30 deletions(-)
diff --git a/dlls/comctl32/taskdialog.c b/dlls/comctl32/taskdialog.c
index c3c5fa0420..eb2f2a4082 100644
--- a/dlls/comctl32/taskdialog.c
+++ b/dlls/comctl32/taskdialog.c
@@ -60,6 +60,8 @@ struct taskdialog_info
HWND progress_bar;
HWND *radio_buttons;
INT radio_button_count;
+ HWND *command_links;
+ INT command_link_count;
HWND *buttons;
INT button_count;
HWND default_button;
@@ -184,7 +186,8 @@ static HWND taskdialog_find_button(HWND *buttons, INT count, INT id)
static void taskdialog_enable_button(const struct taskdialog_info *dialog_info, INT id, BOOL enable)
{
- HWND hwnd = taskdialog_find_button(dialog_info->buttons, dialog_info->button_count, id);
+ HWND hwnd = taskdialog_find_button(dialog_info->command_links, dialog_info->command_link_count, id);
+ if (!hwnd) hwnd = taskdialog_find_button(dialog_info->buttons, dialog_info->button_count, id);
if (hwnd) EnableWindow(hwnd, enable);
}
@@ -253,6 +256,11 @@ static BOOL taskdialog_hyperlink_enabled(struct taskdialog_info *dialog_info)
return dialog_info->taskconfig->dwFlags & TDF_ENABLE_HYPERLINKS;
}
+static BOOL taskdialog_use_command_link(struct taskdialog_info *dialog_info)
+{
+ return dialog_info->taskconfig->dwFlags & (TDF_USE_COMMAND_LINKS | TDF_USE_COMMAND_LINKS_NO_ICON);
+}
+
static void taskdialog_get_label_size(struct taskdialog_info *dialog_info, HWND hwnd, LONG max_width, SIZE *size,
BOOL syslink)
{
@@ -468,6 +476,34 @@ static void taskdialog_add_radio_buttons(struct taskdialog_info *dialog_info)
}
}
+static void taskdialog_add_command_links(struct taskdialog_info *dialog_info)
+{
+ const TASKDIALOGCONFIG *taskconfig = dialog_info->taskconfig;
+ DWORD default_style = BS_MULTILINE | BS_LEFT | BS_TOP | WS_CHILD | WS_VISIBLE | WS_TABSTOP, style;
+ BOOL is_default;
+ WCHAR *textW;
+ INT i;
+
+ if (!taskconfig->cButtons || !taskconfig->pButtons || !taskdialog_use_command_link(dialog_info)) return;
+
+ dialog_info->command_links = Alloc(taskconfig->cButtons * sizeof(*dialog_info->command_links));
+ if (!dialog_info->command_links) return;
+
+ dialog_info->command_link_count = taskconfig->cButtons;
+ for (i = 0; i < dialog_info->command_link_count; i++)
+ {
+ is_default = taskconfig->pButtons[i].nButtonID == taskconfig->nDefaultButton;
+ style = is_default ? default_style | BS_DEFCOMMANDLINK : default_style | BS_COMMANDLINK;
+ textW = taskdialog_gettext(dialog_info, TRUE, taskconfig->pButtons[i].pszButtonText);
+ dialog_info->command_links[i] = CreateWindowW(WC_BUTTONW, textW, style, 0, 0, 0, 0, dialog_info->hwnd,
+ (HMENU)taskconfig->pButtons[i].nButtonID, 0, NULL);
+ SendMessageW(dialog_info->command_links[i], WM_SETFONT, (WPARAM)dialog_info->font, 0);
+ Free(textW);
+
+ if (is_default && !dialog_info->default_button) dialog_info->default_button = dialog_info->command_links[i];
+ }
+}
+
static void taskdialog_add_button(struct taskdialog_info *dialog_info, HWND *button, INT_PTR id, const WCHAR *text,
BOOL custom_button)
{
@@ -486,17 +522,18 @@ static void taskdialog_add_button(struct taskdialog_info *dialog_info, HWND *but
static void taskdialog_add_buttons(struct taskdialog_info *dialog_info)
{
const TASKDIALOGCONFIG *taskconfig = dialog_info->taskconfig;
+ BOOL use_command_links = taskdialog_use_command_link(dialog_info);
DWORD flags = taskconfig->dwCommonButtons;
INT count, max_count;
/* Allocate enough memory for the custom and the default buttons. Maximum 6 default buttons possible. */
max_count = 6;
- if (taskconfig->cButtons && taskconfig->pButtons) max_count += taskconfig->cButtons;
+ if (!use_command_links && taskconfig->cButtons && taskconfig->pButtons) max_count += taskconfig->cButtons;
dialog_info->buttons = Alloc(max_count * sizeof(*dialog_info->buttons));
if (!dialog_info->buttons) return;
- for (count = 0; count < taskconfig->cButtons; count++)
+ for (count = 0; !use_command_links && count < taskconfig->cButtons; count++)
taskdialog_add_button(dialog_info, &dialog_info->buttons[count], taskconfig->pButtons[count].nButtonID,
taskconfig->pButtons[count].pszButtonText, TRUE);
@@ -514,7 +551,7 @@ static void taskdialog_add_buttons(struct taskdialog_info *dialog_info)
if (flags & TDCBF_CANCEL_BUTTON) TASKDIALOG_INIT_COMMON_BUTTON(CANCEL);
if (flags & TDCBF_CLOSE_BUTTON) TASKDIALOG_INIT_COMMON_BUTTON(CLOSE);
- if (!count) TASKDIALOG_INIT_COMMON_BUTTON(OK);
+ if (!count && !dialog_info->command_link_count) TASKDIALOG_INIT_COMMON_BUTTON(OK);
#undef TASKDIALOG_INIT_COMMON_BUTTON
dialog_info->button_count = count;
@@ -603,6 +640,19 @@ static void taskdialog_layout(struct taskdialog_info *dialog_info)
dialog_height = y + size.cy;
}
+ /* Command links */
+ for (i = 0; i < dialog_info->command_link_count; i++)
+ {
+ x = main_icon_right + h_spacing;
+ y = dialog_height + v_spacing;
+ taskdialog_get_label_size(dialog_info, dialog_info->command_links[i], dialog_width - x - h_spacing, &size, FALSE);
+ size.cx = dialog_width - x - h_spacing;
+ /* Add spacing */
+ size.cy += 4;
+ SetWindowPos(dialog_info->command_links[i], 0, x, y, size.cx, size.cy, SWP_NOZORDER);
+ dialog_height = y + size.cy;
+ }
+
dialog_height = max(dialog_height, main_icon_bottom);
/* Common and custom buttons */
@@ -738,9 +788,12 @@ static void taskdialog_init(struct taskdialog_info *dialog_info, HWND hwnd)
taskdialog_add_content(dialog_info);
taskdialog_add_progress_bar(dialog_info);
taskdialog_add_radio_buttons(dialog_info);
+ taskdialog_add_command_links(dialog_info);
taskdialog_add_buttons(dialog_info);
/* Set default button */
+ if (!dialog_info->default_button && dialog_info->command_links)
+ dialog_info->default_button = dialog_info->command_links[0];
if (!dialog_info->default_button) dialog_info->default_button = dialog_info->buttons[0];
SendMessageW(dialog_info->hwnd, WM_NEXTDLGCTL, (WPARAM)dialog_info->default_button, TRUE);
id = GetWindowLongW(dialog_info->default_button, GWLP_ID);
@@ -756,6 +809,7 @@ static void taskdialog_destroy(struct taskdialog_info *dialog_info)
if (dialog_info->main_instruction_font) DeleteObject(dialog_info->main_instruction_font);
if (dialog_info->buttons) Free(dialog_info->buttons);
if (dialog_info->radio_buttons) Free(dialog_info->radio_buttons);
+ if (dialog_info->command_links) Free(dialog_info->command_links);
}
static INT_PTR CALLBACK taskdialog_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
diff --git a/dlls/comctl32/tests/taskdialog.c b/dlls/comctl32/tests/taskdialog.c
index 2cda04081f..33d3757308 100644
--- a/dlls/comctl32/tests/taskdialog.c
+++ b/dlls/comctl32/tests/taskdialog.c
@@ -323,7 +323,7 @@ static void test_callback(void)
static void test_buttons(void)
{
TASKDIALOGCONFIG info = {0};
-
+ static const DWORD command_link_flags[] = {0, TDF_USE_COMMAND_LINKS, TDF_USE_COMMAND_LINKS_NO_ICON};
TASKDIALOG_BUTTON custom_buttons[TEST_NUM_BUTTONS], radio_buttons[TEST_NUM_RADIO_BUTTONS];
const WCHAR button_format[] = {'%','0','2','d',0};
/* Each button has two digits as title, plus null-terminator */
@@ -373,31 +373,40 @@ static void test_buttons(void)
info.dwCommonButtons = TDCBF_CANCEL_BUTTON | TDCBF_CLOSE_BUTTON;
run_test(&info, IDCANCEL, 0, msg_return_press_cancel, "default button: unset default");
- /* Test with all common and custom buttons and invalid default ID */
- info.nDefaultButton = 0xff; /* Random ID, should also default to first created button */
- info.cButtons = TEST_NUM_BUTTONS;
- info.pButtons = custom_buttons;
- run_test(&info, ID_START_BUTTON, 0, msg_return_press_custom1, "default button: invalid default, with common buttons - 1");
-
- info.nDefaultButton = -1; /* Should work despite button ID -1 */
- run_test(&info, -1, 0, msg_return_press_custom10, "default button: invalid default, with common buttons - 2");
-
- info.nDefaultButton = -2; /* Should also default to first created button */
- run_test(&info, ID_START_BUTTON, 0, msg_return_press_custom1, "default button: invalid default, with common buttons - 3");
-
- /* Test with only custom buttons and invalid default ID */
- info.dwCommonButtons = 0;
- run_test(&info, ID_START_BUTTON, 0, msg_return_press_custom1, "default button: invalid default, no common buttons");
-
- /* Test with common and custom buttons and valid default ID */
- info.dwCommonButtons = TDCBF_OK_BUTTON | TDCBF_YES_BUTTON | TDCBF_NO_BUTTON
- | TDCBF_CANCEL_BUTTON | TDCBF_RETRY_BUTTON | TDCBF_CLOSE_BUTTON;
- info.nDefaultButton = IDRETRY;
- run_test(&info, IDRETRY, 0, msg_return_press_retry, "default button: valid default - 1");
-
- /* Test with common and custom buttons and valid default ID */
- info.nDefaultButton = ID_START_BUTTON + 3;
- run_test(&info, ID_START_BUTTON + 3, 0, msg_return_press_custom4, "default button: valid default - 2");
+ /* Custom buttons could be command links */
+ for (i = 0; i < ARRAY_SIZE(command_link_flags); i++)
+ {
+ info.dwFlags = command_link_flags[i];
+
+ /* Test with all common and custom buttons and invalid default ID */
+ info.nDefaultButton = 0xff; /* Random ID, should also default to first created button */
+ info.cButtons = TEST_NUM_BUTTONS;
+ info.pButtons = custom_buttons;
+ run_test(&info, ID_START_BUTTON, 0, msg_return_press_custom1,
+ "default button: invalid default, with common buttons - 1");
+
+ info.nDefaultButton = -1; /* Should work despite button ID -1 */
+ run_test(&info, -1, 0, msg_return_press_custom10, "default button: invalid default, with common buttons - 2");
+
+ info.nDefaultButton = -2; /* Should also default to first created button */
+ run_test(&info, ID_START_BUTTON, 0, msg_return_press_custom1,
+ "default button: invalid default, with common buttons - 3");
+
+ /* Test with only custom buttons and invalid default ID */
+ info.dwCommonButtons = 0;
+ run_test(&info, ID_START_BUTTON, 0, msg_return_press_custom1,
+ "default button: invalid default, no common buttons");
+
+ /* Test with common and custom buttons and valid default ID */
+ info.dwCommonButtons = TDCBF_OK_BUTTON | TDCBF_YES_BUTTON | TDCBF_NO_BUTTON | TDCBF_CANCEL_BUTTON
+ | TDCBF_RETRY_BUTTON | TDCBF_CLOSE_BUTTON;
+ info.nDefaultButton = IDRETRY;
+ run_test(&info, IDRETRY, 0, msg_return_press_retry, "default button: valid default - 1");
+
+ /* Test with common and custom buttons and valid default ID */
+ info.nDefaultButton = ID_START_BUTTON + 3;
+ run_test(&info, ID_START_BUTTON + 3, 0, msg_return_press_custom4, "default button: valid default - 2");
+ }
/* Test radio buttons */
info.nDefaultButton = 0;
--
2.17.1
June 17, 2018
[PATCH 2/3] comctl32/taskdialog: Add support for radio buttons.
by Zhiyi Zhang
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
---
dlls/comctl32/taskdialog.c | 130 ++++++++++++++++++++++-
dlls/comctl32/tests/taskdialog.c | 172 +++++++++++++++++++++++++++----
2 files changed, 281 insertions(+), 21 deletions(-)
diff --git a/dlls/comctl32/taskdialog.c b/dlls/comctl32/taskdialog.c
index 33fb578910..c3c5fa0420 100644
--- a/dlls/comctl32/taskdialog.c
+++ b/dlls/comctl32/taskdialog.c
@@ -58,6 +58,8 @@ struct taskdialog_info
HWND main_instruction;
HWND content;
HWND progress_bar;
+ HWND *radio_buttons;
+ INT radio_button_count;
HWND *buttons;
INT button_count;
HWND default_button;
@@ -69,6 +71,7 @@ struct taskdialog_info
LONG h_spacing;
LONG v_spacing;
} m;
+ INT selected_radio_id;
};
struct button_layout_info
@@ -185,6 +188,18 @@ static void taskdialog_enable_button(const struct taskdialog_info *dialog_info,
if (hwnd) EnableWindow(hwnd, enable);
}
+static void taskdialog_enable_radio_button(const struct taskdialog_info *dialog_info, INT id, BOOL enable)
+{
+ HWND hwnd = taskdialog_find_button(dialog_info->radio_buttons, dialog_info->radio_button_count, id);
+ if (hwnd) EnableWindow(hwnd, enable);
+}
+
+static void taskdialog_click_radio_button(const struct taskdialog_info *dialog_info, INT id)
+{
+ HWND hwnd = taskdialog_find_button(dialog_info->radio_buttons, dialog_info->radio_button_count, id);
+ if (hwnd) SendMessageW(hwnd, BM_CLICK, 0, 0);
+}
+
static HRESULT taskdialog_notify(struct taskdialog_info *dialog_info, UINT notification, WPARAM wparam, LPARAM lparam)
{
const TASKDIALOGCONFIG *taskconfig = dialog_info->taskconfig;
@@ -193,8 +208,18 @@ static HRESULT taskdialog_notify(struct taskdialog_info *dialog_info, UINT notif
: S_OK;
}
-static void taskdialog_on_button_click(struct taskdialog_info *dialog_info, WORD command_id)
+static void taskdialog_on_button_click(struct taskdialog_info *dialog_info, unsigned long command_id)
{
+ HWND radio_button;
+
+ radio_button = taskdialog_find_button(dialog_info->radio_buttons, dialog_info->radio_button_count, command_id);
+ if (radio_button)
+ {
+ dialog_info->selected_radio_id = command_id;
+ taskdialog_notify(dialog_info, TDN_RADIO_BUTTON_CLICKED, command_id, 0);
+ return;
+ }
+
if (taskdialog_notify(dialog_info, TDN_BUTTON_CLICKED, command_id, 0) == S_OK)
EndDialog(dialog_info->hwnd, command_id);
}
@@ -260,6 +285,40 @@ static void taskdialog_get_label_size(struct taskdialog_info *dialog_info, HWND
ReleaseDC(hwnd, hdc);
}
+static void taskdialog_get_checkbox_height(struct taskdialog_info *dialog_info, HWND hwnd, LONG max_width, SIZE *size)
+{
+ DWORD style = DT_EXPANDTABS | DT_CALCRECT | DT_WORDBREAK;
+ HFONT hfont, old_hfont;
+ HDC hdc;
+ RECT rect = {0};
+ WCHAR text[1024];
+ INT text_length;
+ LONG text_offset, checkbox_width, checkbox_height;
+
+ hdc = GetDC(hwnd);
+ hfont = (HFONT)SendMessageW(hwnd, WM_GETFONT, 0, 0);
+ old_hfont = SelectObject(hdc, hfont);
+
+ checkbox_width = 12 * GetDeviceCaps(hdc, LOGPIXELSX) / 96 + 1;
+ checkbox_height = 12 * GetDeviceCaps(hdc, LOGPIXELSY) / 96 + 1;
+ GetCharWidthW(hdc, '0', '0', &text_offset);
+ text_offset /= 2;
+
+ if (dialog_info->taskconfig->dwFlags & TDF_RTL_LAYOUT)
+ style |= DT_RIGHT | DT_RTLREADING;
+ else
+ style |= DT_LEFT;
+
+ rect.right = max_width - checkbox_width - text_offset;
+ text_length = GetWindowTextW(hwnd, text, ARRAY_SIZE(text));
+ size->cy = DrawTextW(hdc, text, text_length, &rect, style);
+ size->cx = min(max_width - checkbox_width - text_offset, rect.right - rect.left);
+ size->cx += checkbox_width + text_offset;
+ size->cy = max(size->cy, checkbox_height);
+ if (old_hfont) SelectObject(hdc, old_hfont);
+ ReleaseDC(hwnd, hdc);
+}
+
static ULONG_PTR taskdialog_get_standard_icon(LPCWSTR icon)
{
if (icon == TD_WARNING_ICON)
@@ -300,6 +359,28 @@ static void taskdialog_set_icon(struct taskdialog_info *dialog_info, INT element
}
}
+static void taskdialog_check_default_radio_buttons(struct taskdialog_info *dialog_info)
+{
+ const TASKDIALOGCONFIG *taskconfig = dialog_info->taskconfig;
+ HWND default_button;
+ INT id;
+
+ if (!dialog_info->radio_button_count) return;
+
+ default_button = taskdialog_find_button(dialog_info->radio_buttons, dialog_info->radio_button_count,
+ taskconfig->nDefaultRadioButton);
+
+ if (!default_button && !(taskconfig->dwFlags & TDF_NO_DEFAULT_RADIO_BUTTON))
+ default_button = dialog_info->radio_buttons[0];
+
+ if (default_button)
+ {
+ SendMessageW(default_button, BM_SETCHECK, BST_CHECKED, 0);
+ id = GetWindowLongW(default_button, GWLP_ID);
+ taskdialog_on_button_click(dialog_info, id);
+ }
+}
+
static void taskdialog_add_main_icon(struct taskdialog_info *dialog_info)
{
if (!dialog_info->taskconfig->u.hMainIcon) return;
@@ -363,6 +444,30 @@ static void taskdialog_add_progress_bar(struct taskdialog_info *dialog_info)
CreateWindowW(PROGRESS_CLASSW, NULL, style, 0, 0, 0, 0, dialog_info->hwnd, NULL, 0, NULL);
}
+static void taskdialog_add_radio_buttons(struct taskdialog_info *dialog_info)
+{
+ const TASKDIALOGCONFIG *taskconfig = dialog_info->taskconfig;
+ static const DWORD style = BS_AUTORADIOBUTTON | BS_MULTILINE | BS_TOP | WS_CHILD | WS_VISIBLE | WS_TABSTOP;
+ WCHAR *textW;
+ INT i;
+
+ if (!taskconfig->cRadioButtons || !taskconfig->pRadioButtons) return;
+
+ dialog_info->radio_buttons = Alloc(taskconfig->cRadioButtons * sizeof(*dialog_info->radio_buttons));
+ if (!dialog_info->radio_buttons) return;
+
+ dialog_info->radio_button_count = taskconfig->cRadioButtons;
+ for (i = 0; i < dialog_info->radio_button_count; i++)
+ {
+ textW = taskdialog_gettext(dialog_info, TRUE, taskconfig->pRadioButtons[i].pszButtonText);
+ dialog_info->radio_buttons[i] =
+ CreateWindowW(WC_BUTTONW, textW, i == 0 ? style | WS_GROUP : style, 0, 0, 0, 0, dialog_info->hwnd,
+ (HMENU)taskconfig->pRadioButtons[i].nButtonID, 0, NULL);
+ SendMessageW(dialog_info->radio_buttons[i], WM_SETFONT, (WPARAM)dialog_info->font, 0);
+ Free(textW);
+ }
+}
+
static void taskdialog_add_button(struct taskdialog_info *dialog_info, HWND *button, INT_PTR id, const WCHAR *text,
BOOL custom_button)
{
@@ -487,6 +592,17 @@ static void taskdialog_layout(struct taskdialog_info *dialog_info)
dialog_height = y + size.cy;
}
+ /* Radio buttons */
+ for (i = 0; i < dialog_info->radio_button_count; i++)
+ {
+ x = main_icon_right + h_spacing;
+ y = dialog_height;
+ taskdialog_get_checkbox_height(dialog_info, dialog_info->radio_buttons[i], dialog_width - x - h_spacing, &size);
+ size.cx = dialog_width - x - h_spacing;
+ SetWindowPos(dialog_info->radio_buttons[i], 0, x, y, size.cx, size.cy, SWP_NOZORDER);
+ dialog_height = y + size.cy;
+ }
+
dialog_height = max(dialog_height, main_icon_bottom);
/* Common and custom buttons */
@@ -621,6 +737,7 @@ static void taskdialog_init(struct taskdialog_info *dialog_info, HWND hwnd)
taskdialog_add_main_instruction(dialog_info);
taskdialog_add_content(dialog_info);
taskdialog_add_progress_bar(dialog_info);
+ taskdialog_add_radio_buttons(dialog_info);
taskdialog_add_buttons(dialog_info);
/* Set default button */
@@ -638,6 +755,7 @@ static void taskdialog_destroy(struct taskdialog_info *dialog_info)
if (dialog_info->font) DeleteObject(dialog_info->font);
if (dialog_info->main_instruction_font) DeleteObject(dialog_info->main_instruction_font);
if (dialog_info->buttons) Free(dialog_info->buttons);
+ if (dialog_info->radio_buttons) Free(dialog_info->radio_buttons);
}
static INT_PTR CALLBACK taskdialog_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
@@ -689,6 +807,12 @@ static INT_PTR CALLBACK taskdialog_proc(HWND hwnd, UINT msg, WPARAM wParam, LPAR
case TDM_SET_PROGRESS_BAR_MARQUEE:
SendMessageW(dialog_info->progress_bar, PBM_SETMARQUEE, wParam, lParam);
break;
+ case TDM_CLICK_RADIO_BUTTON:
+ taskdialog_click_radio_button(dialog_info, wParam);
+ break;
+ case TDM_ENABLE_RADIO_BUTTON:
+ taskdialog_enable_radio_button(dialog_info, wParam, lParam);
+ break;
case WM_INITDIALOG:
dialog_info = (struct taskdialog_info *)lParam;
@@ -697,6 +821,8 @@ static INT_PTR CALLBACK taskdialog_proc(HWND hwnd, UINT msg, WPARAM wParam, LPAR
SetPropW(hwnd, taskdialog_info_propnameW, dialog_info);
taskdialog_notify(dialog_info, TDN_DIALOG_CONSTRUCTED, 0, 0);
taskdialog_notify(dialog_info, TDN_CREATED, 0, 0);
+ /* Default radio button click notification sent after TDN_CREATED */
+ taskdialog_check_default_radio_buttons(dialog_info);
return FALSE;
case WM_COMMAND:
if (HIWORD(wParam) == BN_CLICKED)
@@ -762,7 +888,7 @@ HRESULT WINAPI TaskDialogIndirect(const TASKDIALOGCONFIG *taskconfig, int *butto
Free(template);
if (button) *button = ret;
- if (radio_button) *radio_button = taskconfig->nDefaultButton;
+ if (radio_button) *radio_button = dialog_info.selected_radio_id;
if (verification_flag_checked) *verification_flag_checked = TRUE;
return S_OK;
diff --git a/dlls/comctl32/tests/taskdialog.c b/dlls/comctl32/tests/taskdialog.c
index e91a878876..2cda04081f 100644
--- a/dlls/comctl32/tests/taskdialog.c
+++ b/dlls/comctl32/tests/taskdialog.c
@@ -35,9 +35,11 @@
#define TASKDIALOG_SEQ_INDEX 0
#define TEST_NUM_BUTTONS 10 /* Number of custom buttons to test with */
+#define TEST_NUM_RADIO_BUTTONS 3
#define ID_START 20 /* Lower IDs might be used by the system */
#define ID_START_BUTTON (ID_START + 0)
+#define ID_START_RADIO_BUTTON (ID_START + 20)
static HRESULT (WINAPI *pTaskDialogIndirect)(const TASKDIALOGCONFIG *, int *, int *, BOOL *);
static HRESULT (WINAPI *pTaskDialog)(HWND, HINSTANCE, const WCHAR *, const WCHAR *, const WCHAR *,
@@ -141,6 +143,78 @@ static const struct message_info msg_got_tdn_help[] =
{ 0 }
};
+/* Three radio buttons */
+static const struct message_info msg_return_default_radio_button_1[] =
+{
+ { TDN_CREATED, 0, 0, S_OK, NULL },
+ { TDN_RADIO_BUTTON_CLICKED, ID_START_RADIO_BUTTON, 0, S_OK, msg_send_click_ok },
+ { TDN_BUTTON_CLICKED, IDOK, 0, S_OK, NULL },
+ { 0 }
+};
+
+static const struct message_info msg_return_default_radio_button_2[] =
+{
+ { TDN_CREATED, 0, 0, S_OK, NULL },
+ { TDN_RADIO_BUTTON_CLICKED, ID_START_RADIO_BUTTON + 1, 0, S_OK, msg_send_click_ok },
+ { TDN_BUTTON_CLICKED, IDOK, 0, S_OK, NULL },
+ { 0 }
+};
+
+static const struct message_info msg_return_default_radio_button_3[] =
+{
+ { TDN_CREATED, 0, 0, S_OK, NULL },
+ { TDN_RADIO_BUTTON_CLICKED, -2, 0, S_OK, msg_send_click_ok },
+ { TDN_BUTTON_CLICKED, IDOK, 0, S_OK, NULL },
+ { 0 }
+};
+
+static const struct message_info msg_select_first_radio_button[] =
+{
+ { TDM_CLICK_RADIO_BUTTON, ID_START_RADIO_BUTTON, 0 },
+ { 0 }
+};
+
+static const struct message_info msg_return_first_radio_button[] =
+{
+ { TDN_CREATED, 0, 0, S_OK, NULL },
+ { TDN_RADIO_BUTTON_CLICKED, ID_START_RADIO_BUTTON + 1, 0, S_OK, msg_select_first_radio_button },
+ { TDN_RADIO_BUTTON_CLICKED, ID_START_RADIO_BUTTON, 0, S_OK, msg_send_click_ok },
+ { TDN_BUTTON_CLICKED, IDOK, 0, S_OK, NULL },
+ { 0 }
+};
+
+static const struct message_info msg_select_first_disabled_radio_button_and_press_ok[] =
+{
+ { TDM_ENABLE_RADIO_BUTTON, ID_START_RADIO_BUTTON, 0 },
+ { TDM_CLICK_RADIO_BUTTON, ID_START_RADIO_BUTTON, 0 },
+ { TDM_CLICK_BUTTON, IDOK, 0 },
+ { 0 }
+};
+
+static const struct message_info msg_return_default_radio_button_clicking_disabled[] =
+{
+ { TDN_CREATED, 0, 0, S_OK, NULL },
+ { TDN_RADIO_BUTTON_CLICKED, ID_START_RADIO_BUTTON + 1, 0, S_OK, msg_select_first_disabled_radio_button_and_press_ok },
+ { TDN_RADIO_BUTTON_CLICKED, ID_START_RADIO_BUTTON, 0, S_OK, NULL },
+ { TDN_BUTTON_CLICKED, IDOK, 0, S_OK, NULL },
+ { 0 }
+};
+
+static const struct message_info msg_return_no_default_radio_button_flag[] =
+{
+ { TDN_CREATED, 0, 0, S_OK, msg_send_click_ok },
+ { TDN_RADIO_BUTTON_CLICKED, ID_START_RADIO_BUTTON, 0, S_OK, NULL },
+ { TDN_BUTTON_CLICKED, IDOK, 0, S_OK, NULL },
+ { 0 }
+};
+
+static const struct message_info msg_return_no_default_radio_button_id_and_flag[] =
+{
+ { TDN_CREATED, 0, 0, S_OK, msg_send_click_ok },
+ { TDN_BUTTON_CLICKED, IDOK, 0, S_OK, NULL },
+ { 0 }
+};
+
static void init_test_message(UINT message, WPARAM wParam, LPARAM lParam, struct message *msg)
{
msg->message = WM_TD_CALLBACK;
@@ -151,11 +225,13 @@ static void init_test_message(UINT message, WPARAM wParam, LPARAM lParam, struct
msg->stage = 0;
}
-#define run_test(info, expect_button, seq, context) \
- run_test_(info, expect_button, seq, context, ARRAY_SIZE(seq) - 1, __FILE__, __LINE__)
+#define run_test(info, expect_button, expect_radio_button, seq, context) \
+ run_test_(info, expect_button, expect_radio_button, seq, context, \
+ ARRAY_SIZE(seq) - 1, __FILE__, __LINE__)
-static void run_test_(TASKDIALOGCONFIG *info, int expect_button, const struct message_info *test_messages,
- const char *context, int test_messages_len, const char *file, int line)
+static void run_test_(TASKDIALOGCONFIG *info, int expect_button, int expect_radio_button,
+ const struct message_info *test_messages, const char *context, int test_messages_len,
+ const char *file, int line)
{
struct message *msg, *msg_start;
int ret_button = 0;
@@ -182,6 +258,8 @@ static void run_test_(TASKDIALOGCONFIG *info, int expect_button, const struct me
ok_sequence_(sequences, TASKDIALOG_SEQ_INDEX, msg_start, context, FALSE, file, line);
ok_(file, line)(ret_button == expect_button,
"Wrong button. Expected %d, got %d\n", expect_button, ret_button);
+ ok_(file, line)(ret_radio == expect_radio_button,
+ "Wrong radio button. Expected %d, got %d\n", expect_radio_button, ret_radio);
heap_free(msg_start);
}
@@ -239,16 +317,17 @@ static void test_callback(void)
info.pfCallback = taskdialog_callback_proc;
info.lpCallbackData = test_ref_data;
- run_test(&info, IDOK, msg_return_press_ok, "Press VK_RETURN.");
+ run_test(&info, IDOK, 0, msg_return_press_ok, "Press VK_RETURN.");
}
static void test_buttons(void)
{
TASKDIALOGCONFIG info = {0};
- TASKDIALOG_BUTTON custom_buttons[TEST_NUM_BUTTONS];
+ TASKDIALOG_BUTTON custom_buttons[TEST_NUM_BUTTONS], radio_buttons[TEST_NUM_RADIO_BUTTONS];
const WCHAR button_format[] = {'%','0','2','d',0};
- WCHAR button_titles[TEST_NUM_BUTTONS * 3]; /* Each button has two digits as title, plus null-terminator */
+ /* Each button has two digits as title, plus null-terminator */
+ WCHAR button_titles[TEST_NUM_BUTTONS * 3], radio_button_titles[TEST_NUM_BUTTONS * 3];
int i;
info.cbSize = sizeof(TASKDIALOGCONFIG);
@@ -266,48 +345,103 @@ static void test_buttons(void)
}
custom_buttons[TEST_NUM_BUTTONS - 1].nButtonID = -1;
+ /* Init radio buttons */
+ for (i = 0; i < TEST_NUM_RADIO_BUTTONS; i++)
+ {
+ WCHAR *text = &radio_button_titles[i * 3];
+ wsprintfW(text, button_format, i);
+
+ radio_buttons[i].pszButtonText = text;
+ radio_buttons[i].nButtonID = ID_START_RADIO_BUTTON + i;
+ }
+ radio_buttons[TEST_NUM_RADIO_BUTTONS - 1].nButtonID = -2;
+
/* Test nDefaultButton */
/* Test common buttons with invalid default ID */
info.nDefaultButton = 0; /* Should default to first created button */
info.dwCommonButtons = TDCBF_OK_BUTTON | TDCBF_YES_BUTTON | TDCBF_NO_BUTTON
| TDCBF_CANCEL_BUTTON | TDCBF_RETRY_BUTTON | TDCBF_CLOSE_BUTTON;
- run_test(&info, IDOK, msg_return_press_ok, "default button: unset default");
+ run_test(&info, IDOK, 0, msg_return_press_ok, "default button: unset default");
info.dwCommonButtons = TDCBF_YES_BUTTON | TDCBF_NO_BUTTON
| TDCBF_CANCEL_BUTTON | TDCBF_RETRY_BUTTON | TDCBF_CLOSE_BUTTON;
- run_test(&info, IDYES, msg_return_press_yes, "default button: unset default");
+ run_test(&info, IDYES, 0, msg_return_press_yes, "default button: unset default");
info.dwCommonButtons = TDCBF_NO_BUTTON | TDCBF_CANCEL_BUTTON | TDCBF_RETRY_BUTTON | TDCBF_CLOSE_BUTTON;
- run_test(&info, IDNO, msg_return_press_no, "default button: unset default");
+ run_test(&info, IDNO, 0, msg_return_press_no, "default button: unset default");
info.dwCommonButtons = TDCBF_CANCEL_BUTTON | TDCBF_RETRY_BUTTON | TDCBF_CLOSE_BUTTON;
- run_test(&info, IDRETRY, msg_return_press_retry, "default button: unset default");
+ run_test(&info, IDRETRY, 0, msg_return_press_retry, "default button: unset default");
info.dwCommonButtons = TDCBF_CANCEL_BUTTON | TDCBF_CLOSE_BUTTON;
- run_test(&info, IDCANCEL, msg_return_press_cancel, "default button: unset default");
+ run_test(&info, IDCANCEL, 0, msg_return_press_cancel, "default button: unset default");
/* Test with all common and custom buttons and invalid default ID */
info.nDefaultButton = 0xff; /* Random ID, should also default to first created button */
info.cButtons = TEST_NUM_BUTTONS;
info.pButtons = custom_buttons;
- run_test(&info, ID_START_BUTTON, msg_return_press_custom1, "default button: invalid default, with common buttons - 1");
+ run_test(&info, ID_START_BUTTON, 0, msg_return_press_custom1, "default button: invalid default, with common buttons - 1");
info.nDefaultButton = -1; /* Should work despite button ID -1 */
- run_test(&info, -1, msg_return_press_custom10, "default button: invalid default, with common buttons - 2");
+ run_test(&info, -1, 0, msg_return_press_custom10, "default button: invalid default, with common buttons - 2");
info.nDefaultButton = -2; /* Should also default to first created button */
- run_test(&info, ID_START_BUTTON, msg_return_press_custom1, "default button: invalid default, with common buttons - 3");
+ run_test(&info, ID_START_BUTTON, 0, msg_return_press_custom1, "default button: invalid default, with common buttons - 3");
/* Test with only custom buttons and invalid default ID */
info.dwCommonButtons = 0;
- run_test(&info, ID_START_BUTTON, msg_return_press_custom1, "default button: invalid default, no common buttons");
+ run_test(&info, ID_START_BUTTON, 0, msg_return_press_custom1, "default button: invalid default, no common buttons");
/* Test with common and custom buttons and valid default ID */
info.dwCommonButtons = TDCBF_OK_BUTTON | TDCBF_YES_BUTTON | TDCBF_NO_BUTTON
| TDCBF_CANCEL_BUTTON | TDCBF_RETRY_BUTTON | TDCBF_CLOSE_BUTTON;
info.nDefaultButton = IDRETRY;
- run_test(&info, IDRETRY, msg_return_press_retry, "default button: valid default - 1");
+ run_test(&info, IDRETRY, 0, msg_return_press_retry, "default button: valid default - 1");
/* Test with common and custom buttons and valid default ID */
info.nDefaultButton = ID_START_BUTTON + 3;
- run_test(&info, ID_START_BUTTON + 3, msg_return_press_custom4, "default button: valid default - 2");
+ run_test(&info, ID_START_BUTTON + 3, 0, msg_return_press_custom4, "default button: valid default - 2");
+
+ /* Test radio buttons */
+ info.nDefaultButton = 0;
+ info.cButtons = 0;
+ info.pButtons = 0;
+ info.dwCommonButtons = TDCBF_OK_BUTTON;
+ info.cRadioButtons = TEST_NUM_RADIO_BUTTONS;
+ info.pRadioButtons = radio_buttons;
+
+ /* Test default first radio button */
+ run_test(&info, IDOK, ID_START_RADIO_BUTTON, msg_return_default_radio_button_1, "default radio button: default first radio button");
+
+ /* Test default radio button */
+ info.nDefaultRadioButton = ID_START_RADIO_BUTTON + 1;
+ run_test(&info, IDOK, info.nDefaultRadioButton, msg_return_default_radio_button_2, "default radio button: default radio button");
+
+ /* Test default radio button with -2 */
+ info.nDefaultRadioButton = -2;
+ run_test(&info, IDOK, info.nDefaultRadioButton, msg_return_default_radio_button_3, "default radio button: default radio button with id -2");
+
+ /* Test default radio button after clicking the first, messages still work even radio button is disabled */
+ info.nDefaultRadioButton = ID_START_RADIO_BUTTON + 1;
+ run_test(&info, IDOK, ID_START_RADIO_BUTTON, msg_return_first_radio_button, "default radio button: radio button after clicking");
+
+ /* Test radio button after disabling and clicking the first */
+ info.nDefaultRadioButton = ID_START_RADIO_BUTTON + 1;
+ run_test(&info, IDOK, ID_START_RADIO_BUTTON, msg_return_default_radio_button_clicking_disabled, "default radio button: disable radio button before clicking");
+
+ /* Test no default radio button, TDF_NO_DEFAULT_RADIO_BUTTON is set, TDN_RADIO_BUTTON_CLICKED will still be received, just radio button not selected */
+ info.nDefaultRadioButton = ID_START_RADIO_BUTTON;
+ info.dwFlags = TDF_NO_DEFAULT_RADIO_BUTTON;
+ run_test(&info, IDOK, info.nDefaultRadioButton, msg_return_no_default_radio_button_flag, "default radio button: no default radio flag");
+
+ /* Test no default radio button, TDF_NO_DEFAULT_RADIO_BUTTON is set and nDefaultRadioButton is 0.
+ * TDN_RADIO_BUTTON_CLICKED will not be sent, and just radio button not selected */
+ info.nDefaultRadioButton = 0;
+ info.dwFlags = TDF_NO_DEFAULT_RADIO_BUTTON;
+ run_test(&info, IDOK, 0, msg_return_no_default_radio_button_id_and_flag, "default radio button: no default radio id and flag");
+
+ /* Test no default radio button, TDF_NO_DEFAULT_RADIO_BUTTON is set and nDefaultRadioButton is invalid.
+ * TDN_RADIO_BUTTON_CLICKED will not be sent, and just radio button not selected */
+ info.nDefaultRadioButton = 0xff;
+ info.dwFlags = TDF_NO_DEFAULT_RADIO_BUTTON;
+ run_test(&info, IDOK, 0, msg_return_no_default_radio_button_id_and_flag, "default radio button: no default flag, invalid id");
}
static void test_help(void)
@@ -319,7 +453,7 @@ static void test_help(void)
info.lpCallbackData = test_ref_data;
info.dwCommonButtons = TDCBF_OK_BUTTON;
- run_test(&info, IDOK, msg_got_tdn_help, "send f1");
+ run_test(&info, IDOK, 0, msg_got_tdn_help, "send f1");
}
struct timer_notification_data
--
2.17.1
June 17, 2018
[PATCH 1/3] comctl32/taskdialog: Fix buttons might disappear.
by Zhiyi Zhang
In the old button layout algorithm, line count is added
before adding button. This cause line count buffer
overflow when the first button is very long.
This patch modify the algorithm to add button first before
adjusting line count.
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
---
dlls/comctl32/taskdialog.c | 11 +++++------
1 file changed, 5 insertions(+), 6 deletions(-)
diff --git a/dlls/comctl32/taskdialog.c b/dlls/comctl32/taskdialog.c
index 1a5fad1609..33fb578910 100644
--- a/dlls/comctl32/taskdialog.c
+++ b/dlls/comctl32/taskdialog.c
@@ -506,16 +506,15 @@ static void taskdialog_layout(struct taskdialog_info *dialog_info)
x = h_spacing;
for (i = 0, line_count = 0; i < dialog_info->button_count; i++)
{
- if (x + button_layout_infos[i].width + h_spacing >= dialog_width)
+ button_layout_infos[i].line = line_count;
+ x += button_layout_infos[i].width + h_spacing;
+ line_widths[line_count] += button_layout_infos[i].width + h_spacing;
+
+ if ((i + 1 < dialog_info->button_count) && (x + button_layout_infos[i + 1].width + h_spacing >= dialog_width))
{
x = h_spacing;
line_count++;
}
-
- button_layout_infos[i].line = line_count;
-
- x += button_layout_infos[i].width + h_spacing;
- line_widths[line_count] += button_layout_infos[i].width + h_spacing;
}
line_count++;
--
2.17.1
June 17, 2018
[PATCH 2/2] msvcp120: Add test for Concurrent_vector_swap.
by Hua Meng
Signed-off-by: Hua meng <161220092(a)smail.nju.edu.cn>
---
dlls/msvcp120/tests/msvcp120.c | 41 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 41 insertions(+)
diff --git a/dlls/msvcp120/tests/msvcp120.c b/dlls/msvcp120/tests/msvcp120.c
index 895ab36..aec66fb 100644
--- a/dlls/msvcp120/tests/msvcp120.c
+++ b/dlls/msvcp120/tests/msvcp120.c
@@ -402,6 +402,8 @@ static void (__thiscall *p_vector_base_v4__Internal_copy)(
static void (__thiscall *p_vector_base_v4__Internal_assign)(
vector_base_v4*, vector_base_v4*, size_t, void (__cdecl*)(void*, size_t),
void (__cdecl*)(void*, const void*, size_t), void (__cdecl*)(void*, const void*, size_t));
+static void (__thiscall *p_vector_base_v4__Internal_swap)(
+ vector_base_v4*, const vector_base_v4*);
static HMODULE msvcp;
#define SETNOFAIL(x,y) x = (void*)GetProcAddress(msvcp,y)
@@ -548,6 +550,8 @@ static BOOL init(void)
"?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAXPEBX1@Z(a)Z");
SET(p_vector_base_v4__Internal_assign,
"?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAX1@ZP6AX2PEBX1(a)Z5@Z");
+ SET(p_vector_base_v4__Internal_swap,
+ "?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEAV123@@Z");
} else {
SET(p_tr2_sys__File_size,
"?_File_size(a)sys@tr2(a)std@@YA_KPBD(a)Z");
@@ -663,6 +667,8 @@ static BOOL init(void)
"?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXPBXI@Z(a)Z");
SET(p_vector_base_v4__Internal_assign,
"?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXI@ZP6AX1PBXI(a)Z4@Z");
+ SET(p_vector_base_v4__Internal_swap,
+ "?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXAAV123@@Z");
#else
SET(p__Thrd_current,
"_Thrd_current");
@@ -706,6 +712,8 @@ static BOOL init(void)
"?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXABV123(a)IP6AXPAXPBXI@Z(a)Z");
SET(p_vector_base_v4__Internal_assign,
"?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXABV123(a)IP6AXPAXI@ZP6AX1PBXI(a)Z4@Z");
+ SET(p_vector_base_v4__Internal_swap,
+ "?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXAAV123@@Z");
#endif
}
SET(p__Thrd_equal,
@@ -2851,6 +2859,39 @@ static void test_vector_base_v4(void)
CHECK_CALLED(concurrent_vector_int_destroy);
concurrent_vector_int_dtor(&v2);
+ concurrent_vector_int_ctor(&v2);
+ SET_EXPECT(concurrent_vector_int_alloc);
+ data = call_func3(p_vector_base_v4__Internal_push_back, &v2, sizeof(int), &idx);
+ ok(data != NULL, "_Internal_push_back returned NULL\n");
+ data = call_func3(p_vector_base_v4__Internal_push_back, &v2, sizeof(int), &idx);
+ ok(data != NULL, "_Internal_push_back returned NULL\n");
+ CHECK_CALLED(concurrent_vector_int_alloc);
+ SET_EXPECT(concurrent_vector_int_alloc);
+ data = call_func3(p_vector_base_v4__Internal_push_back, &v2, sizeof(int), &idx);
+ ok(data != NULL, "_Internal_push_back returned NULL\n");
+ CHECK_CALLED(concurrent_vector_int_alloc);
+ vector_elem_count += 3;
+ ok(idx == 2, "idx got %ld expected 2\n", (long)idx);
+ call_func2(p_vector_base_v4__Internal_swap,
+ &v2, &vector);
+ ok(v2.first_block == 1, "v2.first_block got %ld expected 1\n",
+ (long)v2.first_block);
+ ok(v2.early_size == 5, "v2.early_size got %ld expected 5\n",
+ (long)v2.early_size);
+ ok(vector.early_size == 3, "vector.early_size got %ld expected 3\n",
+ (long)vector.early_size);
+ call_func2(p_vector_base_v4__Internal_swap,
+ &v2, &vector);
+ ok(v2.early_size == 3, "v2.early_size got %ld expected 3\n",
+ (long)v2.early_size);
+ ok(vector.early_size == 5, "vector.early_size got %ld expected 5\n",
+ (long)vector.early_size);
+ SET_EXPECT(concurrent_vector_int_destroy);
+ size = (size_t)call_func2(p_vector_base_v4__Internal_clear,
+ &v2, concurrent_vector_int_destroy);
+ CHECK_CALLED(concurrent_vector_int_destroy);
+ concurrent_vector_int_dtor(&v2);
+
SET_EXPECT(concurrent_vector_int_destroy);
size = (size_t)call_func2(p_vector_base_v4__Internal_clear,
&vector, concurrent_vector_int_destroy);
--
2.11.0
June 17, 2018
[PATCH 1/2] msvcp120: Add test for Concurrent_vector_assign.
by Hua Meng
Signed-off-by: Hua meng <161220092(a)smail.nju.edu.cn>
---
dlls/msvcp120/tests/msvcp120.c | 56 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 56 insertions(+)
diff --git a/dlls/msvcp120/tests/msvcp120.c b/dlls/msvcp120/tests/msvcp120.c
index c34bd65..895ab36 100644
--- a/dlls/msvcp120/tests/msvcp120.c
+++ b/dlls/msvcp120/tests/msvcp120.c
@@ -40,6 +40,7 @@ struct expect_struct {
DEFINE_EXPECT(concurrent_vector_int_alloc);
DEFINE_EXPECT(concurrent_vector_int_destroy);
DEFINE_EXPECT(concurrent_vector_int_copy);
+ DEFINE_EXPECT(concurrent_vector_int_assign);
};
#define SET_EXPECT(func) \
@@ -114,6 +115,8 @@ static void * (WINAPI *call_thiscall_func3)( void *func, void *this, const void
const void *b );
static void * (WINAPI *call_thiscall_func4)( void *func, void *this, const void *a,
const void *b, const void *c );
+static void * (WINAPI *call_thiscall_func6)( void *func, void *this, const void *a,
+ const void *b, const void *c, const void *d, const void *e );
static void init_thiscall_thunk(void)
{
@@ -128,6 +131,7 @@ static void init_thiscall_thunk(void)
call_thiscall_func2 = (void *)thunk;
call_thiscall_func3 = (void *)thunk;
call_thiscall_func4 = (void *)thunk;
+ call_thiscall_func6 = (void *)thunk;
}
#define call_func1(func,_this) call_thiscall_func1(func,_this)
@@ -136,6 +140,8 @@ static void init_thiscall_thunk(void)
(const void*)(b))
#define call_func4(func,_this,a,b,c) call_thiscall_func4(func,_this,(const void*)(a),\
(const void*)(b),(const void*)(c))
+#define call_func6(func,_this,a,b,c,d,e) call_thiscall_func6(func,_this,(const void*)(a),\
+ (const void*)(b),(const void*)(c),(const void*)(d),(const void*)(e))
#else
#define init_thiscall_thunk()
@@ -143,6 +149,7 @@ static void init_thiscall_thunk(void)
#define call_func2(func,_this,a) func(_this,a)
#define call_func3(func,_this,a,b) func(_this,a,b)
#define call_func4(func,_this,a,b,c) func(_this,a,b,c)
+#define call_func6(func,_this,a,b,c,d,e) func(_this,a,b,c,d,e)
#endif /* __i386__ */
static inline float __port_infinity(void)
@@ -392,6 +399,9 @@ static size_t (__thiscall *p_vector_base_v4__Internal_clear)(
vector_base_v4*, void (__cdecl*)(void*, size_t));
static void (__thiscall *p_vector_base_v4__Internal_copy)(
vector_base_v4*, vector_base_v4*, size_t, void (__cdecl*)(void*, const void*, size_t));
+static void (__thiscall *p_vector_base_v4__Internal_assign)(
+ vector_base_v4*, vector_base_v4*, size_t, void (__cdecl*)(void*, size_t),
+ void (__cdecl*)(void*, const void*, size_t), void (__cdecl*)(void*, const void*, size_t));
static HMODULE msvcp;
#define SETNOFAIL(x,y) x = (void*)GetProcAddress(msvcp,y)
@@ -536,6 +546,8 @@ static BOOL init(void)
"?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_KP6AXPEAX_K(a)Z@Z");
SET(p_vector_base_v4__Internal_copy,
"?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAXPEBX1@Z(a)Z");
+ SET(p_vector_base_v4__Internal_assign,
+ "?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAX1@ZP6AX2PEBX1(a)Z5@Z");
} else {
SET(p_tr2_sys__File_size,
"?_File_size(a)sys@tr2(a)std@@YA_KPBD(a)Z");
@@ -649,6 +661,8 @@ static BOOL init(void)
"?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIP6AXPAXI(a)Z@Z");
SET(p_vector_base_v4__Internal_copy,
"?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXPBXI@Z(a)Z");
+ SET(p_vector_base_v4__Internal_assign,
+ "?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXI@ZP6AX1PBXI(a)Z4@Z");
#else
SET(p__Thrd_current,
"_Thrd_current");
@@ -690,6 +704,8 @@ static BOOL init(void)
"?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAIP6AXPAXI(a)Z@Z");
SET(p_vector_base_v4__Internal_copy,
"?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXABV123(a)IP6AXPAXPBXI@Z(a)Z");
+ SET(p_vector_base_v4__Internal_assign,
+ "?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXABV123(a)IP6AXPAXI@ZP6AX1PBXI(a)Z4@Z");
#endif
}
SET(p__Thrd_equal,
@@ -2509,6 +2525,12 @@ static void __cdecl concurrent_vector_int_copy(void *dst, const void *src, size_
memcpy(dst, src, n*sizeof(int));
}
+static void __cdecl concurrent_vector_int_assign(void *dst, const void *src, size_t n)
+{
+ CHECK_EXPECT2(concurrent_vector_int_assign);
+ memcpy(dst, src, n*sizeof(int));
+}
+
static void test_queue_base_v4(void)
{
queue_base_v4 queue;
@@ -2793,6 +2815,40 @@ static void test_vector_base_v4(void)
SET_EXPECT(concurrent_vector_int_destroy);
size = (size_t)call_func2(p_vector_base_v4__Internal_clear,
&v2, concurrent_vector_int_destroy);
+ CHECK_CALLED(concurrent_vector_int_destroy);
+ concurrent_vector_int_dtor(&v2);
+
+ concurrent_vector_int_ctor(&v2);
+ SET_EXPECT(concurrent_vector_int_alloc);
+ data = call_func3(p_vector_base_v4__Internal_push_back, &v2, sizeof(int), &idx);
+ CHECK_CALLED(concurrent_vector_int_alloc);
+ ok(data != NULL, "_Internal_push_back returned NULL\n");
+ data = call_func3(p_vector_base_v4__Internal_push_back, &v2, sizeof(int), &idx);
+ ok(data != NULL, "_Internal_push_back returned NULL\n");
+ SET_EXPECT(concurrent_vector_int_alloc);
+ data = call_func3(p_vector_base_v4__Internal_push_back, &v2, sizeof(int), &idx);
+ ok(data != NULL, "_Internal_push_back returned NULL\n");
+ CHECK_CALLED(concurrent_vector_int_alloc);
+ vector_elem_count += 3;
+ ok(idx == 2, "idx got %ld expected 2\n", (long)idx);
+ SET_EXPECT(concurrent_vector_int_assign);
+ SET_EXPECT(concurrent_vector_int_copy);
+ SET_EXPECT(concurrent_vector_int_alloc);
+ call_func6(p_vector_base_v4__Internal_assign, &v2, &vector, sizeof(int),
+ concurrent_vector_int_destroy, concurrent_vector_int_assign,
+ concurrent_vector_int_copy);
+ CHECK_CALLED(concurrent_vector_int_assign);
+ CHECK_CALLED(concurrent_vector_int_copy);
+ CHECK_CALLED(concurrent_vector_int_alloc);
+ ok(v2.first_block == 1, "v2.first_block got %ld expected 1\n",
+ (long)v2.first_block);
+ ok(v2.early_size == 5, "v2.early_size got %ld expected 5\n",
+ (long)v2.early_size);
+
+ SET_EXPECT(concurrent_vector_int_destroy);
+ size = (size_t)call_func2(p_vector_base_v4__Internal_clear,
+ &v2, concurrent_vector_int_destroy);
+ CHECK_CALLED(concurrent_vector_int_destroy);
concurrent_vector_int_dtor(&v2);
SET_EXPECT(concurrent_vector_int_destroy);
--
2.11.0
June 17, 2018
[PATCH v3] vbscript: Treat \r as a newline separator.
by Zebediah Figura
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
Sorry about the delay; seems this one got lost somehow.
dlls/vbscript/lex.c | 6 ++++--
dlls/vbscript/tests/run.c | 12 ++++++++++++
2 files changed, 16 insertions(+), 2 deletions(-)
diff --git a/dlls/vbscript/lex.c b/dlls/vbscript/lex.c
index 98b4cbb..b0fac48 100644
--- a/dlls/vbscript/lex.c
+++ b/dlls/vbscript/lex.c
@@ -383,13 +383,14 @@ static int parse_hex_literal(parser_ctx_t *ctx, LONG *ret)
static void skip_spaces(parser_ctx_t *ctx)
{
- while(*ctx->ptr == ' ' || *ctx->ptr == '\t' || *ctx->ptr == '\r')
+ while(*ctx->ptr == ' ' || *ctx->ptr == '\t')
ctx->ptr++;
}
static int comment_line(parser_ctx_t *ctx)
{
- ctx->ptr = strchrW(ctx->ptr, '\n');
+ static const WCHAR newlineW[] = {'\n','\r',0};
+ ctx->ptr = strpbrkW(ctx->ptr, newlineW);
if(ctx->ptr)
ctx->ptr++;
else
@@ -421,6 +422,7 @@ static int parse_next_token(void *lval, parser_ctx_t *ctx)
switch(c) {
case '\n':
+ case '\r':
ctx->ptr++;
return tNL;
case '\'':
diff --git a/dlls/vbscript/tests/run.c b/dlls/vbscript/tests/run.c
index 6b57540..191f5a7 100644
--- a/dlls/vbscript/tests/run.c
+++ b/dlls/vbscript/tests/run.c
@@ -2394,6 +2394,18 @@ static void run_tests(void)
ok(FAILED(hres), "script didn't fail\n");
todo_wine CHECK_CALLED(OnScriptError);
+ SET_EXPECT(global_success_d);
+ SET_EXPECT(global_success_i);
+ parse_script_a("' comment\r"
+ "Sub testsub(arg)\r"
+ "If arg = 1 Then\r\r"
+ "Call reportSuccess()\n\n"
+ "End If\r\n"
+ "End Sub\n\r"
+ "Call testsub(1)");
+ CHECK_CALLED(global_success_d);
+ CHECK_CALLED(global_success_i);
+
run_from_res("lang.vbs");
run_from_res("api.vbs");
run_from_res("regexp.vbs");
--
2.7.4
June 17, 2018
[PATCH 2/2] hnetcfg: Store the UNC path in INetFwAuthorizedApplication_put_ProcessImageFileName().
by Zebediah Figura
Fixes test failures when running from virtual drive.
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/hnetcfg/apps.c | 31 ++++++++++++++++++++++++++-----
dlls/hnetcfg/tests/Makefile.in | 2 +-
dlls/hnetcfg/tests/policy.c | 15 ++++++++++++++-
3 files changed, 41 insertions(+), 7 deletions(-)
diff --git a/dlls/hnetcfg/apps.c b/dlls/hnetcfg/apps.c
index fda714e..e3b6b36 100644
--- a/dlls/hnetcfg/apps.c
+++ b/dlls/hnetcfg/apps.c
@@ -263,18 +263,39 @@ static HRESULT WINAPI fw_app_get_ProcessImageFileName(
}
static HRESULT WINAPI fw_app_put_ProcessImageFileName(
- INetFwAuthorizedApplication *iface,
- BSTR imageFileName )
+ INetFwAuthorizedApplication *iface, BSTR image )
{
fw_app *This = impl_from_INetFwAuthorizedApplication( iface );
+ UNIVERSAL_NAME_INFOW *info;
+ WCHAR *netpath;
+ DWORD res;
+ DWORD sz;
- FIXME("%p, %s\n", This, debugstr_w(imageFileName));
+ FIXME("%p, %s\n", This, debugstr_w(image));
- if (!imageFileName || !imageFileName[0])
+ if (!image || !image[0])
return E_INVALIDARG;
+ sz = 0;
+ res = WNetGetUniversalNameW(image, UNIVERSAL_NAME_INFO_LEVEL, NULL, &sz);
+ if (res == WN_MORE_DATA)
+ {
+ if (!(netpath = heap_alloc(sz)))
+ return E_OUTOFMEMORY;
+
+ info = (UNIVERSAL_NAME_INFOW *)&netpath;
+ res = WNetGetUniversalNameW(image, UNIVERSAL_NAME_INFO_LEVEL, &info, &sz);
+ if (res == NO_ERROR)
+ {
+ SysFreeString(This->filename);
+ This->filename = SysAllocString(info->lpUniversalName);
+ }
+ heap_free(netpath);
+ return HRESULT_FROM_WIN32(res);
+ }
+
SysFreeString( This->filename );
- This->filename = SysAllocString( imageFileName );
+ This->filename = SysAllocString(image);
return This->filename ? S_OK : E_OUTOFMEMORY;
}
diff --git a/dlls/hnetcfg/tests/Makefile.in b/dlls/hnetcfg/tests/Makefile.in
index 8315b4b..922370a 100644
--- a/dlls/hnetcfg/tests/Makefile.in
+++ b/dlls/hnetcfg/tests/Makefile.in
@@ -1,5 +1,5 @@
TESTDLL = hnetcfg.dll
-IMPORTS = ole32 uuid oleaut32 advapi32
+IMPORTS = ole32 uuid oleaut32 advapi32 mpr
C_SRCS = \
policy.c
diff --git a/dlls/hnetcfg/tests/policy.c b/dlls/hnetcfg/tests/policy.c
index 012bbcd..f2d1372 100644
--- a/dlls/hnetcfg/tests/policy.c
+++ b/dlls/hnetcfg/tests/policy.c
@@ -106,9 +106,12 @@ static void test_NetFwAuthorizedApplication(void)
{
INetFwAuthorizedApplication *app;
static WCHAR empty[] = {0};
+ UNIVERSAL_NAME_INFOW *info;
+ WCHAR netpath[MAX_PATH];
WCHAR image[MAX_PATH];
HRESULT hr;
BSTR bstr;
+ DWORD sz;
hr = CoCreateInstance(&CLSID_NetFwAuthorizedApplication, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
&IID_INetFwAuthorizedApplication, (void**)&app);
@@ -135,9 +138,19 @@ static void test_NetFwAuthorizedApplication(void)
ok(hr == S_OK, "got: %08x\n", hr);
SysFreeString(bstr);
+ info = (UNIVERSAL_NAME_INFOW *)&netpath;
+ sz = sizeof(netpath);
+ hr = WNetGetUniversalNameW(image, UNIVERSAL_NAME_INFO_LEVEL, &info, &sz);
+ if (hr != NO_ERROR)
+ {
+ info->lpUniversalName = netpath + sizeof(*info)/sizeof(WCHAR);
+ lstrcpyW(info->lpUniversalName, image);
+ }
+
hr = INetFwAuthorizedApplication_get_ProcessImageFileName(app, &bstr);
ok(hr == S_OK, "got: %08x\n", hr);
- ok(!lstrcmpiW(bstr,image), "got: %s\n", wine_dbgstr_w(bstr));
+ ok(!lstrcmpW(bstr,info->lpUniversalName), "expected %s, got %s\n",
+ wine_dbgstr_w(info->lpUniversalName), wine_dbgstr_w(bstr));
SysFreeString(bstr);
INetFwAuthorizedApplication_Release(app);
--
2.7.4
June 16, 2018
[PATCH 1/2] hnetcfg/tests: Fix BSTR usage in test_NetFwAuthorizedApplication().
by Zebediah Figura
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/hnetcfg/tests/policy.c | 52 ++++++++++++++++++++-------------------------
1 file changed, 23 insertions(+), 29 deletions(-)
diff --git a/dlls/hnetcfg/tests/policy.c b/dlls/hnetcfg/tests/policy.c
index 4ee19d8..012bbcd 100644
--- a/dlls/hnetcfg/tests/policy.c
+++ b/dlls/hnetcfg/tests/policy.c
@@ -105,48 +105,42 @@ static void test_interfaces(void)
static void test_NetFwAuthorizedApplication(void)
{
INetFwAuthorizedApplication *app;
+ static WCHAR empty[] = {0};
+ WCHAR image[MAX_PATH];
HRESULT hr;
+ BSTR bstr;
hr = CoCreateInstance(&CLSID_NetFwAuthorizedApplication, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
&IID_INetFwAuthorizedApplication, (void**)&app);
ok(hr == S_OK, "got: %08x\n", hr);
- if(hr == S_OK)
- {
- BSTR image = SysAllocStringLen( NULL, MAX_PATH );
- static WCHAR empty[] = {0};
- BSTR bstr;
- if (!GetModuleFileNameW( NULL, image, MAX_PATH ))
- {
- ok(0, "Failed to get filename\n");
- SysFreeString( image );
- return;
- }
+ hr = GetModuleFileNameW(NULL, image, sizeof(image));
+ ok(hr, "GetModuleFileName failed: %u\n", GetLastError());
- hr = INetFwAuthorizedApplication_get_ProcessImageFileName(app, NULL);
- ok(hr == E_POINTER, "got: %08x\n", hr);
+ hr = INetFwAuthorizedApplication_get_ProcessImageFileName(app, NULL);
+ ok(hr == E_POINTER, "got: %08x\n", hr);
- hr = INetFwAuthorizedApplication_get_ProcessImageFileName(app, &bstr);
- ok(hr == S_OK || hr == HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY), "got: %08x\n", hr);
- ok(!bstr, "got: %s\n", wine_dbgstr_w(bstr));
+ hr = INetFwAuthorizedApplication_get_ProcessImageFileName(app, &bstr);
+ ok(hr == S_OK || hr == HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY), "got: %08x\n", hr);
+ ok(!bstr, "got: %s\n", wine_dbgstr_w(bstr));
- hr = INetFwAuthorizedApplication_put_ProcessImageFileName(app, NULL);
- ok(hr == E_INVALIDARG || hr == HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND), "got: %08x\n", hr);
+ hr = INetFwAuthorizedApplication_put_ProcessImageFileName(app, NULL);
+ ok(hr == E_INVALIDARG || hr == HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND), "got: %08x\n", hr);
- hr = INetFwAuthorizedApplication_put_ProcessImageFileName(app, empty);
- ok(hr == E_INVALIDARG || hr == HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND), "got: %08x\n", hr);
+ hr = INetFwAuthorizedApplication_put_ProcessImageFileName(app, empty);
+ ok(hr == E_INVALIDARG || hr == HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND), "got: %08x\n", hr);
- hr = INetFwAuthorizedApplication_put_ProcessImageFileName(app, image);
- ok(hr == S_OK, "got: %08x\n", hr);
+ bstr = SysAllocString(image);
+ hr = INetFwAuthorizedApplication_put_ProcessImageFileName(app, bstr);
+ ok(hr == S_OK, "got: %08x\n", hr);
+ SysFreeString(bstr);
- hr = INetFwAuthorizedApplication_get_ProcessImageFileName(app, &bstr);
- ok(hr == S_OK, "got: %08x\n", hr);
- ok(!lstrcmpiW(bstr,image), "got: %s\n", wine_dbgstr_w(bstr));
- SysFreeString( bstr );
+ hr = INetFwAuthorizedApplication_get_ProcessImageFileName(app, &bstr);
+ ok(hr == S_OK, "got: %08x\n", hr);
+ ok(!lstrcmpiW(bstr,image), "got: %s\n", wine_dbgstr_w(bstr));
+ SysFreeString(bstr);
- SysFreeString( image );
- INetFwAuthorizedApplication_Release(app);
- }
+ INetFwAuthorizedApplication_Release(app);
}
START_TEST(policy)
--
2.7.4
June 16, 2018
Re: [PATCH v5 3/8] kernel32/tests: Add GetSystemFirmwareTable tests
by Alex Henrie
On Fri, Jun 15, 2018 at 2:37 AM Huw Davies <huw(a)codeweavers.com> wrote:
>
> On Fri, Jun 15, 2018 at 12:59:09AM -0600, Alex Henrie wrote:
> > + sfti->ProviderSignature = RSMB;
> > + sfti->Action = SystemFirmwareTable_Get;
>
> You need to initialize TableID.
When querying the RSMB table, TableID is ignored. You get the same
results no matter what the table ID is. I'm adding a test that
demonstrates this.
I did, however, notice that some of the RSMB table values change over
time. So, I'm going to omit the test for NtQuerySystemInformation and
GetSystemFirmwareTable returning exactly the same data, and instead
just check that they both return the same amount of data.
If you'd like to look over my latest work before Monday, you can see
it at https://github.com/alexhenrie/wine/commits/master
Thanks for the help!
-Alex
June 16, 2018
[PATCH] comctl32/imagelist: fix ImageList_Read/Write.
by Denis Malikov
From: Denis Malikov <mdn40000(a)mail.ru>
Date: Sat, 16 Jun 2018 16:35:45 +0700
Subject: [PATCH] comctl32/imagelist: fix ImageList_Read/Write.
Fix for versions x600 and x620 and pointer calculation for mixing image and mask bits.
Tested on ReactOS 0.4.10 with *.reg files extracted from:
- XP/2003 key HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\TrayNotify;
- Vista/7 key HKEY_CLASSES_ROOT\Local Settings\Software\Microsoft\Windows\CurrentVersion\TrayNotify
Signed-off-by: Denis Malikov <mdn40000(a)mail.ru>
---
dlls/comctl32/imagelist.c | 59 +++++++++++++++++++++++++++--------------------
1 file changed, 34 insertions(+), 25 deletions(-)
diff --git a/dlls/comctl32/imagelist.c b/dlls/comctl32/imagelist.c
index a08d60752e..052d59f9e4 100644
--- a/dlls/comctl32/imagelist.c
+++ b/dlls/comctl32/imagelist.c
@@ -59,7 +59,7 @@ struct _IMAGELIST
INT cGrow; /* 0C: cGrow */
INT cx; /* 10: cx */
INT cy; /* 14: cy */
- DWORD x4;
+ DWORD x4; /* hack for IL from stream. Keep version here */
UINT flags; /* 1C: flags */
COLORREF clrFg; /* 20: foreground color */
COLORREF clrBk; /* 24: background color */
@@ -83,6 +83,7 @@ struct _IMAGELIST
};
#define IMAGELIST_MAGIC 0x53414D58
+#define IMAGELIST_VERSION 0x101
/* Header used by ImageList_Read() and ImageList_Write() */
#include "pshpack2.h"
@@ -806,6 +807,7 @@ ImageList_Create (INT cx, INT cy, UINT flags,
himl->clrFg = CLR_DEFAULT;
himl->clrBk = CLR_NONE;
himl->color_table_set = FALSE;
+ himl->x4 = 0;
/* initialize overlay mask indices */
for (nCount = 0; nCount < MAX_OVERLAYIMAGE; nCount++)
@@ -2257,38 +2259,43 @@ HIMAGELIST WINAPI ImageList_Read(IStream *pstm)
BITMAPINFO *image_info = (BITMAPINFO *)image_buf;
BITMAPINFO *mask_info = (BITMAPINFO *)mask_buf;
void *image_bits, *mask_bits = NULL;
- ILHEAD ilHead;
- HIMAGELIST himl;
+ ILHEAD ilHead;
+ HIMAGELIST himl;
unsigned int i;
TRACE("%p\n", pstm);
if (FAILED(IStream_Read (pstm, &ilHead, sizeof(ILHEAD), NULL)))
- return NULL;
+ return NULL;
if (ilHead.usMagic != (('L' << 8) | 'I'))
- return NULL;
- if (ilHead.usVersion != 0x101) /* probably version? */
- return NULL;
+ return NULL;
+ if (ilHead.usVersion != IMAGELIST_VERSION &&
+ ilHead.usVersion != 0x600 && /* XP/2003 version */
+ ilHead.usVersion != 0x620) /* Vista/7 version */
+ return NULL;
TRACE("cx %u, cy %u, flags 0x%04x, cCurImage %u, cMaxImage %u\n",
ilHead.cx, ilHead.cy, ilHead.flags, ilHead.cCurImage, ilHead.cMaxImage);
himl = ImageList_Create(ilHead.cx, ilHead.cy, ilHead.flags, ilHead.cCurImage, ilHead.cMaxImage);
if (!himl)
- return NULL;
+ return NULL;
+
+ // keep version from stream
+ himl->x4 = ilHead.usVersion;
if (!(image_bits = read_bitmap(pstm, image_info)))
{
- WARN("failed to read bitmap from stream\n");
- return NULL;
+ WARN("failed to read bitmap from stream\n");
+ return NULL;
}
if (ilHead.flags & ILC_MASK)
{
if (!(mask_bits = read_bitmap(pstm, mask_info)))
{
WARN("failed to read mask bitmap from stream\n");
- return NULL;
- }
+ return NULL;
+ }
}
else mask_info = NULL;
@@ -2296,23 +2303,25 @@ HIMAGELIST WINAPI ImageList_Read(IStream *pstm)
{
DWORD *ptr = image_bits;
BYTE *mask_ptr = mask_bits;
- int stride = himl->cy * image_info->bmiHeader.biWidth;
+ int stride = himl->cy * (ilHead.usVersion != IMAGELIST_VERSION ? himl->cx : image_info->bmiHeader.biWidth);
+ int image_step = ilHead.usVersion != IMAGELIST_VERSION ? 1 : TILE_COUNT;
+ int mask_step = ilHead.usVersion != IMAGELIST_VERSION ? 4 : 8;
if (image_info->bmiHeader.biHeight > 0) /* bottom-up */
{
ptr += image_info->bmiHeader.biHeight * image_info->bmiHeader.biWidth - stride;
- mask_ptr += (image_info->bmiHeader.biHeight * image_info->bmiHeader.biWidth - stride) / 8;
+ mask_ptr += (image_info->bmiHeader.biHeight * image_info->bmiHeader.biWidth - stride) / mask_step;
stride = -stride;
image_info->bmiHeader.biHeight = himl->cy;
}
else image_info->bmiHeader.biHeight = -himl->cy;
- for (i = 0; i < ilHead.cCurImage; i += TILE_COUNT)
+ for (i = 0; i < ilHead.cCurImage; i += image_step)
{
- add_dib_bits( himl, i, min( ilHead.cCurImage - i, TILE_COUNT ),
+ add_dib_bits( himl, i, min( ilHead.cCurImage - i, image_step ),
himl->cx, himl->cy, image_info, mask_info, ptr, mask_ptr );
ptr += stride;
- mask_ptr += stride / 8;
+ mask_ptr += stride / mask_step;
}
}
else
@@ -2333,7 +2342,7 @@ HIMAGELIST WINAPI ImageList_Read(IStream *pstm)
ImageList_SetBkColor(himl,ilHead.bkcolor);
for (i=0;i<4;i++)
- ImageList_SetOverlayImage(himl,ilHead.ovls[i],i+1);
+ ImageList_SetOverlayImage(himl,ilHead.ovls[i],i+1);
return himl;
}
@@ -3078,10 +3087,10 @@ BOOL WINAPI ImageList_Write(HIMAGELIST himl, IStream *pstm)
TRACE("%p %p\n", himl, pstm);
if (!is_valid(himl))
- return FALSE;
+ return FALSE;
ilHead.usMagic = (('L' << 8) | 'I');
- ilHead.usVersion = 0x101;
+ ilHead.usVersion = himl->x4 > 0 ? himl->x4 : IMAGELIST_VERSION;
ilHead.cCurImage = himl->cCurImage;
ilHead.cMaxImage = himl->cMaxImage;
ilHead.cGrow = himl->cGrow;
@@ -3090,23 +3099,23 @@ BOOL WINAPI ImageList_Write(HIMAGELIST himl, IStream *pstm)
ilHead.bkcolor = himl->clrBk;
ilHead.flags = himl->flags;
for(i = 0; i < 4; i++) {
- ilHead.ovls[i] = himl->nOvlIdx[i];
+ ilHead.ovls[i] = himl->nOvlIdx[i];
}
TRACE("cx %u, cy %u, flags 0x04%x, cCurImage %u, cMaxImage %u\n",
ilHead.cx, ilHead.cy, ilHead.flags, ilHead.cCurImage, ilHead.cMaxImage);
if(FAILED(IStream_Write(pstm, &ilHead, sizeof(ILHEAD), NULL)))
- return FALSE;
+ return FALSE;
/* write the bitmap */
if(!_write_bitmap(himl->hbmImage, pstm))
- return FALSE;
+ return FALSE;
/* write the mask if we have one */
if(himl->flags & ILC_MASK) {
- if(!_write_bitmap(himl->hbmMask, pstm))
- return FALSE;
+ if(!_write_bitmap(himl->hbmMask, pstm))
+ return FALSE;
}
return TRUE;
--
2.16.2.windows.1
June 16, 2018
Re: [PATCH] gdiplus: Check return value of SelectClipPath in brush_fill_path().
by Zhiyi Zhang
Thanks. I'll work on it as you suggest.
On Sat 6 16 23:26, Vincent Povirk wrote:
> If converting a path to a region fails for an open path, then our code
> in get_path_hrgn is also wrong. From reading gdi32 code, think it will
> work as long as there are points in the path, but the only way to be
> sure is to add a test.
>
> If we check for failure in SelectClipPath, I agree that we should not
> continue the operation for any error. I think we should report failure
> to the caller if it's an error we don't expect. That would also help
> explain why it's correct to silently ignore the failure.
>
> On Sat, Jun 16, 2018 at 9:31 AM, Zhiyi Zhang <zzhang(a)codeweavers.com> wrote:
>> Hi Vincent,
>>
>> Yes, we could check if a path is empty just like get_path_hrgn did.
>> I also worried that a not empty but open path will also make SelectClipPath()
>> fail. Is there any function to check if a path is closed? I couldn't found any.
>> As for SelectClipPath() last error, I don't think any further operation should
>> be continued if any error occurs.
>> So we add a check for empty path and also skip further operation if SelectClipPath()
>> returns any error. Is that enough?
>>
>> Thanks,
>> Zhiyi
>>
>> On Fri 6 15 23:55, Vincent Povirk wrote:
>>> It looks like we also encountered this case in get_path_hrgn. Maybe we
>>> shouldn't call brush_fill_pixels if the path is empty? If we're going
>>> to ignore errors, I think we should at least check GetLastError() to
>>> make sure it's one we expect.
>>>
>>> On Fri, Jun 15, 2018 at 4:04 AM, Zhiyi Zhang <zzhang(a)codeweavers.com> wrote:
>>>> For Crossover bug 16126.
>>>>
>>>> When GraphicPath is empty, filling path with gdi32 will
>>>> result in a DC with empty path. When SelectClipPath() is
>>>> called with such a DC, it will fail because it requires
>>>> a closed path in DC. Thus further operation should be canceled.
>>>>
>>>> Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
>>>> ---
>>>> dlls/gdiplus/graphics.c | 5 +++--
>>>> 1 file changed, 3 insertions(+), 2 deletions(-)
>>>>
>>>> diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c
>>>> index 76aabe74bf..2a95d686fa 100644
>>>> --- a/dlls/gdiplus/graphics.c
>>>> +++ b/dlls/gdiplus/graphics.c
>>>> @@ -1052,6 +1052,7 @@ static BOOL brush_can_fill_path(GpBrush *brush, BOOL is_fill)
>>>>
>>>> static void brush_fill_path(GpGraphics *graphics, GpBrush* brush)
>>>> {
>>>> + BOOL success;
>>>> switch (brush->bt)
>>>> {
>>>> case BrushTypeSolidColor:
>>>> @@ -1064,8 +1065,8 @@ static void brush_fill_path(GpGraphics *graphics, GpBrush* brush)
>>>> RECT rc;
>>>> /* partially transparent fill */
>>>>
>>>> - SelectClipPath(graphics->hdc, RGN_AND);
>>>> - if (GetClipBox(graphics->hdc, &rc) != NULLREGION)
>>>> + success = SelectClipPath(graphics->hdc, RGN_AND);
>>>> + if (success && GetClipBox(graphics->hdc, &rc) != NULLREGION)
>>>> {
>>>> HDC hdc = CreateCompatibleDC(NULL);
>>>>
>>>> --
>>>> 2.17.1
>>>>
>>>>
>>>>
>
>
June 16, 2018
Re: [PATCH] gdiplus: Check return value of SelectClipPath in brush_fill_path().
by Vincent Povirk
If converting a path to a region fails for an open path, then our code
in get_path_hrgn is also wrong. From reading gdi32 code, think it will
work as long as there are points in the path, but the only way to be
sure is to add a test.
If we check for failure in SelectClipPath, I agree that we should not
continue the operation for any error. I think we should report failure
to the caller if it's an error we don't expect. That would also help
explain why it's correct to silently ignore the failure.
On Sat, Jun 16, 2018 at 9:31 AM, Zhiyi Zhang <zzhang(a)codeweavers.com> wrote:
> Hi Vincent,
>
> Yes, we could check if a path is empty just like get_path_hrgn did.
> I also worried that a not empty but open path will also make SelectClipPath()
> fail. Is there any function to check if a path is closed? I couldn't found any.
> As for SelectClipPath() last error, I don't think any further operation should
> be continued if any error occurs.
> So we add a check for empty path and also skip further operation if SelectClipPath()
> returns any error. Is that enough?
>
> Thanks,
> Zhiyi
>
> On Fri 6 15 23:55, Vincent Povirk wrote:
>> It looks like we also encountered this case in get_path_hrgn. Maybe we
>> shouldn't call brush_fill_pixels if the path is empty? If we're going
>> to ignore errors, I think we should at least check GetLastError() to
>> make sure it's one we expect.
>>
>> On Fri, Jun 15, 2018 at 4:04 AM, Zhiyi Zhang <zzhang(a)codeweavers.com> wrote:
>>> For Crossover bug 16126.
>>>
>>> When GraphicPath is empty, filling path with gdi32 will
>>> result in a DC with empty path. When SelectClipPath() is
>>> called with such a DC, it will fail because it requires
>>> a closed path in DC. Thus further operation should be canceled.
>>>
>>> Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
>>> ---
>>> dlls/gdiplus/graphics.c | 5 +++--
>>> 1 file changed, 3 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c
>>> index 76aabe74bf..2a95d686fa 100644
>>> --- a/dlls/gdiplus/graphics.c
>>> +++ b/dlls/gdiplus/graphics.c
>>> @@ -1052,6 +1052,7 @@ static BOOL brush_can_fill_path(GpBrush *brush, BOOL is_fill)
>>>
>>> static void brush_fill_path(GpGraphics *graphics, GpBrush* brush)
>>> {
>>> + BOOL success;
>>> switch (brush->bt)
>>> {
>>> case BrushTypeSolidColor:
>>> @@ -1064,8 +1065,8 @@ static void brush_fill_path(GpGraphics *graphics, GpBrush* brush)
>>> RECT rc;
>>> /* partially transparent fill */
>>>
>>> - SelectClipPath(graphics->hdc, RGN_AND);
>>> - if (GetClipBox(graphics->hdc, &rc) != NULLREGION)
>>> + success = SelectClipPath(graphics->hdc, RGN_AND);
>>> + if (success && GetClipBox(graphics->hdc, &rc) != NULLREGION)
>>> {
>>> HDC hdc = CreateCompatibleDC(NULL);
>>>
>>> --
>>> 2.17.1
>>>
>>>
>>>
June 16, 2018
[PATCH] comctl32/imagelist: fix ImageList_Read/Write.
by Локтар Огар
From: Denis Malikov <mdn40000(a)mail.ru>
Date: Sat, 16 Jun 2018 16:35:45 +0700
Subject: [PATCH] comctl32/imagelist: fix ImageList_Read/Write.
Fix for versions x600 and x620 and pointer calculation for mixing
image and mask bits.
Tested on ReactOS 0.4.10 with *.reg files extracted from:
- XP/2003 key HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\TrayNotify;
- Vista/7 key HKEY_CLASSES_ROOT\Local
Settings\Software\Microsoft\Windows\CurrentVersion\TrayNotify
Signed-off-by: Denis Malikov <mdn40000(a)mail.ru>
---
dlls/comctl32/imagelist.c | 59 +++++++++++++++++++++++++++--------------------
1 file changed, 34 insertions(+), 25 deletions(-)
diff --git a/dlls/comctl32/imagelist.c b/dlls/comctl32/imagelist.c
index a08d60752e..052d59f9e4 100644
--- a/dlls/comctl32/imagelist.c
+++ b/dlls/comctl32/imagelist.c
@@ -59,7 +59,7 @@ struct _IMAGELIST
INT cGrow; /* 0C: cGrow */
INT cx; /* 10: cx */
INT cy; /* 14: cy */
- DWORD x4;
+ DWORD x4; /* hack for IL from
stream. Keep version here */
UINT flags; /* 1C: flags */
COLORREF clrFg; /* 20: foreground color */
COLORREF clrBk; /* 24: background color */
@@ -83,6 +83,7 @@ struct _IMAGELIST
};
#define IMAGELIST_MAGIC 0x53414D58
+#define IMAGELIST_VERSION 0x101
/* Header used by ImageList_Read() and ImageList_Write() */
#include "pshpack2.h"
@@ -806,6 +807,7 @@ ImageList_Create (INT cx, INT cy, UINT flags,
himl->clrFg = CLR_DEFAULT;
himl->clrBk = CLR_NONE;
himl->color_table_set = FALSE;
+ himl->x4 = 0;
/* initialize overlay mask indices */
for (nCount = 0; nCount < MAX_OVERLAYIMAGE; nCount++)
@@ -2257,38 +2259,43 @@ HIMAGELIST WINAPI ImageList_Read(IStream *pstm)
BITMAPINFO *image_info = (BITMAPINFO *)image_buf;
BITMAPINFO *mask_info = (BITMAPINFO *)mask_buf;
void *image_bits, *mask_bits = NULL;
- ILHEAD ilHead;
- HIMAGELIST himl;
+ ILHEAD ilHead;
+ HIMAGELIST himl;
unsigned int i;
TRACE("%p\n", pstm);
if (FAILED(IStream_Read (pstm, &ilHead, sizeof(ILHEAD), NULL)))
- return NULL;
+ return NULL;
if (ilHead.usMagic != (('L' << 8) | 'I'))
- return NULL;
- if (ilHead.usVersion != 0x101) /* probably version? */
- return NULL;
+ return NULL;
+ if (ilHead.usVersion != IMAGELIST_VERSION &&
+ ilHead.usVersion != 0x600 && /* XP/2003 version */
+ ilHead.usVersion != 0x620) /* Vista/7 version */
+ return NULL;
TRACE("cx %u, cy %u, flags 0x%04x, cCurImage %u, cMaxImage %u\n",
ilHead.cx, ilHead.cy, ilHead.flags, ilHead.cCurImage,
ilHead.cMaxImage);
himl = ImageList_Create(ilHead.cx, ilHead.cy, ilHead.flags,
ilHead.cCurImage, ilHead.cMaxImage);
if (!himl)
- return NULL;
+ return NULL;
+
+ // keep version from stream
+ himl->x4 = ilHead.usVersion;
if (!(image_bits = read_bitmap(pstm, image_info)))
{
- WARN("failed to read bitmap from stream\n");
- return NULL;
+ WARN("failed to read bitmap from stream\n");
+ return NULL;
}
if (ilHead.flags & ILC_MASK)
{
if (!(mask_bits = read_bitmap(pstm, mask_info)))
{
WARN("failed to read mask bitmap from stream\n");
- return NULL;
- }
+ return NULL;
+ }
}
else mask_info = NULL;
@@ -2296,23 +2303,25 @@ HIMAGELIST WINAPI ImageList_Read(IStream *pstm)
{
DWORD *ptr = image_bits;
BYTE *mask_ptr = mask_bits;
- int stride = himl->cy * image_info->bmiHeader.biWidth;
+ int stride = himl->cy * (ilHead.usVersion !=
IMAGELIST_VERSION ? himl->cx : image_info->bmiHeader.biWidth);
+ int image_step = ilHead.usVersion != IMAGELIST_VERSION ? 1 :
TILE_COUNT;
+ int mask_step = ilHead.usVersion != IMAGELIST_VERSION ? 4 : 8;
if (image_info->bmiHeader.biHeight > 0) /* bottom-up */
{
ptr += image_info->bmiHeader.biHeight *
image_info->bmiHeader.biWidth - stride;
- mask_ptr += (image_info->bmiHeader.biHeight *
image_info->bmiHeader.biWidth - stride) / 8;
+ mask_ptr += (image_info->bmiHeader.biHeight *
image_info->bmiHeader.biWidth - stride) / mask_step;
stride = -stride;
image_info->bmiHeader.biHeight = himl->cy;
}
else image_info->bmiHeader.biHeight = -himl->cy;
- for (i = 0; i < ilHead.cCurImage; i += TILE_COUNT)
+ for (i = 0; i < ilHead.cCurImage; i += image_step)
{
- add_dib_bits( himl, i, min( ilHead.cCurImage - i, TILE_COUNT ),
+ add_dib_bits( himl, i, min( ilHead.cCurImage - i, image_step ),
himl->cx, himl->cy, image_info, mask_info,
ptr, mask_ptr );
ptr += stride;
- mask_ptr += stride / 8;
+ mask_ptr += stride / mask_step;
}
}
else
@@ -2333,7 +2342,7 @@ HIMAGELIST WINAPI ImageList_Read(IStream *pstm)
ImageList_SetBkColor(himl,ilHead.bkcolor);
for (i=0;i<4;i++)
- ImageList_SetOverlayImage(himl,ilHead.ovls[i],i+1);
+ ImageList_SetOverlayImage(himl,ilHead.ovls[i],i+1);
return himl;
}
@@ -3078,10 +3087,10 @@ BOOL WINAPI ImageList_Write(HIMAGELIST himl,
IStream *pstm)
TRACE("%p %p\n", himl, pstm);
if (!is_valid(himl))
- return FALSE;
+ return FALSE;
ilHead.usMagic = (('L' << 8) | 'I');
- ilHead.usVersion = 0x101;
+ ilHead.usVersion = himl->x4 > 0 ? himl->x4 : IMAGELIST_VERSION;
ilHead.cCurImage = himl->cCurImage;
ilHead.cMaxImage = himl->cMaxImage;
ilHead.cGrow = himl->cGrow;
@@ -3090,23 +3099,23 @@ BOOL WINAPI ImageList_Write(HIMAGELIST himl,
IStream *pstm)
ilHead.bkcolor = himl->clrBk;
ilHead.flags = himl->flags;
for(i = 0; i < 4; i++) {
- ilHead.ovls[i] = himl->nOvlIdx[i];
+ ilHead.ovls[i] = himl->nOvlIdx[i];
}
TRACE("cx %u, cy %u, flags 0x04%x, cCurImage %u, cMaxImage %u\n",
ilHead.cx, ilHead.cy, ilHead.flags, ilHead.cCurImage,
ilHead.cMaxImage);
if(FAILED(IStream_Write(pstm, &ilHead, sizeof(ILHEAD), NULL)))
- return FALSE;
+ return FALSE;
/* write the bitmap */
if(!_write_bitmap(himl->hbmImage, pstm))
- return FALSE;
+ return FALSE;
/* write the mask if we have one */
if(himl->flags & ILC_MASK) {
- if(!_write_bitmap(himl->hbmMask, pstm))
- return FALSE;
+ if(!_write_bitmap(himl->hbmMask, pstm))
+ return FALSE;
}
return TRUE;
--
2.16.2.windows.1
June 16, 2018
Re: [PATCH] gdiplus: Check return value of SelectClipPath in brush_fill_path().
by Zhiyi Zhang
Hi Vincent,
Yes, we could check if a path is empty just like get_path_hrgn did.
I also worried that a not empty but open path will also make SelectClipPath()
fail. Is there any function to check if a path is closed? I couldn't found any.
As for SelectClipPath() last error, I don't think any further operation should
be continued if any error occurs.
So we add a check for empty path and also skip further operation if SelectClipPath()
returns any error. Is that enough?
Thanks,
Zhiyi
On Fri 6 15 23:55, Vincent Povirk wrote:
> It looks like we also encountered this case in get_path_hrgn. Maybe we
> shouldn't call brush_fill_pixels if the path is empty? If we're going
> to ignore errors, I think we should at least check GetLastError() to
> make sure it's one we expect.
>
> On Fri, Jun 15, 2018 at 4:04 AM, Zhiyi Zhang <zzhang(a)codeweavers.com> wrote:
>> For Crossover bug 16126.
>>
>> When GraphicPath is empty, filling path with gdi32 will
>> result in a DC with empty path. When SelectClipPath() is
>> called with such a DC, it will fail because it requires
>> a closed path in DC. Thus further operation should be canceled.
>>
>> Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
>> ---
>> dlls/gdiplus/graphics.c | 5 +++--
>> 1 file changed, 3 insertions(+), 2 deletions(-)
>>
>> diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c
>> index 76aabe74bf..2a95d686fa 100644
>> --- a/dlls/gdiplus/graphics.c
>> +++ b/dlls/gdiplus/graphics.c
>> @@ -1052,6 +1052,7 @@ static BOOL brush_can_fill_path(GpBrush *brush, BOOL is_fill)
>>
>> static void brush_fill_path(GpGraphics *graphics, GpBrush* brush)
>> {
>> + BOOL success;
>> switch (brush->bt)
>> {
>> case BrushTypeSolidColor:
>> @@ -1064,8 +1065,8 @@ static void brush_fill_path(GpGraphics *graphics, GpBrush* brush)
>> RECT rc;
>> /* partially transparent fill */
>>
>> - SelectClipPath(graphics->hdc, RGN_AND);
>> - if (GetClipBox(graphics->hdc, &rc) != NULLREGION)
>> + success = SelectClipPath(graphics->hdc, RGN_AND);
>> + if (success && GetClipBox(graphics->hdc, &rc) != NULLREGION)
>> {
>> HDC hdc = CreateCompatibleDC(NULL);
>>
>> --
>> 2.17.1
>>
>>
>>
June 16, 2018
[PATCH] comctl32/imagelist: fix ImageList_Read/Write.
by Денис Маликов
From: Denis Malikov <mdn40000(a)mail.ru>
Date: Sat, 16 Jun 2018 16:35:45 +0700
Subject: [PATCH] comctl32/imagelist: fix ImageList_Read/Write.
Fixed acceptable version and pointer calculation for mixing image and mask bits.
Tested on ReactOS 0.4.10 with *.reg files extracted from XP/2003 key HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\TrayNotify
Signed-off-by: Denis Malikov <mdn40000(a)mail.ru>
---
dlls/comctl32/imagelist.c | 48 +++++++++++++++++++++++------------------------
1 file changed, 24 insertions(+), 24 deletions(-)
diff --git a/dlls/comctl32/imagelist.c b/dlls/comctl32/imagelist.c
index a08d60752e..f0f8a695fe 100644
--- a/dlls/comctl32/imagelist.c
+++ b/dlls/comctl32/imagelist.c
@@ -2257,38 +2257,38 @@ HIMAGELIST WINAPI ImageList_Read(IStream *pstm)
BITMAPINFO *image_info = (BITMAPINFO *)image_buf;
BITMAPINFO *mask_info = (BITMAPINFO *)mask_buf;
void *image_bits, *mask_bits = NULL;
- ILHEAD ilHead;
- HIMAGELIST himl;
+ ILHEAD ilHead;
+ HIMAGELIST himl;
unsigned int i;
TRACE("%p\n", pstm);
if (FAILED(IStream_Read (pstm, &ilHead, sizeof(ILHEAD), NULL)))
- return NULL;
+ return NULL;
if (ilHead.usMagic != (('L' << 8) | 'I'))
- return NULL;
- if (ilHead.usVersion != 0x101) /* probably version? */
- return NULL;
+ return NULL;
+ if (ilHead.usVersion != 0x600) /* XP/2003 version */
+ return NULL;
TRACE("cx %u, cy %u, flags 0x%04x, cCurImage %u, cMaxImage %u\n",
ilHead.cx, ilHead.cy, ilHead.flags, ilHead.cCurImage, ilHead.cMaxImage);
himl = ImageList_Create(ilHead.cx, ilHead.cy, ilHead.flags, ilHead.cCurImage, ilHead.cMaxImage);
if (!himl)
- return NULL;
+ return NULL;
if (!(image_bits = read_bitmap(pstm, image_info)))
{
- WARN("failed to read bitmap from stream\n");
- return NULL;
+ WARN("failed to read bitmap from stream\n");
+ return NULL;
}
if (ilHead.flags & ILC_MASK)
{
if (!(mask_bits = read_bitmap(pstm, mask_info)))
{
WARN("failed to read mask bitmap from stream\n");
- return NULL;
- }
+ return NULL;
+ }
}
else mask_info = NULL;
@@ -2296,23 +2296,23 @@ HIMAGELIST WINAPI ImageList_Read(IStream *pstm)
{
DWORD *ptr = image_bits;
BYTE *mask_ptr = mask_bits;
- int stride = himl->cy * image_info->bmiHeader.biWidth;
+ int stride = himl->cy * himl->cx;
if (image_info->bmiHeader.biHeight > 0) /* bottom-up */
{
ptr += image_info->bmiHeader.biHeight * image_info->bmiHeader.biWidth - stride;
- mask_ptr += (image_info->bmiHeader.biHeight * image_info->bmiHeader.biWidth - stride) / 8;
+ mask_ptr += (image_info->bmiHeader.biHeight * image_info->bmiHeader.biWidth - stride) / 4;
stride = -stride;
image_info->bmiHeader.biHeight = himl->cy;
}
else image_info->bmiHeader.biHeight = -himl->cy;
- for (i = 0; i < ilHead.cCurImage; i += TILE_COUNT)
+ for (i = 0; i < ilHead.cCurImage; i++)
{
- add_dib_bits( himl, i, min( ilHead.cCurImage - i, TILE_COUNT ),
+ add_dib_bits( himl, i, 1,
himl->cx, himl->cy, image_info, mask_info, ptr, mask_ptr );
ptr += stride;
- mask_ptr += stride / 8;
+ mask_ptr += stride / 4;
}
}
else
@@ -2333,7 +2333,7 @@ HIMAGELIST WINAPI ImageList_Read(IStream *pstm)
ImageList_SetBkColor(himl,ilHead.bkcolor);
for (i=0;i<4;i++)
- ImageList_SetOverlayImage(himl,ilHead.ovls[i],i+1);
+ ImageList_SetOverlayImage(himl,ilHead.ovls[i],i+1);
return himl;
}
@@ -3078,10 +3078,10 @@ BOOL WINAPI ImageList_Write(HIMAGELIST himl, IStream *pstm)
TRACE("%p %p\n", himl, pstm);
if (!is_valid(himl))
- return FALSE;
+ return FALSE;
ilHead.usMagic = (('L' << 8) | 'I');
- ilHead.usVersion = 0x101;
+ ilHead.usVersion = 0x600;
ilHead.cCurImage = himl->cCurImage;
ilHead.cMaxImage = himl->cMaxImage;
ilHead.cGrow = himl->cGrow;
@@ -3090,23 +3090,23 @@ BOOL WINAPI ImageList_Write(HIMAGELIST himl, IStream *pstm)
ilHead.bkcolor = himl->clrBk;
ilHead.flags = himl->flags;
for(i = 0; i < 4; i++) {
- ilHead.ovls[i] = himl->nOvlIdx[i];
+ ilHead.ovls[i] = himl->nOvlIdx[i];
}
TRACE("cx %u, cy %u, flags 0x04%x, cCurImage %u, cMaxImage %u\n",
ilHead.cx, ilHead.cy, ilHead.flags, ilHead.cCurImage, ilHead.cMaxImage);
if(FAILED(IStream_Write(pstm, &ilHead, sizeof(ILHEAD), NULL)))
- return FALSE;
+ return FALSE;
/* write the bitmap */
if(!_write_bitmap(himl->hbmImage, pstm))
- return FALSE;
+ return FALSE;
/* write the mask if we have one */
if(himl->flags & ILC_MASK) {
- if(!_write_bitmap(himl->hbmMask, pstm))
- return FALSE;
+ if(!_write_bitmap(himl->hbmMask, pstm))
+ return FALSE;
}
return TRUE;
--
2.16.2.windows.1
June 16, 2018
[PATCH] msi: Mark exported wine functions CDECL.
by Zebediah Figura
Fixes relay traces on 64-bit.
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
dlls/msi/custom.c | 2 +-
programs/msiexec/msiexec.c | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/dlls/msi/custom.c b/dlls/msi/custom.c
index 8deebe5..e68528f 100644
--- a/dlls/msi/custom.c
+++ b/dlls/msi/custom.c
@@ -484,7 +484,7 @@ static void handle_msi_break(LPCSTR target)
static WCHAR ncalrpcW[] = {'n','c','a','l','r','p','c',0};
static WCHAR endpoint_lrpcW[] = {'m','s','i',0};
-UINT __wine_msi_call_dll_function(const GUID *guid)
+UINT CDECL __wine_msi_call_dll_function(const GUID *guid)
{
MsiCustomActionEntryPoint fn;
MSIHANDLE remote_package = 0;
diff --git a/programs/msiexec/msiexec.c b/programs/msiexec/msiexec.c
index 2ed0557..5ebfea7 100644
--- a/programs/msiexec/msiexec.c
+++ b/programs/msiexec/msiexec.c
@@ -393,7 +393,7 @@ static DWORD DoUnregServer(void)
return ret;
}
-extern UINT __wine_msi_call_dll_function(GUID *guid);
+extern UINT CDECL __wine_msi_call_dll_function(GUID *guid);
static int DoEmbedding(LPCWSTR key)
{
--
2.7.4
June 15, 2018
Re: [PATCH] msi/tests: Use the available ARRAY_SIZE() macro
by Hans Leidekker
Signed-off-by: Hans Leidekker <hans(a)codeweavers.com>
June 15, 2018
Re: [PATCH] msi/tests: Use the available ARRAY_SIZE() macro
by Marvin
Hi,
While running your changed tests on Windows, I think I found new failures.
Being a bot and all I'm not very good at pattern recognition, so I might be
wrong, but could you please double-check?
Full results can be found at
https://testbot.winehq.org/JobDetails.pl?Key=39159
Your paranoid android.
=== wxppro (32 bit install) ===
TestBot process got stuck or died unexpectedly
The previous 1 run(s) terminated abnormally
June 15, 2018
[PATCH] msi/tests: Use the available ARRAY_SIZE() macro
by Michael Stefaniuc
Signed-off-by: Michael Stefaniuc <mstefani(a)winehq.org>
---
dlls/msi/tests/action.c | 64 ++++++++---------
dlls/msi/tests/automation.c | 70 +++++++++---------
dlls/msi/tests/db.c | 12 ++--
dlls/msi/tests/install.c | 169 ++++++++++++++++++++++----------------------
dlls/msi/tests/msi.c | 30 ++++----
dlls/msi/tests/package.c | 2 +-
dlls/msi/tests/patch.c | 8 +--
dlls/msi/tests/record.c | 4 +-
8 files changed, 178 insertions(+), 181 deletions(-)
diff --git a/dlls/msi/tests/action.c b/dlls/msi/tests/action.c
index 2e464c4ecb..cb8514d42d 100644
--- a/dlls/msi/tests/action.c
+++ b/dlls/msi/tests/action.c
@@ -2650,7 +2650,7 @@ static void test_register_product(void)
CreateDirectoryA("msitest", NULL);
create_file("msitest\\maximus", 500);
- create_database(msifile, pp_tables, sizeof(pp_tables) / sizeof(msi_table));
+ create_database(msifile, pp_tables, ARRAY_SIZE(pp_tables));
MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL);
@@ -2917,7 +2917,7 @@ static void test_publish_product(void)
CreateDirectoryA("msitest", NULL);
create_file("msitest\\maximus", 500);
- create_database(msifile, pp_tables, sizeof(pp_tables) / sizeof(msi_table));
+ create_database(msifile, pp_tables, ARRAY_SIZE(pp_tables));
if (is_wow64)
access |= KEY_WOW64_64KEY;
@@ -3150,7 +3150,7 @@ static void test_publish_features(void)
CreateDirectoryA("msitest", NULL);
create_file("msitest\\maximus", 500);
- create_database(msifile, pp_tables, sizeof(pp_tables) / sizeof(msi_table));
+ create_database(msifile, pp_tables, ARRAY_SIZE(pp_tables));
if (is_wow64)
access |= KEY_WOW64_64KEY;
@@ -3336,7 +3336,7 @@ static void test_register_user(void)
CreateDirectoryA("msitest", NULL);
create_file("msitest\\maximus", 500);
- create_database(msifile, pp_tables, sizeof(pp_tables) / sizeof(msi_table));
+ create_database(msifile, pp_tables, ARRAY_SIZE(pp_tables));
if (is_wow64)
access |= KEY_WOW64_64KEY;
@@ -3430,7 +3430,7 @@ static void test_process_components(void)
CreateDirectoryA("msitest", NULL);
create_file("msitest\\maximus", 500);
- create_database(msifile, ppc_tables, sizeof(ppc_tables) / sizeof(msi_table));
+ create_database(msifile, ppc_tables, ARRAY_SIZE(ppc_tables));
if (is_wow64)
access |= KEY_WOW64_64KEY;
@@ -3578,7 +3578,7 @@ static void test_publish(void)
CreateDirectoryA("msitest", NULL);
create_file("msitest\\maximus", 500);
- create_database(msifile, pp_tables, sizeof(pp_tables) / sizeof(msi_table));
+ create_database(msifile, pp_tables, ARRAY_SIZE(pp_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -4152,7 +4152,7 @@ static void test_publish_sourcelist(void)
CreateDirectoryA("msitest", NULL);
create_file("msitest\\maximus", 500);
- create_database(msifile, pp_tables, sizeof(pp_tables) / sizeof(msi_table));
+ create_database(msifile, pp_tables, ARRAY_SIZE(pp_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -4352,7 +4352,7 @@ static void test_remove_files(void)
create_file("msitest\\helium", 500);
create_file("msitest\\lithium", 500);
- create_database(msifile, rem_tables, sizeof(rem_tables) / sizeof(msi_table));
+ create_database(msifile, rem_tables, ARRAY_SIZE(rem_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -4509,7 +4509,7 @@ static void test_move_files(void)
create_file("bur", 100);
create_file("bird", 100);
- create_database(msifile, mov_tables, sizeof(mov_tables) / sizeof(msi_table));
+ create_database(msifile, mov_tables, ARRAY_SIZE(mov_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -4630,7 +4630,7 @@ static void test_duplicate_files(void)
CreateDirectoryA("msitest", NULL);
create_file("msitest\\maximus", 500);
- create_database(msifile, df_tables, sizeof(df_tables) / sizeof(msi_table));
+ create_database(msifile, df_tables, ARRAY_SIZE(df_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -4673,7 +4673,7 @@ static void test_write_registry_values(void)
CreateDirectoryA("msitest", NULL);
- create_database(msifile, wrv_tables, sizeof(wrv_tables) / sizeof(msi_table));
+ create_database(msifile, wrv_tables, ARRAY_SIZE(wrv_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -4839,7 +4839,7 @@ static void test_envvar(void)
return;
}
- create_database(msifile, env_tables, sizeof(env_tables) / sizeof(msi_table));
+ create_database(msifile, env_tables, ARRAY_SIZE(env_tables));
res = RegCreateKeyExA(HKEY_CURRENT_USER, "Environment", 0, NULL, 0, KEY_ALL_ACCESS, NULL, &env, NULL);
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
@@ -4948,7 +4948,7 @@ static void test_create_remove_folder(void)
CreateDirectoryA("msitest\\second", NULL);
create_file("msitest\\first\\one.txt", 1000);
create_file("msitest\\second\\two.txt", 1000);
- create_database(msifile, cf_tables, sizeof(cf_tables) / sizeof(msi_table));
+ create_database(msifile, cf_tables, ARRAY_SIZE(cf_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -5028,7 +5028,7 @@ static void test_start_stop_services(void)
CloseServiceHandle(scm);
create_test_files();
- create_database(msifile, sss_tables, sizeof(sss_tables) / sizeof(msi_table));
+ create_database(msifile, sss_tables, ARRAY_SIZE(sss_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -5128,7 +5128,7 @@ static void test_delete_services(void)
if (!service) return;
create_test_files();
- create_database(msifile, sds_tables, sizeof(sds_tables) / sizeof(msi_table));
+ create_database(msifile, sds_tables, ARRAY_SIZE(sds_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -5190,7 +5190,7 @@ static void test_install_services(void)
}
create_test_files();
- create_database(msifile, sis_tables, sizeof(sis_tables) / sizeof(msi_table));
+ create_database(msifile, sis_tables, ARRAY_SIZE(sis_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -5267,7 +5267,7 @@ static void test_self_registration(void)
create_test_files();
extract_resource("selfreg.dll", "TESTDLL", "msitest\\selfreg.dll");
- create_database(msifile, sr_tables, sizeof(sr_tables) / sizeof(msi_table));
+ create_database(msifile, sr_tables, ARRAY_SIZE(sr_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -5315,7 +5315,7 @@ static void test_register_font(void)
create_test_files();
create_file("msitest\\font.ttf", 1000);
- create_database(msifile, font_tables, sizeof(font_tables) / sizeof(msi_table));
+ create_database(msifile, font_tables, ARRAY_SIZE(font_tables));
if (is_wow64)
access |= KEY_WOW64_64KEY;
@@ -5365,7 +5365,7 @@ static void test_validate_product_id(void)
}
create_test_files();
- create_database(msifile, vp_tables, sizeof(vp_tables) / sizeof(msi_table));
+ create_database(msifile, vp_tables, ARRAY_SIZE(vp_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -5424,7 +5424,7 @@ static void test_install_remove_odbc(void)
create_file("msitest\\ODBCtranslator.dll", 1000);
create_file("msitest\\ODBCtranslator2.dll", 1000);
create_file("msitest\\ODBCsetup.dll", 1000);
- create_database(msifile, odbc_tables, sizeof(odbc_tables) / sizeof(msi_table));
+ create_database(msifile, odbc_tables, ARRAY_SIZE(odbc_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -5510,7 +5510,7 @@ static void test_register_typelib(void)
create_test_files();
extract_resource("typelib.tlb", "TYPELIB", "msitest\\typelib.dll");
- create_database(msifile, tl_tables, sizeof(tl_tables) / sizeof(msi_table));
+ create_database(msifile, tl_tables, ARRAY_SIZE(tl_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -5553,7 +5553,7 @@ static void test_create_remove_shortcut(void)
create_test_files();
create_file("msitest\\target.txt", 1000);
- create_database(msifile, crs_tables, sizeof(crs_tables) / sizeof(msi_table));
+ create_database(msifile, crs_tables, ARRAY_SIZE(crs_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -5602,7 +5602,7 @@ static void test_publish_components(void)
create_test_files();
create_file("msitest\\english.txt", 1000);
- create_database(msifile, pub_tables, sizeof(pub_tables) / sizeof(msi_table));
+ create_database(msifile, pub_tables, ARRAY_SIZE(pub_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -5688,7 +5688,7 @@ static void test_remove_duplicate_files(void)
create_file("msitest\\original.txt", 1000);
create_file("msitest\\original2.txt", 1000);
create_file("msitest\\original3.txt", 1000);
- create_database(msifile, rd_tables, sizeof(rd_tables) / sizeof(msi_table));
+ create_database(msifile, rd_tables, ARRAY_SIZE(rd_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -5736,7 +5736,7 @@ static void test_find_related_products(void)
create_test_files();
create_file("msitest\\product.txt", 1000);
- create_database(msifile, frp_tables, sizeof(frp_tables) / sizeof(msi_table));
+ create_database(msifile, frp_tables, ARRAY_SIZE(frp_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -5780,7 +5780,7 @@ static void test_ini_values(void)
create_test_files();
create_file("msitest\\inifile.txt", 1000);
- create_database(msifile, ini_tables, sizeof(ini_tables) / sizeof(msi_table));
+ create_database(msifile, ini_tables, ARRAY_SIZE(ini_tables));
lstrcpyA(inifile, PROG_FILES_DIR);
lstrcatA(inifile, "\\msitest");
@@ -5841,7 +5841,7 @@ static void test_register_class_info(void)
create_test_files();
create_file("msitest\\class.txt", 1000);
- create_database(msifile, rci_tables, sizeof(rci_tables) / sizeof(msi_table));
+ create_database(msifile, rci_tables, ARRAY_SIZE(rci_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -5906,7 +5906,7 @@ static void test_register_extension_info(void)
create_test_files();
create_file("msitest\\extension.txt", 1000);
- create_database(msifile, rei_tables, sizeof(rei_tables) / sizeof(msi_table));
+ create_database(msifile, rei_tables, ARRAY_SIZE(rei_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -5958,7 +5958,7 @@ static void test_register_progid_info(void)
create_test_files();
create_file("msitest\\progid.txt", 1000);
- create_database(msifile, rpi_tables, sizeof(rpi_tables) / sizeof(msi_table));
+ create_database(msifile, rpi_tables, ARRAY_SIZE(rpi_tables));
res = RegCreateKeyExA(HKEY_CLASSES_ROOT, "Winetest.Orphaned", 0, NULL, 0,
KEY_ALL_ACCESS, NULL, &hkey, NULL);
@@ -6084,7 +6084,7 @@ static void test_register_mime_info(void)
create_test_files();
create_file("msitest\\mime.txt", 1000);
- create_database(msifile, rmi_tables, sizeof(rmi_tables) / sizeof(msi_table));
+ create_database(msifile, rmi_tables, ARRAY_SIZE(rmi_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -6182,7 +6182,7 @@ static void test_publish_assemblies(void)
create_file_data("msitest\\manifest_local.txt", manifest_local, 0);
create_file("msitest\\application_win32.txt", 1000);
create_file("msitest\\application_dotnet.txt", 1000);
- create_database(msifile, pa_tables, sizeof(pa_tables) / sizeof(msi_table));
+ create_database(msifile, pa_tables, ARRAY_SIZE(pa_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -6340,7 +6340,7 @@ static void test_remove_existing_products(void)
create_test_files();
create_file("msitest\\rep.txt", 1000);
- create_database(msifile, rep_tables, sizeof(rep_tables) / sizeof(msi_table));
+ create_database(msifile, rep_tables, ARRAY_SIZE(rep_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
diff --git a/dlls/msi/tests/automation.c b/dlls/msi/tests/automation.c
index e4d2faad5c..2554df7ee6 100644
--- a/dlls/msi/tests/automation.c
+++ b/dlls/msi/tests/automation.c
@@ -355,9 +355,7 @@ static BOOL create_package(LPWSTR path)
DWORD len;
/* Prepare package */
- create_database(msifile, tables,
- sizeof(tables) / sizeof(msi_table), summary_info,
- sizeof(summary_info) / sizeof(msi_summary_info));
+ create_database(msifile, tables, ARRAY_SIZE(tables), summary_info, ARRAY_SIZE(summary_info));
len = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED,
CURR_DIR, -1, path, MAX_PATH);
@@ -903,7 +901,7 @@ static HRESULT Installer_CreateRecord(int count, IDispatch **pRecord)
{
VARIANT varresult;
VARIANTARG vararg[1];
- DISPPARAMS dispparams = {vararg, NULL, sizeof(vararg)/sizeof(VARIANTARG), 0};
+ DISPPARAMS dispparams = {vararg, NULL, ARRAY_SIZE(vararg), 0};
HRESULT hr;
VariantInit(&vararg[0]);
@@ -918,7 +916,7 @@ static HRESULT Installer_CreateRecord(int count, IDispatch **pRecord)
static HRESULT Installer_RegistryValue(HKEY hkey, LPCWSTR szKey, VARIANT vValue, VARIANT *pVarResult, VARTYPE vtExpect)
{
VARIANTARG vararg[3];
- DISPPARAMS dispparams = {vararg, NULL, sizeof(vararg)/sizeof(VARIANTARG), 0};
+ DISPPARAMS dispparams = {vararg, NULL, ARRAY_SIZE(vararg), 0};
VariantInit(&vararg[2]);
V_VT(&vararg[2]) = VT_I4;
@@ -983,7 +981,7 @@ static HRESULT Installer_OpenPackage(LPCWSTR szPackagePath, int options, IDispat
{
VARIANT varresult;
VARIANTARG vararg[2];
- DISPPARAMS dispparams = {vararg, NULL, sizeof(vararg)/sizeof(VARIANTARG), 0};
+ DISPPARAMS dispparams = {vararg, NULL, ARRAY_SIZE(vararg), 0};
HRESULT hr;
VariantInit(&vararg[1]);
@@ -1002,7 +1000,7 @@ static HRESULT Installer_OpenDatabase(LPCWSTR szDatabasePath, int openmode, IDis
{
VARIANT varresult;
VARIANTARG vararg[2];
- DISPPARAMS dispparams = {vararg, NULL, sizeof(vararg)/sizeof(VARIANTARG), 0};
+ DISPPARAMS dispparams = {vararg, NULL, ARRAY_SIZE(vararg), 0};
HRESULT hr;
VariantInit(&vararg[1]);
@@ -1021,7 +1019,7 @@ static HRESULT Installer_InstallProduct(LPCWSTR szPackagePath, LPCWSTR szPropert
{
VARIANT varresult;
VARIANTARG vararg[2];
- DISPPARAMS dispparams = {vararg, NULL, sizeof(vararg)/sizeof(VARIANTARG), 0};
+ DISPPARAMS dispparams = {vararg, NULL, ARRAY_SIZE(vararg), 0};
VariantInit(&vararg[1]);
V_VT(&vararg[1]) = VT_BSTR;
@@ -1037,7 +1035,7 @@ static HRESULT Installer_ProductState(LPCWSTR szProduct, int *pInstallState)
{
VARIANT varresult;
VARIANTARG vararg[1];
- DISPPARAMS dispparams = {vararg, NULL, sizeof(vararg)/sizeof(VARIANTARG), 0};
+ DISPPARAMS dispparams = {vararg, NULL, ARRAY_SIZE(vararg), 0};
HRESULT hr;
VariantInit(&vararg[0]);
@@ -1054,7 +1052,7 @@ static HRESULT Installer_ProductInfo(LPCWSTR szProduct, LPCWSTR szAttribute, LPW
{
VARIANT varresult;
VARIANTARG vararg[2];
- DISPPARAMS dispparams = {vararg, NULL, sizeof(vararg)/sizeof(VARIANTARG), 0};
+ DISPPARAMS dispparams = {vararg, NULL, ARRAY_SIZE(vararg), 0};
HRESULT hr;
VariantInit(&vararg[1]);
@@ -1085,7 +1083,7 @@ static HRESULT Installer_RelatedProducts(LPCWSTR szProduct, IDispatch **pStringL
{
VARIANT varresult;
VARIANTARG vararg[1];
- DISPPARAMS dispparams = {vararg, NULL, sizeof(vararg)/sizeof(VARIANTARG), 0};
+ DISPPARAMS dispparams = {vararg, NULL, ARRAY_SIZE(vararg), 0};
HRESULT hr;
VariantInit(&vararg[0]);
@@ -1127,7 +1125,7 @@ static HRESULT Installer_SummaryInformation(BSTR PackagePath, int UpdateCount, I
{
VARIANT varresult;
VARIANTARG vararg[2];
- DISPPARAMS dispparams = {vararg, NULL, sizeof(vararg)/sizeof(VARIANTARG), 0};
+ DISPPARAMS dispparams = {vararg, NULL, ARRAY_SIZE(vararg), 0};
HRESULT hr;
VariantInit(&vararg[1]);
@@ -1157,7 +1155,7 @@ static HRESULT Session_PropertyGet(IDispatch *pSession, LPCWSTR szName, LPWSTR s
{
VARIANT varresult;
VARIANTARG vararg[1];
- DISPPARAMS dispparams = {vararg, NULL, sizeof(vararg)/sizeof(VARIANTARG), 0};
+ DISPPARAMS dispparams = {vararg, NULL, ARRAY_SIZE(vararg), 0};
HRESULT hr;
VariantInit(&vararg[0]);
@@ -1175,7 +1173,7 @@ static HRESULT Session_PropertyPut(IDispatch *pSession, LPCWSTR szName, LPCWSTR
VARIANT varresult;
VARIANTARG vararg[2];
DISPID dispid = DISPID_PROPERTYPUT;
- DISPPARAMS dispparams = {vararg, &dispid, sizeof(vararg)/sizeof(VARIANTARG), 1};
+ DISPPARAMS dispparams = {vararg, &dispid, ARRAY_SIZE(vararg), 1};
VariantInit(&vararg[1]);
V_VT(&vararg[1]) = VT_BSTR;
@@ -1203,7 +1201,7 @@ static HRESULT Session_ModeGet(IDispatch *pSession, int iFlag, VARIANT_BOOL *mod
{
VARIANT varresult;
VARIANTARG vararg[1];
- DISPPARAMS dispparams = {vararg, NULL, sizeof(vararg)/sizeof(VARIANTARG), 0};
+ DISPPARAMS dispparams = {vararg, NULL, ARRAY_SIZE(vararg), 0};
HRESULT hr;
VariantInit(&vararg[0]);
@@ -1221,7 +1219,7 @@ static HRESULT Session_ModePut(IDispatch *pSession, int iFlag, VARIANT_BOOL mode
VARIANT varresult;
VARIANTARG vararg[2];
DISPID dispid = DISPID_PROPERTYPUT;
- DISPPARAMS dispparams = {vararg, &dispid, sizeof(vararg)/sizeof(VARIANTARG), 1};
+ DISPPARAMS dispparams = {vararg, &dispid, ARRAY_SIZE(vararg), 1};
VariantInit(&vararg[1]);
V_VT(&vararg[1]) = VT_I4;
@@ -1248,7 +1246,7 @@ static HRESULT Session_DoAction(IDispatch *pSession, LPCWSTR szAction, int *iRet
{
VARIANT varresult;
VARIANTARG vararg[1];
- DISPPARAMS dispparams = {vararg, NULL, sizeof(vararg)/sizeof(VARIANTARG), 0};
+ DISPPARAMS dispparams = {vararg, NULL, ARRAY_SIZE(vararg), 0};
HRESULT hr;
VariantInit(&vararg[0]);
@@ -1265,7 +1263,7 @@ static HRESULT Session_EvaluateCondition(IDispatch *pSession, LPCWSTR szConditio
{
VARIANT varresult;
VARIANTARG vararg[1];
- DISPPARAMS dispparams = {vararg, NULL, sizeof(vararg)/sizeof(VARIANTARG), 0};
+ DISPPARAMS dispparams = {vararg, NULL, ARRAY_SIZE(vararg), 0};
HRESULT hr;
VariantInit(&vararg[0]);
@@ -1282,7 +1280,7 @@ static HRESULT Session_Message(IDispatch *pSession, LONG kind, IDispatch *record
{
VARIANT varresult;
VARIANTARG vararg[2];
- DISPPARAMS dispparams = {vararg, NULL, sizeof(vararg)/sizeof(VARIANTARG), 0};
+ DISPPARAMS dispparams = {vararg, NULL, ARRAY_SIZE(vararg), 0};
HRESULT hr;
VariantInit(&varresult);
@@ -1303,7 +1301,7 @@ static HRESULT Session_SetInstallLevel(IDispatch *pSession, LONG iInstallLevel)
{
VARIANT varresult;
VARIANTARG vararg[1];
- DISPPARAMS dispparams = {vararg, NULL, sizeof(vararg)/sizeof(VARIANTARG), 0};
+ DISPPARAMS dispparams = {vararg, NULL, ARRAY_SIZE(vararg), 0};
VariantInit(&vararg[0]);
V_VT(&vararg[0]) = VT_I4;
@@ -1316,7 +1314,7 @@ static HRESULT Session_FeatureCurrentState(IDispatch *pSession, LPCWSTR szName,
{
VARIANT varresult;
VARIANTARG vararg[1];
- DISPPARAMS dispparams = {vararg, NULL, sizeof(vararg)/sizeof(VARIANTARG), 0};
+ DISPPARAMS dispparams = {vararg, NULL, ARRAY_SIZE(vararg), 0};
HRESULT hr;
VariantInit(&vararg[0]);
@@ -1333,7 +1331,7 @@ static HRESULT Session_FeatureRequestStateGet(IDispatch *pSession, LPCWSTR szNam
{
VARIANT varresult;
VARIANTARG vararg[1];
- DISPPARAMS dispparams = {vararg, NULL, sizeof(vararg)/sizeof(VARIANTARG), 0};
+ DISPPARAMS dispparams = {vararg, NULL, ARRAY_SIZE(vararg), 0};
HRESULT hr;
VariantInit(&vararg[0]);
@@ -1351,7 +1349,7 @@ static HRESULT Session_FeatureRequestStatePut(IDispatch *pSession, LPCWSTR szNam
VARIANT varresult;
VARIANTARG vararg[2];
DISPID dispid = DISPID_PROPERTYPUT;
- DISPPARAMS dispparams = {vararg, &dispid, sizeof(vararg)/sizeof(VARIANTARG), 1};
+ DISPPARAMS dispparams = {vararg, &dispid, ARRAY_SIZE(vararg), 1};
VariantInit(&vararg[1]);
V_VT(&vararg[1]) = VT_BSTR;
@@ -1367,7 +1365,7 @@ static HRESULT Database_OpenView(IDispatch *pDatabase, LPCWSTR szSql, IDispatch
{
VARIANT varresult;
VARIANTARG vararg[1];
- DISPPARAMS dispparams = {vararg, NULL, sizeof(vararg)/sizeof(VARIANTARG), 0};
+ DISPPARAMS dispparams = {vararg, NULL, ARRAY_SIZE(vararg), 0};
HRESULT hr;
VariantInit(&vararg[0]);
@@ -1383,7 +1381,7 @@ static HRESULT Database_SummaryInformation(IDispatch *pDatabase, int iUpdateCoun
{
VARIANT varresult;
VARIANTARG vararg[1];
- DISPPARAMS dispparams = {vararg, NULL, sizeof(vararg)/sizeof(VARIANTARG), 0};
+ DISPPARAMS dispparams = {vararg, NULL, ARRAY_SIZE(vararg), 0};
HRESULT hr;
VariantInit(&vararg[0]);
@@ -1399,7 +1397,7 @@ static HRESULT View_Execute(IDispatch *pView, IDispatch *pRecord)
{
VARIANT varresult;
VARIANTARG vararg[1];
- DISPPARAMS dispparams = {vararg, NULL, sizeof(vararg)/sizeof(VARIANTARG), 0};
+ DISPPARAMS dispparams = {vararg, NULL, ARRAY_SIZE(vararg), 0};
VariantInit(&vararg[0]);
V_VT(&vararg[0]) = VT_DISPATCH;
@@ -1421,7 +1419,7 @@ static HRESULT View_Modify(IDispatch *pView, int iMode, IDispatch *pRecord)
{
VARIANT varresult;
VARIANTARG vararg[2];
- DISPPARAMS dispparams = {vararg, NULL, sizeof(vararg)/sizeof(VARIANTARG), 0};
+ DISPPARAMS dispparams = {vararg, NULL, ARRAY_SIZE(vararg), 0};
VariantInit(&vararg[1]);
V_VT(&vararg[1]) = VT_I4;
@@ -1456,7 +1454,7 @@ static HRESULT Record_StringDataGet(IDispatch *pRecord, int iField, LPWSTR szStr
{
VARIANT varresult;
VARIANTARG vararg[1];
- DISPPARAMS dispparams = {vararg, NULL, sizeof(vararg)/sizeof(VARIANTARG), 0};
+ DISPPARAMS dispparams = {vararg, NULL, ARRAY_SIZE(vararg), 0};
HRESULT hr;
VariantInit(&vararg[0]);
@@ -1474,7 +1472,7 @@ static HRESULT Record_StringDataPut(IDispatch *pRecord, int iField, LPCWSTR szSt
VARIANT varresult;
VARIANTARG vararg[2];
DISPID dispid = DISPID_PROPERTYPUT;
- DISPPARAMS dispparams = {vararg, &dispid, sizeof(vararg)/sizeof(VARIANTARG), 1};
+ DISPPARAMS dispparams = {vararg, &dispid, ARRAY_SIZE(vararg), 1};
VariantInit(&vararg[1]);
V_VT(&vararg[1]) = VT_I4;
@@ -1490,7 +1488,7 @@ static HRESULT Record_IntegerDataGet(IDispatch *pRecord, int iField, int *pValue
{
VARIANT varresult;
VARIANTARG vararg[1];
- DISPPARAMS dispparams = {vararg, NULL, sizeof(vararg)/sizeof(VARIANTARG), 0};
+ DISPPARAMS dispparams = {vararg, NULL, ARRAY_SIZE(vararg), 0};
HRESULT hr;
VariantInit(&vararg[0]);
@@ -1508,7 +1506,7 @@ static HRESULT Record_IntegerDataPut(IDispatch *pRecord, int iField, int iValue)
VARIANT varresult;
VARIANTARG vararg[2];
DISPID dispid = DISPID_PROPERTYPUT;
- DISPPARAMS dispparams = {vararg, &dispid, sizeof(vararg)/sizeof(VARIANTARG), 1};
+ DISPPARAMS dispparams = {vararg, &dispid, ARRAY_SIZE(vararg), 1};
VariantInit(&vararg[1]);
V_VT(&vararg[1]) = VT_I4;
@@ -1533,7 +1531,7 @@ static HRESULT StringList_Item(IDispatch *pStringList, int iIndex, LPWSTR szStri
{
VARIANT varresult;
VARIANTARG vararg[1];
- DISPPARAMS dispparams = {vararg, NULL, sizeof(vararg)/sizeof(VARIANTARG), 0};
+ DISPPARAMS dispparams = {vararg, NULL, ARRAY_SIZE(vararg), 0};
HRESULT hr;
VariantInit(&vararg[0]);
@@ -1559,7 +1557,7 @@ static HRESULT StringList_Count(IDispatch *pStringList, int *pCount)
static HRESULT SummaryInfo_PropertyGet(IDispatch *pSummaryInfo, int pid, VARIANT *pVarResult, VARTYPE vtExpect)
{
VARIANTARG vararg[1];
- DISPPARAMS dispparams = {vararg, NULL, sizeof(vararg)/sizeof(VARIANTARG), 0};
+ DISPPARAMS dispparams = {vararg, NULL, ARRAY_SIZE(vararg), 0};
VariantInit(&vararg[0]);
V_VT(&vararg[0]) = VT_I4;
@@ -1572,7 +1570,7 @@ static HRESULT SummaryInfo_PropertyPut(IDispatch *pSummaryInfo, int pid, VARIANT
VARIANT varresult;
VARIANTARG vararg[2];
DISPID dispid = DISPID_PROPERTYPUT;
- DISPPARAMS dispparams = {vararg, &dispid, sizeof(vararg)/sizeof(VARIANTARG), 1};
+ DISPPARAMS dispparams = {vararg, &dispid, ARRAY_SIZE(vararg), 1};
VariantInit(&vararg[1]);
V_VT(&vararg[1]) = VT_I4;
@@ -1850,7 +1848,7 @@ static void test_Database(IDispatch *pDatabase, BOOL readonly)
ok(pSummaryInfo != NULL, "Database_SummaryInformation should not have returned NULL record\n");
if (pSummaryInfo)
{
- test_SummaryInfo(pSummaryInfo, summary_info, sizeof(summary_info)/sizeof(msi_summary_info), readonly);
+ test_SummaryInfo(pSummaryInfo, summary_info, ARRAY_SIZE(summary_info), readonly);
IDispatch_Release(pSummaryInfo);
}
}
@@ -2697,7 +2695,7 @@ static void test_Installer(void)
ok(hr == S_OK, "Installer_SummaryInformation failed, hresult 0x%08x\n", hr);
if (hr == S_OK)
{
- test_SummaryInfo(pSumInfo, summary_info, sizeof(summary_info)/sizeof(msi_summary_info), TRUE);
+ test_SummaryInfo(pSumInfo, summary_info, ARRAY_SIZE(summary_info), TRUE);
IDispatch_Release(pSumInfo);
}
diff --git a/dlls/msi/tests/db.c b/dlls/msi/tests/db.c
index ff54a95ab1..2b927b78f2 100644
--- a/dlls/msi/tests/db.c
+++ b/dlls/msi/tests/db.c
@@ -5221,12 +5221,12 @@ static void test_collation(void)
r = MsiViewFetch(hview, &hrec);
ok(r == ERROR_SUCCESS, "MsiViewFetch failed\n");
- sz = sizeof(bufferW) / sizeof(bufferW[0]);
+ sz = ARRAY_SIZE(bufferW);
r = MsiRecordGetStringW(hrec, 1, bufferW, &sz);
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
ok(!memcmp(bufferW, letter_a_ring, sizeof(letter_a_ring)),
"Expected %s, got %s\n", wine_dbgstr_w(letter_a_ring), wine_dbgstr_w(bufferW));
- sz = sizeof(bufferW) / sizeof(bufferW[0]);
+ sz = ARRAY_SIZE(bufferW);
r = MsiRecordGetStringW(hrec, 2, bufferW, &sz);
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
ok(!lstrcmpW(bufferW, letter_C), "Expected C, got %s\n", wine_dbgstr_w(bufferW));
@@ -5234,12 +5234,12 @@ static void test_collation(void)
r = MsiViewFetch(hview, &hrec);
ok(r == ERROR_SUCCESS, "MsiViewFetch failed\n");
- sz = sizeof(bufferW) / sizeof(bufferW[0]);
+ sz = ARRAY_SIZE(bufferW);
r = MsiRecordGetStringW(hrec, 1, bufferW, &sz);
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
ok(!memcmp(bufferW, letter_a_with_ring, sizeof(letter_a_with_ring)),
"Expected %s, got %s\n", wine_dbgstr_w(letter_a_with_ring), wine_dbgstr_w(bufferW));
- sz = sizeof(bufferW) / sizeof(bufferW[0]);
+ sz = ARRAY_SIZE(bufferW);
r = MsiRecordGetStringW(hrec, 2, bufferW, &sz);
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
ok(!lstrcmpW(bufferW, letter_D), "Expected D, got %s\n", wine_dbgstr_w(bufferW));
@@ -5257,12 +5257,12 @@ static void test_collation(void)
r = MsiViewFetch(hview, &hrec);
ok(r == ERROR_SUCCESS, "MsiViewFetch failed\n");
- sz = sizeof(bufferW) / sizeof(bufferW[0]);
+ sz = ARRAY_SIZE(bufferW);
r = MsiRecordGetStringW(hrec, 1, bufferW, &sz);
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
ok(!memcmp(bufferW, letter_a_with_ring, sizeof(letter_a_with_ring)),
"Expected %s, got %s\n", wine_dbgstr_w(letter_a_with_ring), wine_dbgstr_w(bufferW));
- sz = sizeof(bufferW) / sizeof(bufferW[0]);
+ sz = ARRAY_SIZE(bufferW);
r = MsiRecordGetStringW(hrec, 2, bufferW, &sz);
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
ok(!lstrcmpW(bufferW, letter_D), "Expected D, got %s\n", wine_dbgstr_w(bufferW));
diff --git a/dlls/msi/tests/install.c b/dlls/msi/tests/install.c
index 951f0e7222..f21e32789f 100644
--- a/dlls/msi/tests/install.c
+++ b/dlls/msi/tests/install.c
@@ -2706,7 +2706,7 @@ static void test_MsiInstallProduct(void)
"Expected ERROR_PATH_NOT_FOUND, got %d\n", r);
create_test_files();
- create_database(msifile, tables, sizeof(tables) / sizeof(msi_table));
+ create_database(msifile, tables, ARRAY_SIZE(tables));
/* install, don't publish */
r = MsiInstallProductA(msifile, NULL);
@@ -2757,7 +2757,7 @@ static void test_MsiInstallProduct(void)
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
RegDeleteKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest");
- create_database(msifile, up_tables, sizeof(up_tables) / sizeof(msi_table));
+ create_database(msifile, up_tables, ARRAY_SIZE(up_tables));
/* not published, RemovePreviousVersions set */
r = MsiInstallProductA(msifile, NULL);
@@ -2769,7 +2769,7 @@ static void test_MsiInstallProduct(void)
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
RegDeleteKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest");
- create_database(msifile, up2_tables, sizeof(up2_tables) / sizeof(msi_table));
+ create_database(msifile, up2_tables, ARRAY_SIZE(up2_tables));
/* not published, version number bumped */
r = MsiInstallProductA(msifile, NULL);
@@ -2781,7 +2781,7 @@ static void test_MsiInstallProduct(void)
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
RegDeleteKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest");
- create_database(msifile, up3_tables, sizeof(up3_tables) / sizeof(msi_table));
+ create_database(msifile, up3_tables, ARRAY_SIZE(up3_tables));
/* not published, RemovePreviousVersions set and version number bumped */
r = MsiInstallProductA(msifile, NULL);
@@ -2793,7 +2793,7 @@ static void test_MsiInstallProduct(void)
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
RegDeleteKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest");
- create_database(msifile, up4_tables, sizeof(up4_tables) / sizeof(msi_table));
+ create_database(msifile, up4_tables, ARRAY_SIZE(up4_tables));
/* install, publish product */
r = MsiInstallProductA(msifile, "PUBLISH_PRODUCT=1");
@@ -2804,7 +2804,7 @@ static void test_MsiInstallProduct(void)
res = RegOpenKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", &hkey);
ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
- create_database(msifile, up4_tables, sizeof(up4_tables) / sizeof(msi_table));
+ create_database(msifile, up4_tables, ARRAY_SIZE(up4_tables));
/* published, reinstall */
r = MsiInstallProductA(msifile, NULL);
@@ -2815,7 +2815,7 @@ static void test_MsiInstallProduct(void)
res = RegOpenKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", &hkey);
ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
- create_database(msifile, up5_tables, sizeof(up5_tables) / sizeof(msi_table));
+ create_database(msifile, up5_tables, ARRAY_SIZE(up5_tables));
/* published product, RemovePreviousVersions set */
r = MsiInstallProductA(msifile, NULL);
@@ -2826,7 +2826,7 @@ static void test_MsiInstallProduct(void)
res = RegOpenKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", &hkey);
ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
- create_database(msifile, up6_tables, sizeof(up6_tables) / sizeof(msi_table));
+ create_database(msifile, up6_tables, ARRAY_SIZE(up6_tables));
/* published product, version number bumped */
r = MsiInstallProductA(msifile, NULL);
@@ -2837,7 +2837,7 @@ static void test_MsiInstallProduct(void)
res = RegOpenKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", &hkey);
ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
- create_database(msifile, up7_tables, sizeof(up7_tables) / sizeof(msi_table));
+ create_database(msifile, up7_tables, ARRAY_SIZE(up7_tables));
/* published product, RemovePreviousVersions set and version number bumped */
r = MsiInstallProductA(msifile, NULL);
@@ -2863,7 +2863,7 @@ static void test_MsiSetComponentState(void)
char path[MAX_PATH];
UINT r;
- create_database(msifile, tables, sizeof(tables) / sizeof(msi_table));
+ create_database(msifile, tables, ARRAY_SIZE(tables));
CoInitialize(NULL);
@@ -2913,7 +2913,7 @@ static void test_packagecoltypes(void)
LPCSTR query;
UINT r, count;
- create_database(msifile, tables, sizeof(tables) / sizeof(msi_table));
+ create_database(msifile, tables, ARRAY_SIZE(tables));
CoInitialize(NULL);
@@ -3032,7 +3032,7 @@ static void test_continuouscabs(void)
}
create_cc_test_files();
- create_database(msifile, cc_tables, sizeof(cc_tables) / sizeof(msi_table));
+ create_database(msifile, cc_tables, ARRAY_SIZE(cc_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -3055,7 +3055,7 @@ static void test_continuouscabs(void)
DeleteFileA(msifile);
create_cc_test_files();
- create_database(msifile, cc2_tables, sizeof(cc2_tables) / sizeof(msi_table));
+ create_database(msifile, cc2_tables, ARRAY_SIZE(cc2_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -3081,7 +3081,7 @@ static void test_continuouscabs(void)
/* Filename from cab is right and the one from msi is wrong */
create_cc_test_files();
- create_database(msifile, cc3_tables, sizeof(cc3_tables) / sizeof(msi_table));
+ create_database(msifile, cc3_tables, ARRAY_SIZE(cc3_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -3105,7 +3105,7 @@ static void test_continuouscabs(void)
/* Filename from msi is right and the one from cab is wrong */
create_cc_test_files();
ok(MoveFileA("test2.cab", "test2_.cab"), "Cannot rename test2.cab to test2_.cab\n");
- create_database(msifile, cc3_tables, sizeof(cc3_tables) / sizeof(msi_table));
+ create_database(msifile, cc3_tables, ARRAY_SIZE(cc3_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -3137,7 +3137,7 @@ static void test_caborder(void)
create_file("augustus", 50000);
create_file("caesar", 500);
- create_database(msifile, cc_tables, sizeof(cc_tables) / sizeof(msi_table));
+ create_database(msifile, cc_tables, ARRAY_SIZE(cc_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -3177,7 +3177,7 @@ static void test_caborder(void)
DeleteFileA(msifile);
create_cc_test_files();
- create_database(msifile, co_tables, sizeof(co_tables) / sizeof(msi_table));
+ create_database(msifile, co_tables, ARRAY_SIZE(co_tables));
r = MsiInstallProductA(msifile, NULL);
ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r);
@@ -3193,7 +3193,7 @@ static void test_caborder(void)
DeleteFileA(msifile);
create_cc_test_files();
- create_database(msifile, co2_tables, sizeof(co2_tables) / sizeof(msi_table));
+ create_database(msifile, co2_tables, ARRAY_SIZE(co2_tables));
r = MsiInstallProductA(msifile, NULL);
ok(!delete_pf("msitest\\caesar", TRUE), "File is installed\n");
@@ -3229,7 +3229,7 @@ static void test_mixedmedia(void)
create_file("msitest\\augustus", 500);
create_file("caesar", 500);
- create_database(msifile, mm_tables, sizeof(mm_tables) / sizeof(msi_table));
+ create_database(msifile, mm_tables, ARRAY_SIZE(mm_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -3262,7 +3262,7 @@ static void test_samesequence(void)
UINT r;
create_cc_test_files();
- create_database(msifile, ss_tables, sizeof(ss_tables) / sizeof(msi_table));
+ create_database(msifile, ss_tables, ARRAY_SIZE(ss_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -3291,7 +3291,7 @@ static void test_uiLevelFlags(void)
UINT r;
create_cc_test_files();
- create_database(msifile, ui_tables, sizeof(ui_tables) / sizeof(msi_table));
+ create_database(msifile, ui_tables, ARRAY_SIZE(ui_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE | INSTALLUILEVEL_SOURCERESONLY, NULL);
@@ -3346,7 +3346,7 @@ static void test_readonlyfile(void)
CreateDirectoryA("msitest", NULL);
create_file("msitest\\maximus", 500);
- create_database(msifile, rof_tables, sizeof(rof_tables) / sizeof(msi_table));
+ create_database(msifile, rof_tables, ARRAY_SIZE(rof_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -3398,7 +3398,7 @@ static void test_readonlyfile_cab(void)
create_cab_file("test1.cab", MEDIA_SIZE, "maximus\0");
DeleteFileA("maximus");
- create_database(msifile, rofc_tables, sizeof(rofc_tables) / sizeof(msi_table));
+ create_database(msifile, rofc_tables, ARRAY_SIZE(rofc_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -3452,7 +3452,7 @@ static void test_setdirproperty(void)
CreateDirectoryA("msitest", NULL);
create_file("msitest\\maximus", 500);
- create_database(msifile, sdp_tables, sizeof(sdp_tables) / sizeof(msi_table));
+ create_database(msifile, sdp_tables, ARRAY_SIZE(sdp_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -3493,7 +3493,7 @@ static void test_cabisextracted(void)
create_cab_file("test2.cab", MEDIA_SIZE, "augustus\0");
create_cab_file("test3.cab", MEDIA_SIZE, "caesar\0");
- create_database(msifile, cie_tables, sizeof(cie_tables) / sizeof(msi_table));
+ create_database(msifile, cie_tables, ARRAY_SIZE(cie_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -3727,7 +3727,7 @@ static void test_transformprop(void)
CreateDirectoryA("msitest", NULL);
create_file("msitest\\augustus", 500);
- create_database(msifile, tp_tables, sizeof(tp_tables) / sizeof(msi_table));
+ create_database(msifile, tp_tables, ARRAY_SIZE(tp_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -3775,7 +3775,7 @@ static void test_currentworkingdir(void)
CreateDirectoryA("msitest", NULL);
create_file("msitest\\augustus", 500);
- create_database(msifile, cwd_tables, sizeof(cwd_tables) / sizeof(msi_table));
+ create_database(msifile, cwd_tables, ARRAY_SIZE(cwd_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -3859,7 +3859,7 @@ static void test_admin(void)
CreateDirectoryA("msitest", NULL);
create_file("msitest\\augustus", 500);
- create_database(msifile, adm_tables, sizeof(adm_tables) / sizeof(msi_table));
+ create_database(msifile, adm_tables, ARRAY_SIZE(adm_tables));
set_admin_summary_info(msifileW);
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -3937,7 +3937,7 @@ static void test_adminprops(void)
CreateDirectoryA("msitest", NULL);
create_file("msitest\\augustus", 500);
- create_database(msifile, amp_tables, sizeof(amp_tables) / sizeof(msi_table));
+ create_database(msifile, amp_tables, ARRAY_SIZE(amp_tables));
set_admin_summary_info(msifileW);
set_admin_property_stream(msifile);
@@ -3990,7 +3990,7 @@ static void test_missingcab(void)
create_file("maximus", 500);
create_file("tiberius", 500);
- create_database(msifile, mc_tables, sizeof(mc_tables) / sizeof(msi_table));
+ create_database(msifile, mc_tables, ARRAY_SIZE(mc_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -4058,7 +4058,7 @@ static void test_sourcefolder(void)
CreateDirectoryA("msitest", NULL);
create_file("augustus", 500);
- create_database(msifile, sf_tables, sizeof(sf_tables) / sizeof(msi_table));
+ create_database(msifile, sf_tables, ARRAY_SIZE(sf_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -4097,7 +4097,7 @@ static void test_customaction1(void)
UINT r;
create_test_files();
- create_database(msifile, ca1_tables, sizeof(ca1_tables) / sizeof(msi_table));
+ create_database(msifile, ca1_tables, ARRAY_SIZE(ca1_tables));
/* create a test table */
MsiOpenDatabaseW(msifileW, MSIDBOPEN_TRANSACT, &hdb);
@@ -4153,7 +4153,7 @@ static void test_customaction51(void)
CreateDirectoryA("msitest", NULL);
create_file("msitest\\augustus", 500);
- create_database(msifile, ca51_tables, sizeof(ca51_tables) / sizeof(msi_table));
+ create_database(msifile, ca51_tables, ARRAY_SIZE(ca51_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -4197,7 +4197,7 @@ static void test_installstate(void)
create_file("msitest\\lambda", 500);
create_file("msitest\\mu", 500);
- create_database(msifile, is_tables, sizeof(is_tables) / sizeof(msi_table));
+ create_database(msifile, is_tables, ARRAY_SIZE(is_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -4588,11 +4588,11 @@ static void test_sourcepath(void)
return;
}
- create_database(msifile, sp_tables, sizeof(sp_tables) / sizeof(msi_table));
+ create_database(msifile, sp_tables, ARRAY_SIZE(sp_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
- for (i = 0; i < sizeof(spmap) / sizeof(spmap[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(spmap); i++)
{
if (spmap[i].sost)
{
@@ -4675,7 +4675,7 @@ static void test_missingcomponent(void)
create_file("msitest\\lithium", 500);
create_file("beryllium", 500);
- create_database(msifile, mcp_tables, sizeof(mcp_tables) / sizeof(msi_table));
+ create_database(msifile, mcp_tables, ARRAY_SIZE(mcp_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -4728,7 +4728,7 @@ static void test_sourcedirprop(void)
CreateDirectoryA("msitest", NULL);
create_file("msitest\\augustus", 500);
- create_database(msifile, ca51_tables, sizeof(ca51_tables) / sizeof(msi_table));
+ create_database(msifile, ca51_tables, ARRAY_SIZE(ca51_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -4788,8 +4788,7 @@ static void test_adminimage(void)
create_file("msitest\\cabout\\new\\five.txt", 100);
create_file("msitest\\filename", 100);
- create_database_wordcount(msifile, ai_tables,
- sizeof(ai_tables) / sizeof(msi_table),
+ create_database_wordcount(msifile, ai_tables, ARRAY_SIZE(ai_tables),
100, msidbSumInfoSourceTypeAdminImage, ";1033",
"{004757CA-5092-49C2-AD20-28E1CE0DF5F2}");
@@ -4833,7 +4832,7 @@ static void test_propcase(void)
CreateDirectoryA("msitest", NULL);
create_file("msitest\\augustus", 500);
- create_database(msifile, pc_tables, sizeof(pc_tables) / sizeof(msi_table));
+ create_database(msifile, pc_tables, ARRAY_SIZE(pc_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -4909,7 +4908,7 @@ static void test_int_widths( void )
r = MsiOpenDatabaseW(msidb, MSIDBOPEN_CREATE, &db);
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
- for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(tests); i++)
{
DWORD count;
HANDLE handle = CreateFileW(msitable, GENERIC_WRITE, 0, NULL,
@@ -4942,7 +4941,7 @@ static void test_shortcut(void)
}
create_test_files();
- create_database(msifile, sc_tables, sizeof(sc_tables) / sizeof(msi_table));
+ create_database(msifile, sc_tables, ARRAY_SIZE(sc_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -4989,7 +4988,7 @@ static void test_preselected(void)
}
create_test_files();
- create_database(msifile, ps_tables, sizeof(ps_tables) / sizeof(msi_table));
+ create_database(msifile, ps_tables, ARRAY_SIZE(ps_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -5045,7 +5044,7 @@ static void test_installed_prop(void)
}
create_test_files();
- create_database(msifile, ip_tables, sizeof(ip_tables) / sizeof(msi_table));
+ create_database(msifile, ip_tables, ARRAY_SIZE(ip_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -5084,7 +5083,7 @@ static void test_allusers_prop(void)
}
create_test_files();
- create_database(msifile, aup_tables, sizeof(aup_tables) / sizeof(msi_table));
+ create_database(msifile, aup_tables, ARRAY_SIZE(aup_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -5105,7 +5104,7 @@ static void test_allusers_prop(void)
delete_test_files();
create_test_files();
- create_database(msifile, aup2_tables, sizeof(aup2_tables) / sizeof(msi_table));
+ create_database(msifile, aup2_tables, ARRAY_SIZE(aup2_tables));
/* ALLUSERS property set to 1 */
r = MsiInstallProductA(msifile, "FULL=1");
@@ -5119,7 +5118,7 @@ static void test_allusers_prop(void)
delete_test_files();
create_test_files();
- create_database(msifile, aup3_tables, sizeof(aup3_tables) / sizeof(msi_table));
+ create_database(msifile, aup3_tables, ARRAY_SIZE(aup3_tables));
/* ALLUSERS property set to 2 */
r = MsiInstallProductA(msifile, "FULL=1");
@@ -5133,7 +5132,7 @@ static void test_allusers_prop(void)
delete_test_files();
create_test_files();
- create_database(msifile, aup4_tables, sizeof(aup4_tables) / sizeof(msi_table));
+ create_database(msifile, aup4_tables, ARRAY_SIZE(aup4_tables));
/* ALLUSERS property set to 2, conditioned on ALLUSERS = 1 */
r = MsiInstallProductA(msifile, "FULL=1");
@@ -5248,7 +5247,7 @@ static void test_file_in_use(void)
CreateDirectoryA("msitest", NULL);
create_file("msitest\\maximus", 500);
- create_database(msifile, fiu_tables, sizeof(fiu_tables) / sizeof(msi_table));
+ create_database(msifile, fiu_tables, ARRAY_SIZE(fiu_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -5310,7 +5309,7 @@ static void test_file_in_use_cab(void)
create_cab_file("test1.cab", MEDIA_SIZE, "maximus\0");
DeleteFileA("maximus");
- create_database(msifile, fiuc_tables, sizeof(fiuc_tables) / sizeof(msi_table));
+ create_database(msifile, fiuc_tables, ARRAY_SIZE(fiuc_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -5368,7 +5367,7 @@ static void test_feature_override(void)
create_file("msitest\\override.txt", 1000);
create_file("msitest\\preselected.txt", 1000);
create_file("msitest\\notpreselected.txt", 1000);
- create_database(msifile, fo_tables, sizeof(fo_tables) / sizeof(msi_table));
+ create_database(msifile, fo_tables, ARRAY_SIZE(fo_tables));
if (is_wow64)
access |= KEY_WOW64_64KEY;
@@ -5448,7 +5447,7 @@ static void test_icon_table(void)
return;
}
- create_database(msifile, icon_base_tables, sizeof(icon_base_tables) / sizeof(msi_table));
+ create_database(msifile, icon_base_tables, ARRAY_SIZE(icon_base_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -5528,7 +5527,7 @@ static void test_package_validation(void)
CreateDirectoryA("msitest", NULL);
create_file("msitest\\maximus", 500);
- create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "Intel;1033");
+ create_database_template(msifile, pv_tables, ARRAY_SIZE(pv_tables), 100, "Intel;1033");
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -5543,19 +5542,19 @@ static void test_package_validation(void)
ok(delete_pf("msitest", FALSE), "directory does not exist\n");
DeleteFileA(msifile);
- create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 200, "Intel,9999;9999");
+ create_database_template(msifile, pv_tables, ARRAY_SIZE(pv_tables), 200, "Intel,9999;9999");
r = MsiInstallProductA(msifile, NULL);
ok(r == ERROR_INSTALL_LANGUAGE_UNSUPPORTED, "Expected ERROR_INSTALL_LANGUAGE_UNSUPPORTED, got %u\n", r);
DeleteFileA(msifile);
- create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 200, "Intel,1033;9999");
+ create_database_template(msifile, pv_tables, ARRAY_SIZE(pv_tables), 200, "Intel,1033;9999");
r = MsiInstallProductA(msifile, NULL);
ok(r == ERROR_INSTALL_LANGUAGE_UNSUPPORTED, "Expected ERROR_INSTALL_LANGUAGE_UNSUPPORTED, got %u\n", r);
DeleteFileA(msifile);
- create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 200, "Intel,9999;1033");
+ create_database_template(msifile, pv_tables, ARRAY_SIZE(pv_tables), 200, "Intel,9999;1033");
r = MsiInstallProductA(msifile, NULL);
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
@@ -5563,25 +5562,25 @@ static void test_package_validation(void)
ok(delete_pf("msitest", FALSE), "directory does not exist\n");
DeleteFileA(msifile);
- create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 200, "Intel64,9999;1033");
+ create_database_template(msifile, pv_tables, ARRAY_SIZE(pv_tables), 200, "Intel64,9999;1033");
r = MsiInstallProductA(msifile, NULL);
ok(r == ERROR_INSTALL_PLATFORM_UNSUPPORTED, "Expected ERROR_INSTALL_PLATFORM_UNSUPPORTED, got %u\n", r);
DeleteFileA(msifile);
- create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 200, "Intel32,1033;1033");
+ create_database_template(msifile, pv_tables, ARRAY_SIZE(pv_tables), 200, "Intel32,1033;1033");
r = MsiInstallProductA(msifile, NULL);
ok(r == ERROR_INSTALL_PLATFORM_UNSUPPORTED, "Expected ERROR_INSTALL_PLATFORM_UNSUPPORTED, got %u\n", r);
DeleteFileA(msifile);
- create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 200, "Intel32,9999;1033");
+ create_database_template(msifile, pv_tables, ARRAY_SIZE(pv_tables), 200, "Intel32,9999;1033");
r = MsiInstallProductA(msifile, NULL);
ok(r == ERROR_INSTALL_PLATFORM_UNSUPPORTED, "Expected ERROR_INSTALL_PLATFORM_UNSUPPORTED, got %u\n", r);
DeleteFileA(msifile);
- create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "Intel;9999");
+ create_database_template(msifile, pv_tables, ARRAY_SIZE(pv_tables), 100, "Intel;9999");
r = MsiInstallProductA(msifile, NULL);
ok(r == ERROR_INSTALL_LANGUAGE_UNSUPPORTED, "Expected ERROR_INSTALL_LANGUAGE_UNSUPPORTED, got %u\n", r);
@@ -5591,14 +5590,14 @@ static void test_package_validation(void)
if (GetSystemDefaultLangID() == MAKELANGID( LANG_ENGLISH, SUBLANG_ENGLISH_US ))
{
DeleteFileA(msifile);
- create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "Intel;9");
+ create_database_template(msifile, pv_tables, ARRAY_SIZE(pv_tables), 100, "Intel;9");
r = MsiInstallProductA(msifile, NULL);
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
ok(delete_pf("msitest\\maximus", TRUE), "file does not exist\n");
ok(delete_pf("msitest", FALSE), "directory does not exist\n");
DeleteFileA(msifile);
- create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "Intel;1024");
+ create_database_template(msifile, pv_tables, ARRAY_SIZE(pv_tables), 100, "Intel;1024");
r = MsiInstallProductA(msifile, NULL);
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
ok(delete_pf("msitest\\maximus", TRUE), "file does not exist\n");
@@ -5606,7 +5605,7 @@ static void test_package_validation(void)
}
DeleteFileA(msifile);
- create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "Intel32;0");
+ create_database_template(msifile, pv_tables, ARRAY_SIZE(pv_tables), 100, "Intel32;0");
r = MsiInstallProductA(msifile, NULL);
ok(r == ERROR_INSTALL_PLATFORM_UNSUPPORTED, "Expected ERROR_INSTALL_PLATFORM_UNSUPPORTED, got %u\n", r);
@@ -5616,7 +5615,7 @@ static void test_package_validation(void)
if (is_64bit && !is_wow64)
{
DeleteFileA(msifile);
- create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "Intel;0");
+ create_database_template(msifile, pv_tables, ARRAY_SIZE(pv_tables), 100, "Intel;0");
r = MsiInstallProductA(msifile, NULL);
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
@@ -5624,7 +5623,7 @@ static void test_package_validation(void)
ok(delete_pf("msitest", FALSE), "directory does not exist\n");
DeleteFileA(msifile);
- create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "x64;0");
+ create_database_template(msifile, pv_tables, ARRAY_SIZE(pv_tables), 100, "x64;0");
r = MsiInstallProductA(msifile, NULL);
ok(r == ERROR_INSTALL_PACKAGE_INVALID, "Expected ERROR_INSTALL_PACKAGE_INVALID, got %u\n", r);
@@ -5632,7 +5631,7 @@ static void test_package_validation(void)
ok(!delete_pf("msitest", FALSE), "directory exists\n");
DeleteFileA(msifile);
- create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 200, "x64;0");
+ create_database_template(msifile, pv_tables, ARRAY_SIZE(pv_tables), 200, "x64;0");
r = MsiInstallProductA(msifile, NULL);
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
@@ -5642,7 +5641,7 @@ static void test_package_validation(void)
else if (is_wow64)
{
DeleteFileA(msifile);
- create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "Intel;0");
+ create_database_template(msifile, pv_tables, ARRAY_SIZE(pv_tables), 100, "Intel;0");
r = MsiInstallProductA(msifile, NULL);
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
@@ -5650,7 +5649,7 @@ static void test_package_validation(void)
ok(delete_pf("msitest", FALSE), "directory does not exist\n");
DeleteFileA(msifile);
- create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "x64;0");
+ create_database_template(msifile, pv_tables, ARRAY_SIZE(pv_tables), 100, "x64;0");
r = MsiInstallProductA(msifile, NULL);
ok(r == ERROR_INSTALL_PACKAGE_INVALID, "Expected ERROR_INSTALL_PACKAGE_INVALID, got %u\n", r);
@@ -5658,7 +5657,7 @@ static void test_package_validation(void)
ok(!delete_pf("msitest", FALSE), "directory exists\n");
DeleteFileA(msifile);
- create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 200, "x64;0");
+ create_database_template(msifile, pv_tables, ARRAY_SIZE(pv_tables), 200, "x64;0");
r = MsiInstallProductA(msifile, NULL);
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
@@ -5668,7 +5667,7 @@ static void test_package_validation(void)
else
{
DeleteFileA(msifile);
- create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "Intel;0");
+ create_database_template(msifile, pv_tables, ARRAY_SIZE(pv_tables), 100, "Intel;0");
r = MsiInstallProductA(msifile, NULL);
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
@@ -5676,7 +5675,7 @@ static void test_package_validation(void)
ok(delete_pf("msitest", FALSE), "directory does not exist\n");
DeleteFileA(msifile);
- create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "Alpha,Beta,Intel;0");
+ create_database_template(msifile, pv_tables, ARRAY_SIZE(pv_tables), 100, "Alpha,Beta,Intel;0");
r = MsiInstallProductA(msifile, NULL);
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
@@ -5684,7 +5683,7 @@ static void test_package_validation(void)
ok(delete_pf("msitest", FALSE), "directory does not exist\n");
DeleteFileA(msifile);
- create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "x64;0");
+ create_database_template(msifile, pv_tables, ARRAY_SIZE(pv_tables), 100, "x64;0");
r = MsiInstallProductA(msifile, NULL);
ok(r == ERROR_INSTALL_PLATFORM_UNSUPPORTED, "Expected ERROR_INSTALL_PLATFORM_UNSUPPORTED, got %u\n", r);
@@ -5692,7 +5691,7 @@ static void test_package_validation(void)
ok(!delete_pf("msitest", FALSE), "directory exists\n");
DeleteFileA(msifile);
- create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 200, "x64;0");
+ create_database_template(msifile, pv_tables, ARRAY_SIZE(pv_tables), 200, "x64;0");
r = MsiInstallProductA(msifile, NULL);
ok(r == ERROR_INSTALL_PLATFORM_UNSUPPORTED, "Expected ERROR_INSTALL_PLATFORM_UNSUPPORTED, got %u\n", r);
@@ -5719,7 +5718,7 @@ static void test_upgrade_code(void)
CreateDirectoryA("msitest", NULL);
create_file("msitest\\upgradecode.txt", 1000);
- create_database(msifile, uc_tables, sizeof(uc_tables) / sizeof(msi_table));
+ create_database(msifile, uc_tables, ARRAY_SIZE(uc_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -5758,7 +5757,7 @@ static void test_mixed_package(void)
return;
}
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
- create_database_template(msifile, mixed_tables, sizeof(mixed_tables)/sizeof(msi_table), 200, "x64;1033");
+ create_database_template(msifile, mixed_tables, ARRAY_SIZE(mixed_tables), 200, "x64;1033");
r = MsiInstallProductA(msifile, NULL);
if (r == ERROR_INSTALL_PACKAGE_REJECTED)
@@ -5826,7 +5825,7 @@ static void test_mixed_package(void)
ok(res == ERROR_FILE_NOT_FOUND, "64-bit CLSID key not removed\n");
DeleteFileA( msifile );
- create_database_template(msifile, mixed_tables, sizeof(mixed_tables)/sizeof(msi_table), 200, "Intel;1033");
+ create_database_template(msifile, mixed_tables, ARRAY_SIZE(mixed_tables), 200, "Intel;1033");
r = MsiInstallProductA(msifile, NULL);
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
@@ -5903,7 +5902,7 @@ static void test_volume_props(void)
}
CreateDirectoryA("msitest", NULL);
create_file("msitest\\volumeprop.txt", 1000);
- create_database(msifile, vp_tables, sizeof(vp_tables)/sizeof(msi_table));
+ create_database(msifile, vp_tables, ARRAY_SIZE(vp_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -5929,9 +5928,9 @@ static void test_shared_component(void)
}
CreateDirectoryA("msitest", NULL);
create_file("msitest\\sharedcomponent.txt", 1000);
- create_database_wordcount(msifile, shc_tables, sizeof(shc_tables)/sizeof(shc_tables[0]),
+ create_database_wordcount(msifile, shc_tables, ARRAY_SIZE(shc_tables),
100, 0, ";", "{A8826420-FD72-4E61-9E15-C1944CF4CBE1}");
- create_database_wordcount(msifile2, shc2_tables, sizeof(shc2_tables)/sizeof(shc2_tables[0]),
+ create_database_wordcount(msifile2, shc2_tables, ARRAY_SIZE(shc2_tables),
100, 0, ";", "{A8B50B30-0E8A-4ACD-B3CF-1A5DC58B2739}");
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -5979,7 +5978,7 @@ static void test_remove_upgrade_code(void)
if (is_wow64) access |= KEY_WOW64_64KEY;
create_test_files();
- create_database( msifile, icon_base_tables, sizeof(icon_base_tables)/sizeof(icon_base_tables[0]) );
+ create_database( msifile, icon_base_tables, ARRAY_SIZE( icon_base_tables ));
MsiSetInternalUI( INSTALLUILEVEL_NONE, NULL );
@@ -6024,7 +6023,7 @@ static void test_feature_tree(void)
}
create_file( "msitest\\featuretree.txt", 1000 );
- create_database( msifile, ft_tables, sizeof(ft_tables)/sizeof(ft_tables[0]) );
+ create_database( msifile, ft_tables, ARRAY_SIZE( ft_tables ));
MsiSetInternalUI( INSTALLUILEVEL_NONE, NULL );
@@ -6063,7 +6062,7 @@ static void test_deferred_action(void)
GetTempFileNameA(path, "da", 0, file);
sprintf(buffer, "TESTPATH=\"%s\"", file);
- create_database(msifile, da_tables, sizeof(da_tables) / sizeof(da_tables[0]));
+ create_database(msifile, da_tables, ARRAY_SIZE(da_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -6102,7 +6101,7 @@ static void test_wow64(void)
}
create_test_files();
- create_database_template(msifile, x64_tables, sizeof(x64_tables)/sizeof(msi_table), 200, "x64;0");
+ create_database_template(msifile, x64_tables, ARRAY_SIZE(x64_tables), 200, "x64;0");
r = MsiInstallProductA(msifile, NULL);
if (r == ERROR_INSTALL_PACKAGE_REJECTED)
{
@@ -6155,7 +6154,7 @@ static void test_source_resolution(void)
}
create_test_files();
- create_database(msifile, sr_tables, sizeof(sr_tables) / sizeof(msi_table));
+ create_database(msifile, sr_tables, ARRAY_SIZE(sr_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
diff --git a/dlls/msi/tests/msi.c b/dlls/msi/tests/msi.c
index 62afa6e747..f4afef15db 100644
--- a/dlls/msi/tests/msi.c
+++ b/dlls/msi/tests/msi.c
@@ -1094,7 +1094,7 @@ static void test_MsiGetFileHash(void)
r = pMsiGetFileHashA(name, 0, NULL);
ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
- for (i = 0; i < sizeof(hash_data) / sizeof(hash_data[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(hash_data); i++)
{
int ret;
@@ -3313,7 +3313,7 @@ static void test_MsiProvideComponent(void)
create_test_files();
create_file("msitest\\sourcedir.txt", 1000);
- create_database(msifile, sd_tables, sizeof(sd_tables) / sizeof(msi_table));
+ create_database(msifile, sd_tables, ARRAY_SIZE(sd_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -13446,7 +13446,7 @@ static void test_MsiConfigureProductEx(void)
create_file_data("msitest\\helium", "helium", 500);
create_file_data("msitest\\lithium", "lithium", 500);
- create_database(msifile, mcp_tables, sizeof(mcp_tables) / sizeof(msi_table));
+ create_database(msifile, mcp_tables, ARRAY_SIZE(mcp_tables));
if (is_wow64)
access |= KEY_WOW64_64KEY;
@@ -13574,7 +13574,7 @@ static void test_MsiConfigureProductEx(void)
ok(!delete_pf("msitest\\lithium", TRUE), "File not removed\n");
ok(!delete_pf("msitest", FALSE), "Directory not removed\n");
- create_database(msifile, mcp_tables, sizeof(mcp_tables) / sizeof(msi_table));
+ create_database(msifile, mcp_tables, ARRAY_SIZE(mcp_tables));
/* install the product, machine */
r = MsiInstallProductA(msifile, "ALLUSERS=1 INSTALLLEVEL=10 PROPVAR=42");
@@ -13615,7 +13615,7 @@ static void test_MsiConfigureProductEx(void)
ok(pf_exists("msitest"), "File not installed\n");
RegCloseKey(props);
- create_database(msifile, mcp_tables, sizeof(mcp_tables) / sizeof(msi_table));
+ create_database(msifile, mcp_tables, ARRAY_SIZE(mcp_tables));
/* LastUsedSource can be used as a last resort */
r = MsiConfigureProductExA("{38847338-1BBC-4104-81AC-2FAAC7ECDDCD}",
@@ -13723,7 +13723,7 @@ static void test_MsiSetFeatureAttributes(void)
skip("process is limited\n");
return;
}
- create_database( msifile, tables, sizeof(tables) / sizeof(tables[0]) );
+ create_database( msifile, tables, ARRAY_SIZE( tables ));
strcpy( path, CURR_DIR );
strcat( path, "\\" );
@@ -13805,7 +13805,7 @@ static void test_MsiGetFeatureInfo(void)
skip("process is limited\n");
return;
}
- create_database( msifile, tables, sizeof(tables) / sizeof(tables[0]) );
+ create_database( msifile, tables, ARRAY_SIZE( tables ));
strcpy( path, CURR_DIR );
strcat( path, "\\" );
@@ -13989,9 +13989,9 @@ static void test_lastusedsource(void)
create_cab_file("test1.cab", MEDIA_SIZE, "maximus\0");
DeleteFileA("maximus");
- create_database("msifile0.msi", lus0_tables, sizeof(lus0_tables) / sizeof(msi_table));
- create_database("msifile1.msi", lus1_tables, sizeof(lus1_tables) / sizeof(msi_table));
- create_database("msifile2.msi", lus2_tables, sizeof(lus2_tables) / sizeof(msi_table));
+ create_database("msifile0.msi", lus0_tables, ARRAY_SIZE(lus0_tables));
+ create_database("msifile1.msi", lus1_tables, ARRAY_SIZE(lus1_tables));
+ create_database("msifile2.msi", lus2_tables, ARRAY_SIZE(lus2_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
@@ -14111,7 +14111,7 @@ static void test_setpropertyfolder(void)
CreateDirectoryA("msitest", NULL);
create_file("msitest\\maximus", 500);
- create_database(msifile, spf_tables, sizeof(spf_tables) / sizeof(msi_table));
+ create_database(msifile, spf_tables, ARRAY_SIZE(spf_tables));
MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL);
@@ -14154,7 +14154,7 @@ static void test_sourcedir_props(void)
create_test_files();
create_file("msitest\\sourcedir.txt", 1000);
- create_database(msifile, sd_tables, sizeof(sd_tables) / sizeof(msi_table));
+ create_database(msifile, sd_tables, ARRAY_SIZE(sd_tables));
MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL);
@@ -14221,11 +14221,11 @@ static void test_concurrentinstall(void)
create_file("msitest\\maximus", 500);
create_file("msitest\\msitest\\augustus", 500);
- create_database(msifile, ci_tables, sizeof(ci_tables) / sizeof(msi_table));
+ create_database(msifile, ci_tables, ARRAY_SIZE(ci_tables));
lstrcpyA(path, CURR_DIR);
lstrcatA(path, "\\msitest\\concurrent.msi");
- create_database(path, ci2_tables, sizeof(ci2_tables) / sizeof(msi_table));
+ create_database(path, ci2_tables, ARRAY_SIZE(ci2_tables));
MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL);
@@ -14269,7 +14269,7 @@ static void test_command_line_parsing(void)
}
create_test_files();
- create_database(msifile, cl_tables, sizeof(cl_tables)/sizeof(msi_table));
+ create_database(msifile, cl_tables, ARRAY_SIZE(cl_tables));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
diff --git a/dlls/msi/tests/package.c b/dlls/msi/tests/package.c
index 09d2e0b61b..88bd60a8f2 100644
--- a/dlls/msi/tests/package.c
+++ b/dlls/msi/tests/package.c
@@ -187,7 +187,7 @@ static LSTATUS package_RegDeleteTreeW(HKEY hKey, LPCWSTR lpszSubKey, REGSAM acce
dwMaxSubkeyLen++;
dwMaxValueLen++;
dwMaxLen = max(dwMaxSubkeyLen, dwMaxValueLen);
- if (dwMaxLen > sizeof(szNameBuf)/sizeof(WCHAR))
+ if (dwMaxLen > ARRAY_SIZE(szNameBuf))
{
/* Name too big: alloc a buffer for it */
if (!(lpszName = HeapAlloc( GetProcessHeap(), 0, dwMaxLen*sizeof(WCHAR))))
diff --git a/dlls/msi/tests/patch.c b/dlls/msi/tests/patch.c
index a09084002e..b577982443 100644
--- a/dlls/msi/tests/patch.c
+++ b/dlls/msi/tests/patch.c
@@ -731,7 +731,7 @@ static void test_simple_patch( void )
CreateDirectoryA( "msitest", NULL );
create_file( "msitest\\patch.txt", 1000 );
- create_database( msifile, tables, sizeof(tables) / sizeof(struct msi_table) );
+ create_database( msifile, tables, ARRAY_SIZE(tables) );
create_patch( mspfile );
MsiSetInternalUI( INSTALLUILEVEL_NONE, NULL );
@@ -929,7 +929,7 @@ static void test_MsiOpenDatabase( void )
MsiCloseHandle( hdb );
DeleteFileA( mspfile );
- create_database( msifile, tables, sizeof(tables) / sizeof(struct msi_table) );
+ create_database( msifile, tables, ARRAY_SIZE(tables) );
create_patch( mspfile );
r = MsiOpenDatabaseW( msifileW, MSIDBOPEN_READONLY + MSIDBOPEN_PATCHFILE, &hdb );
@@ -1072,7 +1072,7 @@ static void test_system_tables( void )
CreateDirectoryA( "msitest", NULL );
create_file( "msitest\\patch.txt", 1000 );
- create_database( msifile, tables, sizeof(tables) / sizeof(struct msi_table) );
+ create_database( msifile, tables, ARRAY_SIZE(tables) );
create_patch( mspfile );
MsiSetInternalUI( INSTALLUILEVEL_NONE, NULL );
@@ -1261,7 +1261,7 @@ static void test_patch_registration( void )
CreateDirectoryA( "msitest", NULL );
create_file( "msitest\\patch.txt", 1000 );
- create_database( msifile, tables, sizeof(tables) / sizeof(struct msi_table) );
+ create_database( msifile, tables, ARRAY_SIZE(tables) );
create_patch( mspfile );
MsiSetInternalUI( INSTALLUILEVEL_NONE, NULL );
diff --git a/dlls/msi/tests/record.c b/dlls/msi/tests/record.c
index 777f1f78ed..d0ad15b8fe 100644
--- a/dlls/msi/tests/record.c
+++ b/dlls/msi/tests/record.c
@@ -138,7 +138,7 @@ static void test_msirecord(void)
ok(buf[0] == 0, "MsiRecordGetStringA returned the wrong string\n");
ok(sz == 0, "MsiRecordGetStringA returned the wrong length\n");
bufW[0] = 0;
- sz = sizeof bufW / sizeof bufW[0];
+ sz = ARRAY_SIZE(bufW);
r = MsiRecordGetStringW(h, 0, bufW, &sz);
ok(r == ERROR_SUCCESS, "Failed to get string at 0\n");
ok(bufW[0] == 0, "MsiRecordGetStringW returned the wrong string\n");
@@ -156,7 +156,7 @@ static void test_msirecord(void)
ok(buf[0] == 0, "MsiRecordGetStringA returned the wrong string\n");
ok(sz == 0, "MsiRecordGetStringA returned the wrong length\n");
bufW[0] = 0;
- sz = sizeof bufW / sizeof bufW[0];
+ sz = ARRAY_SIZE(bufW);
r = MsiRecordGetStringW(h, 0, bufW, &sz);
ok(r == ERROR_SUCCESS, "Failed to get string at 0\n");
ok(bufW[0] == 0, "MsiRecordGetStringW returned the wrong string\n");
--
2.14.4
June 15, 2018
Re: [PATCH] d3dx9/tests: Add initial tests for ID3DXFont::DrawText().
by Matteo Bruni
2018-06-15 13:16 GMT+02:00 Alexandre Julliard <julliard(a)winehq.org>:
> Matteo Bruni <mbruni(a)codeweavers.com> writes:
>
>> From: Kieran Duggan <kieranduggan15(a)gmail.com>
>>
>> Signed-off-by: Kieran Duggan <kieranduggan15(a)gmail.com>
>> Signed-off-by: Matteo Bruni <mbruni(a)codeweavers.com>
>> ---
>> dlls/d3dx9_36/tests/core.c | 81 +++++++++++++++++++++++++++++++++++-----------
>> 1 file changed, 62 insertions(+), 19 deletions(-)
>
> The tests fail:
>
> ../../../tools/runtest -q -P wine -T ../../.. -M d3dx9_36.dll -p d3dx9_36_test.exe.so core && touch core.ok
> core.c:612: Test failed: Got unexpected height 1.
> core.c:614: Test failed: Got unexpected height 1.
> core.c:616: Test failed: Got unexpected height 1.
> core.c:619: Test failed: Got unexpected height 1.
> core.c:624: Test failed: Got unexpected height 1.
> core.c:627: Test failed: Got unexpected rect right 0.
> core.c:628: Test failed: Got unexpected rect bottom 0.
> core.c:612: Test failed: Got unexpected height 1.
> core.c:614: Test failed: Got unexpected height 1.
> core.c:616: Test failed: Got unexpected height 1.
> core.c:619: Test failed: Got unexpected height 1.
> core.c:624: Test failed: Got unexpected height 1.
> core.c:627: Test failed: Got unexpected rect right 0.
> core.c:628: Test failed: Got unexpected rect bottom 0.
> core.c:612: Test failed: Got unexpected height 1.
> core.c:614: Test failed: Got unexpected height 1.
> core.c:616: Test failed: Got unexpected height 1.
> core.c:619: Test failed: Got unexpected height 1.
> core.c:624: Test failed: Got unexpected height 1.
> core.c:627: Test failed: Got unexpected rect right 0.
> core.c:628: Test failed: Got unexpected rect bottom 0.
> core.c:612: Test failed: Got unexpected height 1.
> core.c:614: Test failed: Got unexpected height 1.
> core.c:616: Test failed: Got unexpected height 1.
> core.c:619: Test failed: Got unexpected height 1.
> core.c:624: Test failed: Got unexpected height 1.
> core.c:627: Test failed: Got unexpected rect right 0.
> core.c:628: Test failed: Got unexpected rect bottom 0.
> core.c:612: Test failed: Got unexpected height 1.
> core.c:614: Test failed: Got unexpected height 1.
> core.c:616: Test failed: Got unexpected height 1.
> core.c:619: Test failed: Got unexpected height 1.
> core.c:624: Test failed: Got unexpected height 1.
> core.c:627: Test failed: Got unexpected rect right 0.
> core.c:628: Test failed: Got unexpected rect bottom 0.
> Makefile:234: recipe for target 'core.ok' failed
> make[1]: *** [core.ok] Error 35
You're right, I forgot to put the todo_wine in after testing on Windows -_-
I'll fixup and resend.
June 15, 2018
Re: [PATCH v2] msvcp120: Add test for Concurrent_vector_copy.
by Piotr Caban
Signed-off-by: Piotr Caban <piotr(a)codeweavers.com>
June 15, 2018
[PATCH v2] msvcp120: Add test for Concurrent_vector_copy.
by Hua Meng
Signed-off-by: Hua meng <161220092(a)smail.nju.edu.cn>
---
dlls/msvcp120/tests/msvcp120.c | 50 +++++++++++++++++++++++++++++++++++++++++-
1 file changed, 49 insertions(+), 1 deletion(-)
diff --git a/dlls/msvcp120/tests/msvcp120.c b/dlls/msvcp120/tests/msvcp120.c
index 1247222..c34bd65 100644
--- a/dlls/msvcp120/tests/msvcp120.c
+++ b/dlls/msvcp120/tests/msvcp120.c
@@ -26,6 +26,7 @@
DWORD expect_idx;
static int vector_alloc_count;
+static int vector_elem_count;
#define DEFINE_EXPECT(func) \
BOOL expect_ ## func, called_ ## func
@@ -38,6 +39,7 @@ struct expect_struct {
DEFINE_EXPECT(queue_char__Assign_and_destroy_item);
DEFINE_EXPECT(concurrent_vector_int_alloc);
DEFINE_EXPECT(concurrent_vector_int_destroy);
+ DEFINE_EXPECT(concurrent_vector_int_copy);
};
#define SET_EXPECT(func) \
@@ -110,6 +112,8 @@ static void * (WINAPI *call_thiscall_func1)( void *func, void *this );
static void * (WINAPI *call_thiscall_func2)( void *func, void *this, const void *a );
static void * (WINAPI *call_thiscall_func3)( void *func, void *this, const void *a,
const void *b );
+static void * (WINAPI *call_thiscall_func4)( void *func, void *this, const void *a,
+ const void *b, const void *c );
static void init_thiscall_thunk(void)
{
@@ -123,18 +127,22 @@ static void init_thiscall_thunk(void)
call_thiscall_func1 = (void *)thunk;
call_thiscall_func2 = (void *)thunk;
call_thiscall_func3 = (void *)thunk;
+ call_thiscall_func4 = (void *)thunk;
}
#define call_func1(func,_this) call_thiscall_func1(func,_this)
#define call_func2(func,_this,a) call_thiscall_func2(func,_this,(const void*)(a))
#define call_func3(func,_this,a,b) call_thiscall_func3(func,_this,(const void*)(a),\
(const void*)(b))
+#define call_func4(func,_this,a,b,c) call_thiscall_func4(func,_this,(const void*)(a),\
+ (const void*)(b),(const void*)(c))
#else
#define init_thiscall_thunk()
#define call_func1(func,_this) func(_this)
#define call_func2(func,_this,a) func(_this,a)
#define call_func3(func,_this,a,b) func(_this,a,b)
+#define call_func4(func,_this,a,b,c) func(_this,a,b,c)
#endif /* __i386__ */
static inline float __port_infinity(void)
@@ -382,6 +390,8 @@ static void* (__thiscall *p_vector_base_v4__Internal_push_back)(
vector_base_v4*, size_t, size_t*);
static size_t (__thiscall *p_vector_base_v4__Internal_clear)(
vector_base_v4*, void (__cdecl*)(void*, size_t));
+static void (__thiscall *p_vector_base_v4__Internal_copy)(
+ vector_base_v4*, vector_base_v4*, size_t, void (__cdecl*)(void*, const void*, size_t));
static HMODULE msvcp;
#define SETNOFAIL(x,y) x = (void*)GetProcAddress(msvcp,y)
@@ -524,6 +534,8 @@ static BOOL init(void)
"?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KAEA_K(a)Z");
SET(p_vector_base_v4__Internal_clear,
"?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_KP6AXPEAX_K(a)Z@Z");
+ SET(p_vector_base_v4__Internal_copy,
+ "?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAXPEBX1@Z(a)Z");
} else {
SET(p_tr2_sys__File_size,
"?_File_size(a)sys@tr2(a)std@@YA_KPBD(a)Z");
@@ -635,6 +647,8 @@ static BOOL init(void)
"?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIAAI(a)Z");
SET(p_vector_base_v4__Internal_clear,
"?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIP6AXPAXI(a)Z@Z");
+ SET(p_vector_base_v4__Internal_copy,
+ "?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXPBXI@Z(a)Z");
#else
SET(p__Thrd_current,
"_Thrd_current");
@@ -674,6 +688,8 @@ static BOOL init(void)
"?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAPAXIAAI(a)Z");
SET(p_vector_base_v4__Internal_clear,
"?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAIP6AXPAXI(a)Z@Z");
+ SET(p_vector_base_v4__Internal_copy,
+ "?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXABV123(a)IP6AXPAXPBXI@Z(a)Z");
#endif
}
SET(p__Thrd_equal,
@@ -2459,6 +2475,8 @@ static void* __cdecl concurrent_vector_int_alloc(vector_base_v4 *this, size_t n)
static void __cdecl concurrent_vector_int_destroy(void *ptr, size_t n)
{
CHECK_EXPECT2(concurrent_vector_int_destroy);
+ ok(vector_elem_count >= n, "invalid destroy\n");
+ vector_elem_count -= n;
memset(ptr, 0xff, sizeof(int)*n);
}
@@ -2484,6 +2502,13 @@ static void concurrent_vector_int_dtor(vector_base_v4 *this)
call_func1(p_vector_base_v4_dtor, this);
}
+static void __cdecl concurrent_vector_int_copy(void *dst, const void *src, size_t n)
+{
+ CHECK_EXPECT2(concurrent_vector_int_copy);
+ vector_elem_count += n;
+ memcpy(dst, src, n*sizeof(int));
+}
+
static void test_queue_base_v4(void)
{
queue_base_v4 queue;
@@ -2677,7 +2702,7 @@ static void test_queue_base_v4(void)
static void test_vector_base_v4(void)
{
- vector_base_v4 vector;
+ vector_base_v4 vector, v2;
size_t idx, size;
int *data;
@@ -2695,6 +2720,7 @@ static void test_vector_base_v4(void)
CHECK_CALLED(concurrent_vector_int_alloc);
ok(data != NULL, "_Internal_push_back returned NULL\n");
ok(idx == 0, "idx got %ld expected %d\n", (long)idx, 0);
+ vector_elem_count++;
*data = 1;
ok(data == vector.storage[0], "vector.storage[0] got %p expected %p\n",
vector.storage[0], data);
@@ -2709,6 +2735,7 @@ static void test_vector_base_v4(void)
data = call_func3(p_vector_base_v4__Internal_push_back, &vector, sizeof(int), &idx);
ok(data != NULL, "_Internal_push_back returned NULL\n");
ok(idx == 1, "idx got %ld expected 1\n", (long)idx);
+ vector_elem_count++;
*data = 2;
ok(vector.first_block == 1, "vector.first_block got %ld expected 1\n",
(long)vector.first_block);
@@ -2723,6 +2750,7 @@ static void test_vector_base_v4(void)
CHECK_CALLED(concurrent_vector_int_alloc);
ok(data != NULL, "_Internal_push_back returned NULL\n");
ok(idx == 2, "idx got %ld expected 2\n", (long)idx);
+ vector_elem_count++;
*data = 3;
ok(vector.first_block == 1, "vector.first_block got %ld expected 1\n",
(long)vector.first_block);
@@ -2735,6 +2763,7 @@ static void test_vector_base_v4(void)
data = call_func3(p_vector_base_v4__Internal_push_back, &vector, sizeof(int), &idx);
ok(data != NULL, "_Internal_push_back returned NULL\n");
ok(idx == 3, "idx got %ld expected 3\n", (long)idx);
+ vector_elem_count++;
*data = 4;
size = (size_t)call_func1(p_vector_base_v4__Internal_capacity, &vector);
ok(size == 4, "size of vector got %ld expected 4\n", (long)size);
@@ -2744,10 +2773,28 @@ static void test_vector_base_v4(void)
CHECK_CALLED(concurrent_vector_int_alloc);
ok(data != NULL, "_Internal_push_back returned NULL\n");
ok(idx == 4, "idx got %ld expected 2\n", (long)idx);
+ vector_elem_count++;
*data = 5;
size = (size_t)call_func1(p_vector_base_v4__Internal_capacity, &vector);
ok(size == 8, "size of vector got %ld expected 8\n", (long)size);
+ concurrent_vector_int_ctor(&v2);
+ SET_EXPECT(concurrent_vector_int_alloc);
+ SET_EXPECT(concurrent_vector_int_copy);
+ call_func4(p_vector_base_v4__Internal_copy, &v2, &vector,
+ sizeof(int), concurrent_vector_int_copy);
+ CHECK_CALLED(concurrent_vector_int_alloc);
+ CHECK_CALLED(concurrent_vector_int_copy);
+ ok(v2.first_block == 3, "v2.first_block got %ld expected 3\n",
+ (long)v2.first_block);
+ ok(v2.early_size == 5, "v2.early_size got %ld expected 5\n",
+ (long)v2.early_size);
+
+ SET_EXPECT(concurrent_vector_int_destroy);
+ size = (size_t)call_func2(p_vector_base_v4__Internal_clear,
+ &v2, concurrent_vector_int_destroy);
+ concurrent_vector_int_dtor(&v2);
+
SET_EXPECT(concurrent_vector_int_destroy);
size = (size_t)call_func2(p_vector_base_v4__Internal_clear,
&vector, concurrent_vector_int_destroy);
@@ -2759,6 +2806,7 @@ static void test_vector_base_v4(void)
(long)vector.early_size);
concurrent_vector_int_dtor(&vector);
+ ok(!vector_elem_count, "vector_elem_count = %d, expected 0\n", vector_elem_count);
ok(!vector_alloc_count, "vector_alloc_count = %d, expected 0\n", vector_alloc_count);
}
--
2.11.0
June 15, 2018
Re: [PATCH] gdiplus: Check return value of SelectClipPath in brush_fill_path().
by Vincent Povirk
It looks like we also encountered this case in get_path_hrgn. Maybe we
shouldn't call brush_fill_pixels if the path is empty? If we're going
to ignore errors, I think we should at least check GetLastError() to
make sure it's one we expect.
On Fri, Jun 15, 2018 at 4:04 AM, Zhiyi Zhang <zzhang(a)codeweavers.com> wrote:
> For Crossover bug 16126.
>
> When GraphicPath is empty, filling path with gdi32 will
> result in a DC with empty path. When SelectClipPath() is
> called with such a DC, it will fail because it requires
> a closed path in DC. Thus further operation should be canceled.
>
> Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
> ---
> dlls/gdiplus/graphics.c | 5 +++--
> 1 file changed, 3 insertions(+), 2 deletions(-)
>
> diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c
> index 76aabe74bf..2a95d686fa 100644
> --- a/dlls/gdiplus/graphics.c
> +++ b/dlls/gdiplus/graphics.c
> @@ -1052,6 +1052,7 @@ static BOOL brush_can_fill_path(GpBrush *brush, BOOL is_fill)
>
> static void brush_fill_path(GpGraphics *graphics, GpBrush* brush)
> {
> + BOOL success;
> switch (brush->bt)
> {
> case BrushTypeSolidColor:
> @@ -1064,8 +1065,8 @@ static void brush_fill_path(GpGraphics *graphics, GpBrush* brush)
> RECT rc;
> /* partially transparent fill */
>
> - SelectClipPath(graphics->hdc, RGN_AND);
> - if (GetClipBox(graphics->hdc, &rc) != NULLREGION)
> + success = SelectClipPath(graphics->hdc, RGN_AND);
> + if (success && GetClipBox(graphics->hdc, &rc) != NULLREGION)
> {
> HDC hdc = CreateCompatibleDC(NULL);
>
> --
> 2.17.1
>
>
>
June 15, 2018
Re: [PATCH] msvcp120: Add test for concurrent_vector_copy.
by Piotr Caban
Hi Hua,
On 06/15/18 15:47, Hua Meng wrote:
> +static void (__thiscall *p_vector_base_v4__Internal_copy)(
> + vector_base_v4*, void (__cdecl*)(void*, size_t));
This doesn't match _Internal_copy header. It also breaks 64-bit compilation:
dlls/msvcp120/tests/msvcp120.c:2784:16: error: too many arguments to
function 'p_vector_base_v4__Internal_copy'
Thanks,
Piotr
June 15, 2018
Re: [PATCH] msvcp120: Add test for concurrent_vector_copy.
by Marvin
Hi,
While running your changed tests on Windows, I think I found new failures.
Being a bot and all I'm not very good at pattern recognition, so I might be
wrong, but could you please double-check?
Full results can be found at
https://testbot.winehq.org/JobDetails.pl?Key=39157
Your paranoid android.
=== build (build) ===
Rebuild of 64-bit crossbuild failed
June 15, 2018
[PATCH] msvcp120: Add test for concurrent_vector_copy.
by Hua Meng
Signed-off-by: Hua meng <161220092(a)smail.nju.edu.cn>
---
dlls/msvcp120/tests/msvcp120.c | 50 +++++++++++++++++++++++++++++++++++++++++-
1 file changed, 49 insertions(+), 1 deletion(-)
diff --git a/dlls/msvcp120/tests/msvcp120.c b/dlls/msvcp120/tests/msvcp120.c
index 1247222..fee012d 100644
--- a/dlls/msvcp120/tests/msvcp120.c
+++ b/dlls/msvcp120/tests/msvcp120.c
@@ -26,6 +26,7 @@
DWORD expect_idx;
static int vector_alloc_count;
+static int vector_elem_count;
#define DEFINE_EXPECT(func) \
BOOL expect_ ## func, called_ ## func
@@ -38,6 +39,7 @@ struct expect_struct {
DEFINE_EXPECT(queue_char__Assign_and_destroy_item);
DEFINE_EXPECT(concurrent_vector_int_alloc);
DEFINE_EXPECT(concurrent_vector_int_destroy);
+ DEFINE_EXPECT(concurrent_vector_int_copy);
};
#define SET_EXPECT(func) \
@@ -110,6 +112,8 @@ static void * (WINAPI *call_thiscall_func1)( void *func, void *this );
static void * (WINAPI *call_thiscall_func2)( void *func, void *this, const void *a );
static void * (WINAPI *call_thiscall_func3)( void *func, void *this, const void *a,
const void *b );
+static void * (WINAPI *call_thiscall_func4)( void *func, void *this, const void *a,
+ const void *b, const void *c );
static void init_thiscall_thunk(void)
{
@@ -123,18 +127,22 @@ static void init_thiscall_thunk(void)
call_thiscall_func1 = (void *)thunk;
call_thiscall_func2 = (void *)thunk;
call_thiscall_func3 = (void *)thunk;
+ call_thiscall_func4 = (void *)thunk;
}
#define call_func1(func,_this) call_thiscall_func1(func,_this)
#define call_func2(func,_this,a) call_thiscall_func2(func,_this,(const void*)(a))
#define call_func3(func,_this,a,b) call_thiscall_func3(func,_this,(const void*)(a),\
(const void*)(b))
+#define call_func4(func,_this,a,b,c) call_thiscall_func4(func,_this,(const void*)(a),\
+ (const void*)(b),(const void*)(c))
#else
#define init_thiscall_thunk()
#define call_func1(func,_this) func(_this)
#define call_func2(func,_this,a) func(_this,a)
#define call_func3(func,_this,a,b) func(_this,a,b)
+#define call_func4(func,_this,a,b,c) func(_this,a,b,c)
#endif /* __i386__ */
static inline float __port_infinity(void)
@@ -382,6 +390,8 @@ static void* (__thiscall *p_vector_base_v4__Internal_push_back)(
vector_base_v4*, size_t, size_t*);
static size_t (__thiscall *p_vector_base_v4__Internal_clear)(
vector_base_v4*, void (__cdecl*)(void*, size_t));
+static void (__thiscall *p_vector_base_v4__Internal_copy)(
+ vector_base_v4*, void (__cdecl*)(void*, size_t));
static HMODULE msvcp;
#define SETNOFAIL(x,y) x = (void*)GetProcAddress(msvcp,y)
@@ -524,6 +534,8 @@ static BOOL init(void)
"?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KAEA_K(a)Z");
SET(p_vector_base_v4__Internal_clear,
"?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_KP6AXPEAX_K(a)Z@Z");
+ SET(p_vector_base_v4__Internal_copy,
+ "?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAXPEBX1@Z(a)Z");
} else {
SET(p_tr2_sys__File_size,
"?_File_size(a)sys@tr2(a)std@@YA_KPBD(a)Z");
@@ -635,6 +647,8 @@ static BOOL init(void)
"?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIAAI(a)Z");
SET(p_vector_base_v4__Internal_clear,
"?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIP6AXPAXI(a)Z@Z");
+ SET(p_vector_base_v4__Internal_copy,
+ "?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXPBXI@Z(a)Z");
#else
SET(p__Thrd_current,
"_Thrd_current");
@@ -674,6 +688,8 @@ static BOOL init(void)
"?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAPAXIAAI(a)Z");
SET(p_vector_base_v4__Internal_clear,
"?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAIP6AXPAXI(a)Z@Z");
+ SET(p_vector_base_v4__Internal_copy,
+ "?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXABV123(a)IP6AXPAXPBXI@Z(a)Z");
#endif
}
SET(p__Thrd_equal,
@@ -2459,6 +2475,8 @@ static void* __cdecl concurrent_vector_int_alloc(vector_base_v4 *this, size_t n)
static void __cdecl concurrent_vector_int_destroy(void *ptr, size_t n)
{
CHECK_EXPECT2(concurrent_vector_int_destroy);
+ ok(vector_elem_count >= n, "invalid destroy\n");
+ vector_elem_count -= n;
memset(ptr, 0xff, sizeof(int)*n);
}
@@ -2484,6 +2502,13 @@ static void concurrent_vector_int_dtor(vector_base_v4 *this)
call_func1(p_vector_base_v4_dtor, this);
}
+static void __cdecl concurrent_vector_int_copy(void *dst, const void *src, size_t n)
+{
+ CHECK_EXPECT2(concurrent_vector_int_copy);
+ vector_elem_count += n;
+ memcpy(dst, src, n*sizeof(int));
+}
+
static void test_queue_base_v4(void)
{
queue_base_v4 queue;
@@ -2677,7 +2702,7 @@ static void test_queue_base_v4(void)
static void test_vector_base_v4(void)
{
- vector_base_v4 vector;
+ vector_base_v4 vector, v2;
size_t idx, size;
int *data;
@@ -2695,6 +2720,7 @@ static void test_vector_base_v4(void)
CHECK_CALLED(concurrent_vector_int_alloc);
ok(data != NULL, "_Internal_push_back returned NULL\n");
ok(idx == 0, "idx got %ld expected %d\n", (long)idx, 0);
+ vector_elem_count++;
*data = 1;
ok(data == vector.storage[0], "vector.storage[0] got %p expected %p\n",
vector.storage[0], data);
@@ -2709,6 +2735,7 @@ static void test_vector_base_v4(void)
data = call_func3(p_vector_base_v4__Internal_push_back, &vector, sizeof(int), &idx);
ok(data != NULL, "_Internal_push_back returned NULL\n");
ok(idx == 1, "idx got %ld expected 1\n", (long)idx);
+ vector_elem_count++;
*data = 2;
ok(vector.first_block == 1, "vector.first_block got %ld expected 1\n",
(long)vector.first_block);
@@ -2723,6 +2750,7 @@ static void test_vector_base_v4(void)
CHECK_CALLED(concurrent_vector_int_alloc);
ok(data != NULL, "_Internal_push_back returned NULL\n");
ok(idx == 2, "idx got %ld expected 2\n", (long)idx);
+ vector_elem_count++;
*data = 3;
ok(vector.first_block == 1, "vector.first_block got %ld expected 1\n",
(long)vector.first_block);
@@ -2735,6 +2763,7 @@ static void test_vector_base_v4(void)
data = call_func3(p_vector_base_v4__Internal_push_back, &vector, sizeof(int), &idx);
ok(data != NULL, "_Internal_push_back returned NULL\n");
ok(idx == 3, "idx got %ld expected 3\n", (long)idx);
+ vector_elem_count++;
*data = 4;
size = (size_t)call_func1(p_vector_base_v4__Internal_capacity, &vector);
ok(size == 4, "size of vector got %ld expected 4\n", (long)size);
@@ -2744,10 +2773,28 @@ static void test_vector_base_v4(void)
CHECK_CALLED(concurrent_vector_int_alloc);
ok(data != NULL, "_Internal_push_back returned NULL\n");
ok(idx == 4, "idx got %ld expected 2\n", (long)idx);
+ vector_elem_count++;
*data = 5;
size = (size_t)call_func1(p_vector_base_v4__Internal_capacity, &vector);
ok(size == 8, "size of vector got %ld expected 8\n", (long)size);
+ concurrent_vector_int_ctor(&v2);
+ SET_EXPECT(concurrent_vector_int_alloc);
+ SET_EXPECT(concurrent_vector_int_copy);
+ call_func4(p_vector_base_v4__Internal_copy, &v2, &vector,
+ sizeof(int), concurrent_vector_int_copy);
+ CHECK_CALLED(concurrent_vector_int_alloc);
+ CHECK_CALLED(concurrent_vector_int_copy);
+ ok(v2.first_block == 3, "v2.first_block got %ld expected 3\n",
+ (long)v2.first_block);
+ ok(v2.early_size == 5, "v2.early_size got %ld expected 5\n",
+ (long)v2.early_size);
+
+ SET_EXPECT(concurrent_vector_int_destroy);
+ size = (size_t)call_func2(p_vector_base_v4__Internal_clear,
+ &v2, concurrent_vector_int_destroy);
+ concurrent_vector_int_dtor(&v2);
+
SET_EXPECT(concurrent_vector_int_destroy);
size = (size_t)call_func2(p_vector_base_v4__Internal_clear,
&vector, concurrent_vector_int_destroy);
@@ -2759,6 +2806,7 @@ static void test_vector_base_v4(void)
(long)vector.early_size);
concurrent_vector_int_dtor(&vector);
+ ok(!vector_elem_count, "vector_elem_count = %d, expected 0\n", vector_elem_count);
ok(!vector_alloc_count, "vector_alloc_count = %d, expected 0\n", vector_alloc_count);
}
--
2.11.0
June 15, 2018
Re: [PATCH v3] comctl32/taskdialog: Add support for progress bar.
by Nikolay Sivov
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
June 15, 2018
[PATCH] testbot/web: Escape the filenames on the activity page.
by Francois Gouget
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
testbot/web/Activity.pl | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/testbot/web/Activity.pl b/testbot/web/Activity.pl
index 8b1fd6dc5..512401751 100644
--- a/testbot/web/Activity.pl
+++ b/testbot/web/Activity.pl
@@ -215,7 +215,7 @@ EOF
}
else
{
- $Label .= " ". $VMStatus->{step}->FileName;
+ $Label .= " ". $self->escapeHTML($VMStatus->{step}->FileName);
if ($VMStatus->{task}->CmdLineArg =~ /^\w+$/ and
$Label =~ s/_(?:cross)?test(64)?\.exe$//)
{
--
2.17.1
June 15, 2018
Re: [PATCH] d3dx9/tests: Add initial tests for ID3DXFont::DrawText().
by Alexandre Julliard
Matteo Bruni <mbruni(a)codeweavers.com> writes:
> From: Kieran Duggan <kieranduggan15(a)gmail.com>
>
> Signed-off-by: Kieran Duggan <kieranduggan15(a)gmail.com>
> Signed-off-by: Matteo Bruni <mbruni(a)codeweavers.com>
> ---
> dlls/d3dx9_36/tests/core.c | 81 +++++++++++++++++++++++++++++++++++-----------
> 1 file changed, 62 insertions(+), 19 deletions(-)
The tests fail:
../../../tools/runtest -q -P wine -T ../../.. -M d3dx9_36.dll -p d3dx9_36_test.exe.so core && touch core.ok
core.c:612: Test failed: Got unexpected height 1.
core.c:614: Test failed: Got unexpected height 1.
core.c:616: Test failed: Got unexpected height 1.
core.c:619: Test failed: Got unexpected height 1.
core.c:624: Test failed: Got unexpected height 1.
core.c:627: Test failed: Got unexpected rect right 0.
core.c:628: Test failed: Got unexpected rect bottom 0.
core.c:612: Test failed: Got unexpected height 1.
core.c:614: Test failed: Got unexpected height 1.
core.c:616: Test failed: Got unexpected height 1.
core.c:619: Test failed: Got unexpected height 1.
core.c:624: Test failed: Got unexpected height 1.
core.c:627: Test failed: Got unexpected rect right 0.
core.c:628: Test failed: Got unexpected rect bottom 0.
core.c:612: Test failed: Got unexpected height 1.
core.c:614: Test failed: Got unexpected height 1.
core.c:616: Test failed: Got unexpected height 1.
core.c:619: Test failed: Got unexpected height 1.
core.c:624: Test failed: Got unexpected height 1.
core.c:627: Test failed: Got unexpected rect right 0.
core.c:628: Test failed: Got unexpected rect bottom 0.
core.c:612: Test failed: Got unexpected height 1.
core.c:614: Test failed: Got unexpected height 1.
core.c:616: Test failed: Got unexpected height 1.
core.c:619: Test failed: Got unexpected height 1.
core.c:624: Test failed: Got unexpected height 1.
core.c:627: Test failed: Got unexpected rect right 0.
core.c:628: Test failed: Got unexpected rect bottom 0.
core.c:612: Test failed: Got unexpected height 1.
core.c:614: Test failed: Got unexpected height 1.
core.c:616: Test failed: Got unexpected height 1.
core.c:619: Test failed: Got unexpected height 1.
core.c:624: Test failed: Got unexpected height 1.
core.c:627: Test failed: Got unexpected rect right 0.
core.c:628: Test failed: Got unexpected rect bottom 0.
Makefile:234: recipe for target 'core.ok' failed
make[1]: *** [core.ok] Error 35
--
Alexandre Julliard
julliard(a)winehq.org
June 15, 2018
[PATCH] po: Update Russian translation.
by Nikolay Sivov
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
po/ru.po | 16 +++++++---------
1 file changed, 7 insertions(+), 9 deletions(-)
diff --git a/po/ru.po b/po/ru.po
index b973cae0f5..3fb6927e7b 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -5,14 +5,14 @@ msgstr ""
"Project-Id-Version: Wine\n"
"Report-Msgid-Bugs-To: https://bugs.winehq.org\n"
"POT-Creation-Date: N/A\n"
-"PO-Revision-Date: 2018-05-10 08:12+0300\n"
+"PO-Revision-Date: 2018-06-15 13:16+0300\n"
"Last-Translator: Nikolay Sivov <nsivov(a)codeweavers.com>\n"
"Language-Team: Russian\n"
"Language: ru\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 2.0.7\n"
+"X-Generator: Poedit 2.0.8\n"
#: appwiz.rc:58
msgid "Install/Uninstall"
@@ -3697,19 +3697,19 @@ msgstr "Ожидается объект типа «Array»"
msgid ""
"'writable' attribute on the property descriptor cannot be set to 'true' on "
"this object"
-msgstr ""
+msgstr "Невозможно установить атрибут «writable» в «true» для этого объекта"
#: jscript.rc:70
msgid "Cannot redefine non-configurable property '|'"
-msgstr ""
+msgstr "Невозможно переопределить ненастраиваемое свойство «|»"
#: jscript.rc:71
msgid "Cannot modify non-writable property '|'"
-msgstr ""
+msgstr "Невозможно изменить свойство «|»"
#: jscript.rc:72
msgid "Property cannot have both accessors and a value"
-msgstr ""
+msgstr "Свойство не может одновременно иметь методы для доступа и значение"
#: ../../include/wine/wine_common_ver.rc:129
msgid "Wine kernel DLL"
@@ -12801,10 +12801,8 @@ msgid "Confirm Value Delete"
msgstr "Подтверждение удаления значения"
#: regedit.rc:210
-#, fuzzy
-#| msgid "Are you sure you want to delete the registry value '%1'?"
msgid "Are you sure you want to delete the selected registry value?"
-msgstr "Вы точно хотите удалить параметр реестра «%1»?"
+msgstr "Вы точно хотите удалить выбранный параметр реестра?"
#: regedit.rc:216
msgid "Search complete. The string '%1' was not found."
--
2.17.1
June 15, 2018
[PATCH] testbot/WineRunTask: Rename a TakeScreenshot() parameter.
by Francois Gouget
It had the same name as a global variable which made the code a bit
confusing.
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
testbot/bin/WineRunTask.pl | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/testbot/bin/WineRunTask.pl b/testbot/bin/WineRunTask.pl
index 8f5cb268c..90008f035 100755
--- a/testbot/bin/WineRunTask.pl
+++ b/testbot/bin/WineRunTask.pl
@@ -71,14 +71,14 @@ sub Error(@)
sub TakeScreenshot($$)
{
- my ($VM, $FullScreenshotFileName) = @_;
+ my ($VM, $FileName) = @_;
my $Domain = $VM->GetDomain();
my ($ErrMessage, $ImageSize, $ImageBytes) = $Domain->CaptureScreenImage();
if (!defined $ErrMessage)
{
my $OldUMask = umask(002);
- if (open(my $Screenshot, ">", $FullScreenshotFileName))
+ if (open(my $Screenshot, ">", $FileName))
{
print $Screenshot $ImageBytes;
close($Screenshot);
--
2.17.1
June 15, 2018
[PATCH] testbot/web: Remove the live screenshot code.
by Francois Gouget
When 'live snapshots' are supported again it will likely
be in a different form so remove the cruft.
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
testbot/web/JobDetails.pl | 24 +-----------------------
1 file changed, 1 insertion(+), 23 deletions(-)
diff --git a/testbot/web/JobDetails.pl b/testbot/web/JobDetails.pl
index 3e638f717..70d8b5983 100644
--- a/testbot/web/JobDetails.pl
+++ b/testbot/web/JobDetails.pl
@@ -257,30 +257,8 @@ sub GenerateBody($)
my $Screenshot = $self->GetParam($ScreenshotParamName);
$Screenshot = "" if ($Screenshot ne "1");
-
print "<div class='TaskMoreInfoLinks'>\n";
- # FIXME: Disable live screenshots for now
- if (0 && $StepTask->Status eq "running" &&
- ($StepTask->Type eq "single" || $StepTask->Type eq "suite"))
- {
- if ($Screenshot)
- {
- my $URI = "/Screenshot.pl?VMName=" . uri_escape($VM->Name);
- print "<div class='Screenshot'><img src='" .
- $self->CGI->escapeHTML($URI) . "' alt='Screenshot' /></div>\n";
- }
- else
- {
- my $URI = $ENV{"SCRIPT_NAME"} . "?Key=" . uri_escape($self->{JobId}) .
- "&$ScreenshotParamName=1";
- $URI .= "#k" . uri_escape($Key);
- print "<div class='TaskMoreInfoLink'><a href='" .
- $self->CGI->escapeHTML($URI) .
- "'>Show live screenshot</a></div>";
- print "\n";
- }
- }
- elsif (-r "$TaskDir/screenshot.png")
+ if (-r "$TaskDir/screenshot.png")
{
if ($Screenshot)
{
--
2.17.1
June 15, 2018
[PATCH] testbot/bin: Remove some global variables.
by Francois Gouget
The variable names are longer than the values they replace and
make the code less readable due to the extra indirection.
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
testbot/bin/WineRunBuild.pl | 15 ++++++---------
testbot/bin/WineRunReconfig.pl | 15 ++++++---------
testbot/bin/WineRunTask.pl | 26 +++++++++++---------------
3 files changed, 23 insertions(+), 33 deletions(-)
diff --git a/testbot/bin/WineRunBuild.pl b/testbot/bin/WineRunBuild.pl
index 96d9321b8..eab33bc08 100755
--- a/testbot/bin/WineRunBuild.pl
+++ b/testbot/bin/WineRunBuild.pl
@@ -162,15 +162,12 @@ if (!defined $Task)
Error "Step $StepNo task $TaskNo of job $JobId does not exist\n";
exit 1;
}
-
my $OldUMask = umask(002);
my $TaskDir = $Task->CreateDir();
umask($OldUMask);
-my $FullLogFileName = "$TaskDir/log";
-my $FullErrFileName = "$TaskDir/err";
-
my $VM = $Task->VM;
+
my $Start = Time();
LogMsg "Task $JobId/$StepNo/$TaskNo started\n";
@@ -185,14 +182,14 @@ sub LogTaskError($)
Debug("$Name0:error: ", $ErrMessage);
my $OldUMask = umask(002);
- if (open(my $ErrFile, ">>", $FullErrFileName))
+ if (open(my $ErrFile, ">>", "$TaskDir/err"))
{
print $ErrFile $ErrMessage;
close($ErrFile);
}
else
{
- Error "Unable to open '$FullErrFileName' for writing: $!\n";
+ Error "Unable to open 'err' for writing: $!\n";
}
umask($OldUMask);
}
@@ -391,10 +388,10 @@ if (!defined $TA->Wait($Pid, $Task->Timeout, 60))
}
}
-Debug(Elapsed($Start), " Retrieving the build log to '$FullLogFileName'\n");
-if ($TA->GetFile("Build.log", $FullLogFileName))
+Debug(Elapsed($Start), " Retrieving 'Build.log'\n");
+if ($TA->GetFile("Build.log", "$TaskDir/log"))
{
- if (open(my $LogFile, "<", $FullLogFileName))
+ if (open(my $LogFile, "<", "$TaskDir/log"))
{
# Collect and analyze the 'Build:' status line(s)
$ErrMessage ||= "";
diff --git a/testbot/bin/WineRunReconfig.pl b/testbot/bin/WineRunReconfig.pl
index 4fb34a07d..e7b447e92 100755
--- a/testbot/bin/WineRunReconfig.pl
+++ b/testbot/bin/WineRunReconfig.pl
@@ -161,14 +161,11 @@ if (!defined $Task)
Error "Step $StepNo task $TaskNo of job $JobId does not exist\n";
exit 1;
}
-
my $OldUMask = umask(002);
my $TaskDir = $Task->CreateDir();
umask($OldUMask);
-
my $VM = $Task->VM;
-my $FullLogFileName = "$TaskDir/log";
-my $FullErrFileName = "$TaskDir/err";
+
my $Start = Time();
LogMsg "Task $JobId/$StepNo/$TaskNo started\n";
@@ -184,14 +181,14 @@ sub LogTaskError($)
Debug("$Name0:error: ", $ErrMessage);
my $OldUMask = umask(002);
- if (open(my $ErrFile, ">>", $FullErrFileName))
+ if (open(my $ErrFile, ">>", "$TaskDir/err"))
{
print $ErrFile $ErrMessage;
close($ErrFile);
}
else
{
- Error "Unable to open '$FullErrFileName' for writing: $!\n";
+ Error "Unable to open 'err' for writing: $!\n";
}
umask($OldUMask);
}
@@ -373,10 +370,10 @@ if (!defined $TA->Wait($Pid, $Task->Timeout, 60))
}
}
-Debug(Elapsed($Start), " Retrieving the reconfig log to '$FullLogFileName'\n");
-if ($TA->GetFile("Reconfig.log", $FullLogFileName))
+Debug(Elapsed($Start), " Retrieving 'Reconfig.log'\n");
+if ($TA->GetFile("Reconfig.log", "$TaskDir/log"))
{
- if (open(my $LogFile, "<", $FullLogFileName))
+ if (open(my $LogFile, "<", "$TaskDir/log"))
{
# Collect and analyze the 'Reconfig:' status line(s).
my $LogErrors;
diff --git a/testbot/bin/WineRunTask.pl b/testbot/bin/WineRunTask.pl
index 90008f035..15f8752fb 100755
--- a/testbot/bin/WineRunTask.pl
+++ b/testbot/bin/WineRunTask.pl
@@ -191,17 +191,13 @@ if (!defined $Task)
Error "Step $StepNo task $TaskNo of job $JobId does not exist\n";
exit 1;
}
-
my $OldUMask = umask(002);
my $TaskDir = $Task->CreateDir();
umask($OldUMask);
-my $FullLogFileName = "$TaskDir/log";
-my $FullErrFileName = "$TaskDir/err";
-my $FullScreenshotFileName = "$TaskDir/screenshot.png";
-
my $VM = $Task->VM;
my $RptFileName = $VM->Name . ".rpt";
+
my $Start = Time();
LogMsg "Task $JobId/$StepNo/$TaskNo started\n";
@@ -216,14 +212,14 @@ sub LogTaskError($)
Debug("$Name0:error: ", $ErrMessage);
my $OldUMask = umask(002);
- if (open(my $ErrFile, ">>", $FullErrFileName))
+ if (open(my $ErrFile, ">>", "$TaskDir/err"))
{
print $ErrFile $ErrMessage;
close($ErrFile);
}
else
{
- Error "Unable to open '$FullErrFileName' for writing: $!\n";
+ Error "Unable to open 'err' for writing: $!\n";
}
umask($OldUMask);
}
@@ -237,7 +233,7 @@ sub WrapUpAndExit($;$$$)
$Timeout ? "timeout" : "";
Debug(Elapsed($Start), " Taking a screenshot\n");
- TakeScreenshot($VM, $FullScreenshotFileName);
+ TakeScreenshot($VM, "$TaskDir/screenshot.png");
my $Tries = $Task->TestFailures || 0;
if ($Retry)
@@ -299,9 +295,9 @@ sub WrapUpAndExit($;$$$)
my $LatestBaseName = join("", "$DataDir/latest/", $Task->VM->Name, "_",
$Step->FileType eq "exe64" ? "64" : "32");
unlink("$LatestBaseName.log");
- link($FullLogFileName, "$LatestBaseName.log") if (-f $FullLogFileName);
+ link("$TaskDir/log", "$LatestBaseName.log") if (-f "$TaskDir/log");
unlink("$LatestBaseName.err");
- link($FullErrFileName, "$LatestBaseName.err") if (-f $FullErrFileName);
+ link("$TaskDir/err", "$LatestBaseName.err") if (-f "$TaskDir/err");
}
my $Result = $VM->Name .": ". $VM->Status ." Status: $Status Failures: ". (defined $TestFailures ? $TestFailures : "unset");
@@ -516,11 +512,11 @@ if (!defined $TA->Wait($Pid, $Timeout, $Keepalive))
}
my $TimedOut;
-Debug(Elapsed($Start), " Retrieving the report file to '$FullLogFileName'\n");
-if ($TA->GetFile($RptFileName, $FullLogFileName))
+Debug(Elapsed($Start), " Retrieving the report file to 'log'\n");
+if ($TA->GetFile($RptFileName, "$TaskDir/log"))
{
- chmod 0664, $FullLogFileName;
- if (open(my $LogFile, "<", $FullLogFileName))
+ chmod 0664, "$TaskDir/log";
+ if (open(my $LogFile, "<", "$TaskDir/log"))
{
# There is more than one test unit when running the full test suite so keep
# track of the current one. Note that for the TestBot we don't count or
@@ -786,7 +782,7 @@ if ($TA->GetFile($RptFileName, $FullLogFileName))
else
{
$NewStatus = 'boterror';
- Error "Unable to open '$FullLogFileName' for reading: $!\n";
+ Error "Unable to open 'log' for reading: $!\n";
LogTaskError("Unable to open the log file for reading: $!\n");
}
}
--
2.17.1
June 15, 2018
[PATCH] testbot: Simplify passing the Job URL to WineTest.
by Francois Gouget
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
testbot/bin/WineRunTask.pl | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/testbot/bin/WineRunTask.pl b/testbot/bin/WineRunTask.pl
index 15f8752fb..3b0ccbc4a 100755
--- a/testbot/bin/WineRunTask.pl
+++ b/testbot/bin/WineRunTask.pl
@@ -448,8 +448,7 @@ elsif ($Step->Type eq "suite")
if (defined($WebHostName))
{
my $StepTask = 100 * $StepNo + $TaskNo;
- $Script .= '-u "http://' . $WebHostName . "/JobDetails.pl?Key=" .
- $JobId . "&scrshot_" . $StepTask . "=1#k" . $StepTask . '" ';
+ $Script .= "-u \"http://$WebHostName/JobDetails.pl?Key=$JobId&scrshot_$StepTask=1#k$StepTask\"";
}
my $Info = $VM->Description ? $VM->Description : "";
if ($VM->Details)
--
2.17.1
June 15, 2018
[PATCH] gdiplus: Check return value of SelectClipPath in brush_fill_path().
by Zhiyi Zhang
For Crossover bug 16126.
When GraphicPath is empty, filling path with gdi32 will
result in a DC with empty path. When SelectClipPath() is
called with such a DC, it will fail because it requires
a closed path in DC. Thus further operation should be canceled.
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
---
dlls/gdiplus/graphics.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c
index 76aabe74bf..2a95d686fa 100644
--- a/dlls/gdiplus/graphics.c
+++ b/dlls/gdiplus/graphics.c
@@ -1052,6 +1052,7 @@ static BOOL brush_can_fill_path(GpBrush *brush, BOOL is_fill)
static void brush_fill_path(GpGraphics *graphics, GpBrush* brush)
{
+ BOOL success;
switch (brush->bt)
{
case BrushTypeSolidColor:
@@ -1064,8 +1065,8 @@ static void brush_fill_path(GpGraphics *graphics, GpBrush* brush)
RECT rc;
/* partially transparent fill */
- SelectClipPath(graphics->hdc, RGN_AND);
- if (GetClipBox(graphics->hdc, &rc) != NULLREGION)
+ success = SelectClipPath(graphics->hdc, RGN_AND);
+ if (success && GetClipBox(graphics->hdc, &rc) != NULLREGION)
{
HDC hdc = CreateCompatibleDC(NULL);
--
2.17.1
June 15, 2018
Re: [PATCH v5 4/8] ntdll: Return BIOS info from NtQuerySystemInformation on Linux
by Huw Davies
On Fri, Jun 15, 2018 at 12:59:10AM -0600, Alex Henrie wrote:
> Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
> ---
> dlls/ntdll/nt.c | 174 ++++++++++++++++++++++++++++++++++++++++
> dlls/ntdll/tests/info.c | 14 ++--
> 2 files changed, 182 insertions(+), 6 deletions(-)
>
> diff --git a/dlls/ntdll/nt.c b/dlls/ntdll/nt.c
> index dc0ce04f42..658970b051 100644
> --- a/dlls/ntdll/nt.c
> +++ b/dlls/ntdll/nt.c
> @@ -66,6 +66,35 @@
>
> WINE_DEFAULT_DEBUG_CHANNEL(ntdll);
>
> +#include "pshpack1.h"
> +
> +struct smbios_prologue {
> + BYTE calling_method;
> + BYTE major_version;
> + BYTE minor_version;
> + BYTE revision;
> + DWORD length;
> +};
> +
> +struct smbios_bios {
> + BYTE type;
> + BYTE length;
> + WORD handle;
> + BYTE vendor;
> + BYTE version;
> + WORD start;
> + BYTE date;
> + BYTE size;
> + UINT64 characteristics;
> +};
> +
> +#include "poppack.h"
> +
> +/* Firmware table providers */
> +#define ACPI 0x41435049
> +#define FIRM 0x4649524D
> +#define RSMB 0x52534D42
> +
> /*
> * Token
> */
> @@ -1850,6 +1879,129 @@ static NTSTATUS create_logical_proc_info(SYSTEM_LOGICAL_PROCESSOR_INFORMATION **
> }
> #endif
>
> +static inline void copy_smbios_string(char **buffer, char *string, size_t string_size)
> +{
> + if (!string) return;
> + strcpy(*buffer, string);
> + *buffer += string_size;
> +}
> +
> +#ifdef linux
> +
> +static char* get_smbios_string(const char *path, size_t *string_size)
> +{
> + FILE *file = fopen(path, "r");
> + char *ret = NULL;
> + *string_size = 0;
> + if (file)
> + {
> + *string_size = getline(&ret, string_size, file) + 1;
I'm not sure we want to use malloc based functions here.
fgets() using a fixed-size buffer with a sensibly chosen size should
be fine.
> + fclose(file);
> + if (*string_size >= 2 && ret[*string_size - 2] == '\n')
> + {
> + ret[*string_size - 2] = 0;
> + (*string_size)--;
> + }
> + if (*string_size == 1)
> + {
> + free(ret);
> + ret = NULL;
> + *string_size = 0;
> + }
> + }
> + return ret;
> +}
> +
> +static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti,
> + ULONG available_len, ULONG *required_len)
> +{
> + switch (sfti->ProviderSignature)
> + {
> + case RSMB:
> + {
> + char *bios_vendor, *bios_version, *bios_date;
> + size_t bios_vendor_size, bios_version_size, bios_date_size;
> + char *buffer = (char*)sfti->TableBuffer;
> + BYTE string_count;
> + struct smbios_prologue *prologue;
> + struct smbios_bios *bios;
> +
> + bios_vendor = get_smbios_string("/sys/class/dmi/id/bios_vendor", &bios_vendor_size);
> + bios_version = get_smbios_string("/sys/class/dmi/id/bios_version", &bios_version_size);
> + bios_date = get_smbios_string("/sys/class/dmi/id/bios_date", &bios_date_size);
> +
> + *required_len = FIELD_OFFSET(SYSTEM_FIRMWARE_TABLE_INFORMATION, TableBuffer);
> +
> + *required_len += sizeof(struct smbios_prologue);
> +
> + *required_len += sizeof(struct smbios_bios);
> + *required_len += max(bios_vendor_size + bios_version_size + bios_date_size + 1, 2);
> +
> + if (available_len < *required_len)
> + {
> + return STATUS_BUFFER_TOO_SMALL;
> + }
> +
> + sfti->TableBufferLength = *required_len - FIELD_OFFSET(SYSTEM_FIRMWARE_TABLE_INFORMATION, TableBuffer);
> +
> + prologue = (struct smbios_prologue*)buffer;
> + prologue->calling_method = 0;
> + prologue->major_version = 2;
> + prologue->minor_version = 0;
> + prologue->revision = 0;
> + prologue->length = sfti->TableBufferLength - sizeof(struct smbios_prologue);
> + buffer += sizeof(struct smbios_prologue);
> +
> + string_count = 0;
> + bios = (struct smbios_bios*)buffer;
> + bios->type = 0;
> + bios->length = sizeof(struct smbios_bios);
> + bios->handle = 0;
> + bios->vendor = bios_vendor ? ++string_count : 0;
> + bios->version = bios_version ? ++string_count : 0;
> + bios->start = 0;
> + bios->date = bios_date ? ++string_count : 0;
> + bios->size = 0;
> + bios->characteristics = 0x4; /* not supported */
> + buffer += sizeof(struct smbios_bios);
> +
> + if (string_count)
> + {
> + copy_smbios_string(&buffer, bios_vendor, bios_vendor_size);
> + copy_smbios_string(&buffer, bios_version, bios_version_size);
> + copy_smbios_string(&buffer, bios_date, bios_date_size);
> + memset(buffer, 0, 1);
> + }
> + else
> + {
> + memset(buffer, 0, 2);
> + }
> +
> + free(bios_vendor);
> + free(bios_version);
> + free(bios_date);
> +
> + return STATUS_SUCCESS;
> + }
> + default:
> + {
> + return STATUS_NOT_IMPLEMENTED;
> + FIXME("info_class SYSTEM_FIRMWARE_TABLE_INFORMATION\n");
> + }
> + }
> +}
> +
> +#else
> +
> +static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti,
> + ULONG available_len, ULONG *required_len)
> +{
> + return STATUS_NOT_IMPLEMENTED;
> + FIXME("info_class SYSTEM_FIRMWARE_TABLE_INFORMATION\n");
> +}
> +
> +#endif
> +
> /******************************************************************************
> * NtQuerySystemInformation [NTDLL.@]
> * ZwQuerySystemInformation [NTDLL.@]
> @@ -2359,6 +2511,28 @@ NTSTATUS WINAPI NtQuerySystemInformation(
> else ret = STATUS_INFO_LENGTH_MISMATCH;
> }
> break;
> + case SystemFirmwareTableInformation:
> + {
> + SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti = (SYSTEM_FIRMWARE_TABLE_INFORMATION*)SystemInformation;
> + len = FIELD_OFFSET(SYSTEM_FIRMWARE_TABLE_INFORMATION, TableBuffer);
> + if (Length < len)
> + {
> + ret = STATUS_INFO_LENGTH_MISMATCH;
> + break;
> + }
> +
> + switch (sfti->Action)
> + {
> + case SystemFirmwareTable_Get:
> + ret = get_firmware_info(sfti, Length, &len);
> + break;
> + default:
> + len = 0;
> + ret = STATUS_NOT_IMPLEMENTED;
> + FIXME("info_class SYSTEM_FIRMWARE_TABLE_INFORMATION\n");
> + }
> + }
> + break;
> default:
> FIXME("(0x%08x,%p,0x%08x,%p) stub\n",
> SystemInformationClass,SystemInformation,Length,ResultLength);
> diff --git a/dlls/ntdll/tests/info.c b/dlls/ntdll/tests/info.c
> index cdb91e1b73..b8feebd474 100644
> --- a/dlls/ntdll/tests/info.c
> +++ b/dlls/ntdll/tests/info.c
> @@ -59,6 +59,12 @@ static DWORD one_before_last_pid = 0;
> #define FIRM 0x4649524D
> #define RSMB 0x52534D42
>
> +#ifdef linux
> +static const int firmware_todo = 0;
> +#else
> +static const int firmware_todo = 1;
> +#endif
> +
> static BOOL InitFunctionPtrs(void)
> {
> /* All needed functions are NT based, so using GetModuleHandle is a good check */
> @@ -840,13 +846,10 @@ static void test_query_firmware(void)
> ok(!!sfti, "Failed to allocate memory\n");
>
> status = pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, 15, &len1);
> -todo_wine
> ok(status == STATUS_INFO_LENGTH_MISMATCH, "Expected STATUS_INFO_LENGTH_MISMATCH, got %08x\n", status);
> -todo_wine
> ok(len1 == 16, "Expected length 16, got %u\n", len1);
>
> status = pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, 16, &len1);
> -todo_wine
> ok(status == STATUS_NOT_IMPLEMENTED, "Expected STATUS_NOT_IMPLEMENTED, got %08x\n", status);
> ok(len1 == 0, "Expected length 0, got %u\n", len1);
>
> @@ -854,16 +857,15 @@ todo_wine
> sfti->Action = SystemFirmwareTable_Get;
>
> status = pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, 16, &len1);
> -todo_wine
> +todo_wine_if(firmware_todo)
> ok(status == STATUS_BUFFER_TOO_SMALL, "Expected STATUS_BUFFER_TOO_SMALL, got %08x\n", status);
> -todo_wine
> ok(len1 >= 16, "Expected length >= 16, got %u\n", len1);
>
> sfti = HeapReAlloc(GetProcessHeap(), 0, sfti, len1);
> ok(!!sfti, "Failed to allocate memory\n");
>
> status = pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, len1, &len2);
> -todo_wine
> +todo_wine_if(firmware_todo)
> ok(status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %08x\n", status);
> ok(len2 == len1, "Expected length %u, got %u\n", len1, len2);
>
> --
> 2.17.1
>
>
>
June 15, 2018
Re: [PATCH v5 3/8] kernel32/tests: Add GetSystemFirmwareTable tests
by Huw Davies
On Fri, Jun 15, 2018 at 12:59:09AM -0600, Alex Henrie wrote:
> Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
> ---
> dlls/kernel32/tests/version.c | 42 +++++++++++++++++++++++++++++++++++
> 1 file changed, 42 insertions(+)
>
> diff --git a/dlls/kernel32/tests/version.c b/dlls/kernel32/tests/version.c
> index eb78a383d2..6ca45f0b2e 100644
> --- a/dlls/kernel32/tests/version.c
> +++ b/dlls/kernel32/tests/version.c
> @@ -26,11 +26,17 @@
> #include "winternl.h"
>
> static BOOL (WINAPI * pGetProductInfo)(DWORD, DWORD, DWORD, DWORD, DWORD *);
> +static NTSTATUS (WINAPI * pNtQuerySystemInformation)(SYSTEM_INFORMATION_CLASS, void *, ULONG, ULONG *);
> static NTSTATUS (WINAPI * pRtlGetVersion)(RTL_OSVERSIONINFOEXW *);
>
> #define GET_PROC(func) \
> p##func = (void *)GetProcAddress(hmod, #func);
>
> +/* Firmware table providers */
> +#define ACPI 0x41435049
> +#define FIRM 0x4649524D
> +#define RSMB 0x52534D42
> +
> static void init_function_pointers(void)
> {
> HMODULE hmod;
> @@ -41,6 +47,7 @@ static void init_function_pointers(void)
>
> hmod = GetModuleHandleA("ntdll.dll");
>
> + GET_PROC(NtQuerySystemInformation);
> GET_PROC(RtlGetVersion);
> }
>
> @@ -697,6 +704,40 @@ static void test_VerifyVersionInfo(void)
> ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError());
> }
>
> +void test_GetSystemFirmwareTable(void)
> +{
> + ULONG expected_len, i;
> + UINT len;
> + SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti = HeapAlloc(GetProcessHeap(), 0, 16);
> + UCHAR *smbios_table = NULL;
> +
> + ok(!!sfti, "Failed to allocate memory\n");
> + sfti->ProviderSignature = RSMB;
> + sfti->Action = SystemFirmwareTable_Get;
You need to initialize TableID.
> + pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, 16, &expected_len);
> + sfti = HeapReAlloc(GetProcessHeap(), 0, sfti, expected_len);
> + ok(!!sfti, "Failed to allocate memory\n");
> + pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, expected_len, &expected_len);
> +
> + expected_len -= 16;
> + len = GetSystemFirmwareTable(RSMB, 0, smbios_table, 0);
> +todo_wine
> + ok(len == expected_len, "Expected length %u, got %u\n", expected_len, len);
> +
> + smbios_table = HeapAlloc(GetProcessHeap(), 0, len);
> + len = GetSystemFirmwareTable(RSMB, 0, smbios_table, len);
> +todo_wine
> + ok(len == expected_len, "Expected length %u, got %u\n", expected_len, len);
> + for (i = 0; i < len; i++)
> + {
> + ok(smbios_table[i] == sfti->TableBuffer[i],
> + "Offset %u: Expected %02x, got %02x\n", i, sfti->TableBuffer[i], smbios_table[i]);
> + }
> +
> + HeapFree(GetProcessHeap(), 0, sfti);
> + HeapFree(GetProcessHeap(), 0, smbios_table);
> +}
> +
> START_TEST(version)
> {
> init_function_pointers();
> @@ -704,4 +745,5 @@ START_TEST(version)
> test_GetProductInfo();
> test_GetVersionEx();
> test_VerifyVersionInfo();
> + test_GetSystemFirmwareTable();
> }
> --
> 2.17.1
>
>
>
June 15, 2018
Re: [PATCH v5 2/8] ntdll/tests: Add SystemFirmwareTableInformation tests
by Huw Davies
On Fri, Jun 15, 2018 at 12:59:08AM -0600, Alex Henrie wrote:
> Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
> ---
> dlls/ntdll/tests/info.c | 48 +++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 48 insertions(+)
>
> diff --git a/dlls/ntdll/tests/info.c b/dlls/ntdll/tests/info.c
> index 6c93c3cd58..cdb91e1b73 100644
> --- a/dlls/ntdll/tests/info.c
> +++ b/dlls/ntdll/tests/info.c
> @@ -54,6 +54,11 @@ static DWORD one_before_last_pid = 0;
> } \
> } while(0)
>
> +/* Firmware table providers */
> +#define ACPI 0x41435049
> +#define FIRM 0x4649524D
> +#define RSMB 0x52534D42
> +
> static BOOL InitFunctionPtrs(void)
> {
> /* All needed functions are NT based, so using GetModuleHandle is a good check */
> @@ -826,6 +831,45 @@ static void test_query_logicalprocex(void)
> }
> }
>
> +static void test_query_firmware(void)
> +{
> + ULONG len1, len2;
> + NTSTATUS status;
> + SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 16);
> +
> + ok(!!sfti, "Failed to allocate memory\n");
> +
> + status = pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, 15, &len1);
> +todo_wine
> + ok(status == STATUS_INFO_LENGTH_MISMATCH, "Expected STATUS_INFO_LENGTH_MISMATCH, got %08x\n", status);
> +todo_wine
> + ok(len1 == 16, "Expected length 16, got %u\n", len1);
> +
> + status = pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, 16, &len1);
> +todo_wine
> + ok(status == STATUS_NOT_IMPLEMENTED, "Expected STATUS_NOT_IMPLEMENTED, got %08x\n", status);
> + ok(len1 == 0, "Expected length 0, got %u\n", len1);
> +
> + sfti->ProviderSignature = RSMB;
> + sfti->Action = SystemFirmwareTable_Get;
> +
> + status = pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, 16, &len1);
> +todo_wine
> + ok(status == STATUS_BUFFER_TOO_SMALL, "Expected STATUS_BUFFER_TOO_SMALL, got %08x\n", status);
> +todo_wine
> + ok(len1 >= 16, "Expected length >= 16, got %u\n", len1);
testing TableBufferLength == len1 - 16 would be useful here.
> +
> + sfti = HeapReAlloc(GetProcessHeap(), 0, sfti, len1);
> + ok(!!sfti, "Failed to allocate memory\n");
> +
> + status = pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, len1, &len2);
> +todo_wine
> + ok(status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %08x\n", status);
> + ok(len2 == len1, "Expected length %u, got %u\n", len1, len2);
and here.
> +
> + HeapFree(GetProcessHeap(), 0, sfti);
> +}
> +
> static void test_query_processor_power_info(void)
> {
> NTSTATUS status;
> @@ -2267,6 +2311,10 @@ START_TEST(info)
> trace("Starting test_process_debug_flags()\n");
> test_query_process_debug_flags(argc, argv);
>
> + /* 0x4C SystemFirmwareTableInformation */
> + trace("Starting test_query_firmware()\n");
> + test_query_firmware();
> +
> /* belongs to its own file */
> trace("Starting test_readvirtualmemory()\n");
> test_readvirtualmemory();
> --
> 2.17.1
>
>
>
June 15, 2018
Re: [PATCH] msi: Add package minor/major upgrade tests
by Hans Leidekker
Signed-off-by: Hans Leidekker <hans(a)codeweavers.com>
June 15, 2018
Re: [PATCH v5 5/8] kernel32: Connect GetSystemFirmwareTable to NtQuerySystemInformation
by Marvin
Hi,
While running your changed tests on Windows, I think I found new failures.
Being a bot and all I'm not very good at pattern recognition, so I might be
wrong, but could you please double-check?
Full results can be found at
https://testbot.winehq.org/JobDetails.pl?Key=39156
Your paranoid android.
=== w2003std (32 bit version) ===
version.c:724: Test failed: Expected length 4294967280, got 449
version.c:728: Test failed: Expected length 4294967280, got 449
version.c:731: Test failed: Offset 0: Expected 3a, got 00
version.c:731: Test failed: Offset 1: Expected 00, got 02
version.c:731: Test failed: Offset 2: Expected 03, got 08
version.c:731: Test failed: Offset 3: Expected 00, got 28
version.c:731: Test failed: Offset 4: Expected 00, got b9
version.c:731: Test failed: Offset 6: Expected 0f, got 00
version.c:731: Test failed: Offset 9: Expected 02, got 18
version.c:731: Test failed: Offset 10: Expected 08, got 00
version.c:731: Test failed: Offset 11: Expected 28, got 00
version.c:731: Test failed: Offset 12: Expected b9, got 01
version.c:731: Test failed: Offset 13: Expected 01, got 02
version.c:731: Test failed: Offset 15: Expected 00, got e8
version.c:731: Test failed: Offset 16: Expected 00, got 03
version.c:731: Test failed: Offset 17: Expected 18, got 00
version.c:731: Test failed: Offset 18: Expected 00, got 08
version.c:731: Test failed: Offset 20: Expected 01, got 00
version.c:731: Test failed: Offset 21: Expected 02, got 00
version.c:731: Test failed: Offset 23: Expected e8, got 00
version.c:731: Test failed: Offset 24: Expected 03, got 00
version.c:731: Test failed: Offset 26: Expected 08, got 00
version.c:731: Test failed: Offset 27: Expected 00, got 04
version.c:731: Test failed: Offset 30: Expected 00, got ff
version.c:731: Test failed: Offset 31: Expected 00, got ff
version.c:731: Test failed: Offset 32: Expected 00, got 53
version.c:731: Test failed: Offset 33: Expected 00, got 65
version.c:731: Test failed: Offset 34: Expected 00, got 61
version.c:731: Test failed: Offset 35: Expected 04, got 42
version.c:731: Test failed: Offset 36: Expected 00, got 49
version.c:731: Test failed: Offset 37: Expected 00, got 4f
version.c:731: Test failed: Offset 38: Expected ff, got 53
version.c:731: Test failed: Offset 39: Expected ff, got 00
version.c:731: Test failed: Offset 40: Expected 53, got 31
version.c:731: Test failed: Offset 41: Expected 65, got 2e
version.c:731: Test failed: Offset 42: Expected 61, got 31
version.c:731: Test failed: Offset 43: Expected 42, got 30
version.c:731: Test failed: Offset 44: Expected 49, got 2e
version.c:731: Test failed: Offset 45: Expected 4f, got 32
version.c:731: Test failed: Offset 46: Expected 53, got 2d
version.c:731: Test failed: Offset 47: Expected 00, got 31
version.c:731: Test failed: Offset 48: Expected 31, got 00
version.c:731: Test failed: Offset 49: Expected 2e, got 30
version.c:731: Test failed: Offset 50: Expected 31, got 34
version.c:731: Test failed: Offset 51: Expected 30, got 2f
version.c:731: Test failed: Offset 52: Expected 2e, got 30
version.c:731: Test failed: Offset 53: Expected 32, got 31
version.c:731: Test failed: Offset 54: Expected 2d, got 2f
version.c:731: Test failed: Offset 55: Expected 31, got 32
version.c:731: Test failed: Offset 56: Expected 00, got 30
version.c:731: Test failed: Offset 57: Expected 30, got 31
version.c:731: Test failed: Offset 59: Expected 2f, got 00
version.c:731: Test failed: Offset 60: Expected 30, got 00
version.c:731: Test failed: Offset 61: Expected 31, got 01
version.c:731: Test failed: Offset 62: Expected 2f, got 1b
version.c:731: Test failed: Offset 63: Expected 32, got 00
version.c:731: Test failed: Offset 64: Expected 30, got 01
version.c:731: Test failed: Offset 65: Expected 31, got 01
version.c:731: Test failed: Offset 66: Expected 34, got 02
version.c:731: Test failed: Offset 67: Expected 00, got 03
version.c:731: Test failed: Offset 69: Expected 01, got b7
version.c:731: Test failed: Offset 70: Expected 1b, got ff
version.c:731: Test failed: Offset 71: Expected 00, got 4f
version.c:731: Test failed: Offset 72: Expected 01, got 2a
version.c:731: Test failed: Offset 73: Expected 01, got c5
version.c:731: Test failed: Offset 74: Expected 02, got 53
version.c:731: Test failed: Offset 75: Expected 03, got 46
version.c:731: Test failed: Offset 76: Expected 00, got 9e
version.c:731: Test failed: Offset 77: Expected b7, got 8f
version.c:731: Test failed: Offset 78: Expected ff, got db
version.c:731: Test failed: Offset 79: Expected 4f, got 72
version.c:731: Test failed: Offset 80: Expected 2a, got e5
version.c:731: Test failed: Offset 81: Expected c5, got aa
version.c:731: Test failed: Offset 82: Expected 53, got 9a
version.c:731: Test failed: Offset 83: Expected 46, got b9
version.c:731: Test failed: Offset 84: Expected 9e, got de
version.c:731: Test failed: Offset 85: Expected 8f, got 06
version.c:731: Test failed: Offset 86: Expected db, got 00
version.c:731: Test failed: Offset 87: Expected 72, got 00
version.c:731: Test failed: Offset 88: Expected e5, got 51
version.c:731: Test failed: Offset 89: Expected aa, got 45
version.c:731: Test failed: Offset 90: Expected 9a, got 4d
version.c:731: Test failed: Offset 91: Expected b9, got 55
version.c:731: Test failed: Offset 92: Expected de, got 00
version.c:731: Test failed: Offset 93: Expected 06, got 53
version.c:731: Test failed: Offset 94: Expected 00, got 74
version.c:731: Test failed: Offset 95: Expected 00, got 61
version.c:731: Test failed: Offset 96: Expected 51, got 6e
version.c:731: Test failed: Offset 97: Expected 45, got 64
version.c:731: Test failed: Offset 98: Expected 4d, got 61
version.c:731: Test failed: Offset 99: Expected 55, got 72
version.c:731: Test failed: Offset 100: Expected 00, got 64
version.c:731: Test failed: Offset 101: Expected 53, got 20
version.c:731: Test failed: Offset 102: Expected 74, got 50
version.c:731: Test failed: Offset 103: Expected 61, got 43
version.c:731: Test failed: Offset 104: Expected 6e, got 20
version.c:731: Test failed: Offset 105: Expected 64, got 28
version.c:731: Test failed: Offset 106: Expected 61, got 69
version.c:731: Test failed: Offset 107: Expected 72, got 34
version.c:731: Test failed: Offset 108: Expected 64, got 34
version.c:731: Test failed: Offset 109: Expected 20, got 30
version.c:731: Test failed: Offset 110: Expected 50, got 46
version.c:731: Test failed: Offset 111: Expected 43, got 58
version.c:731: Test failed: Offset 113: Expected 28, got 2b
version.c:731: Test failed: Offset 114: Expected 69, got 20
version.c:731: Test failed: Offset 115: Expected 34, got 50
version.c:731: Test failed: Offset 116: Expected 34, got 49
version.c:731: Test failed: Offset 117: Expected 30, got 49
version.c:731: Test failed: Offset 118: Expected 46, got 58
version.c:731: Test failed: Offset 119: Expected 58, got 2c
version.c:731: Test failed: Offset 121: Expected 2b, got 31
version.c:731: Test failed: Offset 122: Expected 20, got 39
version.c:731: Test failed: Offset 123: Expected 50, got 39
version.c:731: Test failed: Offset 124: Expected 49, got 36
version.c:731: Test failed: Offset 125: Expected 49, got 29
version.c:731: Test failed: Offset 126: Expected 58, got 00
version.c:731: Test failed: Offset 127: Expected 2c, got 70
version.c:731: Test failed: Offset 128: Expected 20, got 63
version.c:731: Test failed: Offset 129: Expected 31, got 2d
version.c:731: Test failed: Offset 130: Expected 39, got 69
version.c:731: Test failed: Offset 131: Expected 39, got 34
version.c:731: Test failed: Offset 132: Expected 36, got 34
version.c:731: Test failed: Offset 133: Expected 29, got 30
version.c:731: Test failed: Offset 134: Expected 00, got 66
version.c:731: Test failed: Offset 135: Expected 70, got 78
version.c:731: Test failed: Offset 136: Expected 63, got 2d
version.c:731: Test failed: Offset 137: Expected 2d, got 32
version.c:731: Test failed: Offset 138: Expected 69, got 2e
version.c:731: Test failed: Offset 139: Expected 34, got 31
version.c:731: Test failed: Offset 140: Expected 34, got 00
version.c:731: Test failed: Offset 141: Expected 30, got 00
version.c:731: Test failed: Offset 142: Expected 66, got 03
version.c:731: Test failed: Offset 143: Expected 78, got 15
version.c:731: Test failed: Offset 144: Expected 2d, got 00
version.c:731: Test failed: Offset 145: Expected 32, got 03
version.c:731: Test failed: Offset 146: Expected 2e, got 01
version.c:731: Test failed: Offset 147: Expected 31, got 01
version.c:731: Test failed: Offset 148: Expected 00, got 02
version.c:731: Test failed: Offset 150: Expected 03, got 00
version.c:731: Test failed: Offset 151: Expected 15, got 03
version.c:731: Test failed: Offset 152: Expected 00, got 03
version.c:731: Test failed: Offset 154: Expected 01, got 02
version.c:731: Test failed: Offset 155: Expected 01, got 00
version.c:731: Test failed: Offset 156: Expected 02, got 00
version.c:731: Test failed: Offset 159: Expected 03, got 00
version.c:731: Test failed: Offset 160: Expected 03, got 00
version.c:731: Test failed: Offset 161: Expected 03, got 00
version.c:731: Test failed: Offset 162: Expected 02, got 00
version.c:731: Test failed: Offset 163: Expected 00, got 51
version.c:731: Test failed: Offset 164: Expected 00, got 45
version.c:731: Test failed: Offset 165: Expected 00, got 4d
version.c:731: Test failed: Offset 166: Expected 00, got 55
version.c:731: Test failed: Offset 168: Expected 00, got 70
version.c:731: Test failed: Offset 169: Expected 00, got 63
version.c:731: Test failed: Offset 170: Expected 00, got 2d
version.c:731: Test failed: Offset 171: Expected 51, got 69
version.c:731: Test failed: Offset 172: Expected 45, got 34
version.c:731: Test failed: Offset 173: Expected 4d, got 34
version.c:731: Test failed: Offset 174: Expected 55, got 30
version.c:731: Test failed: Offset 175: Expected 00, got 66
version.c:731: Test failed: Offset 176: Expected 70, got 78
version.c:731: Test failed: Offset 177: Expected 63, got 2d
version.c:731: Test failed: Offset 178: Expected 2d, got 32
version.c:731: Test failed: Offset 179: Expected 69, got 2e
version.c:731: Test failed: Offset 180: Expected 34, got 31
version.c:731: Test failed: Offset 181: Expected 34, got 00
version.c:731: Test failed: Offset 182: Expected 30, got 00
version.c:731: Test failed: Offset 183: Expected 66, got 04
version.c:731: Test failed: Offset 184: Expected 78, got 2a
version.c:731: Test failed: Offset 185: Expected 2d, got 00
version.c:731: Test failed: Offset 186: Expected 32, got 04
version.c:731: Test failed: Offset 187: Expected 2e, got 01
version.c:731: Test failed: Offset 188: Expected 31, got 03
version.c:731: Test failed: Offset 189: Expected 00, got 01
version.c:731: Test failed: Offset 190: Expected 00, got 02
version.c:731: Test failed: Offset 191: Expected 04, got 61
version.c:731: Test failed: Offset 192: Expected 2a, got 0f
version.c:731: Test failed: Offset 194: Expected 04, got 00
version.c:731: Test failed: Offset 195: Expected 01, got fd
version.c:731: Test failed: Offset 196: Expected 03, got fb
version.c:731: Test failed: Offset 197: Expected 01, got 8b
version.c:731: Test failed: Offset 198: Expected 02, got 07
version.c:731: Test failed: Offset 199: Expected 61, got 03
version.c:731: Test failed: Offset 200: Expected 0f, got 00
version.c:731: Test failed: Offset 203: Expected fd, got d0
version.c:731: Test failed: Offset 204: Expected fb, got 07
version.c:731: Test failed: Offset 205: Expected 8b, got d0
version.c:731: Test failed: Offset 207: Expected 03, got 41
version.c:731: Test failed: Offset 208: Expected 00, got 01
version.c:731: Test failed: Offset 209: Expected 00, got ff
version.c:731: Test failed: Offset 210: Expected 00, got ff
version.c:731: Test failed: Offset 211: Expected d0, got ff
version.c:731: Test failed: Offset 212: Expected 07, got ff
version.c:731: Test failed: Offset 213: Expected d0, got ff
version.c:731: Test failed: Offset 214: Expected 07, got ff
version.c:731: Test failed: Offset 215: Expected 41, got 00
version.c:731: Test failed: Offset 216: Expected 01, got 00
version.c:731: Test failed: Offset 217: Expected ff, got 00
version.c:731: Test failed: Offset 218: Expected ff, got 01
version.c:731: Test failed: Offset 219: Expected ff, got 01
version.c:731: Test failed: Offset 220: Expected ff, got 01
version.c:731: Test failed: Offset 221: Expected ff, got 02
version.c:731: Test failed: Offset 222: Expected ff, got 00
version.c:731: Test failed: Offset 223: Expected 00, got 01
version.c:731: Test failed: Offset 225: Expected 00, got 43
version.c:731: Test failed: Offset 226: Expected 01, got 50
version.c:731: Test failed: Offset 227: Expected 01, got 55
version.c:731: Test failed: Offset 228: Expected 01, got 20
version.c:731: Test failed: Offset 229: Expected 02, got 30
version.c:731: Test failed: Offset 231: Expected 01, got 51
version.c:731: Test failed: Offset 232: Expected 00, got 45
version.c:731: Test failed: Offset 233: Expected 43, got 4d
version.c:731: Test failed: Offset 234: Expected 50, got 55
version.c:731: Test failed: Offset 235: Expected 55, got 00
version.c:731: Test failed: Offset 236: Expected 20, got 70
version.c:731: Test failed: Offset 237: Expected 30, got 63
version.c:731: Test failed: Offset 238: Expected 00, got 2d
version.c:731: Test failed: Offset 239: Expected 51, got 69
version.c:731: Test failed: Offset 240: Expected 45, got 34
version.c:731: Test failed: Offset 241: Expected 4d, got 34
version.c:731: Test failed: Offset 242: Expected 55, got 30
version.c:731: Test failed: Offset 243: Expected 00, got 66
version.c:731: Test failed: Offset 244: Expected 70, got 78
version.c:731: Test failed: Offset 245: Expected 63, got 2d
version.c:731: Test failed: Offset 246: Expected 2d, got 32
version.c:731: Test failed: Offset 247: Expected 69, got 2e
version.c:731: Test failed: Offset 248: Expected 34, got 31
version.c:731: Test failed: Offset 249: Expected 34, got 00
version.c:731: Test failed: Offset 250: Expected 30, got 00
version.c:731: Test failed: Offset 251: Expected 66, got 04
version.c:731: Test failed: Offset 252: Expected 78, got 2a
version.c:731: Test failed: Offset 253: Expected 2d, got 01
version.c:731: Test failed: Offset 254: Expected 32, got 04
version.c:731: Test failed: Offset 255: Expected 2e, got 01
version.c:731: Test failed: Offset 256: Expected 31, got 03
version.c:731: Test failed: Offset 257: Expected 00, got 01
version.c:731: Test failed: Offset 258: Expected 00, got 02
version.c:731: Test failed: Offset 259: Expected 04, got 61
version.c:731: Test failed: Offset 260: Expected 2a, got 0f
version.c:731: Test failed: Offset 261: Expected 01, got 00
version.c:731: Test failed: Offset 262: Expected 04, got 00
version.c:731: Test failed: Offset 263: Expected 01, got fd
version.c:731: Test failed: Offset 264: Expected 03, got fb
version.c:731: Test failed: Offset 265: Expected 01, got 8b
version.c:731: Test failed: Offset 266: Expected 02, got 07
version.c:731: Test failed: Offset 267: Expected 61, got 03
version.c:731: Test failed: Offset 268: Expected 0f, got 00
version.c:731: Test failed: Offset 271: Expected fd, got d0
version.c:731: Test failed: Offset 272: Expected fb, got 07
version.c:731: Test failed: Offset 273: Expected 8b, got d0
version.c:731: Test failed: Offset 275: Expected 03, got 41
version.c:731: Test failed: Offset 276: Expected 00, got 01
version.c:731: Test failed: Offset 277: Expected 00, got ff
version.c:731: Test failed: Offset 278: Expected 00, got ff
version.c:731: Test failed: Offset 279: Expected d0, got ff
version.c:731: Test failed: Offset 280: Expected 07, got ff
version.c:731: Test failed: Offset 281: Expected d0, got ff
version.c:731: Test failed: Offset 282: Expected 07, got ff
version.c:731: Test failed: Offset 283: Expected 41, got 00
version.c:731: Test failed: Offset 284: Expected 01, got 00
version.c:731: Test failed: Offset 285: Expected ff, got 00
version.c:731: Test failed: Offset 286: Expected ff, got 01
version.c:731: Test failed: Offset 287: Expected ff, got 01
version.c:731: Test failed: Offset 288: Expected ff, got 01
version.c:731: Test failed: Offset 289: Expected ff, got 02
version.c:731: Test failed: Offset 290: Expected ff, got 00
version.c:731: Test failed: Offset 291: Expected 00, got 01
version.c:731: Test failed: Offset 293: Expected 00, got 43
version.c:731: Test failed: Offset 294: Expected 01, got 50
version.c:731: Test failed: Offset 295: Expected 01, got 55
version.c:731: Test failed: Offset 296: Expected 01, got 20
version.c:731: Test failed: Offset 297: Expected 02, got 31
version.c:731: Test failed: Offset 299: Expected 01, got 51
version.c:731: Test failed: Offset 300: Expected 00, got 45
version.c:731: Test failed: Offset 301: Expected 43, got 4d
version.c:731: Test failed: Offset 302: Expected 50, got 55
version.c:731: Test failed: Offset 303: Expected 55, got 00
version.c:731: Test failed: Offset 304: Expected 20, got 70
version.c:731: Test failed: Offset 305: Expected 31, got 63
version.c:731: Test failed: Offset 306: Expected 00, got 2d
version.c:731: Test failed: Offset 307: Expected 51, got 69
version.c:731: Test failed: Offset 308: Expected 45, got 34
version.c:731: Test failed: Offset 309: Expected 4d, got 34
version.c:731: Test failed: Offset 310: Expected 55, got 30
version.c:731: Test failed: Offset 311: Expected 00, got 66
version.c:731: Test failed: Offset 312: Expected 70, got 78
version.c:731: Test failed: Offset 313: Expected 63, got 2d
version.c:731: Test failed: Offset 314: Expected 2d, got 32
version.c:731: Test failed: Offset 315: Expected 69, got 2e
version.c:731: Test failed: Offset 316: Expected 34, got 31
version.c:731: Test failed: Offset 317: Expected 34, got 00
version.c:731: Test failed: Offset 318: Expected 30, got 00
version.c:731: Test failed: Offset 319: Expected 66, got 10
version.c:731: Test failed: Offset 320: Expected 78, got 17
version.c:731: Test failed: Offset 321: Expected 2d, got 00
version.c:731: Test failed: Offset 322: Expected 32, got 10
version.c:731: Test failed: Offset 323: Expected 2e, got 01
version.c:731: Test failed: Offset 324: Expected 31, got 03
version.c:731: Test failed: Offset 325: Expected 00, got 06
version.c:731: Test failed: Offset 327: Expected 10, got 00
version.c:731: Test failed: Offset 328: Expected 17, got 10
version.c:731: Test failed: Offset 330: Expected 10, got fe
version.c:731: Test failed: Offset 331: Expected 01, got ff
version.c:731: Test failed: Offset 332: Expected 03, got 01
version.c:731: Test failed: Offset 333: Expected 06, got 00
version.c:731: Test failed: Offset 336: Expected 10, got 00
version.c:731: Test failed: Offset 338: Expected fe, got 00
version.c:731: Test failed: Offset 339: Expected ff, got 00
version.c:731: Test failed: Offset 340: Expected 01, got 00
version.c:731: Test failed: Offset 344: Expected 00, got 11
version.c:731: Test failed: Offset 345: Expected 00, got 28
version.c:731: Test failed: Offset 347: Expected 00, got 11
version.c:731: Test failed: Offset 349: Expected 00, got 10
version.c:731: Test failed: Offset 350: Expected 00, got fe
version.c:731: Test failed: Offset 351: Expected 00, got ff
version.c:731: Test failed: Offset 352: Expected 11, got ff
version.c:731: Test failed: Offset 353: Expected 28, got ff
version.c:731: Test failed: Offset 354: Expected 00, got ff
version.c:731: Test failed: Offset 355: Expected 11, got ff
version.c:731: Test failed: Offset 357: Expected 10, got 04
version.c:731: Test failed: Offset 358: Expected fe, got 09
version.c:731: Test failed: Offset 359: Expected ff, got 00
version.c:731: Test failed: Offset 360: Expected ff, got 01
version.c:731: Test failed: Offset 361: Expected ff, got 00
version.c:731: Test failed: Offset 362: Expected ff, got 07
version.c:731: Test failed: Offset 363: Expected ff, got 02
version.c:731: Test failed: Offset 365: Expected 04, got 00
version.c:731: Test failed: Offset 366: Expected 09, got 00
version.c:731: Test failed: Offset 367: Expected 00, got 02
version.c:731: Test failed: Offset 368: Expected 01, got 00
version.c:731: Test failed: Offset 370: Expected 07, got 00
version.c:731: Test failed: Offset 371: Expected 02, got 00
version.c:731: Test failed: Offset 375: Expected 02, got 00
version.c:731: Test failed: Offset 384: Expected 00, got 44
version.c:731: Test failed: Offset 385: Expected 00, got 49
version.c:731: Test failed: Offset 386: Expected 00, got 4d
version.c:731: Test failed: Offset 387: Expected 00, got 4d
version.c:731: Test failed: Offset 388: Expected 00, got 20
version.c:731: Test failed: Offset 389: Expected 00, got 30
version.c:731: Test failed: Offset 391: Expected 00, got 51
version.c:731: Test failed: Offset 392: Expected 44, got 45
version.c:731: Test failed: Offset 393: Expected 49, got 4d
version.c:731: Test failed: Offset 394: Expected 4d, got 55
version.c:731: Test failed: Offset 395: Expected 4d, got 00
version.c:731: Test failed: Offset 396: Expected 20, got 00
version.c:731: Test failed: Offset 397: Expected 30, got 13
version.c:731: Test failed: Offset 398: Expected 00, got 1f
version.c:731: Test failed: Offset 399: Expected 51, got 00
version.c:731: Test failed: Offset 400: Expected 45, got 13
version.c:731: Test failed: Offset 401: Expected 4d, got 00
version.c:731: Test failed: Offset 402: Expected 55, got 00
version.c:731: Test failed: Offset 405: Expected 13, got ff
version.c:731: Test failed: Offset 406: Expected 1f, got ff
version.c:731: Test failed: Offset 407: Expected 00, got 0f
version.c:731: Test failed: Offset 408: Expected 13, got 00
version.c:731: Test failed: Offset 410: Expected 00, got 10
version.c:731: Test failed: Offset 411: Expected 00, got 01
version.c:731: Test failed: Offset 413: Expected ff, got 00
version.c:731: Test failed: Offset 414: Expected ff, got 00
version.c:731: Test failed: Offset 415: Expected 0f, got 00
version.c:731: Test failed: Offset 418: Expected 10, got 00
version.c:731: Test failed: Offset 419: Expected 01, got 00
version.c:731: Test failed: Offset 430: Expected 00, got 20
version.c:731: Test failed: Offset 431: Expected 00, got 0b
version.c:731: Test failed: Offset 433: Expected 00, got 20
version.c:731: Test failed: Offset 438: Expected 20, got 00
version.c:731: Test failed: Offset 439: Expected 0b, got 00
version.c:731: Test failed: Offset 441: Expected 20, got 00
version.c:731: Test failed: Offset 443: Expected 00, got 7f
version.c:731: Test failed: Offset 444: Expected 00, got 04
version.c:731: Test failed: Offset 446: Expected 00, got 7f
June 15, 2018
Re: [PATCH v5 4/8] ntdll: Return BIOS info from NtQuerySystemInformation on Linux
by Marvin
Hi,
While running your changed tests on Windows, I think I found new failures.
Being a bot and all I'm not very good at pattern recognition, so I might be
wrong, but could you please double-check?
Full results can be found at
https://testbot.winehq.org/JobDetails.pl?Key=39155
Your paranoid android.
=== wxppro (32 bit info) ===
info.c:849: Test failed: Expected STATUS_INFO_LENGTH_MISMATCH, got c0000003
info.c:850: Test failed: Expected length 16, got 0
info.c:853: Test failed: Expected STATUS_NOT_IMPLEMENTED, got c0000003
info.c:861: Test failed: Expected STATUS_BUFFER_TOO_SMALL, got c0000003
info.c:862: Test failed: Expected length >= 16, got 0
info.c:869: Test failed: Expected STATUS_SUCCESS, got c0000003
=== w2003std (32 bit info) ===
info.c:850: Test failed: Expected length 16, got 0
info.c:853: Test failed: Expected STATUS_NOT_IMPLEMENTED, got c0000004
info.c:861: Test failed: Expected STATUS_BUFFER_TOO_SMALL, got c0000004
info.c:862: Test failed: Expected length >= 16, got 0
info.c:869: Test failed: Expected STATUS_SUCCESS, got c0000004
=== wvistau64 (32 bit info) ===
info.c:1838: Test failed: Expected STATUS_SUCCESS, got c0000022
0890:info: unhandled exception c0000005 at 002C0000
=== wvistau64_zh_CN (32 bit info) ===
info.c:1838: Test failed: Expected STATUS_SUCCESS, got c0000022
0bb8:info: unhandled exception c0000005 at 003E0000
=== wvistau64_fr (32 bit info) ===
info.c:1838: Test failed: Expected STATUS_SUCCESS, got c0000022
06a8:info: unhandled exception c0000005 at 002C0000
=== wvistau64_he (32 bit info) ===
info.c:1838: Test failed: Expected STATUS_SUCCESS, got c0000022
0bd8:info: unhandled exception c0000005 at 003D0000
=== w2008s64 (32 bit info) ===
info.c:1838: Test failed: Expected STATUS_SUCCESS, got c0000022
086c:info: unhandled exception c0000005 at 003D0000
=== w7u (32 bit info) ===
info.c:1838: Test failed: Expected STATUS_SUCCESS, got c0000022
=== w7pro64 (32 bit info) ===
info.c:1838: Test failed: Expected STATUS_SUCCESS, got c0000022
0ab8:info: unhandled exception c0000005 at 00340000
=== w8 (32 bit info) ===
info.c:1838: Test failed: Expected STATUS_SUCCESS, got c0000022
0f30:info: unhandled exception c0000005 at 003E0000
=== w864 (32 bit info) ===
info.c:1838: Test failed: Expected STATUS_SUCCESS, got c0000022
0a18:info: unhandled exception c0000005 at 00350000
=== w1064 (32 bit info) ===
info.c:1838: Test failed: Expected STATUS_SUCCESS, got c0000022
0b54:info: unhandled exception c0000005 at 00390000
June 15, 2018
Re: [PATCH v5 3/8] kernel32/tests: Add GetSystemFirmwareTable tests
by Marvin
Hi,
While running your changed tests on Windows, I think I found new failures.
Being a bot and all I'm not very good at pattern recognition, so I might be
wrong, but could you please double-check?
Full results can be found at
https://testbot.winehq.org/JobDetails.pl?Key=39154
Your paranoid android.
=== w2003std (32 bit version) ===
version.c:725: Test failed: Expected length 4294967280, got 449
version.c:730: Test failed: Expected length 4294967280, got 449
version.c:733: Test failed: Offset 0: Expected 3a, got 00
version.c:733: Test failed: Offset 1: Expected 00, got 02
version.c:733: Test failed: Offset 2: Expected 03, got 08
version.c:733: Test failed: Offset 3: Expected 00, got 28
version.c:733: Test failed: Offset 4: Expected e5, got b9
version.c:733: Test failed: Offset 6: Expected 0f, got 00
version.c:733: Test failed: Offset 9: Expected 02, got 18
version.c:733: Test failed: Offset 10: Expected 08, got 00
version.c:733: Test failed: Offset 11: Expected 28, got 00
version.c:733: Test failed: Offset 12: Expected b9, got 01
version.c:733: Test failed: Offset 13: Expected 01, got 02
version.c:733: Test failed: Offset 15: Expected 00, got e8
version.c:733: Test failed: Offset 16: Expected 00, got 03
version.c:733: Test failed: Offset 17: Expected 18, got 00
version.c:733: Test failed: Offset 18: Expected 00, got 08
version.c:733: Test failed: Offset 20: Expected 01, got 00
version.c:733: Test failed: Offset 21: Expected 02, got 00
version.c:733: Test failed: Offset 23: Expected e8, got 00
version.c:733: Test failed: Offset 24: Expected 03, got 00
version.c:733: Test failed: Offset 26: Expected 08, got 00
version.c:733: Test failed: Offset 27: Expected 00, got 04
version.c:733: Test failed: Offset 30: Expected 00, got ff
version.c:733: Test failed: Offset 31: Expected 00, got ff
version.c:733: Test failed: Offset 32: Expected 00, got 53
version.c:733: Test failed: Offset 33: Expected 00, got 65
version.c:733: Test failed: Offset 34: Expected 00, got 61
version.c:733: Test failed: Offset 35: Expected 04, got 42
version.c:733: Test failed: Offset 36: Expected 00, got 49
version.c:733: Test failed: Offset 37: Expected 00, got 4f
version.c:733: Test failed: Offset 38: Expected ff, got 53
version.c:733: Test failed: Offset 39: Expected ff, got 00
version.c:733: Test failed: Offset 40: Expected 53, got 31
version.c:733: Test failed: Offset 41: Expected 65, got 2e
version.c:733: Test failed: Offset 42: Expected 61, got 31
version.c:733: Test failed: Offset 43: Expected 42, got 30
version.c:733: Test failed: Offset 44: Expected 49, got 2e
version.c:733: Test failed: Offset 45: Expected 4f, got 32
version.c:733: Test failed: Offset 46: Expected 53, got 2d
version.c:733: Test failed: Offset 47: Expected 00, got 31
version.c:733: Test failed: Offset 48: Expected 31, got 00
version.c:733: Test failed: Offset 49: Expected 2e, got 30
version.c:733: Test failed: Offset 50: Expected 31, got 34
version.c:733: Test failed: Offset 51: Expected 30, got 2f
version.c:733: Test failed: Offset 52: Expected 2e, got 30
version.c:733: Test failed: Offset 53: Expected 32, got 31
version.c:733: Test failed: Offset 54: Expected 2d, got 2f
version.c:733: Test failed: Offset 55: Expected 31, got 32
version.c:733: Test failed: Offset 56: Expected 00, got 30
version.c:733: Test failed: Offset 57: Expected 30, got 31
version.c:733: Test failed: Offset 59: Expected 2f, got 00
version.c:733: Test failed: Offset 60: Expected 30, got 00
version.c:733: Test failed: Offset 61: Expected 31, got 01
version.c:733: Test failed: Offset 62: Expected 2f, got 1b
version.c:733: Test failed: Offset 63: Expected 32, got 00
version.c:733: Test failed: Offset 64: Expected 30, got 01
version.c:733: Test failed: Offset 65: Expected 31, got 01
version.c:733: Test failed: Offset 66: Expected 34, got 02
version.c:733: Test failed: Offset 67: Expected 00, got 03
version.c:733: Test failed: Offset 69: Expected 01, got b7
version.c:733: Test failed: Offset 70: Expected 1b, got ff
version.c:733: Test failed: Offset 71: Expected 00, got 4f
version.c:733: Test failed: Offset 72: Expected 01, got 2a
version.c:733: Test failed: Offset 73: Expected 01, got c5
version.c:733: Test failed: Offset 74: Expected 02, got 53
version.c:733: Test failed: Offset 75: Expected 03, got 46
version.c:733: Test failed: Offset 76: Expected 00, got 9e
version.c:733: Test failed: Offset 77: Expected b7, got 8f
version.c:733: Test failed: Offset 78: Expected ff, got db
version.c:733: Test failed: Offset 79: Expected 4f, got 72
version.c:733: Test failed: Offset 80: Expected 2a, got e5
version.c:733: Test failed: Offset 81: Expected c5, got aa
version.c:733: Test failed: Offset 82: Expected 53, got 9a
version.c:733: Test failed: Offset 83: Expected 46, got b9
version.c:733: Test failed: Offset 84: Expected 9e, got de
version.c:733: Test failed: Offset 85: Expected 8f, got 06
version.c:733: Test failed: Offset 86: Expected db, got 00
version.c:733: Test failed: Offset 87: Expected 72, got 00
version.c:733: Test failed: Offset 88: Expected e5, got 51
version.c:733: Test failed: Offset 89: Expected aa, got 45
version.c:733: Test failed: Offset 90: Expected 9a, got 4d
version.c:733: Test failed: Offset 91: Expected b9, got 55
version.c:733: Test failed: Offset 92: Expected de, got 00
version.c:733: Test failed: Offset 93: Expected 06, got 53
version.c:733: Test failed: Offset 94: Expected 00, got 74
version.c:733: Test failed: Offset 95: Expected 00, got 61
version.c:733: Test failed: Offset 96: Expected 51, got 6e
version.c:733: Test failed: Offset 97: Expected 45, got 64
version.c:733: Test failed: Offset 98: Expected 4d, got 61
version.c:733: Test failed: Offset 99: Expected 55, got 72
version.c:733: Test failed: Offset 100: Expected 00, got 64
version.c:733: Test failed: Offset 101: Expected 53, got 20
version.c:733: Test failed: Offset 102: Expected 74, got 50
version.c:733: Test failed: Offset 103: Expected 61, got 43
version.c:733: Test failed: Offset 104: Expected 6e, got 20
version.c:733: Test failed: Offset 105: Expected 64, got 28
version.c:733: Test failed: Offset 106: Expected 61, got 69
version.c:733: Test failed: Offset 107: Expected 72, got 34
version.c:733: Test failed: Offset 108: Expected 64, got 34
version.c:733: Test failed: Offset 109: Expected 20, got 30
version.c:733: Test failed: Offset 110: Expected 50, got 46
version.c:733: Test failed: Offset 111: Expected 43, got 58
version.c:733: Test failed: Offset 113: Expected 28, got 2b
version.c:733: Test failed: Offset 114: Expected 69, got 20
version.c:733: Test failed: Offset 115: Expected 34, got 50
version.c:733: Test failed: Offset 116: Expected 34, got 49
version.c:733: Test failed: Offset 117: Expected 30, got 49
version.c:733: Test failed: Offset 118: Expected 46, got 58
version.c:733: Test failed: Offset 119: Expected 58, got 2c
version.c:733: Test failed: Offset 121: Expected 2b, got 31
version.c:733: Test failed: Offset 122: Expected 20, got 39
version.c:733: Test failed: Offset 123: Expected 50, got 39
version.c:733: Test failed: Offset 124: Expected 49, got 36
version.c:733: Test failed: Offset 125: Expected 49, got 29
version.c:733: Test failed: Offset 126: Expected 58, got 00
version.c:733: Test failed: Offset 127: Expected 2c, got 70
version.c:733: Test failed: Offset 128: Expected 20, got 63
version.c:733: Test failed: Offset 129: Expected 31, got 2d
version.c:733: Test failed: Offset 130: Expected 39, got 69
version.c:733: Test failed: Offset 131: Expected 39, got 34
version.c:733: Test failed: Offset 132: Expected 36, got 34
version.c:733: Test failed: Offset 133: Expected 29, got 30
version.c:733: Test failed: Offset 134: Expected 00, got 66
version.c:733: Test failed: Offset 135: Expected 70, got 78
version.c:733: Test failed: Offset 136: Expected 63, got 2d
version.c:733: Test failed: Offset 137: Expected 2d, got 32
version.c:733: Test failed: Offset 138: Expected 69, got 2e
version.c:733: Test failed: Offset 139: Expected 34, got 31
version.c:733: Test failed: Offset 140: Expected 34, got 00
version.c:733: Test failed: Offset 141: Expected 30, got 00
version.c:733: Test failed: Offset 142: Expected 66, got 03
version.c:733: Test failed: Offset 143: Expected 78, got 15
version.c:733: Test failed: Offset 144: Expected 2d, got 00
version.c:733: Test failed: Offset 145: Expected 32, got 03
version.c:733: Test failed: Offset 146: Expected 2e, got 01
version.c:733: Test failed: Offset 147: Expected 31, got 01
version.c:733: Test failed: Offset 148: Expected 00, got 02
version.c:733: Test failed: Offset 150: Expected 03, got 00
version.c:733: Test failed: Offset 151: Expected 15, got 03
version.c:733: Test failed: Offset 152: Expected 00, got 03
version.c:733: Test failed: Offset 154: Expected 01, got 02
version.c:733: Test failed: Offset 155: Expected 01, got 00
version.c:733: Test failed: Offset 156: Expected 02, got 00
version.c:733: Test failed: Offset 159: Expected 03, got 00
version.c:733: Test failed: Offset 160: Expected 03, got 00
version.c:733: Test failed: Offset 161: Expected 03, got 00
version.c:733: Test failed: Offset 162: Expected 02, got 00
version.c:733: Test failed: Offset 163: Expected 00, got 51
version.c:733: Test failed: Offset 164: Expected 00, got 45
version.c:733: Test failed: Offset 165: Expected 00, got 4d
version.c:733: Test failed: Offset 166: Expected 00, got 55
version.c:733: Test failed: Offset 168: Expected 00, got 70
version.c:733: Test failed: Offset 169: Expected 00, got 63
version.c:733: Test failed: Offset 170: Expected 00, got 2d
version.c:733: Test failed: Offset 171: Expected 51, got 69
version.c:733: Test failed: Offset 172: Expected 45, got 34
version.c:733: Test failed: Offset 173: Expected 4d, got 34
version.c:733: Test failed: Offset 174: Expected 55, got 30
version.c:733: Test failed: Offset 175: Expected 00, got 66
version.c:733: Test failed: Offset 176: Expected 70, got 78
version.c:733: Test failed: Offset 177: Expected 63, got 2d
version.c:733: Test failed: Offset 178: Expected 2d, got 32
version.c:733: Test failed: Offset 179: Expected 69, got 2e
version.c:733: Test failed: Offset 180: Expected 34, got 31
version.c:733: Test failed: Offset 181: Expected 34, got 00
version.c:733: Test failed: Offset 182: Expected 30, got 00
version.c:733: Test failed: Offset 183: Expected 66, got 04
version.c:733: Test failed: Offset 184: Expected 78, got 2a
version.c:733: Test failed: Offset 185: Expected 2d, got 00
version.c:733: Test failed: Offset 186: Expected 32, got 04
version.c:733: Test failed: Offset 187: Expected 2e, got 01
version.c:733: Test failed: Offset 188: Expected 31, got 03
version.c:733: Test failed: Offset 189: Expected 00, got 01
version.c:733: Test failed: Offset 190: Expected 00, got 02
version.c:733: Test failed: Offset 191: Expected 04, got 61
version.c:733: Test failed: Offset 192: Expected 2a, got 0f
version.c:733: Test failed: Offset 194: Expected 04, got 00
version.c:733: Test failed: Offset 195: Expected 01, got fd
version.c:733: Test failed: Offset 196: Expected 03, got fb
version.c:733: Test failed: Offset 197: Expected 01, got 8b
version.c:733: Test failed: Offset 198: Expected 02, got 07
version.c:733: Test failed: Offset 199: Expected 61, got 03
version.c:733: Test failed: Offset 200: Expected 0f, got 00
version.c:733: Test failed: Offset 203: Expected fd, got d0
version.c:733: Test failed: Offset 204: Expected fb, got 07
version.c:733: Test failed: Offset 205: Expected 8b, got d0
version.c:733: Test failed: Offset 207: Expected 03, got 41
version.c:733: Test failed: Offset 208: Expected 00, got 01
version.c:733: Test failed: Offset 209: Expected 00, got ff
version.c:733: Test failed: Offset 210: Expected 00, got ff
version.c:733: Test failed: Offset 211: Expected d0, got ff
version.c:733: Test failed: Offset 212: Expected 07, got ff
version.c:733: Test failed: Offset 213: Expected d0, got ff
version.c:733: Test failed: Offset 214: Expected 07, got ff
version.c:733: Test failed: Offset 215: Expected 41, got 00
version.c:733: Test failed: Offset 216: Expected 01, got 00
version.c:733: Test failed: Offset 217: Expected ff, got 00
version.c:733: Test failed: Offset 218: Expected ff, got 01
version.c:733: Test failed: Offset 219: Expected ff, got 01
version.c:733: Test failed: Offset 220: Expected ff, got 01
version.c:733: Test failed: Offset 221: Expected ff, got 02
version.c:733: Test failed: Offset 222: Expected ff, got 00
version.c:733: Test failed: Offset 223: Expected 00, got 01
version.c:733: Test failed: Offset 225: Expected 00, got 43
version.c:733: Test failed: Offset 226: Expected 01, got 50
version.c:733: Test failed: Offset 227: Expected 01, got 55
version.c:733: Test failed: Offset 228: Expected 01, got 20
version.c:733: Test failed: Offset 229: Expected 02, got 30
version.c:733: Test failed: Offset 231: Expected 01, got 51
version.c:733: Test failed: Offset 232: Expected 00, got 45
version.c:733: Test failed: Offset 233: Expected 43, got 4d
version.c:733: Test failed: Offset 234: Expected 50, got 55
version.c:733: Test failed: Offset 235: Expected 55, got 00
version.c:733: Test failed: Offset 236: Expected 20, got 70
version.c:733: Test failed: Offset 237: Expected 30, got 63
version.c:733: Test failed: Offset 238: Expected 00, got 2d
version.c:733: Test failed: Offset 239: Expected 51, got 69
version.c:733: Test failed: Offset 240: Expected 45, got 34
version.c:733: Test failed: Offset 241: Expected 4d, got 34
version.c:733: Test failed: Offset 242: Expected 55, got 30
version.c:733: Test failed: Offset 243: Expected 00, got 66
version.c:733: Test failed: Offset 244: Expected 70, got 78
version.c:733: Test failed: Offset 245: Expected 63, got 2d
version.c:733: Test failed: Offset 246: Expected 2d, got 32
version.c:733: Test failed: Offset 247: Expected 69, got 2e
version.c:733: Test failed: Offset 248: Expected 34, got 31
version.c:733: Test failed: Offset 249: Expected 34, got 00
version.c:733: Test failed: Offset 250: Expected 30, got 00
version.c:733: Test failed: Offset 251: Expected 66, got 04
version.c:733: Test failed: Offset 252: Expected 78, got 2a
version.c:733: Test failed: Offset 253: Expected 2d, got 01
version.c:733: Test failed: Offset 254: Expected 32, got 04
version.c:733: Test failed: Offset 255: Expected 2e, got 01
version.c:733: Test failed: Offset 256: Expected 31, got 03
version.c:733: Test failed: Offset 257: Expected 00, got 01
version.c:733: Test failed: Offset 258: Expected 00, got 02
version.c:733: Test failed: Offset 259: Expected 04, got 61
version.c:733: Test failed: Offset 260: Expected 2a, got 0f
version.c:733: Test failed: Offset 261: Expected 01, got 00
version.c:733: Test failed: Offset 262: Expected 04, got 00
version.c:733: Test failed: Offset 263: Expected 01, got fd
version.c:733: Test failed: Offset 264: Expected 03, got fb
version.c:733: Test failed: Offset 265: Expected 01, got 8b
version.c:733: Test failed: Offset 266: Expected 02, got 07
version.c:733: Test failed: Offset 267: Expected 61, got 03
version.c:733: Test failed: Offset 268: Expected 0f, got 00
version.c:733: Test failed: Offset 271: Expected fd, got d0
version.c:733: Test failed: Offset 272: Expected fb, got 07
version.c:733: Test failed: Offset 273: Expected 8b, got d0
version.c:733: Test failed: Offset 275: Expected 03, got 41
version.c:733: Test failed: Offset 276: Expected 00, got 01
version.c:733: Test failed: Offset 277: Expected 00, got ff
version.c:733: Test failed: Offset 278: Expected 00, got ff
version.c:733: Test failed: Offset 279: Expected d0, got ff
version.c:733: Test failed: Offset 280: Expected 07, got ff
version.c:733: Test failed: Offset 281: Expected d0, got ff
version.c:733: Test failed: Offset 282: Expected 07, got ff
version.c:733: Test failed: Offset 283: Expected 41, got 00
version.c:733: Test failed: Offset 284: Expected 01, got 00
version.c:733: Test failed: Offset 285: Expected ff, got 00
version.c:733: Test failed: Offset 286: Expected ff, got 01
version.c:733: Test failed: Offset 287: Expected ff, got 01
version.c:733: Test failed: Offset 288: Expected ff, got 01
version.c:733: Test failed: Offset 289: Expected ff, got 02
version.c:733: Test failed: Offset 290: Expected ff, got 00
version.c:733: Test failed: Offset 291: Expected 00, got 01
version.c:733: Test failed: Offset 293: Expected 00, got 43
version.c:733: Test failed: Offset 294: Expected 01, got 50
version.c:733: Test failed: Offset 295: Expected 01, got 55
version.c:733: Test failed: Offset 296: Expected 01, got 20
version.c:733: Test failed: Offset 297: Expected 02, got 31
version.c:733: Test failed: Offset 299: Expected 01, got 51
version.c:733: Test failed: Offset 300: Expected 00, got 45
version.c:733: Test failed: Offset 301: Expected 43, got 4d
version.c:733: Test failed: Offset 302: Expected 50, got 55
version.c:733: Test failed: Offset 303: Expected 55, got 00
version.c:733: Test failed: Offset 304: Expected 20, got 70
version.c:733: Test failed: Offset 305: Expected 31, got 63
version.c:733: Test failed: Offset 306: Expected 00, got 2d
version.c:733: Test failed: Offset 307: Expected 51, got 69
version.c:733: Test failed: Offset 308: Expected 45, got 34
version.c:733: Test failed: Offset 309: Expected 4d, got 34
version.c:733: Test failed: Offset 310: Expected 55, got 30
version.c:733: Test failed: Offset 311: Expected 00, got 66
version.c:733: Test failed: Offset 312: Expected 70, got 78
version.c:733: Test failed: Offset 313: Expected 63, got 2d
version.c:733: Test failed: Offset 314: Expected 2d, got 32
version.c:733: Test failed: Offset 315: Expected 69, got 2e
version.c:733: Test failed: Offset 316: Expected 34, got 31
version.c:733: Test failed: Offset 317: Expected 34, got 00
version.c:733: Test failed: Offset 318: Expected 30, got 00
version.c:733: Test failed: Offset 319: Expected 66, got 10
version.c:733: Test failed: Offset 320: Expected 78, got 17
version.c:733: Test failed: Offset 321: Expected 2d, got 00
version.c:733: Test failed: Offset 322: Expected 32, got 10
version.c:733: Test failed: Offset 323: Expected 2e, got 01
version.c:733: Test failed: Offset 324: Expected 31, got 03
version.c:733: Test failed: Offset 325: Expected 00, got 06
version.c:733: Test failed: Offset 327: Expected 10, got 00
version.c:733: Test failed: Offset 328: Expected 17, got 10
version.c:733: Test failed: Offset 330: Expected 10, got fe
version.c:733: Test failed: Offset 331: Expected 01, got ff
version.c:733: Test failed: Offset 332: Expected 03, got 01
version.c:733: Test failed: Offset 333: Expected 06, got 00
version.c:733: Test failed: Offset 336: Expected 10, got 00
version.c:733: Test failed: Offset 338: Expected fe, got 00
version.c:733: Test failed: Offset 339: Expected ff, got 00
version.c:733: Test failed: Offset 340: Expected 01, got 00
version.c:733: Test failed: Offset 344: Expected 00, got 11
version.c:733: Test failed: Offset 345: Expected 00, got 28
version.c:733: Test failed: Offset 347: Expected 00, got 11
version.c:733: Test failed: Offset 349: Expected 00, got 10
version.c:733: Test failed: Offset 350: Expected 00, got fe
version.c:733: Test failed: Offset 351: Expected 00, got ff
version.c:733: Test failed: Offset 352: Expected 11, got ff
version.c:733: Test failed: Offset 353: Expected 28, got ff
version.c:733: Test failed: Offset 354: Expected 00, got ff
version.c:733: Test failed: Offset 355: Expected 11, got ff
version.c:733: Test failed: Offset 357: Expected 10, got 04
version.c:733: Test failed: Offset 358: Expected fe, got 09
version.c:733: Test failed: Offset 359: Expected ff, got 00
version.c:733: Test failed: Offset 360: Expected ff, got 01
version.c:733: Test failed: Offset 361: Expected ff, got 00
version.c:733: Test failed: Offset 362: Expected ff, got 07
version.c:733: Test failed: Offset 363: Expected ff, got 02
version.c:733: Test failed: Offset 365: Expected 04, got 00
version.c:733: Test failed: Offset 366: Expected 09, got 00
version.c:733: Test failed: Offset 367: Expected 00, got 02
version.c:733: Test failed: Offset 368: Expected 01, got 00
version.c:733: Test failed: Offset 370: Expected 07, got 00
version.c:733: Test failed: Offset 371: Expected 02, got 00
version.c:733: Test failed: Offset 375: Expected 02, got 00
version.c:733: Test failed: Offset 384: Expected 00, got 44
version.c:733: Test failed: Offset 385: Expected 00, got 49
version.c:733: Test failed: Offset 386: Expected 00, got 4d
version.c:733: Test failed: Offset 387: Expected 00, got 4d
version.c:733: Test failed: Offset 388: Expected 00, got 20
version.c:733: Test failed: Offset 389: Expected 00, got 30
version.c:733: Test failed: Offset 391: Expected 00, got 51
version.c:733: Test failed: Offset 392: Expected 44, got 45
version.c:733: Test failed: Offset 393: Expected 49, got 4d
version.c:733: Test failed: Offset 394: Expected 4d, got 55
version.c:733: Test failed: Offset 395: Expected 4d, got 00
version.c:733: Test failed: Offset 396: Expected 20, got 00
version.c:733: Test failed: Offset 397: Expected 30, got 13
version.c:733: Test failed: Offset 398: Expected 00, got 1f
version.c:733: Test failed: Offset 399: Expected 51, got 00
version.c:733: Test failed: Offset 400: Expected 45, got 13
version.c:733: Test failed: Offset 401: Expected 4d, got 00
version.c:733: Test failed: Offset 402: Expected 55, got 00
version.c:733: Test failed: Offset 405: Expected 13, got ff
version.c:733: Test failed: Offset 406: Expected 1f, got ff
version.c:733: Test failed: Offset 407: Expected 00, got 0f
version.c:733: Test failed: Offset 408: Expected 13, got 00
version.c:733: Test failed: Offset 410: Expected 00, got 10
version.c:733: Test failed: Offset 411: Expected 00, got 01
version.c:733: Test failed: Offset 413: Expected ff, got 00
version.c:733: Test failed: Offset 414: Expected ff, got 00
version.c:733: Test failed: Offset 415: Expected 0f, got 00
version.c:733: Test failed: Offset 418: Expected 10, got 00
version.c:733: Test failed: Offset 419: Expected 01, got 00
version.c:733: Test failed: Offset 430: Expected 00, got 20
version.c:733: Test failed: Offset 431: Expected 00, got 0b
version.c:733: Test failed: Offset 433: Expected 00, got 20
version.c:733: Test failed: Offset 438: Expected 20, got 00
version.c:733: Test failed: Offset 439: Expected 0b, got 00
version.c:733: Test failed: Offset 441: Expected 20, got 00
version.c:733: Test failed: Offset 443: Expected 00, got 7f
version.c:733: Test failed: Offset 444: Expected 00, got 04
version.c:733: Test failed: Offset 446: Expected 00, got 7f
June 15, 2018
Re: [PATCH v5 2/8] ntdll/tests: Add SystemFirmwareTableInformation tests
by Marvin
Hi,
While running your changed tests on Windows, I think I found new failures.
Being a bot and all I'm not very good at pattern recognition, so I might be
wrong, but could you please double-check?
Full results can be found at
https://testbot.winehq.org/JobDetails.pl?Key=39153
Your paranoid android.
=== wxppro (32 bit info) ===
info.c:844: Test failed: Expected STATUS_INFO_LENGTH_MISMATCH, got c0000003
info.c:846: Test failed: Expected length 16, got 0
info.c:850: Test failed: Expected STATUS_NOT_IMPLEMENTED, got c0000003
info.c:858: Test failed: Expected STATUS_BUFFER_TOO_SMALL, got c0000003
info.c:860: Test failed: Expected length >= 16, got 0
info.c:867: Test failed: Expected STATUS_SUCCESS, got c0000003
=== w2003std (32 bit info) ===
info.c:846: Test failed: Expected length 16, got 0
info.c:850: Test failed: Expected STATUS_NOT_IMPLEMENTED, got c0000004
info.c:858: Test failed: Expected STATUS_BUFFER_TOO_SMALL, got c0000004
info.c:860: Test failed: Expected length >= 16, got 0
info.c:867: Test failed: Expected STATUS_SUCCESS, got c0000004
=== wvistau64 (32 bit info) ===
info.c:1836: Test failed: Expected STATUS_SUCCESS, got c0000022
0b9c:info: unhandled exception c0000005 at 003D0000
=== wvistau64_zh_CN (32 bit info) ===
info.c:1836: Test failed: Expected STATUS_SUCCESS, got c0000022
0bd0:info: unhandled exception c0000005 at 00360000
=== wvistau64_fr (32 bit info) ===
info.c:1836: Test failed: Expected STATUS_SUCCESS, got c0000022
072c:info: unhandled exception c0000005 at 003E0000
=== wvistau64_he (32 bit info) ===
info.c:1836: Test failed: Expected STATUS_SUCCESS, got c0000022
0be0:info: unhandled exception c0000005 at 003D0000
=== w2008s64 (32 bit info) ===
info.c:1836: Test failed: Expected STATUS_SUCCESS, got c0000022
0874:info: unhandled exception c0000005 at 002C0000
=== w7u (32 bit info) ===
info.c:1836: Test failed: Expected STATUS_SUCCESS, got c0000022
=== w7pro64 (32 bit info) ===
info.c:1836: Test failed: Expected STATUS_SUCCESS, got c0000022
0bf8:info: unhandled exception c0000005 at 003C0000
=== w8 (32 bit info) ===
info.c:1836: Test failed: Expected STATUS_SUCCESS, got c0000022
0fdc:info: unhandled exception c0000005 at 003E0000
=== w864 (32 bit info) ===
info.c:1836: Test failed: Expected STATUS_SUCCESS, got c0000022
0d10:info: unhandled exception c0000005 at 00360000
=== w1064 (32 bit info) ===
info.c:1836: Test failed: Expected STATUS_SUCCESS, got c0000022
064c:info: unhandled exception c0000005 at 002D0000
June 15, 2018
[PATCH v5 8/8] ntdll: Return chassis info from NtQuerySystemInformation on Linux
by Alex Henrie
Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
---
dlls/ntdll/nt.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 53 insertions(+)
diff --git a/dlls/ntdll/nt.c b/dlls/ntdll/nt.c
index e79059b224..7380b236b1 100644
--- a/dlls/ntdll/nt.c
+++ b/dlls/ntdll/nt.c
@@ -108,6 +108,17 @@ struct smbios_board {
BYTE serial;
};
+struct smbios_chassis {
+ BYTE type;
+ BYTE length;
+ WORD handle;
+ BYTE vendor;
+ BYTE shape;
+ BYTE version;
+ BYTE serial;
+ BYTE asset_tag;
+};
+
#include "poppack.h"
/* Firmware table providers */
@@ -1945,12 +1956,15 @@ static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti
size_t system_vendor_size, system_product_size, system_version_size, system_serial_size;
char *board_vendor, *board_product, *board_version, *board_serial;
size_t board_vendor_size, board_product_size, board_version_size, board_serial_size;
+ char *chassis_vendor, *chassis_version, *chassis_serial, *chassis_asset_tag;
+ size_t chassis_vendor_size, chassis_version_size, chassis_serial_size, chassis_asset_tag_size;
char *buffer = (char*)sfti->TableBuffer;
BYTE string_count;
struct smbios_prologue *prologue;
struct smbios_bios *bios;
struct smbios_system *system;
struct smbios_board *board;
+ struct smbios_chassis *chassis;
bios_vendor = get_smbios_string("/sys/class/dmi/id/bios_vendor", &bios_vendor_size);
bios_version = get_smbios_string("/sys/class/dmi/id/bios_version", &bios_version_size);
@@ -1963,6 +1977,10 @@ static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti
board_product = get_smbios_string("/sys/class/dmi/id/board_name", &board_product_size);
board_version = get_smbios_string("/sys/class/dmi/id/board_version", &board_version_size);
board_serial = get_smbios_string("/sys/class/dmi/id/board_serial", &board_serial_size);
+ chassis_vendor = get_smbios_string("/sys/class/dmi/id/chassis_vendor", &chassis_vendor_size);
+ chassis_version = get_smbios_string("/sys/class/dmi/id/chassis_version", &chassis_version_size);
+ chassis_serial = get_smbios_string("/sys/class/dmi/id/chassis_serial", &chassis_serial_size);
+ chassis_asset_tag = get_smbios_string("/sys/class/dmi/id/chassis_tag", &chassis_asset_tag_size);
*required_len = FIELD_OFFSET(SYSTEM_FIRMWARE_TABLE_INFORMATION, TableBuffer);
@@ -1980,6 +1998,10 @@ static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti
*required_len += max(board_vendor_size + board_product_size + board_version_size +
board_serial_size + 1, 2);
+ *required_len += sizeof(struct smbios_chassis);
+ *required_len += max(chassis_vendor_size + chassis_version_size + chassis_serial_size +
+ chassis_asset_tag_size + 1, 2);
+
if (available_len < *required_len)
{
return STATUS_BUFFER_TOO_SMALL;
@@ -2048,6 +2070,33 @@ static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti
buffer += 2;
}
+ string_count = 0;
+ chassis = (struct smbios_chassis*)buffer;
+ chassis->type = 3;
+ chassis->length = sizeof(struct smbios_chassis);
+ chassis->handle = 0;
+ chassis->vendor = chassis_vendor ? ++string_count : 0;
+ chassis->shape = 0x2; /* unknown */
+ chassis->version = chassis_version ? ++string_count : 0;
+ chassis->serial = chassis_serial ? ++string_count : 0;
+ chassis->asset_tag = chassis_asset_tag ? ++string_count : 0;
+ buffer += sizeof(struct smbios_chassis);
+
+ if (string_count)
+ {
+ copy_smbios_string(&buffer, chassis_vendor, chassis_vendor_size);
+ copy_smbios_string(&buffer, chassis_version, chassis_version_size);
+ copy_smbios_string(&buffer, chassis_serial, chassis_serial_size);
+ copy_smbios_string(&buffer, chassis_asset_tag, chassis_asset_tag_size);
+ memset(buffer, 0, 1);
+ buffer++;
+ }
+ else
+ {
+ memset(buffer, 0, 2);
+ buffer += 2;
+ }
+
string_count = 0;
board = (struct smbios_board*)buffer;
board->type = 2;
@@ -2083,6 +2132,10 @@ static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti
free(board_product);
free(board_version);
free(board_serial);
+ free(chassis_vendor);
+ free(chassis_version);
+ free(chassis_serial);
+ free(chassis_asset_tag);
return STATUS_SUCCESS;
}
--
2.17.1
June 15, 2018
[PATCH v5 7/8] ntdll: Return board info from NtQuerySystemInformation on Linux
by Alex Henrie
Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
---
dlls/ntdll/nt.c | 52 +++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 52 insertions(+)
diff --git a/dlls/ntdll/nt.c b/dlls/ntdll/nt.c
index 560cb747bf..e79059b224 100644
--- a/dlls/ntdll/nt.c
+++ b/dlls/ntdll/nt.c
@@ -98,6 +98,16 @@ struct smbios_system {
BYTE serial;
};
+struct smbios_board {
+ BYTE type;
+ BYTE length;
+ WORD handle;
+ BYTE vendor;
+ BYTE product;
+ BYTE version;
+ BYTE serial;
+};
+
#include "poppack.h"
/* Firmware table providers */
@@ -1933,11 +1943,14 @@ static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti
size_t bios_vendor_size, bios_version_size, bios_date_size;
char *system_vendor, *system_product, *system_version, *system_serial;
size_t system_vendor_size, system_product_size, system_version_size, system_serial_size;
+ char *board_vendor, *board_product, *board_version, *board_serial;
+ size_t board_vendor_size, board_product_size, board_version_size, board_serial_size;
char *buffer = (char*)sfti->TableBuffer;
BYTE string_count;
struct smbios_prologue *prologue;
struct smbios_bios *bios;
struct smbios_system *system;
+ struct smbios_board *board;
bios_vendor = get_smbios_string("/sys/class/dmi/id/bios_vendor", &bios_vendor_size);
bios_version = get_smbios_string("/sys/class/dmi/id/bios_version", &bios_version_size);
@@ -1946,6 +1959,10 @@ static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti
system_product = get_smbios_string("/sys/class/dmi/id/product", &system_product_size);
system_version = get_smbios_string("/sys/class/dmi/id/product_version", &system_version_size);
system_serial = get_smbios_string("/sys/class/dmi/id/product_serial", &system_serial_size);
+ board_vendor = get_smbios_string("/sys/class/dmi/id/board_vendor", &board_vendor_size);
+ board_product = get_smbios_string("/sys/class/dmi/id/board_name", &board_product_size);
+ board_version = get_smbios_string("/sys/class/dmi/id/board_version", &board_version_size);
+ board_serial = get_smbios_string("/sys/class/dmi/id/board_serial", &board_serial_size);
*required_len = FIELD_OFFSET(SYSTEM_FIRMWARE_TABLE_INFORMATION, TableBuffer);
@@ -1955,9 +1972,14 @@ static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti
*required_len += max(bios_vendor_size + bios_version_size + bios_date_size + 1, 2);
*required_len += sizeof(struct smbios_system);
+
*required_len += max(system_vendor_size + system_product_size + system_version_size +
system_serial_size + 1, 2);
+ *required_len += sizeof(struct smbios_board);
+ *required_len += max(board_vendor_size + board_product_size + board_version_size +
+ board_serial_size + 1, 2);
+
if (available_len < *required_len)
{
return STATUS_BUFFER_TOO_SMALL;
@@ -2018,6 +2040,32 @@ static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti
copy_smbios_string(&buffer, system_version, system_version_size);
copy_smbios_string(&buffer, system_serial, system_serial_size);
memset(buffer, 0, 1);
+ buffer++;
+ }
+ else
+ {
+ memset(buffer, 0, 2);
+ buffer += 2;
+ }
+
+ string_count = 0;
+ board = (struct smbios_board*)buffer;
+ board->type = 2;
+ board->length = sizeof(struct smbios_board);
+ board->handle = 0;
+ board->vendor = board_vendor ? ++string_count : 0;
+ board->product = board_product ? ++string_count : 0;
+ board->version = board_version ? ++string_count : 0;
+ board->serial = board_serial ? ++string_count : 0;
+ buffer += sizeof(struct smbios_board);
+
+ if (string_count)
+ {
+ copy_smbios_string(&buffer, board_vendor, board_vendor_size);
+ copy_smbios_string(&buffer, board_product, board_product_size);
+ copy_smbios_string(&buffer, board_version, board_version_size);
+ copy_smbios_string(&buffer, board_serial, board_serial_size);
+ memset(buffer, 0, 1);
}
else
{
@@ -2031,6 +2079,10 @@ static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti
free(system_product);
free(system_version);
free(system_serial);
+ free(board_vendor);
+ free(board_product);
+ free(board_version);
+ free(board_serial);
return STATUS_SUCCESS;
}
--
2.17.1
June 15, 2018
[PATCH v5 6/8] ntdll: Return system info from NtQuerySystemInformation on Linux
by Alex Henrie
Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
---
dlls/ntdll/nt.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 51 insertions(+)
diff --git a/dlls/ntdll/nt.c b/dlls/ntdll/nt.c
index 658970b051..560cb747bf 100644
--- a/dlls/ntdll/nt.c
+++ b/dlls/ntdll/nt.c
@@ -88,6 +88,16 @@ struct smbios_bios {
UINT64 characteristics;
};
+struct smbios_system {
+ BYTE type;
+ BYTE length;
+ WORD handle;
+ BYTE vendor;
+ BYTE product;
+ BYTE version;
+ BYTE serial;
+};
+
#include "poppack.h"
/* Firmware table providers */
@@ -1921,14 +1931,21 @@ static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti
{
char *bios_vendor, *bios_version, *bios_date;
size_t bios_vendor_size, bios_version_size, bios_date_size;
+ char *system_vendor, *system_product, *system_version, *system_serial;
+ size_t system_vendor_size, system_product_size, system_version_size, system_serial_size;
char *buffer = (char*)sfti->TableBuffer;
BYTE string_count;
struct smbios_prologue *prologue;
struct smbios_bios *bios;
+ struct smbios_system *system;
bios_vendor = get_smbios_string("/sys/class/dmi/id/bios_vendor", &bios_vendor_size);
bios_version = get_smbios_string("/sys/class/dmi/id/bios_version", &bios_version_size);
bios_date = get_smbios_string("/sys/class/dmi/id/bios_date", &bios_date_size);
+ system_vendor = get_smbios_string("/sys/class/dmi/id/sys_vendor", &system_vendor_size);
+ system_product = get_smbios_string("/sys/class/dmi/id/product", &system_product_size);
+ system_version = get_smbios_string("/sys/class/dmi/id/product_version", &system_version_size);
+ system_serial = get_smbios_string("/sys/class/dmi/id/product_serial", &system_serial_size);
*required_len = FIELD_OFFSET(SYSTEM_FIRMWARE_TABLE_INFORMATION, TableBuffer);
@@ -1937,6 +1954,10 @@ static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti
*required_len += sizeof(struct smbios_bios);
*required_len += max(bios_vendor_size + bios_version_size + bios_date_size + 1, 2);
+ *required_len += sizeof(struct smbios_system);
+ *required_len += max(system_vendor_size + system_product_size + system_version_size +
+ system_serial_size + 1, 2);
+
if (available_len < *required_len)
{
return STATUS_BUFFER_TOO_SMALL;
@@ -1971,6 +1992,32 @@ static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti
copy_smbios_string(&buffer, bios_version, bios_version_size);
copy_smbios_string(&buffer, bios_date, bios_date_size);
memset(buffer, 0, 1);
+ buffer++;
+ }
+ else
+ {
+ memset(buffer, 0, 2);
+ buffer += 2;
+ }
+
+ string_count = 0;
+ system = (struct smbios_system*)buffer;
+ system->type = 1;
+ system->length = sizeof(struct smbios_system);
+ system->handle = 0;
+ system->vendor = system_vendor ? ++string_count : 0;
+ system->product = system_product ? ++string_count : 0;
+ system->version = system_version ? ++string_count : 0;
+ system->serial = system_serial ? ++string_count : 0;
+ buffer += sizeof(struct smbios_system);
+
+ if (string_count)
+ {
+ copy_smbios_string(&buffer, system_vendor, system_vendor_size);
+ copy_smbios_string(&buffer, system_product, system_product_size);
+ copy_smbios_string(&buffer, system_version, system_version_size);
+ copy_smbios_string(&buffer, system_serial, system_serial_size);
+ memset(buffer, 0, 1);
}
else
{
@@ -1980,6 +2027,10 @@ static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti
free(bios_vendor);
free(bios_version);
free(bios_date);
+ free(system_vendor);
+ free(system_product);
+ free(system_version);
+ free(system_serial);
return STATUS_SUCCESS;
}
--
2.17.1
June 15, 2018
[PATCH v5 5/8] kernel32: Connect GetSystemFirmwareTable to NtQuerySystemInformation
by Alex Henrie
Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
---
dlls/kernel32/cpu.c | 29 +++++++++++++++++++++++++++++
dlls/kernel32/process.c | 10 ----------
dlls/kernel32/tests/version.c | 2 --
3 files changed, 29 insertions(+), 12 deletions(-)
diff --git a/dlls/kernel32/cpu.c b/dlls/kernel32/cpu.c
index ec1fd0f90d..8397fbe729 100644
--- a/dlls/kernel32/cpu.c
+++ b/dlls/kernel32/cpu.c
@@ -336,3 +336,32 @@ DWORD64 WINAPI GetEnabledXStateFeatures(void)
FIXME("\n");
return 0;
}
+
+/***********************************************************************
+ * GetSystemFirmwareTable (KERNEL32.@)
+ */
+UINT WINAPI GetSystemFirmwareTable(DWORD provider, DWORD id, void *buffer, DWORD size)
+{
+ ULONG buffer_size = FIELD_OFFSET(SYSTEM_FIRMWARE_TABLE_INFORMATION, TableBuffer) + size;
+ SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti = HeapAlloc(GetProcessHeap(), 0, buffer_size);
+ NTSTATUS status;
+
+ if (!sfti)
+ {
+ SetLastError(ERROR_OUTOFMEMORY);
+ return 0;
+ }
+
+ sfti->ProviderSignature = provider;
+ sfti->Action = SystemFirmwareTable_Get;
+ sfti->TableID = id;
+
+ status = NtQuerySystemInformation(SystemFirmwareTableInformation, sfti, buffer_size, &buffer_size);
+ buffer_size -= FIELD_OFFSET(SYSTEM_FIRMWARE_TABLE_INFORMATION, TableBuffer);
+ if (buffer_size <= size)
+ memcpy(buffer, sfti->TableBuffer, buffer_size);
+
+ if (status) SetLastError(RtlNtStatusToDosError(status));
+ HeapFree(GetProcessHeap(), 0, sfti);
+ return buffer_size;
+}
diff --git a/dlls/kernel32/process.c b/dlls/kernel32/process.c
index ff56e9a692..6adf08d257 100644
--- a/dlls/kernel32/process.c
+++ b/dlls/kernel32/process.c
@@ -4126,16 +4126,6 @@ HRESULT WINAPI UnregisterApplicationRestart(void)
return S_OK;
}
-/***********************************************************************
- * GetSystemFirmwareTable (KERNEL32.@)
- */
-UINT WINAPI GetSystemFirmwareTable(DWORD provider, DWORD id, PVOID buffer, DWORD size)
-{
- FIXME("(%d %d %p %d):stub\n", provider, id, buffer, size);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return 0;
-}
-
struct proc_thread_attr
{
DWORD_PTR attr;
diff --git a/dlls/kernel32/tests/version.c b/dlls/kernel32/tests/version.c
index 6ca45f0b2e..90d63c2794 100644
--- a/dlls/kernel32/tests/version.c
+++ b/dlls/kernel32/tests/version.c
@@ -721,12 +721,10 @@ void test_GetSystemFirmwareTable(void)
expected_len -= 16;
len = GetSystemFirmwareTable(RSMB, 0, smbios_table, 0);
-todo_wine
ok(len == expected_len, "Expected length %u, got %u\n", expected_len, len);
smbios_table = HeapAlloc(GetProcessHeap(), 0, len);
len = GetSystemFirmwareTable(RSMB, 0, smbios_table, len);
-todo_wine
ok(len == expected_len, "Expected length %u, got %u\n", expected_len, len);
for (i = 0; i < len; i++)
{
--
2.17.1
June 15, 2018
[PATCH v5 4/8] ntdll: Return BIOS info from NtQuerySystemInformation on Linux
by Alex Henrie
Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
---
dlls/ntdll/nt.c | 174 ++++++++++++++++++++++++++++++++++++++++
dlls/ntdll/tests/info.c | 14 ++--
2 files changed, 182 insertions(+), 6 deletions(-)
diff --git a/dlls/ntdll/nt.c b/dlls/ntdll/nt.c
index dc0ce04f42..658970b051 100644
--- a/dlls/ntdll/nt.c
+++ b/dlls/ntdll/nt.c
@@ -66,6 +66,35 @@
WINE_DEFAULT_DEBUG_CHANNEL(ntdll);
+#include "pshpack1.h"
+
+struct smbios_prologue {
+ BYTE calling_method;
+ BYTE major_version;
+ BYTE minor_version;
+ BYTE revision;
+ DWORD length;
+};
+
+struct smbios_bios {
+ BYTE type;
+ BYTE length;
+ WORD handle;
+ BYTE vendor;
+ BYTE version;
+ WORD start;
+ BYTE date;
+ BYTE size;
+ UINT64 characteristics;
+};
+
+#include "poppack.h"
+
+/* Firmware table providers */
+#define ACPI 0x41435049
+#define FIRM 0x4649524D
+#define RSMB 0x52534D42
+
/*
* Token
*/
@@ -1850,6 +1879,129 @@ static NTSTATUS create_logical_proc_info(SYSTEM_LOGICAL_PROCESSOR_INFORMATION **
}
#endif
+static inline void copy_smbios_string(char **buffer, char *string, size_t string_size)
+{
+ if (!string) return;
+ strcpy(*buffer, string);
+ *buffer += string_size;
+}
+
+#ifdef linux
+
+static char* get_smbios_string(const char *path, size_t *string_size)
+{
+ FILE *file = fopen(path, "r");
+ char *ret = NULL;
+ *string_size = 0;
+ if (file)
+ {
+ *string_size = getline(&ret, string_size, file) + 1;
+ fclose(file);
+ if (*string_size >= 2 && ret[*string_size - 2] == '\n')
+ {
+ ret[*string_size - 2] = 0;
+ (*string_size)--;
+ }
+ if (*string_size == 1)
+ {
+ free(ret);
+ ret = NULL;
+ *string_size = 0;
+ }
+ }
+ return ret;
+}
+
+static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti,
+ ULONG available_len, ULONG *required_len)
+{
+ switch (sfti->ProviderSignature)
+ {
+ case RSMB:
+ {
+ char *bios_vendor, *bios_version, *bios_date;
+ size_t bios_vendor_size, bios_version_size, bios_date_size;
+ char *buffer = (char*)sfti->TableBuffer;
+ BYTE string_count;
+ struct smbios_prologue *prologue;
+ struct smbios_bios *bios;
+
+ bios_vendor = get_smbios_string("/sys/class/dmi/id/bios_vendor", &bios_vendor_size);
+ bios_version = get_smbios_string("/sys/class/dmi/id/bios_version", &bios_version_size);
+ bios_date = get_smbios_string("/sys/class/dmi/id/bios_date", &bios_date_size);
+
+ *required_len = FIELD_OFFSET(SYSTEM_FIRMWARE_TABLE_INFORMATION, TableBuffer);
+
+ *required_len += sizeof(struct smbios_prologue);
+
+ *required_len += sizeof(struct smbios_bios);
+ *required_len += max(bios_vendor_size + bios_version_size + bios_date_size + 1, 2);
+
+ if (available_len < *required_len)
+ {
+ return STATUS_BUFFER_TOO_SMALL;
+ }
+
+ sfti->TableBufferLength = *required_len - FIELD_OFFSET(SYSTEM_FIRMWARE_TABLE_INFORMATION, TableBuffer);
+
+ prologue = (struct smbios_prologue*)buffer;
+ prologue->calling_method = 0;
+ prologue->major_version = 2;
+ prologue->minor_version = 0;
+ prologue->revision = 0;
+ prologue->length = sfti->TableBufferLength - sizeof(struct smbios_prologue);
+ buffer += sizeof(struct smbios_prologue);
+
+ string_count = 0;
+ bios = (struct smbios_bios*)buffer;
+ bios->type = 0;
+ bios->length = sizeof(struct smbios_bios);
+ bios->handle = 0;
+ bios->vendor = bios_vendor ? ++string_count : 0;
+ bios->version = bios_version ? ++string_count : 0;
+ bios->start = 0;
+ bios->date = bios_date ? ++string_count : 0;
+ bios->size = 0;
+ bios->characteristics = 0x4; /* not supported */
+ buffer += sizeof(struct smbios_bios);
+
+ if (string_count)
+ {
+ copy_smbios_string(&buffer, bios_vendor, bios_vendor_size);
+ copy_smbios_string(&buffer, bios_version, bios_version_size);
+ copy_smbios_string(&buffer, bios_date, bios_date_size);
+ memset(buffer, 0, 1);
+ }
+ else
+ {
+ memset(buffer, 0, 2);
+ }
+
+ free(bios_vendor);
+ free(bios_version);
+ free(bios_date);
+
+ return STATUS_SUCCESS;
+ }
+ default:
+ {
+ return STATUS_NOT_IMPLEMENTED;
+ FIXME("info_class SYSTEM_FIRMWARE_TABLE_INFORMATION\n");
+ }
+ }
+}
+
+#else
+
+static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti,
+ ULONG available_len, ULONG *required_len)
+{
+ return STATUS_NOT_IMPLEMENTED;
+ FIXME("info_class SYSTEM_FIRMWARE_TABLE_INFORMATION\n");
+}
+
+#endif
+
/******************************************************************************
* NtQuerySystemInformation [NTDLL.@]
* ZwQuerySystemInformation [NTDLL.@]
@@ -2359,6 +2511,28 @@ NTSTATUS WINAPI NtQuerySystemInformation(
else ret = STATUS_INFO_LENGTH_MISMATCH;
}
break;
+ case SystemFirmwareTableInformation:
+ {
+ SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti = (SYSTEM_FIRMWARE_TABLE_INFORMATION*)SystemInformation;
+ len = FIELD_OFFSET(SYSTEM_FIRMWARE_TABLE_INFORMATION, TableBuffer);
+ if (Length < len)
+ {
+ ret = STATUS_INFO_LENGTH_MISMATCH;
+ break;
+ }
+
+ switch (sfti->Action)
+ {
+ case SystemFirmwareTable_Get:
+ ret = get_firmware_info(sfti, Length, &len);
+ break;
+ default:
+ len = 0;
+ ret = STATUS_NOT_IMPLEMENTED;
+ FIXME("info_class SYSTEM_FIRMWARE_TABLE_INFORMATION\n");
+ }
+ }
+ break;
default:
FIXME("(0x%08x,%p,0x%08x,%p) stub\n",
SystemInformationClass,SystemInformation,Length,ResultLength);
diff --git a/dlls/ntdll/tests/info.c b/dlls/ntdll/tests/info.c
index cdb91e1b73..b8feebd474 100644
--- a/dlls/ntdll/tests/info.c
+++ b/dlls/ntdll/tests/info.c
@@ -59,6 +59,12 @@ static DWORD one_before_last_pid = 0;
#define FIRM 0x4649524D
#define RSMB 0x52534D42
+#ifdef linux
+static const int firmware_todo = 0;
+#else
+static const int firmware_todo = 1;
+#endif
+
static BOOL InitFunctionPtrs(void)
{
/* All needed functions are NT based, so using GetModuleHandle is a good check */
@@ -840,13 +846,10 @@ static void test_query_firmware(void)
ok(!!sfti, "Failed to allocate memory\n");
status = pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, 15, &len1);
-todo_wine
ok(status == STATUS_INFO_LENGTH_MISMATCH, "Expected STATUS_INFO_LENGTH_MISMATCH, got %08x\n", status);
-todo_wine
ok(len1 == 16, "Expected length 16, got %u\n", len1);
status = pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, 16, &len1);
-todo_wine
ok(status == STATUS_NOT_IMPLEMENTED, "Expected STATUS_NOT_IMPLEMENTED, got %08x\n", status);
ok(len1 == 0, "Expected length 0, got %u\n", len1);
@@ -854,16 +857,15 @@ todo_wine
sfti->Action = SystemFirmwareTable_Get;
status = pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, 16, &len1);
-todo_wine
+todo_wine_if(firmware_todo)
ok(status == STATUS_BUFFER_TOO_SMALL, "Expected STATUS_BUFFER_TOO_SMALL, got %08x\n", status);
-todo_wine
ok(len1 >= 16, "Expected length >= 16, got %u\n", len1);
sfti = HeapReAlloc(GetProcessHeap(), 0, sfti, len1);
ok(!!sfti, "Failed to allocate memory\n");
status = pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, len1, &len2);
-todo_wine
+todo_wine_if(firmware_todo)
ok(status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %08x\n", status);
ok(len2 == len1, "Expected length %u, got %u\n", len1, len2);
--
2.17.1
June 15, 2018
[PATCH v5 3/8] kernel32/tests: Add GetSystemFirmwareTable tests
by Alex Henrie
Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
---
dlls/kernel32/tests/version.c | 42 +++++++++++++++++++++++++++++++++++
1 file changed, 42 insertions(+)
diff --git a/dlls/kernel32/tests/version.c b/dlls/kernel32/tests/version.c
index eb78a383d2..6ca45f0b2e 100644
--- a/dlls/kernel32/tests/version.c
+++ b/dlls/kernel32/tests/version.c
@@ -26,11 +26,17 @@
#include "winternl.h"
static BOOL (WINAPI * pGetProductInfo)(DWORD, DWORD, DWORD, DWORD, DWORD *);
+static NTSTATUS (WINAPI * pNtQuerySystemInformation)(SYSTEM_INFORMATION_CLASS, void *, ULONG, ULONG *);
static NTSTATUS (WINAPI * pRtlGetVersion)(RTL_OSVERSIONINFOEXW *);
#define GET_PROC(func) \
p##func = (void *)GetProcAddress(hmod, #func);
+/* Firmware table providers */
+#define ACPI 0x41435049
+#define FIRM 0x4649524D
+#define RSMB 0x52534D42
+
static void init_function_pointers(void)
{
HMODULE hmod;
@@ -41,6 +47,7 @@ static void init_function_pointers(void)
hmod = GetModuleHandleA("ntdll.dll");
+ GET_PROC(NtQuerySystemInformation);
GET_PROC(RtlGetVersion);
}
@@ -697,6 +704,40 @@ static void test_VerifyVersionInfo(void)
ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError());
}
+void test_GetSystemFirmwareTable(void)
+{
+ ULONG expected_len, i;
+ UINT len;
+ SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti = HeapAlloc(GetProcessHeap(), 0, 16);
+ UCHAR *smbios_table = NULL;
+
+ ok(!!sfti, "Failed to allocate memory\n");
+ sfti->ProviderSignature = RSMB;
+ sfti->Action = SystemFirmwareTable_Get;
+ pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, 16, &expected_len);
+ sfti = HeapReAlloc(GetProcessHeap(), 0, sfti, expected_len);
+ ok(!!sfti, "Failed to allocate memory\n");
+ pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, expected_len, &expected_len);
+
+ expected_len -= 16;
+ len = GetSystemFirmwareTable(RSMB, 0, smbios_table, 0);
+todo_wine
+ ok(len == expected_len, "Expected length %u, got %u\n", expected_len, len);
+
+ smbios_table = HeapAlloc(GetProcessHeap(), 0, len);
+ len = GetSystemFirmwareTable(RSMB, 0, smbios_table, len);
+todo_wine
+ ok(len == expected_len, "Expected length %u, got %u\n", expected_len, len);
+ for (i = 0; i < len; i++)
+ {
+ ok(smbios_table[i] == sfti->TableBuffer[i],
+ "Offset %u: Expected %02x, got %02x\n", i, sfti->TableBuffer[i], smbios_table[i]);
+ }
+
+ HeapFree(GetProcessHeap(), 0, sfti);
+ HeapFree(GetProcessHeap(), 0, smbios_table);
+}
+
START_TEST(version)
{
init_function_pointers();
@@ -704,4 +745,5 @@ START_TEST(version)
test_GetProductInfo();
test_GetVersionEx();
test_VerifyVersionInfo();
+ test_GetSystemFirmwareTable();
}
--
2.17.1
June 15, 2018
[PATCH v5 2/8] ntdll/tests: Add SystemFirmwareTableInformation tests
by Alex Henrie
Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
---
dlls/ntdll/tests/info.c | 48 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 48 insertions(+)
diff --git a/dlls/ntdll/tests/info.c b/dlls/ntdll/tests/info.c
index 6c93c3cd58..cdb91e1b73 100644
--- a/dlls/ntdll/tests/info.c
+++ b/dlls/ntdll/tests/info.c
@@ -54,6 +54,11 @@ static DWORD one_before_last_pid = 0;
} \
} while(0)
+/* Firmware table providers */
+#define ACPI 0x41435049
+#define FIRM 0x4649524D
+#define RSMB 0x52534D42
+
static BOOL InitFunctionPtrs(void)
{
/* All needed functions are NT based, so using GetModuleHandle is a good check */
@@ -826,6 +831,45 @@ static void test_query_logicalprocex(void)
}
}
+static void test_query_firmware(void)
+{
+ ULONG len1, len2;
+ NTSTATUS status;
+ SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 16);
+
+ ok(!!sfti, "Failed to allocate memory\n");
+
+ status = pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, 15, &len1);
+todo_wine
+ ok(status == STATUS_INFO_LENGTH_MISMATCH, "Expected STATUS_INFO_LENGTH_MISMATCH, got %08x\n", status);
+todo_wine
+ ok(len1 == 16, "Expected length 16, got %u\n", len1);
+
+ status = pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, 16, &len1);
+todo_wine
+ ok(status == STATUS_NOT_IMPLEMENTED, "Expected STATUS_NOT_IMPLEMENTED, got %08x\n", status);
+ ok(len1 == 0, "Expected length 0, got %u\n", len1);
+
+ sfti->ProviderSignature = RSMB;
+ sfti->Action = SystemFirmwareTable_Get;
+
+ status = pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, 16, &len1);
+todo_wine
+ ok(status == STATUS_BUFFER_TOO_SMALL, "Expected STATUS_BUFFER_TOO_SMALL, got %08x\n", status);
+todo_wine
+ ok(len1 >= 16, "Expected length >= 16, got %u\n", len1);
+
+ sfti = HeapReAlloc(GetProcessHeap(), 0, sfti, len1);
+ ok(!!sfti, "Failed to allocate memory\n");
+
+ status = pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, len1, &len2);
+todo_wine
+ ok(status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %08x\n", status);
+ ok(len2 == len1, "Expected length %u, got %u\n", len1, len2);
+
+ HeapFree(GetProcessHeap(), 0, sfti);
+}
+
static void test_query_processor_power_info(void)
{
NTSTATUS status;
@@ -2267,6 +2311,10 @@ START_TEST(info)
trace("Starting test_process_debug_flags()\n");
test_query_process_debug_flags(argc, argv);
+ /* 0x4C SystemFirmwareTableInformation */
+ trace("Starting test_query_firmware()\n");
+ test_query_firmware();
+
/* belongs to its own file */
trace("Starting test_readvirtualmemory()\n");
test_readvirtualmemory();
--
2.17.1
June 15, 2018
[PATCH v5 1/8] include: Add SYSTEM_FIRMWARE_TABLE_INFORMATION to winternl.h
by Alex Henrie
Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
---
include/winternl.h | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/include/winternl.h b/include/winternl.h
index 58c475dfff..6e0bd987b6 100644
--- a/include/winternl.h
+++ b/include/winternl.h
@@ -1579,6 +1579,23 @@ typedef struct _SYSTEM_TIME_ADJUSTMENT {
BOOLEAN TimeAdjustmentDisabled;
} SYSTEM_TIME_ADJUSTMENT, *PSYSTEM_TIME_ADJUSTMENT;
+typedef enum _SYSTEM_FIRMWARE_TABLE_ACTION
+{
+ SystemFirmwareTable_Enumerate = 0,
+ SystemFirmwareTable_Get = 1
+} SYSTEM_FIRMWARE_TABLE_ACTION, *PSYSTEM_FIRMWARE_TABLE_ACTION;
+
+/* System Information Class 0x4C */
+
+typedef struct _SYSTEM_FIRMWARE_TABLE_INFORMATION
+{
+ ULONG ProviderSignature;
+ SYSTEM_FIRMWARE_TABLE_ACTION Action;
+ ULONG TableID;
+ ULONG TableBufferLength;
+ UCHAR TableBuffer[1];
+} SYSTEM_FIRMWARE_TABLE_INFORMATION, *PSYSTEM_FIRMWARE_TABLE_INFORMATION;
+
typedef struct _TIME_FIELDS
{ CSHORT Year;
CSHORT Month;
--
2.17.1
June 15, 2018
[PATCH 2/2] iphlpapi: Improve parameter checking for IcmpSendEcho().
by Zhiyi Zhang
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
---
dlls/iphlpapi/icmp.c | 9 +++++++--
dlls/iphlpapi/tests/iphlpapi.c | 8 --------
2 files changed, 7 insertions(+), 10 deletions(-)
diff --git a/dlls/iphlpapi/icmp.c b/dlls/iphlpapi/icmp.c
index 7c91443598..c9603b7baa 100644
--- a/dlls/iphlpapi/icmp.c
+++ b/dlls/iphlpapi/icmp.c
@@ -290,11 +290,16 @@ DWORD WINAPI IcmpSendEcho(
if (IcmpHandle==INVALID_HANDLE_VALUE) {
/* FIXME: in fact win98 seems to ignore the handle value !!! */
- SetLastError(ERROR_INVALID_HANDLE);
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return 0;
+ }
+
+ if (!ReplyBuffer||!ReplySize) {
+ SetLastError(ERROR_INVALID_PARAMETER);
return 0;
}
- if (ReplySize<sizeof(ICMP_ECHO_REPLY)+ICMP_MINLEN) {
+ if (ReplySize<sizeof(ICMP_ECHO_REPLY)) {
SetLastError(IP_BUF_TOO_SMALL);
return 0;
}
diff --git a/dlls/iphlpapi/tests/iphlpapi.c b/dlls/iphlpapi/tests/iphlpapi.c
index f964878d68..ff381c5e29 100644
--- a/dlls/iphlpapi/tests/iphlpapi.c
+++ b/dlls/iphlpapi/tests/iphlpapi.c
@@ -966,7 +966,6 @@ static void testIcmpSendEcho(void)
ret = pIcmpSendEcho(INVALID_HANDLE_VALUE, address, senddata, sizeof(senddata), NULL, replydata, replysz, 1000);
error = GetLastError();
ok (!ret, "IcmpSendEcho succeeded unexpectedly\n");
-todo_wine
ok (error == ERROR_INVALID_PARAMETER
|| broken(error == ERROR_INVALID_HANDLE) /* <= 2003 */,
"expected 87, got %d\n", error);
@@ -1009,20 +1008,16 @@ todo_wine
error = GetLastError();
ok (ret, "IcmpSendEcho failed unexpectedly with error %d\n", error);
- if (0) /* crashes in wine, remove IF when fixed */
- {
SetLastError(0xdeadbeef);
ret = pIcmpSendEcho(icmp, address, senddata, sizeof(senddata), NULL, NULL, replysz, 1000);
error = GetLastError();
ok (!ret, "IcmpSendEcho succeeded unexpectedly\n");
ok (error == ERROR_INVALID_PARAMETER, "expected 87, got %d\n", error);
- }
SetLastError(0xdeadbeef);
ret = pIcmpSendEcho(icmp, address, senddata, sizeof(senddata), NULL, replydata, 0, 1000);
error = GetLastError();
ok (!ret, "IcmpSendEcho succeeded unexpectedly\n");
-todo_wine
ok (error == ERROR_INVALID_PARAMETER
|| broken(error == ERROR_INSUFFICIENT_BUFFER) /* <= 2003 */,
"expected 87, got %d\n", error);
@@ -1031,7 +1026,6 @@ todo_wine
ret = pIcmpSendEcho(icmp, address, senddata, sizeof(senddata), NULL, NULL, 0, 1000);
error = GetLastError();
ok (!ret, "IcmpSendEcho succeeded unexpectedly\n");
-todo_wine
ok (error == ERROR_INVALID_PARAMETER
|| broken(error == ERROR_INSUFFICIENT_BUFFER) /* <= 2003 */,
"expected 87, got %d\n", error);
@@ -1049,7 +1043,6 @@ todo_wine
replysz = sizeof(ICMP_ECHO_REPLY);
ret = pIcmpSendEcho(icmp, address, senddata, 0, NULL, replydata, replysz, 1000);
error = GetLastError();
-todo_wine
ok (ret, "IcmpSendEcho failed unexpectedly with error %d\n", error);
SetLastError(0xdeadbeef);
@@ -1071,7 +1064,6 @@ todo_wine
ret = pIcmpSendEcho(icmp, address, senddata, ICMP_MINLEN, NULL, replydata, replysz - 1, 1000);
error = GetLastError();
ok (!ret, "IcmpSendEcho succeeded unexpectedly\n");
-todo_wine
ok (error == IP_GENERAL_FAILURE
|| broken(error == IP_BUF_TOO_SMALL) /* <= 2003 */,
"expected 11050, got %d\n", error);
--
2.17.1
June 15, 2018
[PATCH 1/2] iphlpapi: Use a standalone buffer in IcmpSendEcho().
by Zhiyi Zhang
Fix https://bugs.winehq.org/show_bug.cgi?id=43252
The old implementation uses user provided buffer to receive
packet data, which is alway not enough, causing data corruptions
or incorrectly timeout.
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
---
dlls/iphlpapi/icmp.c | 38 +++++++++++++++++++++++++++-------
dlls/iphlpapi/tests/iphlpapi.c | 21 +++++++++++++++----
2 files changed, 47 insertions(+), 12 deletions(-)
diff --git a/dlls/iphlpapi/icmp.c b/dlls/iphlpapi/icmp.c
index ebc2f2b65c..7c91443598 100644
--- a/dlls/iphlpapi/icmp.c
+++ b/dlls/iphlpapi/icmp.c
@@ -113,6 +113,9 @@ typedef struct {
#define IP_OPTS_DEFAULT 1
#define IP_OPTS_CUSTOM 2
+#define MAXIPLEN 60
+#define MAXICMPLEN 76
+
/* The sequence number is unique process wide, so that all threads
* have a distinct sequence number.
*/
@@ -270,13 +273,14 @@ DWORD WINAPI IcmpSendEcho(
icmp_t* icp=(icmp_t*)IcmpHandle;
unsigned char* reqbuf;
int reqsize;
+ unsigned char* repbuf;
+ int repsize;
struct icmp_echo_reply* ier;
struct ip* ip_header;
struct icmp* icmp_header;
char* endbuf;
int ip_header_len;
- int maxlen;
struct pollfd fdr;
DWORD send_time,recv_time;
struct sockaddr_in addr;
@@ -312,6 +316,16 @@ DWORD WINAPI IcmpSendEcho(
return 0;
}
+ /* max ip header + max icmp header and error data + reply size(max 65535 on Windows) */
+ /* FIXME: request size of 65535 is not supported yet because max buffer size of raw socket on linux is 32767 */
+ repsize=MAXIPLEN+MAXICMPLEN+(ReplySize&0xFFFF);
+ repbuf=HeapAlloc(GetProcessHeap(), 0, repsize);
+ if (reqbuf==NULL) {
+ HeapFree(GetProcessHeap(), 0, reqbuf);
+ SetLastError(ERROR_OUTOFMEMORY);
+ return 0;
+ }
+
icmp_header=(struct icmp*)reqbuf;
icmp_header->icmp_type=ICMP_ECHO;
icmp_header->icmp_code=0;
@@ -367,9 +381,7 @@ DWORD WINAPI IcmpSendEcho(
fdr.events = POLLIN;
addrlen=sizeof(addr);
ier=ReplyBuffer;
- ip_header=(struct ip *) ((char *) ReplyBuffer+sizeof(ICMP_ECHO_REPLY));
endbuf=(char *) ReplyBuffer+ReplySize;
- maxlen=ReplySize-sizeof(ICMP_ECHO_REPLY);
/* Send the packet */
TRACE("Sending %d bytes (RequestSize=%d) to %s\n", reqsize, RequestSize, inet_ntoa(addr.sin_addr));
@@ -407,10 +419,11 @@ DWORD WINAPI IcmpSendEcho(
}
/* Get the reply */
+ ip_header=(struct ip*)repbuf;
ip_header_len=0; /* because gcc was complaining */
while (poll(&fdr,1,Timeout)>0) {
recv_time = GetTickCount();
- res=recvfrom(icp->sid, (char*)ip_header, maxlen, 0, (struct sockaddr*)&addr,&addrlen);
+ res=recvfrom(icp->sid, (char*)repbuf, repsize, 0, (struct sockaddr*)&addr, &addrlen);
TRACE("received %d bytes from %s\n",res, inet_ntoa(addr.sin_addr));
ier->Status=IP_REQ_TIMED_OUT;
@@ -508,6 +521,12 @@ DWORD WINAPI IcmpSendEcho(
else Timeout = 0;
continue;
} else {
+ /* Check free space, should be large enough for an ICMP_ECHO_REPLY and remainning icmp data */
+ if (endbuf-(char *)ier < sizeof(struct icmp_echo_reply)+(res-ip_header_len-ICMP_MINLEN)) {
+ res=ier-(ICMP_ECHO_REPLY *)ReplyBuffer;
+ SetLastError(IP_GENERAL_FAILURE);
+ goto done;
+ }
/* This is a reply to our packet */
memcpy(&ier->Address,&ip_header->ip_src,sizeof(IPAddr));
/* Status is already set */
@@ -515,7 +534,7 @@ DWORD WINAPI IcmpSendEcho(
ier->DataSize=res-ip_header_len-ICMP_MINLEN;
ier->Reserved=0;
ier->Data=endbuf-ier->DataSize;
- memmove(ier->Data,((char*)ip_header)+ip_header_len+ICMP_MINLEN,ier->DataSize);
+ memcpy(ier->Data, ((char *)ip_header)+ip_header_len+ICMP_MINLEN, ier->DataSize);
ier->Options.Ttl=ip_header->ip_ttl;
ier->Options.Tos=ip_header->ip_tos;
ier->Options.Flags=ip_header->ip_off >> 13;
@@ -523,7 +542,7 @@ DWORD WINAPI IcmpSendEcho(
if (ier->Options.OptionsSize!=0) {
ier->Options.OptionsData=(unsigned char *) ier->Data-ier->Options.OptionsSize;
/* FIXME: We are supposed to rearrange the option's 'source route' data */
- memmove(ier->Options.OptionsData,((char*)ip_header)+ip_header_len,ier->Options.OptionsSize);
+ memcpy(ier->Options.OptionsData, ((char *)ip_header)+ip_header_len, ier->Options.OptionsSize);
endbuf=(char*)ier->Options.OptionsData;
} else {
ier->Options.OptionsData=NULL;
@@ -531,9 +550,8 @@ DWORD WINAPI IcmpSendEcho(
}
/* Prepare for the next packet */
+ endbuf-=ier->DataSize;
ier++;
- ip_header=(struct ip*)(((char*)ip_header)+sizeof(ICMP_ECHO_REPLY));
- maxlen=endbuf-(char*)ip_header;
/* Check out whether there is more but don't wait this time */
Timeout=0;
@@ -542,6 +560,10 @@ DWORD WINAPI IcmpSendEcho(
res=ier-(ICMP_ECHO_REPLY*)ReplyBuffer;
if (res==0)
SetLastError(IP_REQ_TIMED_OUT);
+ else
+ SetLastError(NO_ERROR);
+done:
+ HeapFree(GetProcessHeap(), 0, repbuf);
TRACE("received %d replies\n",res);
return res;
}
diff --git a/dlls/iphlpapi/tests/iphlpapi.c b/dlls/iphlpapi/tests/iphlpapi.c
index d5613d7b4b..f964878d68 100644
--- a/dlls/iphlpapi/tests/iphlpapi.c
+++ b/dlls/iphlpapi/tests/iphlpapi.c
@@ -951,6 +951,8 @@ static void testIcmpSendEcho(void)
char senddata[32], replydata[sizeof(senddata) + sizeof(ICMP_ECHO_REPLY)];
DWORD ret, error, replysz = sizeof(replydata);
IPAddr address;
+ ICMP_ECHO_REPLY *reply;
+ INT i;
if (!pIcmpSendEcho || !pIcmpCreateFile)
{
@@ -1038,12 +1040,10 @@ todo_wine
replysz = sizeof(replydata) - 1;
ret = pIcmpSendEcho(icmp, address, senddata, sizeof(senddata), NULL, replydata, replysz, 1000);
error = GetLastError();
- todo_wine {
ok (!ret, "IcmpSendEcho succeeded unexpectedly\n");
ok (error == IP_GENERAL_FAILURE
|| broken(error == IP_BUF_TOO_SMALL) /* <= 2003 */,
"expected 11050, got %d\n", error);
- }
SetLastError(0xdeadbeef);
replysz = sizeof(ICMP_ECHO_REPLY);
@@ -1056,7 +1056,6 @@ todo_wine
replysz = sizeof(ICMP_ECHO_REPLY) + ICMP_MINLEN;
ret = pIcmpSendEcho(icmp, address, senddata, ICMP_MINLEN, NULL, replydata, replysz, 1000);
error = GetLastError();
-todo_wine
ok (ret, "IcmpSendEcho failed unexpectedly with error %d\n", error);
SetLastError(0xdeadbeef);
@@ -1064,7 +1063,6 @@ todo_wine
ret = pIcmpSendEcho(icmp, address, senddata, ICMP_MINLEN + 1, NULL, replydata, replysz, 1000);
error = GetLastError();
ok (!ret, "IcmpSendEcho succeeded unexpectedly\n");
-todo_wine
ok (error == IP_GENERAL_FAILURE
|| broken(error == IP_BUF_TOO_SMALL) /* <= 2003 */,
"expected 11050, got %d\n", error);
@@ -1111,6 +1109,21 @@ todo_wine
{
skip ("Failed to ping with error %d, is lo interface down?.\n", error);
}
+
+ /* check reply data */
+ SetLastError(0xdeadbeef);
+ address = htonl(INADDR_LOOPBACK);
+ for (i = 0; i < ARRAY_SIZE(senddata); i++) senddata[i] = i & 0xff;
+ ret = pIcmpSendEcho(icmp, address, senddata, sizeof(senddata), NULL, replydata, replysz, 1000);
+ error = GetLastError();
+ reply = (ICMP_ECHO_REPLY *)replydata;
+ ok(ret, "IcmpSendEcho failed unexpectedly\n");
+ ok(error == NO_ERROR, "Expect last error:0x%08x, got:0x%08x\n", NO_ERROR, error);
+ ok(INADDR_LOOPBACK == ntohl(reply->Address), "Address mismatch, expect:%s, got: %s\n", ntoa(INADDR_LOOPBACK),
+ ntoa(reply->Address));
+ ok(reply->Status == IP_SUCCESS, "Expect status:0x%08x, got:0x%08x\n", IP_SUCCESS, reply->Status);
+ ok(reply->DataSize == sizeof(senddata), "Expect data size:%d, got:%d\n", sizeof(senddata), reply->DataSize);
+ ok(!memcmp(senddata, reply->Data, min(sizeof(senddata), reply->DataSize)), "Data mismatch\n");
}
/*
--
2.17.1
June 15, 2018
[PATCH] kernel32: Always start debugger on WinSta0.
by Alistair Leslie-Hughes
From: Sebastian Lackner <sebastian(a)fds-team.de>
Signed-off-by: Alistair Leslie-Hughes <leslie_alistair(a)hotmail.com>
---
dlls/kernel32/except.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/dlls/kernel32/except.c b/dlls/kernel32/except.c
index de244fc..5f2166e 100644
--- a/dlls/kernel32/except.c
+++ b/dlls/kernel32/except.c
@@ -304,6 +304,7 @@ static BOOL start_debugger(PEXCEPTION_POINTERS epointers, HANDLE hEvent)
TRACE("Starting debugger %s\n", debugstr_a(cmdline));
memset(&startup, 0, sizeof(startup));
startup.cb = sizeof(startup);
+ startup.lpDesktop = (char *)"WinSta0";
startup.dwFlags = STARTF_USESHOWWINDOW;
startup.wShowWindow = SW_SHOWNORMAL;
ret = CreateProcessA(NULL, cmdline, NULL, NULL, TRUE, 0, env, NULL, &startup, &info);
--
1.9.1
June 15, 2018
[PATCH v3] comctl32/taskdialog: Add support for progress bar.
by Zhiyi Zhang
Rebase. Supersede 147419.
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
---
dlls/comctl32/taskdialog.c | 55 ++++++++++++++++++++++++++
dlls/comctl32/tests/taskdialog.c | 67 ++++++++++++++++++++++++++++++++
2 files changed, 122 insertions(+)
diff --git a/dlls/comctl32/taskdialog.c b/dlls/comctl32/taskdialog.c
index 07c031b2c7..1a5fad1609 100644
--- a/dlls/comctl32/taskdialog.c
+++ b/dlls/comctl32/taskdialog.c
@@ -57,6 +57,7 @@ struct taskdialog_info
HWND main_icon;
HWND main_instruction;
HWND content;
+ HWND progress_bar;
HWND *buttons;
INT button_count;
HWND default_button;
@@ -351,6 +352,17 @@ static void taskdialog_add_content(struct taskdialog_info *dialog_info)
taskdialog_hyperlink_enabled(dialog_info));
}
+static void taskdialog_add_progress_bar(struct taskdialog_info *dialog_info)
+{
+ const TASKDIALOGCONFIG *taskconfig = dialog_info->taskconfig;
+ DWORD style = PBS_SMOOTH | PBS_SMOOTHREVERSE | WS_CHILD | WS_VISIBLE;
+
+ if (!(taskconfig->dwFlags & (TDF_SHOW_PROGRESS_BAR | TDF_SHOW_MARQUEE_PROGRESS_BAR))) return;
+ if (taskconfig->dwFlags & TDF_SHOW_MARQUEE_PROGRESS_BAR) style |= PBS_MARQUEE;
+ dialog_info->progress_bar =
+ CreateWindowW(PROGRESS_CLASSW, NULL, style, 0, 0, 0, 0, dialog_info->hwnd, NULL, 0, NULL);
+}
+
static void taskdialog_add_button(struct taskdialog_info *dialog_info, HWND *button, INT_PTR id, const WCHAR *text,
BOOL custom_button)
{
@@ -464,6 +476,17 @@ static void taskdialog_layout(struct taskdialog_info *dialog_info)
/* Content */
taskdialog_label_layout(dialog_info, dialog_info->content, main_icon_right, dialog_width, &dialog_height, syslink);
+ /* Progress bar */
+ if (dialog_info->progress_bar)
+ {
+ x = main_icon_right + h_spacing;
+ y = dialog_height + v_spacing;
+ size.cx = dialog_width - x - h_spacing;
+ size.cy = GetSystemMetrics(SM_CYVSCROLL);
+ SetWindowPos(dialog_info->progress_bar, 0, x, y, size.cx, size.cy, SWP_NOZORDER);
+ dialog_height = y + size.cy;
+ }
+
dialog_height = max(dialog_height, main_icon_bottom);
/* Common and custom buttons */
@@ -598,6 +621,7 @@ static void taskdialog_init(struct taskdialog_info *dialog_info, HWND hwnd)
taskdialog_add_main_icon(dialog_info);
taskdialog_add_main_instruction(dialog_info);
taskdialog_add_content(dialog_info);
+ taskdialog_add_progress_bar(dialog_info);
taskdialog_add_buttons(dialog_info);
/* Set default button */
@@ -621,6 +645,7 @@ static INT_PTR CALLBACK taskdialog_proc(HWND hwnd, UINT msg, WPARAM wParam, LPAR
{
static const WCHAR taskdialog_info_propnameW[] = {'T','a','s','k','D','i','a','l','o','g','I','n','f','o',0};
struct taskdialog_info *dialog_info;
+ LRESULT result;
TRACE("hwnd=%p msg=0x%04x wparam=%lx lparam=%lx\n", hwnd, msg, wParam, lParam);
@@ -635,6 +660,36 @@ static INT_PTR CALLBACK taskdialog_proc(HWND hwnd, UINT msg, WPARAM wParam, LPAR
case TDM_ENABLE_BUTTON:
taskdialog_enable_button(dialog_info, wParam, lParam);
break;
+ case TDM_SET_MARQUEE_PROGRESS_BAR:
+ {
+ BOOL marquee = wParam;
+ LONG style;
+ if(!dialog_info->progress_bar) break;
+ style = GetWindowLongW(dialog_info->progress_bar, GWL_STYLE);
+ style = marquee ? style | PBS_MARQUEE : style & (~PBS_MARQUEE);
+ SetWindowLongW(dialog_info->progress_bar, GWL_STYLE, style);
+ break;
+ }
+ case TDM_SET_PROGRESS_BAR_STATE:
+ result = SendMessageW(dialog_info->progress_bar, PBM_SETSTATE, wParam, 0);
+ SetWindowLongPtrW(hwnd, DWLP_MSGRESULT, result);
+ break;
+ case TDM_SET_PROGRESS_BAR_RANGE:
+ result = SendMessageW(dialog_info->progress_bar, PBM_SETRANGE, 0, lParam);
+ SetWindowLongPtrW(hwnd, DWLP_MSGRESULT, result);
+ break;
+ case TDM_SET_PROGRESS_BAR_POS:
+ result = 0;
+ if (dialog_info->progress_bar)
+ {
+ LONG style = GetWindowLongW(dialog_info->progress_bar, GWL_STYLE);
+ if (!(style & PBS_MARQUEE)) result = SendMessageW(dialog_info->progress_bar, PBM_SETPOS, wParam, 0);
+ }
+ SetWindowLongPtrW(hwnd, DWLP_MSGRESULT, result);
+ break;
+ case TDM_SET_PROGRESS_BAR_MARQUEE:
+ SendMessageW(dialog_info->progress_bar, PBM_SETMARQUEE, wParam, lParam);
+ break;
case WM_INITDIALOG:
dialog_info = (struct taskdialog_info *)lParam;
diff --git a/dlls/comctl32/tests/taskdialog.c b/dlls/comctl32/tests/taskdialog.c
index cca700cd18..e91a878876 100644
--- a/dlls/comctl32/tests/taskdialog.c
+++ b/dlls/comctl32/tests/taskdialog.c
@@ -373,6 +373,72 @@ static void test_timer(void)
pTaskDialogIndirect(&info, NULL, NULL, NULL);
}
+static HRESULT CALLBACK taskdialog_callback_proc_progress_bar(HWND hwnd, UINT notification, WPARAM wParam,
+ LPARAM lParam, LONG_PTR ref_data)
+{
+ unsigned long ret;
+ LONG flags = (LONG)ref_data;
+ if (notification == TDN_CREATED)
+ {
+ /* TDM_SET_PROGRESS_BAR_STATE */
+ ret = SendMessageW(hwnd, TDM_SET_PROGRESS_BAR_STATE, PBST_NORMAL, 0);
+ ok(ret == PBST_NORMAL, "Expect state: %d got state: %lx\n", PBST_NORMAL, ret);
+ ret = SendMessageW(hwnd, TDM_SET_PROGRESS_BAR_STATE, PBST_PAUSED, 0);
+ ok(ret == PBST_NORMAL, "Expect state: %d got state: %lx\n", PBST_NORMAL, ret);
+ ret = SendMessageW(hwnd, TDM_SET_PROGRESS_BAR_STATE, PBST_ERROR, 0);
+ /* Progress bar has fixme on handling PBM_SETSTATE message */
+ todo_wine ok(ret == PBST_PAUSED, "Expect state: %d got state: %lx\n", PBST_PAUSED, ret);
+ ret = SendMessageW(hwnd, TDM_SET_PROGRESS_BAR_STATE, PBST_NORMAL, 0);
+ todo_wine ok(ret == PBST_ERROR, "Expect state: %d got state: %lx\n", PBST_ERROR, ret);
+
+ /* TDM_SET_PROGRESS_BAR_RANGE */
+ ret = SendMessageW(hwnd, TDM_SET_PROGRESS_BAR_RANGE, 0, MAKELPARAM(0, 200));
+ ok(ret == MAKELONG(0, 100), "Expect range:%x got:%lx\n", MAKELONG(0, 100), ret);
+ ret = SendMessageW(hwnd, TDM_SET_PROGRESS_BAR_RANGE, 0, MAKELPARAM(0, 200));
+ ok(ret == MAKELONG(0, 200), "Expect range:%x got:%lx\n", MAKELONG(0, 200), ret);
+
+ /* TDM_SET_PROGRESS_BAR_POS */
+ if (flags & TDF_SHOW_MARQUEE_PROGRESS_BAR)
+ {
+ ret = SendMessageW(hwnd, TDM_SET_PROGRESS_BAR_POS, 1, 0);
+ ok(ret == 0, "Expect position:%x got:%lx\n", 0, ret);
+ ret = SendMessageW(hwnd, TDM_SET_PROGRESS_BAR_POS, 2, 0);
+ ok(ret == 0, "Expect position:%x got:%lx\n", 0, ret);
+ }
+ else
+ {
+ ret = SendMessageW(hwnd, TDM_SET_PROGRESS_BAR_POS, 1, 0);
+ ok(ret == 0, "Expect position:%x got:%lx\n", 0, ret);
+ ret = SendMessageW(hwnd, TDM_SET_PROGRESS_BAR_POS, 2, 0);
+ ok(ret == 1, "Expect position:%x got:%lx\n", 1, ret);
+ }
+
+ SendMessageW(hwnd, TDM_CLICK_BUTTON, IDOK, 0);
+ }
+
+ return S_OK;
+}
+
+static void test_progress_bar(void)
+{
+ TASKDIALOGCONFIG info = {0};
+
+ info.cbSize = sizeof(TASKDIALOGCONFIG);
+ info.dwFlags = TDF_SHOW_PROGRESS_BAR;
+ info.pfCallback = taskdialog_callback_proc_progress_bar;
+ info.lpCallbackData = (LONG_PTR)info.dwFlags;
+ info.dwCommonButtons = TDCBF_OK_BUTTON;
+ pTaskDialogIndirect(&info, NULL, NULL, NULL);
+
+ info.dwFlags = TDF_SHOW_MARQUEE_PROGRESS_BAR;
+ info.lpCallbackData = (LONG_PTR)info.dwFlags;
+ pTaskDialogIndirect(&info, NULL, NULL, NULL);
+
+ info.dwFlags = TDF_SHOW_PROGRESS_BAR | TDF_SHOW_MARQUEE_PROGRESS_BAR;
+ info.lpCallbackData = (LONG_PTR)info.dwFlags;
+ pTaskDialogIndirect(&info, NULL, NULL, NULL);
+}
+
START_TEST(taskdialog)
{
ULONG_PTR ctx_cookie;
@@ -411,6 +477,7 @@ START_TEST(taskdialog)
test_buttons();
test_help();
test_timer();
+ test_progress_bar();
unload_v6_module(ctx_cookie, hCtx);
}
--
2.17.1
June 15, 2018
Re: [PATCH] urlmon/tests: Use the available ARRAY_SIZE() macro
by Marvin
Hi,
While running your changed tests on Windows, I think I found new failures.
Being a bot and all I'm not very good at pattern recognition, so I might be
wrong, but could you please double-check?
Full results can be found at
https://testbot.winehq.org/JobDetails.pl?Key=39144
Your paranoid android.
=== wvistau64 (64 bit url) ===
url.c:1877: Test failed: binding failed: 800c0006, expected 00000000
url.c:1888: Test failed: res = 00002f4f, expected 00000000
url.c:3190: Test failed: expected OnProgress_SENDINGREQUEST
url.c:3198: Test failed: expected OnProgress_MIMETYPEAVAILABLE
url.c:3199: Test failed: expected OnProgress_BEGINDOWNLOADDATA
url.c:3200: Test failed: expected OnProgress_ENDDOWNLOADDATA
url.c:3212: Test failed: expected OnDataAvailable
=== w7pro64 (64 bit url) ===
url.c:3680: Test failed: CreateFile failed
url.c:1550: Test failed: unexpected call QueryInterface_IWindowForBindingUI
url.c:1420: Test failed: unexpected call QueryService_IWindowForBindingUI
url.c:1350: Test failed: unexpected call GetWindow_ICodeInstall
url.c:1877: Test failed: binding failed: 80040154, expected 00000000
url.c:3430: Test failed: expected Obj_OnProgress_CLASSIDAVAILABLE
url.c:3439: Test failed: expected OnObjectAvailable
June 14, 2018
[PATCH] winex11.drv: Correct compile without vulkan support
by Alistair Leslie-Hughes
Signed-off-by: Alistair Leslie-Hughes <leslie_alistair(a)hotmail.com>
---
dlls/winex11.drv/vulkan.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/dlls/winex11.drv/vulkan.c b/dlls/winex11.drv/vulkan.c
index 7eca31b..fdb858d 100644
--- a/dlls/winex11.drv/vulkan.c
+++ b/dlls/winex11.drv/vulkan.c
@@ -626,4 +626,8 @@ const struct vulkan_funcs *get_vulkan_driver(UINT version)
return NULL;
}
+void wine_vk_surface_destroy(HWND hwnd)
+{
+}
+
#endif /* SONAME_LIBVULKAN */
--
1.9.1
June 14, 2018
Re: [PATCH] shell32/tests: Use the available ARRAY_SIZE() macro
by Marvin
Hi,
While running your changed tests on Windows, I think I found new failures.
Being a bot and all I'm not very good at pattern recognition, so I might be
wrong, but could you please double-check?
Full results can be found at
https://testbot.winehq.org/JobDetails.pl?Key=39142
Your paranoid android.
=== wvistau64_zh_CN (32 bit shlexec) ===
shlexec.c:2501: Test failed: ShellExecuteEx(mask="0x8540", file="C:\Users\winetest\AppData\Local\Temp\wt39B5.tmp\test file.sde") Assoc class="shlexec.sde", verb="Open", rawcmd="0", cmdtail="", ddeexec="[open("%1")]", app="shlexec", topic="dde" failed: rc=2 err=2
shlexec.c:2501: Test failed: ShellExecuteEx(mask="0x8540", file="C:\Users\winetest\AppData\Local\Temp\wt39B5.tmp\test file.sde") Assoc class="shlexec.sde", verb="Open", rawcmd="0", cmdtail=""%1"", ddeexec="[open("%1")]", app="shlexec", topic="dde" failed: rc=2 err=2
June 14, 2018
[PATCH] d3dx9/tests: Add initial tests for ID3DXFont::DrawText().
by Matteo Bruni
From: Kieran Duggan <kieranduggan15(a)gmail.com>
Signed-off-by: Kieran Duggan <kieranduggan15(a)gmail.com>
Signed-off-by: Matteo Bruni <mbruni(a)codeweavers.com>
---
dlls/d3dx9_36/tests/core.c | 81 +++++++++++++++++++++++++++++++++++-----------
1 file changed, 62 insertions(+), 19 deletions(-)
diff --git a/dlls/d3dx9_36/tests/core.c b/dlls/d3dx9_36/tests/core.c
index 75d33c1e0dc..3ed25f8176b 100644
--- a/dlls/d3dx9_36/tests/core.c
+++ b/dlls/d3dx9_36/tests/core.c
@@ -305,23 +305,28 @@ static void test_ID3DXSprite(IDirect3DDevice9 *device)
static void test_ID3DXFont(IDirect3DDevice9 *device)
{
- D3DXFONT_DESCA desc;
- ID3DXFont *font;
- HRESULT hr;
- int ref;
- int i;
- static const struct {
- INT font_height;
- UINT expected_size;
- DWORD expected_levels;
- } texture_tests[] = {
+ static const WCHAR testW[] = {'t','e','s','t',0};
+ static const struct
+ {
+ int font_height;
+ unsigned int expected_size;
+ unsigned int expected_levels;
+ }
+ tests[] =
+ {
{ 6, 128, 4 },
{ 8, 128, 4 },
{ 10, 256, 5 },
{ 12, 256, 5 },
- { 72, 256, 8 }
+ { 72, 256, 8 },
};
-
+ const unsigned int size = ARRAY_SIZE(testW);
+ D3DXFONT_DESCA desc;
+ ID3DXSprite *sprite;
+ int ref, i, height;
+ ID3DXFont *font;
+ HRESULT hr;
+ RECT rect;
/* D3DXCreateFont */
ref = get_ref((IUnknown*)device);
@@ -463,8 +468,6 @@ static void test_ID3DXFont(IDirect3DDevice9 *device)
/* ID3DXFont_PreloadText */
hr = D3DXCreateFontA(device, 12, 0, FW_DONTCARE, 0, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, "Arial", &font);
if(SUCCEEDED(hr)) {
- const WCHAR testW[] = {'t','e','s','t',0};
-
todo_wine {
hr = ID3DXFont_PreloadTextA(font, NULL, -1);
ok(hr == D3DERR_INVALIDCALL, "ID3DXFont_PreloadTextA returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL);
@@ -552,7 +555,8 @@ static void test_ID3DXFont(IDirect3DDevice9 *device)
check_release((IUnknown*)font, 0);
} else skip("Failed to create a ID3DXFont object\n");
- for(i = 0; i < ARRAY_SIZE(texture_tests); i++) {
+ for (i = 0; i < ARRAY_SIZE(tests); ++i)
+ {
HDC hdc;
DWORD ret;
HRESULT hr;
@@ -560,7 +564,8 @@ static void test_ID3DXFont(IDirect3DDevice9 *device)
char c = 'a';
IDirect3DTexture9 *texture;
- hr = D3DXCreateFontA(device, texture_tests[i].font_height, 0, FW_DONTCARE, 0, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, "Arial", &font);
+ hr = D3DXCreateFontA(device, tests[i].font_height, 0, FW_DONTCARE, 0, FALSE, DEFAULT_CHARSET,
+ OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, "Arial", &font);
if(FAILED(hr)) {
skip("Failed to create a ID3DXFont object\n");
continue;
@@ -578,17 +583,55 @@ static void test_ID3DXFont(IDirect3DDevice9 *device)
D3DSURFACE_DESC desc;
levels = IDirect3DTexture9_GetLevelCount(texture);
- ok(levels == texture_tests[i].expected_levels, "Got levels %u, expected %u\n", levels, texture_tests[i].expected_levels);
+ ok(levels == tests[i].expected_levels, "Got levels %u, expected %u\n",
+ levels, tests[i].expected_levels);
hr = IDirect3DTexture9_GetLevelDesc(texture, 0, &desc);
ok(hr == D3D_OK, "IDirect3DTexture9_GetLevelDesc failed\n");
ok(desc.Format == D3DFMT_A8R8G8B8, "Got format %#x, expected %#x\n", desc.Format, D3DFMT_A8R8G8B8);
ok(desc.Usage == 0, "Got usage %#x, expected %#x\n", desc.Usage, 0);
- ok(desc.Width == texture_tests[i].expected_size, "Got width %u, expected %u\n", desc.Width, texture_tests[i].expected_size);
- ok(desc.Height == texture_tests[i].expected_size, "Got height %u, expected %u\n", desc.Height, texture_tests[i].expected_size);
+ ok(desc.Width == tests[i].expected_size, "Got width %u, expected %u\n",
+ desc.Width, tests[i].expected_size);
+ ok(desc.Height == tests[i].expected_size, "Got height %u, expected %u\n",
+ desc.Height, tests[i].expected_size);
ok(desc.Pool == D3DPOOL_MANAGED, "Got pool %u, expected %u\n", desc.Pool, D3DPOOL_MANAGED);
IDirect3DTexture9_Release(texture);
}
+
+ /* ID3DXFontImpl_DrawText */
+ D3DXCreateSprite(device, &sprite);
+ SetRect(&rect, 0, 0, 640, 480);
+
+ IDirect3DDevice9_Clear(device, 0, NULL, D3DCLEAR_TARGET, 0xff000000, 1.0f, 0);
+
+ IDirect3DDevice9_BeginScene(device);
+ hr = ID3DXSprite_Begin(sprite, D3DXSPRITE_ALPHABLEND);
+ ok (hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+
+ height = ID3DXFont_DrawTextW(font, sprite, testW, -1, &rect, DT_TOP, 0xffffffff);
+ ok(height == tests[i].font_height, "Got unexpected height %u.\n", height);
+ height = ID3DXFont_DrawTextW(font, sprite, testW, size, &rect, DT_TOP, 0xffffffff);
+ ok(height == tests[i].font_height, "Got unexpected height %u.\n", height);
+ height = ID3DXFont_DrawTextW(font, sprite, testW, size, &rect, DT_RIGHT, 0xffffffff);
+ ok(height == tests[i].font_height, "Got unexpected height %u.\n", height);
+ height = ID3DXFont_DrawTextW(font, sprite, testW, size, &rect, DT_LEFT | DT_NOCLIP,
+ 0xffffffff);
+ ok(height == tests[i].font_height, "Got unexpected height %u.\n", height);
+
+ SetRect(&rect, 0, 0, 0, 0);
+ height = ID3DXFont_DrawTextW(font, sprite, testW, size, &rect,
+ DT_LEFT | DT_CALCRECT, 0xffffffff);
+ ok(height == tests[i].font_height, "Got unexpected height %u.\n", height);
+ ok(!rect.left, "Got unexpected rect left %d.\n", rect.left);
+ ok(!rect.top, "Got unexpected rect top %d.\n", rect.top);
+ ok(rect.right, "Got unexpected rect right %d.\n", rect.right);
+ ok(rect.bottom == tests[i].font_height, "Got unexpected rect bottom %d.\n", rect.bottom);
+
+ hr = ID3DXSprite_End(sprite);
+ ok (hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+ IDirect3DDevice9_EndScene(device);
+ ID3DXSprite_Release(sprite);
+
ID3DXFont_Release(font);
}
}
--
2.16.1
June 14, 2018
[PATCH] urlmon/tests: Use the available ARRAY_SIZE() macro
by Michael Stefaniuc
Signed-off-by: Michael Stefaniuc <mstefani(a)winehq.org>
---
dlls/urlmon/tests/misc.c | 66 +++++++++++++++++---------------------
dlls/urlmon/tests/protocol.c | 26 +++++++--------
dlls/urlmon/tests/sec_mgr.c | 20 ++++++------
dlls/urlmon/tests/uri.c | 76 ++++++++++++++++++++++----------------------
dlls/urlmon/tests/url.c | 2 +-
5 files changed, 91 insertions(+), 99 deletions(-)
diff --git a/dlls/urlmon/tests/misc.c b/dlls/urlmon/tests/misc.c
index e88c960497..ff0f24ed76 100644
--- a/dlls/urlmon/tests/misc.c
+++ b/dlls/urlmon/tests/misc.c
@@ -85,7 +85,7 @@ static HRESULT (WINAPI *pIEInstallScope)(DWORD*);
static int strcmp_wa(const WCHAR *strw, const char *stra)
{
WCHAR buf[512];
- MultiByteToWideChar(CP_ACP, 0, stra, -1, buf, sizeof(buf)/sizeof(WCHAR));
+ MultiByteToWideChar(CP_ACP, 0, stra, -1, buf, ARRAY_SIZE(buf));
return lstrcmpW(strw, buf);
}
@@ -367,23 +367,23 @@ static void test_CoInternetParseUrl(void)
3, &size, 0);
ok(hres == E_POINTER, "schema failed: %08x, expected E_POINTER\n", hres);
- for(i=0; i < sizeof(parse_tests)/sizeof(parse_tests[0]); i++) {
+ for(i = 0; i < ARRAY_SIZE(parse_tests); i++) {
memset(buf, 0xf0, sizeof(buf));
hres = pCoInternetParseUrl(parse_tests[i].url, PARSE_SECURITY_URL, 0, buf,
- sizeof(buf)/sizeof(WCHAR), &size, 0);
+ ARRAY_SIZE(buf), &size, 0);
ok(hres == parse_tests[i].secur_hres, "[%d] security url failed: %08x, expected %08x\n",
i, hres, parse_tests[i].secur_hres);
memset(buf, 0xf0, sizeof(buf));
hres = pCoInternetParseUrl(parse_tests[i].url, PARSE_ENCODE, 0, buf,
- sizeof(buf)/sizeof(WCHAR), &size, 0);
+ ARRAY_SIZE(buf), &size, 0);
ok(hres == S_OK, "[%d] encoding failed: %08x\n", i, hres);
ok(size == lstrlenW(parse_tests[i].encoded_url), "[%d] wrong size\n", i);
ok(!lstrcmpW(parse_tests[i].encoded_url, buf), "[%d] wrong encoded url\n", i);
memset(buf, 0xf0, sizeof(buf));
hres = pCoInternetParseUrl(parse_tests[i].url, PARSE_PATH_FROM_URL, 0, buf,
- sizeof(buf)/sizeof(WCHAR), &size, 0);
+ ARRAY_SIZE(buf), &size, 0);
ok(hres == parse_tests[i].path_hres, "[%d] path failed: %08x, expected %08x\n",
i, hres, parse_tests[i].path_hres);
if(parse_tests[i].path) {
@@ -393,7 +393,7 @@ static void test_CoInternetParseUrl(void)
memset(buf, 0xf0, sizeof(buf));
hres = pCoInternetParseUrl(parse_tests[i].url, PARSE_SCHEMA, 0, buf,
- sizeof(buf)/sizeof(WCHAR), &size, 0);
+ ARRAY_SIZE(buf), &size, 0);
ok(hres == S_OK, "[%d] schema failed: %08x\n", i, hres);
ok(size == lstrlenW(parse_tests[i].schema), "[%d] wrong size\n", i);
ok(!lstrcmpW(parse_tests[i].schema, buf), "[%d] wrong schema\n", i);
@@ -402,7 +402,7 @@ static void test_CoInternetParseUrl(void)
&& memcmp(parse_tests[i].url, wszAbout, 5*sizeof(WCHAR))) {
memset(buf, 0xf0, sizeof(buf));
hres = pCoInternetParseUrl(parse_tests[i].url, PARSE_DOMAIN, 0, buf,
- sizeof(buf)/sizeof(WCHAR), &size, 0);
+ ARRAY_SIZE(buf), &size, 0);
ok(hres == parse_tests[i].domain_hres, "[%d] domain failed: %08x\n", i, hres);
if(parse_tests[i].domain)
ok(!lstrcmpW(parse_tests[i].domain, buf), "[%d] wrong domain, received %s\n", i, wine_dbgstr_w(buf));
@@ -410,7 +410,7 @@ static void test_CoInternetParseUrl(void)
memset(buf, 0xf0, sizeof(buf));
hres = pCoInternetParseUrl(parse_tests[i].url, PARSE_ROOTDOCUMENT, 0, buf,
- sizeof(buf)/sizeof(WCHAR), &size, 0);
+ ARRAY_SIZE(buf), &size, 0);
ok(hres == parse_tests[i].rootdocument_hres, "[%d] rootdocument failed: %08x\n", i, hres);
if(parse_tests[i].rootdocument)
ok(!lstrcmpW(parse_tests[i].rootdocument, buf), "[%d] wrong rootdocument, received %s\n", i, wine_dbgstr_w(buf));
@@ -451,7 +451,7 @@ static void test_CoInternetQueryInfo(void)
DWORD cb, i;
HRESULT hres;
- for(i=0; i < sizeof(query_info_tests)/sizeof(query_info_tests[0]); i++) {
+ for(i = 0; i < ARRAY_SIZE(query_info_tests); i++) {
cb = 0xdeadbeef;
memset(buf, '?', sizeof(buf));
hres = pCoInternetQueryInfo(query_info_tests[0].url, QUERY_USES_NETWORK, 0, buf, sizeof(buf), &cb, 0);
@@ -724,7 +724,7 @@ static void test_FindMimeFromData(void)
static const WCHAR text_htmlW[] = {'t','e','x','t','/','h','t','m','l',0};
static const WCHAR text_plainW[] = {'t','e','x','t','/','p','l','a','i','n',0};
- for(i=0; i<sizeof(mime_tests)/sizeof(mime_tests[0]); i++) {
+ for(i = 0; i < ARRAY_SIZE(mime_tests); i++) {
mime = (LPWSTR)0xf0f0f0f0;
url = a2w(mime_tests[i].url);
hres = pFindMimeFromData(NULL, url, NULL, 0, NULL, 0, &mime, 0);
@@ -757,7 +757,7 @@ static void test_FindMimeFromData(void)
heap_free(url);
}
- for(i=0; i < sizeof(mime_tests2)/sizeof(mime_tests2[0]); i++) {
+ for(i = 0; i < ARRAY_SIZE(mime_tests2); i++) {
url = a2w(mime_tests2[i].url);
proposed_mime = a2w(mime_tests2[i].proposed_mime);
hres = pFindMimeFromData(NULL, url, mime_tests2[i].data, mime_tests2[i].size,
@@ -879,9 +879,9 @@ static HRESULT WINAPI InternetProtocolInfo_ParseUrl(IInternetProtocolInfo *iface
if(ParseAction == PARSE_SECURITY_URL) {
if(pcchResult)
- *pcchResult = sizeof(url1)/sizeof(WCHAR);
+ *pcchResult = ARRAY_SIZE(url1);
- if(cchResult<sizeof(url1)/sizeof(WCHAR))
+ if(cchResult < ARRAY_SIZE(url1))
return S_FALSE;
memcpy(pwzResult, url1, sizeof(url1));
@@ -1032,8 +1032,7 @@ static void test_NameSpace(void)
SET_EXPECT(CreateInstance);
SET_EXPECT(ParseUrl);
- hres = pCoInternetParseUrl(url8, PARSE_ENCODE, 0, buf, sizeof(buf)/sizeof(WCHAR),
- &size, 0);
+ hres = pCoInternetParseUrl(url8, PARSE_ENCODE, 0, buf, ARRAY_SIZE(buf), &size, 0);
ok(hres == S_OK, "CoInternetParseUrl failed: %08x\n", hres);
CHECK_CALLED(QI_IInternetProtocolInfo);
@@ -1044,8 +1043,7 @@ static void test_NameSpace(void)
SET_EXPECT(QI_IInternetProtocolInfo);
SET_EXPECT(ParseUrl);
- hres = pCoInternetParseUrl(url8, PARSE_ENCODE, 0, buf, sizeof(buf)/sizeof(WCHAR),
- &size, 0);
+ hres = pCoInternetParseUrl(url8, PARSE_ENCODE, 0, buf, ARRAY_SIZE(buf), &size, 0);
ok(hres == S_OK, "CoInternetParseUrl failed: %08x\n", hres);
CHECK_CALLED(QI_IInternetProtocolInfo);
@@ -1054,11 +1052,10 @@ static void test_NameSpace(void)
SET_EXPECT(QI_IInternetProtocolInfo);
SET_EXPECT(ParseUrl);
- hres = pCoInternetParseUrl(url8, PARSE_SECURITY_URL, 0, buf,
- sizeof(buf)/sizeof(WCHAR), &size, 0);
+ hres = pCoInternetParseUrl(url8, PARSE_SECURITY_URL, 0, buf, ARRAY_SIZE(buf), &size, 0);
ok(hres == S_OK, "CoInternetParseUrl failed: %08x\n", hres);
- ok(size == sizeof(url1)/sizeof(WCHAR), "Size = %d\n", size);
- if(size == sizeof(url1)/sizeof(WCHAR))
+ ok(size == ARRAY_SIZE(url1), "Size = %d\n", size);
+ if(size == ARRAY_SIZE(url1))
ok(!memcmp(buf, url1, sizeof(url1)), "Encoded url = %s\n", wine_dbgstr_w(buf));
CHECK_CALLED(QI_IInternetProtocolInfo);
@@ -1071,7 +1068,7 @@ static void test_NameSpace(void)
hres = pCoInternetGetSecurityUrl(url8, &sec_url, PSU_SECURITY_URL_ONLY, 0);
ok(hres == S_OK, "CoInternetGetSecurityUrl failed: %08x\n", hres);
if(hres == S_OK) {
- ok(lstrlenW(sec_url)>sizeof(wszFile)/sizeof(WCHAR) &&
+ ok(lstrlenW(sec_url) > ARRAY_SIZE(wszFile) &&
!memcmp(sec_url, wszFile, sizeof(wszFile)-sizeof(WCHAR)),
"Encoded url = %s\n", wine_dbgstr_w(sec_url));
CoTaskMemFree(sec_url);
@@ -1084,8 +1081,7 @@ static void test_NameSpace(void)
hres = IInternetSession_UnregisterNameSpace(session, &test_protocol_cf, wszTest);
ok(hres == S_OK, "UnregisterNameSpace failed: %08x\n", hres);
- hres = pCoInternetParseUrl(url8, PARSE_ENCODE, 0, buf, sizeof(buf)/sizeof(WCHAR),
- &size, 0);
+ hres = pCoInternetParseUrl(url8, PARSE_ENCODE, 0, buf, ARRAY_SIZE(buf), &size, 0);
ok(hres == S_OK, "CoInternetParseUrl failed: %08x\n", hres);
hres = IInternetSession_RegisterNameSpace(session, &test_protocol_cf2, &IID_NULL,
@@ -1103,8 +1099,7 @@ static void test_NameSpace(void)
SET_EXPECT(QI_IInternetProtocolInfo);
SET_EXPECT(ParseUrl);
- hres = pCoInternetParseUrl(url8, PARSE_ENCODE, 0, buf, sizeof(buf)/sizeof(WCHAR),
- &size, 0);
+ hres = pCoInternetParseUrl(url8, PARSE_ENCODE, 0, buf, ARRAY_SIZE(buf), &size, 0);
ok(hres == S_OK, "CoInternetParseUrl failed: %08x\n", hres);
CHECK_CALLED(QI_IInternetProtocolInfo);
@@ -1116,8 +1111,7 @@ static void test_NameSpace(void)
SET_EXPECT(QI_IInternetProtocolInfo);
SET_EXPECT(ParseUrl);
- hres = pCoInternetParseUrl(url8, PARSE_ENCODE, 0, buf, sizeof(buf)/sizeof(WCHAR),
- &size, 0);
+ hres = pCoInternetParseUrl(url8, PARSE_ENCODE, 0, buf, ARRAY_SIZE(buf), &size, 0);
ok(hres == S_OK, "CoInternetParseUrl failed: %08x\n", hres);
CHECK_CALLED(QI_IInternetProtocolInfo);
@@ -1130,8 +1124,7 @@ static void test_NameSpace(void)
SET_EXPECT(QI_IInternetProtocolInfo);
SET_EXPECT(ParseUrl);
- hres = pCoInternetParseUrl(url8, PARSE_ENCODE, 0, buf, sizeof(buf)/sizeof(WCHAR),
- &size, 0);
+ hres = pCoInternetParseUrl(url8, PARSE_ENCODE, 0, buf, ARRAY_SIZE(buf), &size, 0);
ok(hres == S_OK, "CoInternetParseUrl failed: %08x\n", hres);
CHECK_CALLED(QI_IInternetProtocolInfo);
@@ -1149,8 +1142,7 @@ static void test_NameSpace(void)
hres = IInternetSession_UnregisterNameSpace(session, &test_protocol_cf2, wszTest);
ok(hres == S_OK, "UnregisterNameSpace failed: %08x\n", hres);
- hres = pCoInternetParseUrl(url8, PARSE_ENCODE, 0, buf, sizeof(buf)/sizeof(WCHAR),
- &size, 0);
+ hres = pCoInternetParseUrl(url8, PARSE_ENCODE, 0, buf, ARRAY_SIZE(buf), &size, 0);
ok(hres == S_OK, "CoInternetParseUrl failed: %08x\n", hres);
IInternetSession_Release(session);
@@ -1627,7 +1619,7 @@ static void test_MkParseDisplayNameEx(void)
CreateBindCtx(0, &bctx);
- for (i = 0; i < sizeof(invalid_parameters)/sizeof(invalid_parameters[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(invalid_parameters); i++)
{
eaten = 0xdeadbeef;
mon = (IMoniker *)0xdeadbeef;
@@ -1643,7 +1635,7 @@ static void test_MkParseDisplayNameEx(void)
hres = MkParseDisplayNameEx(bctx, url9, &eaten, &mon);
ok(hres == S_OK, "MkParseDisplayNameEx failed: %08x\n", hres);
- ok(eaten == sizeof(url9)/sizeof(WCHAR)-1, "eaten=%d\n", eaten);
+ ok(eaten == ARRAY_SIZE(url9)-1, "eaten=%d\n", eaten);
ok(mon != NULL, "mon == NULL\n");
hres = IMoniker_GetDisplayName(mon, NULL, 0, &name);
@@ -1659,7 +1651,7 @@ static void test_MkParseDisplayNameEx(void)
hres = MkParseDisplayNameEx(bctx, clsid_nameW, &eaten, &mon);
ok(hres == S_OK, "MkParseDisplayNameEx failed: %08x\n", hres);
- ok(eaten == sizeof(clsid_nameW)/sizeof(WCHAR)-1, "eaten=%d\n", eaten);
+ ok(eaten == ARRAY_SIZE(clsid_nameW)-1, "eaten=%d\n", eaten);
ok(mon != NULL, "mon == NULL\n");
hres = IMoniker_IsSystemMoniker(mon, &issys);
@@ -1733,7 +1725,7 @@ static void test_internet_feature_defaults(void) {
HRESULT hres;
DWORD i;
- for(i = 0; i < sizeof(default_feature_tests)/sizeof(default_feature_tests[0]); ++i) {
+ for(i = 0; i < ARRAY_SIZE(default_feature_tests); ++i) {
hres = pCoInternetIsFeatureEnabled(default_feature_tests[i].feature, default_feature_tests[i].get_flags);
todo_wine_if (default_feature_tests[i].todo)
ok(hres == default_feature_tests[i].expected, "CoInternetIsFeatureEnabled returned %08x, expected %08x on test %d\n",
@@ -1880,7 +1872,7 @@ static void test_CoInternetSetFeatureEnabled(void) {
hres = pCoInternetSetFeatureEnabled(FEATURE_ENTRY_COUNT,SET_FEATURE_ON_PROCESS,TRUE);
ok(hres == E_FAIL, "CoInternetSetFeatureEnabled returned %08x, expected E_FAIL\n", hres);
- for(i = 0; i < sizeof(internet_feature_tests)/sizeof(internet_feature_tests[0]); ++i) {
+ for(i = 0; i < ARRAY_SIZE(internet_feature_tests); ++i) {
hres = pCoInternetSetFeatureEnabled(internet_feature_tests[i].feature, internet_feature_tests[i].set_flags,
internet_feature_tests[i].enable);
todo_wine_if (internet_feature_tests[i].set_todo)
diff --git a/dlls/urlmon/tests/protocol.c b/dlls/urlmon/tests/protocol.c
index 0ca8feebcb..999b591f5f 100644
--- a/dlls/urlmon/tests/protocol.c
+++ b/dlls/urlmon/tests/protocol.c
@@ -824,7 +824,7 @@ static HRESULT WINAPI ProtocolSink_ReportProgress(IInternetProtocolSink *iface,
if (winetest_debug > 1)
{
- if (ulStatusCode < sizeof(status_names)/sizeof(status_names[0]))
+ if (ulStatusCode < ARRAY_SIZE(status_names))
trace( "progress: %s %s\n", status_names[ulStatusCode], wine_dbgstr_w(szStatusText) );
else
trace( "progress: %u %s\n", ulStatusCode, wine_dbgstr_w(szStatusText) );
@@ -3051,55 +3051,55 @@ static void test_file_protocol(void) {
test_file_protocol_url(index_url);
memcpy(buf, wszFile, sizeof(wszFile));
- len = sizeof(wszFile)/sizeof(WCHAR)-1;
- len += GetCurrentDirectoryW(sizeof(buf)/sizeof(WCHAR)-len, buf+len);
+ len = ARRAY_SIZE(wszFile)-1;
+ len += GetCurrentDirectoryW(ARRAY_SIZE(buf)-len, buf+len);
buf[len++] = '\\';
memcpy(buf+len, wszIndexHtml, sizeof(wszIndexHtml));
- file_name = buf + sizeof(wszFile)/sizeof(WCHAR)-1;
+ file_name = buf + ARRAY_SIZE(wszFile)-1;
bindf = 0;
test_file_protocol_url(buf);
bindf = BINDF_FROMURLMON;
test_file_protocol_url(buf);
memcpy(buf, wszFile2, sizeof(wszFile2));
- len = GetCurrentDirectoryW(sizeof(file_name_buf)/sizeof(WCHAR), file_name_buf);
+ len = GetCurrentDirectoryW(ARRAY_SIZE(file_name_buf), file_name_buf);
file_name_buf[len++] = '\\';
memcpy(file_name_buf+len, wszIndexHtml, sizeof(wszIndexHtml));
- lstrcpyW(buf+sizeof(wszFile2)/sizeof(WCHAR)-1, file_name_buf);
+ lstrcpyW(buf+ARRAY_SIZE(wszFile2)-1, file_name_buf);
file_name = file_name_buf;
bindf = 0;
test_file_protocol_url(buf);
bindf = BINDF_FROMURLMON;
test_file_protocol_url(buf);
- buf[sizeof(wszFile2)/sizeof(WCHAR)] = '|';
+ buf[ARRAY_SIZE(wszFile2)] = '|';
test_file_protocol_url(buf);
memcpy(buf, wszFile3, sizeof(wszFile3));
- len = sizeof(wszFile3)/sizeof(WCHAR)-1;
- len += GetCurrentDirectoryW(sizeof(buf)/sizeof(WCHAR)-len, buf+len);
+ len = ARRAY_SIZE(wszFile3)-1;
+ len += GetCurrentDirectoryW(ARRAY_SIZE(buf)-len, buf+len);
buf[len++] = '\\';
memcpy(buf+len, wszIndexHtml, sizeof(wszIndexHtml));
- file_name = buf + sizeof(wszFile3)/sizeof(WCHAR)-1;
+ file_name = buf + ARRAY_SIZE(wszFile3)-1;
bindf = 0;
test_file_protocol_url(buf);
bindf = BINDF_FROMURLMON;
test_file_protocol_url(buf);
memcpy(buf, wszFile4, sizeof(wszFile4));
- len = GetCurrentDirectoryW(sizeof(file_name_buf)/sizeof(WCHAR), file_name_buf);
+ len = GetCurrentDirectoryW(ARRAY_SIZE(file_name_buf), file_name_buf);
file_name_buf[len++] = '\\';
memcpy(file_name_buf+len, wszIndexHtml, sizeof(wszIndexHtml));
- lstrcpyW(buf+sizeof(wszFile4)/sizeof(WCHAR)-1, file_name_buf);
+ lstrcpyW(buf+ARRAY_SIZE(wszFile4)-1, file_name_buf);
file_name = file_name_buf;
bindf = 0;
test_file_protocol_url(buf);
bindf = BINDF_FROMURLMON;
test_file_protocol_url(buf);
- buf[sizeof(wszFile4)/sizeof(WCHAR)] = '|';
+ buf[ARRAY_SIZE(wszFile4)] = '|';
test_file_protocol_url(buf);
/* Fragment part of URL is skipped if the file doesn't exist. */
diff --git a/dlls/urlmon/tests/sec_mgr.c b/dlls/urlmon/tests/sec_mgr.c
index 411a3b7781..2974eecc36 100644
--- a/dlls/urlmon/tests/sec_mgr.c
+++ b/dlls/urlmon/tests/sec_mgr.c
@@ -221,7 +221,7 @@ static LONG myRegDeleteTreeA(HKEY hKey, LPCSTR lpszSubKey)
dwMaxSubkeyLen++;
dwMaxValueLen++;
dwMaxLen = max(dwMaxSubkeyLen, dwMaxValueLen);
- if (dwMaxLen > sizeof(szNameBuf)/sizeof(CHAR))
+ if (dwMaxLen > ARRAY_SIZE(szNameBuf))
{
/* Name too big: alloc a buffer for it */
if (!(lpszName = HeapAlloc( GetProcessHeap(), 0, dwMaxLen*sizeof(CHAR))))
@@ -381,7 +381,7 @@ static void test_SecurityManager(void)
if(FAILED(hres))
return;
- for(i=0; i < sizeof(secmgr_tests)/sizeof(secmgr_tests[0]); i++) {
+ for(i = 0; i < ARRAY_SIZE(secmgr_tests); i++) {
zone = 100;
hres = IInternetSecurityManager_MapUrlToZone(secmgr, secmgr_tests[i].url,
&zone, 0);
@@ -785,7 +785,7 @@ static BOOL register_zone_domains(void)
res = RegOpenKeyA(HKEY_CURRENT_USER, szZoneMapDomainsKey, &domains);
ok(res == ERROR_SUCCESS, "RegOpenKey failed: %d\n", res);
- for(i = 0; i < sizeof(zone_domain_mappings)/sizeof(zone_domain_mappings[0]); ++i) {
+ for(i = 0; i < ARRAY_SIZE(zone_domain_mappings); ++i) {
const zone_domain_mapping *test = zone_domain_mappings+i;
HKEY domain;
@@ -830,7 +830,7 @@ static void unregister_zone_domains(void)
res = RegOpenKeyA(HKEY_CURRENT_USER, szZoneMapDomainsKey, &domains);
ok(res == ERROR_SUCCESS, "RegOpenKey failed: %d\n", res);
- for(i = 0; i < sizeof(zone_domain_mappings)/sizeof(zone_domain_mappings[0]); ++i) {
+ for(i = 0; i < ARRAY_SIZE(zone_domain_mappings); ++i) {
const zone_domain_mapping *test = zone_domain_mappings+i;
/* FIXME: Uses the "cludge" approach to remove the test data from the registry!
@@ -936,7 +936,7 @@ static void test_zone_domain_mappings(void)
RegCloseKey(domains);
}
- for(i = 0; i < sizeof(zone_mapping_tests)/sizeof(zone_mapping_tests[0]); ++i) {
+ for(i = 0; i < ARRAY_SIZE(zone_mapping_tests); ++i) {
const zone_mapping_test *test = zone_mapping_tests+i;
LPWSTR urlW = a2w(test->url);
zone = URLZONE_INVALID;
@@ -1360,7 +1360,7 @@ static void test_InternetGetSecurityUrl(void)
trace("testing CoInternetGetSecurityUrl...\n");
- for(i=0; i<sizeof(in)/sizeof(WCHAR*); i++) {
+ for(i = 0; i < ARRAY_SIZE(in); i++) {
hres = pCoInternetGetSecurityUrl(in[i], &sec, PSU_DEFAULT, 0);
ok(hres == S_OK, "(%d) CoInternetGetSecurityUrl returned: %08x\n", i, hres);
if(hres == S_OK) {
@@ -1625,7 +1625,7 @@ static void test_InternetGetSecurityUrlEx(void)
ok(hr == E_INVALIDARG, "CoInternetGetSecurityUrlEx returned 0x%08x, expected E_INVALIDARG\n", hr);
ok(result == (void*) 0xdeadbeef, "'result' was %p\n", result);
- for(i = 0; i < sizeof(sec_url_ex_tests)/sizeof(sec_url_ex_tests[0]); ++i) {
+ for(i = 0; i < ARRAY_SIZE(sec_url_ex_tests); ++i) {
LPWSTR uriW = a2w(sec_url_ex_tests[i].uri);
uri = NULL;
@@ -1827,7 +1827,7 @@ static void test_SecurityManagerEx2(void)
IUri_Release(uri);
- for(i = 0; i < sizeof(sec_mgr_ex2_tests)/sizeof(sec_mgr_ex2_tests[0]); ++i) {
+ for(i = 0; i < ARRAY_SIZE(sec_mgr_ex2_tests); ++i) {
LPWSTR uriW = a2w(sec_mgr_ex2_tests[i].uri);
uri = NULL;
@@ -1925,7 +1925,7 @@ static void test_CoInternetIsFeatureZoneElevationEnabled(void)
trace("Testing CoInternetIsFeatureZoneElevationEnabled... (%x)\n", hres);
- for(i=0; i<sizeof(testcases)/sizeof(testcases[0]); i++) {
+ for(i = 0; i < ARRAY_SIZE(testcases); i++) {
if(hres==S_OK && testcases[i].flags == GET_FEATURE_FROM_PROCESS)
testcases[i].policy_flags = URLPOLICY_ALLOW;
}
@@ -1940,7 +1940,7 @@ static void test_CoInternetIsFeatureZoneElevationEnabled(void)
return;
}
- for(i=0; i<sizeof(testcases)/sizeof(testcases[0]); i++) {
+ for(i = 0; i < ARRAY_SIZE(testcases); i++) {
url_from = a2w(testcases[i].url_from);
url_to = a2w(testcases[i].url_to);
diff --git a/dlls/urlmon/tests/uri.c b/dlls/urlmon/tests/uri.c
index 90f51bf5dd..7580a1302d 100644
--- a/dlls/urlmon/tests/uri.c
+++ b/dlls/urlmon/tests/uri.c
@@ -7786,7 +7786,7 @@ static void change_property(IUriBuilder *builder, const uri_builder_property *pr
static void test_CreateUri_InvalidFlags(void) {
DWORD i;
- for(i = 0; i < sizeof(invalid_flag_tests)/sizeof(invalid_flag_tests[0]); ++i) {
+ for(i = 0; i < ARRAY_SIZE(invalid_flag_tests); ++i) {
HRESULT hr;
IUri *uri = (void*) 0xdeadbeef;
@@ -7825,7 +7825,7 @@ static void test_CreateUri_InvalidArgs(void) {
static void test_CreateUri_InvalidUri(void) {
DWORD i;
- for(i = 0; i < sizeof(invalid_uri_tests)/sizeof(invalid_uri_tests[0]); ++i) {
+ for(i = 0; i < ARRAY_SIZE(invalid_uri_tests); ++i) {
invalid_uri test = invalid_uri_tests[i];
IUri *uri = NULL;
LPWSTR uriW;
@@ -7877,7 +7877,7 @@ static void test_IUri_GetPropertyBSTR(void) {
}
if(uri) IUri_Release(uri);
- for(i = 0; i < sizeof(uri_tests)/sizeof(uri_tests[0]); ++i) {
+ for(i = 0; i < ARRAY_SIZE(uri_tests); ++i) {
uri_properties test = uri_tests[i];
LPWSTR uriW;
uri = NULL;
@@ -7937,7 +7937,7 @@ static void test_IUri_GetPropertyDWORD(void) {
}
if(uri) IUri_Release(uri);
- for(i = 0; i < sizeof(uri_tests)/sizeof(uri_tests[0]); ++i) {
+ for(i = 0; i < ARRAY_SIZE(uri_tests); ++i) {
uri_properties test = uri_tests[i];
LPWSTR uriW;
uri = NULL;
@@ -7952,7 +7952,7 @@ static void test_IUri_GetPropertyDWORD(void) {
DWORD j;
/* Checks all the DWORD properties of the uri. */
- for(j = 0; j < sizeof(test.dword_props)/sizeof(test.dword_props[0]); ++j) {
+ for(j = 0; j < ARRAY_SIZE(test.dword_props); ++j) {
DWORD received;
uri_dword_property prop = test.dword_props[j];
@@ -8029,7 +8029,7 @@ static void test_IUri_GetStrProperties(void) {
}
if(uri) IUri_Release(uri);
- for(i = 0; i < sizeof(uri_tests)/sizeof(uri_tests[0]); ++i) {
+ for(i = 0; i < ARRAY_SIZE(uri_tests); ++i) {
uri_properties test = uri_tests[i];
LPWSTR uriW;
uri = NULL;
@@ -8257,7 +8257,7 @@ static void test_IUri_GetDwordProperties(void) {
}
if(uri) IUri_Release(uri);
- for(i = 0; i < sizeof(uri_tests)/sizeof(uri_tests[0]); ++i) {
+ for(i = 0; i < ARRAY_SIZE(uri_tests); ++i) {
uri_properties test = uri_tests[i];
LPWSTR uriW;
uri = NULL;
@@ -8343,7 +8343,7 @@ static void test_IUri_GetPropertyLength(void) {
}
if(uri) IUri_Release(uri);
- for(i = 0; i < sizeof(uri_tests)/sizeof(uri_tests[0]); ++i) {
+ for(i = 0; i < ARRAY_SIZE(uri_tests); ++i) {
uri_properties test = uri_tests[i];
LPWSTR uriW;
uri = NULL;
@@ -8426,7 +8426,7 @@ static void test_IUri_GetProperties(void) {
}
if(uri) IUri_Release(uri);
- for(i = 0; i < sizeof(uri_tests)/sizeof(uri_tests[0]); ++i) {
+ for(i = 0; i < ARRAY_SIZE(uri_tests); ++i) {
uri_properties test = uri_tests[i];
LPWSTR uriW;
uri = NULL;
@@ -8475,7 +8475,7 @@ static void test_IUri_HasProperty(void) {
}
if(uri) IUri_Release(uri);
- for(i = 0; i < sizeof(uri_tests)/sizeof(uri_tests[0]); ++i) {
+ for(i = 0; i < ARRAY_SIZE(uri_tests); ++i) {
uri_properties test = uri_tests[i];
LPWSTR uriW;
uri = NULL;
@@ -8540,7 +8540,7 @@ static void test_IUri_IsEqual(void) {
IUri_Release(uriA);
IUri_Release(uriB);
- for(i = 0; i < sizeof(equality_tests)/sizeof(equality_tests[0]); ++i) {
+ for(i = 0; i < ARRAY_SIZE(equality_tests); ++i) {
uri_equality test = equality_tests[i];
LPWSTR uriA_W, uriB_W;
@@ -8592,7 +8592,7 @@ static void test_CreateUriWithFragment_InvalidArgs(void) {
static void test_CreateUriWithFragment_InvalidFlags(void) {
DWORD i;
- for(i = 0; i < sizeof(invalid_flag_tests)/sizeof(invalid_flag_tests[0]); ++i) {
+ for(i = 0; i < ARRAY_SIZE(invalid_flag_tests); ++i) {
HRESULT hr;
IUri *uri = (void*) 0xdeadbeef;
@@ -8606,7 +8606,7 @@ static void test_CreateUriWithFragment_InvalidFlags(void) {
static void test_CreateUriWithFragment(void) {
DWORD i;
- for(i = 0; i < sizeof(uri_fragment_tests)/sizeof(uri_fragment_tests[0]); ++i) {
+ for(i = 0; i < ARRAY_SIZE(uri_fragment_tests); ++i) {
HRESULT hr;
IUri *uri = NULL;
LPWSTR uriW, fragW;
@@ -8685,7 +8685,7 @@ static void test_IUriBuilder_CreateUri(IUriBuilder *builder, const uri_builder_t
if(SUCCEEDED(hr)) {
DWORD i;
- for(i = 0; i < sizeof(test->expected_str_props)/sizeof(test->expected_str_props[0]); ++i) {
+ for(i = 0; i < ARRAY_SIZE(test->expected_str_props); ++i) {
uri_builder_str_property prop = test->expected_str_props[i];
BSTR received = NULL;
@@ -8703,7 +8703,7 @@ static void test_IUriBuilder_CreateUri(IUriBuilder *builder, const uri_builder_t
SysFreeString(received);
}
- for(i = 0; i < sizeof(test->expected_dword_props)/sizeof(test->expected_dword_props[0]); ++i) {
+ for(i = 0; i < ARRAY_SIZE(test->expected_dword_props); ++i) {
uri_builder_dword_property prop = test->expected_dword_props[i];
DWORD received = -2;
@@ -8737,7 +8737,7 @@ static void test_IUriBuilder_CreateUriSimple(IUriBuilder *builder, const uri_bui
if(SUCCEEDED(hr)) {
DWORD i;
- for(i = 0; i < sizeof(test->expected_str_props)/sizeof(test->expected_str_props[0]); ++i) {
+ for(i = 0; i < ARRAY_SIZE(test->expected_str_props); ++i) {
uri_builder_str_property prop = test->expected_str_props[i];
BSTR received = NULL;
@@ -8755,7 +8755,7 @@ static void test_IUriBuilder_CreateUriSimple(IUriBuilder *builder, const uri_bui
SysFreeString(received);
}
- for(i = 0; i < sizeof(test->expected_dword_props)/sizeof(test->expected_dword_props[0]); ++i) {
+ for(i = 0; i < ARRAY_SIZE(test->expected_dword_props); ++i) {
uri_builder_dword_property prop = test->expected_dword_props[i];
DWORD received = -2;
@@ -8790,7 +8790,7 @@ static void test_IUriBuilder_CreateUriWithFlags(IUriBuilder *builder, const uri_
if(SUCCEEDED(hr)) {
DWORD i;
- for(i = 0; i < sizeof(test->expected_str_props)/sizeof(test->expected_str_props[0]); ++i) {
+ for(i = 0; i < ARRAY_SIZE(test->expected_str_props); ++i) {
uri_builder_str_property prop = test->expected_str_props[i];
BSTR received = NULL;
@@ -8808,7 +8808,7 @@ static void test_IUriBuilder_CreateUriWithFlags(IUriBuilder *builder, const uri_
SysFreeString(received);
}
- for(i = 0; i < sizeof(test->expected_dword_props)/sizeof(test->expected_dword_props[0]); ++i) {
+ for(i = 0; i < ARRAY_SIZE(test->expected_dword_props); ++i) {
uri_builder_dword_property prop = test->expected_dword_props[i];
DWORD received = -2;
@@ -9051,7 +9051,7 @@ static void test_IUriBuilder_GetFragment(IUriBuilder *builder, const uri_builder
const uri_builder_property *prop = NULL;
/* Check if the property was set earlier. */
- for(i = 0; i < sizeof(test->properties)/sizeof(test->properties[0]); ++i) {
+ for(i = 0; i < ARRAY_SIZE(test->properties); ++i) {
if(test->properties[i].change && test->properties[i].property == Uri_PROPERTY_FRAGMENT)
prop = &(test->properties[i]);
}
@@ -9146,7 +9146,7 @@ static void test_IUriBuilder_GetHost(IUriBuilder *builder, const uri_builder_tes
const uri_builder_property *prop = NULL;
/* Check if the property was set earlier. */
- for(i = 0; i < sizeof(test->properties)/sizeof(test->properties[0]); ++i) {
+ for(i = 0; i < ARRAY_SIZE(test->properties); ++i) {
if(test->properties[i].change && test->properties[i].property == Uri_PROPERTY_HOST)
prop = &(test->properties[i]);
}
@@ -9241,7 +9241,7 @@ static void test_IUriBuilder_GetPassword(IUriBuilder *builder, const uri_builder
const uri_builder_property *prop = NULL;
/* Check if the property was set earlier. */
- for(i = 0; i < sizeof(test->properties)/sizeof(test->properties[0]); ++i) {
+ for(i = 0; i < ARRAY_SIZE(test->properties); ++i) {
if(test->properties[i].change && test->properties[i].property == Uri_PROPERTY_PASSWORD)
prop = &(test->properties[i]);
}
@@ -9336,7 +9336,7 @@ static void test_IUriBuilder_GetPath(IUriBuilder *builder, const uri_builder_tes
const uri_builder_property *prop = NULL;
/* Check if the property was set earlier. */
- for(i = 0; i < sizeof(test->properties)/sizeof(test->properties[0]); ++i) {
+ for(i = 0; i < ARRAY_SIZE(test->properties); ++i) {
if(test->properties[i].change && test->properties[i].property == Uri_PROPERTY_PATH)
prop = &(test->properties[i]);
}
@@ -9498,7 +9498,7 @@ static void test_IUriBuilder_GetQuery(IUriBuilder *builder, const uri_builder_te
const uri_builder_property *prop = NULL;
/* Check if the property was set earlier. */
- for(i = 0; i < sizeof(test->properties)/sizeof(test->properties[0]); ++i) {
+ for(i = 0; i < ARRAY_SIZE(test->properties); ++i) {
if(test->properties[i].change && test->properties[i].property == Uri_PROPERTY_QUERY)
prop = &(test->properties[i]);
}
@@ -9593,7 +9593,7 @@ static void test_IUriBuilder_GetSchemeName(IUriBuilder *builder, const uri_build
const uri_builder_property *prop = NULL;
/* Check if the property was set earlier. */
- for(i = 0; i < sizeof(test->properties)/sizeof(test->properties[0]); ++i) {
+ for(i = 0; i < ARRAY_SIZE(test->properties); ++i) {
if(test->properties[i].change && test->properties[i].property == Uri_PROPERTY_SCHEME_NAME)
prop = &(test->properties[i]);
}
@@ -9688,7 +9688,7 @@ static void test_IUriBuilder_GetUserName(IUriBuilder *builder, const uri_builder
const uri_builder_property *prop = NULL;
/* Check if the property was set earlier. */
- for(i = 0; i < sizeof(test->properties)/sizeof(test->properties[0]); ++i) {
+ for(i = 0; i < ARRAY_SIZE(test->properties); ++i) {
if(test->properties[i].change && test->properties[i].property == Uri_PROPERTY_USER_NAME)
prop = &(test->properties[i]);
}
@@ -9780,7 +9780,7 @@ static void test_IUriBuilder(void) {
IUriBuilder *builder;
DWORD i;
- for(i = 0; i < sizeof(uri_builder_tests)/sizeof(uri_builder_tests[0]); ++i) {
+ for(i = 0; i < ARRAY_SIZE(uri_builder_tests); ++i) {
IUri *uri = NULL;
uri_builder_test test = uri_builder_tests[i];
LPWSTR uriW = NULL;
@@ -10132,7 +10132,7 @@ static void test_IUriBuilder_RemoveProperties(void) {
}
if(builder) IUriBuilder_Release(builder);
- for(i = 0; i < sizeof(uri_builder_remove_tests)/sizeof(uri_builder_remove_tests[0]); ++i) {
+ for(i = 0; i < ARRAY_SIZE(uri_builder_remove_tests); ++i) {
uri_builder_remove_test test = uri_builder_remove_tests[i];
IUri *uri = NULL;
LPWSTR uriW;
@@ -10328,7 +10328,7 @@ static void test_CoInternetCombineIUri(void) {
if(base) IUri_Release(base);
if(relative) IUri_Release(relative);
- for(i = 0; i < sizeof(uri_combine_tests)/sizeof(uri_combine_tests[0]); ++i) {
+ for(i = 0; i < ARRAY_SIZE(uri_combine_tests); ++i) {
LPWSTR baseW = a2w(uri_combine_tests[i].base_uri);
hr = pCreateUri(baseW, uri_combine_tests[i].base_create_flags, 0, &base);
@@ -10349,7 +10349,7 @@ static void test_CoInternetCombineIUri(void) {
if(SUCCEEDED(hr)) {
DWORD j;
- for(j = 0; j < sizeof(uri_combine_tests[i].str_props)/sizeof(uri_combine_tests[i].str_props[0]); ++j) {
+ for(j = 0; j < ARRAY_SIZE(uri_combine_tests[i].str_props); ++j) {
uri_combine_str_property prop = uri_combine_tests[i].str_props[j];
BSTR received;
@@ -10366,7 +10366,7 @@ static void test_CoInternetCombineIUri(void) {
SysFreeString(received);
}
- for(j = 0; j < sizeof(uri_combine_tests[i].dword_props)/sizeof(uri_combine_tests[i].dword_props[0]); ++j) {
+ for(j = 0; j < ARRAY_SIZE(uri_combine_tests[i].dword_props); ++j) {
uri_dword_property prop = uri_combine_tests[i].dword_props[j];
DWORD received;
@@ -10619,7 +10619,7 @@ static void test_CoInternetCombineUrlEx(void) {
hr, E_POINTER);
if(base) IUri_Release(base);
- for(i = 0; i < sizeof(uri_combine_tests)/sizeof(uri_combine_tests[0]); ++i) {
+ for(i = 0; i < ARRAY_SIZE(uri_combine_tests); ++i) {
LPWSTR baseW = a2w(uri_combine_tests[i].base_uri);
hr = pCreateUri(baseW, uri_combine_tests[i].base_create_flags, 0, &base);
@@ -10636,7 +10636,7 @@ static void test_CoInternetCombineUrlEx(void) {
if(SUCCEEDED(hr)) {
DWORD j;
- for(j = 0; j < sizeof(uri_combine_tests[i].str_props)/sizeof(uri_combine_tests[i].str_props[0]); ++j) {
+ for(j = 0; j < ARRAY_SIZE(uri_combine_tests[i].str_props); ++j) {
uri_combine_str_property prop = uri_combine_tests[i].str_props[j];
BSTR received;
LPCSTR value = (prop.value_ex) ? prop.value_ex : prop.value;
@@ -10654,7 +10654,7 @@ static void test_CoInternetCombineUrlEx(void) {
SysFreeString(received);
}
- for(j = 0; j < sizeof(uri_combine_tests[i].dword_props)/sizeof(uri_combine_tests[i].dword_props[0]); ++j) {
+ for(j = 0; j < ARRAY_SIZE(uri_combine_tests[i].dword_props); ++j) {
uri_dword_property prop = uri_combine_tests[i].dword_props[j];
DWORD received;
@@ -10776,7 +10776,7 @@ static void test_CoInternetParseIUri_InvalidArgs(void) {
len = INTERNET_MAX_URL_LENGTH*2;
longurl = heap_alloc((len+1)*sizeof(WCHAR));
memcpy(longurl, http_urlW, sizeof(http_urlW));
- for(i = sizeof(http_urlW)/sizeof(WCHAR)-1; i < len; i++)
+ for(i = ARRAY_SIZE(http_urlW)-1; i < len; i++)
longurl[i] = 'x';
longurl[len] = 0;
@@ -10803,7 +10803,7 @@ static void test_CoInternetParseIUri_InvalidArgs(void) {
static void test_CoInternetParseIUri(void) {
DWORD i;
- for(i = 0; i < sizeof(uri_parse_tests)/sizeof(uri_parse_tests[0]); ++i) {
+ for(i = 0; i < ARRAY_SIZE(uri_parse_tests); ++i) {
HRESULT hr;
IUri *uri;
LPWSTR uriW;
@@ -11001,7 +11001,7 @@ static void test_CreateURLMoniker(void)
IUri *uri, *base_uri;
HRESULT hres;
- for(test = create_urlmon_tests; test < create_urlmon_tests + sizeof(create_urlmon_tests)/sizeof(*create_urlmon_tests); test++) {
+ for(test = create_urlmon_tests; test < create_urlmon_tests + ARRAY_SIZE(create_urlmon_tests); test++) {
url = a2w(test->url);
base_url = a2w(test->base_url);
@@ -11100,7 +11100,7 @@ static void test_IPersistStream(void)
props_order[Uri_PROPERTY_SCHEME_NAME] = 8;
props_order[Uri_PROPERTY_USER_NAME] = 9;
- for(i=0; i<sizeof(uri_tests)/sizeof(*uri_tests); i++) {
+ for(i = 0; i < ARRAY_SIZE(uri_tests); i++) {
const uri_properties *test = uri_tests+i;
LPWSTR uriW;
IUri *uri;
diff --git a/dlls/urlmon/tests/url.c b/dlls/urlmon/tests/url.c
index 8da0fd8256..893632fd2e 100644
--- a/dlls/urlmon/tests/url.c
+++ b/dlls/urlmon/tests/url.c
@@ -2901,7 +2901,7 @@ static void init_bind_test(int protocol, DWORD flags, DWORD t)
}
if(url_a)
- MultiByteToWideChar(CP_ACP, 0, url_a, -1, current_url, sizeof(current_url)/sizeof(*current_url));
+ MultiByteToWideChar(CP_ACP, 0, url_a, -1, current_url, ARRAY_SIZE(current_url));
test_redirect = (flags & BINDTEST_REDIRECT) != 0;
use_cache_file = (flags & BINDTEST_USE_CACHE) != 0;
--
2.14.4
June 14, 2018
[PATCH] shell32/tests: Use the available ARRAY_SIZE() macro
by Michael Stefaniuc
Signed-off-by: Michael Stefaniuc <mstefani(a)winehq.org>
---
dlls/shell32/tests/autocomplete.c | 4 ++--
dlls/shell32/tests/shelldispatch.c | 14 +++++++-------
dlls/shell32/tests/shelllink.c | 2 +-
dlls/shell32/tests/shellole.c | 2 +-
dlls/shell32/tests/shellpath.c | 4 ++--
dlls/shell32/tests/shlexec.c | 14 +++++++-------
dlls/shell32/tests/string.c | 8 ++++----
7 files changed, 24 insertions(+), 24 deletions(-)
diff --git a/dlls/shell32/tests/autocomplete.c b/dlls/shell32/tests/autocomplete.c
index 859734ce59..1c51e5179f 100644
--- a/dlls/shell32/tests/autocomplete.c
+++ b/dlls/shell32/tests/autocomplete.c
@@ -369,7 +369,7 @@ static void test_custom_source(void)
hr = CoCreateInstance(&CLSID_AutoComplete, NULL, CLSCTX_INPROC_SERVER, &IID_IAutoComplete2, (void**)&autocomplete);
ok(hr == S_OK, "CoCreateInstance failed: %x\n", hr);
- string_enumerator_create((void**)&enumerator, suggestions, sizeof(suggestions) / sizeof(*suggestions));
+ string_enumerator_create((void**)&enumerator, suggestions, ARRAY_SIZE(suggestions));
hr = IAutoComplete2_SetOptions(autocomplete, ACO_AUTOSUGGEST | ACO_AUTOAPPEND);
ok(hr == S_OK, "IAutoComplete2_SetOptions failed: %x\n", hr);
@@ -385,7 +385,7 @@ static void test_custom_source(void)
TranslateMessage(&msg);
DispatchMessageA(&msg);
}
- SendMessageW(hwnd_edit, WM_GETTEXT, sizeof(buffer) / sizeof(*buffer), (LPARAM)buffer);
+ SendMessageW(hwnd_edit, WM_GETTEXT, ARRAY_SIZE(buffer), (LPARAM)buffer);
ok(lstrcmpW(str_beta, buffer) == 0, "Expected %s, got %s\n", wine_dbgstr_w(str_beta), wine_dbgstr_w(buffer));
ShowWindow(hMainWnd, SW_HIDE);
diff --git a/dlls/shell32/tests/shelldispatch.c b/dlls/shell32/tests/shelldispatch.c
index ed109a9e17..30c8291f58 100644
--- a/dlls/shell32/tests/shelldispatch.c
+++ b/dlls/shell32/tests/shelldispatch.c
@@ -161,7 +161,7 @@ static void test_namespace(void)
ok(folder == NULL, "expected NULL, got %p\n", folder);
/* test valid folder ids */
- for (i = 0; i < sizeof(special_folders)/sizeof(special_folders[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(special_folders); i++)
{
V_VT(&var) = VT_I4;
V_I4(&var) = special_folders[i];
@@ -474,7 +474,7 @@ static void test_items(void)
ok(!item, "item is not null\n");
/* create test files */
- for (i = 0; i < sizeof(file_defs)/sizeof(file_defs[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(file_defs); i++)
{
switch (file_defs[i].type)
{
@@ -605,7 +605,7 @@ static void test_items(void)
V_VT(&int_index) = VT_I4;
/* test the folder item corresponding to each file */
- for (i = 0; i < sizeof(file_defs)/sizeof(file_defs[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(file_defs); i++)
{
VARIANT_BOOL b;
BSTR name;
@@ -729,7 +729,7 @@ static void test_items(void)
}
/* test that there are only as many folder items as there were files */
- V_I4(&int_index) = sizeof(file_defs)/sizeof(file_defs[0]);
+ V_I4(&int_index) = ARRAY_SIZE(file_defs);
item = (FolderItem*)0xdeadbeef;
r = FolderItems_Item(items, int_index, &item);
ok(r == S_FALSE, "expected S_FALSE, got %08x\n", r);
@@ -975,7 +975,7 @@ if (0) /* crashes on pre-vista */ {
IShellView_Release(view);
/* Try with some other folder, that's not a desktop */
- GetTempPathW(sizeof(pathW)/sizeof(pathW[0]), pathW);
+ GetTempPathW(ARRAY_SIZE(pathW), pathW);
hr = IShellFolder_ParseDisplayName(desktop, NULL, NULL, pathW, NULL, &pidl, NULL);
ok(hr == S_OK, "got 0x%08x\n", hr);
@@ -1218,7 +1218,7 @@ static void test_ParseName(void)
&IID_IShellDispatch, (void**)&sd);
ok(hr == S_OK, "got 0x%08x\n", hr);
- GetTempPathW(sizeof(pathW)/sizeof(pathW[0]), pathW);
+ GetTempPathW(ARRAY_SIZE(pathW), pathW);
V_VT(&v) = VT_BSTR;
V_BSTR(&v) = SysAllocString(pathW);
hr = IShellDispatch_NameSpace(sd, v, &folder);
@@ -1287,7 +1287,7 @@ static void test_Verbs(void)
&IID_IShellDispatch, (void**)&sd);
ok(hr == S_OK, "got 0x%08x\n", hr);
- GetTempPathW(sizeof(pathW)/sizeof(pathW[0]), pathW);
+ GetTempPathW(ARRAY_SIZE(pathW), pathW);
V_VT(&v) = VT_BSTR;
V_BSTR(&v) = SysAllocString(pathW);
hr = IShellDispatch_NameSpace(sd, v, &folder);
diff --git a/dlls/shell32/tests/shelllink.c b/dlls/shell32/tests/shelllink.c
index 1e07090dc4..65e9a6dd55 100644
--- a/dlls/shell32/tests/shelllink.c
+++ b/dlls/shell32/tests/shelllink.c
@@ -1287,7 +1287,7 @@ if (0)
ok(hicon == NULL, "Got icon %p\n", hicon);
/* Create a temporary non-executable file */
- GetTempPathW(sizeof(pathW)/sizeof(pathW[0]), pathW);
+ GetTempPathW(ARRAY_SIZE(pathW), pathW);
lstrcatW(pathW, nameW);
file = CreateFileW(pathW, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
ok(file != INVALID_HANDLE_VALUE, "Failed to create a test file\n");
diff --git a/dlls/shell32/tests/shellole.c b/dlls/shell32/tests/shellole.c
index 4144f18155..4b91302a15 100644
--- a/dlls/shell32/tests/shellole.c
+++ b/dlls/shell32/tests/shellole.c
@@ -869,7 +869,7 @@ static void test_SHCreateSessionKey(void)
HKEY hkey, hkey2;
HRESULT hr;
DWORD session;
- WCHAR sessionW[(sizeof(session_format)/sizeof(WCHAR)) + 16];
+ WCHAR sessionW[ARRAY_SIZE(session_format) + 16];
LONG ret;
if (!pSHCreateSessionKey)
diff --git a/dlls/shell32/tests/shellpath.c b/dlls/shell32/tests/shellpath.c
index 613c4eb15d..505da2778e 100644
--- a/dlls/shell32/tests/shellpath.c
+++ b/dlls/shell32/tests/shellpath.c
@@ -114,7 +114,7 @@ static const BYTE printersType[] = { PT_YAGUID, PT_SHELLEXT, 0x71 };
static const BYTE ieSpecialType[] = { PT_IESPECIAL2 };
static const BYTE shellExtType[] = { PT_SHELLEXT };
static const BYTE workgroupType[] = { PT_WORKGRP };
-#define DECLARE_TYPE(x, y) { x, sizeof(y) / sizeof(y[0]), y }
+#define DECLARE_TYPE(x, y) { x, ARRAY_SIZE(y), y }
static const struct shellExpectedValues requiredShellValues[] = {
DECLARE_TYPE(CSIDL_BITBUCKET, guidType),
DECLARE_TYPE(CSIDL_CONTROLS, controlPanelType),
@@ -2545,7 +2545,7 @@ static void test_DoEnvironmentSubst(void)
"%HOMEDRIVE%%HOMEPATH%",
"%OS% %windir%"}; /* always the last entry in the table */
- for (i = 0; i < (sizeof(names)/sizeof(LPSTR)); i++)
+ for (i = 0; i < (ARRAY_SIZE(names)); i++)
{
memset(bufferA, '#', MAX_PATH - 1);
bufferA[MAX_PATH - 1] = 0;
diff --git a/dlls/shell32/tests/shlexec.c b/dlls/shell32/tests/shlexec.c
index 7cdae878db..c67cc46a46 100644
--- a/dlls/shell32/tests/shlexec.c
+++ b/dlls/shell32/tests/shlexec.c
@@ -758,7 +758,7 @@ static LSTATUS myRegDeleteTreeA(HKEY hKey, LPCSTR lpszSubKey)
dwMaxSubkeyLen++;
dwMaxValueLen++;
dwMaxLen = max(dwMaxSubkeyLen, dwMaxValueLen);
- if (dwMaxLen > sizeof(szNameBuf)/sizeof(CHAR))
+ if (dwMaxLen > ARRAY_SIZE(szNameBuf))
{
/* Name too big: alloc a buffer for it */
if (!(lpszName = heap_alloc(dwMaxLen*sizeof(CHAR))))
@@ -1329,7 +1329,7 @@ static BOOL test_one_cmdline(const cmdline_tests_t* test)
int i, count;
/* trace("----- cmd='%s'\n", test->cmd); */
- MultiByteToWideChar(CP_ACP, 0, test->cmd, -1, cmdW, sizeof(cmdW)/sizeof(*cmdW));
+ MultiByteToWideChar(CP_ACP, 0, test->cmd, -1, cmdW, ARRAY_SIZE(cmdW));
argsW = cl2a = CommandLineToArgvW(cmdW, &cl2a_count);
if (argsW == NULL && cl2a_count == -1)
{
@@ -1349,7 +1349,7 @@ static BOOL test_one_cmdline(const cmdline_tests_t* test)
{
if (i < count)
{
- MultiByteToWideChar(CP_ACP, 0, test->args[i], -1, argW, sizeof(argW)/sizeof(*argW));
+ MultiByteToWideChar(CP_ACP, 0, test->args[i], -1, argW, ARRAY_SIZE(argW));
todo_wine_if(test->todo & (1 << (i+4)))
ok(!lstrcmpW(*argsW, argW), "%s: arg[%d] expected %s but got %s\n", test->cmd, i, wine_dbgstr_w(argW), wine_dbgstr_w(*argsW));
}
@@ -1395,7 +1395,7 @@ static void test_commandline2argv(void)
"expected NULL-terminated list of commandline arguments\n");
if (numargs == 1)
{
- GetModuleFileNameW(NULL, strW, sizeof(strW)/sizeof(*strW));
+ GetModuleFileNameW(NULL, strW, ARRAY_SIZE(strW));
ok(!lstrcmpW(args[0], strW), "wrong path to the current executable: %s instead of %s\n", wine_dbgstr_w(args[0]), wine_dbgstr_w(strW));
}
if (args) LocalFree(args);
@@ -1859,7 +1859,7 @@ static void test_fileurls(void)
return;
}
- get_long_path_name(tmpdir, longtmpdir, sizeof(longtmpdir)/sizeof(*longtmpdir));
+ get_long_path_name(tmpdir, longtmpdir, ARRAY_SIZE(longtmpdir));
SetEnvironmentVariableA("urlprefix", "file:///");
test=fileurl_tests;
@@ -2779,7 +2779,7 @@ static void init_test(void)
/* Setup the test shortcuts */
sprintf(filename, "%s\\test_shortcut_shlexec.lnk", tmpdir);
- MultiByteToWideChar(CP_ACP, 0, filename, -1, lnkfile, sizeof(lnkfile)/sizeof(*lnkfile));
+ MultiByteToWideChar(CP_ACP, 0, filename, -1, lnkfile, ARRAY_SIZE(lnkfile));
desc.description=NULL;
desc.workdir=NULL;
sprintf(filename, "%s\\test file.shlexec", tmpdir);
@@ -2793,7 +2793,7 @@ static void init_test(void)
create_lnk(lnkfile, &desc, 0);
sprintf(filename, "%s\\test_shortcut_exe.lnk", tmpdir);
- MultiByteToWideChar(CP_ACP, 0, filename, -1, lnkfile, sizeof(lnkfile)/sizeof(*lnkfile));
+ MultiByteToWideChar(CP_ACP, 0, filename, -1, lnkfile, ARRAY_SIZE(lnkfile));
desc.description=NULL;
desc.workdir=NULL;
desc.path=argv0;
diff --git a/dlls/shell32/tests/string.c b/dlls/shell32/tests/string.c
index 6cdb386eba..5fd589300b 100644
--- a/dlls/shell32/tests/string.c
+++ b/dlls/shell32/tests/string.c
@@ -67,14 +67,14 @@ static void test_StrRetToStringNW(void)
strret.uType = STRRET_WSTR;
U(strret).pOleStr = CoDupStrW("Test");
memset(buff, 0xff, sizeof(buff));
- ret = pStrRetToStrNAW(buff, sizeof(buff)/sizeof(WCHAR), &strret, NULL);
+ ret = pStrRetToStrNAW(buff, ARRAY_SIZE(buff), &strret, NULL);
ok(ret == TRUE && !strcmpW(buff, szTestW),
"STRRET_WSTR: dup failed, ret=%d\n", ret);
strret.uType = STRRET_CSTR;
lstrcpyA(U(strret).cStr, "Test");
memset(buff, 0xff, sizeof(buff));
- ret = pStrRetToStrNAW(buff, sizeof(buff)/sizeof(WCHAR), &strret, NULL);
+ ret = pStrRetToStrNAW(buff, ARRAY_SIZE(buff), &strret, NULL);
ok(ret == TRUE && !strcmpW(buff, szTestW),
"STRRET_CSTR: dup failed, ret=%d\n", ret);
@@ -82,7 +82,7 @@ static void test_StrRetToStringNW(void)
U(strret).uOffset = 1;
strcpy((char*)&iidl, " Test");
memset(buff, 0xff, sizeof(buff));
- ret = pStrRetToStrNAW(buff, sizeof(buff)/sizeof(WCHAR), &strret, iidl);
+ ret = pStrRetToStrNAW(buff, ARRAY_SIZE(buff), &strret, iidl);
ok(ret == TRUE && !strcmpW(buff, szTestW),
"STRRET_OFFSET: dup failed, ret=%d\n", ret);
@@ -92,7 +92,7 @@ if (0)
/* Invalid dest - should return FALSE, except NT4 does not, so we don't check. */
strret.uType = STRRET_WSTR;
U(strret).pOleStr = CoDupStrW("Test");
- pStrRetToStrNAW(NULL, sizeof(buff)/sizeof(WCHAR), &strret, NULL);
+ pStrRetToStrNAW(NULL, ARRAY_SIZE(buff), &strret, NULL);
trace("NULL dest: ret=%d\n", ret);
}
}
--
2.14.4
June 14, 2018
[PATCH] shell32/tests: Avoid sizeof in a trace
by Michael Stefaniuc
Signed-off-by: Michael Stefaniuc <mstefani(a)winehq.org>
---
dlls/shell32/tests/shelldispatch.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/dlls/shell32/tests/shelldispatch.c b/dlls/shell32/tests/shelldispatch.c
index cc00757840..ed109a9e17 100644
--- a/dlls/shell32/tests/shelldispatch.c
+++ b/dlls/shell32/tests/shelldispatch.c
@@ -541,8 +541,7 @@ static void test_items(void)
count = -1;
r = FolderItems_get_Count(items, &count);
ok(r == S_OK, "FolderItems::get_Count failed: %08x\n", r);
- ok(count == sizeof(file_defs)/sizeof(file_defs[0]),
- "expected %d files, got %d\n", (LONG)(sizeof(file_defs)/sizeof(file_defs[0])), count);
+ ok(count == ARRAY_SIZE(file_defs), "got %d files\n", count);
V_VT(&var) = VT_EMPTY;
item = (FolderItem*)0xdeadbeef;
--
2.14.4
June 14, 2018
[PATCH] setupapi/tests: Use the available ARRAY_SIZE() macro
by Michael Stefaniuc
Signed-off-by: Michael Stefaniuc <mstefani(a)winehq.org>
---
dlls/setupapi/tests/devinst.c | 4 ++--
dlls/setupapi/tests/misc.c | 4 ++--
dlls/setupapi/tests/parser.c | 8 ++++----
dlls/setupapi/tests/setupcab.c | 20 +++++++++-----------
4 files changed, 17 insertions(+), 19 deletions(-)
diff --git a/dlls/setupapi/tests/devinst.c b/dlls/setupapi/tests/devinst.c
index 4df00b1855..420c65a142 100644
--- a/dlls/setupapi/tests/devinst.c
+++ b/dlls/setupapi/tests/devinst.c
@@ -121,7 +121,7 @@ static LSTATUS devinst_RegDeleteTreeW(HKEY hKey, LPCWSTR lpszSubKey)
dwMaxSubkeyLen++;
dwMaxValueLen++;
dwMaxLen = max(dwMaxSubkeyLen, dwMaxValueLen);
- if (dwMaxLen > sizeof(szNameBuf)/sizeof(WCHAR))
+ if (dwMaxLen > ARRAY_SIZE(szNameBuf))
{
/* Name too big: alloc a buffer for it */
if (!(lpszName = HeapAlloc( GetProcessHeap(), 0, dwMaxLen*sizeof(WCHAR))))
@@ -1259,7 +1259,7 @@ static void testSetupDiGetINFClassA(void)
retval = SetupDiGetINFClassA(filename, &guid, cn, MAX_PATH, &count);
ok(!retval, "expected SetupDiGetINFClassA to fail!\n");
- for(i=0; i < sizeof(signatures)/sizeof(char*); i++)
+ for(i=0; i < ARRAY_SIZE(signatures); i++)
{
trace("testing signature %s\n", signatures[i]);
h = CreateFileA(filename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
diff --git a/dlls/setupapi/tests/misc.c b/dlls/setupapi/tests/misc.c
index dbe684bb29..9143cd4bd3 100644
--- a/dlls/setupapi/tests/misc.c
+++ b/dlls/setupapi/tests/misc.c
@@ -594,7 +594,7 @@ static void test_SetupDecompressOrCopyFile(void)
create_source_file(source, uncompressed, sizeof(uncompressed));
- for (i = 0; i < sizeof(invalid_parameters)/sizeof(invalid_parameters[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(invalid_parameters); i++)
{
type = FILE_COMPRESSION_NONE;
ret = SetupDecompressOrCopyFileA(invalid_parameters[i].source,
@@ -697,7 +697,7 @@ static void test_SetupDecompressOrCopyFile(void)
p = strrchr(target, '\\');
- for (i = 0; i < sizeof(zip_multi_tests)/sizeof(zip_multi_tests[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(zip_multi_tests); i++)
{
lstrcpyA(p + 1, zip_multi_tests[i].filename);
diff --git a/dlls/setupapi/tests/parser.c b/dlls/setupapi/tests/parser.c
index 67c9887a61..f8d2c5de1c 100644
--- a/dlls/setupapi/tests/parser.c
+++ b/dlls/setupapi/tests/parser.c
@@ -154,7 +154,7 @@ static void test_invalid_files(void)
HINF hinf;
DWORD err;
- for (i = 0; i < sizeof(invalid_files)/sizeof(invalid_files[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(invalid_files); i++)
{
SetLastError( 0xdeadbeef );
err_line = 0xdeadbeef;
@@ -229,7 +229,7 @@ static void test_section_names(void)
DWORD err;
LONG ret;
- for (i = 0; i < sizeof(section_names)/sizeof(section_names[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(section_names); i++)
{
SetLastError( 0xdeadbeef );
hinf = test_file_contents( section_names[i].data, &err_line );
@@ -418,7 +418,7 @@ static void test_key_names(void)
BOOL ret;
INFCONTEXT context;
- for (i = 0; i < sizeof(key_names)/sizeof(key_names[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(key_names); i++)
{
strcpy( buffer, STD_HEADER "[Test]\n" );
strcat( buffer, key_names[i].data );
@@ -622,7 +622,7 @@ static void test_SetupGetIntField(void)
};
unsigned int i;
- for (i = 0; i < sizeof(keys)/sizeof(keys[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(keys); i++)
{
HINF hinf;
char buffer[MAX_INF_STRING_LENGTH];
diff --git a/dlls/setupapi/tests/setupcab.c b/dlls/setupapi/tests/setupcab.c
index 33daae922b..bb9add035d 100644
--- a/dlls/setupapi/tests/setupcab.c
+++ b/dlls/setupapi/tests/setupcab.c
@@ -109,7 +109,7 @@ static void test_invalid_parametersA(void)
create_source_fileA(source, NULL, 0);
- for (i = 0; i < sizeof(invalid_parameters)/sizeof(invalid_parameters[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(invalid_parameters); i++)
{
SetLastError(0xdeadbeef);
ret = SetupIterateCabinetA(invalid_parameters[i].CabinetFile, 0,
@@ -170,12 +170,12 @@ static void test_invalid_parametersW(void)
return;
}
- GetTempPathW(sizeof(temp)/sizeof(WCHAR), temp);
+ GetTempPathW(ARRAY_SIZE(temp), temp);
GetTempFileNameW(temp, docW, 0, source);
create_source_fileW(source, NULL, 0);
- for (i = 0; i < sizeof(invalid_parameters)/sizeof(invalid_parameters[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(invalid_parameters); i++)
{
SetLastError(0xdeadbeef);
ret = SetupIterateCabinetW(invalid_parameters[i].CabinetFile, 0,
@@ -275,7 +275,7 @@ static void test_invalid_callbackW(void)
return;
}
- GetTempPathW(sizeof(temp)/sizeof(WCHAR), temp);
+ GetTempPathW(ARRAY_SIZE(temp), temp);
GetTempFileNameW(temp, docW, 0, source);
create_source_fileW(source, comp_cab_zip_multi, sizeof(comp_cab_zip_multi));
@@ -316,7 +316,7 @@ static UINT CALLBACK simple_callbackA(PVOID Context, UINT Notification,
(*file_count)++;
- if (index < sizeof(expected_files)/sizeof(char *))
+ if (index < ARRAY_SIZE(expected_files))
{
ok(!strcmp(expected_files[index], info->NameInCabinet),
"[%d] Expected file \"%s\", got \"%s\"\n",
@@ -348,8 +348,7 @@ static void test_simple_enumerationA(void)
ret = SetupIterateCabinetA(source, 0, simple_callbackA, &enum_count);
ok(ret == 1, "Expected SetupIterateCabinetA to return 1, got %d\n", ret);
- ok(enum_count == sizeof(expected_files)/sizeof(char *),
- "Unexpectedly enumerated %d files\n", enum_count);
+ ok(enum_count == ARRAY_SIZE(expected_files), "Unexpectedly enumerated %d files\n", enum_count);
DeleteFileA(source);
}
@@ -376,7 +375,7 @@ static UINT CALLBACK simple_callbackW(PVOID Context, UINT Notification,
(*file_count)++;
- if (index < sizeof(expected_filesW)/sizeof(WCHAR *))
+ if (index < ARRAY_SIZE(expected_filesW))
{
ok(!lstrcmpW(expected_filesW[index], info->NameInCabinet),
"[%d] Expected file %s, got %s\n",
@@ -408,15 +407,14 @@ static void test_simple_enumerationW(void)
return;
}
- GetTempPathW(sizeof(temp)/sizeof(WCHAR), temp);
+ GetTempPathW(ARRAY_SIZE(temp), temp);
GetTempFileNameW(temp, docW, 0, source);
create_source_fileW(source, comp_cab_zip_multi, sizeof(comp_cab_zip_multi));
ret = SetupIterateCabinetW(source, 0, simple_callbackW, &enum_count);
ok(ret == 1, "Expected SetupIterateCabinetW to return 1, got %d\n", ret);
- ok(enum_count == sizeof(expected_files)/sizeof(WCHAR *),
- "Unexpectedly enumerated %d files\n", enum_count);
+ ok(enum_count == ARRAY_SIZE(expected_files), "Unexpectedly enumerated %d files\n", enum_count);
DeleteFileW(source);
}
--
2.14.4
June 14, 2018
[PATCH] winedbg/gdbproxy: Handle VS thread renaming.
by Zebediah Figura
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
programs/winedbg/gdbproxy.c | 24 ++++++++++++++++++++++++
1 file changed, 24 insertions(+)
diff --git a/programs/winedbg/gdbproxy.c b/programs/winedbg/gdbproxy.c
index 869d56b..7f59ce1 100644
--- a/programs/winedbg/gdbproxy.c
+++ b/programs/winedbg/gdbproxy.c
@@ -339,6 +339,30 @@ static BOOL handle_exception(struct gdb_context* gdbctx, EXCEPTION_DEBUG_INFO* e
ret = TRUE;
/* FIXME: we could also add here a O packet with additional information */
break;
+ case EXCEPTION_NAME_THREAD:
+ {
+ const THREADNAME_INFO *threadname = (const THREADNAME_INFO *)rec->ExceptionInformation;
+ struct dbg_thread *thread;
+ char name[9];
+ SIZE_T read;
+
+ if (threadname->dwThreadID == -1)
+ thread = dbg_curr_thread;
+ else
+ thread = dbg_get_thread(gdbctx->process, threadname->dwThreadID);
+ if (thread)
+ {
+ if (gdbctx->process->process_io->read( gdbctx->process->handle,
+ threadname->szName, name, sizeof(name), &read) && read == sizeof(name))
+ {
+ fprintf(stderr, "Thread ID=%04x renamed to \"%.9s\"\n",
+ threadname->dwThreadID, name);
+ }
+ }
+ else
+ fprintf(stderr, "Cannot set name of thread %04x\n", threadname->dwThreadID);
+ return DBG_CONTINUE;
+ }
default:
if (gdbctx->trace & GDBPXY_TRC_WIN32_EVENT)
fprintf(stderr, "Unhandled exception code 0x%08x\n", rec->ExceptionCode);
--
2.7.4
June 14, 2018
[PATCH 6/6] dbghelp: Read the stabs nlist entry corresponding to the target's architecture.
by Zebediah Figura
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
dlls/dbghelp/dbghelp_private.h | 2 +-
dlls/dbghelp/macho_module.c | 16 +++------
dlls/dbghelp/stabs.c | 73 ++++++++++++++++++++++++------------------
3 files changed, 47 insertions(+), 44 deletions(-)
diff --git a/dlls/dbghelp/dbghelp_private.h b/dlls/dbghelp/dbghelp_private.h
index 0963f1e..76f5d00 100644
--- a/dlls/dbghelp/dbghelp_private.h
+++ b/dlls/dbghelp/dbghelp_private.h
@@ -676,7 +676,7 @@ typedef void (*stabs_def_cb)(struct module* module, unsigned long load_offset,
BOOL is_public, BOOL is_global, unsigned char other,
struct symt_compiland* compiland, void* user);
extern BOOL stabs_parse(struct module* module, unsigned long load_offset,
- const void* stabs, int stablen,
+ const char* stabs, int stablen,
const char* strs, int strtablen,
stabs_def_cb callback, void* user) DECLSPEC_HIDDEN;
diff --git a/dlls/dbghelp/macho_module.c b/dlls/dbghelp/macho_module.c
index b8f5967..52c8e69 100644
--- a/dlls/dbghelp/macho_module.c
+++ b/dlls/dbghelp/macho_module.c
@@ -88,13 +88,6 @@ struct dyld_all_image_infos {
WINE_DEFAULT_DEBUG_CHANNEL(dbghelp_macho);
-#ifdef _WIN64
-typedef struct nlist_64 macho_nlist;
-#else
-typedef struct nlist macho_nlist;
-#endif
-
-
/* Bitmask for Mach-O image header flags indicating that the image is in dyld's
shared cached. That implies that its segments are mapped non-contiguously.
This value isn't defined anywhere in headers. It's used in dyld and in
@@ -913,24 +906,25 @@ static int macho_parse_symtab(struct image_file_map* ifm,
struct macho_file_map* fmap = &ifm->u.macho;
const struct symtab_command* sc = (const struct symtab_command*)lc;
struct macho_debug_info* mdi = user;
- const macho_nlist* stab;
const char* stabstr;
int ret = 0;
+ size_t stabsize = (ifm->addr_size == 32) ? sizeof(struct nlist) : sizeof(struct nlist_64);
+ const char *stab;
TRACE("(%p/%d, %p, %p) %u syms at 0x%08x, strings 0x%08x - 0x%08x\n", fmap, fmap->fd, lc,
user, sc->nsyms, sc->symoff, sc->stroff, sc->stroff + sc->strsize);
- if (!macho_map_ranges(fmap, sc->symoff, sc->nsyms * sizeof(macho_nlist),
+ if (!macho_map_ranges(fmap, sc->symoff, sc->nsyms * stabsize,
sc->stroff, sc->strsize, (const void**)&stab, (const void**)&stabstr))
return 0;
if (!stabs_parse(mdi->module,
mdi->module->format_info[DFI_MACHO]->u.macho_info->load_addr - fmap->segs_start,
- stab, sc->nsyms * sizeof(macho_nlist),
+ stab, sc->nsyms * stabsize,
stabstr, sc->strsize, macho_stabs_def_cb, mdi))
ret = -1;
- macho_unmap_ranges(fmap, sc->symoff, sc->nsyms * sizeof(macho_nlist),
+ macho_unmap_ranges(fmap, sc->symoff, sc->nsyms * stabsize,
sc->stroff, sc->strsize, (const void**)&stab, (const void**)&stabstr);
return ret;
diff --git a/dlls/dbghelp/stabs.c b/dlls/dbghelp/stabs.c
index 177c6bc..846a935 100644
--- a/dlls/dbghelp/stabs.c
+++ b/dlls/dbghelp/stabs.c
@@ -41,6 +41,7 @@
#include <sys/mman.h>
#endif
#include <limits.h>
+#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#ifdef HAVE_UNISTD_H
@@ -111,11 +112,7 @@ struct stab_nlist
unsigned char n_type;
char n_other;
short n_desc;
-#if defined(__APPLE__) && defined(_WIN64)
- unsigned long n_value;
-#else
unsigned n_value;
-#endif
};
static void stab_strcpy(char* dest, int sz, const char* source)
@@ -1265,7 +1262,7 @@ static inline void stabbuf_append(char **buf, unsigned *buf_size, const char *st
}
BOOL stabs_parse(struct module* module, unsigned long load_offset,
- const void* pv_stab_ptr, int stablen,
+ const char* pv_stab_ptr, int stablen,
const char* strs, int strtablen,
stabs_def_cb callback, void* user)
{
@@ -1278,7 +1275,7 @@ BOOL stabs_parse(struct module* module, unsigned long load_offset,
const char* ptr;
char* stabbuff;
unsigned int stabbufflen;
- const struct stab_nlist* stab_ptr = pv_stab_ptr;
+ const struct stab_nlist* stab_ptr;
const char* strs_end;
int strtabinc;
char symname[4096];
@@ -1290,8 +1287,14 @@ BOOL stabs_parse(struct module* module, unsigned long load_offset,
BOOL ret = TRUE;
struct location loc;
unsigned char type;
+ size_t stabsize = sizeof(struct stab_nlist);
+ uint64_t n_value;
- nstab = stablen / sizeof(struct stab_nlist);
+#ifdef __APPLE__
+ if (module->process->is_64bit)
+ stabsize = sizeof(struct nlist_64);
+#endif
+ nstab = stablen / stabsize;
strs_end = strs + strtablen;
memset(stabs_basic, 0, sizeof(stabs_basic));
@@ -1307,8 +1310,14 @@ BOOL stabs_parse(struct module* module, unsigned long load_offset,
strtabinc = 0;
stabbuff[0] = '\0';
- for (i = 0; i < nstab; i++, stab_ptr++)
+ for (i = 0; i < nstab; i++)
{
+ stab_ptr = (struct stab_nlist *)(pv_stab_ptr + i * stabsize);
+ n_value = stab_ptr->n_value;
+#ifdef __APPLE__
+ if (module->process->is_64bit)
+ n_value = ((struct nlist_64 *)stab_ptr)->n_value;
+#endif
ptr = strs + stab_ptr->n_strx;
if ((ptr > strs_end) || (ptr + strlen(ptr) > strs_end))
{
@@ -1382,7 +1391,7 @@ BOOL stabs_parse(struct module* module, unsigned long load_offset,
stab_strcpy(symname, sizeof(symname), ptr);
loc.kind = loc_absolute;
loc.reg = 0;
- loc.offset = load_offset + stab_ptr->n_value;
+ loc.offset = load_offset + n_value;
symt_new_global_variable(module, compiland, symname, TRUE /* FIXME */,
loc, 0, stabs_parse_type(ptr));
break;
@@ -1392,7 +1401,7 @@ BOOL stabs_parse(struct module* module, unsigned long load_offset,
stab_strcpy(symname, sizeof(symname), ptr);
loc.kind = loc_absolute;
loc.reg = 0;
- loc.offset = load_offset + stab_ptr->n_value;
+ loc.offset = load_offset + n_value;
symt_new_global_variable(module, compiland, symname, TRUE /* FIXME */,
loc, 0, stabs_parse_type(ptr));
break;
@@ -1400,14 +1409,14 @@ BOOL stabs_parse(struct module* module, unsigned long load_offset,
if (curr_func)
{
block = symt_open_func_block(module, curr_func, block,
- stab_ptr->n_value, 0);
+ n_value, 0);
pending_flush(&pending_block, module, curr_func, block);
}
break;
case N_RBRAC:
if (curr_func)
block = symt_close_func_block(module, curr_func, block,
- stab_ptr->n_value);
+ n_value);
break;
case N_PSYM:
/* These are function parameters. */
@@ -1417,9 +1426,9 @@ BOOL stabs_parse(struct module* module, unsigned long load_offset,
stab_strcpy(symname, sizeof(symname), ptr);
loc.kind = loc_regrel;
loc.reg = dbghelp_current_cpu->frame_regno;
- loc.offset = stab_ptr->n_value;
+ loc.offset = n_value;
symt_add_func_local(module, curr_func,
- (int)stab_ptr->n_value >= 0 ? DataIsParam : DataIsLocal,
+ (int)n_value >= 0 ? DataIsParam : DataIsLocal,
&loc, NULL, param_type, symname);
symt_add_function_signature_parameter(module,
(struct symt_function_signature*)curr_func->type,
@@ -1433,7 +1442,7 @@ BOOL stabs_parse(struct module* module, unsigned long load_offset,
loc.kind = loc_register;
loc.offset = 0;
- switch (stab_ptr->n_value)
+ switch (n_value)
{
case 0: loc.reg = CV_REG_EAX; break;
case 1: loc.reg = CV_REG_ECX; break;
@@ -1451,7 +1460,7 @@ BOOL stabs_parse(struct module* module, unsigned long load_offset,
case 16:
case 17:
case 18:
- case 19: loc.reg = CV_REG_ST0 + stab_ptr->n_value - 12; break;
+ case 19: loc.reg = CV_REG_ST0 + n_value - 12; break;
case 21:
case 22:
case 23:
@@ -1459,7 +1468,7 @@ BOOL stabs_parse(struct module* module, unsigned long load_offset,
case 25:
case 26:
case 27:
- case 28: loc.reg = CV_REG_XMM0 + stab_ptr->n_value - 21; break;
+ case 28: loc.reg = CV_REG_XMM0 + n_value - 21; break;
case 29:
case 30:
case 31:
@@ -1467,9 +1476,9 @@ BOOL stabs_parse(struct module* module, unsigned long load_offset,
case 33:
case 34:
case 35:
- case 36: loc.reg = CV_REG_MM0 + stab_ptr->n_value - 29; break;
+ case 36: loc.reg = CV_REG_MM0 + n_value - 29; break;
default:
- FIXME("Unknown register value (%lu)\n", (unsigned long)stab_ptr->n_value);
+ FIXME("Unknown register value (%lu)\n", (unsigned long)n_value);
loc.reg = CV_REG_NONE;
break;
}
@@ -1492,7 +1501,7 @@ BOOL stabs_parse(struct module* module, unsigned long load_offset,
/* These are local variables */
loc.kind = loc_regrel;
loc.reg = dbghelp_current_cpu->frame_regno;
- loc.offset = stab_ptr->n_value;
+ loc.offset = n_value;
if (curr_func != NULL) pending_add_var(&pending_block, ptr, DataIsLocal, &loc);
break;
case N_SLINE:
@@ -1503,14 +1512,14 @@ BOOL stabs_parse(struct module* module, unsigned long load_offset,
assert(source_idx >= 0);
if (curr_func != NULL)
{
- unsigned long offset = stab_ptr->n_value;
+ unsigned long offset = n_value;
if (module->type == DMT_MACHO)
offset -= curr_func->address - load_offset;
symt_add_func_line(module, curr_func, source_idx,
stab_ptr->n_desc, offset);
}
else pending_add_line(&pending_func, source_idx, stab_ptr->n_desc,
- stab_ptr->n_value, load_offset);
+ n_value, load_offset);
break;
case N_FUN:
/*
@@ -1537,13 +1546,13 @@ BOOL stabs_parse(struct module* module, unsigned long load_offset,
* and offset of last function
*/
stabs_finalize_function(module, curr_func,
- stab_ptr->n_value ?
- (load_offset + stab_ptr->n_value - curr_func->address) : 0);
+ n_value ?
+ (load_offset + n_value - curr_func->address) : 0);
}
func_type = symt_new_function_signature(module,
stabs_parse_type(ptr), -1);
curr_func = symt_new_function(module, compiland, symname,
- load_offset + stab_ptr->n_value, 0,
+ load_offset + n_value, 0,
&func_type->symt);
pending_flush(&pending_func, module, curr_func, NULL);
}
@@ -1552,7 +1561,7 @@ BOOL stabs_parse(struct module* module, unsigned long load_offset,
/* some versions of GCC to use a N_FUN "" to mark the end of a function
* and n_value contains the size of the func
*/
- stabs_finalize_function(module, curr_func, stab_ptr->n_value);
+ stabs_finalize_function(module, curr_func, n_value);
curr_func = NULL;
}
break;
@@ -1594,7 +1603,7 @@ BOOL stabs_parse(struct module* module, unsigned long load_offset,
break;
case N_UNDF:
strs += strtabinc;
- strtabinc = stab_ptr->n_value;
+ strtabinc = n_value;
/* I'm not sure this is needed, so trace it before we obsolete it */
if (curr_func)
{
@@ -1607,7 +1616,7 @@ BOOL stabs_parse(struct module* module, unsigned long load_offset,
/* Ignore this. We don't care what it points to. */
break;
case N_BINCL:
- stabs_add_include(stabs_new_include(ptr, stab_ptr->n_value));
+ stabs_add_include(stabs_new_include(ptr, n_value));
assert(incl_stk < (int)(sizeof(incl) / sizeof(incl[0])) - 1);
incl[++incl_stk] = source_idx;
source_idx = source_new(module, NULL, ptr);
@@ -1617,9 +1626,9 @@ BOOL stabs_parse(struct module* module, unsigned long load_offset,
source_idx = incl[incl_stk--];
break;
case N_EXCL:
- if (stabs_add_include(stabs_find_include(ptr, stab_ptr->n_value)) < 0)
+ if (stabs_add_include(stabs_find_include(ptr, n_value)) < 0)
{
- ERR("Excluded header not found (%s,%ld)\n", ptr, (unsigned long)stab_ptr->n_value);
+ ERR("Excluded header not found (%s,%ld)\n", ptr, (unsigned long)n_value);
module_reset_debug_info(module);
ret = FALSE;
goto done;
@@ -1656,7 +1665,7 @@ BOOL stabs_parse(struct module* module, unsigned long load_offset,
if (*ptr == '_') ptr++;
stab_strcpy(symname, sizeof(symname), ptr);
- callback(module, load_offset, symname, stab_ptr->n_value,
+ callback(module, load_offset, symname, n_value,
is_public, is_global, stab_ptr->n_other, compiland, user);
}
break;
@@ -1666,7 +1675,7 @@ BOOL stabs_parse(struct module* module, unsigned long load_offset,
}
stabbuff[0] = '\0';
TRACE("0x%02x %lx %s\n",
- stab_ptr->n_type, (unsigned long)stab_ptr->n_value, debugstr_a(strs + stab_ptr->n_strx));
+ stab_ptr->n_type, (unsigned long)n_value, debugstr_a(strs + stab_ptr->n_strx));
}
module->module.SymType = SymDia;
module->module.CVSig = 'S' | ('T' << 8) | ('A' << 16) | ('B' << 24);
--
2.7.4
June 14, 2018
[PATCH 5/6] dbghelp: Translate the 32-bit Mach-O section header to the 64-bit one.
by Zebediah Figura
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
dlls/dbghelp/image_private.h | 8 +-------
dlls/dbghelp/macho_module.c | 43 +++++++++++++++++++++++++++++--------------
2 files changed, 30 insertions(+), 21 deletions(-)
diff --git a/dlls/dbghelp/image_private.h b/dlls/dbghelp/image_private.h
index 60cdd35..9990850 100644
--- a/dlls/dbghelp/image_private.h
+++ b/dlls/dbghelp/image_private.h
@@ -44,12 +44,6 @@
#endif
#ifdef HAVE_MACH_O_LOADER_H
#include <mach-o/loader.h>
-
-#ifdef _WIN64
-typedef struct section_64 macho_section;
-#else
-typedef struct section macho_section;
-#endif
#endif
#define IMAGE_NO_MAP ((void*)-1)
@@ -105,7 +99,7 @@ struct image_file_map
int num_sections;
struct
{
- const macho_section* section;
+ struct section_64 section;
const char* mapped;
unsigned int ignored : 1;
}* sect;
diff --git a/dlls/dbghelp/macho_module.c b/dlls/dbghelp/macho_module.c
index 52ea739..b8f5967 100644
--- a/dlls/dbghelp/macho_module.c
+++ b/dlls/dbghelp/macho_module.c
@@ -328,7 +328,7 @@ BOOL macho_find_section(struct image_file_map* ifm, const char* segname, const c
{
struct macho_file_map* fmap;
unsigned i;
- char tmp[sizeof(fmap->sect[0].section->sectname)];
+ char tmp[sizeof(fmap->sect[0].section.sectname)];
/* Other parts of dbghelp use section names like ".eh_frame". Mach-O uses
names like "__eh_frame". Convert those. */
@@ -345,8 +345,8 @@ BOOL macho_find_section(struct image_file_map* ifm, const char* segname, const c
for (i = 0; i < fmap->num_sections; i++)
{
if (!fmap->sect[i].ignored &&
- strcmp(fmap->sect[i].section->sectname, sectname) == 0 &&
- (!segname || strcmp(fmap->sect[i].section->segname, segname) == 0))
+ strcmp(fmap->sect[i].section.sectname, sectname) == 0 &&
+ (!segname || strcmp(fmap->sect[i].section.segname, segname) == 0))
{
ism->fmap = ifm;
ism->sidx = i;
@@ -372,7 +372,7 @@ const char* macho_map_section(struct image_section_map* ism)
if (ism->sidx < 0 || ism->sidx >= ism->fmap->u.macho.num_sections || fmap->sect[ism->sidx].ignored)
return IMAGE_NO_MAP;
- return macho_map_range(fmap, fmap->sect[ism->sidx].section->offset, fmap->sect[ism->sidx].section->size,
+ return macho_map_range(fmap, fmap->sect[ism->sidx].section.offset, fmap->sect[ism->sidx].section.size,
&fmap->sect[ism->sidx].mapped);
}
@@ -385,8 +385,8 @@ void macho_unmap_section(struct image_section_map* ism)
if (ism->sidx >= 0 && ism->sidx < fmap->num_sections && fmap->sect[ism->sidx].mapped != IMAGE_NO_MAP)
{
- macho_unmap_range(&fmap->sect[ism->sidx].mapped, NULL, fmap, fmap->sect[ism->sidx].section->offset,
- fmap->sect[ism->sidx].section->size);
+ macho_unmap_range(&fmap->sect[ism->sidx].mapped, NULL, fmap, fmap->sect[ism->sidx].section.offset,
+ fmap->sect[ism->sidx].section.size);
}
}
@@ -398,7 +398,7 @@ DWORD_PTR macho_get_map_rva(const struct image_section_map* ism)
if (ism->sidx < 0 || ism->sidx >= ism->fmap->u.macho.num_sections ||
ism->fmap->u.macho.sect[ism->sidx].ignored)
return 0;
- return ism->fmap->u.macho.sect[ism->sidx].section->addr - ism->fmap->u.macho.segs_start;
+ return ism->fmap->u.macho.sect[ism->sidx].section.addr - ism->fmap->u.macho.segs_start;
}
/******************************************************************
@@ -409,7 +409,7 @@ unsigned macho_get_map_size(const struct image_section_map* ism)
if (ism->sidx < 0 || ism->sidx >= ism->fmap->u.macho.num_sections ||
ism->fmap->u.macho.sect[ism->sidx].ignored)
return 0;
- return ism->fmap->u.macho.sect[ism->sidx].section->size;
+ return ism->fmap->u.macho.sect[ism->sidx].section.size;
}
/******************************************************************
@@ -539,12 +539,12 @@ static int macho_load_section_info(struct image_file_map* ifm, const struct load
struct macho_file_map* fmap = &ifm->u.macho;
struct section_info* info = user;
BOOL ignore;
- const macho_section* section;
int i;
unsigned long tmp, page_mask = sysconf( _SC_PAGESIZE ) - 1;
uint64_t vmaddr, vmsize;
char segname[16];
uint32_t nsects;
+ const void *sections;
if (ifm->addr_size == 32)
{
@@ -553,7 +553,7 @@ static int macho_load_section_info(struct image_file_map* ifm, const struct load
vmsize = sc->vmsize;
memcpy(segname, sc->segname, sizeof(segname));
nsects = sc->nsects;
- section = (const macho_section*)(sc + 1);
+ sections = (const void *)(sc + 1);
}
else
{
@@ -562,7 +562,7 @@ static int macho_load_section_info(struct image_file_map* ifm, const struct load
vmsize = sc->vmsize;
memcpy(segname, sc->segname, sizeof(segname));
nsects = sc->nsects;
- section = (const macho_section*)(sc + 1);
+ sections = (const void *)(sc + 1);
}
TRACE("(%p/%d, %p, %p) before: 0x%08lx - 0x%08lx\n", fmap, fmap->fd, lc, user,
@@ -596,7 +596,22 @@ static int macho_load_section_info(struct image_file_map* ifm, const struct load
for (i = 0; i < nsects; i++)
{
- fmap->sect[info->section_index].section = §ion[i];
+ if (ifm->addr_size == 32)
+ {
+ const struct section *section = &((const struct section *)sections)[i];
+ memcpy(fmap->sect[info->section_index].section.sectname, section->sectname, sizeof(section->sectname));
+ memcpy(fmap->sect[info->section_index].section.segname, section->segname, sizeof(section->segname));
+ fmap->sect[info->section_index].section.addr = section->addr;
+ fmap->sect[info->section_index].section.size = section->size;
+ fmap->sect[info->section_index].section.offset = section->offset;
+ fmap->sect[info->section_index].section.align = section->align;
+ fmap->sect[info->section_index].section.reloff = section->reloff;
+ fmap->sect[info->section_index].section.nreloc = section->nreloc;
+ fmap->sect[info->section_index].section.flags = section->flags;
+ }
+ else
+ fmap->sect[info->section_index].section = ((const struct section_64 *)sections)[i];
+
fmap->sect[info->section_index].mapped = IMAGE_NO_MAP;
fmap->sect[info->section_index].ignored = ignore;
info->section_index++;
@@ -831,8 +846,8 @@ static BOOL macho_sect_is_code(struct macho_file_map* fmap, unsigned char sectid
sectidx--; /* convert from 1-based to 0-based */
if (sectidx >= fmap->num_sections || fmap->sect[sectidx].ignored) return FALSE;
- ret = (!(fmap->sect[sectidx].section->flags & SECTION_TYPE) &&
- (fmap->sect[sectidx].section->flags & (S_ATTR_PURE_INSTRUCTIONS|S_ATTR_SOME_INSTRUCTIONS)));
+ ret = (!(fmap->sect[sectidx].section.flags & SECTION_TYPE) &&
+ (fmap->sect[sectidx].section.flags & (S_ATTR_PURE_INSTRUCTIONS|S_ATTR_SOME_INSTRUCTIONS)));
TRACE("-> %d\n", ret);
return ret;
}
--
2.7.4
June 14, 2018
[PATCH 4/6] dbghelp: Read the Mach-O segment command corresponding to the target's architecture.
by Zebediah Figura
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
dlls/dbghelp/macho_module.c | 68 +++++++++++++++++++++++++++++++++------------
1 file changed, 50 insertions(+), 18 deletions(-)
diff --git a/dlls/dbghelp/macho_module.c b/dlls/dbghelp/macho_module.c
index 50fcca4..52ea739 100644
--- a/dlls/dbghelp/macho_module.c
+++ b/dlls/dbghelp/macho_module.c
@@ -89,10 +89,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(dbghelp_macho);
#ifdef _WIN64
-typedef struct segment_command_64 macho_segment_command;
typedef struct nlist_64 macho_nlist;
#else
-typedef struct segment_command macho_segment_command;
typedef struct nlist macho_nlist;
#endif
@@ -506,12 +504,26 @@ static int macho_enum_load_commands(struct image_file_map *ifm, unsigned cmd,
*/
static int macho_count_sections(struct image_file_map* ifm, const struct load_command* lc, void* user)
{
- const macho_segment_command* sc = (const macho_segment_command*)lc;
+ char segname[16];
+ uint32_t nsects;
+
+ if (ifm->addr_size == 32)
+ {
+ const struct segment_command *sc = (const struct segment_command *)lc;
+ memcpy(segname, sc->segname, sizeof(segname));
+ nsects = sc->nsects;
+ }
+ else
+ {
+ const struct segment_command_64 *sc = (const struct segment_command_64 *)lc;
+ memcpy(segname, sc->segname, sizeof(segname));
+ nsects = sc->nsects;
+ }
TRACE("(%p/%d, %p, %p) segment %s\n", ifm, ifm->u.macho.fd, lc, user,
- debugstr_an(sc->segname, sizeof(sc->segname)));
+ debugstr_an(segname, sizeof(segname)));
- ifm->u.macho.num_sections += sc->nsects;
+ ifm->u.macho.num_sections += nsects;
return 0;
}
@@ -525,44 +537,64 @@ static int macho_count_sections(struct image_file_map* ifm, const struct load_co
static int macho_load_section_info(struct image_file_map* ifm, const struct load_command* lc, void* user)
{
struct macho_file_map* fmap = &ifm->u.macho;
- const macho_segment_command* sc = (const macho_segment_command*)lc;
struct section_info* info = user;
BOOL ignore;
const macho_section* section;
int i;
unsigned long tmp, page_mask = sysconf( _SC_PAGESIZE ) - 1;
+ uint64_t vmaddr, vmsize;
+ char segname[16];
+ uint32_t nsects;
+
+ if (ifm->addr_size == 32)
+ {
+ const struct segment_command *sc = (const struct segment_command *)lc;
+ vmaddr = sc->vmaddr;
+ vmsize = sc->vmsize;
+ memcpy(segname, sc->segname, sizeof(segname));
+ nsects = sc->nsects;
+ section = (const macho_section*)(sc + 1);
+ }
+ else
+ {
+ const struct segment_command_64 *sc = (const struct segment_command_64 *)lc;
+ vmaddr = sc->vmaddr;
+ vmsize = sc->vmsize;
+ memcpy(segname, sc->segname, sizeof(segname));
+ nsects = sc->nsects;
+ section = (const macho_section*)(sc + 1);
+ }
TRACE("(%p/%d, %p, %p) before: 0x%08lx - 0x%08lx\n", fmap, fmap->fd, lc, user,
(unsigned long)fmap->segs_start, (unsigned long)fmap->segs_size);
- TRACE("Segment command vm: 0x%08lx - 0x%08lx\n", (unsigned long)sc->vmaddr,
- (unsigned long)(sc->vmaddr + sc->vmsize));
+ TRACE("Segment command vm: 0x%08lx - 0x%08lx\n", (unsigned long)vmaddr,
+ (unsigned long)(vmaddr + vmsize));
/* Images in the dyld shared cache have their segments mapped non-contiguously.
We don't know how to properly locate any of the segments other than __TEXT,
so ignore them. */
- ignore = (info->split_segs && strcmp(sc->segname, SEG_TEXT));
+ ignore = (info->split_segs && strcmp(segname, SEG_TEXT));
- if (!strncmp(sc->segname, "WINE_", 5))
- TRACE("Ignoring special Wine segment %s\n", debugstr_an(sc->segname, sizeof(sc->segname)));
- else if (!strncmp(sc->segname, "__PAGEZERO", 10))
+ if (!strncmp(segname, "WINE_", 5))
+ TRACE("Ignoring special Wine segment %s\n", debugstr_an(segname, sizeof(segname)));
+ else if (!strncmp(segname, "__PAGEZERO", 10))
TRACE("Ignoring __PAGEZERO segment\n");
else if (ignore)
- TRACE("Ignoring %s segment because image has split segments\n", sc->segname);
+ TRACE("Ignoring %s segment because image has split segments\n", segname);
else
{
/* If this segment starts before previously-known earliest, record new earliest. */
- if (sc->vmaddr < fmap->segs_start)
- fmap->segs_start = sc->vmaddr;
+ if (vmaddr < fmap->segs_start)
+ fmap->segs_start = vmaddr;
/* If this segment extends beyond previously-known furthest, record new furthest. */
- tmp = (sc->vmaddr + sc->vmsize + page_mask) & ~page_mask;
+ tmp = (vmaddr + vmsize + page_mask) & ~page_mask;
if (fmap->segs_size < tmp) fmap->segs_size = tmp;
TRACE("after: 0x%08lx - 0x%08lx\n", (unsigned long)fmap->segs_start, (unsigned long)fmap->segs_size);
}
- section = (const macho_section*)(sc + 1);
- for (i = 0; i < sc->nsects; i++)
+ for (i = 0; i < nsects; i++)
{
fmap->sect[info->section_index].section = §ion[i];
fmap->sect[info->section_index].mapped = IMAGE_NO_MAP;
--
2.7.4
June 14, 2018
[PATCH 3/6] dbghelp: Pass an image_file_map to macho_enum_load_commands().
by Zebediah Figura
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
dlls/dbghelp/macho_module.c | 38 ++++++++++++++++++++++----------------
1 file changed, 22 insertions(+), 16 deletions(-)
diff --git a/dlls/dbghelp/macho_module.c b/dlls/dbghelp/macho_module.c
index 679c203..50fcca4 100644
--- a/dlls/dbghelp/macho_module.c
+++ b/dlls/dbghelp/macho_module.c
@@ -467,10 +467,11 @@ static const struct load_command* macho_next_load_command(const struct load_comm
* callback. If >=0, that's the count of load commands successfully
* processed.
*/
-static int macho_enum_load_commands(struct macho_file_map* fmap, unsigned cmd,
- int (*cb)(struct macho_file_map*, const struct load_command*, void*),
+static int macho_enum_load_commands(struct image_file_map *ifm, unsigned cmd,
+ int (*cb)(struct image_file_map*, const struct load_command*, void*),
void* user)
{
+ struct macho_file_map* fmap = &ifm->u.macho;
const struct load_command* lc;
int i;
int count = 0;
@@ -488,7 +489,7 @@ static int macho_enum_load_commands(struct macho_file_map* fmap, unsigned cmd,
if (cmd && cmd != lc->cmd) continue;
count++;
- result = cb(fmap, lc, user);
+ result = cb(ifm, lc, user);
TRACE("load_command[%d] (%p), cmd %u; callback => %d\n", i, lc, lc->cmd, result);
if (result) return (result < 0) ? result : count;
}
@@ -503,13 +504,14 @@ static int macho_enum_load_commands(struct macho_file_map* fmap, unsigned cmd,
* significant sections in a Mach-O file. All commands are
* expected to be of LC_SEGMENT[_64] type.
*/
-static int macho_count_sections(struct macho_file_map* fmap, const struct load_command* lc, void* user)
+static int macho_count_sections(struct image_file_map* ifm, const struct load_command* lc, void* user)
{
const macho_segment_command* sc = (const macho_segment_command*)lc;
- TRACE("(%p/%d, %p, %p) segment %s\n", fmap, fmap->fd, lc, user, debugstr_an(sc->segname, sizeof(sc->segname)));
+ TRACE("(%p/%d, %p, %p) segment %s\n", ifm, ifm->u.macho.fd, lc, user,
+ debugstr_an(sc->segname, sizeof(sc->segname)));
- fmap->num_sections += sc->nsects;
+ ifm->u.macho.num_sections += sc->nsects;
return 0;
}
@@ -520,8 +522,9 @@ static int macho_count_sections(struct macho_file_map* fmap, const struct load_c
* range covered by the segments of a Mach-O file and builds the
* section map. All commands are expected to be of LC_SEGMENT[_64] type.
*/
-static int macho_load_section_info(struct macho_file_map* fmap, const struct load_command* lc, void* user)
+static int macho_load_section_info(struct image_file_map* ifm, const struct load_command* lc, void* user)
{
+ struct macho_file_map* fmap = &ifm->u.macho;
const macho_segment_command* sc = (const macho_segment_command*)lc;
struct section_info* info = user;
BOOL ignore;
@@ -576,9 +579,9 @@ static int macho_load_section_info(struct macho_file_map* fmap, const struct loa
* Callback for macho_enum_load_commands. Records the UUID load
* command of a Mach-O file.
*/
-static int find_uuid(struct macho_file_map* fmap, const struct load_command* lc, void* user)
+static int find_uuid(struct image_file_map* ifm, const struct load_command* lc, void* user)
{
- fmap->uuid = (const struct uuid_command*)lc;
+ ifm->u.macho.uuid = (const struct uuid_command*)lc;
return 1;
}
@@ -700,7 +703,7 @@ static BOOL macho_map_file(struct process *pcs, const WCHAR *filenameW,
TRACE("... verified Mach header\n");
fmap->num_sections = 0;
- if (macho_enum_load_commands(fmap, target_cmd, macho_count_sections, NULL) < 0)
+ if (macho_enum_load_commands(ifm, target_cmd, macho_count_sections, NULL) < 0)
goto done;
TRACE("%d sections\n", fmap->num_sections);
@@ -713,7 +716,7 @@ static BOOL macho_map_file(struct process *pcs, const WCHAR *filenameW,
info.split_segs = split_segs;
info.section_index = 0;
- if (macho_enum_load_commands(fmap, target_cmd, macho_load_section_info, &info) < 0)
+ if (macho_enum_load_commands(ifm, target_cmd, macho_load_section_info, &info) < 0)
{
fmap->num_sections = 0;
goto done;
@@ -723,7 +726,7 @@ static BOOL macho_map_file(struct process *pcs, const WCHAR *filenameW,
TRACE("segs_start: 0x%08lx, segs_size: 0x%08lx\n", (unsigned long)fmap->segs_start,
(unsigned long)fmap->segs_size);
- if (macho_enum_load_commands(fmap, LC_UUID, find_uuid, NULL) < 0)
+ if (macho_enum_load_commands(ifm, LC_UUID, find_uuid, NULL) < 0)
goto done;
if (fmap->uuid)
{
@@ -857,9 +860,10 @@ static void macho_stabs_def_cb(struct module* module, unsigned long load_offset,
* Callback for macho_enum_load_commands. Processes the LC_SYMTAB
* load commands from the Mach-O file.
*/
-static int macho_parse_symtab(struct macho_file_map* fmap,
+static int macho_parse_symtab(struct image_file_map* ifm,
const struct load_command* lc, void* user)
{
+ struct macho_file_map* fmap = &ifm->u.macho;
const struct symtab_command* sc = (const struct symtab_command*)lc;
struct macho_debug_info* mdi = user;
const macho_nlist* stab;
@@ -1219,6 +1223,7 @@ BOOL macho_load_debug_info(struct process *pcs, struct module* module)
BOOL ret = FALSE;
struct macho_debug_info mdi;
int result;
+ struct image_file_map *ifm;
struct macho_file_map *fmap;
if (module->type != DMT_MACHO || !module->format_info[DFI_MACHO]->u.macho_info)
@@ -1227,7 +1232,8 @@ BOOL macho_load_debug_info(struct process *pcs, struct module* module)
return FALSE;
}
- fmap = &module->format_info[DFI_MACHO]->u.macho_info->file_map.u.macho;
+ ifm = &module->format_info[DFI_MACHO]->u.macho_info->file_map;
+ fmap = &ifm->u.macho;
TRACE("(%p, %p/%d)\n", module, fmap, fmap->fd);
@@ -1246,7 +1252,7 @@ BOOL macho_load_debug_info(struct process *pcs, struct module* module)
mdi.module = module;
pool_init(&mdi.pool, 65536);
hash_table_init(&mdi.pool, &mdi.ht_symtab, 256);
- result = macho_enum_load_commands(fmap, LC_SYMTAB, macho_parse_symtab, &mdi);
+ result = macho_enum_load_commands(ifm, LC_SYMTAB, macho_parse_symtab, &mdi);
if (result > 0)
ret = TRUE;
else if (result < 0)
@@ -1255,7 +1261,7 @@ BOOL macho_load_debug_info(struct process *pcs, struct module* module)
if (!(dbghelp_options & SYMOPT_PUBLICS_ONLY) && fmap->dsym)
{
mdi.fmap = &fmap->dsym->u.macho;
- result = macho_enum_load_commands(mdi.fmap, LC_SYMTAB, macho_parse_symtab, &mdi);
+ result = macho_enum_load_commands(fmap->dsym, LC_SYMTAB, macho_parse_symtab, &mdi);
if (result > 0)
ret = TRUE;
else if (result < 0)
--
2.7.4
June 14, 2018
[PATCH 2/6] dbghelp: Read the 32-bit Mach-O header.
by Zebediah Figura
It is identical to the 64-bit header, except for the "reserved" field.
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
dlls/dbghelp/image_private.h | 4 +---
dlls/dbghelp/macho_module.c | 2 +-
2 files changed, 2 insertions(+), 4 deletions(-)
diff --git a/dlls/dbghelp/image_private.h b/dlls/dbghelp/image_private.h
index b12cacb..60cdd35 100644
--- a/dlls/dbghelp/image_private.h
+++ b/dlls/dbghelp/image_private.h
@@ -46,10 +46,8 @@
#include <mach-o/loader.h>
#ifdef _WIN64
-typedef struct mach_header_64 macho_mach_header;
typedef struct section_64 macho_section;
#else
-typedef struct mach_header macho_mach_header;
typedef struct section macho_section;
#endif
#endif
@@ -96,7 +94,7 @@ struct image_file_map
struct image_file_map* dsym; /* the debug symbols file associated with this one */
#ifdef HAVE_MACH_O_LOADER_H
- macho_mach_header mach_header;
+ struct mach_header mach_header;
const struct load_command* load_commands;
const struct uuid_command* uuid;
diff --git a/dlls/dbghelp/macho_module.c b/dlls/dbghelp/macho_module.c
index ee35af5..679c203 100644
--- a/dlls/dbghelp/macho_module.c
+++ b/dlls/dbghelp/macho_module.c
@@ -1196,7 +1196,7 @@ static BOOL image_uses_split_segs(HANDLE process, unsigned long load_addr)
struct process *pcs = process_find_by_handle(process);
cpu_type_t target_cpu = (pcs->is_64bit) ? CPU_TYPE_X86_64 : CPU_TYPE_X86;
uint32_t target_magic = (pcs->is_64bit) ? MH_MAGIC_64 : MH_MAGIC;
- macho_mach_header header;
+ struct mach_header header;
if (ReadProcessMemory(process, (void*)load_addr, &header, sizeof(header), NULL) &&
header.magic == target_magic && header.cputype == target_cpu &&
--
2.7.4
June 14, 2018
[PATCH 1/6] dbghelp: Determine the target Mach-O architecture from the process's architecture.
by Zebediah Figura
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
dlls/dbghelp/dbghelp_private.h | 2 +-
dlls/dbghelp/macho_module.c | 66 +++++++++++++++++++++---------------------
dlls/dbghelp/module.c | 2 +-
3 files changed, 35 insertions(+), 35 deletions(-)
diff --git a/dlls/dbghelp/dbghelp_private.h b/dlls/dbghelp/dbghelp_private.h
index 935e766..0963f1e 100644
--- a/dlls/dbghelp/dbghelp_private.h
+++ b/dlls/dbghelp/dbghelp_private.h
@@ -591,7 +591,7 @@ extern int elf_is_in_thunk_area(unsigned long addr, const struct elf_th
/* macho_module.c */
extern BOOL macho_enum_modules(HANDLE hProc, enum_modules_cb, void*) DECLSPEC_HIDDEN;
extern BOOL macho_fetch_file_info(HANDLE process, const WCHAR* name, unsigned long load_addr, DWORD_PTR* base, DWORD* size, DWORD* checksum) DECLSPEC_HIDDEN;
-extern BOOL macho_load_debug_info(struct module* module) DECLSPEC_HIDDEN;
+extern BOOL macho_load_debug_info(struct process *pcs, struct module* module) DECLSPEC_HIDDEN;
extern struct module*
macho_load_module(struct process* pcs, const WCHAR* name, unsigned long) DECLSPEC_HIDDEN;
extern BOOL macho_read_wine_loader_dbg_info(struct process* pcs) DECLSPEC_HIDDEN;
diff --git a/dlls/dbghelp/macho_module.c b/dlls/dbghelp/macho_module.c
index 7c40801..ee35af5 100644
--- a/dlls/dbghelp/macho_module.c
+++ b/dlls/dbghelp/macho_module.c
@@ -91,17 +91,9 @@ WINE_DEFAULT_DEBUG_CHANNEL(dbghelp_macho);
#ifdef _WIN64
typedef struct segment_command_64 macho_segment_command;
typedef struct nlist_64 macho_nlist;
-
-#define TARGET_CPU_TYPE CPU_TYPE_X86_64
-#define TARGET_MH_MAGIC MH_MAGIC_64
-#define TARGET_SEGMENT_COMMAND LC_SEGMENT_64
#else
typedef struct segment_command macho_segment_command;
typedef struct nlist macho_nlist;
-
-#define TARGET_CPU_TYPE CPU_TYPE_X86
-#define TARGET_MH_MAGIC MH_MAGIC
-#define TARGET_SEGMENT_COMMAND LC_SEGMENT
#endif
@@ -610,7 +602,8 @@ static inline void reset_file_map(struct image_file_map* ifm)
*
* Maps a Mach-O file into memory (and checks it's a real Mach-O file)
*/
-static BOOL macho_map_file(const WCHAR* filenameW, BOOL split_segs, struct image_file_map* ifm)
+static BOOL macho_map_file(struct process *pcs, const WCHAR *filenameW,
+ BOOL split_segs, struct image_file_map* ifm)
{
struct macho_file_map* fmap = &ifm->u.macho;
struct fat_header fat_header;
@@ -620,17 +613,16 @@ static BOOL macho_map_file(const WCHAR* filenameW, BOOL split_segs, struct image
unsigned len;
struct section_info info;
BOOL ret = FALSE;
+ cpu_type_t target_cpu = (pcs->is_64bit) ? CPU_TYPE_X86_64 : CPU_TYPE_X86;
+ uint32_t target_magic = (pcs->is_64bit) ? MH_MAGIC_64 : MH_MAGIC;
+ uint32_t target_cmd = (pcs->is_64bit) ? LC_SEGMENT_64 : LC_SEGMENT;
TRACE("(%s, %p)\n", debugstr_w(filenameW), fmap);
reset_file_map(ifm);
ifm->modtype = DMT_MACHO;
-#ifdef _WIN64
- ifm->addr_size = 64;
-#else
- ifm->addr_size = 32;
-#endif
+ ifm->addr_size = (pcs->is_64bit) ? 64 : 32;
len = WideCharToMultiByte(CP_UNIXCP, 0, filenameW, -1, NULL, 0, NULL, NULL);
if (!(filename = HeapAlloc(GetProcessHeap(), 0, len)))
@@ -670,14 +662,14 @@ static BOOL macho_map_file(const WCHAR* filenameW, BOOL split_segs, struct image
struct fat_arch fat_arch;
if (read(fmap->fd, &fat_arch, sizeof(fat_arch)) != sizeof(fat_arch))
goto done;
- if (swap_ulong_be_to_host(fat_arch.cputype) == TARGET_CPU_TYPE)
+ if (swap_ulong_be_to_host(fat_arch.cputype) == target_cpu)
{
fmap->arch_offset = swap_ulong_be_to_host(fat_arch.offset);
break;
}
}
if (i >= narch) goto done;
- TRACE("... found target arch (%d)\n", TARGET_CPU_TYPE);
+ TRACE("... found target arch (%d)\n", target_cpu);
}
else
{
@@ -691,8 +683,8 @@ static BOOL macho_map_file(const WCHAR* filenameW, BOOL split_segs, struct image
goto done;
TRACE("... got possible Mach header\n");
/* and check for a Mach-O header */
- if (fmap->mach_header.magic != TARGET_MH_MAGIC ||
- fmap->mach_header.cputype != TARGET_CPU_TYPE) goto done;
+ if (fmap->mach_header.magic != target_magic ||
+ fmap->mach_header.cputype != target_cpu) goto done;
/* Make sure the file type is one of the ones we expect. */
switch (fmap->mach_header.filetype)
{
@@ -708,7 +700,7 @@ static BOOL macho_map_file(const WCHAR* filenameW, BOOL split_segs, struct image
TRACE("... verified Mach header\n");
fmap->num_sections = 0;
- if (macho_enum_load_commands(fmap, TARGET_SEGMENT_COMMAND, macho_count_sections, NULL) < 0)
+ if (macho_enum_load_commands(fmap, target_cmd, macho_count_sections, NULL) < 0)
goto done;
TRACE("%d sections\n", fmap->num_sections);
@@ -721,7 +713,7 @@ static BOOL macho_map_file(const WCHAR* filenameW, BOOL split_segs, struct image
info.split_segs = split_segs;
info.section_index = 0;
- if (macho_enum_load_commands(fmap, TARGET_SEGMENT_COMMAND, macho_load_section_info, &info) < 0)
+ if (macho_enum_load_commands(fmap, target_cmd, macho_load_section_info, &info) < 0)
{
fmap->num_sections = 0;
goto done;
@@ -1072,11 +1064,11 @@ static void macho_finish_stabs(struct module* module, struct hash_table* ht_symt
* TRUE. If it can't be mapped or its UUID doesn't match, return
* FALSE.
*/
-static BOOL try_dsym(const WCHAR* path, struct macho_file_map* fmap)
+static BOOL try_dsym(struct process *pcs, const WCHAR* path, struct macho_file_map* fmap)
{
struct image_file_map dsym_ifm;
- if (macho_map_file(path, FALSE, &dsym_ifm))
+ if (macho_map_file(pcs, path, FALSE, &dsym_ifm))
{
char uuid_string[UUID_STRING_LEN];
@@ -1110,7 +1102,7 @@ static BOOL try_dsym(const WCHAR* path, struct macho_file_map* fmap)
* "dsymutil --flat". Finally, use Spotlight to search for a
* .dSYM bundle with the same UUID as the module file.
*/
-static void find_and_map_dsym(struct module* module)
+static void find_and_map_dsym(struct process *pcs, struct module* module)
{
static const WCHAR dot_dsym[] = {'.','d','S','Y','M',0};
static const WCHAR dsym_subpath[] = {'/','C','o','n','t','e','n','t','s','/','R','e','s','o','u','r','c','e','s','/','D','W','A','R','F','/',0};
@@ -1142,12 +1134,12 @@ static void find_and_map_dsym(struct module* module)
strcatW(path, dsym_subpath);
strcatW(path, p);
- if (try_dsym(path, fmap))
+ if (try_dsym(pcs, path, fmap))
goto found;
strcpyW(path + strlenW(module->module.LoadedImageName), dot_dwarf);
- if (try_dsym(path, fmap))
+ if (try_dsym(pcs, path, fmap))
goto found;
format_uuid(fmap->uuid->uuid, uuid_string);
@@ -1175,7 +1167,7 @@ static void find_and_map_dsym(struct module* module)
strcatW(path, p);
CFRelease(item_path);
- if (try_dsym(path, fmap))
+ if (try_dsym(pcs, path, fmap))
goto found;
}
}
@@ -1201,9 +1193,13 @@ static BOOL image_uses_split_segs(HANDLE process, unsigned long load_addr)
if (process && load_addr)
{
+ struct process *pcs = process_find_by_handle(process);
+ cpu_type_t target_cpu = (pcs->is_64bit) ? CPU_TYPE_X86_64 : CPU_TYPE_X86;
+ uint32_t target_magic = (pcs->is_64bit) ? MH_MAGIC_64 : MH_MAGIC;
macho_mach_header header;
+
if (ReadProcessMemory(process, (void*)load_addr, &header, sizeof(header), NULL) &&
- header.magic == TARGET_MH_MAGIC && header.cputype == TARGET_CPU_TYPE &&
+ header.magic == target_magic && header.cputype == target_cpu &&
header.flags & MACHO_DYLD_IN_SHARED_CACHE)
{
split_segs = TRUE;
@@ -1218,7 +1214,7 @@ static BOOL image_uses_split_segs(HANDLE process, unsigned long load_addr)
*
* Loads Mach-O debugging information from the module image file.
*/
-BOOL macho_load_debug_info(struct module* module)
+BOOL macho_load_debug_info(struct process *pcs, struct module* module)
{
BOOL ret = FALSE;
struct macho_debug_info mdi;
@@ -1239,7 +1235,7 @@ BOOL macho_load_debug_info(struct module* module)
if (!(dbghelp_options & SYMOPT_PUBLICS_ONLY))
{
- find_and_map_dsym(module);
+ find_and_map_dsym(pcs, module);
if (dwarf2_parse(module, module->reloc_delta, NULL /* FIXME: some thunks to deal with ? */,
&module->format_info[DFI_MACHO]->u.macho_info->file_map))
@@ -1281,12 +1277,16 @@ BOOL macho_fetch_file_info(HANDLE process, const WCHAR* name, unsigned long load
DWORD* size, DWORD* checksum)
{
struct image_file_map fmap;
+ struct process *pcs;
BOOL split_segs;
TRACE("(%s, %p, %p, %p)\n", debugstr_w(name), base, size, checksum);
+ pcs = process_find_by_handle(process);
+ if (!pcs) return FALSE;
+
split_segs = image_uses_split_segs(process, load_addr);
- if (!macho_map_file(name, split_segs, &fmap)) return FALSE;
+ if (!macho_map_file(pcs, name, split_segs, &fmap)) return FALSE;
if (base) *base = fmap.u.macho.segs_start;
*size = fmap.u.macho.segs_size;
*checksum = calc_crc32(fmap.u.macho.fd);
@@ -1375,7 +1375,7 @@ static BOOL macho_load_file(struct process* pcs, const WCHAR* filename,
load_addr, macho_info, macho_info->flags);
split_segs = image_uses_split_segs(pcs->handle, load_addr);
- if (!macho_map_file(filename, split_segs, &fmap)) return FALSE;
+ if (!macho_map_file(pcs, filename, split_segs, &fmap)) return FALSE;
/* Find the dynamic loader's table of images loaded into the process.
*/
@@ -1415,7 +1415,7 @@ static BOOL macho_load_file(struct process* pcs, const WCHAR* filename,
reset_file_map(&fmap);
if (dbghelp_options & SYMOPT_DEFERRED_LOADS)
macho_info->module->module.SymType = SymDeferred;
- else if (!macho_load_debug_info(macho_info->module))
+ else if (!macho_load_debug_info(pcs, macho_info->module))
ret = FALSE;
macho_info->module->format_info[DFI_MACHO]->u.macho_info->in_use = 1;
@@ -1930,7 +1930,7 @@ struct module* macho_load_module(struct process* pcs, const WCHAR* name, unsign
return NULL;
}
-BOOL macho_load_debug_info(struct module* module)
+BOOL macho_load_debug_info(struct process *pcs, struct module* module)
{
return FALSE;
}
diff --git a/dlls/dbghelp/module.c b/dlls/dbghelp/module.c
index 3659873..040bf9b 100644
--- a/dlls/dbghelp/module.c
+++ b/dlls/dbghelp/module.c
@@ -397,7 +397,7 @@ BOOL module_get_debug(struct module_pair* pair)
&idslW64);
break;
case DMT_MACHO:
- ret = macho_load_debug_info(pair->effective);
+ ret = macho_load_debug_info(pair->pcs, pair->effective);
break;
default:
ret = FALSE;
--
2.7.4
June 14, 2018
wine-3.0.2-rc2 Available
by Michael Stefaniuc
Hello guys,
I have pushed wine-3.0.2-rc2 (with tag) to
https://github.com/mstefani/wine-stable/tree/stable
http://static-winehq.193b.starter-ca-central-1.openshiftapps.com/stable/
Changes since rc1:
- Dropped "user32/static: Use correct brush color for centered image
background." due to dependencies that are not Stable material.
bye
michael
June 14, 2018
Re: [PATCH v4 1/5] ntdll: Return BIOS info from NtQuerySystemInformation on Linux
by Alex Henrie
On Thu, Jun 14, 2018 at 7:52 AM Huw Davies <huw(a)codeweavers.com> wrote:
>
> On Thu, Jun 14, 2018 at 07:26:54AM -0600, Alex Henrie wrote:
> > On Thu, Jun 14, 2018 at 2:07 AM Huw Davies <huw(a)codeweavers.com> wrote:
> > >
> > > On Wed, Jun 13, 2018 at 09:41:15PM -0600, Alex Henrie wrote:
> > > > Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
> > > > ---
> > > > dlls/ntdll/nt.c | 169 ++++++++++++++++++++++++++++++++++++++++++++++++
> > > > 1 file changed, 169 insertions(+)
> > > >
> > > > diff --git a/dlls/ntdll/nt.c b/dlls/ntdll/nt.c
> > > > index dc0ce04f42..72ae381813 100644
> > > > --- a/dlls/ntdll/nt.c
> > > > +++ b/dlls/ntdll/nt.c
> > > > @@ -66,6 +66,50 @@
> > > >
> > > > WINE_DEFAULT_DEBUG_CHANNEL(ntdll);
> > > >
> > > > +#include "pshpack1.h"
> > > > +
> > > > +typedef enum _SYSTEM_FIRMWARE_TABLE_ACTION
> > > > +{
> > > > + SystemFirmwareTable_Enumerate = 0,
> > > > + SystemFirmwareTable_Get = 1
> > > > +} SYSTEM_FIRMWARE_TABLE_ACTION;
> > > > +
> > > > +typedef struct _SYSTEM_FIRMWARE_TABLE_INFORMATION
> > > > +{
> > > > + ULONG ProviderSignature;
> > > > + SYSTEM_FIRMWARE_TABLE_ACTION Action;
> > > > + ULONG TableID;
> > > > + ULONG TableBufferLength;
> > > > + UCHAR TableBuffer[1];
> > > > +} SYSTEM_FIRMWARE_TABLE_INFORMATION;
> > >
> > > These two at least should be in winternl.h
> >
> > Are you sure? They're not in the native winternl.h.
>
> I thought we had other 'struct SYSTEM_' definitions in there that
> aren't in the native SDK.
Here are the SYSTEM structs I found in Wine's winternl.h but not in
the Windows SDK:
SYSTEM_CACHE_INFORMATION
SYSTEM_CONFIGURATION_INFO
SYSTEM_CPU_INFORMATION
SYSTEM_DRIVER_INFORMATION
SYSTEM_HANDLE_ENTRY
SYSTEM_HANDLE_INFORMATION
SYSTEM_KERNEL_DEBUGGER_INFORMATION
SYSTEM_MODULE
SYSTEM_MODULE_INFORMATION
SYSTEM_TIME_ADJUSTMENT
This suggests that we're not worrying about Winelib-compiled programs
including winternl.h and then defining those structs on their own
(which would cause a redefinition error during compilation). If that's
really not something to be concerned about then sure, I can throw
SYSTEM_FIRMWARE_TABLE_ACTION and SYSTEM_FIRMWARE_TABLE_INFORMATION
into winternl.h too.
> > > Also, some tests would be nice, both for the ntdll (free feel to just
> > > tidy up mine) and kernel32 functions.
> >
> > Your test just checks that
> > NtQuerySystemInformation(SystemFirmwareTableInformation, ...) returns
> > STATUS_SUCCESS, which doesn't seem very useful. The returned data
> > itself is dependent on the BIOS and could be very different on
> > different computers.
>
> Well it must be useful because you claimed it returned
> STATUS_NOT_IMPLEMENTED before I wrote it ;-) You obviously can't test
> the data, but testing the lengths (i.e. the returned length and buffer
> length) is also interesting.
>
> In principle the kernel32 tests could compare the data returned from a
> call to the ntdll function with the data returned from the kernel32
> function.
OK, that sounds reasonable.
-Alex
June 14, 2018
[PATCH] winecfg: Temporary advertise our network capabilities
by André Hentschel
Signed-off-by: André Hentschel <nerv(a)dawncrow.de>
---
For our next release...
If not this patch, can we PLEASE do something similar?
programs/winecfg/about.c | 28 ++++++++++++++++++++++++++--
programs/winecfg/resource.h | 1 +
programs/winecfg/winecfg.rc | 3 ++-
3 files changed, 29 insertions(+), 3 deletions(-)
diff --git a/programs/winecfg/about.c b/programs/winecfg/about.c
index a2b4022..bddcf98 100644
--- a/programs/winecfg/about.c
+++ b/programs/winecfg/about.c
@@ -36,6 +36,8 @@
static HICON logo = NULL;
static HFONT titleFont = NULL;
+static HFONT descFont = NULL;
+static HFONT versFont = NULL;
INT_PTR CALLBACK
AboutDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
@@ -118,7 +120,28 @@ AboutDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
SendMessageW(hWnd, WM_SETFONT, (WPARAM)titleFont, TRUE);
SetWindowTextA(hWnd, PACKAGE_NAME);
}
- SetDlgItemTextA(hDlg, IDC_ABT_PANEL_TEXT, PACKAGE_VERSION);
+ /* prepare the title description */
+ hWnd = GetDlgItem(hDlg, IDC_ABT_TITLE_DESC);
+ if(hWnd)
+ {
+ static const WCHAR tahomaW[] = {'T','a','h','o','m','a',0};
+ descFont = CreateFontW(
+ -MulDiv(18, GetDeviceCaps(hDC, LOGPIXELSY), 72),
+ 0, 0, 0, 0, FALSE, 0, 0, 0, 0, 0, 0, 0, tahomaW);
+ SendMessageW(hWnd, WM_SETFONT, (WPARAM)descFont, TRUE);
+ SetWindowTextA(hWnd, "for Workgroups");
+ }
+ /* prepare the version */
+ hWnd = GetDlgItem(hDlg, IDC_ABT_PANEL_TEXT);
+ if(hWnd)
+ {
+ static const WCHAR tahomaW[] = {'T','a','h','o','m','a',0};
+ versFont = CreateFontW(
+ -MulDiv(8, GetDeviceCaps(hDC, LOGPIXELSY), 72),
+ 0, 0, 0, 0, FALSE, 0, 0, 0, 0, 0, 0, 0, tahomaW);
+ SendMessageW(hWnd, WM_SETFONT, (WPARAM)versFont, TRUE);
+ SetWindowTextA(hWnd, "Version " PACKAGE_VERSION);
+ }
/* prepare the web link */
SetDlgItemTextA(hDlg, IDC_ABT_WEB_LINK, "<a href=\"" PACKAGE_URL "\">" PACKAGE_URL "</a>");
@@ -166,9 +189,10 @@ AboutDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
switch(GetDlgCtrlID((HWND)lParam))
{
case IDC_ABT_TITLE_TEXT:
+ case IDC_ABT_TITLE_DESC:
+ case IDC_ABT_PANEL_TEXT:
/* set the title to a wine color */
SetTextColor((HDC)wParam, 0x0000007F);
- case IDC_ABT_PANEL_TEXT:
case IDC_ABT_LICENSE_TEXT:
case IDC_ABT_WEB_LINK:
SetBkColor((HDC)wParam, GetSysColor(COLOR_WINDOW));
diff --git a/programs/winecfg/resource.h b/programs/winecfg/resource.h
index 0c0b038..673c21c 100644
--- a/programs/winecfg/resource.h
+++ b/programs/winecfg/resource.h
@@ -218,3 +218,4 @@
#define IDC_ABT_TITLE_TEXT 8436
#define IDC_ABT_WEB_LINK 8437
#define IDC_ABT_LICENSE_TEXT 8438
+#define IDC_ABT_TITLE_DESC 8439
diff --git a/programs/winecfg/winecfg.rc b/programs/winecfg/winecfg.rc
index 5908b49..0c26761 100644
--- a/programs/winecfg/winecfg.rc
+++ b/programs/winecfg/winecfg.rc
@@ -134,7 +134,8 @@ STYLE WS_CHILD
FONT 8, "MS Shell Dlg"
BEGIN
CONTROL "", IDC_ABT_PANEL, "STATIC", SS_OWNERDRAW, 0, 0, 260, 140
- LTEXT "",IDC_ABT_TITLE_TEXT,105,30,55,30
+ LTEXT "",IDC_ABT_TITLE_TEXT,155,0,55,22
+ LTEXT "",IDC_ABT_TITLE_DESC,123,22,123,20
LTEXT "",IDC_ABT_PANEL_TEXT,160,43,140,8
CONTROL "",IDC_ABT_WEB_LINK,"SysLink", LWS_TRANSPARENT, 105,53,106,8
LTEXT "This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version.",
--
2.7.4
June 14, 2018
Re: [PATCH 6/6] dxgi: Get supported feature levels from wined3d caps.
by Henri Verbeet
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
June 14, 2018
Re: [PATCH 5/6] wined3d: Expose feature level in wined3d caps.
by Henri Verbeet
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
June 14, 2018
Re: [PATCH 4/6] wined3d: Store feature level in d3d_info.
by Henri Verbeet
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
June 14, 2018
Re: [PATCH 3/6] wined3d: Remove "Reserved" fields from wined3d_caps.
by Henri Verbeet
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
June 14, 2018
Re: [PATCH 1/6] d3d11: Normalize 1D texture view descriptions.
by Henri Verbeet
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
June 14, 2018
Re: [PATCH 2/6] wined3d: Get rid of WINED3DCAPS typedef.
by Henri Verbeet
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
June 14, 2018
Re: [PATCH v2 5/5] wined3d: Set stream stride and offset even when buffer is NULL.
by Henri Verbeet
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
June 14, 2018
Re: [PATCH 1/5] wined3d: Generate shader epilogue before conditional returns.
by Henri Verbeet
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
June 14, 2018
[PATCH] msi: Add package minor/major upgrade tests
by Piotr Caban
Signed-off-by: Piotr Caban <piotr(a)codeweavers.com>
---
dlls/msi/tests/package.c | 78
++++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 76 insertions(+), 2 deletions(-)
June 14, 2018
[PATCH] mshtml: Added IHTMLWindow7::performance property implementation.
by Jacek Caban
Signed-off-by: Jacek Caban <jacek(a)codeweavers.com>
---
dlls/mshtml/htmlwindow.c | 35 +++++++--
dlls/mshtml/mshtml_private.h | 5 ++
dlls/mshtml/omnavigator.c | 164
+++++++++++++++++++++++++++++++++++++++++++
dlls/mshtml/tests/dom.c | 13 +++-
4 files changed, 210 insertions(+), 7 deletions(-)
June 14, 2018
Re: [PATCH 5/5] comctl32/taskdialog: Add support for progress bar.
by Zhiyi Zhang
On Thu 6 14 21:03, Nikolay Sivov wrote:
> On 06/14/2018 11:02 AM, Zhiyi Zhang wrote:
>
>> Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
>> ---
>> dlls/comctl32/taskdialog.c | 45 ++++++++++++++++++++++
>> dlls/comctl32/tests/taskdialog.c | 65 ++++++++++++++++++++++++++++++++
>> 2 files changed, 110 insertions(+)
>>
>> diff --git a/dlls/comctl32/taskdialog.c b/dlls/comctl32/taskdialog.c
>> index 91c8af019b..3c198df6d1 100644
>> --- a/dlls/comctl32/taskdialog.c
>> +++ b/dlls/comctl32/taskdialog.c
>> @@ -57,6 +57,7 @@ struct taskdialog_info
>> HWND main_icon;
>> HWND main_instruction;
>> HWND content;
>> + HWND progress_bar;
>> HWND *buttons;
>> INT button_count;
>> HWND default_button;
>> @@ -351,6 +352,17 @@ static void taskdialog_add_content(struct taskdialog_info *dialog_info)
>> taskdialog_hyperlink_enabled(dialog_info));
>> }
>> +static void taskdialog_add_progress_bar(struct taskdialog_info *dialog_info)
>> +{
>> + const TASKDIALOGCONFIG *taskconfig = dialog_info->taskconfig;
>> + DWORD style = PBS_SMOOTH | PBS_SMOOTHREVERSE | WS_CHILD | WS_VISIBLE;
>> +
>> + if (!(taskconfig->dwFlags & (TDF_SHOW_PROGRESS_BAR | TDF_SHOW_MARQUEE_PROGRESS_BAR))) return;
>> + if (taskconfig->dwFlags & TDF_SHOW_MARQUEE_PROGRESS_BAR) style |= PBS_MARQUEE;
>> + dialog_info->progress_bar =
>> + CreateWindowW(PROGRESS_CLASSW, NULL, style, 0, 0, 0, 0, dialog_info->hwnd, NULL, 0, NULL);
>> +}
>> +
>> static void taskdialog_add_button(struct taskdialog_info *dialog_info, HWND *button, INT id, const WCHAR *text,
>> BOOL custom_button)
>> {
>> @@ -464,6 +476,17 @@ static void taskdialog_layout(struct taskdialog_info *dialog_info)
>> /* Content */
>> taskdialog_label_layout(dialog_info, dialog_info->content, main_icon_right, dialog_width, &dialog_height, syslink);
>> + /* Progress bar */
>> + if (dialog_info->progress_bar)
>> + {
>> + x = main_icon_right + h_spacing;
>> + y = dialog_height + v_spacing;
>> + size.cx = dialog_width - x - h_spacing;
>> + size.cy = GetSystemMetrics(SM_CYVSCROLL);
>> + SetWindowPos(dialog_info->progress_bar, 0, x, y, size.cx, size.cy, SWP_NOZORDER);
>> + dialog_height = y + size.cy;
>> + }
>> +
>> dialog_height = max(dialog_height, main_icon_bottom);
>> /* Common and custom buttons */
>> @@ -598,6 +621,7 @@ static void taskdialog_init(struct taskdialog_info *dialog_info, HWND hwnd)
>> taskdialog_add_main_icon(dialog_info);
>> taskdialog_add_main_instruction(dialog_info);
>> taskdialog_add_content(dialog_info);
>> + taskdialog_add_progress_bar(dialog_info);
>> taskdialog_add_buttons(dialog_info);
>> /* Set default button */
>> @@ -621,6 +645,7 @@ static INT_PTR CALLBACK taskdialog_proc(HWND hwnd, UINT msg, WPARAM wParam, LPAR
>> {
>> static const WCHAR taskdialog_info_propnameW[] = {'T','a','s','k','D','i','a','l','o','g','I','n','f','o',0};
>> struct taskdialog_info *dialog_info;
>> + LRESULT result;
>> TRACE("hwnd=%p msg=0x%04x wparam=%lx lparam=%lx\n", hwnd, msg, wParam, lParam);
>> @@ -635,6 +660,26 @@ static INT_PTR CALLBACK taskdialog_proc(HWND hwnd, UINT msg, WPARAM wParam, LPAR
>> case TDM_ENABLE_BUTTON:
>> taskdialog_enable_button(dialog_info, wParam, lParam);
>> break;
>> + case TDM_SET_MARQUEE_PROGRESS_BAR:
>> + SendMessageW(dialog_info->progress_bar, PBM_SETMARQUEE, wParam, 0);
>> + break;
>
> This appears to be wrong, it shouldn't just start/stop animation, but switch from marquee to regular mode and back, in our case flipping styles.
>
Thanks. In the end, turns out I still got it confused with TDM_SET_PROGRESS_BAR_MARQUEE, even though I noticed the easy confusion from the start :(
I sent a v2.
>>
>> + case TDM_SET_PROGRESS_BAR_POS:
>> + result = 0;
>> + if (!(dialog_info->taskconfig->dwFlags & TDF_SHOW_MARQUEE_PROGRESS_BAR))
>> + result = SendMessageW(dialog_info->progress_bar, PBM_SETPOS, wParam, 0);
>> + SetWindowLongPtrW(hwnd, DWLP_MSGRESULT, result);
>> + break;
>
> Did you verify that Progress control handles this correctly, maybe flags check is not necessary?
>
>> + case TDM_SET_PROGRESS_BAR_MARQUEE:
>> + SendMessageW(dialog_info->progress_bar, PBM_SETMARQUEE, wParam, lParam);
>> + break;
>> case WM_INITDIALOG:
>> dialog_info = (struct taskdialog_info *)lParam;
>> diff --git a/dlls/comctl32/tests/taskdialog.c b/dlls/comctl32/tests/taskdialog.c
>> index cca700cd18..10cd3da794 100644
>> --- a/dlls/comctl32/tests/taskdialog.c
>> +++ b/dlls/comctl32/tests/taskdialog.c
>> @@ -373,6 +373,70 @@ static void test_timer(void)
>> pTaskDialogIndirect(&info, NULL, NULL, NULL);
>> }
>> +static HRESULT CALLBACK taskdialog_callback_proc_progress_bar(HWND hwnd, UINT notification, WPARAM wParam,
>> + LPARAM lParam, LONG_PTR ref_data)
>> +{
>> + unsigned long ret;
>> + DWORD *flags = (DWORD *)ref_data;
> You can pass flags by value.
>
>
Sure.
June 14, 2018
[PATCH v2 5/5] comctl32/taskdialog: Add support for progress bar.
by Zhiyi Zhang
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
---
dlls/comctl32/taskdialog.c | 55 ++++++++++++++++++++++++++
dlls/comctl32/tests/taskdialog.c | 67 ++++++++++++++++++++++++++++++++
2 files changed, 122 insertions(+)
diff --git a/dlls/comctl32/taskdialog.c b/dlls/comctl32/taskdialog.c
index c1299cd7bb..42fee878b6 100644
--- a/dlls/comctl32/taskdialog.c
+++ b/dlls/comctl32/taskdialog.c
@@ -57,6 +57,7 @@ struct taskdialog_info
HWND main_icon;
HWND main_instruction;
HWND content;
+ HWND progress_bar;
HWND *buttons;
INT button_count;
HWND default_button;
@@ -351,6 +352,17 @@ static void taskdialog_add_content(struct taskdialog_info *dialog_info)
taskdialog_hyperlink_enabled(dialog_info));
}
+static void taskdialog_add_progress_bar(struct taskdialog_info *dialog_info)
+{
+ const TASKDIALOGCONFIG *taskconfig = dialog_info->taskconfig;
+ DWORD style = PBS_SMOOTH | PBS_SMOOTHREVERSE | WS_CHILD | WS_VISIBLE;
+
+ if (!(taskconfig->dwFlags & (TDF_SHOW_PROGRESS_BAR | TDF_SHOW_MARQUEE_PROGRESS_BAR))) return;
+ if (taskconfig->dwFlags & TDF_SHOW_MARQUEE_PROGRESS_BAR) style |= PBS_MARQUEE;
+ dialog_info->progress_bar =
+ CreateWindowW(PROGRESS_CLASSW, NULL, style, 0, 0, 0, 0, dialog_info->hwnd, NULL, 0, NULL);
+}
+
static void taskdialog_add_button(struct taskdialog_info *dialog_info, HWND *button, INT id, const WCHAR *text,
BOOL custom_button)
{
@@ -464,6 +476,17 @@ static void taskdialog_layout(struct taskdialog_info *dialog_info)
/* Content */
taskdialog_label_layout(dialog_info, dialog_info->content, main_icon_right, dialog_width, &dialog_height, syslink);
+ /* Progress bar */
+ if (dialog_info->progress_bar)
+ {
+ x = main_icon_right + h_spacing;
+ y = dialog_height + v_spacing;
+ size.cx = dialog_width - x - h_spacing;
+ size.cy = GetSystemMetrics(SM_CYVSCROLL);
+ SetWindowPos(dialog_info->progress_bar, 0, x, y, size.cx, size.cy, SWP_NOZORDER);
+ dialog_height = y + size.cy;
+ }
+
dialog_height = max(dialog_height, main_icon_bottom);
/* Common and custom buttons */
@@ -597,6 +620,7 @@ static void taskdialog_init(struct taskdialog_info *dialog_info, HWND hwnd)
taskdialog_add_main_icon(dialog_info);
taskdialog_add_main_instruction(dialog_info);
taskdialog_add_content(dialog_info);
+ taskdialog_add_progress_bar(dialog_info);
taskdialog_add_buttons(dialog_info);
/* Set default button */
@@ -620,6 +644,7 @@ static INT_PTR CALLBACK taskdialog_proc(HWND hwnd, UINT msg, WPARAM wParam, LPAR
{
static const WCHAR taskdialog_info_propnameW[] = {'T','a','s','k','D','i','a','l','o','g','I','n','f','o',0};
struct taskdialog_info *dialog_info;
+ LRESULT result;
TRACE("hwnd=%p msg=0x%04x wparam=%lx lparam=%lx\n", hwnd, msg, wParam, lParam);
@@ -634,6 +659,36 @@ static INT_PTR CALLBACK taskdialog_proc(HWND hwnd, UINT msg, WPARAM wParam, LPAR
case TDM_ENABLE_BUTTON:
taskdialog_enable_button(dialog_info, wParam, lParam);
break;
+ case TDM_SET_MARQUEE_PROGRESS_BAR:
+ {
+ BOOL marquee = wParam;
+ LONG style;
+ if(!dialog_info->progress_bar) break;
+ style = GetWindowLongW(dialog_info->progress_bar, GWL_STYLE);
+ style = marquee ? style | PBS_MARQUEE : style & (~PBS_MARQUEE);
+ SetWindowLongW(dialog_info->progress_bar, GWL_STYLE, style);
+ break;
+ }
+ case TDM_SET_PROGRESS_BAR_STATE:
+ result = SendMessageW(dialog_info->progress_bar, PBM_SETSTATE, wParam, 0);
+ SetWindowLongPtrW(hwnd, DWLP_MSGRESULT, result);
+ break;
+ case TDM_SET_PROGRESS_BAR_RANGE:
+ result = SendMessageW(dialog_info->progress_bar, PBM_SETRANGE, 0, lParam);
+ SetWindowLongPtrW(hwnd, DWLP_MSGRESULT, result);
+ break;
+ case TDM_SET_PROGRESS_BAR_POS:
+ result = 0;
+ if (dialog_info->progress_bar)
+ {
+ LONG style = GetWindowLongW(dialog_info->progress_bar, GWL_STYLE);
+ if (!(style & PBS_MARQUEE)) result = SendMessageW(dialog_info->progress_bar, PBM_SETPOS, wParam, 0);
+ }
+ SetWindowLongPtrW(hwnd, DWLP_MSGRESULT, result);
+ break;
+ case TDM_SET_PROGRESS_BAR_MARQUEE:
+ SendMessageW(dialog_info->progress_bar, PBM_SETMARQUEE, wParam, lParam);
+ break;
case WM_INITDIALOG:
dialog_info = (struct taskdialog_info *)lParam;
diff --git a/dlls/comctl32/tests/taskdialog.c b/dlls/comctl32/tests/taskdialog.c
index cca700cd18..e91a878876 100644
--- a/dlls/comctl32/tests/taskdialog.c
+++ b/dlls/comctl32/tests/taskdialog.c
@@ -373,6 +373,72 @@ static void test_timer(void)
pTaskDialogIndirect(&info, NULL, NULL, NULL);
}
+static HRESULT CALLBACK taskdialog_callback_proc_progress_bar(HWND hwnd, UINT notification, WPARAM wParam,
+ LPARAM lParam, LONG_PTR ref_data)
+{
+ unsigned long ret;
+ LONG flags = (LONG)ref_data;
+ if (notification == TDN_CREATED)
+ {
+ /* TDM_SET_PROGRESS_BAR_STATE */
+ ret = SendMessageW(hwnd, TDM_SET_PROGRESS_BAR_STATE, PBST_NORMAL, 0);
+ ok(ret == PBST_NORMAL, "Expect state: %d got state: %lx\n", PBST_NORMAL, ret);
+ ret = SendMessageW(hwnd, TDM_SET_PROGRESS_BAR_STATE, PBST_PAUSED, 0);
+ ok(ret == PBST_NORMAL, "Expect state: %d got state: %lx\n", PBST_NORMAL, ret);
+ ret = SendMessageW(hwnd, TDM_SET_PROGRESS_BAR_STATE, PBST_ERROR, 0);
+ /* Progress bar has fixme on handling PBM_SETSTATE message */
+ todo_wine ok(ret == PBST_PAUSED, "Expect state: %d got state: %lx\n", PBST_PAUSED, ret);
+ ret = SendMessageW(hwnd, TDM_SET_PROGRESS_BAR_STATE, PBST_NORMAL, 0);
+ todo_wine ok(ret == PBST_ERROR, "Expect state: %d got state: %lx\n", PBST_ERROR, ret);
+
+ /* TDM_SET_PROGRESS_BAR_RANGE */
+ ret = SendMessageW(hwnd, TDM_SET_PROGRESS_BAR_RANGE, 0, MAKELPARAM(0, 200));
+ ok(ret == MAKELONG(0, 100), "Expect range:%x got:%lx\n", MAKELONG(0, 100), ret);
+ ret = SendMessageW(hwnd, TDM_SET_PROGRESS_BAR_RANGE, 0, MAKELPARAM(0, 200));
+ ok(ret == MAKELONG(0, 200), "Expect range:%x got:%lx\n", MAKELONG(0, 200), ret);
+
+ /* TDM_SET_PROGRESS_BAR_POS */
+ if (flags & TDF_SHOW_MARQUEE_PROGRESS_BAR)
+ {
+ ret = SendMessageW(hwnd, TDM_SET_PROGRESS_BAR_POS, 1, 0);
+ ok(ret == 0, "Expect position:%x got:%lx\n", 0, ret);
+ ret = SendMessageW(hwnd, TDM_SET_PROGRESS_BAR_POS, 2, 0);
+ ok(ret == 0, "Expect position:%x got:%lx\n", 0, ret);
+ }
+ else
+ {
+ ret = SendMessageW(hwnd, TDM_SET_PROGRESS_BAR_POS, 1, 0);
+ ok(ret == 0, "Expect position:%x got:%lx\n", 0, ret);
+ ret = SendMessageW(hwnd, TDM_SET_PROGRESS_BAR_POS, 2, 0);
+ ok(ret == 1, "Expect position:%x got:%lx\n", 1, ret);
+ }
+
+ SendMessageW(hwnd, TDM_CLICK_BUTTON, IDOK, 0);
+ }
+
+ return S_OK;
+}
+
+static void test_progress_bar(void)
+{
+ TASKDIALOGCONFIG info = {0};
+
+ info.cbSize = sizeof(TASKDIALOGCONFIG);
+ info.dwFlags = TDF_SHOW_PROGRESS_BAR;
+ info.pfCallback = taskdialog_callback_proc_progress_bar;
+ info.lpCallbackData = (LONG_PTR)info.dwFlags;
+ info.dwCommonButtons = TDCBF_OK_BUTTON;
+ pTaskDialogIndirect(&info, NULL, NULL, NULL);
+
+ info.dwFlags = TDF_SHOW_MARQUEE_PROGRESS_BAR;
+ info.lpCallbackData = (LONG_PTR)info.dwFlags;
+ pTaskDialogIndirect(&info, NULL, NULL, NULL);
+
+ info.dwFlags = TDF_SHOW_PROGRESS_BAR | TDF_SHOW_MARQUEE_PROGRESS_BAR;
+ info.lpCallbackData = (LONG_PTR)info.dwFlags;
+ pTaskDialogIndirect(&info, NULL, NULL, NULL);
+}
+
START_TEST(taskdialog)
{
ULONG_PTR ctx_cookie;
@@ -411,6 +477,7 @@ START_TEST(taskdialog)
test_buttons();
test_help();
test_timer();
+ test_progress_bar();
unload_v6_module(ctx_cookie, hCtx);
}
--
2.17.1
June 14, 2018
Re: [PATCH v4 1/5] ntdll: Return BIOS info from NtQuerySystemInformation on Linux
by Huw Davies
On Thu, Jun 14, 2018 at 07:26:54AM -0600, Alex Henrie wrote:
> On Thu, Jun 14, 2018 at 2:07 AM Huw Davies <huw(a)codeweavers.com> wrote:
> >
> > On Wed, Jun 13, 2018 at 09:41:15PM -0600, Alex Henrie wrote:
> > > Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
> > > ---
> > > dlls/ntdll/nt.c | 169 ++++++++++++++++++++++++++++++++++++++++++++++++
> > > 1 file changed, 169 insertions(+)
> > >
> > > diff --git a/dlls/ntdll/nt.c b/dlls/ntdll/nt.c
> > > index dc0ce04f42..72ae381813 100644
> > > --- a/dlls/ntdll/nt.c
> > > +++ b/dlls/ntdll/nt.c
> > > @@ -66,6 +66,50 @@
> > >
> > > WINE_DEFAULT_DEBUG_CHANNEL(ntdll);
> > >
> > > +#include "pshpack1.h"
> > > +
> > > +typedef enum _SYSTEM_FIRMWARE_TABLE_ACTION
> > > +{
> > > + SystemFirmwareTable_Enumerate = 0,
> > > + SystemFirmwareTable_Get = 1
> > > +} SYSTEM_FIRMWARE_TABLE_ACTION;
> > > +
> > > +typedef struct _SYSTEM_FIRMWARE_TABLE_INFORMATION
> > > +{
> > > + ULONG ProviderSignature;
> > > + SYSTEM_FIRMWARE_TABLE_ACTION Action;
> > > + ULONG TableID;
> > > + ULONG TableBufferLength;
> > > + UCHAR TableBuffer[1];
> > > +} SYSTEM_FIRMWARE_TABLE_INFORMATION;
> >
> > These two at least should be in winternl.h
>
> Are you sure? They're not in the native winternl.h.
I thought we had other 'struct SYSTEM_' definitions in there that
aren't in the native SDK.
> > Also, some tests would be nice, both for the ntdll (free feel to just
> > tidy up mine) and kernel32 functions.
>
> Your test just checks that
> NtQuerySystemInformation(SystemFirmwareTableInformation, ...) returns
> STATUS_SUCCESS, which doesn't seem very useful. The returned data
> itself is dependent on the BIOS and could be very different on
> different computers.
Well it must be useful because you claimed it returned
STATUS_NOT_IMPLEMENTED before I wrote it ;-) You obviously can't test
the data, but testing the lengths (i.e. the returned length and buffer
length) is also interesting.
In principle the kernel32 tests could compare the data returned from a
call to the ntdll function with the data returned from the kernel32
function.
Huw.
June 14, 2018
Re: [PATCH v4 1/5] ntdll: Return BIOS info from NtQuerySystemInformation on Linux
by Alex Henrie
On Thu, Jun 14, 2018 at 2:07 AM Huw Davies <huw(a)codeweavers.com> wrote:
>
> On Wed, Jun 13, 2018 at 09:41:15PM -0600, Alex Henrie wrote:
> > Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
> > ---
> > dlls/ntdll/nt.c | 169 ++++++++++++++++++++++++++++++++++++++++++++++++
> > 1 file changed, 169 insertions(+)
> >
> > diff --git a/dlls/ntdll/nt.c b/dlls/ntdll/nt.c
> > index dc0ce04f42..72ae381813 100644
> > --- a/dlls/ntdll/nt.c
> > +++ b/dlls/ntdll/nt.c
> > @@ -66,6 +66,50 @@
> >
> > WINE_DEFAULT_DEBUG_CHANNEL(ntdll);
> >
> > +#include "pshpack1.h"
> > +
> > +typedef enum _SYSTEM_FIRMWARE_TABLE_ACTION
> > +{
> > + SystemFirmwareTable_Enumerate = 0,
> > + SystemFirmwareTable_Get = 1
> > +} SYSTEM_FIRMWARE_TABLE_ACTION;
> > +
> > +typedef struct _SYSTEM_FIRMWARE_TABLE_INFORMATION
> > +{
> > + ULONG ProviderSignature;
> > + SYSTEM_FIRMWARE_TABLE_ACTION Action;
> > + ULONG TableID;
> > + ULONG TableBufferLength;
> > + UCHAR TableBuffer[1];
> > +} SYSTEM_FIRMWARE_TABLE_INFORMATION;
>
> These two at least should be in winternl.h
Are you sure? They're not in the native winternl.h.
> It fails to build on macOS
> nt.c:2454:27: error: label at end of compound statement: expected statement
> case RSMB:
>
> I suspect you may want to move the main body of the implementation into
> a helper function, to avoid adding even more bloat to the main switch.
Thanks for catching the Mac OS build error. While I'm fixing that I'll
see what I can do to organize the code better.
> Also, some tests would be nice, both for the ntdll (free feel to just
> tidy up mine) and kernel32 functions.
Your test just checks that
NtQuerySystemInformation(SystemFirmwareTableInformation, ...) returns
STATUS_SUCCESS, which doesn't seem very useful. The returned data
itself is dependent on the BIOS and could be very different on
different computers.
> Note, that these went to wine-patches rather than wine-devel.
Yes, my mistake, old habits die hard...
Thanks for the feedback.
-Alex
June 14, 2018
Re: [PATCH 4/5] comctl32/taskdialog: Add support for hyperlink.
by Nikolay Sivov
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
June 14, 2018
Re: [PATCH 3/5] comctl32/taskdialog: Add support for loading standard icons.
by Nikolay Sivov
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
June 14, 2018
Re: [PATCH 2/5] comctl32/taskdialog: Add support for main icon.
by Nikolay Sivov
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
June 14, 2018
Re: [PATCH 1/5] comctl32/taskdialog: Add support for TDM_ENABLE_BUTTON.
by Nikolay Sivov
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
June 14, 2018
Re: [PATCH 5/5] comctl32/taskdialog: Add support for progress bar.
by Nikolay Sivov
On 06/14/2018 11:02 AM, Zhiyi Zhang wrote:
> Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
> ---
> dlls/comctl32/taskdialog.c | 45 ++++++++++++++++++++++
> dlls/comctl32/tests/taskdialog.c | 65 ++++++++++++++++++++++++++++++++
> 2 files changed, 110 insertions(+)
>
> diff --git a/dlls/comctl32/taskdialog.c b/dlls/comctl32/taskdialog.c
> index 91c8af019b..3c198df6d1 100644
> --- a/dlls/comctl32/taskdialog.c
> +++ b/dlls/comctl32/taskdialog.c
> @@ -57,6 +57,7 @@ struct taskdialog_info
> HWND main_icon;
> HWND main_instruction;
> HWND content;
> + HWND progress_bar;
> HWND *buttons;
> INT button_count;
> HWND default_button;
> @@ -351,6 +352,17 @@ static void taskdialog_add_content(struct taskdialog_info *dialog_info)
> taskdialog_hyperlink_enabled(dialog_info));
> }
>
> +static void taskdialog_add_progress_bar(struct taskdialog_info *dialog_info)
> +{
> + const TASKDIALOGCONFIG *taskconfig = dialog_info->taskconfig;
> + DWORD style = PBS_SMOOTH | PBS_SMOOTHREVERSE | WS_CHILD | WS_VISIBLE;
> +
> + if (!(taskconfig->dwFlags & (TDF_SHOW_PROGRESS_BAR | TDF_SHOW_MARQUEE_PROGRESS_BAR))) return;
> + if (taskconfig->dwFlags & TDF_SHOW_MARQUEE_PROGRESS_BAR) style |= PBS_MARQUEE;
> + dialog_info->progress_bar =
> + CreateWindowW(PROGRESS_CLASSW, NULL, style, 0, 0, 0, 0, dialog_info->hwnd, NULL, 0, NULL);
> +}
> +
> static void taskdialog_add_button(struct taskdialog_info *dialog_info, HWND *button, INT id, const WCHAR *text,
> BOOL custom_button)
> {
> @@ -464,6 +476,17 @@ static void taskdialog_layout(struct taskdialog_info *dialog_info)
> /* Content */
> taskdialog_label_layout(dialog_info, dialog_info->content, main_icon_right, dialog_width, &dialog_height, syslink);
>
> + /* Progress bar */
> + if (dialog_info->progress_bar)
> + {
> + x = main_icon_right + h_spacing;
> + y = dialog_height + v_spacing;
> + size.cx = dialog_width - x - h_spacing;
> + size.cy = GetSystemMetrics(SM_CYVSCROLL);
> + SetWindowPos(dialog_info->progress_bar, 0, x, y, size.cx, size.cy, SWP_NOZORDER);
> + dialog_height = y + size.cy;
> + }
> +
> dialog_height = max(dialog_height, main_icon_bottom);
>
> /* Common and custom buttons */
> @@ -598,6 +621,7 @@ static void taskdialog_init(struct taskdialog_info *dialog_info, HWND hwnd)
> taskdialog_add_main_icon(dialog_info);
> taskdialog_add_main_instruction(dialog_info);
> taskdialog_add_content(dialog_info);
> + taskdialog_add_progress_bar(dialog_info);
> taskdialog_add_buttons(dialog_info);
>
> /* Set default button */
> @@ -621,6 +645,7 @@ static INT_PTR CALLBACK taskdialog_proc(HWND hwnd, UINT msg, WPARAM wParam, LPAR
> {
> static const WCHAR taskdialog_info_propnameW[] = {'T','a','s','k','D','i','a','l','o','g','I','n','f','o',0};
> struct taskdialog_info *dialog_info;
> + LRESULT result;
>
> TRACE("hwnd=%p msg=0x%04x wparam=%lx lparam=%lx\n", hwnd, msg, wParam, lParam);
>
> @@ -635,6 +660,26 @@ static INT_PTR CALLBACK taskdialog_proc(HWND hwnd, UINT msg, WPARAM wParam, LPAR
> case TDM_ENABLE_BUTTON:
> taskdialog_enable_button(dialog_info, wParam, lParam);
> break;
> + case TDM_SET_MARQUEE_PROGRESS_BAR:
> + SendMessageW(dialog_info->progress_bar, PBM_SETMARQUEE, wParam, 0);
> + break;
This appears to be wrong, it shouldn't just start/stop animation, but
switch from marquee to regular mode and back, in our case flipping styles.
>
> + case TDM_SET_PROGRESS_BAR_POS:
> + result = 0;
> + if (!(dialog_info->taskconfig->dwFlags & TDF_SHOW_MARQUEE_PROGRESS_BAR))
> + result = SendMessageW(dialog_info->progress_bar, PBM_SETPOS, wParam, 0);
> + SetWindowLongPtrW(hwnd, DWLP_MSGRESULT, result);
> + break;
Did you verify that Progress control handles this correctly, maybe flags
check is not necessary?
> + case TDM_SET_PROGRESS_BAR_MARQUEE:
> + SendMessageW(dialog_info->progress_bar, PBM_SETMARQUEE, wParam, lParam);
> + break;
> case WM_INITDIALOG:
> dialog_info = (struct taskdialog_info *)lParam;
>
> diff --git a/dlls/comctl32/tests/taskdialog.c b/dlls/comctl32/tests/taskdialog.c
> index cca700cd18..10cd3da794 100644
> --- a/dlls/comctl32/tests/taskdialog.c
> +++ b/dlls/comctl32/tests/taskdialog.c
> @@ -373,6 +373,70 @@ static void test_timer(void)
> pTaskDialogIndirect(&info, NULL, NULL, NULL);
> }
>
> +static HRESULT CALLBACK taskdialog_callback_proc_progress_bar(HWND hwnd, UINT notification, WPARAM wParam,
> + LPARAM lParam, LONG_PTR ref_data)
> +{
> + unsigned long ret;
> + DWORD *flags = (DWORD *)ref_data;
You can pass flags by value.
June 14, 2018
Re: [PATCH 2/2] dsound/tests: Use the available ARRAY_SIZE() macro
by Andrew Eikum
Signed-off-by: Andrew Eikum <aeikum(a)codeweavers.com>
On Wed, Jun 13, 2018 at 08:30:24PM +0200, Michael Stefaniuc wrote:
> Signed-off-by: Michael Stefaniuc <mstefani(a)winehq.org>
> ---
> dlls/dsound/tests/ds3d.c | 2 +-
> dlls/dsound/tests/dsound.c | 15 ++++++---------
> 2 files changed, 7 insertions(+), 10 deletions(-)
>
> diff --git a/dlls/dsound/tests/ds3d.c b/dlls/dsound/tests/ds3d.c
> index d4356c2b6c..1b44afff8d 100644
> --- a/dlls/dsound/tests/ds3d.c
> +++ b/dlls/dsound/tests/ds3d.c
> @@ -139,7 +139,7 @@ const char * getDSBCAPS(DWORD xmask) {
>
> buffer[0] = 0;
>
> - for (i=0;i<sizeof(flags)/sizeof(flags[0]);i++) {
> + for (i = 0; i < ARRAY_SIZE(flags); i++) {
> if ((flags[i].mask & xmask) == flags[i].mask) {
> if (first)
> first = FALSE;
> diff --git a/dlls/dsound/tests/dsound.c b/dlls/dsound/tests/dsound.c
> index 375abc8761..0807d43788 100644
> --- a/dlls/dsound/tests/dsound.c
> +++ b/dlls/dsound/tests/dsound.c
> @@ -1004,8 +1004,8 @@ static HRESULT test_frequency(LPGUID lpGuid)
> if (rc!=DS_OK)
> goto EXIT1;
>
> - for (f=0;f<sizeof(fmts)/sizeof(fmts[0]);f++) {
> - for (r=0;r<sizeof(rates)/sizeof(rates[0]);r++) {
> + for (f = 0; f < ARRAY_SIZE(fmts); f++) {
> + for (r = 0; r < ARRAY_SIZE(rates); r++) {
> init_format(&wfx,WAVE_FORMAT_PCM,11025,fmts[f].bits,
> fmts[f].channels);
> secondary=NULL;
> @@ -1135,7 +1135,7 @@ static HRESULT test_duplicate(LPGUID lpGuid)
> int i;
>
> /* Prepare notify events */
> - for (i=0;i<sizeof(event)/sizeof(event[0]);i++) {
> + for (i = 0; i < ARRAY_SIZE(event); i++) {
> event[i] = CreateEventW(NULL, FALSE, FALSE, NULL);
> }
>
> @@ -1174,8 +1174,7 @@ static HRESULT test_duplicate(LPGUID lpGuid)
> "IDirectSound_DuplicateSoundBuffer failed %08x\n",rc);
>
> trace("testing duplicated buffer without notifications.\n");
> - test_notify(duplicated,sizeof(event)/sizeof(event[0]),
> - event,WAIT_TIMEOUT);
> + test_notify(duplicated, ARRAY_SIZE(event), event, WAIT_TIMEOUT);
>
> rc=IDirectSoundBuffer_QueryInterface(duplicated,
> &IID_IDirectSoundNotify,
> @@ -1192,8 +1191,7 @@ static HRESULT test_duplicate(LPGUID lpGuid)
> "failed %08x\n",rc);
>
> trace("testing duplicated buffer with a notification.\n");
> - test_notify(duplicated,sizeof(event)/sizeof(event[0]),
> - event,WAIT_OBJECT_0+1);
> + test_notify(duplicated, ARRAY_SIZE(event), event, WAIT_OBJECT_0 + 1);
>
> ref=IDirectSoundNotify_Release(dup_notify);
> ok(ref==0,"IDirectSoundNotify_Release() has %d references, "
> @@ -1204,8 +1202,7 @@ static HRESULT test_duplicate(LPGUID lpGuid)
> "should have 0\n",ref);
>
> trace("testing original buffer with a notification.\n");
> - test_notify(original,sizeof(event)/sizeof(event[0]),
> - event,WAIT_OBJECT_0);
> + test_notify(original, ARRAY_SIZE(event), event, WAIT_OBJECT_0);
>
> ref=IDirectSoundBuffer_Release(duplicated);
> ok(ref==0,"IDirectSoundBuffer_Release() has %d references, "
> --
> 2.14.4
>
>
>
June 14, 2018
Re: [PATCH 1/2] dsound/tests: Avoid ARRAY_SIZE-like macros
by Andrew Eikum
Signed-off-by: Andrew Eikum <aeikum(a)codeweavers.com>
On Wed, Jun 13, 2018 at 08:30:23PM +0200, Michael Stefaniuc wrote:
> Signed-off-by: Michael Stefaniuc <mstefani(a)winehq.org>
> ---
> dlls/dsound/tests/capture.c | 2 +-
> dlls/dsound/tests/dsound.c | 8 ++++----
> dlls/dsound/tests/dsound8.c | 8 ++++----
> dlls/dsound/tests/dsound_test.h | 2 --
> 4 files changed, 9 insertions(+), 11 deletions(-)
>
> diff --git a/dlls/dsound/tests/capture.c b/dlls/dsound/tests/capture.c
> index a23d1eb6f6..dada067956 100644
> --- a/dlls/dsound/tests/capture.c
> +++ b/dlls/dsound/tests/capture.c
> @@ -549,7 +549,7 @@ static BOOL WINAPI dscenum_callback(LPGUID lpGuid, LPCSTR lpcstrDescription,
> "should have 0\n",ref);
> }
>
> - for (f=0;f<NB_FORMATS;f++) {
> + for (f = 0; f < ARRAY_SIZE(formats); f++) {
> dscbo=NULL;
> init_format(&wfx,WAVE_FORMAT_PCM,formats[f][0],formats[f][1],
> formats[f][2]);
> diff --git a/dlls/dsound/tests/dsound.c b/dlls/dsound/tests/dsound.c
> index 07c8908add..375abc8761 100644
> --- a/dlls/dsound/tests/dsound.c
> +++ b/dlls/dsound/tests/dsound.c
> @@ -571,8 +571,8 @@ static HRESULT test_primary_secondary(LPGUID lpGuid)
> "IDirectSound_CreateSoundBuffer() failed to create a primary buffer %08x\n",rc);
>
> if (rc==DS_OK && primary!=NULL) {
> - for (f=0;f<NB_FORMATS;f++) {
> - for (tag=0;tag<NB_TAGS;tag++) {
> + for (f = 0; f < ARRAY_SIZE(formats); f++) {
> + for (tag = 0; tag < ARRAY_SIZE(format_tags); tag++) {
> /* if float, we only want to test 32-bit */
> if ((format_tags[tag] == WAVE_FORMAT_IEEE_FLOAT) && (formats[f][1] != 32))
> continue;
> @@ -718,8 +718,8 @@ static HRESULT test_secondary(LPGUID lpGuid)
> if (rc!=DS_OK)
> goto EXIT1;
>
> - for (f=0;f<NB_FORMATS;f++) {
> - for (tag=0;tag<NB_TAGS;tag++) {
> + for (f = 0; f < ARRAY_SIZE(formats); f++) {
> + for (tag = 0; tag < ARRAY_SIZE(format_tags); tag++) {
> WAVEFORMATEXTENSIBLE wfxe;
>
> /* if float, we only want to test 32-bit */
> diff --git a/dlls/dsound/tests/dsound8.c b/dlls/dsound/tests/dsound8.c
> index a6e3f12ae3..fabd8a037e 100644
> --- a/dlls/dsound/tests/dsound8.c
> +++ b/dlls/dsound/tests/dsound8.c
> @@ -581,8 +581,8 @@ static HRESULT test_primary_secondary8(LPGUID lpGuid)
> "%08x\n",rc);
>
> if (rc==DS_OK && primary!=NULL) {
> - for (f=0;f<NB_FORMATS;f++) {
> - for (tag=0;tag<NB_TAGS;tag++) {
> + for (f = 0; f < ARRAY_SIZE(formats); f++) {
> + for (tag = 0; tag < ARRAY_SIZE(format_tags); tag++) {
> /* if float, we only want to test 32-bit */
> if ((format_tags[tag] == WAVE_FORMAT_IEEE_FLOAT) && (formats[f][1] != 32))
> continue;
> @@ -727,8 +727,8 @@ static HRESULT test_secondary8(LPGUID lpGuid)
> if (rc!=DS_OK)
> goto EXIT1;
>
> - for (f=0;f<NB_FORMATS;f++) {
> - for (tag=0;tag<NB_TAGS;tag++) {
> + for (f = 0; f < ARRAY_SIZE(formats); f++) {
> + for (tag = 0; tag < ARRAY_SIZE(format_tags); tag++) {
> WAVEFORMATEXTENSIBLE wfxe;
>
> /* if float, we only want to test 32-bit */
> diff --git a/dlls/dsound/tests/dsound_test.h b/dlls/dsound/tests/dsound_test.h
> index 8a8f2498d0..04f995e359 100644
> --- a/dlls/dsound/tests/dsound_test.h
> +++ b/dlls/dsound/tests/dsound_test.h
> @@ -71,10 +71,8 @@ static const unsigned int formats[][4]={
> {96000, 32, 1, 0 },
> {96000, 32, 2, 0 }
> };
> -#define NB_FORMATS (sizeof(formats)/sizeof(*formats))
>
> static const unsigned int format_tags[] = {WAVE_FORMAT_PCM, WAVE_FORMAT_IEEE_FLOAT};
> -#define NB_TAGS (sizeof(format_tags)/sizeof(*format_tags))
>
> /* The time slice determines how often we will service the buffer */
> #define TIME_SLICE 31
> --
> 2.14.4
>
>
>
June 14, 2018
Re: [PATCH 2/2] winmm/tests: Use the available ARRAY_SIZE() macro
by Andrew Eikum
Signed-off-by: Andrew Eikum <aeikum(a)codeweavers.com>
On Wed, Jun 13, 2018 at 08:30:27PM +0200, Michael Stefaniuc wrote:
> Signed-off-by: Michael Stefaniuc <mstefani(a)winehq.org>
> ---
> dlls/winmm/tests/joystick.c | 4 ++--
> dlls/winmm/tests/midi.c | 2 +-
> dlls/winmm/tests/mmio.c | 2 +-
> 3 files changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/dlls/winmm/tests/joystick.c b/dlls/winmm/tests/joystick.c
> index 5714001315..7531bd6481 100644
> --- a/dlls/winmm/tests/joystick.c
> +++ b/dlls/winmm/tests/joystick.c
> @@ -139,7 +139,7 @@ static void test_api(void)
> /* Try some unusual period values for joySetCapture and unusual threshold values for joySetThreshold.
> * Windows XP allows almost all test values, Windows 8 will return error on most test values, Windows
> * 98 allows anything but cuts the values to their maximum supported values internally. */
> - for (i = 0; i < sizeof(period) / sizeof(period[0]); i++)
> + for (i = 0; i < ARRAY_SIZE(period); i++)
> {
> ret = joySetCapture(window, joyid, period[i], FALSE);
> if (win8 && ((1 << i) & period_win8_error))
> @@ -190,7 +190,7 @@ static void test_api(void)
> ok(ret == JOYERR_NOERROR, "Expected %d, got %d\n", JOYERR_NOERROR, ret);
>
> infoex.ex.dwSize = sizeof(infoex.ex);
> - for (i = 0; i < sizeof(flags) / sizeof(flags[0]); i++)
> + for (i = 0; i < ARRAY_SIZE(flags); i++)
> {
> infoex.ex.dwFlags = flags[i];
> ret = joyGetPosEx(joyid, &infoex.ex);
> diff --git a/dlls/winmm/tests/midi.c b/dlls/winmm/tests/midi.c
> index fe3cc5c876..3b8bd2287d 100644
> --- a/dlls/winmm/tests/midi.c
> +++ b/dlls/winmm/tests/midi.c
> @@ -549,7 +549,7 @@ static void CALLBACK time_stamp_callback(HMIDIOUT hmo, UINT msg, DWORD_PTR insta
> struct time_stamp_records *records = (struct time_stamp_records *)instance;
> switch (msg) {
> case MM_MOM_POSITIONCB:
> - if (records->count < sizeof(records->time_stamp)/sizeof(records->time_stamp[0]))
> + if (records->count < ARRAY_SIZE(records->time_stamp))
> records->time_stamp[records->count] = GetTickCount();
> records->count++;
> break;
> diff --git a/dlls/winmm/tests/mmio.c b/dlls/winmm/tests/mmio.c
> index 48367ee6d9..5501c319c5 100644
> --- a/dlls/winmm/tests/mmio.c
> +++ b/dlls/winmm/tests/mmio.c
> @@ -606,7 +606,7 @@ static LRESULT CALLBACK mmio_test_IOProc(LPSTR lpMMIOInfo, UINT uMessage, LPARAM
> case MMIOM_OPEN:
> if (lpInfo->fccIOProc == FOURCC_DOS)
> lpInfo->fccIOProc = mmioFOURCC('F', 'A', 'I', 'L');
> - for (i = 0; i < sizeof(lpInfo->adwInfo) / sizeof(*lpInfo->adwInfo); i++)
> + for (i = 0; i < ARRAY_SIZE(lpInfo->adwInfo); i++)
> ok(lpInfo->adwInfo[i] == 0, "[%d] Expected 0, got %u\n", i, lpInfo->adwInfo[i]);
> return MMSYSERR_NOERROR;
> case MMIOM_CLOSE:
> --
> 2.14.4
>
>
>
June 14, 2018
Re: [PATCH 1/2] winmm/tests: Avoid and ARRAY_SIZE-like macro
by Andrew Eikum
Signed-off-by: Andrew Eikum <aeikum(a)codeweavers.com>
On Wed, Jun 13, 2018 at 08:30:26PM +0200, Michael Stefaniuc wrote:
> Signed-off-by: Michael Stefaniuc <mstefani(a)winehq.org>
> ---
> dlls/winmm/tests/capture.c | 2 +-
> dlls/winmm/tests/wave.c | 2 +-
> dlls/winmm/tests/winmm_test.h | 1 -
> 3 files changed, 2 insertions(+), 3 deletions(-)
>
> diff --git a/dlls/winmm/tests/capture.c b/dlls/winmm/tests/capture.c
> index fd4005cdab..ba71f9ca80 100644
> --- a/dlls/winmm/tests/capture.c
> +++ b/dlls/winmm/tests/capture.c
> @@ -398,7 +398,7 @@ static void wave_in_test_device(UINT_PTR device)
>
> HeapFree(GetProcessHeap(), 0, nameA);
>
> - for (f=0;f<NB_WIN_FORMATS;f++) {
> + for (f = 0; f < ARRAY_SIZE(win_formats); f++) {
> format.wFormatTag=WAVE_FORMAT_PCM;
> format.nChannels=win_formats[f][3];
> format.wBitsPerSample=win_formats[f][2];
> diff --git a/dlls/winmm/tests/wave.c b/dlls/winmm/tests/wave.c
> index 8d7dfd6b68..b402e21917 100644
> --- a/dlls/winmm/tests/wave.c
> +++ b/dlls/winmm/tests/wave.c
> @@ -1041,7 +1041,7 @@ static void wave_out_test_device(UINT_PTR device)
> CALLBACK_EVENT,&capsA,TRUE,FALSE,FALSE);
> }
>
> - for (f=0;f<NB_WIN_FORMATS;f++) {
> + for (f = 0; f < ARRAY_SIZE(win_formats); f++) {
> format.wFormatTag=WAVE_FORMAT_PCM;
> format.nChannels=win_formats[f][3];
> format.wBitsPerSample=win_formats[f][2];
> diff --git a/dlls/winmm/tests/winmm_test.h b/dlls/winmm/tests/winmm_test.h
> index 177dc2e837..d5fb70afbd 100644
> --- a/dlls/winmm/tests/winmm_test.h
> +++ b/dlls/winmm/tests/winmm_test.h
> @@ -68,7 +68,6 @@ static const unsigned int win_formats[][4] = {
> {WAVE_FORMAT_96M16, 96000, 16, 1},
> {WAVE_FORMAT_96S16, 96000, 16, 2}
> };
> -#define NB_WIN_FORMATS (sizeof(win_formats)/sizeof(*win_formats))
>
> extern const char* dev_name(int);
> extern const char* wave_open_flags(DWORD);
> --
> 2.14.4
>
>
>
June 14, 2018
Re: ODBC Databases: Jet/Access success
by liz lock
I just wanted to thank Barry Bird so, so much for this very old post. I
have struggled with this issue getting some massively complicated Word
macros that interact with Access databases to work under Wine (and
Crossover Linux) and his solution just ... worked. Brilliant!
(Mrs) Elizabeth Lock
Oxford
June 14, 2018
[PATCH 2/2] msvcp120: Add alloc/free count validation tests in _Concurrent_vector_base_v4
by Piotr Caban
Signed-off-by: Piotr Caban <piotr(a)codeweavers.com>
---
dlls/msvcp120/tests/msvcp120.c | 5 +++++
1 file changed, 5 insertions(+)
June 14, 2018
[PATCH 1/2] msvcp120: Fix function passed to _Concurrent_vector_base_v4::_Internal_clear
by Piotr Caban
Signed-off-by: Piotr Caban <piotr(a)codeweavers.com>
---
dlls/msvcp120/tests/msvcp120.c | 30 ++++++++++++++++++++++--------
1 file changed, 22 insertions(+), 8 deletions(-)
June 14, 2018
[PATCH] testbot: Strip the prefix from the VM name for the WineTest tag.
by Francois Gouget
This avoids duplication in case the VM names happen to have the same
prefix that would be used for the WineTest reports.
Also trust the administrator to know what to put in $TagPrefix (i.e.
don't lowercase it).
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
The official TestBot VM names don't have prefixes so I guess this is
mostly of use to me but I think there is no harm in having it in the
main branch.
My VMs have an 'fgtb' prefix so I can easily distinguish them from the
official VMs: for instance fgtbwinxp vs wxppro. But since my $TagPrefix
is 'fgtb' this results in tags such as 'fgtb-fgtbwinxp'. This patch
ensures the tag is 'fgtb-winxp' which is cleaner and also much less
likely to result in a tag that's too long.
testbot/bin/WineRunTask.pl | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/testbot/bin/WineRunTask.pl b/testbot/bin/WineRunTask.pl
index 3290b0bc6..8f5cb268c 100755
--- a/testbot/bin/WineRunTask.pl
+++ b/testbot/bin/WineRunTask.pl
@@ -442,7 +442,8 @@ elsif ($Step->Type eq "suite")
{
$Keepalive = 60;
$Script .= "$FileName ";
- my $Tag = lc($TagPrefix) . "-" . lc($VM->Name);
+ my $Tag = lc($VM->Name);
+ $Tag =~ s/^$TagPrefix//;
$Tag =~ s/[^a-zA-Z0-9]/-/g;
if ($VM->Type eq "win64")
{
@@ -468,7 +469,7 @@ elsif ($Step->Type eq "suite")
$Info =~ s/"/\\"/g;
$Info =~ s/%/%%/g;
$Info =~ s/%/%%/g;
- $Script .= "-q -o $RptFileName -t $Tag -m \"$EMail\" -i \"$Info\"\r\n" .
+ $Script .= "-q -o $RptFileName -t $TagPrefix-$Tag -m \"$EMail\" -i \"$Info\"\r\n".
"$FileName -q -s $RptFileName\r\n";
}
Debug(Elapsed($Start), " Sending the script: [$Script]\n");
--
2.17.1
June 14, 2018
[PATCH 2/2] testbot/web: Only create a build step if there are VMs that need it.
by Francois Gouget
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
testbot/web/Submit.pl | 65 ++++++++++++++++++++++---------------------
1 file changed, 33 insertions(+), 32 deletions(-)
diff --git a/testbot/web/Submit.pl b/testbot/web/Submit.pl
index 1425301ea..c16b99f1e 100644
--- a/testbot/web/Submit.pl
+++ b/testbot/web/Submit.pl
@@ -2,6 +2,7 @@
# WineTestBot job submit page
#
# Copyright 2009 Ge van Geldorp
+# Copyright 2012-2014, 2017-2018 Francois Gouget
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
@@ -765,44 +766,16 @@ sub OnSubmit($)
}
my $Steps = $NewJob->Steps;
- my $BuildStep;
- my $FileType = $self->GetParam("FileType");
- if ($FileType eq "patchdlls")
- {
- # This is a patch so add a build step...
- $BuildStep = $Steps->Add();
- $BuildStep->FileName($BaseName);
- $BuildStep->FileType($FileType);
- $BuildStep->InStaging(!1);
- $BuildStep->Type("build");
- $BuildStep->DebugLevel(0);
-
- # ...with a build task
- my $VMs = CreateVMs();
- $VMs->AddFilter("Type", ["build"]);
- $VMs->AddFilter("Role", ["base"]);
- my $BuildVM = ${$VMs->GetItems()}[0];
- my $Task = $BuildStep->Tasks->Add();
- $Task->VM($BuildVM);
- $Task->Timeout($BuildTimeout);
-
- # Save the build step so the others can reference it
- my ($ErrKey, $ErrProperty, $ErrMessage) = $Jobs->Save();
- if (defined($ErrMessage))
- {
- $self->{ErrMessage} = $ErrMessage;
- return !1;
- }
- }
-
# Add steps and tasks for the 32 and 64-bit tests
+ my $FileType = $self->GetParam("FileType");
+ my $BuildStep;
foreach my $Bits ("32", "64")
{
next if ($Bits eq "32" && $FileType eq "exe64");
next if ($Bits eq "64" && $FileType eq "exe32");
next if ($Bits eq "64" && $FileType eq "patchdlls" && !defined($self->GetParam("Run64")));
- my $Tasks;
+ my $Tasks;
my $VMs = CreateVMs();
$VMs->AddFilter("Type", $Bits eq "32" ? ["win32", "win64"] : ["win64"]);
my $SortedKeys = $VMs->SortKeysBySortOrder($VMs->GetKeys());
@@ -814,7 +787,35 @@ sub OnSubmit($)
if (!$Tasks)
{
- # First create the test step
+ if (!$BuildStep and $FileType eq "patchdlls")
+ {
+ # This is a patch so add a build step...
+ $BuildStep = $Steps->Add();
+ $BuildStep->FileName($BaseName);
+ $BuildStep->FileType($FileType);
+ $BuildStep->InStaging(!1);
+ $BuildStep->Type("build");
+ $BuildStep->DebugLevel(0);
+
+ # ...with a build task
+ my $VMs = CreateVMs();
+ $VMs->AddFilter("Type", ["build"]);
+ $VMs->AddFilter("Role", ["base"]);
+ my $BuildVM = ${$VMs->GetItems()}[0];
+ my $Task = $BuildStep->Tasks->Add();
+ $Task->VM($BuildVM);
+ $Task->Timeout($BuildTimeout);
+
+ # Save the build step so the others can reference it
+ my ($ErrKey, $ErrProperty, $ErrMessage) = $Jobs->Save();
+ if (defined($ErrMessage))
+ {
+ $self->{ErrMessage} = $ErrMessage;
+ return !1;
+ }
+ }
+
+ # Then create the test step
my $TestStep = $Steps->Add();
if ($FileType eq "patchdlls")
{
--
2.17.1
June 14, 2018
[PATCH 1/2] testbot/web: Deprecate the patchprograms Step file type.
by Francois Gouget
The patchdlls / patchprograms Step::FileType distinction is obsolete
since build steps may now have to handle patches that include both.
So as a first step standardize on patchdlls to identify patch files.
Later on support for patchprograms can be removed altogether.
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
testbot/lib/WineTestBot/PatchUtils.pm | 1 -
testbot/web/Submit.pl | 19 +++++++------------
2 files changed, 7 insertions(+), 13 deletions(-)
diff --git a/testbot/lib/WineTestBot/PatchUtils.pm b/testbot/lib/WineTestBot/PatchUtils.pm
index 14a598545..ec609d987 100644
--- a/testbot/lib/WineTestBot/PatchUtils.pm
+++ b/testbot/lib/WineTestBot/PatchUtils.pm
@@ -115,7 +115,6 @@ sub _AddTest($$$)
my $ExeBase = ($Root eq "programs") ? "${Module}.exe_test" :
"${Module}_test";
$Tests->{$Module} = {
- "Type" => "patch$Root",
"Module" => $Module,
"Path" => "$Root/$Module/tests",
"ExeBase" => $ExeBase,
diff --git a/testbot/web/Submit.pl b/testbot/web/Submit.pl
index 97f31d10c..1425301ea 100644
--- a/testbot/web/Submit.pl
+++ b/testbot/web/Submit.pl
@@ -118,8 +118,7 @@ sub GetPropertyDescriptors($)
}
elsif ($self->{Page} == 3)
{
- my $IsPatch = ($self->GetParam("FileType") eq "patchdlls" ||
- $self->GetParam("FileType") eq "patchprograms");
+ my $IsPatch = ($self->GetParam("FileType") eq "patchdlls");
$self->{PropertyDescriptors3}[0]->{IsRequired} = $IsPatch;
return $self->{PropertyDescriptors3};
}
@@ -386,8 +385,7 @@ sub DisplayProperty($$)
if ($self->{Page} == 3)
{
my $PropertyName = $PropertyDescriptor->GetName();
- if ($self->GetParam("FileType") eq "patchdlls" ||
- $self->GetParam("FileType") eq "patchprograms")
+ if ($self->GetParam("FileType") eq "patchdlls")
{
if ($PropertyName eq "Run64")
{
@@ -477,8 +475,6 @@ sub Validate($)
{
if (($self->GetParam("FileType") eq "patchdlls" &&
$self->GetParam("TestExecutable") !~ m/^[\w_.]+_test\.exe$/) ||
- ($self->GetParam("FileType") eq "patchprograms" &&
- $self->GetParam("TestExecutable") !~ m/^[\w_.]+\.exe_test\.exe$/) ||
($self->GetParam("TestExecutable") =~ m=(?:[a-z]:|[/\\])=i))
{
$self->{ErrField} = "TestExecutable";
@@ -603,7 +599,7 @@ sub DetermineFileType($$)
else
{
my $TestInfo = (values %{$Impacts->{Tests}})[0];
- $FileType = $TestInfo->{Type};
+ $FileType = "patchdlls";
$ExeBase = $TestInfo->{ExeBase};
$TestUnit = (keys %{$TestInfo->{Units}})[0];
}
@@ -651,8 +647,7 @@ sub OnPage1Next($)
$self->{ErrMessage} = $ErrMessage;
return !1;
}
- if ($FileType ne "patchdlls" && $FileType ne "patchprograms" &&
- $FileType ne "exe32" && $FileType ne "exe64")
+ if ($FileType !~ /^(?:exe32|exe64|patchdlls)$/)
{
$self->{ErrField} = "File";
$self->{ErrMessage} = "Unrecognized file type";
@@ -772,7 +767,7 @@ sub OnSubmit($)
my $BuildStep;
my $FileType = $self->GetParam("FileType");
- if ($FileType eq "patchdlls" || $FileType eq "patchprograms")
+ if ($FileType eq "patchdlls")
{
# This is a patch so add a build step...
$BuildStep = $Steps->Add();
@@ -805,7 +800,7 @@ sub OnSubmit($)
{
next if ($Bits eq "32" && $FileType eq "exe64");
next if ($Bits eq "64" && $FileType eq "exe32");
- next if ($Bits eq "64" && $FileType =~ /^patch/ && !defined($self->GetParam("Run64")));
+ next if ($Bits eq "64" && $FileType eq "patchdlls" && !defined($self->GetParam("Run64")));
my $Tasks;
my $VMs = CreateVMs();
@@ -821,7 +816,7 @@ sub OnSubmit($)
{
# First create the test step
my $TestStep = $Steps->Add();
- if ($FileType eq "patchdlls" || $FileType eq "patchprograms")
+ if ($FileType eq "patchdlls")
{
$TestStep->PreviousNo($BuildStep->No);
my $TestExe = basename($self->GetParam("TestExecutable"));
--
2.17.1
June 14, 2018
[PATCH 2/2] testbot/build: Save the full list of Wine files.
by Francois Gouget
The list can later be used by the TestBot to better identify Wine
patches.
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
testbot/lib/WineTestBot/PatchUtils.pm | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/testbot/lib/WineTestBot/PatchUtils.pm b/testbot/lib/WineTestBot/PatchUtils.pm
index 3a555af9d..14a598545 100644
--- a/testbot/lib/WineTestBot/PatchUtils.pm
+++ b/testbot/lib/WineTestBot/PatchUtils.pm
@@ -42,7 +42,7 @@ use WineTestBot::Config;
=item C<UpdateWineData()>
Updates the summary information about the Wine source such as the list of
-tests (testlist.txt).
+tests (testlist.txt) and the full list of Wine files.
=back
=cut
@@ -51,6 +51,11 @@ sub UpdateWineData($)
{
my ($WineDir) = @_;
+ mkdir "$DataDir/latest" if (!-d "$DataDir/latest");
+
+ my $ErrMessage = `cd '$WineDir' && git ls-tree -r --name-only HEAD 2>&1 >'$DataDir/latest/winefiles.txt'`;
+ return $ErrMessage if ($? != 0);
+
if (open(my $fh, ">", "$DataDir/testlist.txt"))
{
foreach my $TestFile (glob("$WineDir/*/*/tests/*.c"),
--
2.17.1
June 14, 2018
[PATCH 1/2] testbot/build: Let PatchUtils.pm generate testlist.txt.
by Francois Gouget
This makes it possible to reuse the code in other build scripts.
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
Like the script to update the VMs for testing patches in Wine...
testbot/bin/build/Reconfig.pl | 18 ++++-----------
testbot/lib/WineTestBot/PatchUtils.pm | 33 ++++++++++++++++++++++++++-
2 files changed, 37 insertions(+), 14 deletions(-)
diff --git a/testbot/bin/build/Reconfig.pl b/testbot/bin/build/Reconfig.pl
index 32cbad7c7..c950d4974 100755
--- a/testbot/bin/build/Reconfig.pl
+++ b/testbot/bin/build/Reconfig.pl
@@ -41,6 +41,7 @@ sub BEGIN
}
use WineTestBot::Config;
+use WineTestBot::PatchUtils;
my $LogFileName = "$LogDir/Reconfig.log";
@@ -133,20 +134,11 @@ sub GitPull()
return !1;
}
- if (open(my $fh, ">", "$DataDir/testlist.txt"))
+ my $ErrMessage = UpdateWineData("$DataDir/wine");
+ if ($ErrMessage)
{
- foreach my $TestFile (glob("$DataDir/wine/*/*/tests/*.c"),
- glob("$DataDir/wine/*/*/tests/*.spec"))
- {
- next if ($TestFile =~ m=/testlist\.c$=);
- $TestFile =~ s=^$DataDir/wine/==;
- print $fh "$TestFile\n";
- }
- close($fh);
- }
- else
- {
- LogMsg "Could not open 'testlist.txt' for writing: $!\n";
+ LogMsg "$ErrMessage\n";
+ return !1;
}
return 1;
diff --git a/testbot/lib/WineTestBot/PatchUtils.pm b/testbot/lib/WineTestBot/PatchUtils.pm
index 833394abe..3a555af9d 100644
--- a/testbot/lib/WineTestBot/PatchUtils.pm
+++ b/testbot/lib/WineTestBot/PatchUtils.pm
@@ -31,11 +31,42 @@ the Wine builds.
=cut
use Exporter 'import';
-our @EXPORT = qw(GetPatchImpact);
+our @EXPORT = qw(GetPatchImpact UpdateWineData);
use WineTestBot::Config;
+=pod
+=over 12
+
+=item C<UpdateWineData()>
+
+Updates the summary information about the Wine source such as the list of
+tests (testlist.txt).
+
+=back
+=cut
+
+sub UpdateWineData($)
+{
+ my ($WineDir) = @_;
+
+ if (open(my $fh, ">", "$DataDir/testlist.txt"))
+ {
+ foreach my $TestFile (glob("$WineDir/*/*/tests/*.c"),
+ glob("$WineDir/*/*/tests/*.spec"))
+ {
+ next if ($TestFile =~ m=/testlist\.c$=);
+ $TestFile =~ s=^$WineDir/==;
+ print $fh "$TestFile\n";
+ }
+ close($fh);
+ return undef;
+ }
+
+ return "Could not open 'testlist.txt' for writing: $!";
+}
+
=pod
=over 12
--
2.17.1
June 14, 2018
[PATCH] testbot/web: One cannot create a test job from a dll.
by Francois Gouget
DetermineFileType() transforms these file types to unknown so they get
rejected.
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
testbot/web/Submit.pl | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/testbot/web/Submit.pl b/testbot/web/Submit.pl
index ac9a38488..97f31d10c 100644
--- a/testbot/web/Submit.pl
+++ b/testbot/web/Submit.pl
@@ -240,7 +240,7 @@ sub GenerateFields($)
print "</th><tbody>\n";
my $VMs = CreateVMs();
- if ($self->{FileType} eq "exe64" || $self->{FileType} eq "dll64")
+ if ($self->{FileType} eq "exe64")
{
$VMs->AddFilter("Type", ["win64"]);
}
--
2.17.1
June 14, 2018
[PATCH] testbot: Standardize and clean up the WineRun*.pl scripts logging.
by Francois Gouget
Also show which command is being run like the client-side scripts do.
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
testbot/bin/WineRunBuild.pl | 8 ++++----
testbot/bin/WineRunReconfig.pl | 10 ++++++----
2 files changed, 10 insertions(+), 8 deletions(-)
diff --git a/testbot/bin/WineRunBuild.pl b/testbot/bin/WineRunBuild.pl
index 31decc107..96d9321b8 100755
--- a/testbot/bin/WineRunBuild.pl
+++ b/testbot/bin/WineRunBuild.pl
@@ -350,10 +350,10 @@ if (!$TA->SendFile($FileName, "staging/patch.diff", 0))
{
FatalTAError($TA, "Could not copy the patch to the VM");
}
-my $Script = "#!/bin/sh\n" .
- "rm -f Build.log\n" .
- "../bin/build/Build.pl patch.diff ". join(",", keys %Bitnesses) .
- " >>Build.log 2>&1\n";
+my $Script = "#!/bin/sh\n".
+ "( set -x\n".
+ " ../bin/build/Build.pl patch.diff ". join(",", sort keys %Bitnesses) ."\n".
+ ") >Build.log 2>&1\n";
Debug(Elapsed($Start), " Sending the script: [$Script]\n");
if (!$TA->SendFileFromString($Script, "task", $TestAgent::SENDFILE_EXE))
{
diff --git a/testbot/bin/WineRunReconfig.pl b/testbot/bin/WineRunReconfig.pl
index 99b73da6f..4fb34a07d 100755
--- a/testbot/bin/WineRunReconfig.pl
+++ b/testbot/bin/WineRunReconfig.pl
@@ -328,10 +328,12 @@ elsif ($Debug and !$VM->GetDomain()->IsPoweredOn())
# Run the build
#
-my $Script = "#!/bin/sh\n" .
- "(" .
- " git pull &&\n" .
- " ../bin/build/Reconfig.pl\n" .
+# Use our own log so it can be used for reference
+# even after another task has run.
+my $Script = "#!/bin/sh\n".
+ "( set -x\n".
+ " git pull &&\n".
+ " ../bin/build/Reconfig.pl\n".
") >Reconfig.log 2>&1\n";
my $TA = $VM->GetAgent();
Debug(Elapsed($Start), " Sending the script: [$Script]\n");
--
2.17.1
June 14, 2018
[PATCH] testbot/build: Add an empty line before the GitPull() message.
by Francois Gouget
GitPull() is not the first command being run anymore.
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
testbot/bin/build/Reconfig.pl | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/testbot/bin/build/Reconfig.pl b/testbot/bin/build/Reconfig.pl
index 706da255a..32cbad7c7 100755
--- a/testbot/bin/build/Reconfig.pl
+++ b/testbot/bin/build/Reconfig.pl
@@ -125,7 +125,7 @@ sub BuildTestLauncher()
sub GitPull()
{
- InfoMsg "Updating the Wine source\n";
+ InfoMsg "\nUpdating the Wine source\n";
system("cd $DataDir/wine && git pull >>$LogFileName 2>&1");
if ($? != 0)
{
--
2.17.1
June 14, 2018
Re: [PATCH v4 1/5] ntdll: Return BIOS info from NtQuerySystemInformation on Linux
by Huw Davies
On Wed, Jun 13, 2018 at 09:41:15PM -0600, Alex Henrie wrote:
> Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
> ---
> dlls/ntdll/nt.c | 169 ++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 169 insertions(+)
>
> diff --git a/dlls/ntdll/nt.c b/dlls/ntdll/nt.c
> index dc0ce04f42..72ae381813 100644
> --- a/dlls/ntdll/nt.c
> +++ b/dlls/ntdll/nt.c
> @@ -66,6 +66,50 @@
>
> WINE_DEFAULT_DEBUG_CHANNEL(ntdll);
>
> +#include "pshpack1.h"
> +
> +typedef enum _SYSTEM_FIRMWARE_TABLE_ACTION
> +{
> + SystemFirmwareTable_Enumerate = 0,
> + SystemFirmwareTable_Get = 1
> +} SYSTEM_FIRMWARE_TABLE_ACTION;
> +
> +typedef struct _SYSTEM_FIRMWARE_TABLE_INFORMATION
> +{
> + ULONG ProviderSignature;
> + SYSTEM_FIRMWARE_TABLE_ACTION Action;
> + ULONG TableID;
> + ULONG TableBufferLength;
> + UCHAR TableBuffer[1];
> +} SYSTEM_FIRMWARE_TABLE_INFORMATION;
These two at least should be in winternl.h
It fails to build on macOS
nt.c:2454:27: error: label at end of compound statement: expected statement
case RSMB:
I suspect you may want to move the main body of the implementation into
a helper function, to avoid adding even more bloat to the main switch.
Also, some tests would be nice, both for the ntdll (free feel to just
tidy up mine) and kernel32 functions.
Note, that these went to wine-patches rather than wine-devel.
Huw.
June 14, 2018
[PATCH 5/5] comctl32/taskdialog: Add support for progress bar.
by Zhiyi Zhang
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
---
dlls/comctl32/taskdialog.c | 45 ++++++++++++++++++++++
dlls/comctl32/tests/taskdialog.c | 65 ++++++++++++++++++++++++++++++++
2 files changed, 110 insertions(+)
diff --git a/dlls/comctl32/taskdialog.c b/dlls/comctl32/taskdialog.c
index 91c8af019b..3c198df6d1 100644
--- a/dlls/comctl32/taskdialog.c
+++ b/dlls/comctl32/taskdialog.c
@@ -57,6 +57,7 @@ struct taskdialog_info
HWND main_icon;
HWND main_instruction;
HWND content;
+ HWND progress_bar;
HWND *buttons;
INT button_count;
HWND default_button;
@@ -351,6 +352,17 @@ static void taskdialog_add_content(struct taskdialog_info *dialog_info)
taskdialog_hyperlink_enabled(dialog_info));
}
+static void taskdialog_add_progress_bar(struct taskdialog_info *dialog_info)
+{
+ const TASKDIALOGCONFIG *taskconfig = dialog_info->taskconfig;
+ DWORD style = PBS_SMOOTH | PBS_SMOOTHREVERSE | WS_CHILD | WS_VISIBLE;
+
+ if (!(taskconfig->dwFlags & (TDF_SHOW_PROGRESS_BAR | TDF_SHOW_MARQUEE_PROGRESS_BAR))) return;
+ if (taskconfig->dwFlags & TDF_SHOW_MARQUEE_PROGRESS_BAR) style |= PBS_MARQUEE;
+ dialog_info->progress_bar =
+ CreateWindowW(PROGRESS_CLASSW, NULL, style, 0, 0, 0, 0, dialog_info->hwnd, NULL, 0, NULL);
+}
+
static void taskdialog_add_button(struct taskdialog_info *dialog_info, HWND *button, INT id, const WCHAR *text,
BOOL custom_button)
{
@@ -464,6 +476,17 @@ static void taskdialog_layout(struct taskdialog_info *dialog_info)
/* Content */
taskdialog_label_layout(dialog_info, dialog_info->content, main_icon_right, dialog_width, &dialog_height, syslink);
+ /* Progress bar */
+ if (dialog_info->progress_bar)
+ {
+ x = main_icon_right + h_spacing;
+ y = dialog_height + v_spacing;
+ size.cx = dialog_width - x - h_spacing;
+ size.cy = GetSystemMetrics(SM_CYVSCROLL);
+ SetWindowPos(dialog_info->progress_bar, 0, x, y, size.cx, size.cy, SWP_NOZORDER);
+ dialog_height = y + size.cy;
+ }
+
dialog_height = max(dialog_height, main_icon_bottom);
/* Common and custom buttons */
@@ -598,6 +621,7 @@ static void taskdialog_init(struct taskdialog_info *dialog_info, HWND hwnd)
taskdialog_add_main_icon(dialog_info);
taskdialog_add_main_instruction(dialog_info);
taskdialog_add_content(dialog_info);
+ taskdialog_add_progress_bar(dialog_info);
taskdialog_add_buttons(dialog_info);
/* Set default button */
@@ -621,6 +645,7 @@ static INT_PTR CALLBACK taskdialog_proc(HWND hwnd, UINT msg, WPARAM wParam, LPAR
{
static const WCHAR taskdialog_info_propnameW[] = {'T','a','s','k','D','i','a','l','o','g','I','n','f','o',0};
struct taskdialog_info *dialog_info;
+ LRESULT result;
TRACE("hwnd=%p msg=0x%04x wparam=%lx lparam=%lx\n", hwnd, msg, wParam, lParam);
@@ -635,6 +660,26 @@ static INT_PTR CALLBACK taskdialog_proc(HWND hwnd, UINT msg, WPARAM wParam, LPAR
case TDM_ENABLE_BUTTON:
taskdialog_enable_button(dialog_info, wParam, lParam);
break;
+ case TDM_SET_MARQUEE_PROGRESS_BAR:
+ SendMessageW(dialog_info->progress_bar, PBM_SETMARQUEE, wParam, 0);
+ break;
+ case TDM_SET_PROGRESS_BAR_STATE:
+ result = SendMessageW(dialog_info->progress_bar, PBM_SETSTATE, wParam, 0);
+ SetWindowLongPtrW(hwnd, DWLP_MSGRESULT, result);
+ break;
+ case TDM_SET_PROGRESS_BAR_RANGE:
+ result = SendMessageW(dialog_info->progress_bar, PBM_SETRANGE, 0, lParam);
+ SetWindowLongPtrW(hwnd, DWLP_MSGRESULT, result);
+ break;
+ case TDM_SET_PROGRESS_BAR_POS:
+ result = 0;
+ if (!(dialog_info->taskconfig->dwFlags & TDF_SHOW_MARQUEE_PROGRESS_BAR))
+ result = SendMessageW(dialog_info->progress_bar, PBM_SETPOS, wParam, 0);
+ SetWindowLongPtrW(hwnd, DWLP_MSGRESULT, result);
+ break;
+ case TDM_SET_PROGRESS_BAR_MARQUEE:
+ SendMessageW(dialog_info->progress_bar, PBM_SETMARQUEE, wParam, lParam);
+ break;
case WM_INITDIALOG:
dialog_info = (struct taskdialog_info *)lParam;
diff --git a/dlls/comctl32/tests/taskdialog.c b/dlls/comctl32/tests/taskdialog.c
index cca700cd18..10cd3da794 100644
--- a/dlls/comctl32/tests/taskdialog.c
+++ b/dlls/comctl32/tests/taskdialog.c
@@ -373,6 +373,70 @@ static void test_timer(void)
pTaskDialogIndirect(&info, NULL, NULL, NULL);
}
+static HRESULT CALLBACK taskdialog_callback_proc_progress_bar(HWND hwnd, UINT notification, WPARAM wParam,
+ LPARAM lParam, LONG_PTR ref_data)
+{
+ unsigned long ret;
+ DWORD *flags = (DWORD *)ref_data;
+ if (notification == TDN_CREATED)
+ {
+ /* TDM_SET_PROGRESS_BAR_STATE */
+ ret = SendMessageW(hwnd, TDM_SET_PROGRESS_BAR_STATE, PBST_NORMAL, 0);
+ ok(ret == PBST_NORMAL, "Expect state: %d got state: %lx\n", PBST_NORMAL, ret);
+ ret = SendMessageW(hwnd, TDM_SET_PROGRESS_BAR_STATE, PBST_PAUSED, 0);
+ ok(ret == PBST_NORMAL, "Expect state: %d got state: %lx\n", PBST_NORMAL, ret);
+ ret = SendMessageW(hwnd, TDM_SET_PROGRESS_BAR_STATE, PBST_ERROR, 0);
+ /* Progress bar has fixme on handling PBM_SETSTATE message */
+ todo_wine ok(ret == PBST_PAUSED, "Expect state: %d got state: %lx\n", PBST_PAUSED, ret);
+ ret = SendMessageW(hwnd, TDM_SET_PROGRESS_BAR_STATE, PBST_NORMAL, 0);
+ todo_wine ok(ret == PBST_ERROR, "Expect state: %d got state: %lx\n", PBST_ERROR, ret);
+
+ /* TDM_SET_PROGRESS_BAR_RANGE */
+ ret = SendMessageW(hwnd, TDM_SET_PROGRESS_BAR_RANGE, 0, MAKELPARAM(0, 200));
+ ok(ret == MAKELONG(0, 100), "Expect range:%x got:%lx\n", MAKELONG(0, 100), ret);
+ ret = SendMessageW(hwnd, TDM_SET_PROGRESS_BAR_RANGE, 0, MAKELPARAM(0, 200));
+ ok(ret == MAKELONG(0, 200), "Expect range:%x got:%lx\n", MAKELONG(0, 200), ret);
+
+ /* TDM_SET_PROGRESS_BAR_POS */
+ if (*flags & TDF_SHOW_MARQUEE_PROGRESS_BAR)
+ {
+ ret = SendMessageW(hwnd, TDM_SET_PROGRESS_BAR_POS, 1, 0);
+ ok(ret == 0, "Expect position:%x got:%lx\n", 0, ret);
+ ret = SendMessageW(hwnd, TDM_SET_PROGRESS_BAR_POS, 2, 0);
+ ok(ret == 0, "Expect position:%x got:%lx\n", 0, ret);
+ }
+ else
+ {
+ ret = SendMessageW(hwnd, TDM_SET_PROGRESS_BAR_POS, 1, 0);
+ ok(ret == 0, "Expect position:%x got:%lx\n", 0, ret);
+ ret = SendMessageW(hwnd, TDM_SET_PROGRESS_BAR_POS, 2, 0);
+ ok(ret == 1, "Expect position:%x got:%lx\n", 1, ret);
+ }
+
+ SendMessageW(hwnd, TDM_CLICK_BUTTON, IDOK, 0);
+ }
+
+ return S_OK;
+}
+
+static void test_progress_bar(void)
+{
+ TASKDIALOGCONFIG info = {0};
+
+ info.cbSize = sizeof(TASKDIALOGCONFIG);
+ info.dwFlags = TDF_SHOW_PROGRESS_BAR;
+ info.pfCallback = taskdialog_callback_proc_progress_bar;
+ info.lpCallbackData = (LONG_PTR)&info.dwFlags;
+ info.dwCommonButtons = TDCBF_OK_BUTTON;
+ pTaskDialogIndirect(&info, NULL, NULL, NULL);
+
+ info.dwFlags = TDF_SHOW_MARQUEE_PROGRESS_BAR;
+ pTaskDialogIndirect(&info, NULL, NULL, NULL);
+
+ info.dwFlags = TDF_SHOW_PROGRESS_BAR | TDF_SHOW_MARQUEE_PROGRESS_BAR;
+ pTaskDialogIndirect(&info, NULL, NULL, NULL);
+}
+
START_TEST(taskdialog)
{
ULONG_PTR ctx_cookie;
@@ -411,6 +475,7 @@ START_TEST(taskdialog)
test_buttons();
test_help();
test_timer();
+ test_progress_bar();
unload_v6_module(ctx_cookie, hCtx);
}
--
2.17.1
June 14, 2018
[PATCH 4/5] comctl32/taskdialog: Add support for hyperlink.
by Zhiyi Zhang
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
---
dlls/comctl32/taskdialog.c | 51 ++++++++++++++++++++++++++++++--------
1 file changed, 41 insertions(+), 10 deletions(-)
diff --git a/dlls/comctl32/taskdialog.c b/dlls/comctl32/taskdialog.c
index 59a915977c..91c8af019b 100644
--- a/dlls/comctl32/taskdialog.c
+++ b/dlls/comctl32/taskdialog.c
@@ -222,7 +222,13 @@ static WCHAR *taskdialog_gettext(struct taskdialog_info *dialog_info, BOOL user_
return ret;
}
-static void taskdialog_get_label_size(struct taskdialog_info *dialog_info, HWND hwnd, LONG max_width, SIZE *size)
+static BOOL taskdialog_hyperlink_enabled(struct taskdialog_info *dialog_info)
+{
+ return dialog_info->taskconfig->dwFlags & TDF_ENABLE_HYPERLINKS;
+}
+
+static void taskdialog_get_label_size(struct taskdialog_info *dialog_info, HWND hwnd, LONG max_width, SIZE *size,
+ BOOL syslink)
{
DWORD style = DT_EXPANDTABS | DT_CALCRECT | DT_WORDBREAK;
HFONT hfont, old_hfont;
@@ -231,6 +237,12 @@ static void taskdialog_get_label_size(struct taskdialog_info *dialog_info, HWND
WCHAR text[1024];
INT text_length;
+ if (syslink)
+ {
+ SendMessageW(hwnd, LM_GETIDEALSIZE, max_width, (LPARAM)size);
+ return;
+ }
+
if (dialog_info->taskconfig->dwFlags & TDF_RTL_LAYOUT)
style |= DT_RIGHT | DT_RTLREADING;
else
@@ -296,15 +308,19 @@ static void taskdialog_add_main_icon(struct taskdialog_info *dialog_info)
taskdialog_set_icon(dialog_info, TDIE_ICON_MAIN, dialog_info->taskconfig->u.hMainIcon);
}
-static HWND taskdialog_create_label(struct taskdialog_info *dialog_info, const WCHAR *text, HFONT font)
+static HWND taskdialog_create_label(struct taskdialog_info *dialog_info, const WCHAR *text, HFONT font, BOOL syslink)
{
WCHAR *textW;
HWND hwnd;
+ const WCHAR *class;
+ DWORD style = WS_CHILD | WS_VISIBLE;
if (!text) return NULL;
+ class = syslink ? WC_LINK : WC_STATICW;
+ if (syslink) style |= WS_TABSTOP;
textW = taskdialog_gettext(dialog_info, TRUE, text);
- hwnd = CreateWindowW(WC_STATICW, textW, WS_CHILD | WS_VISIBLE, 0, 0, 0, 0, dialog_info->hwnd, NULL, 0, NULL);
+ hwnd = CreateWindowW(class, textW, style, 0, 0, 0, 0, dialog_info->hwnd, NULL, 0, NULL);
if (textW) Free(textW);
SendMessageW(hwnd, WM_SETFONT, (WPARAM)font, 0);
@@ -326,12 +342,13 @@ static void taskdialog_add_main_instruction(struct taskdialog_info *dialog_info)
dialog_info->main_instruction_font = CreateFontIndirectW(&ncm.lfMessageFont);
dialog_info->main_instruction =
- taskdialog_create_label(dialog_info, taskconfig->pszMainInstruction, dialog_info->main_instruction_font);
+ taskdialog_create_label(dialog_info, taskconfig->pszMainInstruction, dialog_info->main_instruction_font, FALSE);
}
static void taskdialog_add_content(struct taskdialog_info *dialog_info)
{
- dialog_info->content = taskdialog_create_label(dialog_info, dialog_info->taskconfig->pszContent, dialog_info->font);
+ dialog_info->content = taskdialog_create_label(dialog_info, dialog_info->taskconfig->pszContent, dialog_info->font,
+ taskdialog_hyperlink_enabled(dialog_info));
}
static void taskdialog_add_button(struct taskdialog_info *dialog_info, HWND *button, INT id, const WCHAR *text,
@@ -387,7 +404,7 @@ static void taskdialog_add_buttons(struct taskdialog_info *dialog_info)
}
static void taskdialog_label_layout(struct taskdialog_info *dialog_info, HWND hwnd, INT start_x, LONG dialog_width,
- LONG *dialog_height)
+ LONG *dialog_height, BOOL syslink)
{
LONG x, y, max_width;
SIZE size;
@@ -397,7 +414,7 @@ static void taskdialog_label_layout(struct taskdialog_info *dialog_info, HWND hw
x = start_x + dialog_info->m.h_spacing;
y = *dialog_height + dialog_info->m.v_spacing;
max_width = dialog_width - x - dialog_info->m.h_spacing;
- taskdialog_get_label_size(dialog_info, hwnd, max_width, &size);
+ taskdialog_get_label_size(dialog_info, hwnd, max_width, &size, syslink);
SetWindowPos(hwnd, 0, x, y, size.cx, size.cy, SWP_NOZORDER);
*dialog_height = y + size.cy;
}
@@ -405,6 +422,7 @@ static void taskdialog_label_layout(struct taskdialog_info *dialog_info, HWND hw
static void taskdialog_layout(struct taskdialog_info *dialog_info)
{
const TASKDIALOGCONFIG *taskconfig = dialog_info->taskconfig;
+ BOOL syslink = taskdialog_hyperlink_enabled(dialog_info);
static BOOL first_time = TRUE;
RECT ref_rect;
LONG screen_width, dialog_width, dialog_height = 0;
@@ -440,10 +458,11 @@ static void taskdialog_layout(struct taskdialog_info *dialog_info)
}
/* Main instruction */
- taskdialog_label_layout(dialog_info, dialog_info->main_instruction, main_icon_right, dialog_width, &dialog_height);
+ taskdialog_label_layout(dialog_info, dialog_info->main_instruction, main_icon_right, dialog_width, &dialog_height,
+ FALSE);
/* Content */
- taskdialog_label_layout(dialog_info, dialog_info->content, main_icon_right, dialog_width, &dialog_height);
+ taskdialog_label_layout(dialog_info, dialog_info->content, main_icon_right, dialog_width, &dialog_height, syslink);
dialog_height = max(dialog_height, main_icon_bottom);
@@ -456,7 +475,7 @@ static void taskdialog_layout(struct taskdialog_info *dialog_info)
taskdialog_du_to_px(dialog_info, &button_min_width, &button_height);
for (i = 0; i < dialog_info->button_count; i++)
{
- taskdialog_get_label_size(dialog_info, dialog_info->buttons[i], dialog_width - h_spacing * 2, &size);
+ taskdialog_get_label_size(dialog_info, dialog_info->buttons[i], dialog_width - h_spacing * 2, &size, FALSE);
button_layout_infos[i].width = max(size.cx, button_min_width);
}
@@ -643,6 +662,18 @@ static INT_PTR CALLBACK taskdialog_proc(HWND hwnd, UINT msg, WPARAM wParam, LPAR
dialog_info->last_timer_tick = GetTickCount();
}
break;
+ case WM_NOTIFY:
+ {
+ PNMLINK pnmLink = (PNMLINK)lParam;
+ HWND hwndFrom = pnmLink->hdr.hwndFrom;
+ if ((taskdialog_hyperlink_enabled(dialog_info)) && (hwndFrom == dialog_info->content)
+ && (pnmLink->hdr.code == NM_CLICK || pnmLink->hdr.code == NM_RETURN))
+ {
+ taskdialog_notify(dialog_info, TDN_HYPERLINK_CLICKED, 0, (LPARAM)pnmLink->item.szUrl);
+ break;
+ }
+ return FALSE;
+ }
case WM_DESTROY:
taskdialog_notify(dialog_info, TDN_DESTROYED, 0, 0);
RemovePropW(hwnd, taskdialog_info_propnameW);
--
2.17.1
June 14, 2018
[PATCH 3/5] comctl32/taskdialog: Add support for loading standard icons.
by Zhiyi Zhang
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
---
dlls/comctl32/taskdialog.c | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/dlls/comctl32/taskdialog.c b/dlls/comctl32/taskdialog.c
index 14c6ccb6e4..59a915977c 100644
--- a/dlls/comctl32/taskdialog.c
+++ b/dlls/comctl32/taskdialog.c
@@ -247,6 +247,20 @@ static void taskdialog_get_label_size(struct taskdialog_info *dialog_info, HWND
ReleaseDC(hwnd, hdc);
}
+static ULONG_PTR taskdialog_get_standard_icon(LPCWSTR icon)
+{
+ if (icon == TD_WARNING_ICON)
+ return IDI_WARNING;
+ else if (icon == TD_ERROR_ICON)
+ return IDI_ERROR;
+ else if (icon == TD_INFORMATION_ICON)
+ return IDI_INFORMATION;
+ else if (icon == TD_SHIELD_ICON)
+ return IDI_SHIELD;
+ else
+ return (ULONG_PTR)icon;
+}
+
static void taskdialog_set_icon(struct taskdialog_info *dialog_info, INT element, HICON icon)
{
DWORD flags = dialog_info->taskconfig->dwFlags;
@@ -259,6 +273,9 @@ static void taskdialog_set_icon(struct taskdialog_info *dialog_info, INT element
else
{
hicon = LoadImageW(dialog_info->taskconfig->hInstance, (LPCWSTR)icon, IMAGE_ICON, 0, 0, LR_SHARED | LR_DEFAULTSIZE);
+ if (!hicon)
+ hicon = LoadImageW(NULL, (LPCWSTR)taskdialog_get_standard_icon((LPCWSTR)icon), IMAGE_ICON, 0, 0,
+ LR_SHARED | LR_DEFAULTSIZE);
}
if (!hicon) return;
--
2.17.1
June 14, 2018
[PATCH 2/5] comctl32/taskdialog: Add support for main icon.
by Zhiyi Zhang
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
---
dlls/comctl32/taskdialog.c | 55 ++++++++++++++++++++++++++++++++++++--
1 file changed, 53 insertions(+), 2 deletions(-)
diff --git a/dlls/comctl32/taskdialog.c b/dlls/comctl32/taskdialog.c
index b6baffb3ea..14c6ccb6e4 100644
--- a/dlls/comctl32/taskdialog.c
+++ b/dlls/comctl32/taskdialog.c
@@ -54,6 +54,7 @@ struct taskdialog_info
HFONT font;
HFONT main_instruction_font;
/* Control handles */
+ HWND main_icon;
HWND main_instruction;
HWND content;
HWND *buttons;
@@ -246,6 +247,38 @@ static void taskdialog_get_label_size(struct taskdialog_info *dialog_info, HWND
ReleaseDC(hwnd, hdc);
}
+static void taskdialog_set_icon(struct taskdialog_info *dialog_info, INT element, HICON icon)
+{
+ DWORD flags = dialog_info->taskconfig->dwFlags;
+ HICON hicon;
+
+ if (!icon) return;
+
+ if ((flags & TDF_USE_HICON_MAIN) && element == TDIE_ICON_MAIN)
+ hicon = icon;
+ else
+ {
+ hicon = LoadImageW(dialog_info->taskconfig->hInstance, (LPCWSTR)icon, IMAGE_ICON, 0, 0, LR_SHARED | LR_DEFAULTSIZE);
+ }
+
+ if (!hicon) return;
+
+ if (element == TDIE_ICON_MAIN)
+ {
+ SendMessageW(dialog_info->hwnd, WM_SETICON, (WPARAM)ICON_BIG, (LPARAM)hicon);
+ SendMessageW(dialog_info->main_icon, STM_SETICON, (WPARAM)hicon, 0);
+ }
+}
+
+static void taskdialog_add_main_icon(struct taskdialog_info *dialog_info)
+{
+ if (!dialog_info->taskconfig->u.hMainIcon) return;
+
+ dialog_info->main_icon =
+ CreateWindowW(WC_STATICW, NULL, WS_CHILD | WS_VISIBLE | SS_ICON, 0, 0, 0, 0, dialog_info->hwnd, NULL, 0, NULL);
+ taskdialog_set_icon(dialog_info, TDIE_ICON_MAIN, dialog_info->taskconfig->u.hMainIcon);
+}
+
static HWND taskdialog_create_label(struct taskdialog_info *dialog_info, const WCHAR *text, HFONT font)
{
WCHAR *textW;
@@ -359,6 +392,7 @@ static void taskdialog_layout(struct taskdialog_info *dialog_info)
RECT ref_rect;
LONG screen_width, dialog_width, dialog_height = 0;
LONG h_spacing, v_spacing;
+ LONG main_icon_right, main_icon_bottom;
struct button_layout_info *button_layout_infos;
LONG button_min_width, button_height;
LONG *line_widths, line_count, align;
@@ -374,11 +408,27 @@ static void taskdialog_layout(struct taskdialog_info *dialog_info)
h_spacing = dialog_info->m.h_spacing;
v_spacing = dialog_info->m.v_spacing;
+ /* Main icon */
+ main_icon_right = 0;
+ main_icon_bottom = 0;
+ if (dialog_info->main_icon)
+ {
+ x = h_spacing;
+ y = dialog_height + v_spacing;
+ size.cx = GetSystemMetrics(SM_CXICON);
+ size.cy = GetSystemMetrics(SM_CYICON);
+ SetWindowPos(dialog_info->main_icon, 0, x, y, size.cx, size.cy, SWP_NOZORDER);
+ main_icon_right = x + size.cx;
+ main_icon_bottom = y + size.cy;
+ }
+
/* Main instruction */
- taskdialog_label_layout(dialog_info, dialog_info->main_instruction, 0, dialog_width, &dialog_height);
+ taskdialog_label_layout(dialog_info, dialog_info->main_instruction, main_icon_right, dialog_width, &dialog_height);
/* Content */
- taskdialog_label_layout(dialog_info, dialog_info->content, 0, dialog_width, &dialog_height);
+ taskdialog_label_layout(dialog_info, dialog_info->content, main_icon_right, dialog_width, &dialog_height);
+
+ dialog_height = max(dialog_height, main_icon_bottom);
/* Common and custom buttons */
button_layout_infos = Alloc(dialog_info->button_count * sizeof(*button_layout_infos));
@@ -509,6 +559,7 @@ static void taskdialog_init(struct taskdialog_info *dialog_info, HWND hwnd)
dialog_info->last_timer_tick = GetTickCount();
}
+ taskdialog_add_main_icon(dialog_info);
taskdialog_add_main_instruction(dialog_info);
taskdialog_add_content(dialog_info);
taskdialog_add_buttons(dialog_info);
--
2.17.1
June 14, 2018
[PATCH 1/5] comctl32/taskdialog: Add support for TDM_ENABLE_BUTTON.
by Zhiyi Zhang
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
---
dlls/comctl32/taskdialog.c | 23 +++++++++++++++++++++++
1 file changed, 23 insertions(+)
diff --git a/dlls/comctl32/taskdialog.c b/dlls/comctl32/taskdialog.c
index 7a09b8a6d2..b6baffb3ea 100644
--- a/dlls/comctl32/taskdialog.c
+++ b/dlls/comctl32/taskdialog.c
@@ -163,6 +163,26 @@ static DLGTEMPLATE *create_taskdialog_template(const TASKDIALOGCONFIG *taskconfi
return template;
}
+static HWND taskdialog_find_button(HWND *buttons, INT count, INT id)
+{
+ INT button_id;
+ INT i;
+
+ for (i = 0; i < count; i++)
+ {
+ button_id = GetWindowLongW(buttons[i], GWLP_ID);
+ if (button_id == id) return buttons[i];
+ }
+
+ return NULL;
+}
+
+static void taskdialog_enable_button(const struct taskdialog_info *dialog_info, INT id, BOOL enable)
+{
+ HWND hwnd = taskdialog_find_button(dialog_info->buttons, dialog_info->button_count, id);
+ if (hwnd) EnableWindow(hwnd, enable);
+}
+
static HRESULT taskdialog_notify(struct taskdialog_info *dialog_info, UINT notification, WPARAM wparam, LPARAM lparam)
{
const TASKDIALOGCONFIG *taskconfig = dialog_info->taskconfig;
@@ -525,6 +545,9 @@ static INT_PTR CALLBACK taskdialog_proc(HWND hwnd, UINT msg, WPARAM wParam, LPAR
case TDM_CLICK_BUTTON:
taskdialog_on_button_click(dialog_info, LOWORD(wParam));
break;
+ case TDM_ENABLE_BUTTON:
+ taskdialog_enable_button(dialog_info, wParam, lParam);
+ break;
case WM_INITDIALOG:
dialog_info = (struct taskdialog_info *)lParam;
--
2.17.1
June 14, 2018
Re: [PATCH 7/7] wsdapi: Build types list when parsing Probe message.
by Huw Davies
Signed-off-by: Huw Davies <huw(a)codeweavers.com>
June 14, 2018
Re: [PATCH 6/7] wsdapi: Implement probe message parsing.
by Huw Davies
Signed-off-by: Huw Davies <huw(a)codeweavers.com>
June 14, 2018
Re: [PATCH 5/7] wsdapi: Return "any" headers in read_message.
by Huw Davies
Signed-off-by: Huw Davies <huw(a)codeweavers.com>
June 14, 2018
Re: [PATCH 4/7] wsdapi: Add initial support for reading messages; identify Probe message.
by Huw Davies
Signed-off-by: Huw Davies <huw(a)codeweavers.com>
June 14, 2018
Re: [PATCH 3/7] wsdapi: Add stub for Probe message parsing, prepare notification sink message.
by Huw Davies
Signed-off-by: Huw Davies <huw(a)codeweavers.com>
June 14, 2018