Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
6d8b1887
Commit
6d8b1887
authored
Aug 16, 2022
by
Jacek Caban
Committed by
Alexandre Julliard
Aug 16, 2022
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
wow64win: Implement more user callbacks.
parent
57d66ecc
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
134 additions
and
14 deletions
+134
-14
user_main.c
dlls/user32/user_main.c
+19
-6
font.c
dlls/win32u/font.c
+3
-1
message.c
dlls/win32u/message.c
+1
-0
user.c
dlls/wow64win/user.c
+109
-6
ntuser.h
include/ntuser.h
+2
-1
No files found.
dlls/user32/user_main.c
View file @
6d8b1887
...
...
@@ -125,8 +125,17 @@ static NTSTATUS WINAPI User32DrawScrollBar( const struct draw_scroll_bar_params
static
NTSTATUS
WINAPI
User32DrawText
(
const
struct
draw_text_params
*
params
,
ULONG
size
)
{
RECT
rect
=
params
->
rect
;
int
ret
;
size
-=
FIELD_OFFSET
(
struct
draw_text_params
,
str
);
return
DrawTextW
(
params
->
hdc
,
params
->
str
,
size
/
sizeof
(
WCHAR
),
params
->
rect
,
params
->
flags
);
ret
=
DrawTextW
(
params
->
hdc
,
params
->
str
,
size
/
sizeof
(
WCHAR
),
&
rect
,
params
->
flags
);
if
(
params
->
ret_rect
)
{
*
params
->
ret_rect
=
rect
;
return
ret
;
}
return
NtCallbackReturn
(
&
rect
,
sizeof
(
rect
),
ret
);
}
static
NTSTATUS
WINAPI
User32ImmProcessKey
(
const
struct
imm_process_key_params
*
params
,
ULONG
size
)
...
...
@@ -180,12 +189,16 @@ static BOOL WINAPI User32LoadDriver( const WCHAR *path, ULONG size )
static
NTSTATUS
WINAPI
User32UnpackDDEMessage
(
const
struct
unpack_dde_message_params
*
params
,
ULONG
size
)
{
struct
unpack_dde_message_result
*
result
=
params
->
result
;
result
->
wparam
=
params
->
wparam
;
result
->
lparam
=
params
->
lparam
;
struct
unpack_dde_message_result
result
=
{
.
wparam
=
params
->
wparam
,
.
lparam
=
params
->
lparam
};
size
-=
FIELD_OFFSET
(
struct
unpack_dde_message_params
,
data
);
return
unpack_dde_message
(
params
->
hwnd
,
params
->
message
,
&
result
->
wparam
,
&
result
->
lparam
,
params
->
data
,
size
);
if
(
!
unpack_dde_message
(
params
->
hwnd
,
params
->
message
,
&
result
.
wparam
,
&
result
.
lparam
,
params
->
data
,
size
))
return
FALSE
;
if
(
params
->
result
)
*
params
->
result
=
result
;
else
NtCallbackReturn
(
&
result
,
sizeof
(
result
),
TRUE
);
return
TRUE
;
}
static
const
void
*
kernel_callback_table
[
NtUserCallCount
]
=
...
...
dlls/win32u/font.c
View file @
6d8b1887
...
...
@@ -6610,10 +6610,12 @@ INT WINAPI DrawTextW( HDC hdc, const WCHAR *str, INT count, RECT *rect, UINT fla
size
=
FIELD_OFFSET
(
struct
draw_text_params
,
str
[
count
]
);
if
(
!
(
params
=
malloc
(
size
)))
return
0
;
params
->
hdc
=
hdc
;
params
->
rect
=
rect
;
params
->
rect
=
*
rect
;
params
->
ret_rect
=
rect
;
params
->
flags
=
flags
;
if
(
count
)
memcpy
(
params
->
str
,
str
,
count
*
sizeof
(
WCHAR
)
);
ret
=
KeUserModeCallback
(
NtUserDrawText
,
params
,
size
,
&
ret_ptr
,
&
ret_len
);
if
(
ret_len
==
sizeof
(
*
rect
))
*
rect
=
*
(
const
RECT
*
)
ret_ptr
;
free
(
params
);
return
ret
;
}
dlls/win32u/message.c
View file @
6d8b1887
...
...
@@ -2009,6 +2009,7 @@ static int peek_message( MSG *msg, HWND hwnd, UINT first, UINT last, UINT flags,
params
->
lparam
=
info
.
msg
.
lParam
;
if
(
size
)
memcpy
(
params
->
data
,
buffer
,
size
);
ret
=
KeUserModeCallback
(
NtUserUnpackDDEMessage
,
params
,
len
,
&
ret_ptr
,
&
len
);
if
(
len
==
sizeof
(
result
))
result
=
*
(
struct
unpack_dde_message_result
*
)
ret_ptr
;
free
(
params
);
if
(
!
ret
)
continue
;
/* ignore it */
info
.
msg
.
wParam
=
result
.
wparam
;
...
...
dlls/wow64win/user.c
View file @
6d8b1887
...
...
@@ -287,6 +287,39 @@ struct win_proc_params32
ULONG
procW
;
};
struct
win_event_hook_params32
{
DWORD
event
;
ULONG
hwnd
;
LONG
object_id
;
LONG
child_id
;
ULONG
handle
;
DWORD
tid
;
DWORD
time
;
ULONG
proc
;
WCHAR
module
[
MAX_PATH
];
};
struct
draw_text_params32
{
ULONG
hdc
;
int
count
;
RECT
rect
;
ULONG
ret_rect
;
UINT
flags
;
WCHAR
str
[
1
];
};
struct
unpack_dde_message_params32
{
ULONG
result
;
ULONG
hwnd
;
UINT
message
;
LONG
wparam
;
LONG
lparam
;
char
data
[
1
];
};
static
MSG
*
msg_32to64
(
MSG
*
msg
,
const
MSG32
*
msg32
)
{
if
(
!
msg32
)
return
NULL
;
...
...
@@ -480,8 +513,22 @@ static NTSTATUS WINAPI wow64_NtUserCallSendAsyncCallback( void *arg, ULONG size
static
NTSTATUS
WINAPI
wow64_NtUserCallWinEventHook
(
void
*
arg
,
ULONG
size
)
{
FIXME
(
"
\n
"
);
return
0
;
struct
win_event_hook_params
*
params
=
arg
;
struct
win_event_hook_params32
params32
;
params32
.
event
=
params
->
event
;
params32
.
hwnd
=
HandleToUlong
(
params
->
hwnd
);
params32
.
object_id
=
params
->
object_id
;
params32
.
child_id
=
params
->
child_id
;
params32
.
handle
=
HandleToUlong
(
params
->
handle
);
params32
.
tid
=
params
->
tid
;
params32
.
time
=
params
->
time
;
params32
.
proc
=
PtrToUlong
(
params
->
proc
);
size
-=
FIELD_OFFSET
(
struct
win_event_hook_params
,
module
);
if
(
size
)
memcpy
(
params32
.
module
,
params
->
module
,
size
);
return
dispatch_callback
(
NtUserCallWinEventHook
,
&
params32
,
FIELD_OFFSET
(
struct
win_event_hook_params32
,
module
)
+
size
);
}
static
NTSTATUS
WINAPI
wow64_NtUserCallWinProc
(
void
*
arg
,
ULONG
size
)
...
...
@@ -766,8 +813,31 @@ static NTSTATUS WINAPI wow64_NtUserDrawScrollBar( void *arg, ULONG size )
static
NTSTATUS
WINAPI
wow64_NtUserDrawText
(
void
*
arg
,
ULONG
size
)
{
FIXME
(
"
\n
"
);
return
0
;
struct
draw_text_params
*
params
=
arg
;
struct
draw_text_params32
*
params32
;
RECT
*
rect_ptr
=
params
->
ret_rect
;
ULONG
ret_len
,
len
;
void
*
ret_ptr
;
NTSTATUS
ret
;
len
=
(
size
-
FIELD_OFFSET
(
struct
draw_text_params
,
str
))
/
sizeof
(
WCHAR
);
if
(
!
(
params32
=
Wow64AllocateTemp
(
FIELD_OFFSET
(
struct
draw_text_params32
,
str
[
len
]
))))
return
0
;
params32
->
hdc
=
HandleToUlong
(
params
->
hdc
);
params32
->
count
=
params
->
count
;
params32
->
rect
=
params
->
rect
;
params32
->
ret_rect
=
0
;
params32
->
flags
=
params
->
flags
;
if
(
len
)
memcpy
(
params32
->
str
,
params
->
str
,
len
*
sizeof
(
WCHAR
)
);
ret
=
Wow64KiUserCallbackDispatcher
(
NtUserDrawText
,
params
,
size
,
&
ret_ptr
,
&
ret_len
);
if
(
ret_len
==
sizeof
(
RECT
)
&&
rect_ptr
)
{
*
rect_ptr
=
*
(
const
RECT
*
)
ret_ptr
;
return
ret
;
}
return
NtCallbackReturn
(
ret_ptr
,
ret_len
,
ret
);
}
static
NTSTATUS
WINAPI
wow64_NtUserFreeCachedClipboardData
(
void
*
arg
,
ULONG
size
)
...
...
@@ -874,8 +944,41 @@ static NTSTATUS WINAPI wow64_NtUserRenderSynthesizedFormat( void *arg, ULONG siz
static
NTSTATUS
WINAPI
wow64_NtUserUnpackDDEMessage
(
void
*
arg
,
ULONG
size
)
{
FIXME
(
"
\n
"
);
return
0
;
struct
unpack_dde_message_params
*
params
=
arg
;
struct
unpack_dde_message_params32
*
params32
;
struct
unpack_dde_message_result
result
;
struct
{
LONG
wparam
;
LONG
lparam
;
}
*
result32
;
void
*
ret_ptr
;
ULONG
ret_len
;
size
-=
FIELD_OFFSET
(
struct
unpack_dde_message_params
,
data
);
if
(
!
(
params32
=
Wow64AllocateTemp
(
FIELD_OFFSET
(
struct
unpack_dde_message_params32
,
data
[
size
]
))))
return
0
;
params32
->
result
=
0
;
params32
->
hwnd
=
HandleToUlong
(
params
->
hwnd
);
params32
->
message
=
params
->
message
;
params32
->
wparam
=
params
->
wparam
;
params32
->
lparam
=
params
->
lparam
;
if
(
size
)
memcpy
(
params32
->
data
,
params
->
data
,
size
);
size
=
FIELD_OFFSET
(
struct
unpack_dde_message_params32
,
data
[
size
]
);
if
(
!
Wow64KiUserCallbackDispatcher
(
NtUserUnpackDDEMessage
,
params32
,
size
,
&
ret_ptr
,
&
ret_len
))
return
FALSE
;
if
(
ret_len
==
sizeof
(
*
result32
))
{
result32
=
ret_ptr
;
result
.
wparam
=
result32
->
wparam
;
result
.
lparam
=
result32
->
lparam
;
}
if
(
!
params
->
result
)
NtCallbackReturn
(
&
result
,
sizeof
(
result
),
TRUE
);
*
params
->
result
=
result
;
return
TRUE
;
}
static
NTSTATUS
WINAPI
wow64_NtUserCallFreeIcon
(
void
*
arg
,
ULONG
size
)
...
...
include/ntuser.h
View file @
6d8b1887
...
...
@@ -184,7 +184,8 @@ struct draw_text_params
{
HDC
hdc
;
int
count
;
RECT
*
rect
;
/* FIXME: Use NtCallbackReturn instead */
RECT
rect
;
RECT
*
ret_rect
;
/* FIXME: Use NtCallbackReturn instead */
UINT
flags
;
WCHAR
str
[
1
];
};
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment