1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker #include "base/win/wrapped_window_proc.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include "base/atomicops.h"
8*6777b538SAndroid Build Coastguard Worker #include "base/check.h"
9*6777b538SAndroid Build Coastguard Worker #include "base/notreached.h"
10*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_util.h"
11*6777b538SAndroid Build Coastguard Worker
12*6777b538SAndroid Build Coastguard Worker namespace {
13*6777b538SAndroid Build Coastguard Worker
14*6777b538SAndroid Build Coastguard Worker base::win::WinProcExceptionFilter s_exception_filter = nullptr;
15*6777b538SAndroid Build Coastguard Worker
GetModuleFromWndProc(WNDPROC window_proc)16*6777b538SAndroid Build Coastguard Worker HMODULE GetModuleFromWndProc(WNDPROC window_proc) {
17*6777b538SAndroid Build Coastguard Worker HMODULE instance = nullptr;
18*6777b538SAndroid Build Coastguard Worker // Converting a pointer-to-function to a void* is undefined behavior, but
19*6777b538SAndroid Build Coastguard Worker // Windows (and POSIX) APIs require it to work.
20*6777b538SAndroid Build Coastguard Worker void* address = reinterpret_cast<void*>(window_proc);
21*6777b538SAndroid Build Coastguard Worker if (!::GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS |
22*6777b538SAndroid Build Coastguard Worker GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
23*6777b538SAndroid Build Coastguard Worker static_cast<char*>(address), &instance)) {
24*6777b538SAndroid Build Coastguard Worker NOTREACHED();
25*6777b538SAndroid Build Coastguard Worker }
26*6777b538SAndroid Build Coastguard Worker return instance;
27*6777b538SAndroid Build Coastguard Worker }
28*6777b538SAndroid Build Coastguard Worker
29*6777b538SAndroid Build Coastguard Worker } // namespace.
30*6777b538SAndroid Build Coastguard Worker
31*6777b538SAndroid Build Coastguard Worker namespace base {
32*6777b538SAndroid Build Coastguard Worker namespace win {
33*6777b538SAndroid Build Coastguard Worker
SetWinProcExceptionFilter(WinProcExceptionFilter filter)34*6777b538SAndroid Build Coastguard Worker WinProcExceptionFilter SetWinProcExceptionFilter(
35*6777b538SAndroid Build Coastguard Worker WinProcExceptionFilter filter) {
36*6777b538SAndroid Build Coastguard Worker subtle::AtomicWord rv = subtle::NoBarrier_AtomicExchange(
37*6777b538SAndroid Build Coastguard Worker reinterpret_cast<subtle::AtomicWord*>(&s_exception_filter),
38*6777b538SAndroid Build Coastguard Worker reinterpret_cast<subtle::AtomicWord>(filter));
39*6777b538SAndroid Build Coastguard Worker return reinterpret_cast<WinProcExceptionFilter>(rv);
40*6777b538SAndroid Build Coastguard Worker }
41*6777b538SAndroid Build Coastguard Worker
CallExceptionFilter(EXCEPTION_POINTERS * info)42*6777b538SAndroid Build Coastguard Worker int CallExceptionFilter(EXCEPTION_POINTERS* info) {
43*6777b538SAndroid Build Coastguard Worker return s_exception_filter ? s_exception_filter(info)
44*6777b538SAndroid Build Coastguard Worker : EXCEPTION_CONTINUE_SEARCH;
45*6777b538SAndroid Build Coastguard Worker }
46*6777b538SAndroid Build Coastguard Worker
InitializeWindowClass(const wchar_t * class_name,WNDPROC window_proc,UINT style,int class_extra,int window_extra,HCURSOR cursor,HBRUSH background,const wchar_t * menu_name,HICON large_icon,HICON small_icon,WNDCLASSEX * class_out)47*6777b538SAndroid Build Coastguard Worker BASE_EXPORT void InitializeWindowClass(const wchar_t* class_name,
48*6777b538SAndroid Build Coastguard Worker WNDPROC window_proc,
49*6777b538SAndroid Build Coastguard Worker UINT style,
50*6777b538SAndroid Build Coastguard Worker int class_extra,
51*6777b538SAndroid Build Coastguard Worker int window_extra,
52*6777b538SAndroid Build Coastguard Worker HCURSOR cursor,
53*6777b538SAndroid Build Coastguard Worker HBRUSH background,
54*6777b538SAndroid Build Coastguard Worker const wchar_t* menu_name,
55*6777b538SAndroid Build Coastguard Worker HICON large_icon,
56*6777b538SAndroid Build Coastguard Worker HICON small_icon,
57*6777b538SAndroid Build Coastguard Worker WNDCLASSEX* class_out) {
58*6777b538SAndroid Build Coastguard Worker class_out->cbSize = sizeof(WNDCLASSEX);
59*6777b538SAndroid Build Coastguard Worker class_out->style = style;
60*6777b538SAndroid Build Coastguard Worker class_out->lpfnWndProc = window_proc;
61*6777b538SAndroid Build Coastguard Worker class_out->cbClsExtra = class_extra;
62*6777b538SAndroid Build Coastguard Worker class_out->cbWndExtra = window_extra;
63*6777b538SAndroid Build Coastguard Worker // RegisterClassEx uses a handle of the module containing the window procedure
64*6777b538SAndroid Build Coastguard Worker // to distinguish identically named classes registered in different modules.
65*6777b538SAndroid Build Coastguard Worker class_out->hInstance = GetModuleFromWndProc(window_proc);
66*6777b538SAndroid Build Coastguard Worker class_out->hIcon = large_icon;
67*6777b538SAndroid Build Coastguard Worker class_out->hCursor = cursor;
68*6777b538SAndroid Build Coastguard Worker class_out->hbrBackground = background;
69*6777b538SAndroid Build Coastguard Worker class_out->lpszMenuName = menu_name;
70*6777b538SAndroid Build Coastguard Worker class_out->lpszClassName = class_name;
71*6777b538SAndroid Build Coastguard Worker class_out->hIconSm = small_icon;
72*6777b538SAndroid Build Coastguard Worker
73*6777b538SAndroid Build Coastguard Worker // Check if |window_proc| is valid.
74*6777b538SAndroid Build Coastguard Worker DCHECK(class_out->hInstance != nullptr);
75*6777b538SAndroid Build Coastguard Worker }
76*6777b538SAndroid Build Coastguard Worker
77*6777b538SAndroid Build Coastguard Worker } // namespace win
78*6777b538SAndroid Build Coastguard Worker } // namespace base
79