1 /*
2 * Copyright 2010 Vicente J. Botet Escriba
3 * Copyright 2014 Renato Tegon Forti, Antony Polukhin
4 * Copyright 2015, 2020 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 #include <boost/winapi/get_proc_address.hpp>
16 #include <boost/winapi/detail/header.hpp>
17
18 #ifdef BOOST_HAS_PRAGMA_ONCE
19 #pragma once
20 #endif
21
22 #if BOOST_WINAPI_PARTITION_DESKTOP || BOOST_WINAPI_PARTITION_SYSTEM
23
24 #if !defined( BOOST_USE_WINDOWS_H )
25 extern "C" {
26
27 #if !defined( BOOST_NO_ANSI_APIS )
28 BOOST_WINAPI_IMPORT boost::winapi::HMODULE_ BOOST_WINAPI_WINAPI_CC
29 LoadLibraryA(boost::winapi::LPCSTR_ lpFileName);
30
31 BOOST_WINAPI_IMPORT boost::winapi::HMODULE_ BOOST_WINAPI_WINAPI_CC
32 LoadLibraryExA(
33 boost::winapi::LPCSTR_ lpFileName,
34 boost::winapi::HANDLE_ hFile,
35 boost::winapi::DWORD_ dwFlags
36 );
37
38 BOOST_WINAPI_IMPORT boost::winapi::HMODULE_ BOOST_WINAPI_WINAPI_CC
39 GetModuleHandleA(boost::winapi::LPCSTR_ lpFileName);
40
41 BOOST_WINAPI_IMPORT boost::winapi::DWORD_ BOOST_WINAPI_WINAPI_CC
42 GetModuleFileNameA(
43 boost::winapi::HMODULE_ hModule,
44 boost::winapi::LPSTR_ lpFilename,
45 boost::winapi::DWORD_ nSize
46 );
47 #endif
48
49 BOOST_WINAPI_IMPORT_EXCEPT_WM boost::winapi::HMODULE_ BOOST_WINAPI_WINAPI_CC
50 LoadLibraryW(boost::winapi::LPCWSTR_ lpFileName);
51
52 BOOST_WINAPI_IMPORT_EXCEPT_WM boost::winapi::HMODULE_ BOOST_WINAPI_WINAPI_CC
53 LoadLibraryExW(
54 boost::winapi::LPCWSTR_ lpFileName,
55 boost::winapi::HANDLE_ hFile,
56 boost::winapi::DWORD_ dwFlags
57 );
58
59 BOOST_WINAPI_IMPORT_EXCEPT_WM boost::winapi::HMODULE_ BOOST_WINAPI_WINAPI_CC
60 GetModuleHandleW(boost::winapi::LPCWSTR_ lpFileName);
61
62 BOOST_WINAPI_IMPORT_EXCEPT_WM boost::winapi::DWORD_ BOOST_WINAPI_WINAPI_CC
63 GetModuleFileNameW(
64 boost::winapi::HMODULE_ hModule,
65 boost::winapi::LPWSTR_ lpFilename,
66 boost::winapi::DWORD_ nSize
67 );
68
69 struct _MEMORY_BASIC_INFORMATION;
70
71 #if !defined( BOOST_WINAPI_IS_MINGW )
72 BOOST_WINAPI_IMPORT_EXCEPT_WM boost::winapi::SIZE_T_ BOOST_WINAPI_WINAPI_CC
73 VirtualQuery(
74 boost::winapi::LPCVOID_ lpAddress,
75 ::_MEMORY_BASIC_INFORMATION* lpBuffer,
76 boost::winapi::SIZE_T_ dwLength
77 );
78 #else // !defined( BOOST_WINAPI_IS_MINGW )
79 BOOST_WINAPI_IMPORT boost::winapi::DWORD_ BOOST_WINAPI_WINAPI_CC
80 VirtualQuery(
81 boost::winapi::LPCVOID_ lpAddress,
82 ::_MEMORY_BASIC_INFORMATION* lpBuffer,
83 boost::winapi::DWORD_ dwLength
84 );
85 #endif // !defined( BOOST_WINAPI_IS_MINGW )
86 } // extern "C"
87 #endif // #if !defined( BOOST_USE_WINDOWS_H )
88
89 namespace boost {
90 namespace winapi {
91
92 typedef struct BOOST_MAY_ALIAS MEMORY_BASIC_INFORMATION_ {
93 PVOID_ BaseAddress;
94 PVOID_ AllocationBase;
95 DWORD_ AllocationProtect;
96 SIZE_T_ RegionSize;
97 DWORD_ State;
98 DWORD_ Protect;
99 DWORD_ Type;
100 } *PMEMORY_BASIC_INFORMATION_;
101
102 #if defined( BOOST_USE_WINDOWS_H )
103 BOOST_CONSTEXPR_OR_CONST DWORD_ DONT_RESOLVE_DLL_REFERENCES_ = DONT_RESOLVE_DLL_REFERENCES;
104 BOOST_CONSTEXPR_OR_CONST DWORD_ LOAD_WITH_ALTERED_SEARCH_PATH_ = LOAD_WITH_ALTERED_SEARCH_PATH;
105 #else // defined( BOOST_USE_WINDOWS_H )
106 BOOST_CONSTEXPR_OR_CONST DWORD_ DONT_RESOLVE_DLL_REFERENCES_ = 0x00000001;
107 BOOST_CONSTEXPR_OR_CONST DWORD_ LOAD_WITH_ALTERED_SEARCH_PATH_ = 0x00000008;
108 #endif // defined( BOOST_USE_WINDOWS_H )
109
110 // This one is not defined by MinGW
111 BOOST_CONSTEXPR_OR_CONST DWORD_ LOAD_IGNORE_CODE_AUTHZ_LEVEL_ = 0x00000010;
112
113 #if !defined( BOOST_NO_ANSI_APIS )
114 using ::LoadLibraryA;
115 using ::LoadLibraryExA;
116 using ::GetModuleHandleA;
117 using ::GetModuleFileNameA;
118 #endif // !defined( BOOST_NO_ANSI_APIS )
119 using ::LoadLibraryW;
120 using ::LoadLibraryExW;
121 using ::GetModuleHandleW;
122 using ::GetModuleFileNameW;
123
VirtualQuery(LPCVOID_ lpAddress,MEMORY_BASIC_INFORMATION_ * lpBuffer,SIZE_T_ dwLength)124 BOOST_FORCEINLINE SIZE_T_ VirtualQuery(LPCVOID_ lpAddress, MEMORY_BASIC_INFORMATION_* lpBuffer, SIZE_T_ dwLength)
125 {
126 return ::VirtualQuery(lpAddress, reinterpret_cast< ::_MEMORY_BASIC_INFORMATION* >(lpBuffer), dwLength);
127 }
128
129 #if !defined( BOOST_NO_ANSI_APIS )
load_library(LPCSTR_ lpFileName)130 BOOST_FORCEINLINE HMODULE_ load_library(LPCSTR_ lpFileName)
131 {
132 return ::LoadLibraryA(lpFileName);
133 }
134
load_library_ex(LPCSTR_ lpFileName,HANDLE_ hFile,DWORD_ dwFlags)135 BOOST_FORCEINLINE HMODULE_ load_library_ex(LPCSTR_ lpFileName, HANDLE_ hFile, DWORD_ dwFlags)
136 {
137 return ::LoadLibraryExA(lpFileName, hFile, dwFlags);
138 }
139
get_module_handle(LPCSTR_ lpFileName)140 BOOST_FORCEINLINE HMODULE_ get_module_handle(LPCSTR_ lpFileName)
141 {
142 return ::GetModuleHandleA(lpFileName);
143 }
144
get_module_file_name(HMODULE_ hModule,LPSTR_ lpFilename,DWORD_ nSize)145 BOOST_FORCEINLINE DWORD_ get_module_file_name(HMODULE_ hModule, LPSTR_ lpFilename, DWORD_ nSize)
146 {
147 return ::GetModuleFileNameA(hModule, lpFilename, nSize);
148 }
149 #endif // #if !defined( BOOST_NO_ANSI_APIS )
150
load_library(LPCWSTR_ lpFileName)151 BOOST_FORCEINLINE HMODULE_ load_library(LPCWSTR_ lpFileName)
152 {
153 return ::LoadLibraryW(lpFileName);
154 }
155
load_library_ex(LPCWSTR_ lpFileName,HANDLE_ hFile,DWORD_ dwFlags)156 BOOST_FORCEINLINE HMODULE_ load_library_ex(LPCWSTR_ lpFileName, HANDLE_ hFile, DWORD_ dwFlags)
157 {
158 return ::LoadLibraryExW(lpFileName, hFile, dwFlags);
159 }
160
get_module_handle(LPCWSTR_ lpFileName)161 BOOST_FORCEINLINE HMODULE_ get_module_handle(LPCWSTR_ lpFileName)
162 {
163 return ::GetModuleHandleW(lpFileName);
164 }
165
get_module_file_name(HMODULE_ hModule,LPWSTR_ lpFilename,DWORD_ nSize)166 BOOST_FORCEINLINE DWORD_ get_module_file_name(HMODULE_ hModule, LPWSTR_ lpFilename, DWORD_ nSize)
167 {
168 return ::GetModuleFileNameW(hModule, lpFilename, nSize);
169 }
170
171 } // namespace winapi
172 } // namespace boost
173
174 #endif // BOOST_WINAPI_PARTITION_DESKTOP || BOOST_WINAPI_PARTITION_SYSTEM
175
176 //
177 // FreeLibrary is in a different partition set (slightly)
178 //
179
180 #if BOOST_WINAPI_PARTITION_APP || BOOST_WINAPI_PARTITION_SYSTEM
181
182 #if !defined(BOOST_USE_WINDOWS_H)
183 extern "C" {
184 BOOST_WINAPI_IMPORT_EXCEPT_WM boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
185 FreeLibrary(boost::winapi::HMODULE_ hModule);
186 }
187 #endif
188
189 namespace boost {
190 namespace winapi {
191 using ::FreeLibrary;
192 }
193 }
194
195 #endif // BOOST_WINAPI_PARTITION_APP || BOOST_WINAPI_PARTITION_SYSTEM
196
197 #include <boost/winapi/detail/footer.hpp>
198
199 #endif // BOOST_WINAPI_DLL_HPP_INCLUDED_
200