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
July 2020
- 75 participants
- 1942 messages
[PATCH 5/5] evr: Added MFCreateVideoMixerAndPresenter().
by Nikolay Sivov
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
dlls/evr/evr.spec | 2 +-
dlls/evr/main.c | 28 ++++++++++++++++++++++++++++
dlls/evr/tests/evr.c | 13 +++++++++++++
include/evr.idl | 3 ++-
4 files changed, 44 insertions(+), 2 deletions(-)
diff --git a/dlls/evr/evr.spec b/dlls/evr/evr.spec
index e46cb04f644..73cbf05b461 100644
--- a/dlls/evr/evr.spec
+++ b/dlls/evr/evr.spec
@@ -14,7 +14,7 @@
@ stub MFCreateVideoMediaTypeFromVideoInfoHeader2
@ stub MFCreateVideoMediaTypeFromVideoInfoHeader
@ stdcall MFCreateVideoMixer(ptr ptr ptr ptr)
-@ stub MFCreateVideoMixerAndPresenter
+@ stdcall MFCreateVideoMixerAndPresenter(ptr ptr ptr ptr ptr ptr)
@ stub MFCreateVideoOTA
@ stub MFCreateVideoPresenter2
@ stdcall MFCreateVideoPresenter(ptr ptr ptr ptr)
diff --git a/dlls/evr/main.c b/dlls/evr/main.c
index 2c6db8430ba..301330a51e2 100644
--- a/dlls/evr/main.c
+++ b/dlls/evr/main.c
@@ -196,3 +196,31 @@ HRESULT WINAPI DllUnregisterServer(void)
{
return __wine_unregister_resources(instance_evr);
}
+
+HRESULT WINAPI MFCreateVideoMixerAndPresenter(IUnknown *mixer_outer, IUnknown *presenter_outer,
+ REFIID riid_mixer, void **mixer, REFIID riid_presenter, void **presenter)
+{
+ HRESULT hr;
+
+ TRACE("%p, %p, %s, %p, %s, %p.\n", mixer_outer, presenter_outer, debugstr_guid(riid_mixer), mixer,
+ debugstr_guid(riid_presenter), presenter);
+
+ if (!mixer || !presenter)
+ return E_POINTER;
+
+ *mixer = *presenter = NULL;
+
+ if (SUCCEEDED(hr = CoCreateInstance(&CLSID_MFVideoMixer9, mixer_outer, CLSCTX_INPROC_SERVER, riid_mixer, mixer)))
+ hr = CoCreateInstance(&CLSID_MFVideoPresenter9, presenter_outer, CLSCTX_INPROC_SERVER, riid_presenter, presenter);
+
+ if (FAILED(hr))
+ {
+ if (*mixer)
+ IUnknown_Release((IUnknown *)*mixer);
+ if (*presenter)
+ IUnknown_Release((IUnknown *)*presenter);
+ *mixer = *presenter = NULL;
+ }
+
+ return hr;
+}
diff --git a/dlls/evr/tests/evr.c b/dlls/evr/tests/evr.c
index 1046e70312d..b9f86eb2529 100644
--- a/dlls/evr/tests/evr.c
+++ b/dlls/evr/tests/evr.c
@@ -950,6 +950,18 @@ static void test_default_presenter(void)
IMFVideoPresenter_Release(presenter);
}
+static void test_MFCreateVideoMixerAndPresenter(void)
+{
+ IUnknown *mixer, *presenter;
+ HRESULT hr;
+
+ hr = MFCreateVideoMixerAndPresenter(NULL, NULL, &IID_IUnknown, (void **)&mixer, &IID_IUnknown, (void **)&presenter);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+ IUnknown_Release(mixer);
+ IUnknown_Release(presenter);
+}
+
START_TEST(evr)
{
CoInitialize(NULL);
@@ -965,6 +977,7 @@ START_TEST(evr)
test_default_mixer_type_negotiation();
test_surface_sample();
test_default_presenter();
+ test_MFCreateVideoMixerAndPresenter();
CoUninitialize();
}
diff --git a/include/evr.idl b/include/evr.idl
index 384a051944c..8628e111a31 100644
--- a/include/evr.idl
+++ b/include/evr.idl
@@ -299,7 +299,8 @@ cpp_quote("DEFINE_GUID(MR_VIDEO_MIXER_SERVICE, 0x073cd2fc, 0x6cf4, 0x40b7, 0x88,
cpp_quote("DEFINE_GUID(MR_VIDEO_ACCELERATION_SERVICE, 0xefef5175, 0x5c7d, 0x4ce2, 0xbb, 0xbd, 0x34, 0xff, 0x8b, 0xca, 0x65, 0x54);")
cpp_quote("DEFINE_GUID(MR_BUFFER_SERVICE, 0xa562248c, 0x9ac6, 0x4ffc, 0x9f, 0xba, 0x3a, 0xf8, 0xf8, 0xad, 0x1a, 0x4d);")
cpp_quote("DEFINE_GUID(VIDEO_ZOOM_RECT, 0x7aaa1638, 0x1b7f, 0x4c93, 0xbd, 0x89, 0x5b, 0x9c, 0x9f, 0xb6, 0xfc, 0xf0);")
-
cpp_quote("HRESULT WINAPI MFCreateVideoMixer(IUnknown *owner, REFIID riid_device, REFIID riid, void **obj);")
+cpp_quote("HRESULT WINAPI MFCreateVideoMixerAndPresenter(IUnknown *mixer_outer, IUnknown *presenter_outer, ")
+cpp_quote(" REFIID riid_mixer, void **mixer, REFIID riid_presenter, void **presenter);")
cpp_quote("HRESULT WINAPI MFCreateVideoPresenter(IUnknown *owner, REFIID riid_device, REFIID riid, void **obj);")
cpp_quote("HRESULT WINAPI MFCreateVideoSampleFromSurface(IUnknown *surface, IMFSample **sample);")
--
2.27.0
July 1, 2020
[PATCH 4/5] evr: Add aggregation support for default mixer object.
by Nikolay Sivov
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
dlls/evr/mixer.c | 58 +++++++++++++++++++++++++++++++++++---------
dlls/evr/tests/evr.c | 17 +++++++++++++
2 files changed, 63 insertions(+), 12 deletions(-)
diff --git a/dlls/evr/mixer.c b/dlls/evr/mixer.c
index 23994375d45..c8bd300b0d3 100644
--- a/dlls/evr/mixer.c
+++ b/dlls/evr/mixer.c
@@ -60,6 +60,8 @@ struct video_mixer
IMFVideoMixerBitmap IMFVideoMixerBitmap_iface;
IMFVideoPositionMapper IMFVideoPositionMapper_iface;
IMFVideoProcessor IMFVideoProcessor_iface;
+ IUnknown IUnknown_inner;
+ IUnknown *outer_unk;
LONG refcount;
struct input_stream inputs[MAX_MIXER_INPUT_STREAMS];
@@ -74,6 +76,11 @@ struct video_mixer
CRITICAL_SECTION cs;
};
+static struct video_mixer *impl_from_IUnknown(IUnknown *iface)
+{
+ return CONTAINING_RECORD(iface, struct video_mixer, IUnknown_inner);
+}
+
static struct video_mixer *impl_from_IMFTransform(IMFTransform *iface)
{
return CONTAINING_RECORD(iface, struct video_mixer, IMFTransform_iface);
@@ -155,17 +162,20 @@ static void video_mixer_clear_types(struct video_mixer *mixer)
mixer->output.media_type = NULL;
}
-static HRESULT WINAPI video_mixer_transform_QueryInterface(IMFTransform *iface, REFIID riid, void **obj)
+static HRESULT WINAPI video_mixer_inner_QueryInterface(IUnknown *iface, REFIID riid, void **obj)
{
- struct video_mixer *mixer = impl_from_IMFTransform(iface);
+ struct video_mixer *mixer = impl_from_IUnknown(iface);
TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), obj);
- if (IsEqualIID(riid, &IID_IMFTransform) ||
- IsEqualIID(riid, &IID_IUnknown))
+ if (IsEqualIID(riid, &IID_IUnknown))
{
*obj = iface;
}
+ else if (IsEqualIID(riid, &IID_IMFTransform))
+ {
+ *obj = &mixer->IMFTransform_iface;
+ }
else if (IsEqualIID(riid, &IID_IMFVideoDeviceID))
{
*obj = &mixer->IMFVideoDeviceID_iface;
@@ -206,9 +216,9 @@ static HRESULT WINAPI video_mixer_transform_QueryInterface(IMFTransform *iface,
return S_OK;
}
-static ULONG WINAPI video_mixer_transform_AddRef(IMFTransform *iface)
+static ULONG WINAPI video_mixer_inner_AddRef(IUnknown *iface)
{
- struct video_mixer *mixer = impl_from_IMFTransform(iface);
+ struct video_mixer *mixer = impl_from_IUnknown(iface);
ULONG refcount = InterlockedIncrement(&mixer->refcount);
TRACE("%p, refcount %u.\n", iface, refcount);
@@ -216,9 +226,9 @@ static ULONG WINAPI video_mixer_transform_AddRef(IMFTransform *iface)
return refcount;
}
-static ULONG WINAPI video_mixer_transform_Release(IMFTransform *iface)
+static ULONG WINAPI video_mixer_inner_Release(IUnknown *iface)
{
- struct video_mixer *mixer = impl_from_IMFTransform(iface);
+ struct video_mixer *mixer = impl_from_IUnknown(iface);
ULONG refcount = InterlockedDecrement(&mixer->refcount);
unsigned int i;
@@ -241,6 +251,31 @@ static ULONG WINAPI video_mixer_transform_Release(IMFTransform *iface)
return refcount;
}
+static const IUnknownVtbl video_mixer_inner_vtbl =
+{
+ video_mixer_inner_QueryInterface,
+ video_mixer_inner_AddRef,
+ video_mixer_inner_Release,
+};
+
+static HRESULT WINAPI video_mixer_transform_QueryInterface(IMFTransform *iface, REFIID riid, void **obj)
+{
+ struct video_mixer *mixer = impl_from_IMFTransform(iface);
+ return IUnknown_QueryInterface(mixer->outer_unk, riid, obj);
+}
+
+static ULONG WINAPI video_mixer_transform_AddRef(IMFTransform *iface)
+{
+ struct video_mixer *mixer = impl_from_IMFTransform(iface);
+ return IUnknown_AddRef(mixer->outer_unk);
+}
+
+static ULONG WINAPI video_mixer_transform_Release(IMFTransform *iface)
+{
+ struct video_mixer *mixer = impl_from_IMFTransform(iface);
+ return IUnknown_Release(mixer->outer_unk);
+}
+
static HRESULT WINAPI video_mixer_transform_GetStreamLimits(IMFTransform *iface, DWORD *input_minimum,
DWORD *input_maximum, DWORD *output_minimum, DWORD *output_maximum)
{
@@ -1251,9 +1286,6 @@ HRESULT evr_mixer_create(IUnknown *outer, void **out)
{
struct video_mixer *object;
- if (outer)
- return E_NOINTERFACE;
-
if (!(object = calloc(1, sizeof(*object))))
return E_OUTOFMEMORY;
@@ -1265,12 +1297,14 @@ HRESULT evr_mixer_create(IUnknown *outer, void **out)
object->IMFVideoMixerBitmap_iface.lpVtbl = &video_mixer_bitmap_vtbl;
object->IMFVideoPositionMapper_iface.lpVtbl = &video_mixer_position_mapper_vtbl;
object->IMFVideoProcessor_iface.lpVtbl = &video_mixer_processor_vtbl;
+ object->IUnknown_inner.lpVtbl = &video_mixer_inner_vtbl;
+ object->outer_unk = outer ? outer : &object->IUnknown_inner;
object->refcount = 1;
object->input_count = 1;
video_mixer_init_input(&object->inputs[0]);
InitializeCriticalSection(&object->cs);
- *out = &object->IMFTransform_iface;
+ *out = &object->IUnknown_inner;
return S_OK;
}
diff --git a/dlls/evr/tests/evr.c b/dlls/evr/tests/evr.c
index dd3fbbe0289..1046e70312d 100644
--- a/dlls/evr/tests/evr.c
+++ b/dlls/evr/tests/evr.c
@@ -119,6 +119,7 @@ static void test_aggregation(void)
IBaseFilter *filter, *filter2;
IMFVideoPresenter *presenter;
IUnknown *unk, *unk2;
+ IMFTransform *mixer;
HRESULT hr;
ULONG ref;
@@ -191,6 +192,22 @@ static void test_aggregation(void)
IUnknown_Release(unk);
}
+
+ /* Default mixer. */
+ presenter = (void *)0xdeadbeef;
+ hr = CoCreateInstance(&CLSID_MFVideoMixer9, &test_outer, CLSCTX_INPROC_SERVER, &IID_IMFTransform,
+ (void **)&mixer);
+ ok(hr == E_NOINTERFACE, "Unexpected hr %#x.\n", hr);
+ ok(!mixer, "Got interface %p.\n", mixer);
+
+ hr = CoCreateInstance(&CLSID_MFVideoMixer9, &test_outer, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void **)&unk);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+ ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref);
+ ok(unk != &test_outer, "Returned IUnknown should not be outer IUnknown.\n");
+ ref = get_refcount(unk);
+ ok(ref == 1, "Got unexpected refcount %d.\n", ref);
+
+ IUnknown_Release(unk);
}
#define check_interface(a, b, c) check_interface_(__LINE__, a, b, c)
--
2.27.0
July 1, 2020
[PATCH 3/5] evr: Partially implement InitServicePointers() for the presenter.
by Nikolay Sivov
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
dlls/evr/presenter.c | 71 ++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 68 insertions(+), 3 deletions(-)
diff --git a/dlls/evr/presenter.c b/dlls/evr/presenter.c
index c70b83d0727..a7da0704927 100644
--- a/dlls/evr/presenter.c
+++ b/dlls/evr/presenter.c
@@ -50,6 +50,10 @@ struct video_presenter
IUnknown *outer_unk;
LONG refcount;
+ IMFTransform *mixer;
+ IMFClock *clock;
+ IMediaEventSink *event_sink;
+
unsigned int state;
CRITICAL_SECTION cs;
};
@@ -136,6 +140,19 @@ static ULONG WINAPI video_presenter_inner_AddRef(IUnknown *iface)
return refcount;
}
+static void video_presenter_clear_container(struct video_presenter *presenter)
+{
+ if (presenter->clock)
+ IMFClock_Release(presenter->clock);
+ if (presenter->mixer)
+ IMFTransform_Release(presenter->mixer);
+ if (presenter->event_sink)
+ IMediaEventSink_Release(presenter->event_sink);
+ presenter->clock = NULL;
+ presenter->mixer = NULL;
+ presenter->event_sink = NULL;
+}
+
static ULONG WINAPI video_presenter_inner_Release(IUnknown *iface)
{
struct video_presenter *presenter = impl_from_IUnknown(iface);
@@ -145,6 +162,7 @@ static ULONG WINAPI video_presenter_inner_Release(IUnknown *iface)
if (!refcount)
{
+ video_presenter_clear_container(presenter);
DeleteCriticalSection(&presenter->cs);
heap_free(presenter);
}
@@ -324,9 +342,53 @@ static ULONG WINAPI video_presenter_service_client_Release(IMFTopologyServiceLoo
static HRESULT WINAPI video_presenter_service_client_InitServicePointers(IMFTopologyServiceLookupClient *iface,
IMFTopologyServiceLookup *service_lookup)
{
- FIXME("%p, %p.\n", iface, service_lookup);
+ struct video_presenter *presenter = impl_from_IMFTopologyServiceLookupClient(iface);
+ unsigned int count;
+ HRESULT hr = S_OK;
- return E_NOTIMPL;
+ TRACE("%p, %p.\n", iface, service_lookup);
+
+ if (!service_lookup)
+ return E_POINTER;
+
+ EnterCriticalSection(&presenter->cs);
+
+ if (presenter->state == PRESENTER_STATE_STARTED ||
+ presenter->state == PRESENTER_STATE_PAUSED)
+ {
+ hr = MF_E_INVALIDREQUEST;
+ }
+ else
+ {
+ video_presenter_clear_container(presenter);
+
+ count = 1;
+ IMFTopologyServiceLookup_LookupService(service_lookup, MF_SERVICE_LOOKUP_GLOBAL, 0,
+ &MR_VIDEO_RENDER_SERVICE, &IID_IMFClock, (void **)&presenter->clock, &count);
+
+ count = 1;
+ if (SUCCEEDED(hr = IMFTopologyServiceLookup_LookupService(service_lookup, MF_SERVICE_LOOKUP_GLOBAL, 0,
+ &MR_VIDEO_MIXER_SERVICE, &IID_IMFTransform, (void **)&presenter->mixer, &count)))
+ {
+ /* FIXME: presumably should validate mixer's device id. */
+ }
+ else
+ WARN("Failed to get mixer interface, hr %#x.\n", hr);
+
+ count = 1;
+ if (FAILED(hr = IMFTopologyServiceLookup_LookupService(service_lookup, MF_SERVICE_LOOKUP_GLOBAL, 0,
+ &MR_VIDEO_RENDER_SERVICE, &IID_IMediaEventSink, (void **)&presenter->event_sink, &count)))
+ {
+ WARN("Failed to get renderer event sink, hr %#x.\n", hr);
+ }
+
+ if (SUCCEEDED(hr))
+ presenter->state = PRESENTER_STATE_STOPPED;
+ }
+
+ LeaveCriticalSection(&presenter->cs);
+
+ return hr;
}
static HRESULT WINAPI video_presenter_service_client_ReleaseServicePointers(IMFTopologyServiceLookupClient *iface)
@@ -336,7 +398,10 @@ static HRESULT WINAPI video_presenter_service_client_ReleaseServicePointers(IMFT
TRACE("%p.\n", iface);
EnterCriticalSection(&presenter->cs);
+
presenter->state = PRESENTER_STATE_SHUT_DOWN;
+ video_presenter_clear_container(presenter);
+
LeaveCriticalSection(&presenter->cs);
return S_OK;
@@ -527,7 +592,7 @@ HRESULT evr_presenter_create(IUnknown *outer, void **out)
{
struct video_presenter *object;
- if (!(object = heap_alloc(sizeof(*object))))
+ if (!(object = heap_alloc_zero(sizeof(*object))))
return E_OUTOFMEMORY;
object->IMFVideoPresenter_iface.lpVtbl = &video_presenter_vtbl;
--
2.27.0
July 1, 2020
[PATCH 2/5] evr: Implement presenter state tracking methods.
by Nikolay Sivov
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
dlls/evr/presenter.c | 63 +++++++++++++++++++++++++++++++++++++-------
1 file changed, 53 insertions(+), 10 deletions(-)
diff --git a/dlls/evr/presenter.c b/dlls/evr/presenter.c
index 29167d364df..c70b83d0727 100644
--- a/dlls/evr/presenter.c
+++ b/dlls/evr/presenter.c
@@ -31,6 +31,14 @@
WINE_DEFAULT_DEBUG_CHANNEL(evr);
+enum presenter_state
+{
+ PRESENTER_STATE_SHUT_DOWN = 0,
+ PRESENTER_STATE_STARTED,
+ PRESENTER_STATE_STOPPED,
+ PRESENTER_STATE_PAUSED,
+};
+
struct video_presenter
{
IMFVideoPresenter IMFVideoPresenter_iface;
@@ -41,6 +49,9 @@ struct video_presenter
IUnknown IUnknown_inner;
IUnknown *outer_unk;
LONG refcount;
+
+ unsigned int state;
+ CRITICAL_SECTION cs;
};
static struct video_presenter *impl_from_IUnknown(IUnknown *iface)
@@ -134,6 +145,7 @@ static ULONG WINAPI video_presenter_inner_Release(IUnknown *iface)
if (!refcount)
{
+ DeleteCriticalSection(&presenter->cs);
heap_free(presenter);
}
@@ -167,30 +179,54 @@ static ULONG WINAPI video_presenter_Release(IMFVideoPresenter *iface)
static HRESULT WINAPI video_presenter_OnClockStart(IMFVideoPresenter *iface, MFTIME systime, LONGLONG offset)
{
- FIXME("%p, %s, %s.\n", iface, debugstr_time(systime), wine_dbgstr_longlong(offset));
+ struct video_presenter *presenter = impl_from_IMFVideoPresenter(iface);
- return E_NOTIMPL;
+ TRACE("%p, %s, %s.\n", iface, debugstr_time(systime), wine_dbgstr_longlong(offset));
+
+ EnterCriticalSection(&presenter->cs);
+ presenter->state = PRESENTER_STATE_STARTED;
+ LeaveCriticalSection(&presenter->cs);
+
+ return S_OK;
}
static HRESULT WINAPI video_presenter_OnClockStop(IMFVideoPresenter *iface, MFTIME systime)
{
- FIXME("%p, %s.\n", iface, debugstr_time(systime));
+ struct video_presenter *presenter = impl_from_IMFVideoPresenter(iface);
- return E_NOTIMPL;
+ TRACE("%p, %s.\n", iface, debugstr_time(systime));
+
+ EnterCriticalSection(&presenter->cs);
+ presenter->state = PRESENTER_STATE_STOPPED;
+ LeaveCriticalSection(&presenter->cs);
+
+ return S_OK;
}
static HRESULT WINAPI video_presenter_OnClockPause(IMFVideoPresenter *iface, MFTIME systime)
{
- FIXME("%p, %s.\n", iface, debugstr_time(systime));
+ struct video_presenter *presenter = impl_from_IMFVideoPresenter(iface);
- return E_NOTIMPL;
+ TRACE("%p, %s.\n", iface, debugstr_time(systime));
+
+ EnterCriticalSection(&presenter->cs);
+ presenter->state = PRESENTER_STATE_PAUSED;
+ LeaveCriticalSection(&presenter->cs);
+
+ return S_OK;
}
static HRESULT WINAPI video_presenter_OnClockRestart(IMFVideoPresenter *iface, MFTIME systime)
{
- FIXME("%p, %s.\n", iface, debugstr_time(systime));
+ struct video_presenter *presenter = impl_from_IMFVideoPresenter(iface);
- return E_NOTIMPL;
+ TRACE("%p, %s.\n", iface, debugstr_time(systime));
+
+ EnterCriticalSection(&presenter->cs);
+ presenter->state = PRESENTER_STATE_STARTED;
+ LeaveCriticalSection(&presenter->cs);
+
+ return S_OK;
}
static HRESULT WINAPI video_presenter_OnClockSetRate(IMFVideoPresenter *iface, MFTIME systime, float rate)
@@ -295,9 +331,15 @@ static HRESULT WINAPI video_presenter_service_client_InitServicePointers(IMFTopo
static HRESULT WINAPI video_presenter_service_client_ReleaseServicePointers(IMFTopologyServiceLookupClient *iface)
{
- FIXME("%p.\n", iface);
+ struct video_presenter *presenter = impl_from_IMFTopologyServiceLookupClient(iface);
- return E_NOTIMPL;
+ TRACE("%p.\n", iface);
+
+ EnterCriticalSection(&presenter->cs);
+ presenter->state = PRESENTER_STATE_SHUT_DOWN;
+ LeaveCriticalSection(&presenter->cs);
+
+ return S_OK;
}
static const IMFTopologyServiceLookupClientVtbl video_presenter_service_client_vtbl =
@@ -496,6 +538,7 @@ HRESULT evr_presenter_create(IUnknown *outer, void **out)
object->IUnknown_inner.lpVtbl = &video_presenter_inner_vtbl;
object->outer_unk = outer ? outer : &object->IUnknown_inner;
object->refcount = 1;
+ InitializeCriticalSection(&object->cs);
*out = &object->IUnknown_inner;
--
2.27.0
July 1, 2020
[PATCH 1/5] evr: Add IMFRateSupport stub for the presenter.
by Nikolay Sivov
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
dlls/evr/presenter.c | 61 ++++++++++++++++++++++++++++++++++++++++++++
dlls/evr/tests/evr.c | 28 ++++++++++++++++++++
2 files changed, 89 insertions(+)
diff --git a/dlls/evr/presenter.c b/dlls/evr/presenter.c
index cbe8b0d2ff4..29167d364df 100644
--- a/dlls/evr/presenter.c
+++ b/dlls/evr/presenter.c
@@ -37,6 +37,7 @@ struct video_presenter
IMFVideoDeviceID IMFVideoDeviceID_iface;
IMFTopologyServiceLookupClient IMFTopologyServiceLookupClient_iface;
IMFVideoDisplayControl IMFVideoDisplayControl_iface;
+ IMFRateSupport IMFRateSupport_iface;
IUnknown IUnknown_inner;
IUnknown *outer_unk;
LONG refcount;
@@ -67,6 +68,11 @@ static struct video_presenter *impl_from_IMFVideoDisplayControl(IMFVideoDisplayC
return CONTAINING_RECORD(iface, struct video_presenter, IMFVideoDisplayControl_iface);
}
+static struct video_presenter *impl_from_IMFRateSupport(IMFRateSupport *iface)
+{
+ return CONTAINING_RECORD(iface, struct video_presenter, IMFRateSupport_iface);
+}
+
static HRESULT WINAPI video_presenter_inner_QueryInterface(IUnknown *iface, REFIID riid, void **obj)
{
struct video_presenter *presenter = impl_from_IUnknown(iface);
@@ -94,6 +100,10 @@ static HRESULT WINAPI video_presenter_inner_QueryInterface(IUnknown *iface, REFI
{
*obj = &presenter->IMFVideoDisplayControl_iface;
}
+ else if (IsEqualIID(riid, &IID_IMFRateSupport))
+ {
+ *obj = &presenter->IMFRateSupport_iface;
+ }
else
{
WARN("Unimplemented interface %s.\n", debugstr_guid(riid));
@@ -409,6 +419,56 @@ static const IMFVideoDisplayControlVtbl video_presenter_control_vtbl =
video_presenter_control_GetCurrentImage,
};
+static HRESULT WINAPI video_presenter_rate_support_QueryInterface(IMFRateSupport *iface, REFIID riid, void **obj)
+{
+ struct video_presenter *presenter = impl_from_IMFRateSupport(iface);
+ return IMFVideoPresenter_QueryInterface(&presenter->IMFVideoPresenter_iface, riid, obj);
+}
+
+static ULONG WINAPI video_presenter_rate_support_AddRef(IMFRateSupport *iface)
+{
+ struct video_presenter *presenter = impl_from_IMFRateSupport(iface);
+ return IMFVideoPresenter_AddRef(&presenter->IMFVideoPresenter_iface);
+}
+
+static ULONG WINAPI video_presenter_rate_support_Release(IMFRateSupport *iface)
+{
+ struct video_presenter *presenter = impl_from_IMFRateSupport(iface);
+ return IMFVideoPresenter_Release(&presenter->IMFVideoPresenter_iface);
+}
+
+static HRESULT WINAPI video_presenter_rate_support_GetSlowestRate(IMFRateSupport *iface, MFRATE_DIRECTION direction,
+ BOOL thin, float *rate)
+{
+ TRACE("%p, %d, %d, %p.\n", iface, direction, thin, rate);
+
+ *rate = 0.0f;
+
+ return S_OK;
+}
+
+static HRESULT WINAPI video_presenter_rate_support_GetFastestRate(IMFRateSupport *iface, MFRATE_DIRECTION direction,
+ BOOL thin, float *rate)
+{
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI video_presenter_rate_support_IsRateSupported(IMFRateSupport *iface, BOOL thin, float rate,
+ float *nearest_supported_rate)
+{
+ return E_NOTIMPL;
+}
+
+static const IMFRateSupportVtbl video_presenter_rate_support_vtbl =
+{
+ video_presenter_rate_support_QueryInterface,
+ video_presenter_rate_support_AddRef,
+ video_presenter_rate_support_Release,
+ video_presenter_rate_support_GetSlowestRate,
+ video_presenter_rate_support_GetFastestRate,
+ video_presenter_rate_support_IsRateSupported,
+};
+
HRESULT WINAPI MFCreateVideoPresenter(IUnknown *owner, REFIID riid_device, REFIID riid, void **obj)
{
TRACE("%p, %s, %s, %p.\n", owner, debugstr_guid(riid_device), debugstr_guid(riid), obj);
@@ -432,6 +492,7 @@ HRESULT evr_presenter_create(IUnknown *outer, void **out)
object->IMFVideoDeviceID_iface.lpVtbl = &video_presenter_device_id_vtbl;
object->IMFTopologyServiceLookupClient_iface.lpVtbl = &video_presenter_service_client_vtbl;
object->IMFVideoDisplayControl_iface.lpVtbl = &video_presenter_control_vtbl;
+ object->IMFRateSupport_iface.lpVtbl = &video_presenter_rate_support_vtbl;
object->IUnknown_inner.lpVtbl = &video_presenter_inner_vtbl;
object->outer_unk = outer ? outer : &object->IUnknown_inner;
object->refcount = 1;
diff --git a/dlls/evr/tests/evr.c b/dlls/evr/tests/evr.c
index 037916fc4e1..dd3fbbe0289 100644
--- a/dlls/evr/tests/evr.c
+++ b/dlls/evr/tests/evr.c
@@ -869,8 +869,10 @@ done:
static void test_default_presenter(void)
{
IMFVideoPresenter *presenter;
+ IMFRateSupport *rate_support;
IMFVideoDeviceID *deviceid;
IUnknown *unk;
+ float rate;
HRESULT hr;
GUID iid;
@@ -902,6 +904,32 @@ static void test_default_presenter(void)
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
IUnknown_Release(unk);
+ /* Rate support. */
+ hr = IMFVideoPresenter_QueryInterface(presenter, &IID_IMFRateSupport, (void **)&rate_support);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+ rate = 1.0f;
+ hr = IMFRateSupport_GetSlowestRate(rate_support, MFRATE_FORWARD, FALSE, &rate);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+ ok(rate == 0.0f, "Unexpected rate %f.\n", rate);
+
+ rate = 1.0f;
+ hr = IMFRateSupport_GetSlowestRate(rate_support, MFRATE_FORWARD, TRUE, &rate);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+ ok(rate == 0.0f, "Unexpected rate %f.\n", rate);
+
+ rate = 1.0f;
+ hr = IMFRateSupport_GetSlowestRate(rate_support, MFRATE_REVERSE, FALSE, &rate);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+ ok(rate == 0.0f, "Unexpected rate %f.\n", rate);
+
+ rate = 1.0f;
+ hr = IMFRateSupport_GetSlowestRate(rate_support, MFRATE_REVERSE, TRUE, &rate);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+ ok(rate == 0.0f, "Unexpected rate %f.\n", rate);
+
+ IMFRateSupport_Release(rate_support);
+
IMFVideoPresenter_Release(presenter);
}
--
2.27.0
July 1, 2020
[PATCH] configure: Increase Wine loader address.
by Paul Gofman
PE ntdll.dll does not fit in 0x7bc00000-0x7c000000 range
with certain builds with debug info.
Signed-off-by: Paul Gofman <pgofman(a)codeweavers.com>
---
configure.ac | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/configure.ac b/configure.ac
index 3c03bad292e..6e6c9da3951 100644
--- a/configure.ac
+++ b/configure.ac
@@ -965,7 +965,7 @@ case $host_os in
WINE_TRY_CFLAGS([-Wl,--export-dynamic],
[WINELOADER_LDFLAGS="-Wl,--export-dynamic"])
- WINEPRELOADER_LDFLAGS="-static -nostartfiles -nodefaultlibs -Wl,-Ttext=0x7c400000"
+ WINEPRELOADER_LDFLAGS="-static -nostartfiles -nodefaultlibs -Wl,-Ttext=0x7d400000"
WINE_TRY_CFLAGS([-Wl,--rpath,\$ORIGIN/../lib],
[LDRPATH_INSTALL="-Wl,--rpath,\\\$\$ORIGIN/\`\$(MAKEDEP) -R \${bindir} \${libdir}\`"
@@ -982,12 +982,12 @@ case $host_os in
WINE_TRY_CFLAGS([-Wl,-Ttext-segment=0x7bc00000],
[case $host_os in
freebsd* | kfreebsd*-gnu) WINELOADER_LDFLAGS="$WINELOADER_LDFLAGS -Wl,-Ttext-segment=0x60000000" ;;
- *) WINELOADER_LDFLAGS="$WINELOADER_LDFLAGS -Wl,-Ttext-segment=0x7c000000" ;;
+ *) WINELOADER_LDFLAGS="$WINELOADER_LDFLAGS -Wl,-Ttext-segment=0x7d000000" ;;
esac],
- [WINE_TRY_CFLAGS([-Wl,--section-start,.interp=0x7c000400],
+ [WINE_TRY_CFLAGS([-Wl,--section-start,.interp=0x7d000400],
[case $host_os in
freebsd* | kfreebsd*-gnu) WINELOADER_LDFLAGS="$WINELOADER_LDFLAGS -Wl,--section-start,.interp=0x60000400" ;;
- *) WINELOADER_LDFLAGS="$WINELOADER_LDFLAGS -Wl,--section-start,.interp=0x7c000400" ;;
+ *) WINELOADER_LDFLAGS="$WINELOADER_LDFLAGS -Wl,--section-start,.interp=0x7d000400" ;;
esac])
AC_PATH_PROG(PRELINK, prelink, false, [/sbin /usr/sbin $PATH])
if test "x$PRELINK" = xfalse
--
2.26.2
July 1, 2020
[PATCH] where.exe: add stub program (now with bugreport reference)
by Louis Lenders
https://bugs.winehq.org/show_bug.cgi?id=49460
Signed-off-by: Louis Lenders <xerox.xerox2000x(a)gmail.com>
---
configure | 2 ++
configure.ac | 1 +
programs/where/Makefile.in | 6 ++++++
programs/where/main.c | 33 +++++++++++++++++++++++++++++++++
4 files changed, 42 insertions(+)
create mode 100644 programs/where/Makefile.in
create mode 100644 programs/where/main.c
diff --git a/configure b/configure
index ee0439425a..b6e42b4c86 100755
--- a/configure
+++ b/configure
@@ -1807,6 +1807,7 @@ enable_uninstaller
enable_unlodctr
enable_view
enable_wevtutil
+enable_where
enable_whoami
enable_wineboot
enable_winebrowser
@@ -21426,6 +21427,7 @@ wine_fn_config_makefile programs/uninstaller enable_uninstaller
wine_fn_config_makefile programs/unlodctr enable_unlodctr
wine_fn_config_makefile programs/view enable_view
wine_fn_config_makefile programs/wevtutil enable_wevtutil
+wine_fn_config_makefile programs/where enable_where
wine_fn_config_makefile programs/whoami enable_whoami
wine_fn_config_makefile programs/wineboot enable_wineboot
wine_fn_config_makefile programs/winebrowser enable_winebrowser
diff --git a/configure.ac b/configure.ac
index 3c03bad292..272f2e2a93 100644
--- a/configure.ac
+++ b/configure.ac
@@ -4011,6 +4011,7 @@ WINE_CONFIG_MAKEFILE(programs/uninstaller)
WINE_CONFIG_MAKEFILE(programs/unlodctr)
WINE_CONFIG_MAKEFILE(programs/view)
WINE_CONFIG_MAKEFILE(programs/wevtutil)
+WINE_CONFIG_MAKEFILE(programs/where)
WINE_CONFIG_MAKEFILE(programs/whoami)
WINE_CONFIG_MAKEFILE(programs/wineboot)
WINE_CONFIG_MAKEFILE(programs/winebrowser)
diff --git a/programs/where/Makefile.in b/programs/where/Makefile.in
new file mode 100644
index 0000000000..109261c379
--- /dev/null
+++ b/programs/where/Makefile.in
@@ -0,0 +1,6 @@
+MODULE = where.exe
+
+EXTRADLLFLAGS = -mconsole -municode -mno-cygwin
+
+C_SRCS = \
+ main.c
diff --git a/programs/where/main.c b/programs/where/main.c
new file mode 100644
index 0000000000..84daac8220
--- /dev/null
+++ b/programs/where/main.c
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2020 Louis Lenders
+ *
+ * This library 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.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(where);
+
+int __cdecl wmain(int argc, WCHAR *argv[])
+{
+ int i;
+
+ WINE_FIXME("stub:");
+ for (i = 0; i < argc; i++)
+ WINE_FIXME(" %s", wine_dbgstr_w(argv[i]));
+ WINE_FIXME("\n");
+
+ return 0;
+}
--
2.27.0
July 1, 2020
[PATCH] where.exe: add stub program
by Louis Lenders
Signed-off-by: Louis Lenders <xerox.xerox2000x(a)gmail.com>
---
configure | 2 ++
configure.ac | 1 +
programs/where/Makefile.in | 6 ++++++
programs/where/main.c | 33 +++++++++++++++++++++++++++++++++
4 files changed, 42 insertions(+)
create mode 100644 programs/where/Makefile.in
create mode 100644 programs/where/main.c
diff --git a/configure b/configure
index ee0439425a..b6e42b4c86 100755
--- a/configure
+++ b/configure
@@ -1807,6 +1807,7 @@ enable_uninstaller
enable_unlodctr
enable_view
enable_wevtutil
+enable_where
enable_whoami
enable_wineboot
enable_winebrowser
@@ -21426,6 +21427,7 @@ wine_fn_config_makefile programs/uninstaller enable_uninstaller
wine_fn_config_makefile programs/unlodctr enable_unlodctr
wine_fn_config_makefile programs/view enable_view
wine_fn_config_makefile programs/wevtutil enable_wevtutil
+wine_fn_config_makefile programs/where enable_where
wine_fn_config_makefile programs/whoami enable_whoami
wine_fn_config_makefile programs/wineboot enable_wineboot
wine_fn_config_makefile programs/winebrowser enable_winebrowser
diff --git a/configure.ac b/configure.ac
index 3c03bad292..272f2e2a93 100644
--- a/configure.ac
+++ b/configure.ac
@@ -4011,6 +4011,7 @@ WINE_CONFIG_MAKEFILE(programs/uninstaller)
WINE_CONFIG_MAKEFILE(programs/unlodctr)
WINE_CONFIG_MAKEFILE(programs/view)
WINE_CONFIG_MAKEFILE(programs/wevtutil)
+WINE_CONFIG_MAKEFILE(programs/where)
WINE_CONFIG_MAKEFILE(programs/whoami)
WINE_CONFIG_MAKEFILE(programs/wineboot)
WINE_CONFIG_MAKEFILE(programs/winebrowser)
diff --git a/programs/where/Makefile.in b/programs/where/Makefile.in
new file mode 100644
index 0000000000..109261c379
--- /dev/null
+++ b/programs/where/Makefile.in
@@ -0,0 +1,6 @@
+MODULE = where.exe
+
+EXTRADLLFLAGS = -mconsole -municode -mno-cygwin
+
+C_SRCS = \
+ main.c
diff --git a/programs/where/main.c b/programs/where/main.c
new file mode 100644
index 0000000000..84daac8220
--- /dev/null
+++ b/programs/where/main.c
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2020 Louis Lenders
+ *
+ * This library 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.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(where);
+
+int __cdecl wmain(int argc, WCHAR *argv[])
+{
+ int i;
+
+ WINE_FIXME("stub:");
+ for (i = 0; i < argc; i++)
+ WINE_FIXME(" %s", wine_dbgstr_w(argv[i]));
+ WINE_FIXME("\n");
+
+ return 0;
+}
--
2.27.0
July 1, 2020
Re: [PATCH] ntdll: Don't use WCHAR in unix_to_win_locale().
by Jefferson Carpenter
This seems to have caused new branches on uninitialized values:
https://bugs.winehq.org/show_bug.cgi?id=49494
On 6/30/2020 2:44 PM, Gijs Vermeulen wrote:
> Signed-off-by: Gijs Vermeulen <gijsvrm(a)gmail.com>
> ---
> dlls/ntdll/unix/env.c | 49 +++++++++++++++++--------------------------
> 1 file changed, 19 insertions(+), 30 deletions(-)
>
> diff --git a/dlls/ntdll/unix/env.c b/dlls/ntdll/unix/env.c
> index e260e5c338..e57b625689 100644
> --- a/dlls/ntdll/unix/env.c
> +++ b/dlls/ntdll/unix/env.c
> @@ -74,8 +74,8 @@ char **main_envp = NULL;
> static WCHAR **main_wargv;
>
> static CPTABLEINFO unix_table;
> -static WCHAR system_locale[LOCALE_NAME_MAX_LENGTH];
> -static WCHAR user_locale[LOCALE_NAME_MAX_LENGTH];
> +static char system_locale[LOCALE_NAME_MAX_LENGTH];
> +static char user_locale[LOCALE_NAME_MAX_LENGTH];
>
> static void *read_nls_file( const char *name )
> {
> @@ -649,18 +649,11 @@ static WCHAR **build_wargv( char **argv )
>
> /* Unix format is: lang[_country][.charset][@modifier]
> * Windows format is: lang[-script][-country][_modifier] */
> -static BOOL unix_to_win_locale( const char *unix_name, WCHAR *win_name )
> +static BOOL unix_to_win_locale( const char *unix_name, char *win_name )
> {
> - static const WCHAR sepW[] = {'_','.','@',0};
> - static const WCHAR posixW[] = {'P','O','S','I','X',0};
> - static const WCHAR cW[] = {'C',0};
> - static const WCHAR euroW[] = {'e','u','r','o',0};
> - static const WCHAR latinW[] = {'l','a','t','i','n',0};
> - static const WCHAR latnW[] = {'-','L','a','t','n',0};
> - static const WCHAR enUSW[] = {'e','n','-','U','S',0};
> - WCHAR buffer[LOCALE_NAME_MAX_LENGTH];
> - WCHAR *p, *country = NULL, *modifier = NULL;
> - DWORD len;
> + static const char sep[] = "_.@";
> + char buffer[LOCALE_NAME_MAX_LENGTH];
> + char *p, *country = NULL, *modifier = NULL;
>
> if (!unix_name || !unix_name[0] || !strcmp( unix_name, "C" ))
> {
> @@ -668,16 +661,12 @@ static BOOL unix_to_win_locale( const char *unix_name, WCHAR *win_name )
> if (!unix_name || !unix_name[0]) return FALSE;
> }
>
> - len = ntdll_umbstowcs( unix_name, strlen(unix_name), buffer, ARRAY_SIZE(buffer) );
> - if (len == ARRAY_SIZE(buffer)) return FALSE;
> - buffer[len] = 0;
> -
> - if (!(p = wcspbrk( buffer, sepW )))
> + if (!(p = strpbrk( buffer, sep )))
> {
> - if (!wcscmp( buffer, posixW ) || !wcscmp( buffer, cW ))
> - wcscpy( win_name, enUSW );
> + if (!strcmp( buffer, "POSIX" ) || !strcmp( buffer, "C" ))
> + strcpy( win_name, "en-US" );
> else
> - wcscpy( win_name, buffer );
> + strcpy( win_name, buffer );
> return TRUE;
> }
>
> @@ -685,13 +674,13 @@ static BOOL unix_to_win_locale( const char *unix_name, WCHAR *win_name )
> {
> *p++ = 0;
> country = p;
> - p = wcspbrk( p, sepW + 1 );
> + p = strpbrk( p, sep + 1 );
> }
> if (p && *p == '.')
> {
> *p++ = 0;
> /* charset, ignore */
> - p = wcschr( p, '@' );
> + p = strchr( p, '@' );
> }
> if (p)
> {
> @@ -701,18 +690,18 @@ static BOOL unix_to_win_locale( const char *unix_name, WCHAR *win_name )
>
> /* rebuild a Windows name */
>
> - wcscpy( win_name, buffer );
> + strcpy( win_name, buffer );
> if (modifier)
> {
> - if (!wcscmp( modifier, latinW )) wcscat( win_name, latnW );
> - else if (!wcscmp( modifier, euroW )) {} /* ignore */
> + if (!strcmp( modifier, "latin" )) strcat( win_name, "-Latn" );
> + else if (!strcmp( modifier, "euro" )) {} /* ignore */
> else return FALSE;
> }
> if (country)
> {
> - p = win_name + wcslen(win_name);
> + p = win_name + strlen(win_name);
> *p++ = '-';
> - wcscpy( p, country );
> + strcpy( p, country );
> }
> return TRUE;
> }
> @@ -1083,6 +1072,6 @@ void CDECL get_unix_codepage( CPTABLEINFO *table )
> */
> void CDECL get_locales( WCHAR *sys, WCHAR *user )
> {
> - wcscpy( sys, system_locale );
> - wcscpy( user, user_locale );
> + ntdll_umbstowcs( system_locale, ARRAY_SIZE(system_locale), sys, LOCALE_NAME_MAX_LENGTH * sizeof(WCHAR) );
> + ntdll_umbstowcs( user_locale, ARRAY_SIZE(user_locale), user, LOCALE_NAME_MAX_LENGTH * sizeof(WCHAR) );
> }
>
July 1, 2020
[PATCH v2 2/2] kernel32: Fix GetPrivateProfileIntW() if section and filename are both NULL.
by Jiajin Cui
July 1, 2020