1 /*
2  * Copyright 2010 Vicente J. Botet Escriba
3  * Copyright 2014 Renato Tegon Forti, Antony Polukhin
4  * Copyright 2015 Andrey Semashev
5  * Copyright 2015 Antony Polukhin
6  *
7  * Distributed under the Boost Software License, Version 1.0.
8  * See http://www.boost.org/LICENSE_1_0.txt
9  */
10 
11 #ifndef BOOST_WINAPI_DLL_HPP_INCLUDED_
12 #define BOOST_WINAPI_DLL_HPP_INCLUDED_
13 
14 #include <boost/winapi/basic_types.hpp>
15 
16 #ifdef BOOST_HAS_PRAGMA_ONCE
17 #pragma once
18 #endif
19 
20 #if BOOST_WINAPI_PARTITION_DESKTOP || BOOST_WINAPI_PARTITION_SYSTEM
21 
22 #if !defined( BOOST_USE_WINDOWS_H )
23 extern "C" {
24 namespace boost { namespace winapi {
25 #ifdef _WIN64
26 typedef INT_PTR_ (BOOST_WINAPI_WINAPI_CC *FARPROC_)();
27 typedef INT_PTR_ (BOOST_WINAPI_WINAPI_CC *NEARPROC_)();
28 typedef INT_PTR_ (BOOST_WINAPI_WINAPI_CC *PROC_)();
29 #else
30 typedef int (BOOST_WINAPI_WINAPI_CC *FARPROC_)();
31 typedef int (BOOST_WINAPI_WINAPI_CC *NEARPROC_)();
32 typedef int (BOOST_WINAPI_WINAPI_CC *PROC_)();
33 #endif // _WIN64
34 }} // namespace boost::winapi
35 
36 #if !defined( BOOST_NO_ANSI_APIS )
37 BOOST_SYMBOL_IMPORT boost::winapi::HMODULE_ BOOST_WINAPI_WINAPI_CC
38 LoadLibraryA(boost::winapi::LPCSTR_ lpFileName);
39 
40 BOOST_SYMBOL_IMPORT boost::winapi::HMODULE_ BOOST_WINAPI_WINAPI_CC
41 LoadLibraryExA(
42     boost::winapi::LPCSTR_ lpFileName,
43     boost::winapi::HANDLE_ hFile,
44     boost::winapi::DWORD_ dwFlags
45 );
46 
47 BOOST_SYMBOL_IMPORT boost::winapi::HMODULE_ BOOST_WINAPI_WINAPI_CC
48 GetModuleHandleA(boost::winapi::LPCSTR_ lpFileName);
49 
50 BOOST_SYMBOL_IMPORT boost::winapi::DWORD_ BOOST_WINAPI_WINAPI_CC
51 GetModuleFileNameA(
52     boost::winapi::HMODULE_ hModule,
53     boost::winapi::LPSTR_ lpFilename,
54     boost::winapi::DWORD_ nSize
55 );
56 #endif
57 
58 BOOST_SYMBOL_IMPORT boost::winapi::HMODULE_ BOOST_WINAPI_WINAPI_CC
59 LoadLibraryW(boost::winapi::LPCWSTR_ lpFileName);
60 
61 BOOST_SYMBOL_IMPORT boost::winapi::HMODULE_ BOOST_WINAPI_WINAPI_CC
62 LoadLibraryExW(
63     boost::winapi::LPCWSTR_ lpFileName,
64     boost::winapi::HANDLE_ hFile,
65     boost::winapi::DWORD_ dwFlags
66 );
67 
68 BOOST_SYMBOL_IMPORT boost::winapi::HMODULE_ BOOST_WINAPI_WINAPI_CC
69 GetModuleHandleW(boost::winapi::LPCWSTR_ lpFileName);
70 
71 BOOST_SYMBOL_IMPORT boost::winapi::DWORD_ BOOST_WINAPI_WINAPI_CC
72 GetModuleFileNameW(
73     boost::winapi::HMODULE_ hModule,
74     boost::winapi::LPWSTR_ lpFilename,
75     boost::winapi::DWORD_ nSize
76 );
77 
78 #if !defined( UNDER_CE )
79 BOOST_SYMBOL_IMPORT boost::winapi::FARPROC_ BOOST_WINAPI_WINAPI_CC
80 GetProcAddress(boost::winapi::HMODULE_ hModule, boost::winapi::LPCSTR_ lpProcName);
81 #else
82 // On Windows CE there are two functions: GetProcAddressA (since Windows CE 3.0) and GetProcAddressW.
83 // GetProcAddress is a macro that is _always_ defined to GetProcAddressW.
84 BOOST_SYMBOL_IMPORT boost::winapi::FARPROC_ BOOST_WINAPI_WINAPI_CC
85 GetProcAddressA(boost::winapi::HMODULE_ hModule, boost::winapi::LPCSTR_ lpProcName);
86 BOOST_SYMBOL_IMPORT boost::winapi::FARPROC_ BOOST_WINAPI_WINAPI_CC
87 GetProcAddressW(boost::winapi::HMODULE_ hModule, boost::winapi::LPCWSTR_ lpProcName);
88 #endif
89 
90 struct _MEMORY_BASIC_INFORMATION;
91 
92 #if !defined( BOOST_WINAPI_IS_MINGW )
93 BOOST_SYMBOL_IMPORT boost::winapi::SIZE_T_ BOOST_WINAPI_WINAPI_CC
94 VirtualQuery(
95     boost::winapi::LPCVOID_ lpAddress,
96     ::_MEMORY_BASIC_INFORMATION* lpBuffer,
97     boost::winapi::SIZE_T_ dwLength
98 );
99 #else // !defined( BOOST_WINAPI_IS_MINGW )
100 BOOST_SYMBOL_IMPORT boost::winapi::DWORD_ BOOST_WINAPI_WINAPI_CC
101 VirtualQuery(
102     boost::winapi::LPCVOID_ lpAddress,
103     ::_MEMORY_BASIC_INFORMATION* lpBuffer,
104     boost::winapi::DWORD_ dwLength
105 );
106 #endif // !defined( BOOST_WINAPI_IS_MINGW )
107 } // extern "C"
108 #endif // #if !defined( BOOST_USE_WINDOWS_H )
109 
110 namespace boost {
111 namespace winapi {
112 
113 typedef struct BOOST_MAY_ALIAS MEMORY_BASIC_INFORMATION_ {
114     PVOID_  BaseAddress;
115     PVOID_  AllocationBase;
116     DWORD_  AllocationProtect;
117     SIZE_T_ RegionSize;
118     DWORD_  State;
119     DWORD_  Protect;
120     DWORD_  Type;
121 } *PMEMORY_BASIC_INFORMATION_;
122 
123 #if defined( BOOST_USE_WINDOWS_H )
124 typedef ::FARPROC FARPROC_;
125 typedef ::NEARPROC NEARPROC_;
126 typedef ::PROC PROC_;
127 
128 BOOST_CONSTEXPR_OR_CONST DWORD_ DONT_RESOLVE_DLL_REFERENCES_           = DONT_RESOLVE_DLL_REFERENCES;
129 BOOST_CONSTEXPR_OR_CONST DWORD_ LOAD_WITH_ALTERED_SEARCH_PATH_         = LOAD_WITH_ALTERED_SEARCH_PATH;
130 #else // defined( BOOST_USE_WINDOWS_H )
131 BOOST_CONSTEXPR_OR_CONST DWORD_ DONT_RESOLVE_DLL_REFERENCES_           = 0x00000001;
132 BOOST_CONSTEXPR_OR_CONST DWORD_ LOAD_WITH_ALTERED_SEARCH_PATH_         = 0x00000008;
133 #endif // defined( BOOST_USE_WINDOWS_H )
134 
135 // This one is not defined by MinGW
136 BOOST_CONSTEXPR_OR_CONST DWORD_ LOAD_IGNORE_CODE_AUTHZ_LEVEL_          = 0x00000010;
137 
138 #if !defined( BOOST_NO_ANSI_APIS )
139 using ::LoadLibraryA;
140 using ::LoadLibraryExA;
141 using ::GetModuleHandleA;
142 using ::GetModuleFileNameA;
143 #endif // !defined( BOOST_NO_ANSI_APIS )
144 using ::LoadLibraryW;
145 using ::LoadLibraryExW;
146 using ::GetModuleHandleW;
147 using ::GetModuleFileNameW;
148 
149 #if !defined( UNDER_CE )
150 // For backward compatibility, don't use directly. Use get_proc_address instead.
151 using ::GetProcAddress;
152 #else
153 using ::GetProcAddressA;
154 using ::GetProcAddressW;
155 #endif
156 
get_proc_address(HMODULE_ hModule,LPCSTR_ lpProcName)157 BOOST_FORCEINLINE FARPROC_ get_proc_address(HMODULE_ hModule, LPCSTR_ lpProcName)
158 {
159 #if !defined( UNDER_CE )
160     return ::GetProcAddress(hModule, lpProcName);
161 #else
162     return ::GetProcAddressA(hModule, lpProcName);
163 #endif
164 }
165 
VirtualQuery(LPCVOID_ lpAddress,MEMORY_BASIC_INFORMATION_ * lpBuffer,SIZE_T_ dwLength)166 BOOST_FORCEINLINE SIZE_T_ VirtualQuery(LPCVOID_ lpAddress, MEMORY_BASIC_INFORMATION_* lpBuffer, SIZE_T_ dwLength)
167 {
168     return ::VirtualQuery(lpAddress, reinterpret_cast< ::_MEMORY_BASIC_INFORMATION* >(lpBuffer), dwLength);
169 }
170 
171 #if !defined( BOOST_NO_ANSI_APIS )
load_library(LPCSTR_ lpFileName)172 BOOST_FORCEINLINE HMODULE_ load_library(LPCSTR_ lpFileName)
173 {
174     return ::LoadLibraryA(lpFileName);
175 }
176 
load_library_ex(LPCSTR_ lpFileName,HANDLE_ hFile,DWORD_ dwFlags)177 BOOST_FORCEINLINE HMODULE_ load_library_ex(LPCSTR_ lpFileName, HANDLE_ hFile, DWORD_ dwFlags)
178 {
179     return ::LoadLibraryExA(lpFileName, hFile, dwFlags);
180 }
181 
get_module_handle(LPCSTR_ lpFileName)182 BOOST_FORCEINLINE HMODULE_ get_module_handle(LPCSTR_ lpFileName)
183 {
184     return ::GetModuleHandleA(lpFileName);
185 }
186 
get_module_file_name(HMODULE_ hModule,LPSTR_ lpFilename,DWORD_ nSize)187 BOOST_FORCEINLINE DWORD_ get_module_file_name(HMODULE_ hModule, LPSTR_ lpFilename, DWORD_ nSize)
188 {
189     return ::GetModuleFileNameA(hModule, lpFilename, nSize);
190 }
191 #endif // #if !defined( BOOST_NO_ANSI_APIS )
192 
load_library(LPCWSTR_ lpFileName)193 BOOST_FORCEINLINE HMODULE_ load_library(LPCWSTR_ lpFileName)
194 {
195     return ::LoadLibraryW(lpFileName);
196 }
197 
load_library_ex(LPCWSTR_ lpFileName,HANDLE_ hFile,DWORD_ dwFlags)198 BOOST_FORCEINLINE HMODULE_ load_library_ex(LPCWSTR_ lpFileName, HANDLE_ hFile, DWORD_ dwFlags)
199 {
200     return ::LoadLibraryExW(lpFileName, hFile, dwFlags);
201 }
202 
get_module_handle(LPCWSTR_ lpFileName)203 BOOST_FORCEINLINE HMODULE_ get_module_handle(LPCWSTR_ lpFileName)
204 {
205     return ::GetModuleHandleW(lpFileName);
206 }
207 
get_module_file_name(HMODULE_ hModule,LPWSTR_ lpFilename,DWORD_ nSize)208 BOOST_FORCEINLINE DWORD_ get_module_file_name(HMODULE_ hModule, LPWSTR_ lpFilename, DWORD_ nSize)
209 {
210     return ::GetModuleFileNameW(hModule, lpFilename, nSize);
211 }
212 
213 } // namespace winapi
214 } // namespace boost
215 
216 #endif // BOOST_WINAPI_PARTITION_DESKTOP || BOOST_WINAPI_PARTITION_SYSTEM
217 
218 //
219 // FreeLibrary is in a different partition set (slightly)
220 //
221 
222 #if BOOST_WINAPI_PARTITION_APP || BOOST_WINAPI_PARTITION_SYSTEM
223 
224 #if !defined(BOOST_USE_WINDOWS_H)
225 extern "C" {
226 BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
227 FreeLibrary(boost::winapi::HMODULE_ hModule);
228 }
229 #endif
230 
231 namespace boost {
232 namespace winapi {
233 using ::FreeLibrary;
234 }
235 }
236 
237 #endif // BOOST_WINAPI_PARTITION_APP || BOOST_WINAPI_PARTITION_SYSTEM
238 #endif // BOOST_WINAPI_DLL_HPP_INCLUDED_
239