From: Jacek Caban jacek@codeweavers.com
And use it in display drivers. --- dlls/win32u/message.c | 4 ++++ dlls/winemac.drv/macdrv.h | 2 +- dlls/winex11.drv/x11drv.h | 2 +- include/ntuser.h | 9 +++++---- 4 files changed, 11 insertions(+), 6 deletions(-)
diff --git a/dlls/win32u/message.c b/dlls/win32u/message.c index 57e9b26b33d..51967d2598a 100644 --- a/dlls/win32u/message.c +++ b/dlls/win32u/message.c @@ -3209,6 +3209,10 @@ LRESULT WINAPI NtUserMessageCall( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lpa else RtlSetLastWin32Error( ERROR_MESSAGE_SYNC_ONLY ); return FALSE;
+ case NtUserSendDriverMessage: + /* used by driver to send packed messages */ + return send_message( hwnd, msg, wparam, lparam ); + case NtUserSpyEnter: spy_enter_message( ansi, hwnd, msg, wparam, lparam ); return 0; diff --git a/dlls/winemac.drv/macdrv.h b/dlls/winemac.drv/macdrv.h index 1b7e6318f1a..ada7ca35587 100644 --- a/dlls/winemac.drv/macdrv.h +++ b/dlls/winemac.drv/macdrv.h @@ -289,7 +289,7 @@ extern NTSTATUS macdrv_client_func(enum macdrv_client_funcs func, const void *pa
static inline LRESULT send_message(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { - return NtUserMessageCall(hwnd, msg, wparam, lparam, NULL, NtUserSendMessage, FALSE); + return NtUserMessageCall(hwnd, msg, wparam, lparam, NULL, NtUserSendDriverMessage, FALSE); }
static inline LRESULT send_message_timeout(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam, diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index 07bdd7610d5..8721360536f 100644 --- a/dlls/winex11.drv/x11drv.h +++ b/dlls/winex11.drv/x11drv.h @@ -861,7 +861,7 @@ static inline UINT get_palette_entries( HPALETTE palette, UINT start, UINT count
static inline LRESULT send_message( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam ) { - return NtUserMessageCall( hwnd, msg, wparam, lparam, NULL, NtUserSendMessage, FALSE ); + return NtUserMessageCall( hwnd, msg, wparam, lparam, NULL, NtUserSendDriverMessage, FALSE ); }
static inline LRESULT send_message_timeout( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam, diff --git a/include/ntuser.h b/include/ntuser.h index 961d34d4db6..d724ccad103 100644 --- a/include/ntuser.h +++ b/include/ntuser.h @@ -297,10 +297,11 @@ enum /* Wine-specific exports */ NtUserClipboardWindowProc = 0x0300, NtUserGetDispatchParams = 0x3001, - NtUserSpyGetMsgName = 0x3002, - NtUserSpyEnter = 0x0303, - NtUserSpyExit = 0x0304, - NtUserWinProcResult = 0x0305, + NtUserSendDriverMessage = 0x3002, + NtUserSpyGetMsgName = 0x3003, + NtUserSpyEnter = 0x0304, + NtUserSpyExit = 0x0305, + NtUserWinProcResult = 0x0306, };
/* NtUserThunkedMenuItemInfo codes */
From: Jacek Caban jacek@codeweavers.com
--- dlls/winemac.drv/dllmain.c | 13 +++++++------ dlls/winemac.drv/dragdrop.c | 6 +++--- dlls/winemac.drv/event.c | 16 ++++++++-------- dlls/winemac.drv/image.c | 9 +++++---- dlls/winemac.drv/ime.c | 11 ++++++----- dlls/winemac.drv/unixlib.h | 27 ++++++++++++++++----------- 6 files changed, 45 insertions(+), 37 deletions(-)
diff --git a/dlls/winemac.drv/dllmain.c b/dlls/winemac.drv/dllmain.c index ac03ec360ce..083c539dd26 100644 --- a/dlls/winemac.drv/dllmain.c +++ b/dlls/winemac.drv/dllmain.c @@ -245,7 +245,7 @@ static BOOL CALLBACK get_first_resource(HMODULE module, LPCWSTR type, LPWSTR nam static NTSTATUS WINAPI macdrv_app_icon(void *arg, ULONG size) { struct app_icon_params *params = arg; - struct app_icon_result *result = params->result; + struct app_icon_result *result = param_ptr(params->result); HRSRC res_info; HGLOBAL res_data; GRPICONDIR *icon_dir; @@ -337,17 +337,18 @@ static NTSTATUS WINAPI macdrv_app_icon(void *arg, ULONG size)
if (!memcmp(icon_bits, png_magic, sizeof(png_magic))) { - entry->png = icon_bits; + entry->png = (UINT_PTR)icon_bits; entry->icon = 0; result->count++; } else { - entry->icon = CreateIconFromResourceEx(icon_bits, icon_dir->idEntries[i].dwBytesInRes, - TRUE, 0x00030000, width, height, 0); - if (entry->icon) + HICON icon = CreateIconFromResourceEx(icon_bits, icon_dir->idEntries[i].dwBytesInRes, + TRUE, 0x00030000, width, height, 0); + if (icon) { - entry->png = NULL; + entry->icon = HandleToUlong(icon); + entry->png = 0; result->count++; } else diff --git a/dlls/winemac.drv/dragdrop.c b/dlls/winemac.drv/dragdrop.c index afd4fb0a6d2..707e9708a01 100644 --- a/dlls/winemac.drv/dragdrop.c +++ b/dlls/winemac.drv/dragdrop.c @@ -428,7 +428,7 @@ NTSTATUS WINAPI macdrv_dnd_query_drop(void *arg, ULONG size) BOOL ret = FALSE; POINT pt;
- TRACE("win %p x,y %d,%d effect %x pasteboard %s\n", params->hwnd, params->x, params->y, + TRACE("win %x x,y %d,%d effect %x pasteboard %s\n", params->hwnd, params->x, params->y, params->effect, wine_dbgstr_longlong(params->handle));
pt.x = params->x; @@ -511,7 +511,7 @@ NTSTATUS WINAPI macdrv_dnd_query_drop(void *arg, ULONG size) NTSTATUS WINAPI macdrv_dnd_query_exited(void *arg, ULONG size) { struct dnd_query_exited_params *params = arg; - HWND hwnd = params->hwnd; + HWND hwnd = UlongToHandle(params->hwnd); IDropTarget *droptarget;
TRACE("win %p\n", hwnd); @@ -542,7 +542,7 @@ NTSTATUS WINAPI macdrv_dnd_query_exited(void *arg, ULONG size) NTSTATUS WINAPI macdrv_dnd_query_drag(void *arg, ULONG size) { struct dnd_query_drag_params *params = arg; - HWND hwnd = params->hwnd; + HWND hwnd = UlongToHandle(params->hwnd); BOOL ret = FALSE; POINT pt; DWORD effect; diff --git a/dlls/winemac.drv/event.c b/dlls/winemac.drv/event.c index ef1ab23bb1d..6ca46f55dff 100644 --- a/dlls/winemac.drv/event.c +++ b/dlls/winemac.drv/event.c @@ -162,8 +162,8 @@ static void macdrv_im_set_text(const macdrv_event *event)
size = offsetof(struct ime_set_text_params, text[length]); if (!(params = malloc(size))) return; - params->hwnd = hwnd; - params->data = event->im_set_text.data; + params->hwnd = HandleToUlong(hwnd); + params->data = (UINT_PTR)event->im_set_text.data; params->cursor_pos = event->im_set_text.cursor_pos; params->complete = event->im_set_text.complete;
@@ -229,7 +229,7 @@ static BOOL query_drag_drop(macdrv_query *query) return FALSE; }
- params.hwnd = hwnd; + params.hwnd = HandleToUlong(hwnd); params.effect = drag_operations_to_dropeffects(query->drag_drop.op); params.x = query->drag_drop.x + data->whole_rect.left; params.y = query->drag_drop.y + data->whole_rect.top; @@ -244,7 +244,7 @@ static BOOL query_drag_drop(macdrv_query *query) static BOOL query_drag_exited(macdrv_query *query) { struct dnd_query_exited_params params; - params.hwnd = macdrv_get_window_hwnd(query->window); + params.hwnd = HandleToUlong(macdrv_get_window_hwnd(query->window)); return macdrv_client_func(client_func_dnd_query_exited, ¶ms, sizeof(params)); }
@@ -265,7 +265,7 @@ static BOOL query_drag_operation(macdrv_query *query) return FALSE; }
- params.hwnd = hwnd; + params.hwnd = HandleToUlong(hwnd); params.effect = drag_operations_to_dropeffects(query->drag_operation.offered_ops); params.x = query->drag_operation.x + data->whole_rect.left; params.y = query->drag_operation.y + data->whole_rect.top; @@ -297,9 +297,9 @@ BOOL query_ime_char_rect(macdrv_query* query) TRACE_(imm)("win %p/%p himc %p range %ld-%ld\n", hwnd, query->window, himc, range->location, range->length);
- params.hwnd = hwnd; - params.data = himc; - params.result = &result; + params.hwnd = HandleToUlong(hwnd); + params.data = (UINT_PTR)himc; + params.result = (UINT_PTR)&result; params.location = range->location; params.length = range->length; ret = macdrv_client_func(client_func_ime_query_char_rect, ¶ms, sizeof(params)); diff --git a/dlls/winemac.drv/image.c b/dlls/winemac.drv/image.c index a0ee8b04aa9..857684db9c2 100644 --- a/dlls/winemac.drv/image.c +++ b/dlls/winemac.drv/image.c @@ -250,7 +250,7 @@ cleanup: CFArrayRef create_app_icon_images(void) { struct app_icon_result icons; - struct app_icon_params params = { .result = &icons }; + struct app_icon_params params = { .result = (UINT_PTR)&icons }; CFMutableArrayRef images = NULL; int i;
@@ -274,7 +274,7 @@ CFArrayRef create_app_icon_images(void)
if (icon->png) { - CFDataRef data = CFDataCreate(NULL, icon->png, icon->size); + CFDataRef data = CFDataCreate(NULL, param_ptr(icon->png), icon->size); if (data) { CGDataProviderRef provider = CGDataProviderCreateWithCFData(data); @@ -289,8 +289,9 @@ CFArrayRef create_app_icon_images(void) } else { - cgimage = create_cgimage_from_icon(icon->icon, icon->width, icon->height); - NtUserDestroyCursor(icon->icon, 0); + HICON handle = UlongToHandle(icon->icon); + cgimage = create_cgimage_from_icon(handle, icon->width, icon->height); + NtUserDestroyCursor(handle, 0); }
if (cgimage) diff --git a/dlls/winemac.drv/ime.c b/dlls/winemac.drv/ime.c index fd94591a2b8..1b994f0c5e8 100644 --- a/dlls/winemac.drv/ime.c +++ b/dlls/winemac.drv/ime.c @@ -1397,7 +1397,8 @@ NTSTATUS WINAPI macdrv_ime_set_text(void *arg, ULONG size) { struct ime_set_text_params *params = arg; ULONG length = (size - offsetof(struct ime_set_text_params, text)) / sizeof(WCHAR); - void *himc = params->data; + void *himc = param_ptr(params->data); + HWND hwnd = UlongToHandle(params->hwnd);
if (!himc) himc = RealIMC(FROM_MACDRV);
@@ -1420,10 +1421,10 @@ NTSTATUS WINAPI macdrv_ime_set_text(void *arg, ULONG size) { input.ki.wScan = params->text[i]; input.ki.dwFlags = KEYEVENTF_UNICODE; - __wine_send_input(params->hwnd, &input, NULL); + __wine_send_input(hwnd, &input, NULL);
input.ki.dwFlags = KEYEVENTF_UNICODE | KEYEVENTF_KEYUP; - __wine_send_input(params->hwnd, &input, NULL); + __wine_send_input(hwnd, &input, NULL); } } } @@ -1439,8 +1440,8 @@ NTSTATUS WINAPI macdrv_ime_set_text(void *arg, ULONG size) NTSTATUS WINAPI macdrv_ime_query_char_rect(void *arg, ULONG size) { struct ime_query_char_rect_params *params = arg; - struct ime_query_char_rect_result *result = params->result; - void *himc = params->data; + struct ime_query_char_rect_result *result = param_ptr(params->result); + void *himc = param_ptr(params->data); IMECHARPOSITION charpos; BOOL ret = FALSE;
diff --git a/dlls/winemac.drv/unixlib.h b/dlls/winemac.drv/unixlib.h index c5e71e188fa..3ebd0ceb48a 100644 --- a/dlls/winemac.drv/unixlib.h +++ b/dlls/winemac.drv/unixlib.h @@ -117,8 +117,8 @@ struct app_icon_entry UINT32 width; UINT32 height; UINT32 size; - void *png; - HICON icon; + UINT32 icon; + UINT64 png; };
struct app_icon_result @@ -130,7 +130,7 @@ struct app_icon_result /* macdrv_app_icon params */ struct app_icon_params { - struct app_icon_result *result; /* FIXME: Use NtCallbackReturn instead */ + UINT64 result; /* FIXME: Use NtCallbackReturn instead */ };
/* macdrv_app_quit_request params */ @@ -142,7 +142,7 @@ struct app_quit_request_params /* macdrv_dnd_query_drag params */ struct dnd_query_drag_params { - HWND hwnd; + UINT32 hwnd; UINT32 effect; INT32 x; INT32 y; @@ -152,7 +152,7 @@ struct dnd_query_drag_params /* macdrv_dnd_query_drop params */ struct dnd_query_drop_params { - HWND hwnd; + UINT32 hwnd; UINT32 effect; INT32 x; INT32 y; @@ -162,7 +162,7 @@ struct dnd_query_drop_params /* macdrv_dnd_query_exited params */ struct dnd_query_exited_params { - HWND hwnd; + UINT32 hwnd; };
/* macdrv_ime_query_char_rect result */ @@ -176,21 +176,26 @@ struct ime_query_char_rect_result /* macdrv_ime_query_char_rect params */ struct ime_query_char_rect_params { - HWND hwnd; - void *data; + UINT32 hwnd; UINT32 location; + UINT64 data; + UINT64 result; /* FIXME: Use NtCallbackReturn instead */ UINT32 length; - struct ime_query_char_rect_result *result; /* FIXME: Use NtCallbackReturn instead */ };
/* macdrv_ime_set_text params */ struct ime_set_text_params { - HWND hwnd; - void *data; + UINT32 hwnd; UINT32 cursor_pos; + UINT64 data; UINT32 complete; WCHAR text[1]; };
+static inline void *param_ptr(UINT64 param) +{ + return (void *)(UINT_PTR)param; +} + C_ASSERT(client_func_last <= NtUserDriverCallbackLast + 1);
From: Jacek Caban jacek@codeweavers.com
--- dlls/winemac.drv/macdrv_main.c | 134 ++++++++++++++++++++++++++++++++- dlls/winemac.drv/unixlib.h | 2 +- 2 files changed, 133 insertions(+), 3 deletions(-)
diff --git a/dlls/winemac.drv/macdrv_main.c b/dlls/winemac.drv/macdrv_main.c index 1f8ea268f45..857e32b970e 100644 --- a/dlls/winemac.drv/macdrv_main.c +++ b/dlls/winemac.drv/macdrv_main.c @@ -32,6 +32,7 @@ #include "ntstatus.h" #define WIN32_NO_STATUS #include "macdrv.h" +#include "shellapi.h" #include "wine/server.h"
WINE_DEFAULT_DEBUG_CHANNEL(macdrv); @@ -413,12 +414,13 @@ static void load_strings(struct localized_string *str) { if (str->str && str->len) { + const UniChar *ptr = param_ptr(str->str); CFNumberRef key = CFNumberCreate(NULL, kCFNumberIntType, &str->id); - CFStringRef value = CFStringCreateWithCharacters(NULL, (UniChar*)str->str, str->len); + CFStringRef value = CFStringCreateWithCharacters(NULL, ptr, str->len); if (key && value) CFDictionarySetValue(dict, key, value); else - ERR("Failed to add string ID 0x%04x %s\n", str->id, debugstr_wn(str->str, str->len)); + ERR("Failed to add string ID 0x%04x %s\n", str->id, debugstr_wn(ptr, str->len)); } else ERR("Failed to load string ID 0x%04x\n", str->id); @@ -653,3 +655,131 @@ const unixlib_entry_t __wine_unix_call_funcs[] = };
C_ASSERT( ARRAYSIZE(__wine_unix_call_funcs) == unix_funcs_count ); + +#ifdef _WIN64 + +static NTSTATUS wow64_dnd_get_data(void *arg) +{ + struct + { + UINT64 handle; + UINT format; + ULONG size; + ULONG data; + } *params32 = arg; + struct dnd_get_data_params params; + + params.handle = params32->handle; + params.format = params32->format; + params.size = params32->size; + params.data = UlongToPtr(params32->data); + return macdrv_dnd_get_data(¶ms); +} + +static NTSTATUS wow64_ime_process_text_input(void *arg) +{ + struct + { + UINT vkey; + UINT scan; + UINT repeat; + ULONG key_state; + ULONG himc; + ULONG done; + } *params32 = arg; + struct process_text_input_params params; + + params.vkey = params32->vkey; + params.scan = params32->scan; + params.repeat = params32->repeat; + params.key_state = UlongToPtr(params32->key_state); + params.himc = UlongToPtr(params32->himc); + params.done = UlongToPtr(params32->done); + return macdrv_ime_process_text_input(¶ms); +} + +static NTSTATUS wow64_init(void *arg) +{ + struct + { + ULONG strings; + } *params32 = arg; + struct init_params params; + + params.strings = UlongToPtr(params32->strings); + return macdrv_init(¶ms); +} + +static NTSTATUS wow64_notify_icon(void *arg) +{ + struct + { + DWORD msg; + ULONG data; + } *params32 = arg; + struct + { + DWORD cbSize; + ULONG hWnd; + UINT uID; + UINT uFlags; + UINT uCallbackMessage; + ULONG hIcon; + WCHAR szTip[128]; + DWORD dwState; + DWORD dwStateMask; + WCHAR szInfo[256]; + UINT uTimeout; + WCHAR szInfoTitle[64]; + DWORD dwInfoFlags; + GUID guidItem; + ULONG hBalloonIcon; + } *data32 = UlongToPtr(params32->data); + + struct notify_icon_params params; + NOTIFYICONDATAW data; + + params.msg = params32->msg; + params.data = &data; + + data.cbSize = sizeof(data); + data.hWnd = UlongToHandle(data32->hWnd); + data.uID = data32->uID; + data.uFlags = data32->uFlags; + data.uCallbackMessage = data32->uCallbackMessage; + data.hIcon = UlongToHandle(data32->hIcon); + if (data.uFlags & NIF_TIP) + wcscpy(data.szTip, data32->szTip); + data.dwState = data32->dwState; + data.dwStateMask = data32->dwStateMask; + if (data.uFlags & NIF_INFO) + { + wcscpy(data.szInfoTitle, data32->szInfoTitle); + wcscpy(data.szInfo, data32->szInfo); + data.uTimeout = data32->uTimeout; + data.dwInfoFlags = data32->dwInfoFlags; + } + data.guidItem = data32->guidItem; + data.hBalloonIcon = UlongToHandle(data32->hBalloonIcon); + + return macdrv_notify_icon(¶ms); +} + +const unixlib_entry_t __wine_unix_call_wow64_funcs[] = +{ + wow64_dnd_get_data, + macdrv_dnd_get_formats, + macdrv_dnd_have_format, + macdrv_dnd_release, + macdrv_dnd_retain, + macdrv_ime_clear, + wow64_ime_process_text_input, + macdrv_ime_using_input_method, + wow64_init, + wow64_notify_icon, + macdrv_quit_result, +}; + +C_ASSERT( ARRAYSIZE(__wine_unix_call_wow64_funcs) == unix_funcs_count ); + +#endif /* _WIN64 */ diff --git a/dlls/winemac.drv/unixlib.h b/dlls/winemac.drv/unixlib.h index 3ebd0ceb48a..5fe19a94fee 100644 --- a/dlls/winemac.drv/unixlib.h +++ b/dlls/winemac.drv/unixlib.h @@ -77,7 +77,7 @@ struct localized_string { UINT id; UINT len; - const WCHAR *str; + UINT64 str; };
struct init_params