1 // Copyright 2014 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 // This file contains defines and typedefs that allow popular Windows types to
6 // be used without the overhead of including windows.h.
7
8 #ifndef BASE_WIN_WINDOWS_TYPES_H_
9 #define BASE_WIN_WINDOWS_TYPES_H_
10
11 // Needed for function prototypes.
12 #include <concurrencysal.h>
13 #include <sal.h>
14 #include <specstrings.h>
15
16 #include "base/win/win_handle_types.h"
17
18 #ifdef __cplusplus
19 extern "C" {
20 #endif
21
22 // typedef and define the most commonly used Windows integer types.
23
24 typedef unsigned long DWORD; // NOLINT(runtime/int)
25 typedef long LONG; // NOLINT(runtime/int)
26 typedef __int64 LONGLONG;
27 typedef unsigned __int64 ULONGLONG;
28
29 #define VOID void
30 typedef char CHAR;
31 typedef short SHORT; // NOLINT(runtime/int)
32 typedef long LONG; // NOLINT(runtime/int)
33 typedef int INT;
34 typedef unsigned int UINT;
35 typedef unsigned int* PUINT;
36 typedef unsigned __int64 UINT64;
37 typedef void* LPVOID;
38 typedef void* PVOID;
39 typedef void* HANDLE;
40 typedef int BOOL;
41 typedef unsigned char BYTE;
42 typedef BYTE BOOLEAN;
43 typedef DWORD ULONG;
44 typedef unsigned short WORD; // NOLINT(runtime/int)
45 typedef WORD UWORD;
46 typedef WORD ATOM;
47
48 #if defined(_WIN64)
49 typedef __int64 INT_PTR, *PINT_PTR;
50 typedef unsigned __int64 UINT_PTR, *PUINT_PTR;
51
52 typedef __int64 LONG_PTR, *PLONG_PTR;
53 typedef unsigned __int64 ULONG_PTR, *PULONG_PTR;
54 #else
55 typedef __w64 int INT_PTR, *PINT_PTR;
56 typedef __w64 unsigned int UINT_PTR, *PUINT_PTR;
57
58 typedef __w64 long LONG_PTR, *PLONG_PTR; // NOLINT(runtime/int)
59 typedef __w64 unsigned long ULONG_PTR, *PULONG_PTR; // NOLINT(runtime/int)
60 #endif
61
62 typedef UINT_PTR WPARAM;
63 typedef LONG_PTR LPARAM;
64 typedef LONG_PTR LRESULT;
65 #define LRESULT LONG_PTR
66 typedef _Return_type_success_(return >= 0) long HRESULT; // NOLINT(runtime/int)
67
68 typedef ULONG_PTR SIZE_T, *PSIZE_T;
69 typedef LONG_PTR SSIZE_T, *PSSIZE_T;
70
71 typedef DWORD ACCESS_MASK;
72 typedef ACCESS_MASK REGSAM;
73
74 typedef LONG NTSTATUS;
75
76 // As defined in guiddef.h.
77 #ifndef _REFGUID_DEFINED
78 #define _REFGUID_DEFINED
79 #define REFGUID const GUID&
80 #endif
81
82 typedef LPVOID HINTERNET;
83 typedef HICON HCURSOR;
84 typedef HINSTANCE HMODULE;
85 typedef PVOID LSA_HANDLE;
86 typedef PVOID HDEVINFO;
87
88 // Forward declare some Windows struct/typedef sets.
89
90 typedef struct _OVERLAPPED OVERLAPPED;
91 typedef struct tagMSG MSG, *PMSG, *NPMSG, *LPMSG;
92 typedef struct tagTOUCHINPUT TOUCHINPUT;
93 typedef struct tagPOINTER_INFO POINTER_INFO;
94
95 typedef struct _RTL_SRWLOCK RTL_SRWLOCK;
96 typedef RTL_SRWLOCK SRWLOCK, *PSRWLOCK;
97
98 typedef struct _GUID GUID;
99 typedef GUID CLSID;
100 typedef GUID IID;
101
102 typedef struct tagLOGFONTW LOGFONTW, *PLOGFONTW, *NPLOGFONTW, *LPLOGFONTW;
103 typedef LOGFONTW LOGFONT;
104
105 typedef struct _FILETIME FILETIME;
106
107 typedef struct tagMENUITEMINFOW MENUITEMINFOW, MENUITEMINFO;
108
109 typedef struct tagNMHDR NMHDR;
110
111 typedef struct _SP_DEVINFO_DATA SP_DEVINFO_DATA;
112
113 typedef PVOID PSID;
114 typedef PVOID PSECURITY_DESCRIPTOR;
115 typedef DWORD SECURITY_INFORMATION;
116
117 typedef HANDLE HLOCAL;
118
119 typedef /* [wire_marshal] */ WORD CLIPFORMAT;
120 typedef struct tagDVTARGETDEVICE DVTARGETDEVICE;
121
122 typedef struct tagFORMATETC FORMATETC;
123
124 // Use WIN32_FIND_DATAW when you just need a forward declaration. Use
125 // CHROME_WIN32_FIND_DATA when you need a concrete declaration to reserve
126 // space.
127 typedef struct _WIN32_FIND_DATAW WIN32_FIND_DATAW;
128 typedef WIN32_FIND_DATAW WIN32_FIND_DATA;
129
130 typedef UINT_PTR SOCKET;
131 typedef struct _PROCESS_INFORMATION PROCESS_INFORMATION;
132 typedef struct _SECURITY_CAPABILITIES SECURITY_CAPABILITIES;
133 typedef struct _ACL ACL;
134 typedef struct _SECURITY_DESCRIPTOR SECURITY_DESCRIPTOR;
135 typedef struct _GENERIC_MAPPING GENERIC_MAPPING;
136
137 // Declare Chrome versions of some Windows structures. These are needed for
138 // when we need a concrete type but don't want to pull in Windows.h. We can't
139 // declare the Windows types so we declare our types and cast to the Windows
140 // types in a few places. The sizes must match the Windows types so we verify
141 // that with static asserts in win_includes_unittest.cc.
142 // ChromeToWindowsType functions are provided for pointer conversions.
143
144 struct CHROME_SRWLOCK {
145 PVOID Ptr;
146 };
147
148 struct CHROME_CONDITION_VARIABLE {
149 PVOID Ptr;
150 };
151
152 struct CHROME_LUID {
153 DWORD LowPart;
154 LONG HighPart;
155
156 bool operator==(CHROME_LUID const& that) const {
157 return this->LowPart == that.LowPart && this->HighPart == that.HighPart;
158 }
159
160 bool operator!=(CHROME_LUID const& that) const { return !(*this == that); }
161 };
162
163 // _WIN32_FIND_DATAW is 592 bytes and the largest built-in type in it is a
164 // DWORD. The buffer declaration guarantees the correct size and alignment.
165 struct CHROME_WIN32_FIND_DATA {
166 DWORD buffer[592 / sizeof(DWORD)];
167 };
168
169 struct CHROME_FORMATETC {
170 CLIPFORMAT cfFormat;
171 /* [unique] */ DVTARGETDEVICE* ptd;
172 DWORD dwAspect;
173 LONG lindex;
174 DWORD tymed;
175 };
176
177 struct CHROME_POINT {
178 LONG x;
179 LONG y;
180 };
181
182 struct CHROME_MSG {
183 HWND hwnd;
184 UINT message;
185 WPARAM wParam;
186 LPARAM lParam;
187 DWORD time;
188 CHROME_POINT pt;
189 };
190
191 // Define some commonly used Windows constants. Note that the layout of these
192 // macros - including internal spacing - must be 100% consistent with windows.h.
193
194 // clang-format off
195
196 #ifndef INVALID_HANDLE_VALUE
197 // Work around there being two slightly different definitions in the SDK.
198 #define INVALID_HANDLE_VALUE ((HANDLE)(LONG_PTR)-1)
199 #endif
200 #define TLS_OUT_OF_INDEXES ((DWORD)0xFFFFFFFF)
201 #define HTNOWHERE 0
202 #define MAX_PATH 260
203 #define CS_GLOBALCLASS 0x4000
204
205 #define ERROR_SUCCESS 0L
206 #define ERROR_FILE_NOT_FOUND 2L
207 #define ERROR_ACCESS_DENIED 5L
208 #define ERROR_INVALID_HANDLE 6L
209 #define ERROR_SHARING_VIOLATION 32L
210 #define ERROR_LOCK_VIOLATION 33L
211 #define ERROR_MORE_DATA 234L
212 #define REG_BINARY ( 3ul )
213 #define REG_NONE ( 0ul )
214
215 #ifndef STATUS_PENDING
216 // Allow people to include ntstatus.h
217 #define STATUS_PENDING ((DWORD )0x00000103L)
218 #endif // STATUS_PENDING
219 #define STILL_ACTIVE STATUS_PENDING
220 #define SUCCEEDED(hr) (((HRESULT)(hr)) >= 0)
221 #define FAILED(hr) (((HRESULT)(hr)) < 0)
222
223 #define HKEY_CLASSES_ROOT (( HKEY ) (ULONG_PTR)((LONG)0x80000000) )
224 #define HKEY_LOCAL_MACHINE (( HKEY ) (ULONG_PTR)((LONG)0x80000002) )
225 #define HKEY_CURRENT_USER (( HKEY ) (ULONG_PTR)((LONG)0x80000001) )
226 #define KEY_QUERY_VALUE (0x0001)
227 #define KEY_SET_VALUE (0x0002)
228 #define KEY_CREATE_SUB_KEY (0x0004)
229 #define KEY_ENUMERATE_SUB_KEYS (0x0008)
230 #define KEY_NOTIFY (0x0010)
231 #define KEY_CREATE_LINK (0x0020)
232 #define KEY_WOW64_32KEY (0x0200)
233 #define KEY_WOW64_64KEY (0x0100)
234 #define KEY_WOW64_RES (0x0300)
235
236 #define PROCESS_QUERY_INFORMATION (0x0400)
237 #define READ_CONTROL (0x00020000L)
238 #define SYNCHRONIZE (0x00100000L)
239
240 #define STANDARD_RIGHTS_READ (READ_CONTROL)
241 #define STANDARD_RIGHTS_WRITE (READ_CONTROL)
242 #define STANDARD_RIGHTS_ALL (0x001F0000L)
243
244 #define KEY_READ ((STANDARD_RIGHTS_READ |\
245 KEY_QUERY_VALUE |\
246 KEY_ENUMERATE_SUB_KEYS |\
247 KEY_NOTIFY) \
248 & \
249 (~SYNCHRONIZE))
250
251
252 #define KEY_WRITE ((STANDARD_RIGHTS_WRITE |\
253 KEY_SET_VALUE |\
254 KEY_CREATE_SUB_KEY) \
255 & \
256 (~SYNCHRONIZE))
257
258 #define KEY_ALL_ACCESS ((STANDARD_RIGHTS_ALL |\
259 KEY_QUERY_VALUE |\
260 KEY_SET_VALUE |\
261 KEY_CREATE_SUB_KEY |\
262 KEY_ENUMERATE_SUB_KEYS |\
263 KEY_NOTIFY |\
264 KEY_CREATE_LINK) \
265 & \
266 (~SYNCHRONIZE))
267
268 // The trailing white-spaces after this macro are required, for compatibility
269 // with the definition in winnt.h.
270 // clang-format off
271 #define RTL_SRWLOCK_INIT {0} // NOLINT
272 // clang-format on
273 #define SRWLOCK_INIT RTL_SRWLOCK_INIT
274
275 // clang-format on
276
277 // Define some macros needed when prototyping Windows functions.
278
279 #define DECLSPEC_IMPORT __declspec(dllimport)
280 #define WINBASEAPI DECLSPEC_IMPORT
281 #define WINUSERAPI DECLSPEC_IMPORT
282 #define WINAPI __stdcall
283 #define APIENTRY WINAPI
284 #define CALLBACK __stdcall
285
286 // Needed for LockImpl.
287 WINBASEAPI _Releases_exclusive_lock_(*SRWLock) VOID WINAPI
288 ReleaseSRWLockExclusive(_Inout_ PSRWLOCK SRWLock);
289 WINBASEAPI BOOLEAN WINAPI TryAcquireSRWLockExclusive(_Inout_ PSRWLOCK SRWLock);
290
291 // Needed to support protobuf's GetMessage macro magic.
292 WINUSERAPI BOOL WINAPI GetMessageW(_Out_ LPMSG lpMsg,
293 _In_opt_ HWND hWnd,
294 _In_ UINT wMsgFilterMin,
295 _In_ UINT wMsgFilterMax);
296
297 // Needed for thread_local_storage.h
298 WINBASEAPI LPVOID WINAPI TlsGetValue(_In_ DWORD dwTlsIndex);
299
300 WINBASEAPI BOOL WINAPI TlsSetValue(_In_ DWORD dwTlsIndex,
301 _In_opt_ LPVOID lpTlsValue);
302
303 // Needed for scoped_handle.h
304 WINBASEAPI _Check_return_ _Post_equals_last_error_ DWORD WINAPI
305 GetLastError(VOID);
306
307 WINBASEAPI VOID WINAPI SetLastError(_In_ DWORD dwErrCode);
308
309 WINBASEAPI BOOL WINAPI TerminateProcess(_In_ HANDLE hProcess,
310 _In_ UINT uExitCode);
311
312 // Support for a deleter for LocalAlloc memory.
313 WINBASEAPI HLOCAL WINAPI LocalFree(_In_ HLOCAL hMem);
314
315 #ifdef __cplusplus
316 }
317
318 // Helper functions for converting between Chrome and Windows native versions of
319 // type pointers.
320 // Overloaded functions must be declared outside of the extern "C" block.
321
ChromeToWindowsType(CHROME_WIN32_FIND_DATA * p)322 inline WIN32_FIND_DATA* ChromeToWindowsType(CHROME_WIN32_FIND_DATA* p) {
323 return reinterpret_cast<WIN32_FIND_DATA*>(p);
324 }
325
ChromeToWindowsType(const CHROME_WIN32_FIND_DATA * p)326 inline const WIN32_FIND_DATA* ChromeToWindowsType(
327 const CHROME_WIN32_FIND_DATA* p) {
328 return reinterpret_cast<const WIN32_FIND_DATA*>(p);
329 }
330
ChromeToWindowsType(CHROME_FORMATETC * p)331 inline FORMATETC* ChromeToWindowsType(CHROME_FORMATETC* p) {
332 return reinterpret_cast<FORMATETC*>(p);
333 }
334
ChromeToWindowsType(const CHROME_FORMATETC * p)335 inline const FORMATETC* ChromeToWindowsType(const CHROME_FORMATETC* p) {
336 return reinterpret_cast<const FORMATETC*>(p);
337 }
338
ChromeToWindowsType(CHROME_MSG * p)339 inline MSG* ChromeToWindowsType(CHROME_MSG* p) {
340 return reinterpret_cast<MSG*>(p);
341 }
342
343 #endif
344
345 // These macros are all defined by windows.h and are also used as the names of
346 // functions in the Chromium code base. Having these macros consistently defined
347 // or undefined can be critical to avoid mismatches between the functions
348 // defined and functions called. Macros need to be added to this list in those
349 // cases where it is easier to have the macro defined everywhere rather than
350 // undefined everywhere. As windows.h is removed from more source files we may
351 // be able to shorten this list.
352
353 #define CopyFile CopyFileW
354 #define CreateDirectory CreateDirectoryW
355 #define CreateFile CreateFileW
356 #define CreateService CreateServiceW
357 #define DeleteFile DeleteFileW
358 #define DispatchMessage DispatchMessageW
359 #define DrawText DrawTextW
360 #define FindFirstFile FindFirstFileW
361 #define FindNextFile FindNextFileW
362 #define GetClassName GetClassNameW
363 #define GetCurrentDirectory GetCurrentDirectoryW
364 #define GetCurrentTime() GetTickCount()
365 #define GetFileAttributes GetFileAttributesW
366 #define GetMessage GetMessageW
367 #define LoadIcon LoadIconW
368 #define PostMessage PostMessageW
369 #define ReplaceFile ReplaceFileW
370 #define SendMessage SendMessageW
371 #define SendMessageCallback SendMessageCallbackW
372 #define SetCurrentDirectory SetCurrentDirectoryW
373
374 #endif // BASE_WIN_WINDOWS_TYPES_H_
375