| /* | 
 |  * 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; | 
 | } |