1 /*
2  * Copyright 2010 Vicente J. Botet Escriba
3  * Copyright 2015-2018 Andrey Semashev
4  *
5  * Distributed under the Boost Software License, Version 1.0.
6  * See http://www.boost.org/LICENSE_1_0.txt
7  */
8 
9 #ifndef BOOST_WINAPI_BASIC_TYPES_HPP_INCLUDED_
10 #define BOOST_WINAPI_BASIC_TYPES_HPP_INCLUDED_
11 
12 #include <boost/winapi/config.hpp>
13 
14 #ifdef BOOST_HAS_PRAGMA_ONCE
15 #pragma once
16 #endif
17 
18 #if defined(BOOST_USE_WINDOWS_H)
19 # include <windows.h>
20 #elif defined(WIN32) || defined(_WIN32) || defined(__WIN32__) ||  defined(__CYGWIN__)
21 # include <winerror.h>
22 # ifdef UNDER_CE
23 #  ifndef WINAPI
24 #   ifndef _WIN32_WCE_EMULATION
25 #    define WINAPI  __cdecl     // Note this doesn't match the desktop definition
26 #   else
27 #    define WINAPI  __stdcall
28 #   endif
29 #  endif
30 // Windows CE defines a few functions as inline functions in kfuncs.h
31 typedef int BOOL;
32 typedef unsigned long DWORD;
33 typedef void* HANDLE;
34 #  include <kfuncs.h>
35 # endif // UNDER_CE
36 #else
37 # error "Win32 functions not available"
38 #endif
39 
40 #if defined(_M_IX86) || defined(__i386__)
41 #define BOOST_WINAPI_DETAIL_STDCALL __stdcall
42 #else
43 // On architectures other than 32-bit x86 __stdcall is ignored. Clang also issues a warning.
44 #define BOOST_WINAPI_DETAIL_STDCALL
45 #endif
46 
47 #if defined(WINAPI)
48 #define BOOST_WINAPI_WINAPI_CC WINAPI
49 #else
50 #define BOOST_WINAPI_WINAPI_CC BOOST_WINAPI_DETAIL_STDCALL
51 #endif
52 
53 #if defined(CALLBACK)
54 #define BOOST_WINAPI_CALLBACK_CC CALLBACK
55 #else
56 #define BOOST_WINAPI_CALLBACK_CC BOOST_WINAPI_DETAIL_STDCALL
57 #endif
58 
59 #if defined(NTAPI)
60 #define BOOST_WINAPI_NTAPI_CC NTAPI
61 #else
62 #define BOOST_WINAPI_NTAPI_CC BOOST_WINAPI_DETAIL_STDCALL
63 #endif
64 
65 #ifndef NO_STRICT
66 #ifndef STRICT
67 #define STRICT 1
68 #endif
69 #endif
70 
71 #if defined(STRICT)
72 #define BOOST_WINAPI_DETAIL_DECLARE_HANDLE(x) struct x##__; typedef struct x##__ *x
73 #else
74 #define BOOST_WINAPI_DETAIL_DECLARE_HANDLE(x) typedef void* x
75 #endif
76 
77 #if !defined(BOOST_USE_WINDOWS_H)
78 extern "C" {
79 union _LARGE_INTEGER;
80 struct _SECURITY_ATTRIBUTES;
81 BOOST_WINAPI_DETAIL_DECLARE_HANDLE(HINSTANCE);
82 typedef HINSTANCE HMODULE;
83 }
84 #endif
85 
86 #if defined(__GNUC__)
87 #define BOOST_WINAPI_DETAIL_EXTENSION __extension__
88 #else
89 #define BOOST_WINAPI_DETAIL_EXTENSION
90 #endif
91 
92 // MinGW64 gcc 4.8.2 fails to compile function declarations with boost::winapi::VOID_ arguments even though
93 // the typedef expands to void. In Windows SDK, VOID is a macro which unfolds to void. We use our own macro in such cases.
94 #define BOOST_WINAPI_DETAIL_VOID void
95 
96 namespace boost {
97 namespace winapi {
98 #if defined(BOOST_USE_WINDOWS_H)
99 
100 typedef ::BOOL BOOL_;
101 typedef ::PBOOL PBOOL_;
102 typedef ::LPBOOL LPBOOL_;
103 typedef ::BOOLEAN BOOLEAN_;
104 typedef ::PBOOLEAN PBOOLEAN_;
105 typedef ::BYTE BYTE_;
106 typedef ::PBYTE PBYTE_;
107 typedef ::LPBYTE LPBYTE_;
108 typedef ::UCHAR UCHAR_;
109 typedef ::PUCHAR PUCHAR_;
110 typedef ::WORD WORD_;
111 typedef ::PWORD PWORD_;
112 typedef ::LPWORD LPWORD_;
113 typedef ::DWORD DWORD_;
114 typedef ::PDWORD PDWORD_;
115 typedef ::LPDWORD LPDWORD_;
116 typedef ::HANDLE HANDLE_;
117 typedef ::PHANDLE PHANDLE_;
118 typedef ::SHORT SHORT_;
119 typedef ::PSHORT PSHORT_;
120 typedef ::USHORT USHORT_;
121 typedef ::PUSHORT PUSHORT_;
122 typedef ::INT INT_;
123 typedef ::PINT PINT_;
124 typedef ::LPINT LPINT_;
125 typedef ::UINT UINT_;
126 typedef ::PUINT PUINT_;
127 typedef ::LONG LONG_;
128 typedef ::PLONG PLONG_;
129 typedef ::LPLONG LPLONG_;
130 typedef ::ULONG ULONG_;
131 typedef ::PULONG PULONG_;
132 typedef ::LONGLONG ULONG64_;
133 typedef ::ULONGLONG PULONG64_;
134 typedef ::LONGLONG LONGLONG_;
135 typedef ::ULONGLONG ULONGLONG_;
136 typedef ::INT_PTR INT_PTR_;
137 typedef ::UINT_PTR UINT_PTR_;
138 typedef ::LONG_PTR LONG_PTR_;
139 typedef ::ULONG_PTR ULONG_PTR_;
140 typedef ::DWORD_PTR DWORD_PTR_;
141 typedef ::PDWORD_PTR PDWORD_PTR_;
142 typedef ::SIZE_T SIZE_T_;
143 typedef ::PSIZE_T PSIZE_T_;
144 typedef ::SSIZE_T SSIZE_T_;
145 typedef ::PSSIZE_T PSSIZE_T_;
146 typedef VOID VOID_; // VOID is a macro
147 typedef ::PVOID PVOID_;
148 typedef ::LPVOID LPVOID_;
149 typedef ::LPCVOID LPCVOID_;
150 typedef ::CHAR CHAR_;
151 typedef ::LPSTR LPSTR_;
152 typedef ::LPCSTR LPCSTR_;
153 typedef ::WCHAR WCHAR_;
154 typedef ::LPWSTR LPWSTR_;
155 typedef ::LPCWSTR LPCWSTR_;
156 
157 #else // defined( BOOST_USE_WINDOWS_H )
158 
159 #if defined(__GNUC__) && !(defined(__INTEL_COMPILER) || defined(__ICL) || defined(__ICC) || defined(__ECC)) \
160     && (__GNUC__ * 100 + __GNUC_MINOR__) >= 406
161 #pragma GCC diagnostic push
162 // ISO C++ 1998 does not support 'long long'
163 #pragma GCC diagnostic ignored "-Wlong-long"
164 #endif
165 
166 typedef int BOOL_;
167 typedef BOOL_* PBOOL_;
168 typedef BOOL_* LPBOOL_;
169 typedef unsigned char BYTE_;
170 typedef BYTE_* PBYTE_;
171 typedef BYTE_* LPBYTE_;
172 typedef unsigned char UCHAR_;
173 typedef UCHAR_* PUCHAR_;
174 typedef BYTE_ BOOLEAN_;
175 typedef BOOLEAN_* PBOOLEAN_;
176 typedef unsigned short WORD_;
177 typedef WORD_* PWORD_;
178 typedef WORD_* LPWORD_;
179 #if !defined(__LP64__)
180 typedef unsigned long DWORD_;
181 #else
182 typedef unsigned int DWORD_;
183 #endif
184 typedef DWORD_* PDWORD_;
185 typedef DWORD_* LPDWORD_;
186 typedef void* HANDLE_;
187 typedef void** PHANDLE_;
188 
189 typedef short SHORT_;
190 typedef SHORT_* PSHORT_;
191 typedef unsigned short USHORT_;
192 typedef USHORT_* PUSHORT_;
193 typedef int INT_;
194 typedef INT_* PINT_;
195 typedef INT_* LPINT_;
196 typedef unsigned int UINT_;
197 typedef UINT_* PUINT_;
198 #if !defined(__LP64__)
199 typedef long LONG_;
200 typedef unsigned long ULONG_;
201 #else
202 typedef int LONG_;
203 typedef unsigned int ULONG_;
204 #endif
205 typedef LONG_* PLONG_;
206 typedef LONG_* LPLONG_;
207 typedef ULONG_* PULONG_;
208 #if defined(BOOST_HAS_MS_INT64)
209 BOOST_WINAPI_DETAIL_EXTENSION typedef __int64 LONGLONG_;
210 BOOST_WINAPI_DETAIL_EXTENSION typedef unsigned __int64 ULONGLONG_;
211 #else
212 BOOST_WINAPI_DETAIL_EXTENSION typedef long long LONGLONG_;
213 BOOST_WINAPI_DETAIL_EXTENSION typedef unsigned long long ULONGLONG_;
214 #endif
215 typedef LONGLONG_ LONG64_, *PLONG64_;
216 typedef ULONGLONG_ ULONG64_, *PULONG64_;
217 
218 #if defined(_WIN64)
219 typedef LONGLONG_ INT_PTR_;
220 typedef ULONGLONG_ UINT_PTR_;
221 typedef LONGLONG_ LONG_PTR_;
222 typedef ULONGLONG_ ULONG_PTR_;
223 #else
224 typedef int INT_PTR_;
225 typedef unsigned int UINT_PTR_;
226 typedef long LONG_PTR_;
227 typedef unsigned long ULONG_PTR_;
228 #endif
229 
230 typedef ULONG_PTR_ DWORD_PTR_, *PDWORD_PTR_;
231 typedef ULONG_PTR_ SIZE_T_, *PSIZE_T_;
232 typedef LONG_PTR_ SSIZE_T_, *PSSIZE_T_;
233 
234 typedef void VOID_;
235 typedef void *PVOID_;
236 typedef void *LPVOID_;
237 typedef const void *LPCVOID_;
238 
239 typedef char CHAR_;
240 typedef CHAR_ *LPSTR_;
241 typedef const CHAR_ *LPCSTR_;
242 
243 typedef wchar_t WCHAR_;
244 typedef WCHAR_ *LPWSTR_;
245 typedef const WCHAR_ *LPCWSTR_;
246 
247 #if defined(__GNUC__) && !(defined(__INTEL_COMPILER) || defined(__ICL) || defined(__ICC) || defined(__ECC)) \
248     && (__GNUC__ * 100 + __GNUC_MINOR__) >= 406
249 #pragma GCC diagnostic pop
250 #endif
251 
252 #endif // defined( BOOST_USE_WINDOWS_H )
253 
254 // ::NTSTATUS is defined in ntdef.h, which is not included by windows.h by default, so alwaus use LONG_
255 typedef LONG_ NTSTATUS_;
256 typedef NTSTATUS_ *PNTSTATUS_;
257 
258 typedef ::HMODULE HMODULE_;
259 
260 #ifdef BOOST_MSVC
261 #pragma warning(push)
262 #pragma warning(disable:4201) // nonstandard extension used : nameless struct/union
263 #endif
264 
265 typedef union BOOST_MAY_ALIAS _LARGE_INTEGER {
266     BOOST_WINAPI_DETAIL_EXTENSION struct {
267         DWORD_ LowPart;
268         LONG_ HighPart;
269     };
270     struct {
271         DWORD_ LowPart;
272         LONG_ HighPart;
273     } u;
274     LONGLONG_ QuadPart;
275 } LARGE_INTEGER_, *PLARGE_INTEGER_;
276 
277 #ifdef BOOST_MSVC
278 #pragma warning(pop)
279 #endif
280 
281 typedef struct BOOST_MAY_ALIAS _SECURITY_ATTRIBUTES {
282     DWORD_  nLength;
283     LPVOID_ lpSecurityDescriptor;
284     BOOL_   bInheritHandle;
285 } SECURITY_ATTRIBUTES_, *PSECURITY_ATTRIBUTES_, *LPSECURITY_ATTRIBUTES_;
286 
287 }
288 }
289 
290 #endif // BOOST_WINAPI_BASIC_TYPES_HPP_INCLUDED_
291