| /* | |
| * SHAppBarMessage implementation | |
| * | |
| * Copyright 2008 Vincent Povirk for CodeWeavers | |
| * | |
| * 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 "config.h" | |
| #include <stdlib.h> | |
| #include <string.h> | |
| #include <stdarg.h> | |
| #include <stdio.h> | |
| #include "windef.h" | |
| #include "winbase.h" | |
| #include "winerror.h" | |
| #include "shellapi.h" | |
| #include "winuser.h" | |
| #include "wine/debug.h" | |
| #include "wine/unicode.h" | |
| WINE_DEFAULT_DEBUG_CHANNEL(appbar); | |
| struct appbar_cmd | |
| { | |
| HANDLE return_map; | |
| DWORD return_process; | |
| APPBARDATA abd; | |
| }; | |
| struct appbar_response | |
| { | |
| UINT_PTR result; | |
| APPBARDATA abd; | |
| }; | |
| /************************************************************************* | |
| * SHAppBarMessage [SHELL32.@] | |
| */ | |
| UINT_PTR WINAPI SHAppBarMessage(DWORD msg, PAPPBARDATA data) | |
| { | |
| struct appbar_cmd command; | |
| struct appbar_response* response; | |
| HANDLE return_map; | |
| LPVOID return_view; | |
| HWND appbarmsg_window; | |
| COPYDATASTRUCT cds; | |
| DWORD_PTR msg_result; | |
| static const WCHAR classname[] = {'W','i','n','e','A','p','p','B','a','r',0}; | |
| UINT_PTR ret = 0; | |
| TRACE("msg=%d, data={cb=%d, hwnd=%p, callback=%x, edge=%d, rc=%s, lparam=%lx}\n", | |
| msg, data->cbSize, data->hWnd, data->uCallbackMessage, data->uEdge, | |
| wine_dbgstr_rect(&data->rc), data->lParam); | |
| if (data->cbSize < sizeof(APPBARDATA)) | |
| { | |
| WARN("data at %p is too small\n", data); | |
| return FALSE; | |
| } | |
| command.abd = *data; | |
| return_map = CreateFileMappingW(INVALID_HANDLE_VALUE, 0, PAGE_READWRITE, 0, sizeof(struct appbar_response), NULL); | |
| if (return_map == NULL) | |
| { | |
| ERR("couldn't create file mapping\n"); | |
| return 0; | |
| } | |
| command.return_map = return_map; | |
| command.return_process = GetCurrentProcessId(); | |
| appbarmsg_window = FindWindowW(classname, NULL); | |
| if (appbarmsg_window == NULL) | |
| { | |
| ERR("couldn't find appbar window\n"); | |
| CloseHandle(return_map); | |
| return 0; | |
| } | |
| cds.dwData = msg; | |
| cds.cbData = sizeof(command); | |
| cds.lpData = &command; | |
| SendMessageTimeoutW(appbarmsg_window, WM_COPYDATA, (WPARAM)data->hWnd, (LPARAM)&cds, SMTO_BLOCK, INFINITE, &msg_result); | |
| return_view = MapViewOfFile(return_map, FILE_MAP_READ, 0, 0, sizeof(struct appbar_response)); | |
| if (return_view == NULL) | |
| { | |
| ERR("MapViewOfFile failed\n"); | |
| CloseHandle(return_map); | |
| return 0; | |
| } | |
| response = return_view; | |
| ret = response->result; | |
| *data = response->abd; | |
| UnmapViewOfFile(return_view); | |
| CloseHandle(return_map); | |
| return ret; | |
| } |