Remove obsolete platforms ifdefs from PAL (#8971)
[platform/upstream/coreclr.git] / src / pal / inc / rt / palrt.h
1 // Licensed to the .NET Foundation under one or more agreements.
2 // The .NET Foundation licenses this file to you under the MIT license.
3 // See the LICENSE file in the project root for more information.
4 //
5
6 //
7 // ===========================================================================
8 // File: palrt.h
9 // 
10 // =========================================================================== 
11
12 /*++
13
14
15 Abstract:
16
17     Rotor runtime functions.  These are functions which are ordinarily
18     implemented as part of the Win32 API set, but for Rotor, are
19     implemented as a runtime library on top of the PAL.
20
21 Author:
22
23      
24
25 Revision History:
26
27 --*/
28
29 #ifndef __PALRT_H__
30 #define __PALRT_H__
31
32 /******************* HRESULTs *********************************************/
33
34 #ifdef RC_INVOKED
35 #define _HRESULT_TYPEDEF_(_sc) _sc
36 #else // RC_INVOKED
37 #define _HRESULT_TYPEDEF_(_sc) ((HRESULT)_sc)
38 #endif // RC_INVOKED
39
40 #define S_OK                             _HRESULT_TYPEDEF_(0x00000000L)
41 #define S_FALSE                          _HRESULT_TYPEDEF_(0x00000001L)
42
43 #define E_NOTIMPL                        _HRESULT_TYPEDEF_(0x80004001L)
44 #define E_NOINTERFACE                    _HRESULT_TYPEDEF_(0x80004002L)
45 #define E_UNEXPECTED                     _HRESULT_TYPEDEF_(0x8000FFFFL)
46 #define E_OUTOFMEMORY                    _HRESULT_TYPEDEF_(0x8007000EL)
47 #define E_INVALIDARG                     _HRESULT_TYPEDEF_(0x80070057L)
48 #define E_POINTER                        _HRESULT_TYPEDEF_(0x80004003L)
49 #define E_HANDLE                         _HRESULT_TYPEDEF_(0x80070006L)
50 #define E_ABORT                          _HRESULT_TYPEDEF_(0x80004004L)
51 #define E_FAIL                           _HRESULT_TYPEDEF_(0x80004005L)
52 #define E_ACCESSDENIED                   _HRESULT_TYPEDEF_(0x80070005L)
53 #define E_PENDING                        _HRESULT_TYPEDEF_(0x8000000AL)
54
55 #define DISP_E_PARAMNOTFOUND             _HRESULT_TYPEDEF_(0x80020004L)
56 #define DISP_E_TYPEMISMATCH              _HRESULT_TYPEDEF_(0x80020005L)
57 #define DISP_E_BADVARTYPE                _HRESULT_TYPEDEF_(0x80020008L)
58 #define DISP_E_OVERFLOW                  _HRESULT_TYPEDEF_(0x8002000AL)
59 #define DISP_E_DIVBYZERO                 _HRESULT_TYPEDEF_(0x80020012L)
60
61 #define CLASS_E_CLASSNOTAVAILABLE        _HRESULT_TYPEDEF_(0x80040111L)
62 #define CLASS_E_NOAGGREGATION            _HRESULT_TYPEDEF_(0x80040110L)
63
64 #define CO_E_CLASSSTRING                 _HRESULT_TYPEDEF_(0x800401F3L)
65
66 #define URL_E_INVALID_SYNTAX             _HRESULT_TYPEDEF_(0x80041001L)
67 #define MK_E_SYNTAX                      _HRESULT_TYPEDEF_(0x800401E4L)
68
69 #define STG_E_INVALIDFUNCTION            _HRESULT_TYPEDEF_(0x80030001L)
70 #define STG_E_FILENOTFOUND               _HRESULT_TYPEDEF_(0x80030002L)
71 #define STG_E_PATHNOTFOUND               _HRESULT_TYPEDEF_(0x80030003L)
72 #define STG_E_WRITEFAULT                 _HRESULT_TYPEDEF_(0x8003001DL)
73 #define STG_E_FILEALREADYEXISTS          _HRESULT_TYPEDEF_(0x80030050L)
74 #define STG_E_ABNORMALAPIEXIT            _HRESULT_TYPEDEF_(0x800300FAL)
75
76 #define NTE_BAD_UID                      _HRESULT_TYPEDEF_(0x80090001L)
77 #define NTE_BAD_HASH                     _HRESULT_TYPEDEF_(0x80090002L)
78 #define NTE_BAD_KEY                      _HRESULT_TYPEDEF_(0x80090003L)
79 #define NTE_BAD_LEN                      _HRESULT_TYPEDEF_(0x80090004L)
80 #define NTE_BAD_DATA                     _HRESULT_TYPEDEF_(0x80090005L)
81 #define NTE_BAD_SIGNATURE                _HRESULT_TYPEDEF_(0x80090006L)
82 #define NTE_BAD_VER                      _HRESULT_TYPEDEF_(0x80090007L)
83 #define NTE_BAD_ALGID                    _HRESULT_TYPEDEF_(0x80090008L)
84 #define NTE_BAD_FLAGS                    _HRESULT_TYPEDEF_(0x80090009L)
85 #define NTE_BAD_TYPE                     _HRESULT_TYPEDEF_(0x8009000AL)
86 #define NTE_BAD_KEY_STATE                _HRESULT_TYPEDEF_(0x8009000BL)
87 #define NTE_BAD_HASH_STATE               _HRESULT_TYPEDEF_(0x8009000CL)
88 #define NTE_NO_KEY                       _HRESULT_TYPEDEF_(0x8009000DL)
89 #define NTE_NO_MEMORY                    _HRESULT_TYPEDEF_(0x8009000EL)
90 #define NTE_SIGNATURE_FILE_BAD           _HRESULT_TYPEDEF_(0x8009001CL)
91 #define NTE_FAIL                         _HRESULT_TYPEDEF_(0x80090020L)
92
93 #define CRYPT_E_HASH_VALUE               _HRESULT_TYPEDEF_(0x80091007L)
94
95 #define TYPE_E_SIZETOOBIG                _HRESULT_TYPEDEF_(0x800288C5L)
96 #define TYPE_E_DUPLICATEID               _HRESULT_TYPEDEF_(0x800288C6L)
97
98 #define STD_CTL_SCODE(n) MAKE_SCODE(SEVERITY_ERROR, FACILITY_CONTROL, n)
99 #define CTL_E_OVERFLOW                  STD_CTL_SCODE(6)
100 #define CTL_E_OUTOFMEMORY               STD_CTL_SCODE(7)
101 #define CTL_E_DIVISIONBYZERO            STD_CTL_SCODE(11)
102 #define CTL_E_OUTOFSTACKSPACE           STD_CTL_SCODE(28)
103 #define CTL_E_FILENOTFOUND              STD_CTL_SCODE(53)
104 #define CTL_E_DEVICEIOERROR             STD_CTL_SCODE(57)
105 #define CTL_E_PERMISSIONDENIED          STD_CTL_SCODE(70)
106 #define CTL_E_PATHFILEACCESSERROR       STD_CTL_SCODE(75)
107 #define CTL_E_PATHNOTFOUND              STD_CTL_SCODE(76)
108
109 #define INET_E_CANNOT_CONNECT            _HRESULT_TYPEDEF_(0x800C0004L)
110 #define INET_E_RESOURCE_NOT_FOUND        _HRESULT_TYPEDEF_(0x800C0005L)
111 #define INET_E_OBJECT_NOT_FOUND          _HRESULT_TYPEDEF_(0x800C0006L)
112 #define INET_E_DATA_NOT_AVAILABLE        _HRESULT_TYPEDEF_(0x800C0007L)
113 #define INET_E_DOWNLOAD_FAILURE          _HRESULT_TYPEDEF_(0x800C0008L)
114 #define INET_E_CONNECTION_TIMEOUT        _HRESULT_TYPEDEF_(0x800C000BL)
115 #define INET_E_UNKNOWN_PROTOCOL          _HRESULT_TYPEDEF_(0x800C000DL)
116
117 #define DBG_PRINTEXCEPTION_C             _HRESULT_TYPEDEF_(0x40010006L)
118
119 /********************** errorrep.h ****************************************/
120
121 typedef enum tagEFaultRepRetVal
122 {
123     frrvOk = 0,
124     frrvOkManifest,
125     frrvOkQueued,
126     frrvErr,
127     frrvErrNoDW,
128     frrvErrTimeout,
129     frrvLaunchDebugger,
130     frrvOkHeadless,
131     frrvErrAnotherInstance
132 } EFaultRepRetVal;
133
134 /**************************************************************************/
135
136 #ifndef RC_INVOKED
137
138 #include "pal.h"
139
140 #ifndef PAL_STDCPP_COMPAT
141 #ifdef __cplusplus
142 #ifndef __PLACEMENT_NEW_INLINE
143 #define __PLACEMENT_NEW_INLINE
144 inline void *__cdecl operator new(size_t, void *_P)
145 {
146     return (_P);
147 }
148 #endif // __PLACEMENT_NEW_INLINE
149 #endif // __cplusplus
150 #endif // !PAL_STDCPP_COMPAT
151
152 #include <pal_assert.h>
153
154 #if defined(_DEBUG)
155 #define ROTOR_PAL_CTOR_TEST_BODY(TESTNAME)                              \
156     class TESTNAME ## _CTOR_TEST {                                      \
157     public:                                                             \
158         class HelperClass {                                             \
159         public:                                                         \
160             HelperClass(const char *String) {                           \
161                 _ASSERTE (m_s == NULL);                                 \
162                 m_s = String;                                           \
163             }                                                           \
164                                                                         \
165             void Validate (const char *String) {                        \
166                 _ASSERTE (m_s);                                         \
167                 _ASSERTE (m_s == String);                               \
168                 _ASSERTE (!strncmp (                                    \
169                               m_s,                                      \
170                               String,                                   \
171                               1000));                                   \
172             }                                                           \
173                                                                         \
174         private:                                                        \
175             const char *m_s;                                            \
176         };                                                              \
177                                                                         \
178         TESTNAME ## _CTOR_TEST() {                                      \
179             _ASSERTE (m_This == NULL);                                  \
180             m_This = this;                                              \
181         }                                                               \
182                                                                         \
183         void Validate () {                                              \
184             _ASSERTE (m_This == this);                                  \
185             m_String.Validate(#TESTNAME "_CTOR_TEST");                  \
186         }                                                               \
187                                                                         \
188     private:                                                            \
189         void              *m_This;                                      \
190         static HelperClass m_String;                                    \
191     };                                                                  \
192                                                                         \
193     static TESTNAME ## _CTOR_TEST                                       \
194       g_ ## TESTNAME ## _CTOR_TEST;                                     \
195     TESTNAME ## _CTOR_TEST::HelperClass                                 \
196       TESTNAME ## _CTOR_TEST::m_String(#TESTNAME "_CTOR_TEST");
197
198 #define ROTOR_PAL_CTOR_TEST_RUN(TESTNAME)                               \
199     g_ ## TESTNAME ##_CTOR_TEST.Validate()
200
201 #else // DEBUG
202
203 #define ROTOR_PAL_CTOR_TEST_BODY(TESTNAME) 
204 #define ROTOR_PAL_CTOR_TEST_RUN(TESTNAME)  do {} while (0)
205
206 #endif // DEBUG
207
208 #define NTAPI       __stdcall
209 #define WINAPI      __stdcall
210 #define CALLBACK    __stdcall
211 #define NTSYSAPI
212
213 #define _WINNT_
214
215 // C++ standard, 18.1.5 - offsetof requires a POD (plain old data) struct or
216 // union. Since offsetof is a macro, gcc doesn't actually check for improper
217 // use of offsetof, it keys off of the -> from NULL (which is also invalid for
218 // non-POD types by 18.1.5)
219 //
220 // As we have numerous examples of this behavior in our codebase,
221 // making an offsetof which doesn't use 0.
222
223 // PAL_safe_offsetof is a version of offsetof that protects against an
224 // overridden operator&
225
226 #if defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 5 || __GNUC__ > 3)
227 #define FIELD_OFFSET(type, field) __builtin_offsetof(type, field)
228 #ifndef offsetof
229 #define offsetof(type, field) __builtin_offsetof(type, field)
230 #endif
231 #define PAL_safe_offsetof(type, field) __builtin_offsetof(type, field)
232 #else
233 #define FIELD_OFFSET(type, field) (((LONG)(LONG_PTR)&(((type *)64)->field)) - 64)
234 #ifndef offsetof
235 #define offsetof(s,m)          ((size_t)((ptrdiff_t)&(((s *)64)->m)) - 64)
236 #endif
237 #define PAL_safe_offsetof(s,m) ((size_t)((ptrdiff_t)&(char&)(((s *)64)->m))-64)
238 #endif
239
240 #define CONTAINING_RECORD(address, type, field) \
241     ((type *)((LONG_PTR)(address) - FIELD_OFFSET(type, field)))
242
243 #define ARGUMENT_PRESENT(ArgumentPointer)    (\
244     (CHAR *)(ArgumentPointer) != (CHAR *)(NULL) )
245
246 #if defined(_WIN64)
247 #define MAX_NATURAL_ALIGNMENT sizeof(ULONGLONG)
248 #else
249 #define MAX_NATURAL_ALIGNMENT sizeof(ULONG)
250 #endif
251
252 #define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name
253
254 #ifndef COM_NO_WINDOWS_H
255 #define COM_NO_WINDOWS_H
256 #endif
257
258 #define interface struct
259
260 #define STDMETHODCALLTYPE    __stdcall
261 #define STDMETHODVCALLTYPE   __cdecl
262
263 #define STDAPICALLTYPE       __stdcall
264 #define STDAPIVCALLTYPE      __cdecl
265
266 #define STDMETHODIMP         HRESULT STDMETHODCALLTYPE
267 #define STDMETHODIMP_(type)  type STDMETHODCALLTYPE
268
269 #define STDMETHODIMPV        HRESULT STDMETHODVCALLTYPE
270 #define STDMETHODIMPV_(type) type STDMETHODVCALLTYPE
271
272 #define STDMETHOD(method)       virtual HRESULT STDMETHODCALLTYPE method
273 #define STDMETHOD_(type,method) virtual type STDMETHODCALLTYPE method
274
275 #define STDMETHODV(method)       virtual HRESULT STDMETHODVCALLTYPE method
276 #define STDMETHODV_(type,method) virtual type STDMETHODVCALLTYPE method
277
278 #define STDAPI               EXTERN_C HRESULT STDAPICALLTYPE
279 #define STDAPI_(type)        EXTERN_C type STDAPICALLTYPE
280
281 #define STDAPIV              EXTERN_C HRESULT STDAPIVCALLTYPE
282 #define STDAPIV_(type)       EXTERN_C type STDAPIVCALLTYPE
283
284 #define PURE                    = 0
285 #define THIS_
286 #define THIS                void
287
288 #ifndef _DECLSPEC_DEFINED_
289 #define _DECLSPEC_DEFINED_
290
291 #if  defined(_MSC_VER)
292 #define DECLSPEC_NOVTABLE   __declspec(novtable)
293 #define DECLSPEC_IMPORT     __declspec(dllimport)
294 #define DECLSPEC_SELECTANY  __declspec(selectany)
295 #elif defined(__GNUC__)
296 #define DECLSPEC_NOVTABLE
297 #define DECLSPEC_IMPORT     
298 #define DECLSPEC_SELECTANY  __attribute__((weak))
299 #else
300 #define DECLSPEC_NOVTABLE
301 #define DECLSPEC_IMPORT
302 #define DECLSPEC_SELECTANY
303 #endif
304
305 #endif // !_DECLSPEC_DEFINED_
306
307 #define DECLARE_INTERFACE(iface)    interface DECLSPEC_NOVTABLE iface
308 #define DECLARE_INTERFACE_(iface, baseiface)    interface DECLSPEC_NOVTABLE iface : public baseiface
309
310 #ifdef __cplusplus
311 #define REFGUID const GUID &
312 #else
313 #define REFGUID const GUID *
314 #endif
315
316 EXTERN_C const GUID GUID_NULL;
317
318 typedef GUID *LPGUID;
319 typedef const GUID FAR *LPCGUID;
320
321 #ifdef __cplusplus
322 extern "C++" {
323 #if !defined _SYS_GUID_OPERATOR_EQ_ && !defined _NO_SYS_GUID_OPERATOR_EQ_
324 #define _SYS_GUID_OPERATOR_EQ_
325 inline int IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
326     { return !memcmp(&rguid1, &rguid2, sizeof(GUID)); }
327 inline int operator==(REFGUID guidOne, REFGUID guidOther)
328     { return IsEqualGUID(guidOne,guidOther); }
329 inline int operator!=(REFGUID guidOne, REFGUID guidOther)
330     { return !IsEqualGUID(guidOne,guidOther); }
331 #endif
332 };
333 #endif // __cplusplus
334
335 #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
336     EXTERN_C const GUID FAR name
337
338 typedef GUID IID;
339 #ifdef __cplusplus
340 #define REFIID const IID &
341 #else
342 #define REFIID const IID *
343 #endif
344 #define IID_NULL GUID_NULL
345 #define IsEqualIID(riid1, riid2) IsEqualGUID(riid1, riid2)
346
347 #define __IID_DEFINED__
348
349 typedef GUID CLSID;
350 #define CLSID_DEFINED
351 #ifdef __cplusplus
352 #define REFCLSID const CLSID &
353 #else
354 #define REFCLSID const CLSID *
355 #endif
356 #define CLSID_NULL GUID_NULL
357 #define IsEqualCLSID(rclsid1, rclsid2) IsEqualGUID(rclsid1, rclsid2)
358 typedef CLSID *LPCLSID;
359
360 typedef UINT_PTR WPARAM;
361 typedef LONG_PTR LRESULT;
362
363 typedef LONG SCODE;
364
365
366 typedef union _ULARGE_INTEGER {
367     struct {
368 #if BIGENDIAN
369         DWORD HighPart;
370         DWORD LowPart;
371 #else
372         DWORD LowPart;
373         DWORD HighPart;
374 #endif
375     } 
376 #ifndef PAL_STDCPP_COMPAT
377     u
378 #endif // PAL_STDCPP_COMPAT
379      ;
380     ULONGLONG QuadPart;
381 } ULARGE_INTEGER, *PULARGE_INTEGER;
382
383 /******************* HRESULT types ****************************************/
384
385 #define FACILITY_WINDOWS                 8
386 #define FACILITY_URT                     19
387 #define FACILITY_UMI                     22
388 #define FACILITY_SXS                     23
389 #define FACILITY_STORAGE                 3
390 #define FACILITY_SSPI                    9
391 #define FACILITY_SCARD                   16
392 #define FACILITY_SETUPAPI                15
393 #define FACILITY_SECURITY                9
394 #define FACILITY_RPC                     1
395 #define FACILITY_WIN32                   7
396 #define FACILITY_CONTROL                 10
397 #define FACILITY_NULL                    0
398 #define FACILITY_MSMQ                    14
399 #define FACILITY_MEDIASERVER             13
400 #define FACILITY_INTERNET                12
401 #define FACILITY_ITF                     4
402 #define FACILITY_DPLAY                   21
403 #define FACILITY_DISPATCH                2
404 #define FACILITY_COMPLUS                 17
405 #define FACILITY_CERT                    11
406 #define FACILITY_ACS                     20
407 #define FACILITY_AAF                     18
408
409 #define NO_ERROR 0L
410
411 #define SEVERITY_SUCCESS    0
412 #define SEVERITY_ERROR      1
413
414 #define SUCCEEDED(Status) ((HRESULT)(Status) >= 0)
415 #define FAILED(Status) ((HRESULT)(Status)<0)
416 #define IS_ERROR(Status) ((ULONG)(Status) >> 31 == SEVERITY_ERROR) // diff from win32
417 #define HRESULT_CODE(hr)    ((hr) & 0xFFFF)
418 #define SCODE_CODE(sc)      ((sc) & 0xFFFF)
419 #define HRESULT_FACILITY(hr)  (((hr) >> 16) & 0x1fff)
420 #define SCODE_FACILITY(sc)    (((sc) >> 16) & 0x1fff)
421 #define HRESULT_SEVERITY(hr)  (((hr) >> 31) & 0x1)
422 #define SCODE_SEVERITY(sc)    (((sc) >> 31) & 0x1)
423
424 // both macros diff from Win32
425 #define MAKE_HRESULT(sev,fac,code) \
426     ((HRESULT) (((ULONG)(sev)<<31) | ((ULONG)(fac)<<16) | ((ULONG)(code))) )
427 #define MAKE_SCODE(sev,fac,code) \
428     ((SCODE) (((ULONG)(sev)<<31) | ((ULONG)(fac)<<16) | ((LONG)(code))) )
429
430 #define FACILITY_NT_BIT                 0x10000000
431 #define HRESULT_FROM_WIN32(x) ((HRESULT)(x) <= 0 ? ((HRESULT)(x)) : ((HRESULT) (((x) & 0x0000FFFF) | (FACILITY_WIN32 << 16) | 0x80000000)))
432 #define __HRESULT_FROM_WIN32(x) HRESULT_FROM_WIN32(x)
433
434 #define HRESULT_FROM_NT(x)      ((HRESULT) ((x) | FACILITY_NT_BIT))
435
436 /******************* OLE, BSTR, VARIANT *************************/
437
438 STDAPI_(LPVOID) CoTaskMemAlloc(SIZE_T cb);
439 STDAPI_(LPVOID) CoTaskMemRealloc(LPVOID pv, SIZE_T cb);
440 STDAPI_(void) CoTaskMemFree(LPVOID pv);
441
442 typedef SHORT VARIANT_BOOL;
443 #define VARIANT_TRUE ((VARIANT_BOOL)-1)
444 #define VARIANT_FALSE ((VARIANT_BOOL)0)
445
446 typedef WCHAR OLECHAR;
447 typedef OLECHAR* LPOLESTR;
448 typedef const OLECHAR* LPCOLESTR;
449
450 typedef WCHAR *BSTR;
451
452 STDAPI_(BSTR) SysAllocString(const OLECHAR*);
453 STDAPI_(BSTR) SysAllocStringLen(const OLECHAR*, UINT);
454 STDAPI_(BSTR) SysAllocStringByteLen(const char *, UINT);
455 STDAPI_(void) SysFreeString(BSTR);
456 STDAPI_(UINT) SysStringLen(BSTR);
457 STDAPI_(UINT) SysStringByteLen(BSTR);
458
459 typedef double DATE;
460
461 typedef union tagCY {
462     struct {
463 #if BIGENDIAN
464         LONG    Hi;
465         ULONG   Lo;
466 #else
467         ULONG   Lo;
468         LONG    Hi;
469 #endif
470     } u;
471     LONGLONG int64;
472 } CY, *LPCY;
473
474 typedef CY CURRENCY;
475
476 typedef struct tagDEC {
477     // Decimal.cs treats the first two shorts as one long
478     // And they seriable the data so we need to little endian
479     // seriliazation
480     // The wReserved overlaps with Variant's vt member
481 #if BIGENDIAN
482     union {
483         struct {
484             BYTE sign;
485             BYTE scale;
486         } u;
487         USHORT signscale;
488     } u;
489     USHORT wReserved;
490 #else
491     USHORT wReserved;
492     union {
493         struct {
494             BYTE scale;
495             BYTE sign;
496         } u;
497         USHORT signscale;
498     } u;
499 #endif
500     ULONG Hi32;
501     union {
502         struct {
503             ULONG Lo32;
504             ULONG Mid32;
505         } v;
506         ULONGLONG Lo64;
507     } v;
508 } DECIMAL, *LPDECIMAL;
509
510 #define DECIMAL_NEG ((BYTE)0x80)
511 #define DECIMAL_SCALE(dec)       ((dec).u.u.scale)
512 #define DECIMAL_SIGN(dec)        ((dec).u.u.sign)
513 #define DECIMAL_SIGNSCALE(dec)   ((dec).u.signscale)
514 #define DECIMAL_LO32(dec)        ((dec).v.v.Lo32)
515 #define DECIMAL_MID32(dec)       ((dec).v.v.Mid32)
516 #define DECIMAL_HI32(dec)        ((dec).Hi32)
517 #define DECIMAL_LO64_GET(dec)    ((dec).v.Lo64)
518 #define DECIMAL_LO64_SET(dec,value)   {(dec).v.Lo64 = value; }
519
520 #define DECIMAL_SETZERO(dec) {DECIMAL_LO32(dec) = 0; DECIMAL_MID32(dec) = 0; DECIMAL_HI32(dec) = 0; DECIMAL_SIGNSCALE(dec) = 0;}
521
522 typedef struct tagBLOB {
523     ULONG cbSize;
524     BYTE *pBlobData;
525 } BLOB, *LPBLOB;
526
527 interface IStream;
528 interface IRecordInfo;
529
530 typedef unsigned short VARTYPE;
531
532 enum VARENUM {
533     VT_EMPTY    = 0,
534     VT_NULL = 1,
535     VT_I2   = 2,
536     VT_I4   = 3,
537     VT_R4   = 4,
538     VT_R8   = 5,
539     VT_CY   = 6,
540     VT_DATE = 7,
541     VT_BSTR = 8,
542     VT_DISPATCH = 9,
543     VT_ERROR    = 10,
544     VT_BOOL = 11,
545     VT_VARIANT  = 12,
546     VT_UNKNOWN  = 13,
547     VT_DECIMAL  = 14,
548     VT_I1   = 16,
549     VT_UI1  = 17,
550     VT_UI2  = 18,
551     VT_UI4  = 19,
552     VT_I8   = 20,
553     VT_UI8  = 21,
554     VT_INT  = 22,
555     VT_UINT = 23,
556     VT_VOID = 24,
557     VT_HRESULT  = 25,
558     VT_PTR  = 26,
559     VT_SAFEARRAY    = 27,
560     VT_CARRAY   = 28,
561     VT_USERDEFINED  = 29,
562     VT_LPSTR    = 30,
563     VT_LPWSTR   = 31,
564     VT_RECORD   = 36,
565     VT_INT_PTR  = 37,
566     VT_UINT_PTR = 38,  
567
568     VT_FILETIME        = 64,
569     VT_BLOB            = 65,
570     VT_STREAM          = 66,
571     VT_STORAGE         = 67,
572     VT_STREAMED_OBJECT = 68,
573     VT_STORED_OBJECT   = 69,
574     VT_BLOB_OBJECT     = 70,
575     VT_CF              = 71,
576     VT_CLSID           = 72,
577
578     VT_VECTOR   = 0x1000,
579     VT_ARRAY    = 0x2000,
580     VT_BYREF    = 0x4000,
581     VT_TYPEMASK = 0xfff,
582 };
583
584 typedef struct tagVARIANT VARIANT, *LPVARIANT;
585 typedef struct tagSAFEARRAY SAFEARRAY;
586
587 struct tagVARIANT
588     {
589     union
590         {
591         struct
592             {
593 #if BIGENDIAN
594             // We need to make sure vt overlaps with DECIMAL's wReserved.
595             // See the DECIMAL type for details.
596             WORD wReserved1;
597             VARTYPE vt;
598 #else
599             VARTYPE vt;
600             WORD wReserved1;
601 #endif
602             WORD wReserved2;
603             WORD wReserved3;
604             union
605                 {
606                 LONGLONG llVal;
607                 LONG lVal;
608                 BYTE bVal;
609                 SHORT iVal;
610                 FLOAT fltVal;
611                 DOUBLE dblVal;
612                 VARIANT_BOOL boolVal;
613                 SCODE scode;
614                 CY cyVal;
615                 DATE date;
616                 BSTR bstrVal;
617                 interface IUnknown *punkVal;
618                 interface IDispatch *pdispVal;
619                 SAFEARRAY *parray;
620                 BYTE *pbVal;
621                 SHORT *piVal;
622                 LONG *plVal;
623                 LONGLONG *pllVal;
624                 FLOAT *pfltVal;
625                 DOUBLE *pdblVal;
626                 VARIANT_BOOL *pboolVal;
627                 SCODE *pscode;
628                 CY *pcyVal;
629                 DATE *pdate;
630                 BSTR *pbstrVal;
631                 interface IUnknown **ppunkVal;
632                 VARIANT *pvarVal;
633                 PVOID byref;
634                 CHAR cVal;
635                 USHORT uiVal;
636                 ULONG ulVal;
637                 ULONGLONG ullVal;
638                 INT intVal;
639                 UINT uintVal;
640                 DECIMAL *pdecVal;
641                 CHAR *pcVal;
642                 USHORT *puiVal;
643                 ULONG *pulVal;
644                 ULONGLONG *pullVal;
645                 INT *pintVal;
646                 UINT *puintVal;
647                 struct __tagBRECORD
648                     {
649                     PVOID pvRecord;
650                     interface IRecordInfo *pRecInfo;
651                     } brecVal;
652                 } n3;
653             } n2;
654         DECIMAL decVal;
655         } n1;
656     };
657
658 typedef VARIANT VARIANTARG, *LPVARIANTARG;
659
660 STDAPI_(void) VariantInit(VARIANT * pvarg);
661 STDAPI_(HRESULT) VariantClear(VARIANT * pvarg);
662
663 #define V_VT(X)         ((X)->n1.n2.vt)
664 #define V_UNION(X, Y)   ((X)->n1.n2.n3.Y)
665 #define V_RECORDINFO(X) ((X)->n1.n2.n3.brecVal.pRecInfo)
666 #define V_RECORD(X)     ((X)->n1.n2.n3.brecVal.pvRecord)
667
668 #define V_UI1(X)         V_UNION(X, bVal)
669 #define V_UI1REF(X)      V_UNION(X, pbVal)
670 #define V_I2(X)          V_UNION(X, iVal)
671 #define V_I2REF(X)       V_UNION(X, piVal)
672 #define V_I4(X)          V_UNION(X, lVal)
673 #define V_I4REF(X)       V_UNION(X, plVal)
674 #define V_I8(X)          V_UNION(X, llVal)
675 #define V_I8REF(X)       V_UNION(X, pllVal)
676 #define V_R4(X)          V_UNION(X, fltVal)
677 #define V_R4REF(X)       V_UNION(X, pfltVal)
678 #define V_R8(X)          V_UNION(X, dblVal)
679 #define V_R8REF(X)       V_UNION(X, pdblVal)
680 #define V_I1(X)          V_UNION(X, cVal)
681 #define V_I1REF(X)       V_UNION(X, pcVal)
682 #define V_UI2(X)         V_UNION(X, uiVal)
683 #define V_UI2REF(X)      V_UNION(X, puiVal)
684 #define V_UI4(X)         V_UNION(X, ulVal)
685 #define V_UI4REF(X)      V_UNION(X, pulVal)
686 #define V_UI8(X)         V_UNION(X, ullVal)
687 #define V_UI8REF(X)      V_UNION(X, pullVal)
688 #define V_INT(X)         V_UNION(X, intVal)
689 #define V_INTREF(X)      V_UNION(X, pintVal)
690 #define V_UINT(X)        V_UNION(X, uintVal)
691 #define V_UINTREF(X)     V_UNION(X, puintVal)
692 #define V_ARRAY(X)       V_UNION(X, parray)
693
694 #ifdef _WIN64
695 #define V_INT_PTR(X)        V_UNION(X, llVal)
696 #define V_UINT_PTR(X)       V_UNION(X, ullVal)
697 #define V_INT_PTRREF(X)     V_UNION(X, pllVal)
698 #define V_UINT_PTRREF(X)    V_UNION(X, pullVal)
699 #else
700 #define V_INT_PTR(X)        V_UNION(X, lVal)
701 #define V_UINT_PTR(X)       V_UNION(X, ulVal)
702 #define V_INT_PTRREF(X)     V_UNION(X, plVal)
703 #define V_UINT_PTRREF(X)    V_UNION(X, pulVal)
704 #endif
705
706 #define V_CY(X)          V_UNION(X, cyVal)
707 #define V_CYREF(X)       V_UNION(X, pcyVal)
708 #define V_DATE(X)        V_UNION(X, date)
709 #define V_DATEREF(X)     V_UNION(X, pdate)
710 #define V_BSTR(X)        V_UNION(X, bstrVal)
711 #define V_BSTRREF(X)     V_UNION(X, pbstrVal)
712 #define V_UNKNOWN(X)     V_UNION(X, punkVal)
713 #define V_UNKNOWNREF(X)  V_UNION(X, ppunkVal)
714 #define V_VARIANTREF(X)  V_UNION(X, pvarVal)
715 #define V_DISPATCH(X)    V_UNION(X, pdispVal)
716 #define V_ERROR(X)       V_UNION(X, scode)
717 #define V_ERRORREF(X)    V_UNION(X, pscode)
718 #define V_BOOL(X)        V_UNION(X, boolVal)
719 #define V_BOOLREF(X)     V_UNION(X, pboolVal)
720 #define V_BYREF(X)       V_UNION(X, byref)
721
722 #define V_DECIMAL(X)     ((X)->n1.decVal)
723 #define V_DECIMALREF(X)    V_UNION(X, pdecVal)
724
725 #define V_ISBYREF(X)     (V_VT(X)&VT_BYREF)
726
727 STDAPI CreateStreamOnHGlobal(PVOID hGlobal, BOOL fDeleteOnRelease, interface IStream** ppstm);
728
729 #define STGM_DIRECT             0x00000000L
730
731 #define STGM_READ               0x00000000L
732 #define STGM_WRITE              0x00000001L
733 #define STGM_READWRITE          0x00000002L
734
735 #define STGM_SHARE_DENY_NONE    0x00000040L
736 #define STGM_SHARE_DENY_READ    0x00000030L
737 #define STGM_SHARE_DENY_WRITE   0x00000020L
738 #define STGM_SHARE_EXCLUSIVE    0x00000010L
739
740 #define STGM_DELETEONRELEASE    0x04000000L
741
742 #define STGM_CREATE             0x00001000L
743 #define STGM_CONVERT            0x00020000L
744 #define STGM_FAILIFTHERE        0x00000000L
745
746 #define STGM_NOSNAPSHOT         0x00200000L
747
748 STDAPI IIDFromString(LPOLESTR lpsz, IID* lpiid);
749 STDAPI_(int) StringFromGUID2(REFGUID rguid, LPOLESTR lpsz, int cchMax); 
750
751 /******************* CRYPT **************************************/
752
753 #define PUBLICKEYBLOB           0x6
754
755 //
756 // Algorithm IDs and Flags
757 //
758 #define GET_ALG_CLASS(x)        (x & (7 << 13))
759 #define GET_ALG_TYPE(x)         (x & (15 << 9))
760 #define GET_ALG_SID(x)          (x & (511))
761
762 typedef unsigned int ALG_ID;
763
764 // Algorithm classes
765 #define ALG_CLASS_SIGNATURE     (1 << 13)
766 #define ALG_CLASS_HASH          (4 << 13)
767
768 // Algorithm types
769 #define ALG_TYPE_ANY            (0)
770
771 // Hash sub ids
772 #define ALG_SID_SHA1            4
773
774 // algorithm identifier definitions
775 #define CALG_SHA1               (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA1)
776
777 /******************* NLS ****************************************/
778
779 typedef 
780 enum tagMIMECONTF {
781     MIMECONTF_MAILNEWS  = 0x1,
782     MIMECONTF_BROWSER   = 0x2,
783     MIMECONTF_MINIMAL   = 0x4,
784     MIMECONTF_IMPORT    = 0x8,
785     MIMECONTF_SAVABLE_MAILNEWS  = 0x100,
786     MIMECONTF_SAVABLE_BROWSER   = 0x200,
787     MIMECONTF_EXPORT    = 0x400,
788     MIMECONTF_PRIVCONVERTER = 0x10000,
789     MIMECONTF_VALID = 0x20000,
790     MIMECONTF_VALID_NLS = 0x40000,
791     MIMECONTF_MIME_IE4  = 0x10000000,
792     MIMECONTF_MIME_LATEST   = 0x20000000,
793     MIMECONTF_MIME_REGISTRY = 0x40000000
794     }   MIMECONTF;
795
796 #define LCMAP_LOWERCASE           0x00000100
797 #define LCMAP_UPPERCASE           0x00000200
798 #define LCMAP_SORTKEY             0x00000400
799 #define LCMAP_BYTEREV             0x00000800
800
801 #define LCMAP_HIRAGANA            0x00100000
802 #define LCMAP_KATAKANA            0x00200000
803 #define LCMAP_HALFWIDTH           0x00400000
804 #define LCMAP_FULLWIDTH           0x00800000
805
806 #define LCMAP_LINGUISTIC_CASING   0x01000000
807
808 // 8 characters for language
809 // 8 characters for region
810 // 64 characters for suffix (script)
811 // 2 characters for '-' separators
812 // 2 characters for prefix like "i-" or "x-"
813 // 1 null termination
814 #define LOCALE_NAME_MAX_LENGTH   85
815
816 #define LOCALE_SCOUNTRY           0x00000006
817 #define LOCALE_SENGCOUNTRY        0x00001002
818
819 #define LOCALE_SLANGUAGE          0x00000002
820 #define LOCALE_SENGLANGUAGE       0x00001001
821
822 #define LOCALE_SDATE              0x0000001D
823 #define LOCALE_STIME              0x0000001E
824
825 #define CSTR_LESS_THAN            1
826 #define CSTR_EQUAL                2
827 #define CSTR_GREATER_THAN         3
828
829 #define NORM_IGNORENONSPACE       0x00000002
830
831 #define WC_COMPOSITECHECK         0x00000000 // NOTE: diff from winnls.h
832
833 /******************* shlwapi ************************************/
834
835 // note: diff in NULL handing and calling convetion
836 #define StrCpyW                 PAL_wcscpy
837 #define StrCatW                 PAL_wcscat
838 #define StrChrW                 (WCHAR*)PAL_wcschr
839 #define StrCmpW                 PAL_wcscmp
840 #define StrCmpIW                _wcsicmp
841 #define StrCmpNW                PAL_wcsncmp
842 #define StrCmpNIW               _wcsnicmp
843
844 STDAPI_(LPWSTR) StrNCatW(LPWSTR lpFront, LPCWSTR lpBack, int cchMax);
845 STDAPI_(int) StrToIntW(LPCWSTR lpSrc);
846 STDAPI_(LPWSTR) StrStrIW(LPCWSTR lpFirst, LPCWSTR lpSrch);
847 STDAPI_(LPWSTR) StrRChrW(LPCWSTR lpStart, LPCWSTR lpEnd, WCHAR wMatch);
848 STDAPI_(LPWSTR) StrCatBuffW(LPWSTR pszDest, LPCWSTR pszSrc, int cchDestBuffSize);
849
850 #define lstrcmpW                PAL_wcscmp
851 #define lstrcmpiW               _wcsicmp
852
853 #ifdef UNICODE
854 #define StrCpy                  StrCpyW
855 #define StrCat                  StrCatW
856 #define StrNCat                 StrNCatW
857 #define StrChr                  StrChrW
858 #define StrCmp                  StrCmpW
859 #define StrCmpN                 StrCmpNW
860 #define StrCmpI                 StrCmpIW
861 #define StrCmpNI                StrCmpNIW
862
863 #define StrToInt                StrToIntW
864 #define StrStrI                 StrStrIW
865 #define StrRChr                 StrRChrW
866 #define StrCatBuff              StrCatBuffW
867
868 #define lstrcmp                 lstrcmpW
869 #define lstrcmpi                lstrcmpiW
870 #endif
871
872
873 #ifdef __cplusplus
874 /*
875   Safe CRT functions are not available (yet) on all platforms, so we use our own implementations from safecrt.h.
876 */
877 #define _CRT_ALTERNATIVE_INLINES
878 #define _SAFECRT_NO_INCLUDES 1
879 #define _SAFECRT_USE_INLINES 1
880 #define _SAFECRT_SET_ERRNO 0
881 #define _SAFECRT_DEFINE_MBS_FUNCTIONS 0
882 #define _SAFECRT_DEFINE_TCS_MACROS 1
883 /*
884 #define _SAFECRT__ISMBBLEAD(_Character) 0
885 #define _SAFECRT__MBSDEC(_String, _Current) (_Current - 1)
886 */
887 #include "safecrt.h"
888 #include "specstrings.h"
889
890 /*
891 The wrappers below are simple implementations that may not be as robust as complete functions in the Secure CRT library.
892 Remember to fix the errcode defintion in safecrt.h.
893 */
894
895 #define _wcslwr_s _wcslwr_unsafe
896 #define swscanf_s swscanf
897
898 #define _wfopen_s _wfopen_unsafe
899 #define fopen_s _fopen_unsafe
900
901 #define _strlwr_s _strlwr_unsafe
902
903 #define _vscprintf _vscprintf_unsafe
904
905 extern "C++" {
906
907 #include <safemath.h>
908
909 inline errno_t __cdecl _wcslwr_unsafe(WCHAR *str, size_t sz)
910 {
911     size_t fullSize;
912     if(!ClrSafeInt<size_t>::multiply(sz, sizeof(WCHAR), fullSize))
913         return 1;
914     WCHAR *copy = (WCHAR *)malloc(fullSize);
915     if(copy == nullptr)
916         return 1;
917
918     errno_t retCode = wcscpy_s(copy, sz, str);
919     if(retCode) {
920         free(copy);
921         return 1;
922     }
923
924     _wcslwr(copy);
925     wcscpy_s(str, sz, copy);
926     free(copy);
927         
928     return 0;
929 }
930 inline errno_t __cdecl _strlwr_unsafe(char *str, size_t sz)
931 {
932     char *copy = (char *)malloc(sz);
933     if(copy == nullptr)
934         return 1;
935
936     errno_t retCode = strcpy_s(copy, sz, str);
937     if(retCode) {
938         free(copy);
939         return 1;
940     }
941
942     _strlwr(copy);
943     strcpy_s(str, sz, copy);
944     free(copy);
945         
946     return 0;
947 }
948
949 inline int __cdecl _vscprintf_unsafe(const char *_Format, va_list _ArgList)
950 {
951     int guess = 10;
952
953     for (;;)
954     {
955         char *buf = (char *)malloc(guess * sizeof(char));
956         if(buf == nullptr)
957             return 0;
958
959         va_list argListCopy;
960         va_copy(argListCopy, _ArgList);
961         int ret = _vsnprintf_s(buf, guess, _TRUNCATE, _Format, argListCopy);
962         free(buf);
963         va_end(argListCopy);
964
965         if ((ret != -1) && (ret < guess))
966             return ret;
967
968         guess *= 2;
969     }
970 }
971
972 inline errno_t __cdecl _wfopen_unsafe(PAL_FILE * *ff, const WCHAR *fileName, const WCHAR *mode)
973 {
974     PAL_FILE *result = _wfopen(fileName, mode);
975     if(result == 0) {
976         return 1;
977     } else {
978         *ff = result;
979         return 0;
980     }
981 }
982
983 inline errno_t __cdecl _fopen_unsafe(PAL_FILE * *ff, const char *fileName, const char *mode)
984 {
985   PAL_FILE *result = PAL_fopen(fileName, mode);
986   if(result == 0) {
987     return 1;
988   } else {
989     *ff = result;
990     return 0;
991   }
992 }
993
994 }
995 #endif /* __cplusplus */
996
997
998 STDAPI_(BOOL) PathAppendW(LPWSTR pszPath, LPCWSTR pszMore);
999 STDAPI_(int) PathCommonPrefixW(LPCWSTR pszFile1, LPCWSTR pszFile2, LPWSTR  pszPath);
1000 PALIMPORT LPWSTR PALAPI PathFindFileNameW(LPCWSTR pPath);
1001 STDAPI_(int) PathGetDriveNumberW(LPCWSTR lpsz);
1002 STDAPI_(BOOL) PathIsRelativeW(LPCWSTR lpszPath);
1003 STDAPI_(BOOL) PathIsUNCW(LPCWSTR pszPath);
1004 STDAPI_(LPWSTR) PathAddBackslashW(LPWSTR lpszPath);
1005 STDAPI_(LPWSTR) PathRemoveBackslashW(LPWSTR lpszPath);
1006 STDAPI_(void) PathRemoveExtensionW(LPWSTR pszPath);
1007 STDAPI_(LPWSTR) PathCombineW(LPWSTR lpszDest, LPCWSTR lpszDir, LPCWSTR lpszFile);
1008 STDAPI_(BOOL) PathCanonicalizeW(LPWSTR lpszDst, LPCWSTR lpszSrc);
1009 STDAPI_(BOOL) PathRelativePathToW(LPWSTR pszPath, LPCWSTR pszFrom, DWORD dwAttrFrom, LPCWSTR pszTo, DWORD dwAttrTo);
1010 STDAPI_(BOOL) PathRenameExtensionW(LPWSTR pszPath, LPCWSTR pszExt);
1011 STDAPI_(BOOL) PathRemoveFileSpecW(LPWSTR pFile);
1012 STDAPI_(void) PathStripPathW (LPWSTR pszPath);
1013
1014 STDAPI PathCreateFromUrlW(LPCWSTR pszUrl, LPWSTR pszPath, LPDWORD pcchPath, DWORD dwFlags);
1015 STDAPI_(BOOL) PathIsURLW(LPCWSTR pszPath);
1016
1017
1018 #define URL_UNESCAPE                    0x10000000
1019 #define URL_ESCAPE_PERCENT              0x00001000
1020
1021 typedef enum {
1022     URLIS_FILEURL = 3,
1023 } URLIS;
1024
1025 typedef enum {
1026     URL_PART_SCHEME     = 1,
1027     URL_PART_HOSTNAME   = 2,
1028 } URL_PART;
1029
1030 STDAPI UrlCanonicalizeW(LPCWSTR pszUrl, LPWSTR pszCanonicalized, LPDWORD pcchCanonicalized, DWORD dwFlags);
1031 STDAPI UrlCombineW(LPCWSTR pszBase, LPCWSTR pszRelative, LPWSTR pszCombined, LPDWORD pcchCombined, DWORD dwFlags);
1032 STDAPI UrlEscapeW(LPCWSTR pszUrl, LPWSTR pszEscaped, LPDWORD pcchEscaped, DWORD dwFlags);
1033 STDAPI UrlUnescapeW(LPWSTR pszURL, LPWSTR pszUnescaped, LPDWORD pcchUnescaped, DWORD dwFlags);
1034 STDAPI_(BOOL) UrlIsW(LPCWSTR pszUrl, URLIS dwUrlIs);
1035 STDAPI UrlGetPartW(LPCWSTR pszIn, LPWSTR pszOut, LPDWORD pcchOut, DWORD dwPart, DWORD dwFlags);
1036
1037 #ifdef UNICODE
1038 #define PathAppend          PathAppendW
1039 #define PathCommonPrefix    PathCommonPrefixW
1040 #define PathFindFileName    PathFindFileNameW
1041 #define PathIsRelative      PathIsRelativeW
1042 #define PathGetDriveNumber  PathGetDriveNumberW
1043 #define PathIsUNC           PathIsUNCW
1044 #define PathAddBackslash    PathAddBackslashW
1045 #define PathRemoveBackslash PathRemoveBackslashW
1046 #define PathRemoveExtension PathRemoveExtensionW
1047 #define PathCombine         PathCombineW
1048 #define PathSkipRoot        PathSkipRootW
1049 #define PathFindExtension   PathFindExtensionW
1050 #define PathCanonicalize    PathCanonicalizeW
1051 #define PathRelativePathTo  PathRelativePathToW
1052 #define PathRemoveFileSpec  PathRemoveFileSpecW
1053 #define PathRenameExtension PathRenameExtensionW
1054 #define PathStripPath       PathStripPathW
1055
1056 #define PathCreateFromUrl   PathCreateFromUrlW
1057 #define PathIsURL           PathIsURLW
1058
1059 #define UrlCanonicalize     UrlCanonicalizeW
1060 #define UrlCombine          UrlCombineW
1061 #define UrlEscape           UrlEscapeW
1062 #define UrlUnescape         UrlUnescapeW 
1063 #define UrlIs               UrlIsW
1064 #define UrlGetPart          UrlGetPartW
1065
1066 #endif // UNICODE
1067
1068 /******************* misc ***************************************/
1069
1070 #ifdef __cplusplus
1071 namespace std 
1072 {
1073     typedef decltype(nullptr) nullptr_t;
1074 }
1075
1076 extern "C++"
1077 template< class T >
1078 typename std::remove_reference<T>::type&& move( T&& t );
1079 #endif // __cplusplus
1080
1081 #define __RPC__out
1082 #define __RPC__in
1083 #define __RPC__deref_out_opt
1084 #define __RPC__in_opt
1085 #define __RPC__inout_xcount(x)
1086 #define __RPC__in_ecount_full(x)
1087 #define __RPC__out_ecount_part(x, y)
1088 #define __RPC__in_xcount(x)
1089 #define __RPC__inout
1090 #define __RPC__deref_out_ecount_full_opt(x)
1091
1092 typedef DWORD OLE_COLOR;
1093
1094 typedef union __m128i {
1095     __int8              m128i_i8[16];
1096     __int16             m128i_i16[8];
1097     __int32             m128i_i32[4];    
1098     __int64             m128i_i64[2];
1099     unsigned __int8     m128i_u8[16];
1100     unsigned __int16    m128i_u16[8];
1101     unsigned __int32    m128i_u32[4];
1102     unsigned __int64    m128i_u64[2];
1103 } __m128i;
1104
1105 #define PF_COMPARE_EXCHANGE_DOUBLE          2
1106
1107 typedef VOID (NTAPI * WAITORTIMERCALLBACKFUNC) (PVOID, BOOLEAN );
1108
1109 typedef HANDLE HWND;
1110
1111 #define IS_TEXT_UNICODE_SIGNATURE             0x0008
1112 #define IS_TEXT_UNICODE_UNICODE_MASK          0x000F
1113
1114 BOOL IsTextUnicode(CONST VOID* lpv, int iSize, LPINT lpiResult);
1115
1116 typedef struct _LIST_ENTRY {
1117    struct _LIST_ENTRY *Flink;
1118    struct _LIST_ENTRY *Blink;
1119 } LIST_ENTRY, *PLIST_ENTRY;
1120
1121 typedef VOID (__stdcall *WAITORTIMERCALLBACK)(PVOID, BOOLEAN);
1122
1123 // PORTABILITY_ASSERT and PORTABILITY_WARNING macros are meant to be used to
1124 // mark places in the code that needs attention for portability. The usual
1125 // usage pattern is:
1126 //
1127 // int get_scratch_register() {
1128 // #if defined(_TARGET_X86_)
1129 //     return eax;
1130 // #elif defined(_TARGET_AMD64_)
1131 //     return rax;
1132 // #elif defined(_TARGET_ARM_)
1133 //     return r0;
1134 // #else
1135 //     PORTABILITY_ASSERT("scratch register");
1136 //     return 0;
1137 // #endif
1138 // }
1139 //
1140 // PORTABILITY_ASSERT is meant to be used inside functions/methods. It can
1141 // introduce compile-time and/or run-time errors.
1142 // PORTABILITY_WARNING is meant to be used outside functions/methods. It can
1143 // introduce compile-time errors or warnings only.
1144 //
1145 // People starting new ports will first define these to just cause run-time
1146 // errors. Once they fix all the places that need attention for portability,
1147 // they can define PORTABILITY_ASSERT and PORTABILITY_WARNING to cause
1148 // compile-time errors to make sure that they haven't missed anything.
1149 // 
1150 // If it is reasonably possible all codepaths containing PORTABILITY_ASSERT
1151 // should be compilable (e.g. functions should return NULL or something if
1152 // they are expected to return a value).
1153 //
1154 // The message in these two macros should not contain any keywords like TODO
1155 // or NYI. It should be just the brief description of the problem.
1156
1157 #ifdef PORTABILITY_CHECK
1158 // Finished ports - compile-time errors
1159 #define PORTABILITY_WARNING(message)    NEED_TO_PORT_THIS_ONE(NEED_TO_PORT_THIS_ONE)
1160 #define PORTABILITY_ASSERT(message)     NEED_TO_PORT_THIS_ONE(NEED_TO_PORT_THIS_ONE)
1161 #else
1162 // Ports in progress - run-time asserts only
1163 #define PORTABILITY_WARNING(message)
1164 #define PORTABILITY_ASSERT(message)     _ASSERTE(false && message)
1165 #endif
1166
1167 #define UNREFERENCED_PARAMETER(P)          (void)(P)
1168
1169 #ifdef BIT64
1170 #define VALPTR(x) VAL64(x)
1171 #define GET_UNALIGNED_PTR(x) GET_UNALIGNED_64(x)
1172 #define GET_UNALIGNED_VALPTR(x) GET_UNALIGNED_VAL64(x)
1173 #define SET_UNALIGNED_PTR(p,x) SET_UNALIGNED_64(p,x)
1174 #define SET_UNALIGNED_VALPTR(p,x) SET_UNALIGNED_VAL64(p,x)
1175 #else
1176 #define VALPTR(x) VAL32(x)
1177 #define GET_UNALIGNED_PTR(x) GET_UNALIGNED_32(x)
1178 #define GET_UNALIGNED_VALPTR(x) GET_UNALIGNED_VAL32(x)
1179 #define SET_UNALIGNED_PTR(p,x) SET_UNALIGNED_32(p,x)
1180 #define SET_UNALIGNED_VALPTR(p,x) SET_UNALIGNED_VAL32(p,x)
1181 #endif
1182
1183 #ifdef _TARGET_AMD64_
1184 #define RUNTIME_FUNCTION_INDIRECT 0x1
1185 #endif
1186
1187 #define _ReturnAddress() __builtin_return_address(0)
1188
1189 #ifdef PLATFORM_UNIX
1190 #define DIRECTORY_SEPARATOR_CHAR_A '/'
1191 #define DIRECTORY_SEPARATOR_CHAR_W W('/')
1192 #define DIRECTORY_SEPARATOR_STR_A "/"
1193 #define DIRECTORY_SEPARATOR_STR_W W("/")
1194 #define PATH_SEPARATOR_CHAR_W W(':')
1195 #define PATH_SEPARATOR_STR_W W(":")
1196 #define VOLUME_SEPARATOR_CHAR_W W('/')
1197 #else // PLATFORM_UNIX
1198 #define DIRECTORY_SEPARATOR_CHAR_A '\\'
1199 #define DIRECTORY_SEPARATOR_CHAR_W W('\\')
1200 #define DIRECTORY_SEPARATOR_STR_A "\\"
1201 #define DIRECTORY_SEPARATOR_STR_W W("\\")
1202 #define PATH_SEPARATOR_CHAR_W W(';')
1203 #define PATH_SEPARATOR_STR_W W(";")
1204 #define VOLUME_SEPARATOR_CHAR_W W(':')
1205 #endif // PLATFORM_UNIX
1206
1207 #ifndef IMAGE_IMPORT_DESC_FIELD
1208 #define IMAGE_IMPORT_DESC_FIELD(img, f)     ((img).u.f)
1209 #endif
1210
1211 #ifndef IMAGE_COR20_HEADER_FIELD
1212 #define IMAGE_COR20_HEADER_FIELD(obj, f)    ((obj).f)
1213 #endif
1214
1215 // copied from winnt.h
1216 #define PROCESSOR_ARCHITECTURE_INTEL            0
1217 #define PROCESSOR_ARCHITECTURE_MIPS             1
1218 #define PROCESSOR_ARCHITECTURE_ALPHA            2
1219 #define PROCESSOR_ARCHITECTURE_PPC              3
1220 #define PROCESSOR_ARCHITECTURE_SHX              4
1221 #define PROCESSOR_ARCHITECTURE_ARM              5
1222 #define PROCESSOR_ARCHITECTURE_IA64             6
1223 #define PROCESSOR_ARCHITECTURE_ALPHA64          7
1224 #define PROCESSOR_ARCHITECTURE_MSIL             8
1225 #define PROCESSOR_ARCHITECTURE_AMD64            9
1226 #define PROCESSOR_ARCHITECTURE_IA32_ON_WIN64    10
1227 #define PROCESSOR_ARCHITECTURE_NEUTRAL          11
1228 #define PROCESSOR_ARCHITECTURE_ARM64            12
1229
1230 #define PROCESSOR_ARCHITECTURE_UNKNOWN 0xFFFF
1231
1232 //
1233 // JIT Debugging Info. This structure is defined to have constant size in
1234 // both the emulated and native environment.
1235 //
1236
1237 typedef struct _JIT_DEBUG_INFO {
1238     DWORD dwSize;
1239     DWORD dwProcessorArchitecture;
1240     DWORD dwThreadID;
1241     DWORD dwReserved0;
1242     ULONG64 lpExceptionAddress;
1243     ULONG64 lpExceptionRecord;
1244     ULONG64 lpContextRecord;
1245 } JIT_DEBUG_INFO, *LPJIT_DEBUG_INFO;
1246
1247 typedef JIT_DEBUG_INFO JIT_DEBUG_INFO32, *LPJIT_DEBUG_INFO32;
1248 typedef JIT_DEBUG_INFO JIT_DEBUG_INFO64, *LPJIT_DEBUG_INFO64;
1249
1250 /******************* resources ***************************************/
1251
1252 #define MAKEINTRESOURCEW(i) ((LPWSTR)((ULONG_PTR)((WORD)(i))))
1253 #define RT_RCDATA           MAKEINTRESOURCE(10)
1254 #define RT_VERSION          MAKEINTRESOURCE(16)
1255
1256 /******************* SAFEARRAY ************************/
1257
1258 #define FADF_VARIANT    ( 0x800 )
1259
1260 typedef struct tagSAFEARRAYBOUND
1261     {
1262     ULONG cElements;
1263     LONG lLbound;
1264     }   SAFEARRAYBOUND;
1265
1266 typedef struct tagSAFEARRAYBOUND *LPSAFEARRAYBOUND;
1267
1268 typedef struct tagSAFEARRAY
1269     {
1270     USHORT cDims;
1271     USHORT fFeatures;
1272     ULONG cbElements;
1273     ULONG cLocks;
1274     PVOID pvData;
1275     SAFEARRAYBOUND rgsabound[ 1 ];
1276     }   SAFEARRAY;
1277
1278 typedef SAFEARRAY *LPSAFEARRAY;
1279
1280
1281 STDAPI_(SAFEARRAY *) SafeArrayCreateVector(VARTYPE vt, LONG lLbound, ULONG cElements);
1282 STDAPI_(UINT) SafeArrayGetDim(SAFEARRAY * psa);
1283 STDAPI SafeArrayGetElement(SAFEARRAY * psa, LONG * rgIndices, void * pv);
1284 STDAPI SafeArrayGetLBound(SAFEARRAY * psa, UINT nDim, LONG * plLbound);
1285 STDAPI SafeArrayGetUBound(SAFEARRAY * psa, UINT nDim, LONG * plUbound);
1286 STDAPI SafeArrayGetVartype(SAFEARRAY * psa, VARTYPE * pvt);
1287 STDAPI SafeArrayPutElement(SAFEARRAY * psa, LONG * rgIndices, void * pv);
1288 STDAPI SafeArrayDestroy(SAFEARRAY * psa);
1289
1290 EXTERN_C void * _stdcall _lfind(const void *, const void *, unsigned int *, unsigned int,
1291         int (__cdecl *)(const void *, const void *));
1292
1293
1294 /*<TODO>****************** clean this up ***********************</TODO>*/
1295
1296
1297 interface IDispatch;
1298 interface ITypeInfo;
1299 interface ITypeLib;
1300 interface IMoniker;
1301
1302 typedef VOID (WINAPI *LPOVERLAPPED_COMPLETION_ROUTINE)( 
1303     DWORD dwErrorCode,
1304     DWORD dwNumberOfBytesTransfered,
1305     LPVOID lpOverlapped);
1306
1307 //
1308 // Debug APIs
1309 //
1310 #define EXCEPTION_DEBUG_EVENT       1
1311 #define CREATE_THREAD_DEBUG_EVENT   2
1312 #define CREATE_PROCESS_DEBUG_EVENT  3
1313 #define EXIT_THREAD_DEBUG_EVENT     4
1314 #define EXIT_PROCESS_DEBUG_EVENT    5
1315 #define LOAD_DLL_DEBUG_EVENT        6
1316 #define UNLOAD_DLL_DEBUG_EVENT      7
1317 #define OUTPUT_DEBUG_STRING_EVENT   8
1318 #define RIP_EVENT                   9
1319
1320 typedef struct _EXCEPTION_DEBUG_INFO {
1321     EXCEPTION_RECORD ExceptionRecord;
1322     DWORD dwFirstChance;
1323 } EXCEPTION_DEBUG_INFO, *LPEXCEPTION_DEBUG_INFO;
1324
1325 typedef struct _CREATE_THREAD_DEBUG_INFO {
1326     HANDLE hThread;
1327     LPVOID lpThreadLocalBase;
1328     LPTHREAD_START_ROUTINE lpStartAddress;
1329 } CREATE_THREAD_DEBUG_INFO, *LPCREATE_THREAD_DEBUG_INFO;
1330
1331 typedef struct _CREATE_PROCESS_DEBUG_INFO {
1332     HANDLE hFile;
1333     HANDLE hProcess;
1334     HANDLE hThread;
1335     LPVOID lpBaseOfImage;
1336     DWORD dwDebugInfoFileOffset;
1337     DWORD nDebugInfoSize;
1338     LPVOID lpThreadLocalBase;
1339     LPTHREAD_START_ROUTINE lpStartAddress;
1340     LPVOID lpImageName;
1341     WORD fUnicode;
1342 } CREATE_PROCESS_DEBUG_INFO, *LPCREATE_PROCESS_DEBUG_INFO;
1343
1344 typedef struct _EXIT_THREAD_DEBUG_INFO {
1345     DWORD dwExitCode;
1346 } EXIT_THREAD_DEBUG_INFO, *LPEXIT_THREAD_DEBUG_INFO;
1347
1348 typedef struct _EXIT_PROCESS_DEBUG_INFO {
1349     DWORD dwExitCode;
1350 } EXIT_PROCESS_DEBUG_INFO, *LPEXIT_PROCESS_DEBUG_INFO;
1351
1352 typedef struct _LOAD_DLL_DEBUG_INFO {
1353     HANDLE hFile;
1354     LPVOID lpBaseOfDll;
1355     DWORD dwDebugInfoFileOffset;
1356     DWORD nDebugInfoSize;
1357     LPVOID lpImageName;
1358     WORD fUnicode;
1359 } LOAD_DLL_DEBUG_INFO, *LPLOAD_DLL_DEBUG_INFO;
1360
1361 typedef struct _UNLOAD_DLL_DEBUG_INFO {
1362     LPVOID lpBaseOfDll;
1363 } UNLOAD_DLL_DEBUG_INFO, *LPUNLOAD_DLL_DEBUG_INFO;
1364
1365 typedef struct _OUTPUT_DEBUG_STRING_INFO {
1366     LPSTR lpDebugStringData;
1367     WORD fUnicode;
1368     WORD nDebugStringLength;
1369 } OUTPUT_DEBUG_STRING_INFO, *LPOUTPUT_DEBUG_STRING_INFO;
1370
1371 typedef struct _RIP_INFO {
1372     DWORD dwError;
1373     DWORD dwType;
1374 } RIP_INFO, *LPRIP_INFO;
1375
1376 typedef struct _DEBUG_EVENT {
1377     DWORD dwDebugEventCode;
1378     DWORD dwProcessId;
1379     DWORD dwThreadId;
1380     union {
1381         EXCEPTION_DEBUG_INFO Exception;
1382         CREATE_THREAD_DEBUG_INFO CreateThread;
1383         CREATE_PROCESS_DEBUG_INFO CreateProcessInfo;
1384         EXIT_THREAD_DEBUG_INFO ExitThread;
1385         EXIT_PROCESS_DEBUG_INFO ExitProcess;
1386         LOAD_DLL_DEBUG_INFO LoadDll;
1387         UNLOAD_DLL_DEBUG_INFO UnloadDll;
1388         OUTPUT_DEBUG_STRING_INFO DebugString;
1389         RIP_INFO RipInfo;
1390     } u;
1391 } DEBUG_EVENT, *LPDEBUG_EVENT;
1392
1393 //
1394 // Define dynamic function table entry.
1395 //
1396
1397 typedef
1398 PRUNTIME_FUNCTION
1399 GET_RUNTIME_FUNCTION_CALLBACK (
1400     DWORD64 ControlPc,
1401     PVOID Context
1402     );
1403 typedef GET_RUNTIME_FUNCTION_CALLBACK *PGET_RUNTIME_FUNCTION_CALLBACK;
1404
1405 typedef
1406 DWORD   
1407 OUT_OF_PROCESS_FUNCTION_TABLE_CALLBACK (
1408     HANDLE Process,
1409     PVOID TableAddress,
1410     PDWORD Entries,
1411     PRUNTIME_FUNCTION* Functions
1412     );
1413 typedef OUT_OF_PROCESS_FUNCTION_TABLE_CALLBACK *POUT_OF_PROCESS_FUNCTION_TABLE_CALLBACK;
1414
1415 #define OUT_OF_PROCESS_FUNCTION_TABLE_CALLBACK_EXPORT_NAME \
1416     "OutOfProcessFunctionTableCallback"
1417
1418 #if defined(FEATURE_PAL_SXS)
1419
1420 // #if !defined(_TARGET_MAC64)
1421 // typedef LONG (*PEXCEPTION_ROUTINE)(
1422     // IN PEXCEPTION_POINTERS pExceptionPointers,
1423     // IN LPVOID lpvParam);
1424
1425 // #define DISPATCHER_CONTEXT    LPVOID
1426
1427 // #else // defined(_TARGET_MAC64)
1428
1429 //
1430 // Define unwind history table structure.
1431 //
1432
1433 #define UNWIND_HISTORY_TABLE_SIZE 12
1434
1435 typedef struct _UNWIND_HISTORY_TABLE_ENTRY {
1436     DWORD64 ImageBase;
1437     PRUNTIME_FUNCTION FunctionEntry;
1438 } UNWIND_HISTORY_TABLE_ENTRY, *PUNWIND_HISTORY_TABLE_ENTRY;
1439
1440 typedef struct _UNWIND_HISTORY_TABLE {
1441     DWORD Count;
1442     BYTE  LocalHint;
1443     BYTE  GlobalHint;
1444     BYTE  Search;
1445     BYTE  Once;
1446     DWORD64 LowAddress;
1447     DWORD64 HighAddress;
1448     UNWIND_HISTORY_TABLE_ENTRY Entry[UNWIND_HISTORY_TABLE_SIZE];
1449 } UNWIND_HISTORY_TABLE, *PUNWIND_HISTORY_TABLE;
1450
1451 typedef
1452 EXCEPTION_DISPOSITION
1453 (*PEXCEPTION_ROUTINE) (
1454     PEXCEPTION_RECORD ExceptionRecord,
1455     ULONG64 EstablisherFrame,
1456     PCONTEXT ContextRecord,
1457     PVOID DispatcherContext
1458     );
1459
1460 #if defined(_ARM_)
1461
1462 typedef struct _DISPATCHER_CONTEXT {
1463     DWORD ControlPc;
1464     DWORD ImageBase;
1465     PRUNTIME_FUNCTION FunctionEntry;
1466     DWORD EstablisherFrame;
1467     DWORD TargetPc;
1468     PCONTEXT ContextRecord;
1469     PEXCEPTION_ROUTINE LanguageHandler;
1470     PVOID HandlerData;
1471     PUNWIND_HISTORY_TABLE HistoryTable;
1472     DWORD ScopeIndex;
1473     BOOLEAN ControlPcIsUnwound;
1474     PBYTE  NonVolatileRegisters;
1475     DWORD Reserved;
1476 } DISPATCHER_CONTEXT, *PDISPATCHER_CONTEXT;
1477
1478 #elif defined(_ARM64_)
1479
1480 typedef struct _DISPATCHER_CONTEXT {
1481     ULONG64 ControlPc;
1482     ULONG64 ImageBase;
1483     PRUNTIME_FUNCTION FunctionEntry;
1484     ULONG64 EstablisherFrame;
1485     ULONG64 TargetPc;
1486     PCONTEXT ContextRecord;
1487     PEXCEPTION_ROUTINE LanguageHandler;
1488     PVOID HandlerData;
1489     PUNWIND_HISTORY_TABLE HistoryTable;
1490     ULONG64 ScopeIndex;
1491     BOOLEAN ControlPcIsUnwound;
1492     PBYTE  NonVolatileRegisters;
1493     ULONG64 Reserved;
1494 } DISPATCHER_CONTEXT, *PDISPATCHER_CONTEXT;
1495
1496 #elif defined(_AMD64_)
1497
1498 typedef struct _DISPATCHER_CONTEXT {
1499     ULONG64 ControlPc;
1500     ULONG64 ImageBase;
1501     PRUNTIME_FUNCTION FunctionEntry;
1502     ULONG64 EstablisherFrame;
1503     ULONG64 TargetIp;
1504     PCONTEXT ContextRecord;
1505     PEXCEPTION_ROUTINE LanguageHandler;
1506     PVOID HandlerData;
1507     PUNWIND_HISTORY_TABLE HistoryTable;
1508 } DISPATCHER_CONTEXT, *PDISPATCHER_CONTEXT;
1509
1510 #elif defined(_X86_)
1511
1512 typedef struct _EXCEPTION_REGISTRATION_RECORD {
1513     struct _EXCEPTION_REGISTRATION_RECORD *Next;
1514     PEXCEPTION_ROUTINE Handler;
1515 } EXCEPTION_REGISTRATION_RECORD;
1516
1517 typedef struct _DISPATCHER_CONTEXT {
1518     DWORD ControlPc;
1519     DWORD ImageBase;
1520     PRUNTIME_FUNCTION FunctionEntry;
1521     DWORD EstablisherFrame;
1522     DWORD TargetIp;
1523     PCONTEXT ContextRecord;
1524     PEXCEPTION_ROUTINE LanguageHandler;
1525     PVOID HandlerData;
1526     PUNWIND_HISTORY_TABLE HistoryTable;
1527 } DISPATCHER_CONTEXT, *PDISPATCHER_CONTEXT;
1528
1529 #else
1530
1531 #error Unknown architecture for defining DISPATCHER_CONTEXT.
1532
1533 #endif
1534
1535 // #endif // !defined(_TARGET_MAC64)
1536
1537 typedef DISPATCHER_CONTEXT *PDISPATCHER_CONTEXT;
1538
1539 #define ExceptionContinueSearch     EXCEPTION_CONTINUE_SEARCH
1540 #define ExceptionStackUnwind        EXCEPTION_EXECUTE_HANDLER
1541 #define ExceptionContinueExecution  EXCEPTION_CONTINUE_EXECUTION
1542
1543 #endif // FEATURE_PAL_SXS
1544
1545 typedef struct _EXCEPTION_REGISTRATION_RECORD EXCEPTION_REGISTRATION_RECORD;
1546 typedef EXCEPTION_REGISTRATION_RECORD *PEXCEPTION_REGISTRATION_RECORD;
1547
1548 typedef LPVOID HKEY;
1549 typedef LPVOID PACL;
1550 typedef LPVOID LPBC;
1551 typedef LPVOID PSECURITY_DESCRIPTOR;
1552
1553 typedef struct _EXCEPTION_RECORD64 {
1554     DWORD ExceptionCode;
1555     ULONG ExceptionFlags;
1556     ULONG64 ExceptionRecord;
1557     ULONG64 ExceptionAddress;
1558     ULONG NumberParameters;
1559     ULONG __unusedAlignment;
1560     ULONG64 ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
1561 } EXCEPTION_RECORD64, *PEXCEPTION_RECORD64;
1562
1563 typedef LONG (WINAPI *PTOP_LEVEL_EXCEPTION_FILTER)(
1564     IN struct _EXCEPTION_POINTERS *ExceptionInfo
1565     );
1566 typedef PTOP_LEVEL_EXCEPTION_FILTER LPTOP_LEVEL_EXCEPTION_FILTER;
1567
1568 /******************* ntdef ************************************/
1569
1570 #ifndef ANYSIZE_ARRAY
1571 #define ANYSIZE_ARRAY 1       // winnt
1572 #endif
1573
1574 /******************* winnt ************************************/
1575
1576 typedef struct LIST_ENTRY32 {
1577     ULONG Flink;
1578     ULONG Blink;
1579 } LIST_ENTRY32;
1580 typedef LIST_ENTRY32 *PLIST_ENTRY32;
1581
1582 typedef struct LIST_ENTRY64 {
1583     ULONGLONG Flink;
1584     ULONGLONG Blink;
1585 } LIST_ENTRY64;
1586 typedef LIST_ENTRY64 *PLIST_ENTRY64;
1587
1588 /******************** PAL RT APIs *******************************/
1589
1590 typedef struct _HSATELLITE *HSATELLITE;
1591
1592 EXTERN_C HSATELLITE PALAPI PAL_LoadSatelliteResourceW(LPCWSTR SatelliteResourceFileName);
1593 EXTERN_C HSATELLITE PALAPI PAL_LoadSatelliteResourceA(LPCSTR SatelliteResourceFileName);
1594 EXTERN_C BOOL PALAPI PAL_FreeSatelliteResource(HSATELLITE SatelliteResource);
1595 EXTERN_C UINT PALAPI PAL_LoadSatelliteStringW(HSATELLITE SatelliteResource,
1596              UINT uID,
1597              LPWSTR lpBuffer,
1598              UINT nBufferMax);
1599 EXTERN_C UINT PALAPI PAL_LoadSatelliteStringA(HSATELLITE SatelliteResource,
1600              UINT uID,
1601              LPSTR lpBuffer,
1602              UINT nBufferMax);
1603
1604 EXTERN_C HRESULT PALAPI PAL_CoCreateInstance(REFCLSID   rclsid,
1605                              REFIID     riid,
1606                              void     **ppv);
1607
1608 // So we can have CoCreateInstance in most of the code base, 
1609 // instead of spreading around of if'def FEATURE_PALs for PAL_CoCreateInstance.
1610 #define CoCreateInstance(rclsid, pUnkOuter, dwClsContext, riid, ppv) PAL_CoCreateInstance(rclsid, riid, ppv)
1611
1612 /************** verrsrc.h ************************************/
1613
1614 /* ----- VS_VERSION.dwFileFlags ----- */
1615 #define VS_FF_DEBUG             0x00000001L
1616 #define VS_FF_PRERELEASE        0x00000002L
1617 #define VS_FF_PATCHED           0x00000004L
1618 #define VS_FF_PRIVATEBUILD      0x00000008L
1619 #define VS_FF_INFOINFERRED      0x00000010L
1620 #define VS_FF_SPECIALBUILD      0x00000020L
1621
1622 /* ----- Types and structures ----- */
1623 typedef struct tagVS_FIXEDFILEINFO
1624 {
1625     DWORD   dwSignature;            /* e.g. 0xfeef04bd */
1626     DWORD   dwStrucVersion;         /* e.g. 0x00000042 = "0.42" */
1627     DWORD   dwFileVersionMS;        /* e.g. 0x00030075 = "3.75" */
1628     DWORD   dwFileVersionLS;        /* e.g. 0x00000031 = "0.31" */
1629     DWORD   dwProductVersionMS;     /* e.g. 0x00030010 = "3.10" */
1630     DWORD   dwProductVersionLS;     /* e.g. 0x00000031 = "0.31" */
1631     DWORD   dwFileFlagsMask;        /* = 0x3F for version "0.42" */
1632     DWORD   dwFileFlags;            /* e.g. VFF_DEBUG | VFF_PRERELEASE */
1633     DWORD   dwFileOS;               /* e.g. VOS_DOS_WINDOWS16 */
1634     DWORD   dwFileType;             /* e.g. VFT_DRIVER */
1635     DWORD   dwFileSubtype;          /* e.g. VFT2_DRV_KEYBOARD */
1636     DWORD   dwFileDateMS;           /* e.g. 0 */
1637     DWORD   dwFileDateLS;           /* e.g. 0 */
1638 } VS_FIXEDFILEINFO;
1639
1640 /************** Byte swapping & unaligned access ******************/
1641
1642 #include <pal_endian.h>
1643
1644 /******************** external includes *************************/
1645
1646 #include "ntimage.h"
1647 #ifndef PAL_STDCPP_COMPAT
1648 #include "cpp/ccombstr.h"
1649 #include "cpp/cstring.h"
1650 #endif // !PAL_STDCPP_COMPAT
1651 #include "sscli_version.h"
1652
1653 #endif // RC_INVOKED
1654
1655 #endif // __PALRT_H__