winehq.org
Sign In
Sign Up
Sign In
Sign Up
Manage this list
×
Keyboard Shortcuts
Thread View
j
: Next unread message
k
: Previous unread message
j a
: Jump to all threads
j l
: Jump to MailingList overview
2025
February
January
2024
December
November
October
September
August
July
June
May
April
March
February
January
2023
December
November
October
September
August
July
June
May
April
March
February
January
2022
December
November
October
September
August
July
June
May
April
March
February
January
2021
December
November
October
September
August
July
June
May
April
March
February
January
2020
December
November
October
September
August
July
June
May
April
March
February
January
2019
December
November
October
September
August
July
June
May
April
March
February
January
2018
December
November
October
September
August
July
June
May
April
March
February
January
2017
December
November
October
September
August
July
June
May
April
March
February
January
2016
December
November
October
September
August
July
June
May
April
March
February
January
2015
December
November
October
September
August
July
June
May
April
March
February
January
2014
December
November
October
September
August
July
June
May
April
March
February
January
2013
December
November
October
September
August
July
June
May
April
March
February
January
2012
December
November
October
September
August
July
June
May
April
March
February
January
2011
December
November
October
September
August
July
June
May
April
March
February
January
2010
December
November
October
September
August
July
June
May
April
March
February
January
2009
December
November
October
September
August
July
June
May
April
March
February
January
2008
December
November
October
September
August
July
June
May
April
March
February
January
2007
December
November
October
September
August
July
June
May
April
March
February
January
2006
December
November
October
September
August
July
June
May
April
March
February
January
2005
December
November
October
September
August
July
June
May
April
March
February
January
2004
December
November
October
September
August
July
June
May
April
March
February
January
2003
December
November
October
September
August
July
June
May
April
March
February
January
2002
December
November
October
September
August
July
June
May
April
March
February
January
2001
December
November
October
September
August
July
June
May
April
March
February
List overview
wine-commits
April 2015
----- 2025 -----
February 2025
January 2025
----- 2024 -----
December 2024
November 2024
October 2024
September 2024
August 2024
July 2024
June 2024
May 2024
April 2024
March 2024
February 2024
January 2024
----- 2023 -----
December 2023
November 2023
October 2023
September 2023
August 2023
July 2023
June 2023
May 2023
April 2023
March 2023
February 2023
January 2023
----- 2022 -----
December 2022
November 2022
October 2022
September 2022
August 2022
July 2022
June 2022
May 2022
April 2022
March 2022
February 2022
January 2022
----- 2021 -----
December 2021
November 2021
October 2021
September 2021
August 2021
July 2021
June 2021
May 2021
April 2021
March 2021
February 2021
January 2021
----- 2020 -----
December 2020
November 2020
October 2020
September 2020
August 2020
July 2020
June 2020
May 2020
April 2020
March 2020
February 2020
January 2020
----- 2019 -----
December 2019
November 2019
October 2019
September 2019
August 2019
July 2019
June 2019
May 2019
April 2019
March 2019
February 2019
January 2019
----- 2018 -----
December 2018
November 2018
October 2018
September 2018
August 2018
July 2018
June 2018
May 2018
April 2018
March 2018
February 2018
January 2018
----- 2017 -----
December 2017
November 2017
October 2017
September 2017
August 2017
July 2017
June 2017
May 2017
April 2017
March 2017
February 2017
January 2017
----- 2016 -----
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
----- 2015 -----
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
----- 2014 -----
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
----- 2013 -----
December 2013
November 2013
October 2013
September 2013
August 2013
July 2013
June 2013
May 2013
April 2013
March 2013
February 2013
January 2013
----- 2012 -----
December 2012
November 2012
October 2012
September 2012
August 2012
July 2012
June 2012
May 2012
April 2012
March 2012
February 2012
January 2012
----- 2011 -----
December 2011
November 2011
October 2011
September 2011
August 2011
July 2011
June 2011
May 2011
April 2011
March 2011
February 2011
January 2011
----- 2010 -----
December 2010
November 2010
October 2010
September 2010
August 2010
July 2010
June 2010
May 2010
April 2010
March 2010
February 2010
January 2010
----- 2009 -----
December 2009
November 2009
October 2009
September 2009
August 2009
July 2009
June 2009
May 2009
April 2009
March 2009
February 2009
January 2009
----- 2008 -----
December 2008
November 2008
October 2008
September 2008
August 2008
July 2008
June 2008
May 2008
April 2008
March 2008
February 2008
January 2008
----- 2007 -----
December 2007
November 2007
October 2007
September 2007
August 2007
July 2007
June 2007
May 2007
April 2007
March 2007
February 2007
January 2007
----- 2006 -----
December 2006
November 2006
October 2006
September 2006
August 2006
July 2006
June 2006
May 2006
April 2006
March 2006
February 2006
January 2006
----- 2005 -----
December 2005
November 2005
October 2005
September 2005
August 2005
July 2005
June 2005
May 2005
April 2005
March 2005
February 2005
January 2005
----- 2004 -----
December 2004
November 2004
October 2004
September 2004
August 2004
July 2004
June 2004
May 2004
April 2004
March 2004
February 2004
January 2004
----- 2003 -----
December 2003
November 2003
October 2003
September 2003
August 2003
July 2003
June 2003
May 2003
April 2003
March 2003
February 2003
January 2003
----- 2002 -----
December 2002
November 2002
October 2002
September 2002
August 2002
July 2002
June 2002
May 2002
April 2002
March 2002
February 2002
January 2002
----- 2001 -----
December 2001
November 2001
October 2001
September 2001
August 2001
July 2001
June 2001
May 2001
April 2001
March 2001
February 2001
wine-commits@winehq.org
2 participants
451 discussions
Start a n
N
ew thread
Nikolay Sivov : dwrite: Fix cluster width and length calculation.
by Alexandre Julliard
03 Apr '15
03 Apr '15
Module: wine Branch: master Commit: 0c116d773613e433a13b5bcc9eb5d04f4f789f60 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=0c116d773613e433a13b5bcc9…
Author: Nikolay Sivov <nsivov(a)codeweavers.com> Date: Fri Apr 3 11:38:23 2015 +0300 dwrite: Fix cluster width and length calculation. --- dlls/dwrite/layout.c | 76 ++++++++++++++++++++++++++++------------------ dlls/dwrite/tests/layout.c | 26 +++++++++++----- 2 files changed, 64 insertions(+), 38 deletions(-) diff --git a/dlls/dwrite/layout.c b/dlls/dwrite/layout.c index 28889a7..f28214f 100644 --- a/dlls/dwrite/layout.c +++ b/dlls/dwrite/layout.c @@ -362,14 +362,34 @@ static HRESULT layout_update_breakpoints_range(struct dwrite_textlayout *layout, static struct layout_range *get_layout_range_by_pos(struct dwrite_textlayout *layout, UINT32 pos); -static void init_cluster_metrics(const struct layout_run *run, DWRITE_CLUSTER_METRICS *metrics) +static inline DWRITE_LINE_BREAKPOINT get_effective_breakpoint(const struct dwrite_textlayout *layout, UINT32 pos) { + if (layout->actual_breakpoints) + return layout->actual_breakpoints[pos]; + return layout->nominal_breakpoints[pos]; +} + +static inline void init_cluster_metrics(const struct dwrite_textlayout *layout, const struct layout_run *run, + UINT16 start_glyph, UINT16 stop_glyph, UINT32 stop_position, DWRITE_CLUSTER_METRICS *metrics) +{ + UINT8 breakcondition; + UINT16 j; + metrics->width = 0.0; - metrics->length = 1; - metrics->canWrapLineAfter = FALSE; - metrics->isWhitespace = FALSE; - metrics->isNewline = FALSE; - metrics->isSoftHyphen = FALSE; + for (j = start_glyph; j < stop_glyph; j++) + metrics->width += run->run.glyphAdvances[j]; + metrics->length = 0; + + if (stop_glyph == run->run.glyphCount) + breakcondition = get_effective_breakpoint(layout, stop_position).breakConditionAfter; + else + breakcondition = get_effective_breakpoint(layout, stop_position).breakConditionBefore; + + metrics->canWrapLineAfter = breakcondition == DWRITE_BREAK_CONDITION_CAN_BREAK || + breakcondition == DWRITE_BREAK_CONDITION_MUST_BREAK; + metrics->isWhitespace = FALSE; /* FIXME */ + metrics->isNewline = FALSE; /* FIXME */ + metrics->isSoftHyphen = FALSE; /* FIXME */ metrics->isRightToLeft = run->run.bidiLevel & 1; metrics->padding = 0; } @@ -378,42 +398,34 @@ static void init_cluster_metrics(const struct layout_run *run, DWRITE_CLUSTER_ME All clusters in a 'run' will be added to 'layout' data, starting at index pointed to by 'cluster'. On return 'cluster' is updated to point to next metrics struct to be filled in on next call. + Note that there's no need to reallocate anything at this point as we allocate one cluster per + codepoint initially. */ static void layout_set_cluster_metrics(struct dwrite_textlayout *layout, const struct layout_run *run, UINT32 *cluster) { DWRITE_CLUSTER_METRICS *metrics = &layout->clusters[*cluster]; - UINT16 glyph; - UINT32 i; - - glyph = run->descr.clusterMap[0]; - init_cluster_metrics(run, metrics); + UINT32 i, start = 0; for (i = 0; i < run->descr.stringLength; i++) { - BOOL newcluster = glyph != run->descr.clusterMap[i]; + BOOL end = i == run->descr.stringLength - 1; - /* add new cluster on starting glyph change or simply when run is over */ - if (newcluster || i == run->descr.stringLength - 1) { - UINT8 breakcondition; - UINT16 j; + if (run->descr.clusterMap[start] != run->descr.clusterMap[i]) { + init_cluster_metrics(layout, run, run->descr.clusterMap[start], run->descr.clusterMap[i], i, metrics); + metrics->length = i - start; - for (j = glyph; j < run->descr.clusterMap[i]; j++) - metrics->width += run->run.glyphAdvances[j]; + *cluster += 1; + metrics++; + start = i; + } - /* FIXME: also set isWhitespace, isNewline and isSoftHyphen */ - breakcondition = newcluster ? layout->nominal_breakpoints[i].breakConditionBefore : - layout->nominal_breakpoints[i].breakConditionAfter; - metrics->canWrapLineAfter = breakcondition == DWRITE_BREAK_CONDITION_CAN_BREAK || - breakcondition == DWRITE_BREAK_CONDITION_MUST_BREAK; + if (end) { + init_cluster_metrics(layout, run, run->descr.clusterMap[start], run->run.glyphCount, i, metrics); + metrics->length = i - start + 1; - /* advance to next cluster */ - glyph = run->descr.clusterMap[i]; *cluster += 1; - metrics++; - init_cluster_metrics(run, metrics); + return; } - else - metrics->length++; } } @@ -583,7 +595,7 @@ static HRESULT layout_compute_runs(struct dwrite_textlayout *layout) } if (hr == S_OK) - layout->clusters_count = cluster + 1; + layout->clusters_count = cluster; IDWriteTextAnalyzer_Release(analyzer); return hr; @@ -613,6 +625,10 @@ static HRESULT layout_compute(struct dwrite_textlayout *layout) 0, layout->len, &layout->IDWriteTextAnalysisSink_iface); IDWriteTextAnalyzer_Release(analyzer); } + if (layout->actual_breakpoints) { + heap_free(layout->actual_breakpoints); + layout->actual_breakpoints = NULL; + } hr = layout_compute_runs(layout); diff --git a/dlls/dwrite/tests/layout.c b/dlls/dwrite/tests/layout.c index f36c01e..cf0e1f8 100644 --- a/dlls/dwrite/tests/layout.c +++ b/dlls/dwrite/tests/layout.c @@ -993,13 +993,13 @@ static void test_GetClusterMetrics(void) { static const WCHAR strW[] = {'a','b','c','d',0}; DWRITE_INLINE_OBJECT_METRICS inline_metrics; - DWRITE_CLUSTER_METRICS metrics; + DWRITE_CLUSTER_METRICS metrics[4]; IDWriteInlineObject *trimm; IDWriteTextFormat *format; IDWriteTextLayout *layout; DWRITE_TEXT_RANGE range; IDWriteFactory *factory; - UINT32 count; + UINT32 count, i; HRESULT hr; factory = create_factory(); @@ -1016,6 +1016,16 @@ static void test_GetClusterMetrics(void) ok(hr == E_NOT_SUFFICIENT_BUFFER, "got 0x%08x\n", hr); ok(count == 4, "got %u\n", count); + /* check every cluster width */ + count = 0; + hr = IDWriteTextLayout_GetClusterMetrics(layout, metrics, sizeof(metrics)/sizeof(metrics[0]), &count); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(count == 4, "got %u\n", count); + for (i = 0; i < count; i++) { + ok(metrics[i].width > 0.0, "%u: got width %.2f\n", i, metrics[i].width); + ok(metrics[i].length == 1, "%u: got length %u\n", i, metrics[i].length); + } + hr = IDWriteFactory_CreateEllipsisTrimmingSign(factory, format, &trimm); ok(hr == S_OK, "got 0x%08x\n", hr); @@ -1033,17 +1043,17 @@ todo_wine count = 0; memset(&metrics, 0, sizeof(metrics)); - hr = IDWriteTextLayout_GetClusterMetrics(layout, &metrics, 1, &count); + hr = IDWriteTextLayout_GetClusterMetrics(layout, metrics, 1, &count); ok(hr == E_NOT_SUFFICIENT_BUFFER, "got 0x%08x\n", hr); -todo_wine +todo_wine { ok(count == 3, "got %u\n", count); - ok(metrics.length == 2, "got %u\n", metrics.length); - + ok(metrics[0].length == 2, "got %u\n", metrics[0].length); +} hr = IDWriteInlineObject_GetMetrics(trimm, &inline_metrics); todo_wine { ok(hr == S_OK, "got 0x%08x\n", hr); - ok(inline_metrics.width == metrics.width, "got %.2f, expected %.2f\n", inline_metrics.width, - metrics.width); + ok(inline_metrics.width == metrics[0].width, "got %.2f, expected %.2f\n", inline_metrics.width, + metrics[0].width); } IDWriteInlineObject_Release(trimm); IDWriteTextLayout_Release(layout);
1
0
0
0
Piotr Caban : advapi32: Handle NULL DACL in SetSecurityInfo.
by Alexandre Julliard
03 Apr '15
03 Apr '15
Module: wine Branch: master Commit: 52df833a726f3a8132fbdaab00d82dc2b142f005 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=52df833a726f3a8132fbdaab0…
Author: Piotr Caban <piotr(a)codeweavers.com> Date: Fri Apr 3 10:04:03 2015 +0200 advapi32: Handle NULL DACL in SetSecurityInfo. --- dlls/advapi32/security.c | 2 +- dlls/advapi32/tests/security.c | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/dlls/advapi32/security.c b/dlls/advapi32/security.c index 71a8c92..2cd3f74 100644 --- a/dlls/advapi32/security.c +++ b/dlls/advapi32/security.c @@ -5743,7 +5743,7 @@ DWORD WINAPI SetSecurityInfo(HANDLE handle, SE_OBJECT_TYPE ObjectType, SetSecurityDescriptorGroup(&sd, psidGroup, FALSE); if (SecurityInfo & DACL_SECURITY_INFORMATION) { - if (ObjectType == SE_FILE_OBJECT) + if (ObjectType == SE_FILE_OBJECT && pDacl) { SECURITY_DESCRIPTOR_CONTROL control; PSECURITY_DESCRIPTOR psd; diff --git a/dlls/advapi32/tests/security.c b/dlls/advapi32/tests/security.c index 3789d72..466100d 100644 --- a/dlls/advapi32/tests/security.c +++ b/dlls/advapi32/tests/security.c @@ -3633,6 +3633,22 @@ static void test_GetNamedSecurityInfoA(void) ok(h != INVALID_HANDLE_VALUE, "CreateFile error %d\n", GetLastError()); CloseHandle(h); + /* test setting NULL DACL */ + error = pSetNamedSecurityInfoA(tmpfile, SE_FILE_OBJECT, + DACL_SECURITY_INFORMATION, NULL, NULL, NULL, NULL); + ok(!error, "SetNamedSecurityInfoA failed with error %d\n", error); + + error = pGetNamedSecurityInfoA(tmpfile, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, + NULL, NULL, &pDacl, NULL, &pSD); + ok(!error, "GetNamedSecurityInfo failed with error %d\n", error); + todo_wine ok(!pDacl, "pDacl != NULL\n"); + LocalFree(pSD); + + h = CreateFileA(tmpfile, GENERIC_READ, FILE_SHARE_DELETE|FILE_SHARE_WRITE|FILE_SHARE_READ, + NULL, OPEN_EXISTING, 0, NULL); + ok(h != INVALID_HANDLE_VALUE, "CreateFile error %d\n", GetLastError()); + CloseHandle(h); + /* NtSetSecurityObject doesn't inherit DACL entries */ pSD = sd+sizeof(void*)-((ULONG_PTR)sd)%sizeof(void*); InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION);
1
0
0
0
Thomas Faber : winegstreamer: Avoid side-effects in asserts.
by Alexandre Julliard
03 Apr '15
03 Apr '15
Module: wine Branch: master Commit: fd8a33fde8b847f38315a28333a612e357f43830 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=fd8a33fde8b847f38315a2833…
Author: Thomas Faber <thomas.faber(a)reactos.org> Date: Fri Apr 3 08:03:51 2015 +0200 winegstreamer: Avoid side-effects in asserts. --- dlls/winegstreamer/gstdemux.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/dlls/winegstreamer/gstdemux.c b/dlls/winegstreamer/gstdemux.c index de48efd..c17fc2f 100644 --- a/dlls/winegstreamer/gstdemux.c +++ b/dlls/winegstreamer/gstdemux.c @@ -1074,6 +1074,7 @@ IUnknown * CALLBACK Gstreamer_Splitter_create(IUnknown *punkout, HRESULT *phr) { static void GST_Destroy(GSTImpl *This) { IPin *connected = NULL; ULONG pinref; + HRESULT hr; TRACE("Destroying\n"); @@ -1082,9 +1083,11 @@ static void GST_Destroy(GSTImpl *This) { /* Don't need to clean up output pins, disconnecting input pin will do that */ IPin_ConnectedTo((IPin *)&This->pInputPin, &connected); if (connected) { - assert(IPin_Disconnect(connected) == S_OK); + hr = IPin_Disconnect(connected); + assert(hr == S_OK); IPin_Release(connected); - assert(IPin_Disconnect((IPin *)&This->pInputPin) == S_OK); + hr = IPin_Disconnect((IPin *)&This->pInputPin); + assert(hr == S_OK); } pinref = IPin_Release((IPin *)&This->pInputPin); if (pinref) {
1
0
0
0
Thomas Faber : user32/tests: Avoid side-effect in an assert.
by Alexandre Julliard
03 Apr '15
03 Apr '15
Module: wine Branch: master Commit: 2885e712f7ef0fcf94a8110326c9df6d84173351 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=2885e712f7ef0fcf94a811032…
Author: Thomas Faber <thomas.faber(a)reactos.org> Date: Fri Apr 3 08:02:19 2015 +0200 user32/tests: Avoid side-effect in an assert. --- dlls/user32/tests/win.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/dlls/user32/tests/win.c b/dlls/user32/tests/win.c index 6869a20..3a0548d 100644 --- a/dlls/user32/tests/win.c +++ b/dlls/user32/tests/win.c @@ -4883,6 +4883,7 @@ static void test_IsWindowUnicode(void) WNDCLASSA classA; WNDCLASSW classW; HWND hwnd; + ATOM atom; memset(&classW, 0, sizeof(classW)); classW.hInstance = GetModuleHandleA(0); @@ -4894,7 +4895,8 @@ static void test_IsWindowUnicode(void) classA.hInstance = GetModuleHandleA(0); classA.lpfnWndProc = def_window_procA; classA.lpszClassName = ansi_class_nameA; - assert(RegisterClassA(&classA)); + atom = RegisterClassA(&classA); + assert(atom); /* unicode class: window proc */ hwnd = CreateWindowExW(0, unicode_class_nameW, NULL, WS_POPUP,
1
0
0
0
Thomas Faber : setupapi/tests: Avoid side-effect in an assert.
by Alexandre Julliard
03 Apr '15
03 Apr '15
Module: wine Branch: master Commit: 655e7f98dba96bef8db711c5859e271a0c26122c URL:
http://source.winehq.org/git/wine.git/?a=commit;h=655e7f98dba96bef8db711c58…
Author: Thomas Faber <thomas.faber(a)reactos.org> Date: Fri Apr 3 07:55:50 2015 +0200 setupapi/tests: Avoid side-effect in an assert. --- dlls/setupapi/tests/install.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/dlls/setupapi/tests/install.c b/dlls/setupapi/tests/install.c index fdee524..a98cbec 100644 --- a/dlls/setupapi/tests/install.c +++ b/dlls/setupapi/tests/install.c @@ -63,10 +63,12 @@ static BOOL (WINAPI *pSetupGetInfFileListW)(PCWSTR, DWORD, PWSTR, DWORD, PDWORD) static void create_inf_file(LPCSTR filename, const char *data) { DWORD res; + BOOL ret; HANDLE handle = CreateFileA(filename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); assert(handle != INVALID_HANDLE_VALUE); - assert(WriteFile(handle, data, strlen(data), &res, NULL)); + ret = WriteFile(handle, data, strlen(data), &res, NULL); + assert(ret != 0); CloseHandle(handle); }
1
0
0
0
Andrew Cook : server: Track handle count of objects.
by Alexandre Julliard
03 Apr '15
03 Apr '15
Module: wine Branch: master Commit: 5d85f57814f023c105948636094e5e07654605ec URL:
http://source.winehq.org/git/wine.git/?a=commit;h=5d85f57814f023c1059486360…
Author: Andrew Cook <ariscop(a)gmail.com> Date: Thu Apr 2 10:24:24 2015 +1100 server: Track handle count of objects. --- dlls/ntdll/om.c | 2 +- include/wine/server_protocol.h | 4 ++-- server/handle.c | 23 +++++++++++++++++++---- server/object.c | 10 ++++++---- server/object.h | 1 + server/protocol.def | 1 + server/request.h | 3 ++- server/trace.c | 1 + 8 files changed, 33 insertions(+), 12 deletions(-) diff --git a/dlls/ntdll/om.c b/dlls/ntdll/om.c index f5f75c6..b337444 100644 --- a/dlls/ntdll/om.c +++ b/dlls/ntdll/om.c @@ -77,7 +77,7 @@ NTSTATUS WINAPI NtQueryObject(IN HANDLE handle, memset( p, 0, sizeof(*p) ); p->GrantedAccess = reply->access; p->PointerCount = reply->ref_count; - p->HandleCount = 1; /* at least one */ + p->HandleCount = reply->handle_count; if (used_len) *used_len = sizeof(*p); } } diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h index 3e61c5c..de6302c 100644 --- a/include/wine/server_protocol.h +++ b/include/wine/server_protocol.h @@ -4690,9 +4690,9 @@ struct get_object_info_reply struct reply_header __header; unsigned int access; unsigned int ref_count; + unsigned int handle_count; data_size_t total; /* VARARG(name,unicode_str); */ - char __pad_20[4]; }; @@ -5955,6 +5955,6 @@ union generic_reply struct set_job_completion_port_reply set_job_completion_port_reply; }; -#define SERVER_PROTOCOL_VERSION 465 +#define SERVER_PROTOCOL_VERSION 466 #endif /* __WINE_WINE_SERVER_PROTOCOL_H */ diff --git a/server/handle.c b/server/handle.c index 0293ed6..5043ff7 100644 --- a/server/handle.c +++ b/server/handle.c @@ -97,6 +97,20 @@ static inline obj_handle_t handle_global_to_local( obj_handle_t handle ) return handle ^ HANDLE_OBFUSCATOR; } +/* grab an object and increment its handle count */ +static struct object *grab_object_for_handle( struct object *obj ) +{ + obj->handle_count++; + return grab_object( obj ); +} + +/* release an object and decrement its handle count */ +static void release_object_from_handle( struct object *obj ) +{ + assert( obj->handle_count ); + obj->handle_count--; + release_object( obj ); +} static void handle_table_dump( struct object *obj, int verbose ); static void handle_table_destroy( struct object *obj ); @@ -166,7 +180,7 @@ static void handle_table_destroy( struct object *obj ) { struct object *obj = entry->ptr; entry->ptr = NULL; - if (obj) release_object( obj ); + if (obj) release_object_from_handle( obj ); } free( table->entries ); } @@ -229,7 +243,7 @@ static obj_handle_t alloc_entry( struct handle_table *table, void *obj, unsigned table->last = i; found: table->free = i + 1; - entry->ptr = grab_object( obj ); + entry->ptr = grab_object_for_handle( obj ); entry->access = access; return index_to_handle(i); } @@ -355,7 +369,7 @@ struct handle_table *copy_handle_table( struct process *process, struct process for (i = 0; i <= table->last; i++, ptr++) { if (!ptr->ptr) continue; - if (ptr->access & RESERVED_INHERIT) grab_object( ptr->ptr ); + if (ptr->access & RESERVED_INHERIT) grab_object_for_handle( ptr->ptr ); else ptr->ptr = NULL; /* don't inherit this entry */ } } @@ -379,7 +393,7 @@ unsigned int close_handle( struct process *process, obj_handle_t handle ) table = handle_is_global(handle) ? global_table : process->handles; if (entry < table->entries + table->free) table->free = entry - table->entries; if (entry == table->entries + table->last) shrink_handle_table( table ); - release_object( obj ); + release_object_from_handle( obj ); return STATUS_SUCCESS; } @@ -630,6 +644,7 @@ DECL_HANDLER(get_object_info) reply->access = get_handle_access( current->process, req->handle ); reply->ref_count = obj->refcount; + reply->handle_count = obj->handle_count; if ((name = get_object_full_name( obj, &reply->total ))) set_reply_data_ptr( name, min( reply->total, get_reply_max_size() )); release_object( obj ); diff --git a/server/object.c b/server/object.c index d4afefd..965c11c 100644 --- a/server/object.c +++ b/server/object.c @@ -206,10 +206,11 @@ void *alloc_object( const struct object_ops *ops ) struct object *obj = mem_alloc( ops->size ); if (obj) { - obj->refcount = 1; - obj->ops = ops; - obj->name = NULL; - obj->sd = NULL; + obj->refcount = 1; + obj->handle_count = 0; + obj->ops = ops; + obj->name = NULL; + obj->sd = NULL; list_init( &obj->wait_queue ); #ifdef DEBUG_OBJECTS list_add_head( &object_list, &obj->obj_list ); @@ -306,6 +307,7 @@ void release_object( void *ptr ) assert( obj->refcount ); if (!--obj->refcount) { + assert( !obj->handle_count ); /* if the refcount is 0, nobody can be in the wait queue */ assert( list_empty( &obj->wait_queue )); obj->ops->destroy( obj ); diff --git a/server/object.h b/server/object.h index 3817c75..72b52ee 100644 --- a/server/object.h +++ b/server/object.h @@ -95,6 +95,7 @@ struct object_ops struct object { unsigned int refcount; /* reference count */ + unsigned int handle_count;/* handle count */ const struct object_ops *ops; struct list wait_queue; struct object_name *name; diff --git a/server/protocol.def b/server/protocol.def index 9199c7f..625b3c9 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -3269,6 +3269,7 @@ enum coords_relative @REPLY unsigned int access; /* granted access mask */ unsigned int ref_count; /* object ref count */ + unsigned int handle_count; /* object handle count */ data_size_t total; /* total needed size for name */ VARARG(name,unicode_str); /* object name */ @END diff --git a/server/request.h b/server/request.h index ba699d1..dd6e4e2 100644 --- a/server/request.h +++ b/server/request.h @@ -2088,7 +2088,8 @@ C_ASSERT( FIELD_OFFSET(struct get_object_info_request, handle) == 12 ); C_ASSERT( sizeof(struct get_object_info_request) == 16 ); C_ASSERT( FIELD_OFFSET(struct get_object_info_reply, access) == 8 ); C_ASSERT( FIELD_OFFSET(struct get_object_info_reply, ref_count) == 12 ); -C_ASSERT( FIELD_OFFSET(struct get_object_info_reply, total) == 16 ); +C_ASSERT( FIELD_OFFSET(struct get_object_info_reply, handle_count) == 16 ); +C_ASSERT( FIELD_OFFSET(struct get_object_info_reply, total) == 20 ); C_ASSERT( sizeof(struct get_object_info_reply) == 24 ); C_ASSERT( FIELD_OFFSET(struct unlink_object_request, handle) == 12 ); C_ASSERT( sizeof(struct unlink_object_request) == 16 ); diff --git a/server/trace.c b/server/trace.c index e4188ba..0e2e7e2 100644 --- a/server/trace.c +++ b/server/trace.c @@ -3842,6 +3842,7 @@ static void dump_get_object_info_reply( const struct get_object_info_reply *req { fprintf( stderr, " access=%08x", req->access ); fprintf( stderr, ", ref_count=%08x", req->ref_count ); + fprintf( stderr, ", handle_count=%08x", req->handle_count ); fprintf( stderr, ", total=%u", req->total ); dump_varargs_unicode_str( ", name=", cur_size ); }
1
0
0
0
Mark Harmstone : winecfg: Add manifest.
by Alexandre Julliard
03 Apr '15
03 Apr '15
Module: wine Branch: master Commit: 8cf9108b2d5c88e85b55cd5c976fb1f940be0735 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=8cf9108b2d5c88e85b55cd5c9…
Author: Mark Harmstone <hellas(a)burntcomma.com> Date: Thu Apr 2 00:17:18 2015 +0100 winecfg: Add manifest. --- programs/winecfg/winecfg.manifest | 16 ++++++++++++++++ programs/winecfg/winecfg.rc | 3 +++ 2 files changed, 19 insertions(+) diff --git a/programs/winecfg/winecfg.manifest b/programs/winecfg/winecfg.manifest new file mode 100644 index 0000000..a7e4d88 --- /dev/null +++ b/programs/winecfg/winecfg.manifest @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> +<assemblyIdentity type="win32" name="Wine.Winecfg" version="0.0.0.0" processorArchitecture=""/> +<dependency> + <dependentAssembly> + <assemblyIdentity + type="win32" + name="Microsoft.Windows.Common-Controls" + version="6.0.0.0" + processorArchitecture="*" + publicKeyToken="6595b64144ccf1df" + language="*" + /> + </dependentAssembly> +</dependency> +</assembly> diff --git a/programs/winecfg/winecfg.rc b/programs/winecfg/winecfg.rc index 9b8791e..f82159e 100644 --- a/programs/winecfg/winecfg.rc +++ b/programs/winecfg/winecfg.rc @@ -316,3 +316,6 @@ IDI_LOGO ICON logo.ico /* @makedep: idw_testsound.wav */ IDW_TESTSOUND WAVE idw_testsound.wav + +/* @makedep: winecfg.manifest */ +1 RT_MANIFEST winecfg.manifest
1
0
0
0
Sebastian Lackner : ntdll: Fix various bugs RtlUnwindEx on x86_64.
by Alexandre Julliard
03 Apr '15
03 Apr '15
Module: wine Branch: master Commit: 33c3990e4d5f637807eee55367b9f49f761571ef URL:
http://source.winehq.org/git/wine.git/?a=commit;h=33c3990e4d5f637807eee5536…
Author: Sebastian Lackner <sebastian(a)fds-team.de> Date: Sun Jan 25 15:46:05 2015 +0100 ntdll: Fix various bugs RtlUnwindEx on x86_64. --- dlls/ntdll/signal_x86_64.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c index 551687f..493a9f7 100644 --- a/dlls/ntdll/signal_x86_64.c +++ b/dlls/ntdll/signal_x86_64.c @@ -1407,8 +1407,8 @@ static NTSTATUS dwarf_virtual_unwind( ULONG64 ip, ULONG64 *frame,CONTEXT *contex TRACE( "fde %p len %x personality %p lsda %p code %lx-%lx\n", fde, fde->length, *handler, *handler_data, info.ip, code_end ); execute_cfa_instructions( ptr, end, ip, &info ); - apply_frame_state( context, &info.state ); *frame = context->Rsp; + apply_frame_state( context, &info.state ); TRACE( "next function rip=%016lx\n", context->Rip ); TRACE( " rax=%016lx rbx=%016lx rcx=%016lx rdx=%016lx\n", @@ -3214,6 +3214,7 @@ void WINAPI RtlUnwindEx( PVOID end_frame, PVOID target_ip, EXCEPTION_RECORD *rec } else /* hack: call builtin handlers registered in the tib list */ { + DWORD64 backup_frame = dispatch.EstablisherFrame; while ((ULONG64)teb_frame < new_context.Rsp && (ULONG64)teb_frame < (ULONG64)end_frame) { TRACE( "found builtin frame %p handler %p\n", teb_frame, teb_frame->Handler ); @@ -3222,10 +3223,10 @@ void WINAPI RtlUnwindEx( PVOID end_frame, PVOID target_ip, EXCEPTION_RECORD *rec teb_frame = __wine_pop_frame( teb_frame ); } if ((ULONG64)teb_frame == (ULONG64)end_frame && (ULONG64)end_frame < new_context.Rsp) break; - dispatch.EstablisherFrame = new_context.Rsp; + dispatch.EstablisherFrame = backup_frame; } - if (context->Rsp == (ULONG64)end_frame) break; + if (dispatch.EstablisherFrame == (ULONG64)end_frame) break; *context = new_context; }
1
0
0
0
Hans Leidekker : wbemprox: Add a partial implementation of Win32_Printer.
by Alexandre Julliard
03 Apr '15
03 Apr '15
Module: wine Branch: master Commit: 09aec5987019328ec9d6b006a45cd9f1fe4c8d98 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=09aec5987019328ec9d6b006a…
Author: Hans Leidekker <hans(a)codeweavers.com> Date: Thu Apr 2 16:20:27 2015 +0200 wbemprox: Add a partial implementation of Win32_Printer. --- dlls/wbemprox/Makefile.in | 2 +- dlls/wbemprox/builtin.c | 77 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+), 1 deletion(-) diff --git a/dlls/wbemprox/Makefile.in b/dlls/wbemprox/Makefile.in index 0307e0e..3b17afb 100644 --- a/dlls/wbemprox/Makefile.in +++ b/dlls/wbemprox/Makefile.in @@ -1,5 +1,5 @@ MODULE = wbemprox.dll -IMPORTS = version iphlpapi dxgi oleaut32 ole32 advapi32 user32 gdi32 ws2_32 +IMPORTS = winspool version iphlpapi dxgi oleaut32 ole32 advapi32 user32 gdi32 ws2_32 C_SRCS = \ builtin.c \ diff --git a/dlls/wbemprox/builtin.c b/dlls/wbemprox/builtin.c index df3bf3f..8ba2642 100644 --- a/dlls/wbemprox/builtin.c +++ b/dlls/wbemprox/builtin.c @@ -41,6 +41,7 @@ #include "winver.h" #include "sddl.h" #include "ntsecapi.h" +#include "winspool.h" #include "wine/debug.h" #include "wbemprox_private.h" @@ -84,6 +85,8 @@ static const WCHAR class_physicalmemoryW[] = {'W','i','n','3','2','_','P','h','y','s','i','c','a','l','M','e','m','o','r','y',0}; static const WCHAR class_qualifiersW[] = {'_','_','Q','U','A','L','I','F','I','E','R','S',0}; +static const WCHAR class_printerW[] = + {'W','i','n','3','2','_','P','r','i','n','t','e','r',0}; static const WCHAR class_process_getowner_outW[] = {'_','_','W','I','N','3','2','_','P','R','O','C','E','S','S','_','G','E','T','O','W', 'N','E','R','_','O','U','T',0}; @@ -114,6 +117,8 @@ static const WCHAR prop_adaptertypeW[] = {'A','d','a','p','t','e','r','T','y','p','e',0}; static const WCHAR prop_addresswidthW[] = {'A','d','d','r','e','s','s','W','i','d','t','h',0}; +static const WCHAR prop_attributesW[] = + {'A','t','t','r','i','b','u','t','e','s',0}; static const WCHAR prop_availabilityW[] = {'A','v','a','i','l','a','b','i','l','i','t','y',0}; static const WCHAR prop_binaryrepresentationW[] = @@ -174,6 +179,8 @@ static const WCHAR prop_domainroleW[] = {'D','o','m','a','i','n','R','o','l','e',0}; static const WCHAR prop_driveW[] = {'D','r','i','v','e',0}; +static const WCHAR prop_drivernameW[] = + {'D','r','i','v','e','r','N','a','m','e',0}; static const WCHAR prop_driverversionW[] = {'D','r','i','v','e','r','V','e','r','s','i','o','n',0}; static const WCHAR prop_drivetypeW[] = @@ -188,6 +195,8 @@ static const WCHAR prop_freespaceW[] = {'F','r','e','e','S','p','a','c','e',0}; static const WCHAR prop_handleW[] = {'H','a','n','d','l','e',0}; +static const WCHAR prop_horizontalresolutionW[] = + {'H','o','r','i','z','o','n','t','a','l','R','e','s','o','l','u','t','i','o','n',0}; static const WCHAR prop_idW[] = {'I','D',0}; static const WCHAR prop_identificationcodeW[] = @@ -210,6 +219,8 @@ static const WCHAR prop_ipenabledW[] = {'I','P','E','n','a','b','l','e','d',0}; static const WCHAR prop_lastbootuptimeW[] = {'L','a','s','t','B','o','o','t','U','p','T','i','m','e',0}; +static const WCHAR prop_localW[] = + {'L','o','c','a','l',0}; static const WCHAR prop_localdatetimeW[] = {'L','o','c','a','l','D','a','t','e','T','i','m','e',0}; static const WCHAR prop_localeW[] = @@ -230,6 +241,8 @@ static const WCHAR prop_modelW[] = {'M','o','d','e','l',0}; static const WCHAR prop_netconnectionstatusW[] = {'N','e','t','C','o','n','n','e','c','t','i','o','n','S','t','a','t','u','s',0}; +static const WCHAR prop_networkW[] = + {'N','e','t','w','o','r','k',0}; static const WCHAR prop_numcoresW[] = {'N','u','m','b','e','r','O','f','C','o','r','e','s',0}; static const WCHAR prop_numlogicalprocessorsW[] = @@ -488,6 +501,15 @@ static const struct column col_physicalmemory[] = { { prop_capacityW, CIM_UINT64 } }; +static const struct column col_printer[] = +{ + { prop_attributesW, CIM_UINT32 }, + { prop_drivernameW, CIM_STRING|COL_FLAG_DYNAMIC }, + { prop_horizontalresolutionW, CIM_UINT32 }, + { prop_localW, CIM_BOOLEAN }, + { prop_nameW, CIM_STRING|COL_FLAG_DYNAMIC }, + { prop_networkW, CIM_BOOLEAN } +}; static const struct column col_process[] = { { prop_captionW, CIM_STRING|COL_FLAG_DYNAMIC }, @@ -844,6 +866,15 @@ struct record_physicalmemory { UINT64 capacity; }; +struct record_printer +{ + UINT32 attributes; + const WCHAR *drivername; + UINT32 horizontalresolution; + int local; + const WCHAR *name; + int network; +}; struct record_process { const WCHAR *caption; @@ -2043,6 +2074,51 @@ static enum fill_status fill_physicalmemory( struct table *table, const struct e return status; } +static enum fill_status fill_printer( struct table *table, const struct expr *cond ) +{ + struct record_printer *rec; + enum fill_status status = FILL_STATUS_UNFILTERED; + PRINTER_INFO_2W *info; + DWORD i, offset = 0, count = 0, size = 0; + + EnumPrintersW( PRINTER_ENUM_LOCAL, NULL, 2, NULL, 0, &size, &count ); + if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) return FILL_STATUS_FAILED; + + if (!(info = heap_alloc( size ))) return FILL_STATUS_FAILED; + if (!EnumPrintersW( PRINTER_ENUM_LOCAL, NULL, 2, (BYTE *)info, size, &size, &count )) + { + heap_free( info ); + return FILL_STATUS_FAILED; + } + if (!resize_table( table, count, sizeof(*rec) )) + { + heap_free( info ); + return FILL_STATUS_FAILED; + } + + for (i = 0; i < count; i++) + { + rec = (struct record_printer *)(table->data + offset); + rec->attributes = info[i].Attributes; + rec->drivername = heap_strdupW( info[i].pDriverName ); + rec->horizontalresolution = info[i].pDevMode->u1.s1.dmPrintQuality; + rec->local = -1; + rec->name = heap_strdupW( info[i].pPrinterName ); + rec->network = 0; + if (!match_row( table, i, cond, &status )) + { + free_row_values( table, i ); + continue; + } + offset += sizeof(*rec); + } + TRACE("created %u rows\n", count); + table->num_rows = count; + + heap_free( info ); + return status; +} + static WCHAR *get_cmdline( DWORD process_id ) { if (process_id == GetCurrentProcessId()) return heap_strdupW( GetCommandLineW() ); @@ -2721,6 +2797,7 @@ static struct table builtin_classes[] = { class_paramsW, SIZEOF(col_param), col_param, SIZEOF(data_param), 0, (BYTE *)data_param }, { class_physicalmediaW, SIZEOF(col_physicalmedia), col_physicalmedia, SIZEOF(data_physicalmedia), 0, (BYTE *)data_physicalmedia }, { class_physicalmemoryW, SIZEOF(col_physicalmemory), col_physicalmemory, 0, 0, NULL, fill_physicalmemory }, + { class_printerW, SIZEOF(col_printer), col_printer, 0, 0, NULL, fill_printer }, { class_processW, SIZEOF(col_process), col_process, 0, 0, NULL, fill_process }, { class_processorW, SIZEOF(col_processor), col_processor, 0, 0, NULL, fill_processor }, { class_processor2W, SIZEOF(col_processor), col_processor, 0, 0, NULL, fill_processor },
1
0
0
0
Hans Leidekker : wbemprox: Implement more properties of Win32_VideoController.
by Alexandre Julliard
03 Apr '15
03 Apr '15
Module: wine Branch: master Commit: 64823801fcc15b00d169e494c07852d4af830ef4 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=64823801fcc15b00d169e494c…
Author: Hans Leidekker <hans(a)codeweavers.com> Date: Thu Apr 2 16:19:58 2015 +0200 wbemprox: Implement more properties of Win32_VideoController. --- dlls/wbemprox/builtin.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/dlls/wbemprox/builtin.c b/dlls/wbemprox/builtin.c index e37912e..df3bf3f 100644 --- a/dlls/wbemprox/builtin.c +++ b/dlls/wbemprox/builtin.c @@ -146,6 +146,10 @@ static const WCHAR prop_currentclockspeedW[] = {'C','u','r','r','e','n','t','C','l','o','c','k','S','p','e','e','d',0}; static const WCHAR prop_currenthorizontalresW[] = {'C','u','r','r','e','n','t','H','o','r','i','z','o','n','t','a','l','R','e','s','o','l','u','t','i','o','n',0}; +static const WCHAR prop_currentrefreshrateW[] = + {'C','u','r','r','e','n','t','R','e','f','r','e','s','h','R','a','t','e',0}; +static const WCHAR prop_currentscanmodeW[] = + {'C','u','r','r','e','n','t','S','c','a','n','M','o','d','e',0}; static const WCHAR prop_currentverticalresW[] = {'C','u','r','r','e','n','t','V','e','r','t','i','c','a','l','R','e','s','o','l','u','t','i','o','n',0}; static const WCHAR prop_datawidthW[] = @@ -316,6 +320,10 @@ static const WCHAR prop_varianttypeW[] = {'V','a','r','i','a','n','t','T','y','p','e',0}; static const WCHAR prop_versionW[] = {'V','e','r','s','i','o','n',0}; +static const WCHAR prop_videoarchitectureW[] = + {'V','i','d','e','o','A','r','c','h','i','t','e','c','t','u','r','e',0}; +static const WCHAR prop_videomemorytypeW[] = + {'V','i','d','e','o','M','e','m','o','r','y','T','y','p','e',0}; static const WCHAR prop_videoprocessorW[] = {'V','i','d','e','o','P','r','o','c','e','s','s','o','r',0}; static const WCHAR prop_volumenameW[] = @@ -570,14 +578,19 @@ static const struct column col_videocontroller[] = { prop_adapterdactypeW, CIM_STRING }, { prop_adapterramW, CIM_UINT32, VT_I4 }, { prop_availabilityW, CIM_UINT16 }, + { prop_captionW, CIM_STRING|COL_FLAG_DYNAMIC }, { prop_currentbitsperpixelW, CIM_UINT32, VT_I4 }, { prop_currenthorizontalresW, CIM_UINT32, VT_I4 }, + { prop_currentrefreshrateW, CIM_UINT32, VT_I4 }, + { prop_currentscanmodeW, CIM_UINT16, VT_I4 }, { prop_currentverticalresW, CIM_UINT32, VT_I4 }, { prop_descriptionW, CIM_STRING|COL_FLAG_DYNAMIC }, { prop_deviceidW, CIM_STRING|COL_FLAG_KEY }, { prop_driverversionW, CIM_STRING }, { prop_nameW, CIM_STRING|COL_FLAG_DYNAMIC }, { prop_pnpdeviceidW, CIM_STRING|COL_FLAG_DYNAMIC }, + { prop_videoarchitectureW, CIM_UINT16, VT_I4 }, + { prop_videomemorytypeW, CIM_UINT16, VT_I4 }, { prop_videoprocessorW, CIM_STRING|COL_FLAG_DYNAMIC } }; @@ -921,14 +934,19 @@ struct record_videocontroller const WCHAR *adapter_dactype; UINT32 adapter_ram; UINT16 availability; + const WCHAR *caption; UINT32 current_bitsperpixel; UINT32 current_horizontalres; + UINT32 current_refreshrate; + UINT16 current_scanmode; UINT32 current_verticalres; const WCHAR *description; const WCHAR *device_id; const WCHAR *driverversion; const WCHAR *name; const WCHAR *pnpdevice_id; + UINT16 videoarchitecture; + UINT16 videomemorytype; const WCHAR *videoprocessor; }; #include "poppack.h" @@ -2659,14 +2677,19 @@ done: rec->adapter_dactype = videocontroller_dactypeW; rec->adapter_ram = vidmem; rec->availability = 3; /* Running or Full Power */ + rec->caption = heap_strdupW( name ); rec->current_bitsperpixel = get_bits_per_pixel( &hres, &vres ); rec->current_horizontalres = hres; + rec->current_refreshrate = 0; /* default refresh rate */ + rec->current_scanmode = 2; /* Unknown */ rec->current_verticalres = vres; rec->description = heap_strdupW( name ); rec->device_id = videocontroller_deviceidW; rec->driverversion = videocontroller_driverversionW; rec->name = heap_strdupW( name ); rec->pnpdevice_id = get_pnpdeviceid( &desc ); + rec->videoarchitecture = 2; /* Unknown */ + rec->videomemorytype = 2; /* Unknown */ rec->videoprocessor = heap_strdupW( name ); if (!match_row( table, row, cond, &status )) free_row_values( table, row ); else row++;
1
0
0
0
← Newer
1
...
36
37
38
39
40
41
42
...
46
Older →
Jump to page:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
Results per page:
10
25
50
100
200