[Bug 50369] New: Multiple tools for viewing GDI handles/resources list and GDI leak detection require support for PEB->GdiSharedHandleTable (GDIView, GDILeaks)
WineHQ Bugzilla
wine-bugs at winehq.org
Mon Dec 21 04:05:05 CST 2020
https://bugs.winehq.org/show_bug.cgi?id=50369
Bug ID: 50369
Summary: Multiple tools for viewing GDI handles/resources list
and GDI leak detection require support for
PEB->GdiSharedHandleTable (GDIView, GDILeaks)
Product: Wine
Version: 6.0-rc3
Hardware: x86-64
OS: Linux
Status: NEW
Severity: normal
Priority: P2
Component: ntdll
Assignee: wine-bugs at winehq.org
Reporter: focht at gmx.net
Distribution: ---
Hello folks,
as it says. I know this information can be retrieved tracing processes with
Wine 'gdi' debug channel.
https://source.winehq.org/git/wine.git/blob/56e7cd12ce0ce3bb331a8595b25aedb811b79110:/dlls/gdi32/gdiobj.c#l729
Currently investigating bug 23221 where the application massively leaks GDI
handles. App bug, most likely unrelated to the actual problem of the ticket.
I wanted to see the leakage in a realtime-view with absolute values, leak rate
per second, changes when doing certain UI actions. It's possible to extract
that from Wine trace logs as well using timestamps and filtering for specific
messages but it takes way more effort to associate the leak rate with certain
UI actions (controls).
Multiple tools provide that information in a convenient way. Unfortunately they
rely on the shared handle table being exposed.
---
* https://www.nirsoft.net/utils/gdi_handles.html ("GDIView - View GDI
handles/resources list and detect GDI leaks")
Stable download link via Internet Archive:
https://web.archive.org/web/20201127182337/http://www.nirsoft.net/utils/gdiview-x64.zip
*
https://docs.microsoft.com/en-us/archive/msdn-magazine/2003/january/detect-and-plug-gdi-leaks-with-two-powerful-tools-for-windows-xp
("Detect and Plug GDI Leaks in Your Code with Two Powerful Tools for Windows
XP")
Stable download link via Internet Archive:
https://web.archive.org/web/20170911002438/http://download.microsoft.com/download/c/0/b/c0b7c8fa-58f1-4815-aae7-ed18a4dc3f08/GDILeaks.exe
The MSDN article provides the struct layout for entry:
--- quote ---
In his book Windows Graphics Programming: Win32 GDI and DirectDraw (Prentice
Hall, 2002), Feng Huan provides another way to access this table, but he also
describes the structure of each of the 0x4000 entries of this table, as you can
see here:
...
typedef struct {
DWORD pKernelInfo;
WORD ProcessID;
WORD _nCount;
WORD nUpper;
WORD nType;
DWORD pUserInfo;
} GDITableEntry;
--- quote ---
'GDILeaks' self-extractor contains multiple example applications as binaries
and with sources.
https://www.geoffchappell.com/studies/windows/win32/ntdll/structs/peb/index.htm
--- quote ---
Offset (x86) Offset (x64) Definition Versions
0x94 0xF8 PVOID GdiSharedHandleTable; 3.51 and higher
--- quote ---
The app crashes because the 'PEB->GdiSharedHandleTable' pointer is NULL:
--- snip ---
$ WINEDEBUG=+seh,+relay wine ./GDIView.exe >>log.txt 2>&1
...
0104:Call KERNEL32.GetModuleHandleW(140011eb0 L"ntdll.dll") ret=140004c52
...
0104:Ret KERNEL32.GetModuleHandleW() retval=7bc00000 ret=140004c52
0104:Call KERNEL32.GetProcAddress(7bc00000,140011ec8 "RtlGetCurrentPeb")
ret=140004c67
0104:Ret KERNEL32.GetProcAddress() retval=7bc068e4 ret=140004c67
0104:Call ntdll.RtlGetCurrentPeb() ret=140004c6e
0104:Ret ntdll.RtlGetCurrentPeb() retval=7fffffdaf000 ret=140004c6e
0104:trace:seh:dispatch_exception code=c0000005 flags=0 addr=0000000140004CA6
ip=0000000140004CA6 tid=0104
0104:trace:seh:dispatch_exception info[0]=0000000000000000
0104:trace:seh:dispatch_exception info[1]=0000000000000008
0104:trace:seh:dispatch_exception rax=0000000000000000 rbx=0000000000f314c0
rcx=000000000021ee48 rdx=0000000000000000
0104:trace:seh:dispatch_exception rsi=0000000000000000 rdi=0000000000000000
rbp=0000000000000000 rsp=000000000021edf8
0104:trace:seh:dispatch_exception r8=000000000021ee30 r9=0000000000000000
r10=0000000000000000 r11=0000000000000246
0104:trace:seh:dispatch_exception r12=0000000000000415 r13=0000000000000001
r14=0000000000000000 r15=000000000021f168
0104:trace:seh:call_vectored_handlers calling handler at 000000007B011BA0
code=c0000005 flags=0
0104:trace:seh:call_vectored_handlers handler at 000000007B011BA0 returned 0
0104:warn:seh:virtual_unwind exception data not found in L"GDIView.exe"
--- snip ---
Wine source:
--- snip ---
$ grep -Hrni GdiSharedHandleTable
include/winternl.h:339: PVOID GdiSharedHandleTable;
/* 094/0f8 */
include/winternl.h:584: ULONG64 GdiSharedHandleTable;
/* 00f8 */
--- snip ---
https://source.winehq.org/git/wine.git/blob/56e7cd12ce0ce3bb331a8595b25aedb811b79110:/include/winternl.h#l339
(x86)
https://source.winehq.org/git/wine.git/blob/56e7cd12ce0ce3bb331a8595b25aedb811b79110:/include/winternl.h#l584
(x86_64)
$ sha1sum gdiview*.zip
4bacc3fed9a41678c72eba41937ff73b7e98ee90 gdiview-x64.zip
1115a41a1784127380ac2df0d3960f4bf09955db gdiview.zip
$ du -sh gdiview*.zip
68K gdiview-x64.zip
52K gdiview.zip
$ wine --version
wine-6.0-rc3
Regards
--
Do not reply to this email, post in Bugzilla using the
above URL to reply.
You are receiving this mail because:
You are watching all bug changes.
More information about the wine-bugs
mailing list