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.
7 // ===========================================================================
10 // ===========================================================================
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.
32 /******************* HRESULTs *********************************************/
35 #define _HRESULT_TYPEDEF_(_sc) _sc
37 #define _HRESULT_TYPEDEF_(_sc) ((HRESULT)_sc)
40 #define S_OK _HRESULT_TYPEDEF_(0x00000000L)
41 #define S_FALSE _HRESULT_TYPEDEF_(0x00000001L)
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)
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)
61 #define CLASS_E_CLASSNOTAVAILABLE _HRESULT_TYPEDEF_(0x80040111L)
62 #define CLASS_E_NOAGGREGATION _HRESULT_TYPEDEF_(0x80040110L)
64 #define CO_E_CLASSSTRING _HRESULT_TYPEDEF_(0x800401F3L)
66 #define URL_E_INVALID_SYNTAX _HRESULT_TYPEDEF_(0x80041001L)
67 #define MK_E_SYNTAX _HRESULT_TYPEDEF_(0x800401E4L)
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)
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)
93 #define CRYPT_E_HASH_VALUE _HRESULT_TYPEDEF_(0x80091007L)
95 #define TYPE_E_SIZETOOBIG _HRESULT_TYPEDEF_(0x800288C5L)
96 #define TYPE_E_DUPLICATEID _HRESULT_TYPEDEF_(0x800288C6L)
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)
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)
117 #define DBG_PRINTEXCEPTION_C _HRESULT_TYPEDEF_(0x40010006L)
119 /********************** errorrep.h ****************************************/
121 typedef enum tagEFaultRepRetVal
131 frrvErrAnotherInstance
134 /**************************************************************************/
140 #ifndef PAL_STDCPP_COMPAT
142 #ifndef __PLACEMENT_NEW_INLINE
143 #define __PLACEMENT_NEW_INLINE
144 inline void *__cdecl operator new(size_t, void *_P)
148 #endif // __PLACEMENT_NEW_INLINE
149 #endif // __cplusplus
150 #endif // !PAL_STDCPP_COMPAT
152 #include <pal_assert.h>
155 #define ROTOR_PAL_CTOR_TEST_BODY(TESTNAME) \
156 class TESTNAME ## _CTOR_TEST { \
158 class HelperClass { \
160 HelperClass(const char *String) { \
161 _ASSERTE (m_s == NULL); \
165 void Validate (const char *String) { \
167 _ASSERTE (m_s == String); \
168 _ASSERTE (!strncmp ( \
178 TESTNAME ## _CTOR_TEST() { \
179 _ASSERTE (m_This == NULL); \
184 _ASSERTE (m_This == this); \
185 m_String.Validate(#TESTNAME "_CTOR_TEST"); \
190 static HelperClass m_String; \
193 static TESTNAME ## _CTOR_TEST \
194 g_ ## TESTNAME ## _CTOR_TEST; \
195 TESTNAME ## _CTOR_TEST::HelperClass \
196 TESTNAME ## _CTOR_TEST::m_String(#TESTNAME "_CTOR_TEST");
198 #define ROTOR_PAL_CTOR_TEST_RUN(TESTNAME) \
199 g_ ## TESTNAME ##_CTOR_TEST.Validate()
203 #define ROTOR_PAL_CTOR_TEST_BODY(TESTNAME)
204 #define ROTOR_PAL_CTOR_TEST_RUN(TESTNAME) do {} while (0)
208 #define NTAPI __stdcall
209 #define WINAPI __stdcall
210 #define CALLBACK __stdcall
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)
220 // As we have numerous examples of this behavior in our codebase,
221 // making an offsetof which doesn't use 0.
223 // PAL_safe_offsetof is a version of offsetof that protects against an
224 // overridden operator&
226 #if defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 5 || __GNUC__ > 3)
227 #define FIELD_OFFSET(type, field) __builtin_offsetof(type, field)
229 #define offsetof(type, field) __builtin_offsetof(type, field)
231 #define PAL_safe_offsetof(type, field) __builtin_offsetof(type, field)
233 #define FIELD_OFFSET(type, field) (((LONG)(LONG_PTR)&(((type *)64)->field)) - 64)
235 #define offsetof(s,m) ((size_t)((ptrdiff_t)&(((s *)64)->m)) - 64)
237 #define PAL_safe_offsetof(s,m) ((size_t)((ptrdiff_t)&(char&)(((s *)64)->m))-64)
240 #define CONTAINING_RECORD(address, type, field) \
241 ((type *)((LONG_PTR)(address) - FIELD_OFFSET(type, field)))
243 #define ARGUMENT_PRESENT(ArgumentPointer) (\
244 (CHAR *)(ArgumentPointer) != (CHAR *)(NULL) )
247 #define MAX_NATURAL_ALIGNMENT sizeof(ULONGLONG)
249 #define MAX_NATURAL_ALIGNMENT sizeof(ULONG)
252 #define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name
254 #ifndef COM_NO_WINDOWS_H
255 #define COM_NO_WINDOWS_H
258 #define interface struct
260 #define STDMETHODCALLTYPE __stdcall
261 #define STDMETHODVCALLTYPE __cdecl
263 #define STDAPICALLTYPE __stdcall
264 #define STDAPIVCALLTYPE __cdecl
266 #define STDMETHODIMP HRESULT STDMETHODCALLTYPE
267 #define STDMETHODIMP_(type) type STDMETHODCALLTYPE
269 #define STDMETHODIMPV HRESULT STDMETHODVCALLTYPE
270 #define STDMETHODIMPV_(type) type STDMETHODVCALLTYPE
272 #define STDMETHOD(method) virtual HRESULT STDMETHODCALLTYPE method
273 #define STDMETHOD_(type,method) virtual type STDMETHODCALLTYPE method
275 #define STDMETHODV(method) virtual HRESULT STDMETHODVCALLTYPE method
276 #define STDMETHODV_(type,method) virtual type STDMETHODVCALLTYPE method
278 #define STDAPI EXTERN_C HRESULT STDAPICALLTYPE
279 #define STDAPI_(type) EXTERN_C type STDAPICALLTYPE
281 #define STDAPIV EXTERN_C HRESULT STDAPIVCALLTYPE
282 #define STDAPIV_(type) EXTERN_C type STDAPIVCALLTYPE
288 #ifndef _DECLSPEC_DEFINED_
289 #define _DECLSPEC_DEFINED_
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))
300 #define DECLSPEC_NOVTABLE
301 #define DECLSPEC_IMPORT
302 #define DECLSPEC_SELECTANY
305 #endif // !_DECLSPEC_DEFINED_
307 #define DECLARE_INTERFACE(iface) interface DECLSPEC_NOVTABLE iface
308 #define DECLARE_INTERFACE_(iface, baseiface) interface DECLSPEC_NOVTABLE iface : public baseiface
311 #define REFGUID const GUID &
313 #define REFGUID const GUID *
316 EXTERN_C const GUID GUID_NULL;
318 typedef GUID *LPGUID;
319 typedef const GUID FAR *LPCGUID;
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); }
333 #endif // __cplusplus
335 #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
336 EXTERN_C const GUID FAR name
340 #define REFIID const IID &
342 #define REFIID const IID *
344 #define IID_NULL GUID_NULL
345 #define IsEqualIID(riid1, riid2) IsEqualGUID(riid1, riid2)
347 #define __IID_DEFINED__
350 #define CLSID_DEFINED
352 #define REFCLSID const CLSID &
354 #define REFCLSID const CLSID *
356 #define CLSID_NULL GUID_NULL
357 #define IsEqualCLSID(rclsid1, rclsid2) IsEqualGUID(rclsid1, rclsid2)
358 typedef CLSID *LPCLSID;
360 typedef UINT_PTR WPARAM;
361 typedef LONG_PTR LRESULT;
366 typedef union _ULARGE_INTEGER {
376 #ifndef PAL_STDCPP_COMPAT
378 #endif // PAL_STDCPP_COMPAT
381 } ULARGE_INTEGER, *PULARGE_INTEGER;
383 /******************* HRESULT types ****************************************/
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
411 #define SEVERITY_SUCCESS 0
412 #define SEVERITY_ERROR 1
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)
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))) )
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)
434 #define HRESULT_FROM_NT(x) ((HRESULT) ((x) | FACILITY_NT_BIT))
436 /******************* OLE, BSTR, VARIANT *************************/
438 STDAPI_(LPVOID) CoTaskMemAlloc(SIZE_T cb);
439 STDAPI_(LPVOID) CoTaskMemRealloc(LPVOID pv, SIZE_T cb);
440 STDAPI_(void) CoTaskMemFree(LPVOID pv);
442 typedef SHORT VARIANT_BOOL;
443 #define VARIANT_TRUE ((VARIANT_BOOL)-1)
444 #define VARIANT_FALSE ((VARIANT_BOOL)0)
446 typedef WCHAR OLECHAR;
447 typedef OLECHAR* LPOLESTR;
448 typedef const OLECHAR* LPCOLESTR;
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);
461 typedef union tagCY {
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
480 // The wReserved overlaps with Variant's vt member
508 } DECIMAL, *LPDECIMAL;
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; }
520 #define DECIMAL_SETZERO(dec) {DECIMAL_LO32(dec) = 0; DECIMAL_MID32(dec) = 0; DECIMAL_HI32(dec) = 0; DECIMAL_SIGNSCALE(dec) = 0;}
522 typedef struct tagBLOB {
528 interface IRecordInfo;
530 typedef unsigned short VARTYPE;
572 VT_STREAMED_OBJECT = 68,
573 VT_STORED_OBJECT = 69,
584 typedef struct tagVARIANT VARIANT, *LPVARIANT;
585 typedef struct tagSAFEARRAY SAFEARRAY;
594 // We need to make sure vt overlaps with DECIMAL's wReserved.
595 // See the DECIMAL type for details.
612 VARIANT_BOOL boolVal;
617 interface IUnknown *punkVal;
618 interface IDispatch *pdispVal;
626 VARIANT_BOOL *pboolVal;
631 interface IUnknown **ppunkVal;
650 interface IRecordInfo *pRecInfo;
658 typedef VARIANT VARIANTARG, *LPVARIANTARG;
660 STDAPI_(void) VariantInit(VARIANT * pvarg);
661 STDAPI_(HRESULT) VariantClear(VARIANT * pvarg);
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)
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)
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)
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)
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)
722 #define V_DECIMAL(X) ((X)->n1.decVal)
723 #define V_DECIMALREF(X) V_UNION(X, pdecVal)
725 #define V_ISBYREF(X) (V_VT(X)&VT_BYREF)
727 STDAPI CreateStreamOnHGlobal(PVOID hGlobal, BOOL fDeleteOnRelease, interface IStream** ppstm);
729 #define STGM_DIRECT 0x00000000L
731 #define STGM_READ 0x00000000L
732 #define STGM_WRITE 0x00000001L
733 #define STGM_READWRITE 0x00000002L
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
740 #define STGM_DELETEONRELEASE 0x04000000L
742 #define STGM_CREATE 0x00001000L
743 #define STGM_CONVERT 0x00020000L
744 #define STGM_FAILIFTHERE 0x00000000L
746 #define STGM_NOSNAPSHOT 0x00200000L
748 STDAPI IIDFromString(LPOLESTR lpsz, IID* lpiid);
749 STDAPI_(int) StringFromGUID2(REFGUID rguid, LPOLESTR lpsz, int cchMax);
751 /******************* CRYPT **************************************/
753 #define PUBLICKEYBLOB 0x6
756 // Algorithm IDs and Flags
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))
762 typedef unsigned int ALG_ID;
765 #define ALG_CLASS_SIGNATURE (1 << 13)
766 #define ALG_CLASS_HASH (4 << 13)
769 #define ALG_TYPE_ANY (0)
772 #define ALG_SID_SHA1 4
774 // algorithm identifier definitions
775 #define CALG_SHA1 (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA1)
777 /******************* NLS ****************************************/
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
796 #define LCMAP_LOWERCASE 0x00000100
797 #define LCMAP_UPPERCASE 0x00000200
798 #define LCMAP_SORTKEY 0x00000400
799 #define LCMAP_BYTEREV 0x00000800
801 #define LCMAP_HIRAGANA 0x00100000
802 #define LCMAP_KATAKANA 0x00200000
803 #define LCMAP_HALFWIDTH 0x00400000
804 #define LCMAP_FULLWIDTH 0x00800000
806 #define LCMAP_LINGUISTIC_CASING 0x01000000
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
816 #define LOCALE_SCOUNTRY 0x00000006
817 #define LOCALE_SENGCOUNTRY 0x00001002
819 #define LOCALE_SLANGUAGE 0x00000002
820 #define LOCALE_SENGLANGUAGE 0x00001001
822 #define LOCALE_SDATE 0x0000001D
823 #define LOCALE_STIME 0x0000001E
825 #define CSTR_LESS_THAN 1
827 #define CSTR_GREATER_THAN 3
829 #define NORM_IGNORENONSPACE 0x00000002
831 #define WC_COMPOSITECHECK 0x00000000 // NOTE: diff from winnls.h
833 /******************* shlwapi ************************************/
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
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);
850 #define lstrcmpW PAL_wcscmp
851 #define lstrcmpiW _wcsicmp
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
863 #define StrToInt StrToIntW
864 #define StrStrI StrStrIW
865 #define StrRChr StrRChrW
866 #define StrCatBuff StrCatBuffW
868 #define lstrcmp lstrcmpW
869 #define lstrcmpi lstrcmpiW
875 Safe CRT functions are not available (yet) on all platforms, so we use our own implementations from safecrt.h.
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
884 #define _SAFECRT__ISMBBLEAD(_Character) 0
885 #define _SAFECRT__MBSDEC(_String, _Current) (_Current - 1)
888 #include "specstrings.h"
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.
895 #define _wcslwr_s _wcslwr_unsafe
896 #define swscanf_s swscanf
898 #define _wfopen_s _wfopen_unsafe
899 #define fopen_s _fopen_unsafe
901 #define _strlwr_s _strlwr_unsafe
903 #define _vscprintf _vscprintf_unsafe
907 #include <safemath.h>
909 inline errno_t __cdecl _wcslwr_unsafe(WCHAR *str, size_t sz)
912 if(!ClrSafeInt<size_t>::multiply(sz, sizeof(WCHAR), fullSize))
914 WCHAR *copy = (WCHAR *)malloc(fullSize);
918 errno_t retCode = wcscpy_s(copy, sz, str);
925 wcscpy_s(str, sz, copy);
930 inline errno_t __cdecl _strlwr_unsafe(char *str, size_t sz)
932 char *copy = (char *)malloc(sz);
936 errno_t retCode = strcpy_s(copy, sz, str);
943 strcpy_s(str, sz, copy);
949 inline int __cdecl _vscprintf_unsafe(const char *_Format, va_list _ArgList)
955 char *buf = (char *)malloc(guess * sizeof(char));
960 va_copy(argListCopy, _ArgList);
961 int ret = _vsnprintf_s(buf, guess, _TRUNCATE, _Format, argListCopy);
965 if ((ret != -1) && (ret < guess))
972 inline errno_t __cdecl _wfopen_unsafe(PAL_FILE * *ff, const WCHAR *fileName, const WCHAR *mode)
974 PAL_FILE *result = _wfopen(fileName, mode);
983 inline errno_t __cdecl _fopen_unsafe(PAL_FILE * *ff, const char *fileName, const char *mode)
985 PAL_FILE *result = PAL_fopen(fileName, mode);
995 #endif /* __cplusplus */
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);
1014 STDAPI PathCreateFromUrlW(LPCWSTR pszUrl, LPWSTR pszPath, LPDWORD pcchPath, DWORD dwFlags);
1015 STDAPI_(BOOL) PathIsURLW(LPCWSTR pszPath);
1018 #define URL_UNESCAPE 0x10000000
1019 #define URL_ESCAPE_PERCENT 0x00001000
1026 URL_PART_SCHEME = 1,
1027 URL_PART_HOSTNAME = 2,
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);
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
1056 #define PathCreateFromUrl PathCreateFromUrlW
1057 #define PathIsURL PathIsURLW
1059 #define UrlCanonicalize UrlCanonicalizeW
1060 #define UrlCombine UrlCombineW
1061 #define UrlEscape UrlEscapeW
1062 #define UrlUnescape UrlUnescapeW
1063 #define UrlIs UrlIsW
1064 #define UrlGetPart UrlGetPartW
1068 /******************* misc ***************************************/
1073 typedef decltype(nullptr) nullptr_t;
1078 typename std::remove_reference<T>::type&& move( T&& t );
1079 #endif // __cplusplus
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)
1092 typedef DWORD OLE_COLOR;
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];
1105 #define PF_COMPARE_EXCHANGE_DOUBLE 2
1107 typedef VOID (NTAPI * WAITORTIMERCALLBACKFUNC) (PVOID, BOOLEAN );
1109 typedef HANDLE HWND;
1111 #define IS_TEXT_UNICODE_SIGNATURE 0x0008
1112 #define IS_TEXT_UNICODE_UNICODE_MASK 0x000F
1114 BOOL IsTextUnicode(CONST VOID* lpv, int iSize, LPINT lpiResult);
1116 typedef struct _LIST_ENTRY {
1117 struct _LIST_ENTRY *Flink;
1118 struct _LIST_ENTRY *Blink;
1119 } LIST_ENTRY, *PLIST_ENTRY;
1121 typedef VOID (__stdcall *WAITORTIMERCALLBACK)(PVOID, BOOLEAN);
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:
1127 // int get_scratch_register() {
1128 // #if defined(_TARGET_X86_)
1130 // #elif defined(_TARGET_AMD64_)
1132 // #elif defined(_TARGET_ARM_)
1135 // PORTABILITY_ASSERT("scratch register");
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.
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.
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).
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.
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)
1162 // Ports in progress - run-time asserts only
1163 #define PORTABILITY_WARNING(message)
1164 #define PORTABILITY_ASSERT(message) _ASSERTE(false && message)
1167 #define UNREFERENCED_PARAMETER(P) (void)(P)
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)
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)
1183 #ifdef _TARGET_AMD64_
1184 #define RUNTIME_FUNCTION_INDIRECT 0x1
1187 #define _ReturnAddress() __builtin_return_address(0)
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
1207 #ifndef IMAGE_IMPORT_DESC_FIELD
1208 #define IMAGE_IMPORT_DESC_FIELD(img, f) ((img).u.f)
1211 #ifndef IMAGE_COR20_HEADER_FIELD
1212 #define IMAGE_COR20_HEADER_FIELD(obj, f) ((obj).f)
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
1230 #define PROCESSOR_ARCHITECTURE_UNKNOWN 0xFFFF
1233 // JIT Debugging Info. This structure is defined to have constant size in
1234 // both the emulated and native environment.
1237 typedef struct _JIT_DEBUG_INFO {
1239 DWORD dwProcessorArchitecture;
1242 ULONG64 lpExceptionAddress;
1243 ULONG64 lpExceptionRecord;
1244 ULONG64 lpContextRecord;
1245 } JIT_DEBUG_INFO, *LPJIT_DEBUG_INFO;
1247 typedef JIT_DEBUG_INFO JIT_DEBUG_INFO32, *LPJIT_DEBUG_INFO32;
1248 typedef JIT_DEBUG_INFO JIT_DEBUG_INFO64, *LPJIT_DEBUG_INFO64;
1250 /******************* resources ***************************************/
1252 #define MAKEINTRESOURCEW(i) ((LPWSTR)((ULONG_PTR)((WORD)(i))))
1253 #define RT_RCDATA MAKEINTRESOURCE(10)
1254 #define RT_VERSION MAKEINTRESOURCE(16)
1256 /******************* SAFEARRAY ************************/
1258 #define FADF_VARIANT ( 0x800 )
1260 typedef struct tagSAFEARRAYBOUND
1266 typedef struct tagSAFEARRAYBOUND *LPSAFEARRAYBOUND;
1268 typedef struct tagSAFEARRAY
1275 SAFEARRAYBOUND rgsabound[ 1 ];
1278 typedef SAFEARRAY *LPSAFEARRAY;
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);
1290 EXTERN_C void * _stdcall _lfind(const void *, const void *, unsigned int *, unsigned int,
1291 int (__cdecl *)(const void *, const void *));
1294 /*<TODO>****************** clean this up ***********************</TODO>*/
1297 interface IDispatch;
1298 interface ITypeInfo;
1302 typedef VOID (WINAPI *LPOVERLAPPED_COMPLETION_ROUTINE)(
1304 DWORD dwNumberOfBytesTransfered,
1305 LPVOID lpOverlapped);
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
1320 typedef struct _EXCEPTION_DEBUG_INFO {
1321 EXCEPTION_RECORD ExceptionRecord;
1322 DWORD dwFirstChance;
1323 } EXCEPTION_DEBUG_INFO, *LPEXCEPTION_DEBUG_INFO;
1325 typedef struct _CREATE_THREAD_DEBUG_INFO {
1327 LPVOID lpThreadLocalBase;
1328 LPTHREAD_START_ROUTINE lpStartAddress;
1329 } CREATE_THREAD_DEBUG_INFO, *LPCREATE_THREAD_DEBUG_INFO;
1331 typedef struct _CREATE_PROCESS_DEBUG_INFO {
1335 LPVOID lpBaseOfImage;
1336 DWORD dwDebugInfoFileOffset;
1337 DWORD nDebugInfoSize;
1338 LPVOID lpThreadLocalBase;
1339 LPTHREAD_START_ROUTINE lpStartAddress;
1342 } CREATE_PROCESS_DEBUG_INFO, *LPCREATE_PROCESS_DEBUG_INFO;
1344 typedef struct _EXIT_THREAD_DEBUG_INFO {
1346 } EXIT_THREAD_DEBUG_INFO, *LPEXIT_THREAD_DEBUG_INFO;
1348 typedef struct _EXIT_PROCESS_DEBUG_INFO {
1350 } EXIT_PROCESS_DEBUG_INFO, *LPEXIT_PROCESS_DEBUG_INFO;
1352 typedef struct _LOAD_DLL_DEBUG_INFO {
1355 DWORD dwDebugInfoFileOffset;
1356 DWORD nDebugInfoSize;
1359 } LOAD_DLL_DEBUG_INFO, *LPLOAD_DLL_DEBUG_INFO;
1361 typedef struct _UNLOAD_DLL_DEBUG_INFO {
1363 } UNLOAD_DLL_DEBUG_INFO, *LPUNLOAD_DLL_DEBUG_INFO;
1365 typedef struct _OUTPUT_DEBUG_STRING_INFO {
1366 LPSTR lpDebugStringData;
1368 WORD nDebugStringLength;
1369 } OUTPUT_DEBUG_STRING_INFO, *LPOUTPUT_DEBUG_STRING_INFO;
1371 typedef struct _RIP_INFO {
1374 } RIP_INFO, *LPRIP_INFO;
1376 typedef struct _DEBUG_EVENT {
1377 DWORD dwDebugEventCode;
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;
1391 } DEBUG_EVENT, *LPDEBUG_EVENT;
1394 // Define dynamic function table entry.
1399 GET_RUNTIME_FUNCTION_CALLBACK (
1403 typedef GET_RUNTIME_FUNCTION_CALLBACK *PGET_RUNTIME_FUNCTION_CALLBACK;
1407 OUT_OF_PROCESS_FUNCTION_TABLE_CALLBACK (
1411 PRUNTIME_FUNCTION* Functions
1413 typedef OUT_OF_PROCESS_FUNCTION_TABLE_CALLBACK *POUT_OF_PROCESS_FUNCTION_TABLE_CALLBACK;
1415 #define OUT_OF_PROCESS_FUNCTION_TABLE_CALLBACK_EXPORT_NAME \
1416 "OutOfProcessFunctionTableCallback"
1418 #if defined(FEATURE_PAL_SXS)
1420 // #if !defined(_TARGET_MAC64)
1421 // typedef LONG (*PEXCEPTION_ROUTINE)(
1422 // IN PEXCEPTION_POINTERS pExceptionPointers,
1423 // IN LPVOID lpvParam);
1425 // #define DISPATCHER_CONTEXT LPVOID
1427 // #else // defined(_TARGET_MAC64)
1430 // Define unwind history table structure.
1433 #define UNWIND_HISTORY_TABLE_SIZE 12
1435 typedef struct _UNWIND_HISTORY_TABLE_ENTRY {
1437 PRUNTIME_FUNCTION FunctionEntry;
1438 } UNWIND_HISTORY_TABLE_ENTRY, *PUNWIND_HISTORY_TABLE_ENTRY;
1440 typedef struct _UNWIND_HISTORY_TABLE {
1447 DWORD64 HighAddress;
1448 UNWIND_HISTORY_TABLE_ENTRY Entry[UNWIND_HISTORY_TABLE_SIZE];
1449 } UNWIND_HISTORY_TABLE, *PUNWIND_HISTORY_TABLE;
1452 EXCEPTION_DISPOSITION
1453 (*PEXCEPTION_ROUTINE) (
1454 PEXCEPTION_RECORD ExceptionRecord,
1455 ULONG64 EstablisherFrame,
1456 PCONTEXT ContextRecord,
1457 PVOID DispatcherContext
1462 typedef struct _DISPATCHER_CONTEXT {
1465 PRUNTIME_FUNCTION FunctionEntry;
1466 DWORD EstablisherFrame;
1468 PCONTEXT ContextRecord;
1469 PEXCEPTION_ROUTINE LanguageHandler;
1471 PUNWIND_HISTORY_TABLE HistoryTable;
1473 BOOLEAN ControlPcIsUnwound;
1474 PBYTE NonVolatileRegisters;
1476 } DISPATCHER_CONTEXT, *PDISPATCHER_CONTEXT;
1478 #elif defined(_ARM64_)
1480 typedef struct _DISPATCHER_CONTEXT {
1483 PRUNTIME_FUNCTION FunctionEntry;
1484 ULONG64 EstablisherFrame;
1486 PCONTEXT ContextRecord;
1487 PEXCEPTION_ROUTINE LanguageHandler;
1489 PUNWIND_HISTORY_TABLE HistoryTable;
1491 BOOLEAN ControlPcIsUnwound;
1492 PBYTE NonVolatileRegisters;
1494 } DISPATCHER_CONTEXT, *PDISPATCHER_CONTEXT;
1496 #elif defined(_AMD64_)
1498 typedef struct _DISPATCHER_CONTEXT {
1501 PRUNTIME_FUNCTION FunctionEntry;
1502 ULONG64 EstablisherFrame;
1504 PCONTEXT ContextRecord;
1505 PEXCEPTION_ROUTINE LanguageHandler;
1507 PUNWIND_HISTORY_TABLE HistoryTable;
1508 } DISPATCHER_CONTEXT, *PDISPATCHER_CONTEXT;
1510 #elif defined(_X86_)
1512 typedef struct _EXCEPTION_REGISTRATION_RECORD {
1513 struct _EXCEPTION_REGISTRATION_RECORD *Next;
1514 PEXCEPTION_ROUTINE Handler;
1515 } EXCEPTION_REGISTRATION_RECORD;
1517 typedef struct _DISPATCHER_CONTEXT {
1520 PRUNTIME_FUNCTION FunctionEntry;
1521 DWORD EstablisherFrame;
1523 PCONTEXT ContextRecord;
1524 PEXCEPTION_ROUTINE LanguageHandler;
1526 PUNWIND_HISTORY_TABLE HistoryTable;
1527 } DISPATCHER_CONTEXT, *PDISPATCHER_CONTEXT;
1531 #error Unknown architecture for defining DISPATCHER_CONTEXT.
1535 // #endif // !defined(_TARGET_MAC64)
1537 typedef DISPATCHER_CONTEXT *PDISPATCHER_CONTEXT;
1539 #define ExceptionContinueSearch EXCEPTION_CONTINUE_SEARCH
1540 #define ExceptionStackUnwind EXCEPTION_EXECUTE_HANDLER
1541 #define ExceptionContinueExecution EXCEPTION_CONTINUE_EXECUTION
1543 #endif // FEATURE_PAL_SXS
1545 typedef struct _EXCEPTION_REGISTRATION_RECORD EXCEPTION_REGISTRATION_RECORD;
1546 typedef EXCEPTION_REGISTRATION_RECORD *PEXCEPTION_REGISTRATION_RECORD;
1548 typedef LPVOID HKEY;
1549 typedef LPVOID PACL;
1550 typedef LPVOID LPBC;
1551 typedef LPVOID PSECURITY_DESCRIPTOR;
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;
1563 typedef LONG (WINAPI *PTOP_LEVEL_EXCEPTION_FILTER)(
1564 IN struct _EXCEPTION_POINTERS *ExceptionInfo
1566 typedef PTOP_LEVEL_EXCEPTION_FILTER LPTOP_LEVEL_EXCEPTION_FILTER;
1568 /******************* ntdef ************************************/
1570 #ifndef ANYSIZE_ARRAY
1571 #define ANYSIZE_ARRAY 1 // winnt
1574 /******************* winnt ************************************/
1576 typedef struct LIST_ENTRY32 {
1580 typedef LIST_ENTRY32 *PLIST_ENTRY32;
1582 typedef struct LIST_ENTRY64 {
1586 typedef LIST_ENTRY64 *PLIST_ENTRY64;
1588 /******************** PAL RT APIs *******************************/
1590 typedef struct _HSATELLITE *HSATELLITE;
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,
1599 EXTERN_C UINT PALAPI PAL_LoadSatelliteStringA(HSATELLITE SatelliteResource,
1604 EXTERN_C HRESULT PALAPI PAL_CoCreateInstance(REFCLSID rclsid,
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)
1612 /************** verrsrc.h ************************************/
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
1622 /* ----- Types and structures ----- */
1623 typedef struct tagVS_FIXEDFILEINFO
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 */
1640 /************** Byte swapping & unaligned access ******************/
1642 #include <pal_endian.h>
1644 /******************** external includes *************************/
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"
1653 #endif // RC_INVOKED
1655 #endif // __PALRT_H__