Wine-devel
Threads by month
- ----- 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 2021
- 86 participants
- 642 discussions
07 Jul '21
Sometimes the program path is quoted, sometimes it isn't, same for the
file argument. This can cause issues when there's spaces in the path.
Signed-off-by: Rémi Bernon <rbernon(a)codeweavers.com>
---
loader/wine.inf.in | 34 +++++++++++++++++-----------------
1 file changed, 17 insertions(+), 17 deletions(-)
diff --git a/loader/wine.inf.in b/loader/wine.inf.in
index 426fe8b1595..49e4f45da27 100644
--- a/loader/wine.inf.in
+++ b/loader/wine.inf.in
@@ -250,7 +250,7 @@ HKCR,.wri,,2,"wrifile"
HKCR,*\shellex\ContextMenuHandlers,,16
HKCR,chm.file,,2,"Compiled HTML Help File"
HKCR,chm.file\DefaultIcon,,2,"%10%\hh.exe,0"
-HKCR,chm.file\shell\open\command,,2,"%10%\hh.exe %1"
+HKCR,chm.file\shell\open\command,,2,"""%10%\hh.exe"" ""%1"""
HKCR,cplfile,,2,"Control Panel Item"
HKCR,cplfile\shell\cplopen,,2,"Open with Control Panel"
HKCR,cplfile\shell\cplopen\command,,2,"rundll32.exe shell32.dll,Control_RunDLL ""%1"",%*"
@@ -263,13 +263,13 @@ HKCR,folder\shell\open\ddeexec,"NoActivateHandler",2,""
HKCR,folder\shell\open\ddeexec\application,,2,"Folders"
HKCR,folder\shellex\ContextMenuHandlers,,16
HKCR,hlpfile,,2,"Help File"
-HKCR,hlpfile\shell\open\command,,2,"%11%\winhlp32.exe %1"
-HKCR,htmlfile\shell\open\command,,2,"""%11%\winebrowser.exe"" %1"
+HKCR,hlpfile\shell\open\command,,2,"""%11%\winhlp32.exe"" ""%1"""
+HKCR,htmlfile\shell\open\command,,2,"""%11%\winebrowser.exe"" ""%1"""
HKCR,inffile,,2,"Setup Information"
HKCR,inffile\shell\install\command,,2,"%11%\rundll32.exe setupapi,InstallHinfSection DefaultInstall 132 %1"
HKCR,inifile,,2,"Configuration Settings"
-HKCR,inifile\shell\open\command,,2,"%11%\notepad.exe %1"
-HKCR,inifile\shell\print\command,,2,"%11%\notepad.exe /p %1"
+HKCR,inifile\shell\open\command,,2,"""%11%\notepad.exe"" ""%1"""
+HKCR,inifile\shell\print\command,,2,"""%11%\notepad.exe"" /p ""%1"""
HKCR,lnkfile,,2,"Shortcut"
HKCR,lnkfile,"NeverShowExt",2,""
HKCR,lnkfile,"IsShortcut",2,"yes"
@@ -286,21 +286,21 @@ HKCR,Msi.Patch,,2,"Windows Installer Patch"
HKCR,Msi.Patch\DefaultIcon,,2,"msiexec.exe"
HKCR,Msi.Patch\shell\Open\command,,2,"%11%\msiexec.exe /p ""%1"""
HKCR,pdffile,,2,"PDF Document"
-HKCR,pdffile\shell\open\command,,2,"""%11%\winebrowser.exe"" %1"
+HKCR,pdffile\shell\open\command,,2,"""%11%\winebrowser.exe"" ""%1"""
HKCR,rtffile,,2,"Rich Text Document"
-HKCR,rtffile\shell\open\command,,2,"""%16422%\Windows NT\Accessories\wordpad.exe"" %1"
-HKCR,rtffile\shell\print\command,,2,"""%16422%\Windows NT\Accessories\wordpad.exe"" /p %1"
+HKCR,rtffile\shell\open\command,,2,"""%16422%\Windows NT\Accessories\wordpad.exe"" ""%1"""
+HKCR,rtffile\shell\print\command,,2,"""%16422%\Windows NT\Accessories\wordpad.exe"" /p ""%1"""
HKCR,txtfile,,2,"Text Document"
-HKCR,txtfile\shell\open\command,,2,"%11%\notepad.exe %1"
-HKCR,txtfile\shell\print\command,,2,"%11%\notepad.exe /p %1"
-HKCR,wrifile\shell\open\command,,2,"""%16422%\Windows NT\Accessories\wordpad.exe"" %1"
-HKCR,wrifile\shell\print\command,,2,"""%16422%\Windows NT\Accessories\wordpad.exe"" /p %1"
+HKCR,txtfile\shell\open\command,,2,"""%11%\notepad.exe"" ""%1"""
+HKCR,txtfile\shell\print\command,,2,"""%11%\notepad.exe"" /p ""%1"""
+HKCR,wrifile\shell\open\command,,2,"""%16422%\Windows NT\Accessories\wordpad.exe"" ""%1"""
+HKCR,wrifile\shell\print\command,,2,"""%16422%\Windows NT\Accessories\wordpad.exe"" /p ""%1"""
HKCR,xmlfile,,2,"XML Document"
-HKCR,xmlfile\shell\open\command,,2,"""%11%\winebrowser.exe"" %1"
-HKCR,ftp\shell\open\command,,2,"""%11%\winebrowser.exe"" %1"
-HKCR,http\shell\open\command,,2,"""%11%\winebrowser.exe"" %1"
-HKCR,https\shell\open\command,,2,"""%11%\winebrowser.exe"" %1"
-HKCR,mailto\shell\open\command,,2,"%11%\winebrowser %1"
+HKCR,xmlfile\shell\open\command,,2,"""%11%\winebrowser.exe"" ""%1"""
+HKCR,ftp\shell\open\command,,2,"""%11%\winebrowser.exe"" ""%1"""
+HKCR,http\shell\open\command,,2,"""%11%\winebrowser.exe"" ""%1"""
+HKCR,https\shell\open\command,,2,"""%11%\winebrowser.exe"" ""%1"""
+HKCR,mailto\shell\open\command,,2,"""%11%\winebrowser.exe"" ""%1"""
HKCR,MIME\Database\Charset\_iso-2022-jp$ESC,"Codepage",0x10003,932
HKCR,MIME\Database\Charset\_iso-2022-jp$ESC,"InternetEncoding",0x10003,50221
--
2.32.0
1
0
07 Jul '21
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
---
dlls/uxtheme/scrollbar.c | 67 +++++++++++++++++++++++++++++++---------
1 file changed, 53 insertions(+), 14 deletions(-)
diff --git a/dlls/uxtheme/scrollbar.c b/dlls/uxtheme/scrollbar.c
index 40fdbf4b89a..386f0446049 100644
--- a/dlls/uxtheme/scrollbar.c
+++ b/dlls/uxtheme/scrollbar.c
@@ -75,12 +75,29 @@ void WINAPI UXTHEME_ScrollBarDraw(HWND hwnd, HDC dc, INT bar, enum SCROLL_HITTES
lowertrackstate = SCRBS_NORMAL;
thumbstate = SCRBS_NORMAL;
- if (hit_test == SCROLL_TOP_RECT)
- uppertrackstate = SCRBS_HOT;
- else if (hit_test == SCROLL_BOTTOM_RECT)
- lowertrackstate = SCRBS_HOT;
- else if (hit_test == SCROLL_THUMB)
- thumbstate = SCRBS_HOT;
+ if (vertical == tracking_info->vertical && hit_test == tracking_info->hit_test
+ && GetCapture() == hwnd)
+ {
+ if (hit_test == SCROLL_TOP_RECT)
+ uppertrackstate = SCRBS_PRESSED;
+ else if (hit_test == SCROLL_BOTTOM_RECT)
+ lowertrackstate = SCRBS_PRESSED;
+ else if (hit_test == SCROLL_THUMB)
+ thumbstate = SCRBS_PRESSED;
+ }
+ else
+ {
+ if (hit_test == SCROLL_TOP_RECT)
+ uppertrackstate = SCRBS_HOT;
+ else if (hit_test == SCROLL_BOTTOM_RECT)
+ lowertrackstate = SCRBS_HOT;
+ else if (hit_test == SCROLL_THUMB)
+ thumbstate = SCRBS_HOT;
+ }
+
+ /* Thumb is also shown as pressed when tracking */
+ if (tracking_info->win == hwnd && tracking_info->bar == bar)
+ thumbstate = SCRBS_PRESSED;
}
if (bar == SB_CTL)
@@ -96,10 +113,21 @@ void WINAPI UXTHEME_ScrollBarDraw(HWND hwnd, HDC dc, INT bar, enum SCROLL_HITTES
uparrowstate = ABS_UPNORMAL;
downarrowstate = ABS_DOWNNORMAL;
- if (hit_test == SCROLL_TOP_ARROW)
- uparrowstate = ABS_UPHOT;
- else if (hit_test == SCROLL_BOTTOM_ARROW)
- downarrowstate = ABS_DOWNHOT;
+ if (vertical == tracking_info->vertical && hit_test == tracking_info->hit_test
+ && GetCapture() == hwnd)
+ {
+ if (hit_test == SCROLL_TOP_ARROW)
+ uparrowstate = ABS_UPPRESSED;
+ else if (hit_test == SCROLL_BOTTOM_ARROW)
+ downarrowstate = ABS_DOWNPRESSED;
+ }
+ else
+ {
+ if (hit_test == SCROLL_TOP_ARROW)
+ uparrowstate = ABS_UPHOT;
+ else if (hit_test == SCROLL_BOTTOM_ARROW)
+ downarrowstate = ABS_DOWNHOT;
+ }
}
partrect = *rect;
@@ -150,10 +178,21 @@ void WINAPI UXTHEME_ScrollBarDraw(HWND hwnd, HDC dc, INT bar, enum SCROLL_HITTES
leftarrowstate = ABS_LEFTNORMAL;
rightarrowstate = ABS_RIGHTNORMAL;
- if (hit_test == SCROLL_TOP_ARROW)
- leftarrowstate = ABS_LEFTHOT;
- else if (hit_test == SCROLL_BOTTOM_ARROW)
- rightarrowstate = ABS_RIGHTHOT;
+ if (vertical == tracking_info->vertical && hit_test == tracking_info->hit_test
+ && GetCapture() == hwnd)
+ {
+ if (hit_test == SCROLL_TOP_ARROW)
+ leftarrowstate = ABS_LEFTPRESSED;
+ else if (hit_test == SCROLL_BOTTOM_ARROW)
+ rightarrowstate = ABS_RIGHTPRESSED;
+ }
+ else
+ {
+ if (hit_test == SCROLL_TOP_ARROW)
+ leftarrowstate = ABS_LEFTHOT;
+ else if (hit_test == SCROLL_BOTTOM_ARROW)
+ rightarrowstate = ABS_RIGHTHOT;
+ }
}
partrect = *rect;
--
2.30.2
1
0
07 Jul '21
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=39821
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
---
dlls/user32/controls.h | 22 --
dlls/user32/hook.c | 1 +
dlls/user32/scroll.c | 47 +++-
dlls/user32/user_private.h | 3 +
dlls/uxtheme/scrollbar.c | 464 +++++--------------------------------
dlls/uxtheme/system.c | 1 +
dlls/uxtheme/uxthemedll.h | 4 +
include/winuser.h | 26 +++
8 files changed, 134 insertions(+), 434 deletions(-)
diff --git a/dlls/user32/controls.h b/dlls/user32/controls.h
index 25ff4fe05ff..bf32097f95c 100644
--- a/dlls/user32/controls.h
+++ b/dlls/user32/controls.h
@@ -180,28 +180,6 @@ extern void NC_GetSysPopupPos( HWND hwnd, RECT* rect ) DECLSPEC_HIDDEN;
/* scrollbar */
-/* Scroll-bar hit testing */
-enum SCROLL_HITTEST
-{
- SCROLL_NOWHERE, /* Outside the scroll bar */
- SCROLL_TOP_ARROW, /* Top or left arrow */
- SCROLL_TOP_RECT, /* Rectangle between the top arrow and the thumb */
- SCROLL_THUMB, /* Thumb rectangle */
- SCROLL_BOTTOM_RECT, /* Rectangle between the thumb and the bottom arrow */
- SCROLL_BOTTOM_ARROW /* Bottom or right arrow */
-};
-
-/* Scroll bar tracking information */
-struct SCROLL_TRACKING_INFO
-{
- HWND win; /* Tracking window */
- INT bar; /* SB_HORZ / SB_VERT / SB_CTL */
- INT thumb_pos; /* Thumb position */
- INT thumb_val; /* Current thumb value from thumb position */
- BOOL vertical; /* Is scroll bar vertical */
- enum SCROLL_HITTEST hit_test; /* Hit Test code of the last button-down event */
-};
-
extern void SCROLL_DrawNCScrollBar( HWND hwnd, HDC hdc, BOOL draw_horizontal, BOOL draw_vertical ) DECLSPEC_HIDDEN;
extern void SCROLL_DrawScrollBar( HWND hwnd, HDC hdc, INT nBar, enum SCROLL_HITTEST hit_test,
const struct SCROLL_TRACKING_INFO *tracking_info, BOOL arrows,
diff --git a/dlls/user32/hook.c b/dlls/user32/hook.c
index c4e71ec49b6..d20bae7970d 100644
--- a/dlls/user32/hook.c
+++ b/dlls/user32/hook.c
@@ -84,6 +84,7 @@ WINE_DECLARE_DEBUG_CHANNEL(relay);
static struct user_api_hook original_user_api =
{
USER_DefDlgProc,
+ USER_ScrollBarDraw,
USER_ScrollBarProc,
};
static struct user_api_hook hooked_user_api;
diff --git a/dlls/user32/scroll.c b/dlls/user32/scroll.c
index 9a22e930332..c4c06476b9c 100644
--- a/dlls/user32/scroll.c
+++ b/dlls/user32/scroll.c
@@ -567,10 +567,10 @@ static void SCROLL_DrawInterior( HWND hwnd, HDC hdc, INT nBar,
SelectObject( hdc, hSaveBrush );
}
-static void SCROLL_DoDrawScrollBar( HWND hwnd, HDC hdc, INT nBar, enum SCROLL_HITTEST hit_test,
- const struct SCROLL_TRACKING_INFO *tracking_info, BOOL arrows,
- BOOL interior, RECT *rect, INT arrowSize, INT thumbPos,
- INT thumbSize, BOOL vertical )
+void WINAPI USER_ScrollBarDraw( HWND hwnd, HDC hdc, INT nBar, enum SCROLL_HITTEST hit_test,
+ const struct SCROLL_TRACKING_INFO *tracking_info, BOOL arrows,
+ BOOL interior, RECT *rect, INT arrowSize, INT thumbPos,
+ INT thumbSize, BOOL vertical )
{
SCROLLBAR_INFO *infoPtr;
@@ -678,8 +678,8 @@ void SCROLL_DrawScrollBar( HWND hwnd, HDC hdc, INT bar, enum SCROLL_HITTEST hit_
tracking_info->thumb_val, tracking_info->vertical, tracking_info->hit_test, draw_arrows,
draw_interior, wine_dbgstr_rect(&rect), arrow_size, thumb_pos, thumb_size, vertical,
GetCapture());
- SCROLL_DoDrawScrollBar( hwnd, hdc, bar, hit_test, tracking_info, draw_arrows, draw_interior,
- &rect, arrow_size, thumb_pos, thumb_size, vertical );
+ user_api->pScrollBarDraw( hwnd, hdc, bar, hit_test, tracking_info, draw_arrows, draw_interior,
+ &rect, arrow_size, thumb_pos, thumb_size, vertical );
}
void SCROLL_DrawNCScrollBar( HWND hwnd, HDC hdc, BOOL draw_horizontal, BOOL draw_vertical )
@@ -764,6 +764,7 @@ static void SCROLL_HandleScrollEvent( HWND hwnd, INT nBar, UINT msg, POINT pt)
enum SCROLL_HITTEST hittest;
HWND hwndOwner, hwndCtl;
+ TRACKMOUSEEVENT tme;
BOOL vertical;
INT arrowSize, thumbSize, thumbPos;
RECT rect;
@@ -771,7 +772,8 @@ static void SCROLL_HandleScrollEvent( HWND hwnd, INT nBar, UINT msg, POINT pt)
SCROLLBAR_INFO *infoPtr = SCROLL_GetInternalInfo( hwnd, nBar, FALSE );
if (!infoPtr) return;
- if ((g_tracking_info.hit_test == SCROLL_NOWHERE) && (msg != WM_LBUTTONDOWN))
+ if ((g_tracking_info.hit_test == SCROLL_NOWHERE)
+ && (msg != WM_LBUTTONDOWN && msg != WM_MOUSEMOVE && msg != WM_MOUSELEAVE))
return;
if (nBar == SB_CTL && (GetWindowLongW( hwnd, GWL_STYLE ) & (SBS_SIZEGRIP | SBS_SIZEBOX)))
@@ -821,8 +823,29 @@ static void SCROLL_HandleScrollEvent( HWND hwnd, INT nBar, UINT msg, POINT pt)
break;
case WM_MOUSEMOVE:
- hittest = SCROLL_HitTest( hwnd, nBar, pt, TRUE );
+ hittest = SCROLL_HitTest( hwnd, nBar, pt, vertical == g_tracking_info.vertical && GetCapture() == hwnd );
prevPt = pt;
+
+ if (nBar != SB_CTL)
+ break;
+
+ tme.cbSize = sizeof(tme);
+ tme.dwFlags = TME_QUERY;
+ TrackMouseEvent( &tme );
+ if (!(tme.dwFlags & TME_LEAVE) || tme.hwndTrack != hwnd)
+ {
+ tme.dwFlags = TME_LEAVE;
+ tme.hwndTrack = hwnd;
+ TrackMouseEvent( &tme );
+ }
+
+ break;
+
+ case WM_MOUSELEAVE:
+ if (nBar != SB_CTL)
+ return;
+
+ hittest = SCROLL_NOWHERE;
break;
case WM_LBUTTONUP:
@@ -847,6 +870,8 @@ static void SCROLL_HandleScrollEvent( HWND hwnd, INT nBar, UINT msg, POINT pt)
switch (g_tracking_info.hit_test)
{
case SCROLL_NOWHERE: /* No tracking in progress */
+ if (msg == WM_MOUSEMOVE || msg == WM_MOUSELEAVE)
+ SCROLL_DrawScrollBar( hwnd, hdc, nBar, hittest, &g_tracking_info, TRUE, TRUE );
break;
case SCROLL_TOP_ARROW:
@@ -898,7 +923,7 @@ static void SCROLL_HandleScrollEvent( HWND hwnd, INT nBar, UINT msg, POINT pt)
{
SCROLL_DrawScrollBar( hwnd, hdc, nBar, SCROLL_NOWHERE, &g_tracking_info, FALSE, TRUE );
}
- else /* WM_MOUSEMOVE */
+ else if (msg == WM_MOUSEMOVE)
{
INT pos;
@@ -986,6 +1011,8 @@ static void SCROLL_HandleScrollEvent( HWND hwnd, INT nBar, UINT msg, POINT pt)
/* Terminate tracking */
g_tracking_info.win = 0;
SCROLL_MovingThumb = FALSE;
+ hittest = SCROLL_NOWHERE;
+ SCROLL_DrawScrollBar( hwnd, hdc, nBar, hittest, &g_tracking_info, TRUE, TRUE );
}
ReleaseDC( hwnd, hdc );
@@ -1021,6 +1048,7 @@ void SCROLL_TrackScrollBar( HWND hwnd, INT scrollbar, POINT pt )
if (CallMsgFilterW( &msg, MSGF_SCROLLBAR )) continue;
if (msg.message == WM_LBUTTONUP ||
msg.message == WM_MOUSEMOVE ||
+ msg.message == WM_MOUSELEAVE ||
(msg.message == WM_SYSTIMER && msg.wParam == SCROLL_TIMER))
{
pt.x = (short)LOWORD(msg.lParam) - rect.left;
@@ -1356,6 +1384,7 @@ LRESULT WINAPI USER_ScrollBarProc( HWND hwnd, UINT message, WPARAM wParam, LPARA
break;
case WM_LBUTTONUP:
case WM_MOUSEMOVE:
+ case WM_MOUSELEAVE:
case WM_SYSTIMER:
{
POINT pt;
diff --git a/dlls/user32/user_private.h b/dlls/user32/user_private.h
index 8750008a5fb..7c4d9015976 100644
--- a/dlls/user32/user_private.h
+++ b/dlls/user32/user_private.h
@@ -389,5 +389,8 @@ struct png_funcs
extern struct user_api_hook *user_api DECLSPEC_HIDDEN;
LRESULT WINAPI USER_DefDlgProc(HWND, UINT, WPARAM, LPARAM, BOOL) DECLSPEC_HIDDEN;
LRESULT WINAPI USER_ScrollBarProc(HWND, UINT, WPARAM, LPARAM, BOOL) DECLSPEC_HIDDEN;
+void WINAPI USER_ScrollBarDraw(HWND, HDC, INT, enum SCROLL_HITTEST,
+ const struct SCROLL_TRACKING_INFO *, BOOL, BOOL, RECT *, INT, INT,
+ INT, BOOL) DECLSPEC_HIDDEN;
#endif /* __WINE_USER_PRIVATE_H */
diff --git a/dlls/uxtheme/scrollbar.c b/dlls/uxtheme/scrollbar.c
index 393b45a831d..40fdbf4b89a 100644
--- a/dlls/uxtheme/scrollbar.c
+++ b/dlls/uxtheme/scrollbar.c
@@ -20,8 +20,6 @@
*/
#include <stdarg.h>
-#include <string.h>
-#include <stdlib.h>
#include "windef.h"
#include "winbase.h"
@@ -32,299 +30,27 @@
#include "vssym32.h"
#include "wine/debug.h"
-/* Minimum size of the thumb in pixels */
-#define SCROLL_MIN_THUMB 6
-
-/* Minimum size of the rectangle between the arrows */
-#define SCROLL_MIN_RECT 4
-
-enum SCROLL_HITTEST
-{
- SCROLL_NOWHERE, /* Outside the scroll bar */
- SCROLL_TOP_ARROW, /* Top or left arrow */
- SCROLL_TOP_RECT, /* Rectangle between the top arrow and the thumb */
- SCROLL_THUMB, /* Thumb rectangle */
- SCROLL_BOTTOM_RECT, /* Rectangle between the thumb and the bottom arrow */
- SCROLL_BOTTOM_ARROW /* Bottom or right arrow */
-};
-
-static HWND tracking_win = 0;
-static enum SCROLL_HITTEST tracking_hot_part = SCROLL_NOWHERE;
-
WINE_DEFAULT_DEBUG_CHANNEL(theme_scroll);
-static void calc_thumb_dimensions(unsigned int size, SCROLLINFO *si, unsigned int *thumbpos, unsigned int *thumbsize)
+void WINAPI UXTHEME_ScrollBarDraw(HWND hwnd, HDC dc, INT bar, enum SCROLL_HITTEST hit_test,
+ const struct SCROLL_TRACKING_INFO *tracking_info,
+ BOOL draw_arrows, BOOL draw_interior, RECT *rect, INT arrowsize,
+ INT thumbpos, INT thumbsize, BOOL vertical)
{
- if (size <= SCROLL_MIN_RECT)
- *thumbpos = *thumbsize = 0;
- else if (si->nPage > si->nMax - si->nMin)
- *thumbpos = *thumbsize = 0;
- else {
- if (si->nPage > 0) {
- *thumbsize = MulDiv(size, si->nPage, si->nMax - si->nMin + 1);
- if (*thumbsize < SCROLL_MIN_THUMB) *thumbsize = SCROLL_MIN_THUMB;
- }
- else *thumbsize = GetSystemMetrics(SM_CXVSCROLL);
-
- if (size < *thumbsize)
- *thumbpos = *thumbsize = 0;
- else {
- int max = si->nMax - max(si->nPage - 1, 0);
- size -= *thumbsize;
- if (si->nMin >= max)
- *thumbpos = 0;
- else
- *thumbpos = MulDiv(size, si->nTrackPos - si->nMin, max - si->nMin);
- }
- }
-}
-
-static enum SCROLL_HITTEST hit_test(HWND hwnd, HTHEME theme, POINT pt)
-{
- RECT r;
- DWORD style = GetWindowLongW(hwnd, GWL_STYLE);
- BOOL vertical = style & SBS_VERT;
- SIZE sz;
- SCROLLINFO si;
- unsigned int offset, size, upsize, downsize, thumbpos, thumbsize;
-
- GetWindowRect(hwnd, &r);
- OffsetRect(&r, -r.left, -r.top);
-
- if (vertical) {
- offset = pt.y;
- size = r.bottom;
-
- if (FAILED(GetThemePartSize(theme, NULL, SBP_ARROWBTN, ABS_UPNORMAL, NULL, TS_DRAW, &sz))) {
- WARN("Could not get up arrow size.\n");
- upsize = 0;
- } else
- upsize = sz.cy;
-
- if (FAILED(GetThemePartSize(theme, NULL, SBP_ARROWBTN, ABS_DOWNNORMAL, NULL, TS_DRAW, &sz))) {
- WARN("Could not get down arrow size.\n");
- downsize = 0;
- } else
- downsize = sz.cy;
- } else {
- offset = pt.x;
- size = r.right;
-
- if (FAILED(GetThemePartSize(theme, NULL, SBP_ARROWBTN, ABS_LEFTNORMAL, NULL, TS_DRAW, &sz))) {
- WARN("Could not get left arrow size.\n");
- upsize = 0;
- } else
- upsize = sz.cx;
-
- if (FAILED(GetThemePartSize(theme, NULL, SBP_ARROWBTN, ABS_RIGHTNORMAL, NULL, TS_DRAW, &sz))) {
- WARN("Could not get right arrow size.\n");
- downsize = 0;
- } else
- downsize = sz.cx;
- }
-
- if (pt.x < 0 || pt.x > r.right || pt.y < 0 || pt.y > r.bottom)
- return SCROLL_NOWHERE;
-
- if (size < SCROLL_MIN_RECT + upsize + downsize)
- upsize = downsize = (size - SCROLL_MIN_RECT)/2;
-
- if (offset < upsize)
- return SCROLL_TOP_ARROW;
-
- if (offset > size - downsize)
- return SCROLL_BOTTOM_ARROW;
-
- si.cbSize = sizeof(si);
- si.fMask = SIF_ALL;
- if (!GetScrollInfo(hwnd, SB_CTL, &si)) {
- WARN("GetScrollInfo failed.\n");
- return SCROLL_NOWHERE;
- }
-
- calc_thumb_dimensions(size - upsize - downsize, &si, &thumbpos, &thumbsize);
-
- if (offset < upsize + thumbpos)
- return SCROLL_TOP_RECT;
- else if (offset < upsize + thumbpos + thumbsize)
- return SCROLL_THUMB;
- else
- return SCROLL_BOTTOM_RECT;
-}
-
-static void redraw_part(HWND hwnd, HTHEME theme, enum SCROLL_HITTEST part)
-{
- DWORD style = GetWindowLongW(hwnd, GWL_STYLE);
- BOOL vertical = style & SBS_VERT;
- SIZE sz;
- RECT r, partrect;
- unsigned int size, upsize, downsize;
-
- if (part == SCROLL_NOWHERE) { /* redraw everything */
- InvalidateRect(hwnd, NULL, TRUE);
- return;
- }
-
- GetWindowRect(hwnd, &r);
- OffsetRect(&r, -r.left, -r.top);
-
- if (vertical) {
- size = r.bottom;
-
- if (FAILED(GetThemePartSize(theme, NULL, SBP_ARROWBTN, ABS_UPNORMAL, NULL, TS_DRAW, &sz))) {
- WARN("Could not get up arrow size.\n");
- upsize = 0;
- } else
- upsize = sz.cy;
-
- if (FAILED(GetThemePartSize(theme, NULL, SBP_ARROWBTN, ABS_DOWNNORMAL, NULL, TS_DRAW, &sz))) {
- WARN("Could not get down arrow size.\n");
- downsize = 0;
- } else
- downsize = sz.cy;
- } else {
- size = r.right;
-
- if (FAILED(GetThemePartSize(theme, NULL, SBP_ARROWBTN, ABS_LEFTNORMAL, NULL, TS_DRAW, &sz))) {
- WARN("Could not get left arrow size.\n");
- upsize = 0;
- } else
- upsize = sz.cx;
-
- if (FAILED(GetThemePartSize(theme, NULL, SBP_ARROWBTN, ABS_RIGHTNORMAL, NULL, TS_DRAW, &sz))) {
- WARN("Could not get right arrow size.\n");
- downsize = 0;
- } else
- downsize = sz.cx;
- }
-
- if (size < SCROLL_MIN_RECT + upsize + downsize)
- upsize = downsize = (size - SCROLL_MIN_RECT)/2;
-
- partrect = r;
-
- if (part == SCROLL_TOP_ARROW) {
- if (vertical)
- partrect.bottom = partrect.top + upsize;
- else
- partrect.right = partrect.left + upsize;
- } else if (part == SCROLL_BOTTOM_ARROW) {
- if (vertical)
- partrect.top = partrect.bottom - downsize;
- else
- partrect.left = partrect.right - downsize;
- } else {
- unsigned int thumbpos, thumbsize;
- SCROLLINFO si;
-
- si.cbSize = sizeof(si);
- si.fMask = SIF_ALL;
- if (!GetScrollInfo(hwnd, SB_CTL, &si)) {
- WARN("GetScrollInfo failed.\n");
- return;
- }
-
- calc_thumb_dimensions(size - upsize - downsize, &si, &thumbpos, &thumbsize);
-
- if (part == SCROLL_TOP_RECT) {
- if (vertical) {
- partrect.top = r.top + upsize;
- partrect.bottom = partrect.top + thumbpos;
- } else {
- partrect.left = r.left + upsize;
- partrect.right = partrect.left + thumbpos;
- }
- } else if (part == SCROLL_THUMB) {
- if (vertical) {
- partrect.top = r.top + upsize + thumbpos;
- partrect.bottom = partrect.top + thumbsize;
- } else {
- partrect.left = r.left + upsize + thumbpos;
- partrect.right = partrect.left + thumbsize;
- }
- } else if (part == SCROLL_BOTTOM_RECT) {
- if (vertical) {
- partrect.top = r.top + upsize + thumbpos + thumbsize;
- partrect.bottom = r.bottom - downsize;
- } else {
- partrect.left = r.left + upsize + thumbpos + thumbsize;
- partrect.right = r.right - downsize;
- }
- }
- }
-
- InvalidateRect(hwnd, &partrect, TRUE);
-}
-
-static void scroll_event(HWND hwnd, HTHEME theme, UINT msg, POINT pt)
-{
- enum SCROLL_HITTEST hittest;
- TRACKMOUSEEVENT tme;
-
- if (GetWindowLongW(hwnd, GWL_STYLE) & (SBS_SIZEGRIP | SBS_SIZEBOX))
- return;
-
- hittest = hit_test(hwnd, theme, pt);
-
- switch (msg)
- {
- case WM_MOUSEMOVE:
- hittest = hit_test(hwnd, theme, pt);
- tracking_win = hwnd;
- break;
-
- case WM_MOUSELEAVE:
- if (tracking_win == hwnd) {
- hittest = SCROLL_NOWHERE;
- }
- break;
- }
-
- tme.cbSize = sizeof(tme);
- tme.dwFlags = TME_QUERY;
- TrackMouseEvent(&tme);
-
- if (!(tme.dwFlags & TME_LEAVE) || tme.hwndTrack != hwnd) {
- tme.dwFlags = TME_LEAVE;
- tme.hwndTrack = hwnd;
- TrackMouseEvent(&tme);
- }
-
- if (tracking_win != hwnd && msg == WM_MOUSELEAVE) {
- redraw_part(hwnd, theme, SCROLL_NOWHERE);
- return;
- }
-
- if (tracking_win == hwnd && hittest != tracking_hot_part) {
- enum SCROLL_HITTEST oldhotpart = tracking_hot_part;
-
- tracking_hot_part = hittest;
-
- if (hittest != SCROLL_NOWHERE)
- redraw_part(hwnd, theme, hittest);
- else
- tracking_win = 0;
-
- if (oldhotpart != SCROLL_NOWHERE)
- redraw_part(hwnd, theme, oldhotpart);
- }
-}
-
-static void paint_scrollbar(HWND hwnd, HTHEME theme)
-{
- HDC dc;
- PAINTSTRUCT ps;
- RECT r;
- DWORD style = GetWindowLongW(hwnd, GWL_STYLE);
- BOOL vertical = style & SBS_VERT;
BOOL disabled = !IsWindowEnabled(hwnd);
+ HTHEME theme;
+ DWORD style;
- GetWindowRect(hwnd, &r);
- OffsetRect(&r, -r.left, -r.top);
+ theme = bar == SB_CTL ? GetWindowTheme(hwnd) : OpenThemeData(NULL, WC_SCROLLBARW);
+ if (!theme)
+ {
+ user_api.pScrollBarDraw(hwnd, dc, bar, hit_test, tracking_info, draw_arrows, draw_interior,
+ rect, arrowsize, thumbpos, thumbsize, vertical);
+ return;
+ }
- dc = BeginPaint(hwnd, &ps);
-
- if (style & SBS_SIZEBOX || style & SBS_SIZEGRIP) {
+ style = GetWindowLongW(hwnd, GWL_STYLE);
+ if (bar == SB_CTL && (style & SBS_SIZEBOX || style & SBS_SIZEGRIP)) {
int state;
if (style & SBS_SIZEBOXTOPLEFTALIGN)
@@ -334,20 +60,12 @@ static void paint_scrollbar(HWND hwnd, HTHEME theme)
if (IsThemeBackgroundPartiallyTransparent(theme, SBP_SIZEBOX, state))
DrawThemeParentBackground(hwnd, dc, NULL);
- DrawThemeBackground(theme, dc, SBP_SIZEBOX, state, &r, NULL);
+ DrawThemeBackground(theme, dc, SBP_SIZEBOX, state, rect, NULL);
} else {
- SCROLLINFO si;
- unsigned int thumbpos, thumbsize;
int uppertrackstate, lowertrackstate, thumbstate;
- RECT partrect, trackrect;
+ RECT partrect;
SIZE grippersize;
- si.cbSize = sizeof(si);
- si.fMask = SIF_ALL;
- GetScrollInfo(hwnd, SB_CTL, &si);
-
- trackrect = r;
-
if (disabled) {
uppertrackstate = SCRBS_DISABLED;
lowertrackstate = SCRBS_DISABLED;
@@ -357,20 +75,18 @@ static void paint_scrollbar(HWND hwnd, HTHEME theme)
lowertrackstate = SCRBS_NORMAL;
thumbstate = SCRBS_NORMAL;
- if (tracking_win == hwnd) {
- if (tracking_hot_part == SCROLL_TOP_RECT)
- uppertrackstate = SCRBS_HOT;
- else if (tracking_hot_part == SCROLL_BOTTOM_RECT)
- lowertrackstate = SCRBS_HOT;
- else if (tracking_hot_part == SCROLL_THUMB)
- thumbstate = SCRBS_HOT;
- }
+ if (hit_test == SCROLL_TOP_RECT)
+ uppertrackstate = SCRBS_HOT;
+ else if (hit_test == SCROLL_BOTTOM_RECT)
+ lowertrackstate = SCRBS_HOT;
+ else if (hit_test == SCROLL_THUMB)
+ thumbstate = SCRBS_HOT;
}
- DrawThemeParentBackground(hwnd, dc, NULL);
+ if (bar == SB_CTL)
+ DrawThemeParentBackground(hwnd, dc, NULL);
if (vertical) {
- SIZE upsize, downsize;
int uparrowstate, downarrowstate;
if (disabled) {
@@ -380,50 +96,29 @@ static void paint_scrollbar(HWND hwnd, HTHEME theme)
uparrowstate = ABS_UPNORMAL;
downarrowstate = ABS_DOWNNORMAL;
- if (tracking_win == hwnd) {
- if (tracking_hot_part == SCROLL_TOP_ARROW)
- uparrowstate = ABS_UPHOT;
- else if (tracking_hot_part == SCROLL_BOTTOM_ARROW)
- downarrowstate = ABS_DOWNHOT;
- }
+ if (hit_test == SCROLL_TOP_ARROW)
+ uparrowstate = ABS_UPHOT;
+ else if (hit_test == SCROLL_BOTTOM_ARROW)
+ downarrowstate = ABS_DOWNHOT;
}
- if (FAILED(GetThemePartSize(theme, dc, SBP_ARROWBTN, uparrowstate, NULL, TS_DRAW, &upsize))) {
- WARN("Could not get up arrow size.\n");
- return;
- }
-
- if (FAILED(GetThemePartSize(theme, dc, SBP_ARROWBTN, downarrowstate, NULL, TS_DRAW, &downsize))) {
- WARN("Could not get down arrow size.\n");
- return;
- }
-
- if (r.bottom - r.top - upsize.cy - downsize.cy < SCROLL_MIN_RECT)
- upsize.cy = downsize.cy = (r.bottom - r.top - SCROLL_MIN_RECT)/2;
-
- partrect = r;
- partrect.bottom = partrect.top + upsize.cy;
+ partrect = *rect;
+ partrect.bottom = partrect.top + arrowsize;
DrawThemeBackground(theme, dc, SBP_ARROWBTN, uparrowstate, &partrect, NULL);
- trackrect.top = partrect.bottom;
-
- partrect.bottom = r.bottom;
- partrect.top = partrect.bottom - downsize.cy;
+ partrect.bottom = rect->bottom;
+ partrect.top = partrect.bottom - arrowsize;
DrawThemeBackground(theme, dc, SBP_ARROWBTN, downarrowstate, &partrect, NULL);
- trackrect.bottom = partrect.top;
-
- calc_thumb_dimensions(trackrect.bottom - trackrect.top, &si, &thumbpos, &thumbsize);
-
if (thumbpos > 0) {
- partrect.top = trackrect.top;
- partrect.bottom = partrect.top + thumbpos;
+ partrect.top = rect->top + arrowsize;
+ partrect.bottom = rect->top + thumbpos;
DrawThemeBackground(theme, dc, SBP_UPPERTRACKVERT, uppertrackstate, &partrect, NULL);
}
if (thumbsize > 0) {
- partrect.top = trackrect.top + thumbpos;
+ partrect.top = rect->top + thumbpos;
partrect.bottom = partrect.top + thumbsize;
DrawThemeBackground(theme, dc, SBP_THUMBBTNVERT, thumbstate, &partrect, NULL);
@@ -438,14 +133,14 @@ static void paint_scrollbar(HWND hwnd, HTHEME theme)
}
}
- if (thumbpos + thumbsize < trackrect.bottom - trackrect.top) {
- partrect.bottom = trackrect.bottom;
- partrect.top = trackrect.top + thumbsize + thumbpos;
-
+ partrect.bottom = rect->bottom - arrowsize;
+ if (thumbsize > 0)
+ partrect.top = rect->top + thumbpos + thumbsize;
+ else
+ partrect.top = rect->top + arrowsize;
+ if (partrect.bottom > partrect.top)
DrawThemeBackground(theme, dc, SBP_LOWERTRACKVERT, lowertrackstate, &partrect, NULL);
- }
} else {
- SIZE leftsize, rightsize;
int leftarrowstate, rightarrowstate;
if (disabled) {
@@ -455,50 +150,29 @@ static void paint_scrollbar(HWND hwnd, HTHEME theme)
leftarrowstate = ABS_LEFTNORMAL;
rightarrowstate = ABS_RIGHTNORMAL;
- if (tracking_win == hwnd) {
- if (tracking_hot_part == SCROLL_TOP_ARROW)
- leftarrowstate = ABS_LEFTHOT;
- else if (tracking_hot_part == SCROLL_BOTTOM_ARROW)
- rightarrowstate = ABS_RIGHTHOT;
- }
+ if (hit_test == SCROLL_TOP_ARROW)
+ leftarrowstate = ABS_LEFTHOT;
+ else if (hit_test == SCROLL_BOTTOM_ARROW)
+ rightarrowstate = ABS_RIGHTHOT;
}
- if (FAILED(GetThemePartSize(theme, dc, SBP_ARROWBTN, leftarrowstate, NULL, TS_DRAW, &leftsize))) {
- WARN("Could not get left arrow size.\n");
- return;
- }
-
- if (FAILED(GetThemePartSize(theme, dc, SBP_ARROWBTN, rightarrowstate, NULL, TS_DRAW, &rightsize))) {
- WARN("Could not get right arrow size.\n");
- return;
- }
-
- if (r.right - r.left - leftsize.cx - rightsize.cx < SCROLL_MIN_RECT)
- leftsize.cx = rightsize.cx = (r.right - r.left - SCROLL_MIN_RECT)/2;
-
- partrect = r;
- partrect.right = partrect.left + leftsize.cx;
+ partrect = *rect;
+ partrect.right = partrect.left + arrowsize;
DrawThemeBackground(theme, dc, SBP_ARROWBTN, leftarrowstate, &partrect, NULL);
- trackrect.left = partrect.right;
-
- partrect.right = r.right;
- partrect.left = partrect.right - rightsize.cx;
+ partrect.right = rect->right;
+ partrect.left = partrect.right - arrowsize;
DrawThemeBackground(theme, dc, SBP_ARROWBTN, rightarrowstate, &partrect, NULL);
- trackrect.right = partrect.left;
-
- calc_thumb_dimensions(trackrect.right - trackrect.left, &si, &thumbpos, &thumbsize);
-
if (thumbpos > 0) {
- partrect.left = trackrect.left;
- partrect.right = partrect.left + thumbpos;
+ partrect.left = rect->left + arrowsize;
+ partrect.right = rect->left + thumbpos;
DrawThemeBackground(theme, dc, SBP_UPPERTRACKHORZ, uppertrackstate, &partrect, NULL);
}
if (thumbsize > 0) {
- partrect.left = trackrect.left + thumbpos;
+ partrect.left = rect->left + thumbpos;
partrect.right = partrect.left + thumbsize;
DrawThemeBackground(theme, dc, SBP_THUMBBTNHORZ, thumbstate, &partrect, NULL);
@@ -513,16 +187,18 @@ static void paint_scrollbar(HWND hwnd, HTHEME theme)
}
}
- if (thumbpos + thumbsize < trackrect.right - trackrect.left) {
- partrect.right = trackrect.right;
- partrect.left = trackrect.left + thumbsize + thumbpos;
-
+ partrect.right = rect->right - arrowsize;
+ if (thumbsize > 0)
+ partrect.left = rect->left + thumbpos + thumbsize;
+ else
+ partrect.left = rect->left + arrowsize;
+ if (partrect.right > partrect.left)
DrawThemeBackground(theme, dc, SBP_LOWERTRACKHORZ, lowertrackstate, &partrect, NULL);
- }
}
}
- EndPaint(hwnd, &ps);
+ if (bar != SB_CTL)
+ CloseThemeData(theme);
}
LRESULT WINAPI UXTHEME_ScrollbarWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam,
@@ -531,7 +207,6 @@ LRESULT WINAPI UXTHEME_ScrollbarWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPAR
const WCHAR* themeClass = WC_SCROLLBARW;
HTHEME theme;
LRESULT result;
- POINT pt;
TRACE("(%p, 0x%x, %lu, %lu, %d)\n", hwnd, msg, wParam, lParam, unicode);
@@ -560,23 +235,6 @@ LRESULT WINAPI UXTHEME_ScrollbarWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPAR
* which will do the repaint. */
break;
- case WM_PAINT:
- theme = GetWindowTheme(hwnd);
- if (!theme) return user_api.pScrollBarWndProc(hwnd, msg, wParam, lParam, unicode);
-
- paint_scrollbar(hwnd, theme);
- break;
-
- case WM_MOUSEMOVE:
- case WM_MOUSELEAVE:
- theme = GetWindowTheme(hwnd);
- if (!theme) return user_api.pScrollBarWndProc(hwnd, msg, wParam, lParam, unicode);
-
- pt.x = (short)LOWORD(lParam);
- pt.y = (short)HIWORD(lParam);
- scroll_event(hwnd, theme, msg, pt);
- break;
-
default:
return user_api.pScrollBarWndProc(hwnd, msg, wParam, lParam, unicode);
}
diff --git a/dlls/uxtheme/system.c b/dlls/uxtheme/system.c
index f5ddc20eb08..63861260de9 100644
--- a/dlls/uxtheme/system.c
+++ b/dlls/uxtheme/system.c
@@ -1230,6 +1230,7 @@ BOOL WINAPI ThemeHooksInstall(void)
struct user_api_hook hooks;
hooks.pDefDlgProc = UXTHEME_DefDlgProc;
+ hooks.pScrollBarDraw = UXTHEME_ScrollBarDraw;
hooks.pScrollBarWndProc = UXTHEME_ScrollbarWndProc;
return __wine_register_user_api_hook(&hooks, &user_api);
}
diff --git a/dlls/uxtheme/uxthemedll.h b/dlls/uxtheme/uxthemedll.h
index 67932f22f88..4b8f95764d6 100644
--- a/dlls/uxtheme/uxthemedll.h
+++ b/dlls/uxtheme/uxthemedll.h
@@ -103,6 +103,10 @@ extern void UXTHEME_UninitSystem(void) DECLSPEC_HIDDEN;
extern struct user_api_hook user_api DECLSPEC_HIDDEN;
LRESULT WINAPI UXTHEME_DefDlgProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam, BOOL unicode) DECLSPEC_HIDDEN;
+void WINAPI UXTHEME_ScrollBarDraw(HWND hwnd, HDC dc, INT bar, enum SCROLL_HITTEST hit_test,
+ const struct SCROLL_TRACKING_INFO *tracking_info,
+ BOOL draw_arrows, BOOL draw_interior, RECT *rect, INT arrowsize,
+ INT thumbpos, INT thumbsize, BOOL vertical) DECLSPEC_HIDDEN;
LRESULT WINAPI UXTHEME_ScrollbarWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam,
BOOL unicode) DECLSPEC_HIDDEN;
diff --git a/include/winuser.h b/include/winuser.h
index 6df5ead5bc5..497cfc7782e 100644
--- a/include/winuser.h
+++ b/include/winuser.h
@@ -4409,9 +4409,35 @@ WORD WINAPI SYSTEM_KillSystemTimer( WORD );
WINUSERAPI BOOL CDECL __wine_send_input( HWND hwnd, const INPUT *input, const RAWINPUT *rawinput );
/* Uxtheme hook functions and struct */
+
+/* Scroll bar hit testing */
+enum SCROLL_HITTEST
+{
+ SCROLL_NOWHERE, /* Outside the scroll bar */
+ SCROLL_TOP_ARROW, /* Top or left arrow */
+ SCROLL_TOP_RECT, /* Rectangle between the top arrow and the thumb */
+ SCROLL_THUMB, /* Thumb rectangle */
+ SCROLL_BOTTOM_RECT, /* Rectangle between the thumb and the bottom arrow */
+ SCROLL_BOTTOM_ARROW /* Bottom or right arrow */
+};
+
+/* Scroll bar tracking information */
+struct SCROLL_TRACKING_INFO
+{
+ HWND win; /* Tracking window */
+ INT bar; /* SB_HORZ/SB_VERT/SB_CTL */
+ INT thumb_pos; /* Thumb position */
+ INT thumb_val; /* Current thumb value from thumb position */
+ BOOL vertical; /* Is scroll bar vertical */
+ enum SCROLL_HITTEST hit_test; /* Hit Test code of the last button-down event */
+};
+
struct user_api_hook
{
LRESULT (WINAPI *pDefDlgProc)(HWND, UINT, WPARAM, LPARAM, BOOL);
+ void (WINAPI *pScrollBarDraw)(HWND, HDC, INT, enum SCROLL_HITTEST,
+ const struct SCROLL_TRACKING_INFO *, BOOL, BOOL, RECT *, INT, INT,
+ INT, BOOL);
LRESULT (WINAPI *pScrollBarWndProc)(HWND, UINT, WPARAM, LPARAM, BOOL);
};
--
2.30.2
1
0
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=51137
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
---
dlls/comctl32/Makefile.in | 2 -
dlls/comctl32/comctl32.h | 4 -
dlls/comctl32/commctrl.c | 7 +-
dlls/comctl32/theming.c | 157 ------------------
dlls/user32/defdlg.c | 35 +++-
dlls/user32/hook.c | 1 +
dlls/user32/user_private.h | 1 +
dlls/uxtheme/Makefile.in | 1 +
.../theme_dialog.c => uxtheme/dialog.c} | 25 ++-
dlls/uxtheme/system.c | 1 +
dlls/uxtheme/uxthemedll.h | 1 +
include/winuser.h | 1 +
12 files changed, 45 insertions(+), 191 deletions(-)
delete mode 100644 dlls/comctl32/theming.c
rename dlls/{comctl32/theme_dialog.c => uxtheme/dialog.c} (81%)
diff --git a/dlls/comctl32/Makefile.in b/dlls/comctl32/Makefile.in
index bd99d8f0276..63bfbf0892c 100644
--- a/dlls/comctl32/Makefile.in
+++ b/dlls/comctl32/Makefile.in
@@ -37,8 +37,6 @@ C_SRCS = \
syslink.c \
tab.c \
taskdialog.c \
- theme_dialog.c \
- theming.c \
toolbar.c \
tooltips.c \
trackbar.c \
diff --git a/dlls/comctl32/comctl32.h b/dlls/comctl32/comctl32.h
index 66b341ae5ad..44d3b43ab9b 100644
--- a/dlls/comctl32/comctl32.h
+++ b/dlls/comctl32/comctl32.h
@@ -280,8 +280,4 @@ int MONTHCAL_MonthLength(int month, int year) DECLSPEC_HIDDEN;
int MONTHCAL_CalculateDayOfWeek(SYSTEMTIME *date, BOOL inplace) DECLSPEC_HIDDEN;
LONG MONTHCAL_CompareSystemTime(const SYSTEMTIME *first, const SYSTEMTIME *second) DECLSPEC_HIDDEN;
-extern void THEMING_Initialize(void) DECLSPEC_HIDDEN;
-extern void THEMING_Uninitialize(void) DECLSPEC_HIDDEN;
-extern LRESULT THEMING_CallOriginalClass(HWND, UINT, WPARAM, LPARAM) DECLSPEC_HIDDEN;
-
#endif /* __WINE_COMCTL32_H */
diff --git a/dlls/comctl32/commctrl.c b/dlls/comctl32/commctrl.c
index cb9c22a3a88..1c7718e2400 100644
--- a/dlls/comctl32/commctrl.c
+++ b/dlls/comctl32/commctrl.c
@@ -72,6 +72,7 @@
#define NO_SHLWAPI_STREAM
#include "shlwapi.h"
#include "comctl32.h"
+#include "uxtheme.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(commctrl);
@@ -208,14 +209,12 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
TREEVIEW_Register ();
UPDOWN_Register ();
- /* subclass user32 controls */
- THEMING_Initialize ();
+ /* Call IsThemeActive() so that delay-loaded uxtheme.dll is loaded for hooking user32 */
+ IsThemeActive();
break;
case DLL_PROCESS_DETACH:
if (lpvReserved) break;
- /* clean up subclassing */
- THEMING_Uninitialize();
/* unregister all common control classes */
ANIMATE_Unregister ();
diff --git a/dlls/comctl32/theming.c b/dlls/comctl32/theming.c
deleted file mode 100644
index c74bcfc36a2..00000000000
--- a/dlls/comctl32/theming.c
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Theming - Initialization
- *
- * Copyright (c) 2005 by Frank Richter
- *
- * 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 <stdarg.h>
-
-#include "windef.h"
-#include "winbase.h"
-#include "wingdi.h"
-#include "winuser.h"
-#include "comctl32.h"
-#include "wine/debug.h"
-
-WINE_DEFAULT_DEBUG_CHANNEL(theming);
-
-typedef LRESULT (CALLBACK* THEMING_SUBCLASSPROC)(HWND, UINT, WPARAM, LPARAM,
- ULONG_PTR);
-
-extern LRESULT CALLBACK THEMING_DialogSubclassProc (HWND, UINT, WPARAM, LPARAM,
- ULONG_PTR) DECLSPEC_HIDDEN;
-
-static const WCHAR dialogClass[] = L"#32770";
-
-static const struct ThemingSubclass
-{
- const WCHAR* className;
- THEMING_SUBCLASSPROC subclassProc;
-} subclasses[] = {
- /* Note: list must be sorted by class name */
- {dialogClass, THEMING_DialogSubclassProc},
-};
-
-#define NUM_SUBCLASSES (ARRAY_SIZE(subclasses))
-
-static WNDPROC originalProcs[NUM_SUBCLASSES];
-static ATOM atRefDataProp;
-static ATOM atSubclassProp;
-
-/* Generate a number of subclass window procs.
- * With a single proc alone, we can't really reliably find out the superclass,
- * so have one for each subclass. The subclass number is also stored in a prop
- * since it's needed by THEMING_CallOriginalClass(). Then, the subclass
- * proc and ref data are fetched and the proc called.
- */
-#define MAKE_SUBCLASS_PROC(N) \
-static LRESULT CALLBACK subclass_proc ## N (HWND wnd, UINT msg, \
- WPARAM wParam, LPARAM lParam) \
-{ \
- LRESULT result; \
- ULONG_PTR refData; \
- SetPropW (wnd, (LPCWSTR)MAKEINTATOM(atSubclassProp), (HANDLE)N); \
- refData = (ULONG_PTR)GetPropW (wnd, (LPCWSTR)MAKEINTATOM(atRefDataProp)); \
- TRACE ("%d; (%p, %x, %lx, %lx, %lx)\n", N, wnd, msg, wParam, lParam, \
- refData); \
- result = subclasses[N].subclassProc (wnd, msg, wParam, lParam, refData);\
- TRACE ("result = %lx\n", result); \
- return result; \
-}
-
-MAKE_SUBCLASS_PROC(0)
-
-static const WNDPROC subclassProcs[NUM_SUBCLASSES] = {
- subclass_proc0,
-};
-
-/***********************************************************************
- * THEMING_Initialize
- *
- * Register classes for standard controls that will shadow the system
- * classes.
- */
-void THEMING_Initialize (void)
-{
- unsigned int i;
-
- atSubclassProp = GlobalAddAtomW (L"CC32ThemingSubCl");
- atRefDataProp = GlobalAddAtomW (L"CC32ThemingData");
-
- for (i = 0; i < NUM_SUBCLASSES; i++)
- {
- WNDCLASSEXW class;
-
- class.cbSize = sizeof(class);
- if (!GetClassInfoExW (NULL, subclasses[i].className, &class))
- {
- ERR("Could not retrieve information for class %s\n",
- debugstr_w (subclasses[i].className));
- continue;
- }
- originalProcs[i] = class.lpfnWndProc;
- class.lpfnWndProc = subclassProcs[i];
-
- if (!class.lpfnWndProc)
- {
- ERR("Missing proc for class %s\n",
- debugstr_w (subclasses[i].className));
- continue;
- }
-
- if (!RegisterClassExW (&class))
- {
- ERR("Could not re-register class %s: %x\n",
- debugstr_w (subclasses[i].className), GetLastError ());
- }
- else
- {
- TRACE("Re-registered class %s\n",
- debugstr_w (subclasses[i].className));
- }
- }
-}
-
-/***********************************************************************
- * THEMING_Uninitialize
- *
- * Unregister shadow classes for standard controls.
- */
-void THEMING_Uninitialize (void)
-{
- unsigned int i;
-
- if (!atSubclassProp) return; /* not initialized */
-
- for (i = 0; i < NUM_SUBCLASSES; i++)
- {
- UnregisterClassW (subclasses[i].className, NULL);
- }
-}
-
-/***********************************************************************
- * THEMING_CallOriginalClass
- *
- * Determines the original window proc and calls it.
- */
-LRESULT THEMING_CallOriginalClass (HWND wnd, UINT msg, WPARAM wParam, LPARAM lParam)
-{
- INT_PTR subclass = (INT_PTR)GetPropW (wnd, (LPCWSTR)MAKEINTATOM(atSubclassProp));
- WNDPROC oldProc = originalProcs[subclass];
- return CallWindowProcW (oldProc, wnd, msg, wParam, lParam);
-}
diff --git a/dlls/user32/defdlg.c b/dlls/user32/defdlg.c
index 00a73c6b927..4f44a93cd49 100644
--- a/dlls/user32/defdlg.c
+++ b/dlls/user32/defdlg.c
@@ -354,10 +354,7 @@ out:
return dlgInfo;
}
-/***********************************************************************
- * DefDlgProcA (USER32.@)
- */
-LRESULT WINAPI DefDlgProcA( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
+static LRESULT USER_DefDlgProcA( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
DIALOGINFO *dlgInfo;
DLGPROC dlgproc;
@@ -411,11 +408,7 @@ LRESULT WINAPI DefDlgProcA( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
return GetWindowLongPtrW( hwnd, DWLP_MSGRESULT );
}
-
-/***********************************************************************
- * DefDlgProcW (USER32.@)
- */
-LRESULT WINAPI DefDlgProcW( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
+static LRESULT USER_DefDlgProcW( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
DIALOGINFO *dlgInfo;
DLGPROC dlgproc;
@@ -468,3 +461,27 @@ LRESULT WINAPI DefDlgProcW( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
return GetWindowLongPtrW( hwnd, DWLP_MSGRESULT );
}
+
+LRESULT WINAPI USER_DefDlgProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, BOOL unicode )
+{
+ if (unicode)
+ return USER_DefDlgProcW( hwnd, msg, wParam, lParam );
+ else
+ return USER_DefDlgProcA( hwnd, msg, wParam, lParam );
+}
+
+/***********************************************************************
+ * DefDlgProcA (USER32.@)
+ */
+LRESULT WINAPI DefDlgProcA( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
+{
+ return user_api->pDefDlgProc( hwnd, msg, wParam, lParam, FALSE );
+}
+
+/***********************************************************************
+ * DefDlgProcW (USER32.@)
+ */
+LRESULT WINAPI DefDlgProcW( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
+{
+ return user_api->pDefDlgProc( hwnd, msg, wParam, lParam, TRUE );
+}
diff --git a/dlls/user32/hook.c b/dlls/user32/hook.c
index 8f542a6cffd..c4e71ec49b6 100644
--- a/dlls/user32/hook.c
+++ b/dlls/user32/hook.c
@@ -83,6 +83,7 @@ WINE_DECLARE_DEBUG_CHANNEL(relay);
static struct user_api_hook original_user_api =
{
+ USER_DefDlgProc,
USER_ScrollBarProc,
};
static struct user_api_hook hooked_user_api;
diff --git a/dlls/user32/user_private.h b/dlls/user32/user_private.h
index 1e3786c2b1e..8750008a5fb 100644
--- a/dlls/user32/user_private.h
+++ b/dlls/user32/user_private.h
@@ -387,6 +387,7 @@ struct png_funcs
#endif
extern struct user_api_hook *user_api DECLSPEC_HIDDEN;
+LRESULT WINAPI USER_DefDlgProc(HWND, UINT, WPARAM, LPARAM, BOOL) DECLSPEC_HIDDEN;
LRESULT WINAPI USER_ScrollBarProc(HWND, UINT, WPARAM, LPARAM, BOOL) DECLSPEC_HIDDEN;
#endif /* __WINE_USER_PRIVATE_H */
diff --git a/dlls/uxtheme/Makefile.in b/dlls/uxtheme/Makefile.in
index f252f423a97..d272e049cf9 100644
--- a/dlls/uxtheme/Makefile.in
+++ b/dlls/uxtheme/Makefile.in
@@ -7,6 +7,7 @@ EXTRADLLFLAGS = -mno-cygwin
C_SRCS = \
buffer.c \
+ dialog.c \
draw.c \
main.c \
metric.c \
diff --git a/dlls/comctl32/theme_dialog.c b/dlls/uxtheme/dialog.c
similarity index 81%
rename from dlls/comctl32/theme_dialog.c
rename to dlls/uxtheme/dialog.c
index 0f7835ae32f..043346b24e2 100644
--- a/dlls/comctl32/theme_dialog.c
+++ b/dlls/uxtheme/dialog.c
@@ -28,16 +28,11 @@
#include "wingdi.h"
#include "winuser.h"
#include "uxtheme.h"
+#include "uxthemedll.h"
#include "vssym32.h"
-#include "comctl32.h"
#include "wine/debug.h"
-/**********************************************************************
- * The dialog subclass window proc.
- */
-LRESULT CALLBACK THEMING_DialogSubclassProc (HWND hWnd, UINT msg,
- WPARAM wParam, LPARAM lParam,
- ULONG_PTR dwRefData)
+LRESULT WINAPI UXTHEME_DefDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, BOOL unicode)
{
HTHEME theme = GetWindowTheme ( hWnd );
static const WCHAR themeClass[] = L"Window";
@@ -48,7 +43,7 @@ LRESULT CALLBACK THEMING_DialogSubclassProc (HWND hWnd, UINT msg,
switch (msg)
{
case WM_CREATE:
- result = THEMING_CallOriginalClass (hWnd, msg, wParam, lParam);
+ result = user_api.pDefDlgProc(hWnd, msg, wParam, lParam, unicode);
theme = OpenThemeData( hWnd, themeClass );
return result;
@@ -56,7 +51,7 @@ LRESULT CALLBACK THEMING_DialogSubclassProc (HWND hWnd, UINT msg,
CloseThemeData ( theme );
SetWindowTheme( hWnd, NULL, NULL );
OpenThemeData( hWnd, NULL );
- return THEMING_CallOriginalClass (hWnd, msg, wParam, lParam);
+ return user_api.pDefDlgProc(hWnd, msg, wParam, lParam, unicode);
case WM_THEMECHANGED:
CloseThemeData ( theme );
@@ -65,7 +60,7 @@ LRESULT CALLBACK THEMING_DialogSubclassProc (HWND hWnd, UINT msg,
return 0;
case WM_ERASEBKGND:
- if (!doTheming) return THEMING_CallOriginalClass (hWnd, msg, wParam, lParam);
+ if (!doTheming) return user_api.pDefDlgProc(hWnd, msg, wParam, lParam, unicode);
{
RECT rc;
WNDPROC dlgp = (WNDPROC)GetWindowLongPtrW (hWnd, DWLP_DLGPROC);
@@ -82,7 +77,7 @@ LRESULT CALLBACK THEMING_DialogSubclassProc (HWND hWnd, UINT msg,
DrawThemeBackground (theme, (HDC)wParam, WP_DIALOG, 0, &rc,
NULL);
#endif
- return THEMING_CallOriginalClass (hWnd, msg, wParam, lParam);
+ return user_api.pDefDlgProc(hWnd, msg, wParam, lParam, unicode);
else
/* We might have gotten a TAB theme class, so check if we can
* draw as a tab page. */
@@ -90,13 +85,13 @@ LRESULT CALLBACK THEMING_DialogSubclassProc (HWND hWnd, UINT msg,
DrawThemeBackground (theme, (HDC)wParam, TABP_BODY, 0, &rc,
NULL);
else
- return THEMING_CallOriginalClass (hWnd, msg, wParam, lParam);
+ return user_api.pDefDlgProc(hWnd, msg, wParam, lParam, unicode);
}
return 1;
}
case WM_CTLCOLORSTATIC:
- if (!doTheming) return THEMING_CallOriginalClass (hWnd, msg, wParam, lParam);
+ if (!doTheming) return user_api.pDefDlgProc(hWnd, msg, wParam, lParam, unicode);
{
WNDPROC dlgp = (WNDPROC)GetWindowLongPtrW (hWnd, DWLP_DLGPROC);
LRESULT result = CallWindowProcW(dlgp, hWnd, msg, wParam, lParam);
@@ -121,7 +116,7 @@ LRESULT CALLBACK THEMING_DialogSubclassProc (HWND hWnd, UINT msg,
return (LRESULT)GetStockObject (NULL_BRUSH);
}
else
- return THEMING_CallOriginalClass (hWnd, msg, wParam, lParam);
+ return user_api.pDefDlgProc(hWnd, msg, wParam, lParam, unicode);
}
return result;
@@ -129,7 +124,7 @@ LRESULT CALLBACK THEMING_DialogSubclassProc (HWND hWnd, UINT msg,
default:
/* Call old proc */
- return THEMING_CallOriginalClass (hWnd, msg, wParam, lParam);
+ return user_api.pDefDlgProc(hWnd, msg, wParam, lParam, unicode);
}
return 0;
}
diff --git a/dlls/uxtheme/system.c b/dlls/uxtheme/system.c
index a7051a2eb05..f5ddc20eb08 100644
--- a/dlls/uxtheme/system.c
+++ b/dlls/uxtheme/system.c
@@ -1229,6 +1229,7 @@ BOOL WINAPI ThemeHooksInstall(void)
{
struct user_api_hook hooks;
+ hooks.pDefDlgProc = UXTHEME_DefDlgProc;
hooks.pScrollBarWndProc = UXTHEME_ScrollbarWndProc;
return __wine_register_user_api_hook(&hooks, &user_api);
}
diff --git a/dlls/uxtheme/uxthemedll.h b/dlls/uxtheme/uxthemedll.h
index 7a085b8a3f1..67932f22f88 100644
--- a/dlls/uxtheme/uxthemedll.h
+++ b/dlls/uxtheme/uxthemedll.h
@@ -102,6 +102,7 @@ extern void UXTHEME_InitSystem(HINSTANCE hInst) DECLSPEC_HIDDEN;
extern void UXTHEME_UninitSystem(void) DECLSPEC_HIDDEN;
extern struct user_api_hook user_api DECLSPEC_HIDDEN;
+LRESULT WINAPI UXTHEME_DefDlgProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam, BOOL unicode) DECLSPEC_HIDDEN;
LRESULT WINAPI UXTHEME_ScrollbarWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam,
BOOL unicode) DECLSPEC_HIDDEN;
diff --git a/include/winuser.h b/include/winuser.h
index 88fdbbf72fc..6df5ead5bc5 100644
--- a/include/winuser.h
+++ b/include/winuser.h
@@ -4411,6 +4411,7 @@ WINUSERAPI BOOL CDECL __wine_send_input( HWND hwnd, const INPUT *input, const RA
/* Uxtheme hook functions and struct */
struct user_api_hook
{
+ LRESULT (WINAPI *pDefDlgProc)(HWND, UINT, WPARAM, LPARAM, BOOL);
LRESULT (WINAPI *pScrollBarWndProc)(HWND, UINT, WPARAM, LPARAM, BOOL);
};
--
2.30.2
1
0
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
---
dlls/comctl32/Makefile.in | 1 -
dlls/comctl32/theming.c | 5 ----
dlls/user32/hook.c | 28 +++++++++++++++++++
dlls/user32/scroll.c | 13 +++++----
dlls/user32/user32.spec | 2 ++
dlls/user32/user_private.h | 3 ++
dlls/uxtheme/Makefile.in | 1 +
.../theme_scrollbar.c => uxtheme/scrollbar.c} | 21 +++++++-------
dlls/uxtheme/system.c | 18 ++++++++++++
dlls/uxtheme/uxtheme.spec | 4 +--
dlls/uxtheme/uxthemedll.h | 8 ++++++
include/winuser.h | 9 ++++++
12 files changed, 89 insertions(+), 24 deletions(-)
rename dlls/{comctl32/theme_scrollbar.c => uxtheme/scrollbar.c} (95%)
diff --git a/dlls/comctl32/Makefile.in b/dlls/comctl32/Makefile.in
index 4ea068ea731..bd99d8f0276 100644
--- a/dlls/comctl32/Makefile.in
+++ b/dlls/comctl32/Makefile.in
@@ -38,7 +38,6 @@ C_SRCS = \
tab.c \
taskdialog.c \
theme_dialog.c \
- theme_scrollbar.c \
theming.c \
toolbar.c \
tooltips.c \
diff --git a/dlls/comctl32/theming.c b/dlls/comctl32/theming.c
index 8078e661b76..c74bcfc36a2 100644
--- a/dlls/comctl32/theming.c
+++ b/dlls/comctl32/theming.c
@@ -35,8 +35,6 @@ typedef LRESULT (CALLBACK* THEMING_SUBCLASSPROC)(HWND, UINT, WPARAM, LPARAM,
extern LRESULT CALLBACK THEMING_DialogSubclassProc (HWND, UINT, WPARAM, LPARAM,
ULONG_PTR) DECLSPEC_HIDDEN;
-extern LRESULT CALLBACK THEMING_ScrollbarSubclassProc (HWND, UINT, WPARAM, LPARAM,
- ULONG_PTR) DECLSPEC_HIDDEN;
static const WCHAR dialogClass[] = L"#32770";
@@ -47,7 +45,6 @@ static const struct ThemingSubclass
} subclasses[] = {
/* Note: list must be sorted by class name */
{dialogClass, THEMING_DialogSubclassProc},
- {WC_SCROLLBARW, THEMING_ScrollbarSubclassProc}
};
#define NUM_SUBCLASSES (ARRAY_SIZE(subclasses))
@@ -78,11 +75,9 @@ static LRESULT CALLBACK subclass_proc ## N (HWND wnd, UINT msg, \
}
MAKE_SUBCLASS_PROC(0)
-MAKE_SUBCLASS_PROC(1)
static const WNDPROC subclassProcs[NUM_SUBCLASSES] = {
subclass_proc0,
- subclass_proc1,
};
/***********************************************************************
diff --git a/dlls/user32/hook.c b/dlls/user32/hook.c
index 4c6dbcf7202..8f542a6cffd 100644
--- a/dlls/user32/hook.c
+++ b/dlls/user32/hook.c
@@ -81,6 +81,13 @@
WINE_DEFAULT_DEBUG_CHANNEL(hook);
WINE_DECLARE_DEBUG_CHANNEL(relay);
+static struct user_api_hook original_user_api =
+{
+ USER_ScrollBarProc,
+};
+static struct user_api_hook hooked_user_api;
+struct user_api_hook *user_api = &original_user_api;
+
struct hook_info
{
INT id;
@@ -961,3 +968,24 @@ BOOL WINAPI IsWinEventHookInstalled(DWORD dwEvent)
WARN("(%d)-stub!\n", dwEvent);
return TRUE;
}
+
+/* Uxtheme hook function, similar to the undocumented RegisterUserApiHook() */
+BOOL CDECL __wine_register_user_api_hook(const struct user_api_hook *new, struct user_api_hook *old)
+{
+ if (!new)
+ return FALSE;
+
+ USER_Lock();
+ hooked_user_api = *new;
+ user_api = &hooked_user_api;
+ if (old)
+ *old = original_user_api;
+ USER_Unlock();
+ return TRUE;
+}
+
+/* Similar to the undocumented UnregisterUserApiHook() */
+void CDECL __wine_unregister_user_api_hook(void)
+{
+ InterlockedExchangePointer((void **)&user_api, &original_user_api);
+}
diff --git a/dlls/user32/scroll.c b/dlls/user32/scroll.c
index 5561509c50c..9a22e930332 100644
--- a/dlls/user32/scroll.c
+++ b/dlls/user32/scroll.c
@@ -1317,11 +1317,7 @@ static BOOL SCROLL_SetScrollRange(HWND hwnd, INT nBar, INT minVal, INT maxVal)
return TRUE;
}
-
-/***********************************************************************
- * ScrollBarWndProc_common
- */
-LRESULT ScrollBarWndProc_common( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam, BOOL unicode )
+LRESULT WINAPI USER_ScrollBarProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam, BOOL unicode )
{
if (!IsWindow( hwnd )) return 0;
@@ -1496,6 +1492,13 @@ LRESULT ScrollBarWndProc_common( HWND hwnd, UINT message, WPARAM wParam, LPARAM
return 0;
}
+/***********************************************************************
+ * ScrollBarWndProc_common
+ */
+LRESULT ScrollBarWndProc_common( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, BOOL unicode )
+{
+ return user_api->pScrollBarWndProc( hwnd, msg, wParam, lParam, unicode );
+}
/*************************************************************************
* SetScrollInfo (USER32.@)
diff --git a/dlls/user32/user32.spec b/dlls/user32/user32.spec
index 391e304a063..4cc312f9784 100644
--- a/dlls/user32/user32.spec
+++ b/dlls/user32/user32.spec
@@ -835,5 +835,7 @@
# All functions must be prefixed with '__wine_' (for internal functions)
# or 'wine_' (for user-visible functions) to avoid namespace conflicts.
#
+@ cdecl __wine_register_user_api_hook(ptr ptr)
@ cdecl __wine_send_input(long ptr ptr)
@ cdecl __wine_set_pixel_format(long long)
+@ cdecl __wine_unregister_user_api_hook()
diff --git a/dlls/user32/user_private.h b/dlls/user32/user_private.h
index 0838ba28b32..1e3786c2b1e 100644
--- a/dlls/user32/user_private.h
+++ b/dlls/user32/user_private.h
@@ -386,4 +386,7 @@ struct png_funcs
#define assert(expr) ((void)0)
#endif
+extern struct user_api_hook *user_api DECLSPEC_HIDDEN;
+LRESULT WINAPI USER_ScrollBarProc(HWND, UINT, WPARAM, LPARAM, BOOL) DECLSPEC_HIDDEN;
+
#endif /* __WINE_USER_PRIVATE_H */
diff --git a/dlls/uxtheme/Makefile.in b/dlls/uxtheme/Makefile.in
index 61817ee5468..f252f423a97 100644
--- a/dlls/uxtheme/Makefile.in
+++ b/dlls/uxtheme/Makefile.in
@@ -12,6 +12,7 @@ C_SRCS = \
metric.c \
msstyles.c \
property.c \
+ scrollbar.c \
stylemap.c \
system.c \
uxini.c
diff --git a/dlls/comctl32/theme_scrollbar.c b/dlls/uxtheme/scrollbar.c
similarity index 95%
rename from dlls/comctl32/theme_scrollbar.c
rename to dlls/uxtheme/scrollbar.c
index 7cc59bbd1e5..393b45a831d 100644
--- a/dlls/comctl32/theme_scrollbar.c
+++ b/dlls/uxtheme/scrollbar.c
@@ -28,8 +28,8 @@
#include "wingdi.h"
#include "winuser.h"
#include "uxtheme.h"
+#include "uxthemedll.h"
#include "vssym32.h"
-#include "comctl32.h"
#include "wine/debug.h"
/* Minimum size of the thumb in pixels */
@@ -525,27 +525,26 @@ static void paint_scrollbar(HWND hwnd, HTHEME theme)
EndPaint(hwnd, &ps);
}
-LRESULT CALLBACK THEMING_ScrollbarSubclassProc (HWND hwnd, UINT msg,
- WPARAM wParam, LPARAM lParam,
- ULONG_PTR dwRefData)
+LRESULT WINAPI UXTHEME_ScrollbarWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam,
+ BOOL unicode)
{
const WCHAR* themeClass = WC_SCROLLBARW;
HTHEME theme;
LRESULT result;
POINT pt;
- TRACE("(%p, 0x%x, %lu, %lu, %lu)\n", hwnd, msg, wParam, lParam, dwRefData);
+ TRACE("(%p, 0x%x, %lu, %lu, %d)\n", hwnd, msg, wParam, lParam, unicode);
switch (msg) {
case WM_CREATE:
- result = THEMING_CallOriginalClass(hwnd, msg, wParam, lParam);
+ result = user_api.pScrollBarWndProc(hwnd, msg, wParam, lParam, unicode);
OpenThemeData(hwnd, themeClass);
return result;
case WM_DESTROY:
theme = GetWindowTheme(hwnd);
CloseThemeData(theme);
- return THEMING_CallOriginalClass(hwnd, msg, wParam, lParam);
+ return user_api.pScrollBarWndProc(hwnd, msg, wParam, lParam, unicode);
case WM_THEMECHANGED:
theme = GetWindowTheme(hwnd);
@@ -556,14 +555,14 @@ LRESULT CALLBACK THEMING_ScrollbarSubclassProc (HWND hwnd, UINT msg,
case WM_SYSCOLORCHANGE:
theme = GetWindowTheme(hwnd);
- if (!theme) return THEMING_CallOriginalClass(hwnd, msg, wParam, lParam);
+ if (!theme) return user_api.pScrollBarWndProc(hwnd, msg, wParam, lParam, unicode);
/* Do nothing. When themed, a WM_THEMECHANGED will be received, too,
* which will do the repaint. */
break;
case WM_PAINT:
theme = GetWindowTheme(hwnd);
- if (!theme) return THEMING_CallOriginalClass(hwnd, msg, wParam, lParam);
+ if (!theme) return user_api.pScrollBarWndProc(hwnd, msg, wParam, lParam, unicode);
paint_scrollbar(hwnd, theme);
break;
@@ -571,7 +570,7 @@ LRESULT CALLBACK THEMING_ScrollbarSubclassProc (HWND hwnd, UINT msg,
case WM_MOUSEMOVE:
case WM_MOUSELEAVE:
theme = GetWindowTheme(hwnd);
- if (!theme) return THEMING_CallOriginalClass(hwnd, msg, wParam, lParam);
+ if (!theme) return user_api.pScrollBarWndProc(hwnd, msg, wParam, lParam, unicode);
pt.x = (short)LOWORD(lParam);
pt.y = (short)HIWORD(lParam);
@@ -579,7 +578,7 @@ LRESULT CALLBACK THEMING_ScrollbarSubclassProc (HWND hwnd, UINT msg,
break;
default:
- return THEMING_CallOriginalClass(hwnd, msg, wParam, lParam);
+ return user_api.pScrollBarWndProc(hwnd, msg, wParam, lParam, unicode);
}
return 0;
diff --git a/dlls/uxtheme/system.c b/dlls/uxtheme/system.c
index dcd2a660042..a7051a2eb05 100644
--- a/dlls/uxtheme/system.c
+++ b/dlls/uxtheme/system.c
@@ -55,6 +55,8 @@ static WCHAR szCurrentTheme[MAX_PATH];
static WCHAR szCurrentColor[64];
static WCHAR szCurrentSize[64];
+struct user_api_hook user_api = {0};
+
/***********************************************************************/
static BOOL CALLBACK UXTHEME_broadcast_msg_enumchild (HWND hWnd, LPARAM msg)
@@ -507,10 +509,12 @@ void UXTHEME_InitSystem(HINSTANCE hInst)
atDialogThemeEnabled = GlobalAddAtomW(L"ux_dialogtheme");
UXTHEME_LoadTheme();
+ ThemeHooksInstall();
}
void UXTHEME_UninitSystem(void)
{
+ ThemeHooksRemove();
MSSTYLES_SetActiveTheme(NULL, FALSE);
GlobalDeleteAtom(atWindowTheme);
@@ -1220,3 +1224,17 @@ HRESULT WINAPI CheckThemeSignature(LPCWSTR pszThemeFileName)
MSSTYLES_CloseThemeFile(pt);
return S_OK;
}
+
+BOOL WINAPI ThemeHooksInstall(void)
+{
+ struct user_api_hook hooks;
+
+ hooks.pScrollBarWndProc = UXTHEME_ScrollbarWndProc;
+ return __wine_register_user_api_hook(&hooks, &user_api);
+}
+
+BOOL WINAPI ThemeHooksRemove(void)
+{
+ __wine_unregister_user_api_hook();
+ return TRUE;
+}
diff --git a/dlls/uxtheme/uxtheme.spec b/dlls/uxtheme/uxtheme.spec
index 632129b8104..22b1fc4ac3c 100644
--- a/dlls/uxtheme/uxtheme.spec
+++ b/dlls/uxtheme/uxtheme.spec
@@ -29,8 +29,8 @@
31 stub -noname InitUserTheme
32 stub -noname InitUserRegistry
33 stub -noname ReestablishServerConnection
-34 stub -noname ThemeHooksInstall
-35 stub -noname ThemeHooksRemove
+34 stdcall -noname ThemeHooksInstall()
+35 stdcall -noname ThemeHooksRemove()
36 stub -noname RefreshThemeForTS
43 stub -noname ClassicGetSystemMetrics
44 stub -noname ClassicSystemParametersInfoA
diff --git a/dlls/uxtheme/uxthemedll.h b/dlls/uxtheme/uxthemedll.h
index fdf529b422a..7a085b8a3f1 100644
--- a/dlls/uxtheme/uxthemedll.h
+++ b/dlls/uxtheme/uxthemedll.h
@@ -21,6 +21,8 @@
#ifndef __WINE_UXTHEMEDLL_H
#define __WINE_UXTHEMEDLL_H
+#include <winuser.h>
+
typedef HANDLE HTHEMEFILE;
/**********************************************************************
@@ -93,10 +95,16 @@ HRESULT WINAPI EnumThemeSizes(LPWSTR pszThemeFileName, LPWSTR pszColorName,
DWORD dwSizeNum, PTHEMENAMES pszColorNames) DECLSPEC_HIDDEN;
HRESULT WINAPI ParseThemeIniFile(LPCWSTR pszIniFileName, LPWSTR pszUnknown,
ParseThemeIniFileProc callback, LPVOID lpData) DECLSPEC_HIDDEN;
+BOOL WINAPI ThemeHooksInstall(void) DECLSPEC_HIDDEN;
+BOOL WINAPI ThemeHooksRemove(void) DECLSPEC_HIDDEN;
extern void UXTHEME_InitSystem(HINSTANCE hInst) DECLSPEC_HIDDEN;
extern void UXTHEME_UninitSystem(void) DECLSPEC_HIDDEN;
+extern struct user_api_hook user_api DECLSPEC_HIDDEN;
+LRESULT WINAPI UXTHEME_ScrollbarWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam,
+ BOOL unicode) DECLSPEC_HIDDEN;
+
/* No alpha blending */
#define ALPHABLEND_NONE 0
/* "Cheap" binary alpha blending - but possibly faster */
diff --git a/include/winuser.h b/include/winuser.h
index 0b1571c0a95..88fdbbf72fc 100644
--- a/include/winuser.h
+++ b/include/winuser.h
@@ -4407,6 +4407,15 @@ WORD WINAPI SYSTEM_KillSystemTimer( WORD );
#ifdef __WINESRC__
WINUSERAPI BOOL CDECL __wine_send_input( HWND hwnd, const INPUT *input, const RAWINPUT *rawinput );
+
+/* Uxtheme hook functions and struct */
+struct user_api_hook
+{
+ LRESULT (WINAPI *pScrollBarWndProc)(HWND, UINT, WPARAM, LPARAM, BOOL);
+};
+
+BOOL CDECL __wine_register_user_api_hook(const struct user_api_hook *new, struct user_api_hook *old);
+void CDECL __wine_unregister_user_api_hook(void);
#endif
#ifdef __cplusplus
--
2.30.2
1
0
[PATCH 5/5] iphlpapi: ConvertInterfaceLuidToNameW/NameToLuidW use names based on the luid's type and index.
by Huw Davies 07 Jul '21
by Huw Davies 07 Jul '21
07 Jul '21
Signed-off-by: Huw Davies <huw(a)codeweavers.com>
---
dlls/iphlpapi/iphlpapi_main.c | 98 ++++++++++++++++++++++++++--------
dlls/iphlpapi/tests/iphlpapi.c | 50 ++++++++++++++---
2 files changed, 118 insertions(+), 30 deletions(-)
diff --git a/dlls/iphlpapi/iphlpapi_main.c b/dlls/iphlpapi/iphlpapi_main.c
index e5dc1012cb0..13bfb81e7c9 100644
--- a/dlls/iphlpapi/iphlpapi_main.c
+++ b/dlls/iphlpapi/iphlpapi_main.c
@@ -3322,24 +3322,64 @@ DWORD WINAPI ConvertInterfaceLuidToNameA(const NET_LUID *luid, char *name, SIZE_
return err;
}
+static const WCHAR otherW[] = {'o','t','h','e','r',0};
+static const WCHAR ethernetW[] = {'e','t','h','e','r','n','e','t',0};
+static const WCHAR tokenringW[] = {'t','o','k','e','n','r','i','n','g',0};
+static const WCHAR pppW[] = {'p','p','p',0};
+static const WCHAR loopbackW[] = {'l','o','o','p','b','a','c','k',0};
+static const WCHAR atmW[] = {'a','t','m',0};
+static const WCHAR wirelessW[] = {'w','i','r','e','l','e','s','s',0};
+static const WCHAR tunnelW[] = {'t','u','n','n','e','l',0};
+static const WCHAR ieee1394W[] = {'i','e','e','e','1','3','9','4',0};
+
+struct name_prefix
+{
+ const WCHAR *prefix;
+ DWORD type;
+};
+static const struct name_prefix name_prefixes[] =
+{
+ { otherW, IF_TYPE_OTHER },
+ { ethernetW, IF_TYPE_ETHERNET_CSMACD },
+ { tokenringW, IF_TYPE_ISO88025_TOKENRING },
+ { pppW, IF_TYPE_PPP },
+ { loopbackW, IF_TYPE_SOFTWARE_LOOPBACK },
+ { atmW, IF_TYPE_ATM },
+ { wirelessW, IF_TYPE_IEEE80211 },
+ { tunnelW, IF_TYPE_TUNNEL },
+ { ieee1394W, IF_TYPE_IEEE1394 }
+};
+
/******************************************************************
* ConvertInterfaceLuidToNameW (IPHLPAPI.@)
*/
DWORD WINAPI ConvertInterfaceLuidToNameW(const NET_LUID *luid, WCHAR *name, SIZE_T len)
{
- DWORD ret;
- MIB_IFROW row;
+ DWORD i, needed;
+ const WCHAR *prefix = NULL;
+ WCHAR buf[IF_MAX_STRING_SIZE + 1];
+ static const WCHAR prefix_fmt[] = {'%','s','_','%','d',0};
+ static const WCHAR unk_fmt[] = {'i','f','t','y','p','e','%','d','_','%','d',0};
- TRACE("(%p %p %u)\n", luid, name, (DWORD)len);
+ TRACE( "(%p %p %u)\n", luid, name, (DWORD)len );
if (!luid || !name) return ERROR_INVALID_PARAMETER;
- row.dwIndex = luid->Info.NetLuidIndex;
- if ((ret = GetIfEntry( &row ))) return ret;
+ for (i = 0; i < ARRAY_SIZE(name_prefixes); i++)
+ {
+ if (luid->Info.IfType == name_prefixes[i].type)
+ {
+ prefix = name_prefixes[i].prefix;
+ break;
+ }
+ }
- if (len < strlenW( row.wszName ) + 1) return ERROR_NOT_ENOUGH_MEMORY;
- strcpyW( name, row.wszName );
- return NO_ERROR;
+ if (prefix) needed = snprintfW( buf, len, prefix_fmt, prefix, luid->Info.NetLuidIndex );
+ else needed = snprintfW( buf, len, unk_fmt, luid->Info.IfType, luid->Info.NetLuidIndex );
+
+ if (needed >= len) return ERROR_NOT_ENOUGH_MEMORY;
+ memcpy( name, buf, (needed + 1) * sizeof(WCHAR) );
+ return ERROR_SUCCESS;
}
/******************************************************************
@@ -3363,28 +3403,40 @@ DWORD WINAPI ConvertInterfaceNameToLuidA(const char *name, NET_LUID *luid)
*/
DWORD WINAPI ConvertInterfaceNameToLuidW(const WCHAR *name, NET_LUID *luid)
{
- DWORD ret;
- IF_INDEX index;
- MIB_IFROW row;
- char nameA[IF_MAX_STRING_SIZE + 1];
+ const WCHAR *sep;
+ static const WCHAR iftype[] = {'i','f','t','y','p','e',0};
+ DWORD type = ~0u, i;
+ WCHAR buf[IF_MAX_STRING_SIZE + 1];
- TRACE("(%s %p)\n", debugstr_w(name), luid);
+ TRACE( "(%s %p)\n", debugstr_w(name), luid );
if (!luid) return ERROR_INVALID_PARAMETER;
memset( luid, 0, sizeof(*luid) );
- if (!WideCharToMultiByte( CP_UNIXCP, 0, name, -1, nameA, sizeof(nameA), NULL, NULL ))
- return ERROR_INVALID_NAME;
+ if (!name || !(sep = strchrW( name, '_' )) || sep >= name + ARRAY_SIZE(buf)) return ERROR_INVALID_NAME;
+ memcpy( buf, name, (sep - name) * sizeof(WCHAR) );
+ buf[sep - name] = '\0';
- if ((ret = getInterfaceIndexByName( nameA, &index ))) return ret;
-
- row.dwIndex = index;
- if ((ret = GetIfEntry( &row ))) return ret;
+ if (sep - name > ARRAY_SIZE(iftype) - 1 && !memcmp( buf, iftype, (ARRAY_SIZE(iftype) - 1) * sizeof(WCHAR) ))
+ {
+ type = atoiW( buf + ARRAY_SIZE(iftype) - 1 );
+ }
+ else
+ {
+ for (i = 0; i < ARRAY_SIZE(name_prefixes); i++)
+ {
+ if (!strcmpW( buf, name_prefixes[i].prefix ))
+ {
+ type = name_prefixes[i].type;
+ break;
+ }
+ }
+ }
+ if (type == ~0u) return ERROR_INVALID_NAME;
- luid->Info.Reserved = 0;
- luid->Info.NetLuidIndex = index;
- luid->Info.IfType = row.dwType;
- return NO_ERROR;
+ luid->Info.NetLuidIndex = atoiW( sep + 1 );
+ luid->Info.IfType = type;
+ return ERROR_SUCCESS;
}
/******************************************************************
diff --git a/dlls/iphlpapi/tests/iphlpapi.c b/dlls/iphlpapi/tests/iphlpapi.c
index e43cb9b1f78..54c820e522c 100644
--- a/dlls/iphlpapi/tests/iphlpapi.c
+++ b/dlls/iphlpapi/tests/iphlpapi.c
@@ -1618,6 +1618,41 @@ static DWORD get_interface_index(void)
return ret;
}
+static void convert_luid_to_name( NET_LUID *luid, WCHAR *expect_nameW, int len )
+{
+ struct
+ {
+ const WCHAR *prefix;
+ DWORD type;
+ } prefixes[] =
+ {
+ { L"other", IF_TYPE_OTHER },
+ { L"ethernet", IF_TYPE_ETHERNET_CSMACD },
+ { L"tokenring", IF_TYPE_ISO88025_TOKENRING },
+ { L"ppp", IF_TYPE_PPP },
+ { L"loopback", IF_TYPE_SOFTWARE_LOOPBACK },
+ { L"atm", IF_TYPE_ATM },
+ { L"wireless", IF_TYPE_IEEE80211 },
+ { L"tunnel", IF_TYPE_TUNNEL },
+ { L"ieee1394", IF_TYPE_IEEE1394 }
+ };
+ DWORD i;
+ const WCHAR *prefix = NULL;
+
+ for (i = 0; i < ARRAY_SIZE(prefixes); i++)
+ {
+ if (prefixes[i].type == luid->Info.IfType)
+ {
+ prefix = prefixes[i].prefix;
+ break;
+ }
+ }
+ if (prefix)
+ swprintf( expect_nameW, len, L"%s_%d", prefix, luid->Info.NetLuidIndex );
+ else
+ swprintf( expect_nameW, len, L"iftype%d_%d", luid->Info.IfType, luid->Info.NetLuidIndex );
+}
+
static void test_interface_identifier_conversion(void)
{
DWORD ret, i;
@@ -1626,7 +1661,9 @@ static void test_interface_identifier_conversion(void)
SIZE_T len;
WCHAR nameW[IF_MAX_STRING_SIZE + 1];
WCHAR alias[IF_MAX_STRING_SIZE + 1];
+ WCHAR expect_nameW[IF_MAX_STRING_SIZE + 1];
char nameA[IF_MAX_STRING_SIZE + 1], *name;
+ char expect_nameA[IF_MAX_STRING_SIZE + 1];
NET_IFINDEX index;
MIB_IF_TABLE2 *table;
@@ -1721,7 +1758,8 @@ static void test_interface_identifier_conversion(void)
len = ARRAY_SIZE(nameW);
ret = ConvertInterfaceLuidToNameW( &luid, nameW, len );
ok( !ret, "got %u\n", ret );
- ok( nameW[0], "name not set\n" );
+ convert_luid_to_name( &luid, expect_nameW, len );
+ ok( !wcscmp( nameW, expect_nameW ), "got %s vs %s\n", debugstr_w( nameW ), debugstr_w( expect_nameW ) );
/* ConvertInterfaceLuidToNameA */
ret = ConvertInterfaceLuidToNameA( NULL, NULL, 0 );
@@ -1810,12 +1848,10 @@ static void test_interface_identifier_conversion(void)
ok( name == NULL, "got %p\n", name );
nameA[0] = 0;
- name = if_indextoname( 1, nameA );
- if (name != NULL)
- {
- ok( name[0], "empty name\n" );
- ok( name == nameA, "got %p\n", name );
- }
+ name = if_indextoname( row->InterfaceIndex, nameA );
+ ConvertInterfaceLuidToNameA( &row->InterfaceLuid, expect_nameA, ARRAY_SIZE(expect_nameA) );
+ ok( name == nameA, "mismatch\n" );
+ ok( !strcmp( nameA, expect_nameA ), "mismatch\n" );
}
FreeMibTable( table );
}
--
2.23.0
1
0
If, at some point, we change that, we can add a Wine-only nsi table
that holds the luid to unix-name mapping.
Signed-off-by: Huw Davies <huw(a)codeweavers.com>
---
dlls/mountmgr.sys/dbus.c | 2 +-
dlls/mountmgr.sys/diskarb.c | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/dlls/mountmgr.sys/dbus.c b/dlls/mountmgr.sys/dbus.c
index 6998ef43688..b7624d1cb37 100644
--- a/dlls/mountmgr.sys/dbus.c
+++ b/dlls/mountmgr.sys/dbus.c
@@ -1003,7 +1003,7 @@ static BOOL map_adapter_name( const NET_LUID *luid, char *unix_name, DWORD len )
{
WCHAR unix_nameW[IF_NAMESIZE];
- if (ConvertInterfaceLuidToNameW( luid, unix_nameW, ARRAY_SIZE(unix_nameW) )) return FALSE;
+ if (ConvertInterfaceLuidToAlias( luid, unix_nameW, ARRAY_SIZE(unix_nameW) )) return FALSE;
return WideCharToMultiByte( CP_UNIXCP, 0, unix_nameW, -1, unix_name, len, NULL, NULL ) != 0;
}
diff --git a/dlls/mountmgr.sys/diskarb.c b/dlls/mountmgr.sys/diskarb.c
index 1232f450599..e33365f6301 100644
--- a/dlls/mountmgr.sys/diskarb.c
+++ b/dlls/mountmgr.sys/diskarb.c
@@ -260,7 +260,7 @@ static UInt8 map_option( ULONG option )
#define IF_NAMESIZE 16
static BOOL map_adapter_name( const NET_LUID *luid, WCHAR *unix_name, DWORD len )
{
- return !ConvertInterfaceLuidToNameW( luid, unix_name, len );
+ return !ConvertInterfaceLuidToAlias( luid, unix_name, len );
}
static CFStringRef find_service_id( const NET_LUID *adapter )
--
2.23.0
1
0
Signed-off-by: Huw Davies <huw(a)codeweavers.com>
---
dlls/iphlpapi/iphlpapi.spec | 2 +-
dlls/iphlpapi/iphlpapi_main.c | 24 ++++++++++++++++++++++++
dlls/iphlpapi/tests/iphlpapi.c | 11 +++++++++++
include/netioapi.h | 1 +
4 files changed, 37 insertions(+), 1 deletion(-)
diff --git a/dlls/iphlpapi/iphlpapi.spec b/dlls/iphlpapi/iphlpapi.spec
index 9180eb84af7..604852a754d 100644
--- a/dlls/iphlpapi/iphlpapi.spec
+++ b/dlls/iphlpapi/iphlpapi.spec
@@ -15,7 +15,7 @@
@ stdcall ConvertInterfaceAliasToLuid( ptr ptr )
@ stdcall ConvertInterfaceGuidToLuid( ptr ptr )
@ stdcall ConvertInterfaceIndexToLuid( long ptr )
-#@ stub ConvertInterfaceLuidToAlias
+@ stdcall ConvertInterfaceLuidToAlias( ptr ptr long )
@ stdcall ConvertInterfaceLuidToGuid( ptr ptr )
@ stdcall ConvertInterfaceLuidToIndex( ptr ptr )
@ stdcall ConvertInterfaceLuidToNameA( ptr ptr long )
diff --git a/dlls/iphlpapi/iphlpapi_main.c b/dlls/iphlpapi/iphlpapi_main.c
index 448c1d873af..e5dc1012cb0 100644
--- a/dlls/iphlpapi/iphlpapi_main.c
+++ b/dlls/iphlpapi/iphlpapi_main.c
@@ -3241,6 +3241,30 @@ DWORD WINAPI ConvertInterfaceIndexToLuid(NET_IFINDEX index, NET_LUID *luid)
return err;
}
+/******************************************************************
+ * ConvertInterfaceLuidToAlias (IPHLPAPI.@)
+ */
+DWORD WINAPI ConvertInterfaceLuidToAlias( const NET_LUID *luid, WCHAR *alias, SIZE_T len )
+{
+ DWORD err;
+ IF_COUNTED_STRING name;
+
+ TRACE( "(%p %p %u)\n", luid, alias, (DWORD)len );
+
+ if (!luid || !alias) return ERROR_INVALID_PARAMETER;
+
+ err = NsiGetParameter( 1, &NPI_MS_NDIS_MODULEID, NSI_NDIS_IFINFO_TABLE, luid, sizeof(*luid),
+ NSI_PARAM_TYPE_RW, &name, sizeof(name),
+ FIELD_OFFSET(struct nsi_ndis_ifinfo_rw, alias) );
+ if (err) return err;
+
+ if (len <= name.Length / sizeof(WCHAR)) return ERROR_NOT_ENOUGH_MEMORY;
+ memcpy( alias, name.String, name.Length );
+ alias[name.Length / sizeof(WCHAR)] = '\0';
+
+ return err;
+}
+
/******************************************************************
* ConvertInterfaceLuidToGuid (IPHLPAPI.@)
*/
diff --git a/dlls/iphlpapi/tests/iphlpapi.c b/dlls/iphlpapi/tests/iphlpapi.c
index 480d6ac06c5..e43cb9b1f78 100644
--- a/dlls/iphlpapi/tests/iphlpapi.c
+++ b/dlls/iphlpapi/tests/iphlpapi.c
@@ -1625,6 +1625,7 @@ static void test_interface_identifier_conversion(void)
GUID guid;
SIZE_T len;
WCHAR nameW[IF_MAX_STRING_SIZE + 1];
+ WCHAR alias[IF_MAX_STRING_SIZE + 1];
char nameA[IF_MAX_STRING_SIZE + 1], *name;
NET_IFINDEX index;
MIB_IF_TABLE2 *table;
@@ -1779,6 +1780,16 @@ static void test_interface_identifier_conversion(void)
ok( !ret, "got %u\n", ret );
ok( luid.Value == row->InterfaceLuid.Value, "mismatch\n" );
+ /* ConvertInterfaceAliasToLuid */
+ ret = ConvertInterfaceAliasToLuid( row->Alias, &luid );
+ ok( !ret, "got %u\n", ret );
+ ok( luid.Value == row->InterfaceLuid.Value, "mismatch\n" );
+
+ /* ConvertInterfaceLuidToAlias */
+ ret = ConvertInterfaceLuidToAlias( &row->InterfaceLuid, alias, ARRAY_SIZE(alias) );
+ ok( !ret, "got %u\n", ret );
+ ok( !wcscmp( alias, row->Alias ), "got %s vs %s\n", wine_dbgstr_w( alias ), wine_dbgstr_w( row->Alias ) );
+
index = if_nametoindex( NULL );
ok( !index, "Got unexpected index %u\n", index );
index = if_nametoindex( nameA );
diff --git a/include/netioapi.h b/include/netioapi.h
index 6d08d54a444..055266d946e 100644
--- a/include/netioapi.h
+++ b/include/netioapi.h
@@ -241,6 +241,7 @@ typedef VOID (WINAPI *PIPFORWARD_CHANGE_CALLBACK)(VOID*,MIB_IPFORWARD_ROW2*,MIB_
DWORD WINAPI ConvertInterfaceAliasToLuid(const WCHAR*,NET_LUID*);
DWORD WINAPI ConvertInterfaceGuidToLuid(const GUID*,NET_LUID*);
DWORD WINAPI ConvertInterfaceIndexToLuid(NET_IFINDEX,NET_LUID*);
+DWORD WINAPI ConvertInterfaceLuidToAlias(const NET_LUID*,WCHAR*,SIZE_T);
DWORD WINAPI ConvertInterfaceLuidToGuid(const NET_LUID*,GUID*);
DWORD WINAPI ConvertInterfaceLuidToIndex(const NET_LUID*,NET_IFINDEX*);
DWORD WINAPI ConvertInterfaceLuidToNameA(const NET_LUID*,char*,SIZE_T);
--
2.23.0
1
0
Signed-off-by: Huw Davies <huw(a)codeweavers.com>
---
dlls/iphlpapi/iphlpapi.spec | 2 +-
dlls/iphlpapi/iphlpapi_main.c | 33 +++++++++++++++++++++++++++++++++
include/netioapi.h | 1 +
3 files changed, 35 insertions(+), 1 deletion(-)
diff --git a/dlls/iphlpapi/iphlpapi.spec b/dlls/iphlpapi/iphlpapi.spec
index ded265f5719..9180eb84af7 100644
--- a/dlls/iphlpapi/iphlpapi.spec
+++ b/dlls/iphlpapi/iphlpapi.spec
@@ -12,7 +12,7 @@
@ stdcall CancelMibChangeNotify2( ptr )
#@ stub ConvertGuidToStringA
#@ stub ConvertGuidToStringW
-#@ stub ConvertInterfaceAliasToLuid
+@ stdcall ConvertInterfaceAliasToLuid( ptr ptr )
@ stdcall ConvertInterfaceGuidToLuid( ptr ptr )
@ stdcall ConvertInterfaceIndexToLuid( long ptr )
#@ stub ConvertInterfaceLuidToAlias
diff --git a/dlls/iphlpapi/iphlpapi_main.c b/dlls/iphlpapi/iphlpapi_main.c
index 403b51391af..448c1d873af 100644
--- a/dlls/iphlpapi/iphlpapi_main.c
+++ b/dlls/iphlpapi/iphlpapi_main.c
@@ -3159,6 +3159,39 @@ ULONG WINAPI GetTcp6Table2(PMIB_TCP6TABLE2 table, PULONG size, BOOL order)
return ERROR_NOT_SUPPORTED;
}
+/******************************************************************
+ * ConvertInterfaceAliasToLuid (IPHLPAPI.@)
+ */
+DWORD WINAPI ConvertInterfaceAliasToLuid( const WCHAR *alias, NET_LUID *luid )
+{
+ struct nsi_ndis_ifinfo_rw *data;
+ DWORD err, count, i, len;
+ NET_LUID *keys;
+
+ TRACE( "(%s %p)\n", debugstr_w(alias), luid );
+
+ if (!alias || !*alias || !luid) return ERROR_INVALID_PARAMETER;
+ luid->Value = 0;
+ len = strlenW( alias );
+
+ err = NsiAllocateAndGetTable( 1, &NPI_MS_NDIS_MODULEID, NSI_NDIS_IFINFO_TABLE, (void **)&keys, sizeof(*keys),
+ (void **)&data, sizeof(*data), NULL, 0, NULL, 0, &count, 0 );
+ if (err) return err;
+
+ err = ERROR_INVALID_PARAMETER;
+ for (i = 0; i < count; i++)
+ {
+ if (data[i].alias.Length == len * 2 && !memcmp( data[i].alias.String, alias, len * 2 ))
+ {
+ luid->Value = keys[i].Value;
+ err = ERROR_SUCCESS;
+ break;
+ }
+ }
+ NsiFreeTable( keys, data, NULL, NULL );
+ return err;
+}
+
/******************************************************************
* ConvertInterfaceGuidToLuid (IPHLPAPI.@)
*/
diff --git a/include/netioapi.h b/include/netioapi.h
index 7238d527ad4..6d08d54a444 100644
--- a/include/netioapi.h
+++ b/include/netioapi.h
@@ -238,6 +238,7 @@ typedef VOID (WINAPI *PUNICAST_IPADDRESS_CHANGE_CALLBACK)(PVOID, PMIB_UNICASTIPA
typedef VOID (WINAPI *PIPFORWARD_CHANGE_CALLBACK)(VOID*,MIB_IPFORWARD_ROW2*,MIB_NOTIFICATION_TYPE);
+DWORD WINAPI ConvertInterfaceAliasToLuid(const WCHAR*,NET_LUID*);
DWORD WINAPI ConvertInterfaceGuidToLuid(const GUID*,NET_LUID*);
DWORD WINAPI ConvertInterfaceIndexToLuid(NET_IFINDEX,NET_LUID*);
DWORD WINAPI ConvertInterfaceLuidToGuid(const NET_LUID*,GUID*);
--
2.23.0
1
0
Signed-off-by: Huw Davies <huw(a)codeweavers.com>
---
dlls/dhcpcsvc/Makefile.in | 1 +
dlls/dhcpcsvc/dhcpcsvc.c | 35 ++++++++++++++++++++++++++++++-----
dlls/mountmgr.sys/dbus.c | 24 +++++++-----------------
dlls/mountmgr.sys/diskarb.c | 25 +++++--------------------
dlls/mountmgr.sys/mountmgr.c | 5 ++---
dlls/mountmgr.sys/mountmgr.h | 2 +-
include/ddk/mountmgr.h | 4 +++-
7 files changed, 49 insertions(+), 47 deletions(-)
diff --git a/dlls/dhcpcsvc/Makefile.in b/dlls/dhcpcsvc/Makefile.in
index d2d46a24f8a..792215b0225 100644
--- a/dlls/dhcpcsvc/Makefile.in
+++ b/dlls/dhcpcsvc/Makefile.in
@@ -1,4 +1,5 @@
MODULE = dhcpcsvc.dll
+DELAYIMPORTS = iphlpapi
IMPORTLIB = dhcpcsvc
EXTRADLLFLAGS = -mno-cygwin -Wb,--prefer-native
diff --git a/dlls/dhcpcsvc/dhcpcsvc.c b/dlls/dhcpcsvc/dhcpcsvc.c
index 59883bbc72e..1fc5077ff88 100644
--- a/dlls/dhcpcsvc/dhcpcsvc.c
+++ b/dlls/dhcpcsvc/dhcpcsvc.c
@@ -22,6 +22,11 @@
#include "winbase.h"
#include "dhcpcsdk.h"
#include "winioctl.h"
+#include "winternl.h"
+#include "ws2def.h"
+#include "ws2ipdef.h"
+#include "iphlpapi.h"
+#include "netioapi.h"
#define WINE_MOUNTMGR_EXTENSIONS
#include "ddk/mountmgr.h"
@@ -42,20 +47,37 @@ DWORD WINAPI DhcpCApiInitialize(LPDWORD version)
return ERROR_SUCCESS;
}
+static DWORD get_adapter_luid( const WCHAR *adapter, NET_LUID *luid )
+{
+ UNICODE_STRING ustr;
+ NTSTATUS status;
+ GUID guid;
+
+ if (adapter[0] == '{')
+ {
+ RtlInitUnicodeString( &ustr, adapter );
+ status = RtlGUIDFromString( &ustr, &guid );
+ if (!status) return ConvertInterfaceGuidToLuid( &guid, luid );
+ }
+ return ConvertInterfaceNameToLuidW( adapter, luid );
+}
+
DWORD WINAPI DhcpRequestParams( DWORD flags, void *reserved, WCHAR *adapter, DHCPCAPI_CLASSID *class_id,
DHCPCAPI_PARAMS_ARRAY send_params, DHCPCAPI_PARAMS_ARRAY recv_params, BYTE *buf,
DWORD *buflen, WCHAR *request_id )
{
struct mountmgr_dhcp_request_params *query;
- DWORD i, size, err = ERROR_OUTOFMEMORY;
+ DWORD i, size, err;
BYTE *src, *dst;
+ NET_LUID luid;
HANDLE mgr;
TRACE( "(%08x, %p, %s, %p, %u, %u, %p, %p, %s)\n", flags, reserved, debugstr_w(adapter), class_id,
send_params.nParams, recv_params.nParams, buf, buflen, debugstr_w(request_id) );
- if (!adapter || lstrlenW(adapter) > IF_MAX_STRING_SIZE || !buflen) return ERROR_INVALID_PARAMETER;
+ if (!adapter || !buflen) return ERROR_INVALID_PARAMETER;
if (flags != DHCPCAPI_REQUEST_SYNCHRONOUS) FIXME( "unsupported flags %08x\n", flags );
+ if ((err = get_adapter_luid( adapter, &luid ))) return err;
for (i = 0; i < send_params.nParams; i++)
FIXME( "send option %u not supported\n", send_params.Params->OptionId );
@@ -65,11 +87,14 @@ DWORD WINAPI DhcpRequestParams( DWORD flags, void *reserved, WCHAR *adapter, DHC
if (mgr == INVALID_HANDLE_VALUE) return GetLastError();
size = FIELD_OFFSET(struct mountmgr_dhcp_request_params, params[recv_params.nParams]) + *buflen;
- if (!(query = heap_alloc_zero( size ))) goto done;
-
+ if (!(query = heap_alloc_zero( size )))
+ {
+ err = ERROR_OUTOFMEMORY;
+ goto done;
+ }
for (i = 0; i < recv_params.nParams; i++) query->params[i].id = recv_params.Params[i].OptionId;
query->count = recv_params.nParams;
- lstrcpyW( query->adapter, adapter );
+ query->adapter = luid;
if (!DeviceIoControl( mgr, IOCTL_MOUNTMGR_QUERY_DHCP_REQUEST_PARAMS, query, size, query, size, NULL, NULL ))
{
diff --git a/dlls/mountmgr.sys/dbus.c b/dlls/mountmgr.sys/dbus.c
index 98b2a47ba6d..6998ef43688 100644
--- a/dlls/mountmgr.sys/dbus.c
+++ b/dlls/mountmgr.sys/dbus.c
@@ -999,25 +999,15 @@ static DBusMessage *device_by_iface_request( const char *iface )
}
#define IF_NAMESIZE 16
-static BOOL map_adapter_name( const WCHAR *name, char *unix_name, DWORD len )
+static BOOL map_adapter_name( const NET_LUID *luid, char *unix_name, DWORD len )
{
WCHAR unix_nameW[IF_NAMESIZE];
- UNICODE_STRING str;
- GUID guid;
- RtlInitUnicodeString( &str, name );
- if (!RtlGUIDFromString( &str, &guid ))
- {
- NET_LUID luid;
- if (ConvertInterfaceGuidToLuid( &guid, &luid ) ||
- ConvertInterfaceLuidToNameW( &luid, unix_nameW, ARRAY_SIZE(unix_nameW) )) return FALSE;
-
- name = unix_nameW;
- }
- return WideCharToMultiByte( CP_UNIXCP, 0, name, -1, unix_name, len, NULL, NULL ) != 0;
+ if (ConvertInterfaceLuidToNameW( luid, unix_nameW, ARRAY_SIZE(unix_nameW) )) return FALSE;
+ return WideCharToMultiByte( CP_UNIXCP, 0, unix_nameW, -1, unix_name, len, NULL, NULL ) != 0;
}
-static DBusMessage *dhcp4_config_request( const WCHAR *adapter )
+static DBusMessage *dhcp4_config_request( const NET_LUID *adapter )
{
static const char *device = "org.freedesktop.NetworkManager.Device";
static const char *dhcp4_config = "Dhcp4Config";
@@ -1057,7 +1047,7 @@ static DBusMessage *dhcp4_config_request( const WCHAR *adapter )
return reply;
}
-static DBusMessage *dhcp4_config_options_request( const WCHAR *adapter )
+static DBusMessage *dhcp4_config_options_request( const NET_LUID *adapter )
{
static const char *dhcp4_config = "org.freedesktop.NetworkManager.DHCP4Config";
static const char *options = "Options";
@@ -1116,7 +1106,7 @@ static const char *dhcp4_config_option_next_dict_entry( DBusMessageIter *iter, D
return name;
}
-static DBusMessage *dhcp4_config_option_request( const WCHAR *adapter, const char *option, const char **value )
+static DBusMessage *dhcp4_config_option_request( const NET_LUID *adapter, const char *option, const char **value )
{
DBusMessage *reply;
DBusMessageIter iter, variant;
@@ -1162,7 +1152,7 @@ static const char *map_option( ULONG option )
}
}
-ULONG get_dhcp_request_param( const WCHAR *adapter, struct mountmgr_dhcp_request_param *param, char *buf, ULONG offset,
+ULONG get_dhcp_request_param( const NET_LUID *adapter, struct mountmgr_dhcp_request_param *param, char *buf, ULONG offset,
ULONG size )
{
DBusMessage *reply;
diff --git a/dlls/mountmgr.sys/diskarb.c b/dlls/mountmgr.sys/diskarb.c
index 25e0745372a..1232f450599 100644
--- a/dlls/mountmgr.sys/diskarb.c
+++ b/dlls/mountmgr.sys/diskarb.c
@@ -258,27 +258,12 @@ static UInt8 map_option( ULONG option )
}
#define IF_NAMESIZE 16
-static BOOL map_adapter_name( const WCHAR *name, WCHAR *unix_name, DWORD len )
+static BOOL map_adapter_name( const NET_LUID *luid, WCHAR *unix_name, DWORD len )
{
- WCHAR buf[IF_NAMESIZE];
- UNICODE_STRING str;
- GUID guid;
-
- RtlInitUnicodeString( &str, name );
- if (!RtlGUIDFromString( &str, &guid ))
- {
- NET_LUID luid;
- if (ConvertInterfaceGuidToLuid( &guid, &luid ) ||
- ConvertInterfaceLuidToNameW( &luid, buf, ARRAY_SIZE(buf) )) return FALSE;
-
- name = buf;
- }
- if (lstrlenW( name ) >= len) return FALSE;
- lstrcpyW( unix_name, name );
- return TRUE;
+ return !ConvertInterfaceLuidToNameW( luid, unix_name, len );
}
-static CFStringRef find_service_id( const WCHAR *adapter )
+static CFStringRef find_service_id( const NET_LUID *adapter )
{
SCPreferencesRef prefs;
SCNetworkSetRef set = NULL;
@@ -318,7 +303,7 @@ done:
return ret;
}
-ULONG get_dhcp_request_param( const WCHAR *adapter, struct mountmgr_dhcp_request_param *param, char *buf, ULONG offset,
+ULONG get_dhcp_request_param( const NET_LUID *adapter, struct mountmgr_dhcp_request_param *param, char *buf, ULONG offset,
ULONG size )
{
CFStringRef service_id = find_service_id( adapter );
@@ -387,7 +372,7 @@ ULONG get_dhcp_request_param( const WCHAR *adapter, struct mountmgr_dhcp_request
#elif !defined(SONAME_LIBDBUS_1)
-ULONG get_dhcp_request_param( const WCHAR *adapter, struct mountmgr_dhcp_request_param *param, char *buf, ULONG offset,
+ULONG get_dhcp_request_param( const NET_LUID *adapter, struct mountmgr_dhcp_request_param *param, char *buf, ULONG offset,
ULONG size )
{
FIXME( "support not compiled in\n" );
diff --git a/dlls/mountmgr.sys/mountmgr.c b/dlls/mountmgr.sys/mountmgr.c
index b94944a350c..50be9eb740f 100644
--- a/dlls/mountmgr.sys/mountmgr.c
+++ b/dlls/mountmgr.sys/mountmgr.c
@@ -296,8 +296,7 @@ static void WINAPI query_dhcp_request_params( TP_CALLBACK_INSTANCE *instance, vo
ULONG i, offset = 0;
/* sanity checks */
- if (FIELD_OFFSET(struct mountmgr_dhcp_request_params, params[query->count]) > insize ||
- !memchrW( query->adapter, 0, ARRAY_SIZE(query->adapter) ))
+ if (FIELD_OFFSET(struct mountmgr_dhcp_request_params, params[query->count]) > insize)
{
irp->IoStatus.u.Status = STATUS_INVALID_PARAMETER;
goto err;
@@ -314,7 +313,7 @@ static void WINAPI query_dhcp_request_params( TP_CALLBACK_INSTANCE *instance, vo
offset = FIELD_OFFSET(struct mountmgr_dhcp_request_params, params[query->count]);
for (i = 0; i < query->count; i++)
{
- offset += get_dhcp_request_param( query->adapter, &query->params[i], (char *)query, offset, outsize - offset );
+ offset += get_dhcp_request_param( &query->adapter, &query->params[i], (char *)query, offset, outsize - offset );
if (offset > outsize)
{
if (offset >= sizeof(query->size)) query->size = offset;
diff --git a/dlls/mountmgr.sys/mountmgr.h b/dlls/mountmgr.sys/mountmgr.h
index 13be732e337..85c58062275 100644
--- a/dlls/mountmgr.sys/mountmgr.h
+++ b/dlls/mountmgr.sys/mountmgr.h
@@ -108,5 +108,5 @@ extern struct mount_point *add_volume_mount_point( DEVICE_OBJECT *device, UNICOD
extern void delete_mount_point( struct mount_point *mount ) DECLSPEC_HIDDEN;
extern void set_mount_point_id( struct mount_point *mount, const void *id, unsigned int id_len ) DECLSPEC_HIDDEN;
-extern ULONG get_dhcp_request_param( const WCHAR *adapter, struct mountmgr_dhcp_request_param *param, char *buf,
+extern ULONG get_dhcp_request_param( const NET_LUID *adapter, struct mountmgr_dhcp_request_param *param, char *buf,
ULONG offset, ULONG size ) DECLSPEC_HIDDEN;
diff --git a/include/ddk/mountmgr.h b/include/ddk/mountmgr.h
index 3e4bacbb827..6cf870f4f34 100644
--- a/include/ddk/mountmgr.h
+++ b/include/ddk/mountmgr.h
@@ -21,6 +21,8 @@
#ifndef _MOUNTMGR_
#define _MOUNTMGR_
+#include "ifdef.h"
+
#define MOUNTMGRCONTROLTYPE ((ULONG)'m')
#define MOUNTDEVCONTROLTYPE ((ULONG)'M')
@@ -119,7 +121,7 @@ struct mountmgr_dhcp_request_params
{
ULONG size;
ULONG count;
- WCHAR adapter[IF_MAX_STRING_SIZE + 1];
+ NET_LUID adapter;
struct mountmgr_dhcp_request_param params[1];
};
--
2.23.0
1
0