summaryrefslogtreecommitdiff
path: root/src/pal/inc/rt/palrt.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/pal/inc/rt/palrt.h')
-rw-r--r--src/pal/inc/rt/palrt.h1805
1 files changed, 1805 insertions, 0 deletions
diff --git a/src/pal/inc/rt/palrt.h b/src/pal/inc/rt/palrt.h
new file mode 100644
index 0000000000..336a13f529
--- /dev/null
+++ b/src/pal/inc/rt/palrt.h
@@ -0,0 +1,1805 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+//
+
+//
+// ===========================================================================
+// File: palrt.h
+//
+// ===========================================================================
+
+/*++
+
+
+Abstract:
+
+ Rotor runtime functions. These are functions which are ordinarily
+ implemented as part of the Win32 API set, but for Rotor, are
+ implemented as a runtime library on top of the PAL.
+
+Author:
+
+
+
+Revision History:
+
+--*/
+
+#ifndef __PALRT_H__
+#define __PALRT_H__
+
+/******************* HRESULTs *********************************************/
+
+#ifdef RC_INVOKED
+#define _HRESULT_TYPEDEF_(_sc) _sc
+#else // RC_INVOKED
+#define _HRESULT_TYPEDEF_(_sc) ((HRESULT)_sc)
+#endif // RC_INVOKED
+
+#define S_OK _HRESULT_TYPEDEF_(0x00000000L)
+#define S_FALSE _HRESULT_TYPEDEF_(0x00000001L)
+
+#define E_NOTIMPL _HRESULT_TYPEDEF_(0x80004001L)
+#define E_NOINTERFACE _HRESULT_TYPEDEF_(0x80004002L)
+#define E_UNEXPECTED _HRESULT_TYPEDEF_(0x8000FFFFL)
+#define E_OUTOFMEMORY _HRESULT_TYPEDEF_(0x8007000EL)
+#define E_INVALIDARG _HRESULT_TYPEDEF_(0x80070057L)
+#define E_POINTER _HRESULT_TYPEDEF_(0x80004003L)
+#define E_HANDLE _HRESULT_TYPEDEF_(0x80070006L)
+#define E_ABORT _HRESULT_TYPEDEF_(0x80004004L)
+#define E_FAIL _HRESULT_TYPEDEF_(0x80004005L)
+#define E_ACCESSDENIED _HRESULT_TYPEDEF_(0x80070005L)
+#define E_PENDING _HRESULT_TYPEDEF_(0x8000000AL)
+
+#define DISP_E_PARAMNOTFOUND _HRESULT_TYPEDEF_(0x80020004L)
+#define DISP_E_TYPEMISMATCH _HRESULT_TYPEDEF_(0x80020005L)
+#define DISP_E_BADVARTYPE _HRESULT_TYPEDEF_(0x80020008L)
+#define DISP_E_OVERFLOW _HRESULT_TYPEDEF_(0x8002000AL)
+#define DISP_E_DIVBYZERO _HRESULT_TYPEDEF_(0x80020012L)
+
+#define CLASS_E_CLASSNOTAVAILABLE _HRESULT_TYPEDEF_(0x80040111L)
+#define CLASS_E_NOAGGREGATION _HRESULT_TYPEDEF_(0x80040110L)
+
+#define CO_E_CLASSSTRING _HRESULT_TYPEDEF_(0x800401F3L)
+
+#define URL_E_INVALID_SYNTAX _HRESULT_TYPEDEF_(0x80041001L)
+#define MK_E_SYNTAX _HRESULT_TYPEDEF_(0x800401E4L)
+
+#define STG_E_INVALIDFUNCTION _HRESULT_TYPEDEF_(0x80030001L)
+#define STG_E_FILENOTFOUND _HRESULT_TYPEDEF_(0x80030002L)
+#define STG_E_PATHNOTFOUND _HRESULT_TYPEDEF_(0x80030003L)
+#define STG_E_WRITEFAULT _HRESULT_TYPEDEF_(0x8003001DL)
+#define STG_E_FILEALREADYEXISTS _HRESULT_TYPEDEF_(0x80030050L)
+#define STG_E_ABNORMALAPIEXIT _HRESULT_TYPEDEF_(0x800300FAL)
+
+#define NTE_BAD_UID _HRESULT_TYPEDEF_(0x80090001L)
+#define NTE_BAD_HASH _HRESULT_TYPEDEF_(0x80090002L)
+#define NTE_BAD_KEY _HRESULT_TYPEDEF_(0x80090003L)
+#define NTE_BAD_LEN _HRESULT_TYPEDEF_(0x80090004L)
+#define NTE_BAD_DATA _HRESULT_TYPEDEF_(0x80090005L)
+#define NTE_BAD_SIGNATURE _HRESULT_TYPEDEF_(0x80090006L)
+#define NTE_BAD_VER _HRESULT_TYPEDEF_(0x80090007L)
+#define NTE_BAD_ALGID _HRESULT_TYPEDEF_(0x80090008L)
+#define NTE_BAD_FLAGS _HRESULT_TYPEDEF_(0x80090009L)
+#define NTE_BAD_TYPE _HRESULT_TYPEDEF_(0x8009000AL)
+#define NTE_BAD_KEY_STATE _HRESULT_TYPEDEF_(0x8009000BL)
+#define NTE_BAD_HASH_STATE _HRESULT_TYPEDEF_(0x8009000CL)
+#define NTE_NO_KEY _HRESULT_TYPEDEF_(0x8009000DL)
+#define NTE_NO_MEMORY _HRESULT_TYPEDEF_(0x8009000EL)
+#define NTE_SIGNATURE_FILE_BAD _HRESULT_TYPEDEF_(0x8009001CL)
+#define NTE_FAIL _HRESULT_TYPEDEF_(0x80090020L)
+
+#define CRYPT_E_HASH_VALUE _HRESULT_TYPEDEF_(0x80091007L)
+
+#define TYPE_E_SIZETOOBIG _HRESULT_TYPEDEF_(0x800288C5L)
+#define TYPE_E_DUPLICATEID _HRESULT_TYPEDEF_(0x800288C6L)
+
+#define STD_CTL_SCODE(n) MAKE_SCODE(SEVERITY_ERROR, FACILITY_CONTROL, n)
+#define CTL_E_OVERFLOW STD_CTL_SCODE(6)
+#define CTL_E_OUTOFMEMORY STD_CTL_SCODE(7)
+#define CTL_E_DIVISIONBYZERO STD_CTL_SCODE(11)
+#define CTL_E_OUTOFSTACKSPACE STD_CTL_SCODE(28)
+#define CTL_E_FILENOTFOUND STD_CTL_SCODE(53)
+#define CTL_E_DEVICEIOERROR STD_CTL_SCODE(57)
+#define CTL_E_PERMISSIONDENIED STD_CTL_SCODE(70)
+#define CTL_E_PATHFILEACCESSERROR STD_CTL_SCODE(75)
+#define CTL_E_PATHNOTFOUND STD_CTL_SCODE(76)
+
+#define INET_E_CANNOT_CONNECT _HRESULT_TYPEDEF_(0x800C0004L)
+#define INET_E_RESOURCE_NOT_FOUND _HRESULT_TYPEDEF_(0x800C0005L)
+#define INET_E_OBJECT_NOT_FOUND _HRESULT_TYPEDEF_(0x800C0006L)
+#define INET_E_DATA_NOT_AVAILABLE _HRESULT_TYPEDEF_(0x800C0007L)
+#define INET_E_DOWNLOAD_FAILURE _HRESULT_TYPEDEF_(0x800C0008L)
+#define INET_E_CONNECTION_TIMEOUT _HRESULT_TYPEDEF_(0x800C000BL)
+#define INET_E_UNKNOWN_PROTOCOL _HRESULT_TYPEDEF_(0x800C000DL)
+
+#define DBG_PRINTEXCEPTION_C _HRESULT_TYPEDEF_(0x40010006L)
+
+/********************** errorrep.h ****************************************/
+
+typedef enum tagEFaultRepRetVal
+{
+ frrvOk = 0,
+ frrvOkManifest,
+ frrvOkQueued,
+ frrvErr,
+ frrvErrNoDW,
+ frrvErrTimeout,
+ frrvLaunchDebugger,
+ frrvOkHeadless,
+ frrvErrAnotherInstance
+} EFaultRepRetVal;
+
+/**************************************************************************/
+
+#ifndef RC_INVOKED
+
+#include "pal.h"
+
+#ifndef PAL_STDCPP_COMPAT
+#ifdef __cplusplus
+#ifndef __PLACEMENT_NEW_INLINE
+#define __PLACEMENT_NEW_INLINE
+inline void *__cdecl operator new(size_t, void *_P)
+{
+ return (_P);
+}
+#endif // __PLACEMENT_NEW_INLINE
+#endif // __cplusplus
+#endif // !PAL_STDCPP_COMPAT
+
+#include <pal_assert.h>
+
+#if defined(_DEBUG)
+#define ROTOR_PAL_CTOR_TEST_BODY(TESTNAME) \
+ class TESTNAME ## _CTOR_TEST { \
+ public: \
+ class HelperClass { \
+ public: \
+ HelperClass(const char *String) { \
+ _ASSERTE (m_s == NULL); \
+ m_s = String; \
+ } \
+ \
+ void Validate (const char *String) { \
+ _ASSERTE (m_s); \
+ _ASSERTE (m_s == String); \
+ _ASSERTE (!strncmp ( \
+ m_s, \
+ String, \
+ 1000)); \
+ } \
+ \
+ private: \
+ const char *m_s; \
+ }; \
+ \
+ TESTNAME ## _CTOR_TEST() { \
+ _ASSERTE (m_This == NULL); \
+ m_This = this; \
+ } \
+ \
+ void Validate () { \
+ _ASSERTE (m_This == this); \
+ m_String.Validate(#TESTNAME "_CTOR_TEST"); \
+ } \
+ \
+ private: \
+ void *m_This; \
+ static HelperClass m_String; \
+ }; \
+ \
+ static TESTNAME ## _CTOR_TEST \
+ g_ ## TESTNAME ## _CTOR_TEST; \
+ TESTNAME ## _CTOR_TEST::HelperClass \
+ TESTNAME ## _CTOR_TEST::m_String(#TESTNAME "_CTOR_TEST");
+
+#define ROTOR_PAL_CTOR_TEST_RUN(TESTNAME) \
+ g_ ## TESTNAME ##_CTOR_TEST.Validate()
+
+#else // DEBUG
+
+#define ROTOR_PAL_CTOR_TEST_BODY(TESTNAME)
+#define ROTOR_PAL_CTOR_TEST_RUN(TESTNAME) do {} while (0)
+
+#endif // DEBUG
+
+#define NTAPI __stdcall
+#define WINAPI __stdcall
+#define CALLBACK __stdcall
+#define NTSYSAPI
+
+#define _WINNT_
+
+// C++ standard, 18.1.5 - offsetof requires a POD (plain old data) struct or
+// union. Since offsetof is a macro, gcc doesn't actually check for improper
+// use of offsetof, it keys off of the -> from NULL (which is also invalid for
+// non-POD types by 18.1.5)
+//
+// As we have numerous examples of this behavior in our codebase,
+// making an offsetof which doesn't use 0.
+
+// PAL_safe_offsetof is a version of offsetof that protects against an
+// overridden operator&
+
+#if defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 5 || __GNUC__ > 3)
+#define FIELD_OFFSET(type, field) __builtin_offsetof(type, field)
+#ifndef offsetof
+#define offsetof(type, field) __builtin_offsetof(type, field)
+#endif
+#define PAL_safe_offsetof(type, field) __builtin_offsetof(type, field)
+#else
+#define FIELD_OFFSET(type, field) (((LONG)(LONG_PTR)&(((type *)64)->field)) - 64)
+#ifndef offsetof
+#define offsetof(s,m) ((size_t)((ptrdiff_t)&(((s *)64)->m)) - 64)
+#endif
+#define PAL_safe_offsetof(s,m) ((size_t)((ptrdiff_t)&(char&)(((s *)64)->m))-64)
+#endif
+
+#define CONTAINING_RECORD(address, type, field) \
+ ((type *)((LONG_PTR)(address) - FIELD_OFFSET(type, field)))
+
+#define ARGUMENT_PRESENT(ArgumentPointer) (\
+ (CHAR *)(ArgumentPointer) != (CHAR *)(NULL) )
+
+#if defined(_WIN64) || defined(_M_ALPHA)
+#define MAX_NATURAL_ALIGNMENT sizeof(ULONGLONG)
+#else
+#define MAX_NATURAL_ALIGNMENT sizeof(ULONG)
+#endif
+
+#define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name
+
+#ifndef COM_NO_WINDOWS_H
+#define COM_NO_WINDOWS_H
+#endif
+
+#define interface struct
+
+#define STDMETHODCALLTYPE __stdcall
+#define STDMETHODVCALLTYPE __cdecl
+
+#define STDAPICALLTYPE __stdcall
+#define STDAPIVCALLTYPE __cdecl
+
+#define STDMETHODIMP HRESULT STDMETHODCALLTYPE
+#define STDMETHODIMP_(type) type STDMETHODCALLTYPE
+
+#define STDMETHODIMPV HRESULT STDMETHODVCALLTYPE
+#define STDMETHODIMPV_(type) type STDMETHODVCALLTYPE
+
+#define STDMETHOD(method) virtual HRESULT STDMETHODCALLTYPE method
+#define STDMETHOD_(type,method) virtual type STDMETHODCALLTYPE method
+
+#define STDMETHODV(method) virtual HRESULT STDMETHODVCALLTYPE method
+#define STDMETHODV_(type,method) virtual type STDMETHODVCALLTYPE method
+
+#define STDAPI EXTERN_C HRESULT STDAPICALLTYPE
+#define STDAPI_(type) EXTERN_C type STDAPICALLTYPE
+
+#define STDAPIV EXTERN_C HRESULT STDAPIVCALLTYPE
+#define STDAPIV_(type) EXTERN_C type STDAPIVCALLTYPE
+
+#define PURE = 0
+#define THIS_
+#define THIS void
+
+#ifndef _DECLSPEC_DEFINED_
+#define _DECLSPEC_DEFINED_
+
+#if defined(_MSC_VER)
+#define DECLSPEC_NOVTABLE __declspec(novtable)
+#define DECLSPEC_IMPORT __declspec(dllimport)
+#define DECLSPEC_SELECTANY __declspec(selectany)
+#elif defined(__GNUC__)
+#define DECLSPEC_NOVTABLE
+#define DECLSPEC_IMPORT
+#define DECLSPEC_SELECTANY __attribute__((weak))
+#else
+#define DECLSPEC_NOVTABLE
+#define DECLSPEC_IMPORT
+#define DECLSPEC_SELECTANY
+#endif
+
+#endif // !_DECLSPEC_DEFINED_
+
+#define DECLARE_INTERFACE(iface) interface DECLSPEC_NOVTABLE iface
+#define DECLARE_INTERFACE_(iface, baseiface) interface DECLSPEC_NOVTABLE iface : public baseiface
+
+#ifdef __cplusplus
+#define REFGUID const GUID &
+#else
+#define REFGUID const GUID *
+#endif
+
+EXTERN_C const GUID GUID_NULL;
+
+typedef GUID *LPGUID;
+typedef const GUID FAR *LPCGUID;
+
+#ifdef __cplusplus
+extern "C++" {
+#if !defined _SYS_GUID_OPERATOR_EQ_ && !defined _NO_SYS_GUID_OPERATOR_EQ_
+#define _SYS_GUID_OPERATOR_EQ_
+inline int IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
+ { return !memcmp(&rguid1, &rguid2, sizeof(GUID)); }
+inline int operator==(REFGUID guidOne, REFGUID guidOther)
+ { return IsEqualGUID(guidOne,guidOther); }
+inline int operator!=(REFGUID guidOne, REFGUID guidOther)
+ { return !IsEqualGUID(guidOne,guidOther); }
+#endif
+};
+#endif // __cplusplus
+
+#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
+ EXTERN_C const GUID FAR name
+
+typedef GUID IID;
+#ifdef __cplusplus
+#define REFIID const IID &
+#else
+#define REFIID const IID *
+#endif
+#define IID_NULL GUID_NULL
+#define IsEqualIID(riid1, riid2) IsEqualGUID(riid1, riid2)
+
+#define __IID_DEFINED__
+
+typedef GUID CLSID;
+#define CLSID_DEFINED
+#ifdef __cplusplus
+#define REFCLSID const CLSID &
+#else
+#define REFCLSID const CLSID *
+#endif
+#define CLSID_NULL GUID_NULL
+#define IsEqualCLSID(rclsid1, rclsid2) IsEqualGUID(rclsid1, rclsid2)
+typedef CLSID *LPCLSID;
+
+typedef UINT_PTR WPARAM;
+typedef LONG_PTR LRESULT;
+
+typedef LONG SCODE;
+
+
+typedef union _ULARGE_INTEGER {
+ struct {
+#if BIGENDIAN
+ DWORD HighPart;
+ DWORD LowPart;
+#else
+ DWORD LowPart;
+ DWORD HighPart;
+#endif
+ }
+#ifndef PAL_STDCPP_COMPAT
+ u
+#endif // PAL_STDCPP_COMPAT
+ ;
+ ULONGLONG QuadPart;
+} ULARGE_INTEGER, *PULARGE_INTEGER;
+
+/******************* HRESULT types ****************************************/
+
+#define FACILITY_WINDOWS 8
+#define FACILITY_URT 19
+#define FACILITY_UMI 22
+#define FACILITY_SXS 23
+#define FACILITY_STORAGE 3
+#define FACILITY_SSPI 9
+#define FACILITY_SCARD 16
+#define FACILITY_SETUPAPI 15
+#define FACILITY_SECURITY 9
+#define FACILITY_RPC 1
+#define FACILITY_WIN32 7
+#define FACILITY_CONTROL 10
+#define FACILITY_NULL 0
+#define FACILITY_MSMQ 14
+#define FACILITY_MEDIASERVER 13
+#define FACILITY_INTERNET 12
+#define FACILITY_ITF 4
+#define FACILITY_DPLAY 21
+#define FACILITY_DISPATCH 2
+#define FACILITY_COMPLUS 17
+#define FACILITY_CERT 11
+#define FACILITY_ACS 20
+#define FACILITY_AAF 18
+
+#define NO_ERROR 0L
+
+#define SEVERITY_SUCCESS 0
+#define SEVERITY_ERROR 1
+
+#define SUCCEEDED(Status) ((HRESULT)(Status) >= 0)
+#define FAILED(Status) ((HRESULT)(Status)<0)
+#define IS_ERROR(Status) ((ULONG)(Status) >> 31 == SEVERITY_ERROR) // diff from win32
+#define HRESULT_CODE(hr) ((hr) & 0xFFFF)
+#define SCODE_CODE(sc) ((sc) & 0xFFFF)
+#define HRESULT_FACILITY(hr) (((hr) >> 16) & 0x1fff)
+#define SCODE_FACILITY(sc) (((sc) >> 16) & 0x1fff)
+#define HRESULT_SEVERITY(hr) (((hr) >> 31) & 0x1)
+#define SCODE_SEVERITY(sc) (((sc) >> 31) & 0x1)
+
+// both macros diff from Win32
+#define MAKE_HRESULT(sev,fac,code) \
+ ((HRESULT) (((ULONG)(sev)<<31) | ((ULONG)(fac)<<16) | ((ULONG)(code))) )
+#define MAKE_SCODE(sev,fac,code) \
+ ((SCODE) (((ULONG)(sev)<<31) | ((ULONG)(fac)<<16) | ((LONG)(code))) )
+
+#define FACILITY_NT_BIT 0x10000000
+#define HRESULT_FROM_WIN32(x) ((HRESULT)(x) <= 0 ? ((HRESULT)(x)) : ((HRESULT) (((x) & 0x0000FFFF) | (FACILITY_WIN32 << 16) | 0x80000000)))
+#define __HRESULT_FROM_WIN32(x) HRESULT_FROM_WIN32(x)
+
+#define HRESULT_FROM_NT(x) ((HRESULT) ((x) | FACILITY_NT_BIT))
+
+/******************* OLE, BSTR, VARIANT *************************/
+
+STDAPI_(LPVOID) CoTaskMemAlloc(SIZE_T cb);
+STDAPI_(LPVOID) CoTaskMemRealloc(LPVOID pv, SIZE_T cb);
+STDAPI_(void) CoTaskMemFree(LPVOID pv);
+
+typedef SHORT VARIANT_BOOL;
+#define VARIANT_TRUE ((VARIANT_BOOL)-1)
+#define VARIANT_FALSE ((VARIANT_BOOL)0)
+
+typedef WCHAR OLECHAR;
+typedef OLECHAR* LPOLESTR;
+typedef const OLECHAR* LPCOLESTR;
+
+typedef WCHAR *BSTR;
+
+STDAPI_(BSTR) SysAllocString(const OLECHAR*);
+STDAPI_(BSTR) SysAllocStringLen(const OLECHAR*, UINT);
+STDAPI_(BSTR) SysAllocStringByteLen(const char *, UINT);
+STDAPI_(void) SysFreeString(BSTR);
+STDAPI_(UINT) SysStringLen(BSTR);
+STDAPI_(UINT) SysStringByteLen(BSTR);
+
+typedef double DATE;
+
+typedef union tagCY {
+ struct {
+#if BIGENDIAN
+ LONG Hi;
+ ULONG Lo;
+#else
+ ULONG Lo;
+ LONG Hi;
+#endif
+ } u;
+ LONGLONG int64;
+} CY, *LPCY;
+
+typedef CY CURRENCY;
+
+typedef struct tagDEC {
+ // Decimal.cs treats the first two shorts as one long
+ // And they seriable the data so we need to little endian
+ // seriliazation
+ // The wReserved overlaps with Variant's vt member
+#if BIGENDIAN
+ union {
+ struct {
+ BYTE sign;
+ BYTE scale;
+ } u;
+ USHORT signscale;
+ } u;
+ USHORT wReserved;
+#else
+ USHORT wReserved;
+ union {
+ struct {
+ BYTE scale;
+ BYTE sign;
+ } u;
+ USHORT signscale;
+ } u;
+#endif
+ ULONG Hi32;
+ union {
+ struct {
+ ULONG Lo32;
+ ULONG Mid32;
+ } v;
+ ULONGLONG Lo64;
+ } v;
+} DECIMAL, *LPDECIMAL;
+
+#define DECIMAL_NEG ((BYTE)0x80)
+#define DECIMAL_SCALE(dec) ((dec).u.u.scale)
+#define DECIMAL_SIGN(dec) ((dec).u.u.sign)
+#define DECIMAL_SIGNSCALE(dec) ((dec).u.signscale)
+#define DECIMAL_LO32(dec) ((dec).v.v.Lo32)
+#define DECIMAL_MID32(dec) ((dec).v.v.Mid32)
+#define DECIMAL_HI32(dec) ((dec).Hi32)
+#define DECIMAL_LO64_GET(dec) ((dec).v.Lo64)
+#define DECIMAL_LO64_SET(dec,value) {(dec).v.Lo64 = value; }
+
+#define DECIMAL_SETZERO(dec) {DECIMAL_LO32(dec) = 0; DECIMAL_MID32(dec) = 0; DECIMAL_HI32(dec) = 0; DECIMAL_SIGNSCALE(dec) = 0;}
+
+typedef struct tagBLOB {
+ ULONG cbSize;
+ BYTE *pBlobData;
+} BLOB, *LPBLOB;
+
+interface IStream;
+interface IRecordInfo;
+
+typedef unsigned short VARTYPE;
+
+enum VARENUM {
+ VT_EMPTY = 0,
+ VT_NULL = 1,
+ VT_I2 = 2,
+ VT_I4 = 3,
+ VT_R4 = 4,
+ VT_R8 = 5,
+ VT_CY = 6,
+ VT_DATE = 7,
+ VT_BSTR = 8,
+ VT_DISPATCH = 9,
+ VT_ERROR = 10,
+ VT_BOOL = 11,
+ VT_VARIANT = 12,
+ VT_UNKNOWN = 13,
+ VT_DECIMAL = 14,
+ VT_I1 = 16,
+ VT_UI1 = 17,
+ VT_UI2 = 18,
+ VT_UI4 = 19,
+ VT_I8 = 20,
+ VT_UI8 = 21,
+ VT_INT = 22,
+ VT_UINT = 23,
+ VT_VOID = 24,
+ VT_HRESULT = 25,
+ VT_PTR = 26,
+ VT_SAFEARRAY = 27,
+ VT_CARRAY = 28,
+ VT_USERDEFINED = 29,
+ VT_LPSTR = 30,
+ VT_LPWSTR = 31,
+ VT_RECORD = 36,
+ VT_INT_PTR = 37,
+ VT_UINT_PTR = 38,
+
+ VT_FILETIME = 64,
+ VT_BLOB = 65,
+ VT_STREAM = 66,
+ VT_STORAGE = 67,
+ VT_STREAMED_OBJECT = 68,
+ VT_STORED_OBJECT = 69,
+ VT_BLOB_OBJECT = 70,
+ VT_CF = 71,
+ VT_CLSID = 72,
+
+ VT_VECTOR = 0x1000,
+ VT_ARRAY = 0x2000,
+ VT_BYREF = 0x4000,
+ VT_TYPEMASK = 0xfff,
+};
+
+typedef struct tagVARIANT VARIANT, *LPVARIANT;
+typedef struct tagSAFEARRAY SAFEARRAY;
+
+struct tagVARIANT
+ {
+ union
+ {
+ struct
+ {
+#if BIGENDIAN
+ // We need to make sure vt overlaps with DECIMAL's wReserved.
+ // See the DECIMAL type for details.
+ WORD wReserved1;
+ VARTYPE vt;
+#else
+ VARTYPE vt;
+ WORD wReserved1;
+#endif
+ WORD wReserved2;
+ WORD wReserved3;
+ union
+ {
+ LONGLONG llVal;
+ LONG lVal;
+ BYTE bVal;
+ SHORT iVal;
+ FLOAT fltVal;
+ DOUBLE dblVal;
+ VARIANT_BOOL boolVal;
+ SCODE scode;
+ CY cyVal;
+ DATE date;
+ BSTR bstrVal;
+ interface IUnknown *punkVal;
+ interface IDispatch *pdispVal;
+ SAFEARRAY *parray;
+ BYTE *pbVal;
+ SHORT *piVal;
+ LONG *plVal;
+ LONGLONG *pllVal;
+ FLOAT *pfltVal;
+ DOUBLE *pdblVal;
+ VARIANT_BOOL *pboolVal;
+ SCODE *pscode;
+ CY *pcyVal;
+ DATE *pdate;
+ BSTR *pbstrVal;
+ interface IUnknown **ppunkVal;
+ VARIANT *pvarVal;
+ PVOID byref;
+ CHAR cVal;
+ USHORT uiVal;
+ ULONG ulVal;
+ ULONGLONG ullVal;
+ INT intVal;
+ UINT uintVal;
+ DECIMAL *pdecVal;
+ CHAR *pcVal;
+ USHORT *puiVal;
+ ULONG *pulVal;
+ ULONGLONG *pullVal;
+ INT *pintVal;
+ UINT *puintVal;
+ struct __tagBRECORD
+ {
+ PVOID pvRecord;
+ interface IRecordInfo *pRecInfo;
+ } brecVal;
+ } n3;
+ } n2;
+ DECIMAL decVal;
+ } n1;
+ };
+
+typedef VARIANT VARIANTARG, *LPVARIANTARG;
+
+STDAPI_(void) VariantInit(VARIANT * pvarg);
+STDAPI_(HRESULT) VariantClear(VARIANT * pvarg);
+
+#define V_VT(X) ((X)->n1.n2.vt)
+#define V_UNION(X, Y) ((X)->n1.n2.n3.Y)
+#define V_RECORDINFO(X) ((X)->n1.n2.n3.brecVal.pRecInfo)
+#define V_RECORD(X) ((X)->n1.n2.n3.brecVal.pvRecord)
+
+#define V_UI1(X) V_UNION(X, bVal)
+#define V_UI1REF(X) V_UNION(X, pbVal)
+#define V_I2(X) V_UNION(X, iVal)
+#define V_I2REF(X) V_UNION(X, piVal)
+#define V_I4(X) V_UNION(X, lVal)
+#define V_I4REF(X) V_UNION(X, plVal)
+#define V_I8(X) V_UNION(X, llVal)
+#define V_I8REF(X) V_UNION(X, pllVal)
+#define V_R4(X) V_UNION(X, fltVal)
+#define V_R4REF(X) V_UNION(X, pfltVal)
+#define V_R8(X) V_UNION(X, dblVal)
+#define V_R8REF(X) V_UNION(X, pdblVal)
+#define V_I1(X) V_UNION(X, cVal)
+#define V_I1REF(X) V_UNION(X, pcVal)
+#define V_UI2(X) V_UNION(X, uiVal)
+#define V_UI2REF(X) V_UNION(X, puiVal)
+#define V_UI4(X) V_UNION(X, ulVal)
+#define V_UI4REF(X) V_UNION(X, pulVal)
+#define V_UI8(X) V_UNION(X, ullVal)
+#define V_UI8REF(X) V_UNION(X, pullVal)
+#define V_INT(X) V_UNION(X, intVal)
+#define V_INTREF(X) V_UNION(X, pintVal)
+#define V_UINT(X) V_UNION(X, uintVal)
+#define V_UINTREF(X) V_UNION(X, puintVal)
+#define V_ARRAY(X) V_UNION(X, parray)
+
+#ifdef _WIN64
+#define V_INT_PTR(X) V_UNION(X, llVal)
+#define V_UINT_PTR(X) V_UNION(X, ullVal)
+#define V_INT_PTRREF(X) V_UNION(X, pllVal)
+#define V_UINT_PTRREF(X) V_UNION(X, pullVal)
+#else
+#define V_INT_PTR(X) V_UNION(X, lVal)
+#define V_UINT_PTR(X) V_UNION(X, ulVal)
+#define V_INT_PTRREF(X) V_UNION(X, plVal)
+#define V_UINT_PTRREF(X) V_UNION(X, pulVal)
+#endif
+
+#define V_CY(X) V_UNION(X, cyVal)
+#define V_CYREF(X) V_UNION(X, pcyVal)
+#define V_DATE(X) V_UNION(X, date)
+#define V_DATEREF(X) V_UNION(X, pdate)
+#define V_BSTR(X) V_UNION(X, bstrVal)
+#define V_BSTRREF(X) V_UNION(X, pbstrVal)
+#define V_UNKNOWN(X) V_UNION(X, punkVal)
+#define V_UNKNOWNREF(X) V_UNION(X, ppunkVal)
+#define V_VARIANTREF(X) V_UNION(X, pvarVal)
+#define V_DISPATCH(X) V_UNION(X, pdispVal)
+#define V_ERROR(X) V_UNION(X, scode)
+#define V_ERRORREF(X) V_UNION(X, pscode)
+#define V_BOOL(X) V_UNION(X, boolVal)
+#define V_BOOLREF(X) V_UNION(X, pboolVal)
+#define V_BYREF(X) V_UNION(X, byref)
+
+#define V_DECIMAL(X) ((X)->n1.decVal)
+#define V_DECIMALREF(X) V_UNION(X, pdecVal)
+
+#define V_ISBYREF(X) (V_VT(X)&VT_BYREF)
+
+STDAPI CreateStreamOnHGlobal(PVOID hGlobal, BOOL fDeleteOnRelease, interface IStream** ppstm);
+
+#define STGM_DIRECT 0x00000000L
+
+#define STGM_READ 0x00000000L
+#define STGM_WRITE 0x00000001L
+#define STGM_READWRITE 0x00000002L
+
+#define STGM_SHARE_DENY_NONE 0x00000040L
+#define STGM_SHARE_DENY_READ 0x00000030L
+#define STGM_SHARE_DENY_WRITE 0x00000020L
+#define STGM_SHARE_EXCLUSIVE 0x00000010L
+
+#define STGM_DELETEONRELEASE 0x04000000L
+
+#define STGM_CREATE 0x00001000L
+#define STGM_CONVERT 0x00020000L
+#define STGM_FAILIFTHERE 0x00000000L
+
+#define STGM_NOSNAPSHOT 0x00200000L
+
+STDAPI IIDFromString(LPOLESTR lpsz, IID* lpiid);
+STDAPI_(int) StringFromGUID2(REFGUID rguid, LPOLESTR lpsz, int cchMax);
+
+/******************* CRYPT **************************************/
+
+#define PUBLICKEYBLOB 0x6
+
+//
+// Algorithm IDs and Flags
+//
+#define GET_ALG_CLASS(x) (x & (7 << 13))
+#define GET_ALG_TYPE(x) (x & (15 << 9))
+#define GET_ALG_SID(x) (x & (511))
+
+typedef unsigned int ALG_ID;
+
+// Algorithm classes
+#define ALG_CLASS_SIGNATURE (1 << 13)
+#define ALG_CLASS_HASH (4 << 13)
+
+// Algorithm types
+#define ALG_TYPE_ANY (0)
+
+// Hash sub ids
+#define ALG_SID_SHA1 4
+
+// algorithm identifier definitions
+#define CALG_SHA1 (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA1)
+
+/******************* NLS ****************************************/
+
+typedef
+enum tagMIMECONTF {
+ MIMECONTF_MAILNEWS = 0x1,
+ MIMECONTF_BROWSER = 0x2,
+ MIMECONTF_MINIMAL = 0x4,
+ MIMECONTF_IMPORT = 0x8,
+ MIMECONTF_SAVABLE_MAILNEWS = 0x100,
+ MIMECONTF_SAVABLE_BROWSER = 0x200,
+ MIMECONTF_EXPORT = 0x400,
+ MIMECONTF_PRIVCONVERTER = 0x10000,
+ MIMECONTF_VALID = 0x20000,
+ MIMECONTF_VALID_NLS = 0x40000,
+ MIMECONTF_MIME_IE4 = 0x10000000,
+ MIMECONTF_MIME_LATEST = 0x20000000,
+ MIMECONTF_MIME_REGISTRY = 0x40000000
+ } MIMECONTF;
+
+#define LCMAP_LOWERCASE 0x00000100
+#define LCMAP_UPPERCASE 0x00000200
+#define LCMAP_SORTKEY 0x00000400
+#define LCMAP_BYTEREV 0x00000800
+
+#define LCMAP_HIRAGANA 0x00100000
+#define LCMAP_KATAKANA 0x00200000
+#define LCMAP_HALFWIDTH 0x00400000
+#define LCMAP_FULLWIDTH 0x00800000
+
+#define LCMAP_LINGUISTIC_CASING 0x01000000
+
+// 8 characters for language
+// 8 characters for region
+// 64 characters for suffix (script)
+// 2 characters for '-' separators
+// 2 characters for prefix like "i-" or "x-"
+// 1 null termination
+#define LOCALE_NAME_MAX_LENGTH 85
+
+#define LOCALE_SCOUNTRY 0x00000006
+#define LOCALE_SENGCOUNTRY 0x00001002
+
+#define LOCALE_SLANGUAGE 0x00000002
+#define LOCALE_SENGLANGUAGE 0x00001001
+
+#define LOCALE_SDATE 0x0000001D
+#define LOCALE_STIME 0x0000001E
+
+#define CSTR_LESS_THAN 1
+#define CSTR_EQUAL 2
+#define CSTR_GREATER_THAN 3
+
+#define NORM_IGNORENONSPACE 0x00000002
+
+#define WC_COMPOSITECHECK 0x00000000 // NOTE: diff from winnls.h
+
+/******************* shlwapi ************************************/
+
+// note: diff in NULL handing and calling convetion
+#define StrCpyW PAL_wcscpy
+#define StrCpyNW lstrcpynW // note: can't be wcsncpy!
+#define StrCatW PAL_wcscat
+#define StrChrW (WCHAR*)PAL_wcschr
+#define StrCmpW PAL_wcscmp
+#define StrCmpIW _wcsicmp
+#define StrCmpNW PAL_wcsncmp
+#define StrCmpNIW _wcsnicmp
+
+STDAPI_(LPWSTR) StrNCatW(LPWSTR lpFront, LPCWSTR lpBack, int cchMax);
+STDAPI_(int) StrToIntW(LPCWSTR lpSrc);
+STDAPI_(LPWSTR) StrStrIW(LPCWSTR lpFirst, LPCWSTR lpSrch);
+STDAPI_(LPWSTR) StrRChrW(LPCWSTR lpStart, LPCWSTR lpEnd, WCHAR wMatch);
+STDAPI_(LPWSTR) StrCatBuffW(LPWSTR pszDest, LPCWSTR pszSrc, int cchDestBuffSize);
+
+#define lstrcmpW PAL_wcscmp
+#define lstrcmpiW _wcsicmp
+#define wnsprintfW _snwprintf // note: not 100% compatible (wsprintf should be subset of sprintf...)
+#define wvnsprintfW _vsnwprintf // note: not 100% compatible (wsprintf should be subset of sprintf...)
+
+#ifdef UNICODE
+#define StrCpy StrCpyW
+#define StrCpyN StrCpyNW
+#define StrCat StrCatW
+#define StrNCat StrNCatW
+#define StrChr StrChrW
+#define StrCmp StrCmpW
+#define StrCmpN StrCmpNW
+#define StrCmpI StrCmpIW
+#define StrCmpNI StrCmpNIW
+
+#define StrToInt StrToIntW
+#define StrStrI StrStrIW
+#define StrRChr StrRChrW
+#define StrCatBuff StrCatBuffW
+
+#define lstrcmp lstrcmpW
+#define lstrcmpi lstrcmpiW
+#define wnsprintf wnsprintfW
+#endif
+
+
+#ifdef __cplusplus
+/*
+ Safe CRT functions are not available (yet) on all platforms, so we use our own implementations from safecrt.h.
+*/
+#define _CRT_ALTERNATIVE_INLINES
+#define _SAFECRT_NO_INCLUDES 1
+#define _SAFECRT_USE_INLINES 1
+#define _SAFECRT_SET_ERRNO 0
+#define _SAFECRT_DEFINE_MBS_FUNCTIONS 0
+#define _SAFECRT_DEFINE_TCS_MACROS 1
+/*
+#define _SAFECRT__ISMBBLEAD(_Character) 0
+#define _SAFECRT__MBSDEC(_String, _Current) (_Current - 1)
+*/
+#include "safecrt.h"
+#include "specstrings.h"
+
+/*
+The wrappers below are simple implementations that may not be as robust as complete functions in the Secure CRT library.
+Remember to fix the errcode defintion in safecrt.h.
+*/
+
+#define _wcslwr_s _wcslwr_unsafe
+#define _snwprintf_s _snwprintf_unsafe
+#define _vsnwprintf_s _vsnwprintf_unsafe
+#define _snprintf_s _snprintf_unsafe
+#define _vsnprintf_s _vsnprintf_unsafe
+#define swscanf_s swscanf
+#define sscanf_s sscanf
+
+#define _wfopen_s _wfopen_unsafe
+#define fopen_s _fopen_unsafe
+
+#define _strlwr_s _strlwr_unsafe
+
+#define _vscprintf _vscprintf_unsafe
+#define _vscwprintf _vscwprintf_unsafe
+
+#define sprintf_s _snprintf
+#define swprintf_s _snwprintf
+#define vsprintf_s _vsnprintf
+#define vswprintf_s _vsnwprintf
+
+extern "C++" {
+
+#include <safemath.h>
+
+inline errno_t __cdecl _wcslwr_unsafe(WCHAR *str, size_t sz)
+{
+ size_t fullSize;
+ if(!ClrSafeInt<size_t>::multiply(sz, sizeof(WCHAR), fullSize))
+ return 1;
+ WCHAR *copy = (WCHAR *)malloc(fullSize);
+ if(copy == nullptr)
+ return 1;
+
+ errno_t retCode = wcscpy_s(copy, sz, str);
+ if(retCode) {
+ free(copy);
+ return 1;
+ }
+
+ _wcslwr(copy);
+ wcscpy_s(str, sz, copy);
+ free(copy);
+
+ return 0;
+}
+inline errno_t __cdecl _strlwr_unsafe(char *str, size_t sz)
+{
+ char *copy = (char *)malloc(sz);
+ if(copy == nullptr)
+ return 1;
+
+ errno_t retCode = strcpy_s(copy, sz, str);
+ if(retCode) {
+ free(copy);
+ return 1;
+ }
+
+ _strlwr(copy);
+ strcpy_s(str, sz, copy);
+ free(copy);
+
+ return 0;
+}
+
+inline int __cdecl _vscprintf_unsafe(const char *_Format, va_list _ArgList)
+{
+ int guess = 10;
+
+ for (;;)
+ {
+ char *buf = (char *)malloc(guess * sizeof(char));
+ if(buf == nullptr)
+ return 0;
+
+ int ret = _vsnprintf(buf, guess, _Format, _ArgList);
+ free(buf);
+
+ if ((ret != -1) && (ret < guess))
+ return ret;
+
+ guess *= 2;
+ }
+}
+
+inline int __cdecl _vscwprintf_unsafe(const WCHAR *_Format, va_list _ArgList)
+{
+ int guess = 256;
+
+ for (;;)
+ {
+ WCHAR *buf = (WCHAR *)malloc(guess * sizeof(WCHAR));
+ if (buf == nullptr)
+ return 0;
+
+ va_list apcopy;
+ va_copy(apcopy, _ArgList);
+ int ret = _vsnwprintf(buf, guess, _Format, apcopy);
+ free(buf);
+ va_end(apcopy);
+
+ if ((ret != -1) && (ret < guess))
+ return ret;
+
+ guess *= 2;
+ }
+}
+
+inline int __cdecl _vsnwprintf_unsafe(WCHAR *_Dst, size_t _SizeInWords, size_t _Count, const WCHAR *_Format, va_list _ArgList)
+{
+ if (_Count == _TRUNCATE) _Count = _SizeInWords - 1;
+ int ret = _vsnwprintf(_Dst, _Count, _Format, _ArgList);
+ _Dst[_SizeInWords - 1] = L'\0';
+ if (ret < 0 && errno == 0)
+ {
+ errno = ERANGE;
+ }
+ return ret;
+}
+
+inline int __cdecl _snwprintf_unsafe(WCHAR *_Dst, size_t _SizeInWords, size_t _Count, const WCHAR *_Format, ...)
+{
+ int ret;
+ va_list _ArgList;
+ va_start(_ArgList, _Format);
+ ret = _vsnwprintf_unsafe(_Dst, _SizeInWords, _Count, _Format, _ArgList);
+ va_end(_ArgList);
+ return ret;
+}
+
+inline int __cdecl _vsnprintf_unsafe(char *_Dst, size_t _SizeInWords, size_t _Count, const char *_Format, va_list _ArgList)
+{
+ if (_Count == _TRUNCATE) _Count = _SizeInWords - 1;
+ int ret = _vsnprintf(_Dst, _Count, _Format, _ArgList);
+ _Dst[_SizeInWords - 1] = L'\0';
+ if (ret < 0 && errno == 0)
+ {
+ errno = ERANGE;
+ }
+ return ret;
+}
+
+inline int __cdecl _snprintf_unsafe(char *_Dst, size_t _SizeInWords, size_t _Count, const char *_Format, ...)
+{
+ int ret;
+ va_list _ArgList;
+ va_start(_ArgList, _Format);
+ ret = _vsnprintf_unsafe(_Dst, _SizeInWords, _Count, _Format, _ArgList);
+ va_end(_ArgList);
+ return ret;
+}
+
+inline errno_t __cdecl _wfopen_unsafe(PAL_FILE * *ff, const WCHAR *fileName, const WCHAR *mode)
+{
+ PAL_FILE *result = _wfopen(fileName, mode);
+ if(result == 0) {
+ return 1;
+ } else {
+ *ff = result;
+ return 0;
+ }
+}
+
+inline errno_t __cdecl _fopen_unsafe(PAL_FILE * *ff, const char *fileName, const char *mode)
+{
+ PAL_FILE *result = PAL_fopen(fileName, mode);
+ if(result == 0) {
+ return 1;
+ } else {
+ *ff = result;
+ return 0;
+ }
+}
+
+/* _itow_s */
+_SAFECRT__EXTERN_C
+errno_t __cdecl _itow_s(int _Value, WCHAR *_Dst, size_t _SizeInWords, int _Radix);
+
+#if defined(__cplusplus) && _SAFECRT_USE_CPP_OVERLOADS
+template <size_t _SizeInWords>
+inline
+errno_t __cdecl _itow_s(int _Value, WCHAR (&_Dst)[_SizeInWords], int _Radix)
+{
+ return _itow_s(_Value, _Dst, _SizeInWords, _Radix);
+}
+#endif
+
+#if _SAFECRT_USE_INLINES
+
+__inline
+errno_t __cdecl _itow_s(int _Value, WCHAR *_Dst, size_t _SizeInWords, int _Radix)
+{
+ /* validation section */
+ _SAFECRT__VALIDATE_STRING(_Dst, _SizeInWords);
+
+ /* TODO: do not write past buffer size */
+ _itow(_Value, _Dst, _Radix);
+ return 0;
+}
+
+#endif
+
+/* _i64tow_s */
+_SAFECRT__EXTERN_C
+errno_t __cdecl _i64tow_s(__int64 _Value, WCHAR *_Dst, size_t _SizeInWords, int _Radix);
+
+#if defined(__cplusplus) && _SAFECRT_USE_CPP_OVERLOADS
+template <size_t _SizeInWords>
+inline
+errno_t __cdecl _i64tow_s(__int64 _Value, WCHAR (&_Dst)[_SizeInWords], int _Radix)
+{
+ return _i64tow_s(_Value, _Dst, _SizeInWords, _Radix);
+}
+#endif
+
+#if _SAFECRT_USE_INLINES
+
+__inline
+errno_t __cdecl _i64tow_s(__int64 _Value, WCHAR *_Dst, size_t _SizeInWords, int _Radix)
+{
+ /* validation section */
+ _SAFECRT__VALIDATE_STRING(_Dst, _SizeInWords);
+
+ /* TODO: do not write past buffer size */
+ _i64tow(_Value, _Dst, _Radix);
+ return 0;
+}
+
+#endif
+
+/* getenv_s */
+/*
+ * _ReturnValue indicates if the variable has been found and size needed
+ */
+_SAFECRT__EXTERN_C
+errno_t __cdecl getenv_s(size_t *_ReturnValue, char *_Dst, size_t _SizeInWords, const char *_Name);
+
+#if defined(__cplusplus) && _SAFECRT_USE_CPP_OVERLOADS
+template <size_t _SizeInWords>
+inline
+errno_t __cdecl getenv_s(size_t *_ReturnValue, char *_Dst, size_t _SizeInWords, const char *_Name)
+{
+ return getenv_s(_ReturnValue, _Dst, _SizeInWords, _Name);
+}
+#endif
+
+#if _SAFECRT_USE_INLINES
+
+__inline
+errno_t __cdecl getenv_s(size_t *_ReturnValue, char *_Dst, size_t _SizeInWords, const char *_Name)
+{
+ char *szFound;
+
+ /* validation section */
+ _SAFECRT__VALIDATE_STRING(_Dst, _SizeInWords);
+
+ szFound = getenv(_Name);
+ if (szFound == nullptr)
+ {
+ *_ReturnValue = 0;
+ return 0;
+ }
+ *_ReturnValue = strlen(szFound) + 1;
+ return strcpy_s(_Dst, _SizeInWords, szFound);
+}
+
+#endif
+
+}
+#endif /* __cplusplus */
+
+
+STDAPI_(BOOL) PathAppendW(LPWSTR pszPath, LPCWSTR pszMore);
+STDAPI_(int) PathCommonPrefixW(LPCWSTR pszFile1, LPCWSTR pszFile2, LPWSTR pszPath);
+PALIMPORT LPWSTR PALAPI PathFindFileNameW(LPCWSTR pPath);
+STDAPI_(int) PathGetDriveNumberW(LPCWSTR lpsz);
+STDAPI_(BOOL) PathIsRelativeW(LPCWSTR lpszPath);
+STDAPI_(BOOL) PathIsUNCW(LPCWSTR pszPath);
+STDAPI_(LPWSTR) PathAddBackslashW(LPWSTR lpszPath);
+STDAPI_(LPWSTR) PathRemoveBackslashW(LPWSTR lpszPath);
+STDAPI_(void) PathRemoveExtensionW(LPWSTR pszPath);
+STDAPI_(LPWSTR) PathCombineW(LPWSTR lpszDest, LPCWSTR lpszDir, LPCWSTR lpszFile);
+STDAPI_(BOOL) PathCanonicalizeW(LPWSTR lpszDst, LPCWSTR lpszSrc);
+STDAPI_(BOOL) PathRelativePathToW(LPWSTR pszPath, LPCWSTR pszFrom, DWORD dwAttrFrom, LPCWSTR pszTo, DWORD dwAttrTo);
+STDAPI_(BOOL) PathRenameExtensionW(LPWSTR pszPath, LPCWSTR pszExt);
+STDAPI_(BOOL) PathRemoveFileSpecW(LPWSTR pFile);
+STDAPI_(void) PathStripPathW (LPWSTR pszPath);
+
+STDAPI PathCreateFromUrlW(LPCWSTR pszUrl, LPWSTR pszPath, LPDWORD pcchPath, DWORD dwFlags);
+STDAPI_(BOOL) PathIsURLW(LPCWSTR pszPath);
+
+
+#define URL_UNESCAPE 0x10000000
+#define URL_ESCAPE_PERCENT 0x00001000
+
+typedef enum {
+ URLIS_FILEURL = 3,
+} URLIS;
+
+typedef enum {
+ URL_PART_SCHEME = 1,
+ URL_PART_HOSTNAME = 2,
+} URL_PART;
+
+STDAPI UrlCanonicalizeW(LPCWSTR pszUrl, LPWSTR pszCanonicalized, LPDWORD pcchCanonicalized, DWORD dwFlags);
+STDAPI UrlCombineW(LPCWSTR pszBase, LPCWSTR pszRelative, LPWSTR pszCombined, LPDWORD pcchCombined, DWORD dwFlags);
+STDAPI UrlEscapeW(LPCWSTR pszUrl, LPWSTR pszEscaped, LPDWORD pcchEscaped, DWORD dwFlags);
+STDAPI UrlUnescapeW(LPWSTR pszURL, LPWSTR pszUnescaped, LPDWORD pcchUnescaped, DWORD dwFlags);
+STDAPI_(BOOL) UrlIsW(LPCWSTR pszUrl, URLIS dwUrlIs);
+STDAPI UrlGetPartW(LPCWSTR pszIn, LPWSTR pszOut, LPDWORD pcchOut, DWORD dwPart, DWORD dwFlags);
+
+#ifdef UNICODE
+#define PathAppend PathAppendW
+#define PathCommonPrefix PathCommonPrefixW
+#define PathFindFileName PathFindFileNameW
+#define PathIsRelative PathIsRelativeW
+#define PathGetDriveNumber PathGetDriveNumberW
+#define PathIsUNC PathIsUNCW
+#define PathAddBackslash PathAddBackslashW
+#define PathRemoveBackslash PathRemoveBackslashW
+#define PathRemoveExtension PathRemoveExtensionW
+#define PathCombine PathCombineW
+#define PathSkipRoot PathSkipRootW
+#define PathFindExtension PathFindExtensionW
+#define PathCanonicalize PathCanonicalizeW
+#define PathRelativePathTo PathRelativePathToW
+#define PathRemoveFileSpec PathRemoveFileSpecW
+#define PathRenameExtension PathRenameExtensionW
+#define PathStripPath PathStripPathW
+
+#define PathCreateFromUrl PathCreateFromUrlW
+#define PathIsURL PathIsURLW
+
+#define UrlCanonicalize UrlCanonicalizeW
+#define UrlCombine UrlCombineW
+#define UrlEscape UrlEscapeW
+#define UrlUnescape UrlUnescapeW
+#define UrlIs UrlIsW
+#define UrlGetPart UrlGetPartW
+
+#endif // UNICODE
+
+/******************* misc ***************************************/
+
+#ifdef __cplusplus
+namespace std
+{
+ typedef decltype(nullptr) nullptr_t;
+}
+
+template< class T >
+typename std::remove_reference<T>::type&& move( T&& t );
+#endif // __cplusplus
+
+#define __RPC__out
+#define __RPC__in
+#define __RPC__deref_out_opt
+#define __RPC__in_opt
+#define __RPC__inout_xcount(x)
+#define __RPC__in_ecount_full(x)
+#define __RPC__out_ecount_part(x, y)
+#define __RPC__in_xcount(x)
+#define __RPC__inout
+#define __RPC__deref_out_ecount_full_opt(x)
+
+typedef DWORD OLE_COLOR;
+
+typedef union __m128i {
+ __int8 m128i_i8[16];
+ __int16 m128i_i16[8];
+ __int32 m128i_i32[4];
+ __int64 m128i_i64[2];
+ unsigned __int8 m128i_u8[16];
+ unsigned __int16 m128i_u16[8];
+ unsigned __int32 m128i_u32[4];
+ unsigned __int64 m128i_u64[2];
+} __m128i;
+
+#define PF_COMPARE_EXCHANGE_DOUBLE 2
+
+typedef VOID (NTAPI * WAITORTIMERCALLBACKFUNC) (PVOID, BOOLEAN );
+
+typedef HANDLE HWND;
+
+#define IS_TEXT_UNICODE_SIGNATURE 0x0008
+#define IS_TEXT_UNICODE_UNICODE_MASK 0x000F
+
+BOOL IsTextUnicode(CONST VOID* lpv, int iSize, LPINT lpiResult);
+
+typedef struct _LIST_ENTRY {
+ struct _LIST_ENTRY *Flink;
+ struct _LIST_ENTRY *Blink;
+} LIST_ENTRY, *PLIST_ENTRY;
+
+typedef VOID (__stdcall *WAITORTIMERCALLBACK)(PVOID, BOOLEAN);
+
+// PORTABILITY_ASSERT and PORTABILITY_WARNING macros are meant to be used to
+// mark places in the code that needs attention for portability. The usual
+// usage pattern is:
+//
+// int get_scratch_register() {
+// #if defined(_TARGET_X86_)
+// return eax;
+// #elif defined(_TARGET_AMD64_)
+// return rax;
+// #elif defined(_TARGET_ARM_)
+// return r0;
+// #else
+// PORTABILITY_ASSERT("scratch register");
+// return 0;
+// #endif
+// }
+//
+// PORTABILITY_ASSERT is meant to be used inside functions/methods. It can
+// introduce compile-time and/or run-time errors.
+// PORTABILITY_WARNING is meant to be used outside functions/methods. It can
+// introduce compile-time errors or warnings only.
+//
+// People starting new ports will first define these to just cause run-time
+// errors. Once they fix all the places that need attention for portability,
+// they can define PORTABILITY_ASSERT and PORTABILITY_WARNING to cause
+// compile-time errors to make sure that they haven't missed anything.
+//
+// If it is reasonably possible all codepaths containing PORTABILITY_ASSERT
+// should be compilable (e.g. functions should return NULL or something if
+// they are expected to return a value).
+//
+// The message in these two macros should not contain any keywords like TODO
+// or NYI. It should be just the brief description of the problem.
+
+#if defined(_TARGET_X86_)
+// Finished ports - compile-time errors
+#define PORTABILITY_WARNING(message) NEED_TO_PORT_THIS_ONE(NEED_TO_PORT_THIS_ONE)
+#define PORTABILITY_ASSERT(message) NEED_TO_PORT_THIS_ONE(NEED_TO_PORT_THIS_ONE)
+#else
+// Ports in progress - run-time asserts only
+#define PORTABILITY_WARNING(message)
+#define PORTABILITY_ASSERT(message) _ASSERTE(false && message)
+#endif
+
+#define UNREFERENCED_PARAMETER(P) (void)(P)
+
+#ifdef BIT64
+#define VALPTR(x) VAL64(x)
+#define GET_UNALIGNED_PTR(x) GET_UNALIGNED_64(x)
+#define GET_UNALIGNED_VALPTR(x) GET_UNALIGNED_VAL64(x)
+#define SET_UNALIGNED_PTR(p,x) SET_UNALIGNED_64(p,x)
+#define SET_UNALIGNED_VALPTR(p,x) SET_UNALIGNED_VAL64(p,x)
+#else
+#define VALPTR(x) VAL32(x)
+#define GET_UNALIGNED_PTR(x) GET_UNALIGNED_32(x)
+#define GET_UNALIGNED_VALPTR(x) GET_UNALIGNED_VAL32(x)
+#define SET_UNALIGNED_PTR(p,x) SET_UNALIGNED_32(p,x)
+#define SET_UNALIGNED_VALPTR(p,x) SET_UNALIGNED_VAL32(p,x)
+#endif
+
+#ifdef _TARGET_AMD64_
+#define RUNTIME_FUNCTION_INDIRECT 0x1
+#endif
+
+#define _ReturnAddress() __builtin_return_address(0)
+
+#ifdef PLATFORM_UNIX
+#define DIRECTORY_SEPARATOR_CHAR_A '/'
+#define DIRECTORY_SEPARATOR_CHAR_W W('/')
+#define DIRECTORY_SEPARATOR_STR_A "/"
+#define DIRECTORY_SEPARATOR_STR_W W("/")
+#define PATH_SEPARATOR_CHAR_W W(':')
+#define PATH_SEPARATOR_STR_W W(":")
+#define VOLUME_SEPARATOR_CHAR_W W('/')
+#else // PLATFORM_UNIX
+#define DIRECTORY_SEPARATOR_CHAR_A '\\'
+#define DIRECTORY_SEPARATOR_CHAR_W W('\\')
+#define DIRECTORY_SEPARATOR_STR_A "\\"
+#define DIRECTORY_SEPARATOR_STR_W W("\\")
+#define PATH_SEPARATOR_CHAR_W W(';')
+#define PATH_SEPARATOR_STR_W W(";")
+#define VOLUME_SEPARATOR_CHAR_W W(':')
+#endif // PLATFORM_UNIX
+
+#ifndef IMAGE_IMPORT_DESC_FIELD
+#define IMAGE_IMPORT_DESC_FIELD(img, f) ((img).u.f)
+#endif
+
+#ifndef IMAGE_COR20_HEADER_FIELD
+#define IMAGE_COR20_HEADER_FIELD(obj, f) ((obj).f)
+#endif
+
+// copied from winnt.h
+#define PROCESSOR_ARCHITECTURE_INTEL 0
+#define PROCESSOR_ARCHITECTURE_MIPS 1
+#define PROCESSOR_ARCHITECTURE_ALPHA 2
+#define PROCESSOR_ARCHITECTURE_PPC 3
+#define PROCESSOR_ARCHITECTURE_SHX 4
+#define PROCESSOR_ARCHITECTURE_ARM 5
+#define PROCESSOR_ARCHITECTURE_IA64 6
+#define PROCESSOR_ARCHITECTURE_ALPHA64 7
+#define PROCESSOR_ARCHITECTURE_MSIL 8
+#define PROCESSOR_ARCHITECTURE_AMD64 9
+#define PROCESSOR_ARCHITECTURE_IA32_ON_WIN64 10
+#define PROCESSOR_ARCHITECTURE_NEUTRAL 11
+#define PROCESSOR_ARCHITECTURE_ARM64 12
+
+#define PROCESSOR_ARCHITECTURE_UNKNOWN 0xFFFF
+
+//
+// JIT Debugging Info. This structure is defined to have constant size in
+// both the emulated and native environment.
+//
+
+typedef struct _JIT_DEBUG_INFO {
+ DWORD dwSize;
+ DWORD dwProcessorArchitecture;
+ DWORD dwThreadID;
+ DWORD dwReserved0;
+ ULONG64 lpExceptionAddress;
+ ULONG64 lpExceptionRecord;
+ ULONG64 lpContextRecord;
+} JIT_DEBUG_INFO, *LPJIT_DEBUG_INFO;
+
+typedef JIT_DEBUG_INFO JIT_DEBUG_INFO32, *LPJIT_DEBUG_INFO32;
+typedef JIT_DEBUG_INFO JIT_DEBUG_INFO64, *LPJIT_DEBUG_INFO64;
+
+/******************* resources ***************************************/
+
+#define MAKEINTRESOURCEW(i) ((LPWSTR)((ULONG_PTR)((WORD)(i))))
+#define RT_RCDATA MAKEINTRESOURCE(10)
+#define RT_VERSION MAKEINTRESOURCE(16)
+
+/******************* SAFEARRAY ************************/
+
+#define FADF_VARIANT ( 0x800 )
+
+typedef struct tagSAFEARRAYBOUND
+ {
+ ULONG cElements;
+ LONG lLbound;
+ } SAFEARRAYBOUND;
+
+typedef struct tagSAFEARRAYBOUND *LPSAFEARRAYBOUND;
+
+typedef struct tagSAFEARRAY
+ {
+ USHORT cDims;
+ USHORT fFeatures;
+ ULONG cbElements;
+ ULONG cLocks;
+ PVOID pvData;
+ SAFEARRAYBOUND rgsabound[ 1 ];
+ } SAFEARRAY;
+
+typedef SAFEARRAY *LPSAFEARRAY;
+
+
+STDAPI_(SAFEARRAY *) SafeArrayCreateVector(VARTYPE vt, LONG lLbound, ULONG cElements);
+STDAPI_(UINT) SafeArrayGetDim(SAFEARRAY * psa);
+STDAPI SafeArrayGetElement(SAFEARRAY * psa, LONG * rgIndices, void * pv);
+STDAPI SafeArrayGetLBound(SAFEARRAY * psa, UINT nDim, LONG * plLbound);
+STDAPI SafeArrayGetUBound(SAFEARRAY * psa, UINT nDim, LONG * plUbound);
+STDAPI SafeArrayGetVartype(SAFEARRAY * psa, VARTYPE * pvt);
+STDAPI SafeArrayPutElement(SAFEARRAY * psa, LONG * rgIndices, void * pv);
+STDAPI SafeArrayDestroy(SAFEARRAY * psa);
+
+EXTERN_C void * _stdcall _lfind(const void *, const void *, unsigned int *, unsigned int,
+ int (__cdecl *)(const void *, const void *));
+
+
+/*<TODO>****************** clean this up ***********************</TODO>*/
+
+
+interface IDispatch;
+interface ITypeInfo;
+interface ITypeLib;
+interface IMoniker;
+
+typedef VOID (WINAPI *LPOVERLAPPED_COMPLETION_ROUTINE)(
+ DWORD dwErrorCode,
+ DWORD dwNumberOfBytesTransfered,
+ LPVOID lpOverlapped);
+
+//
+// Debug APIs
+//
+#define EXCEPTION_DEBUG_EVENT 1
+#define CREATE_THREAD_DEBUG_EVENT 2
+#define CREATE_PROCESS_DEBUG_EVENT 3
+#define EXIT_THREAD_DEBUG_EVENT 4
+#define EXIT_PROCESS_DEBUG_EVENT 5
+#define LOAD_DLL_DEBUG_EVENT 6
+#define UNLOAD_DLL_DEBUG_EVENT 7
+#define OUTPUT_DEBUG_STRING_EVENT 8
+#define RIP_EVENT 9
+
+typedef struct _EXCEPTION_DEBUG_INFO {
+ EXCEPTION_RECORD ExceptionRecord;
+ DWORD dwFirstChance;
+} EXCEPTION_DEBUG_INFO, *LPEXCEPTION_DEBUG_INFO;
+
+typedef struct _CREATE_THREAD_DEBUG_INFO {
+ HANDLE hThread;
+ LPVOID lpThreadLocalBase;
+ LPTHREAD_START_ROUTINE lpStartAddress;
+} CREATE_THREAD_DEBUG_INFO, *LPCREATE_THREAD_DEBUG_INFO;
+
+typedef struct _CREATE_PROCESS_DEBUG_INFO {
+ HANDLE hFile;
+ HANDLE hProcess;
+ HANDLE hThread;
+ LPVOID lpBaseOfImage;
+ DWORD dwDebugInfoFileOffset;
+ DWORD nDebugInfoSize;
+ LPVOID lpThreadLocalBase;
+ LPTHREAD_START_ROUTINE lpStartAddress;
+ LPVOID lpImageName;
+ WORD fUnicode;
+} CREATE_PROCESS_DEBUG_INFO, *LPCREATE_PROCESS_DEBUG_INFO;
+
+typedef struct _EXIT_THREAD_DEBUG_INFO {
+ DWORD dwExitCode;
+} EXIT_THREAD_DEBUG_INFO, *LPEXIT_THREAD_DEBUG_INFO;
+
+typedef struct _EXIT_PROCESS_DEBUG_INFO {
+ DWORD dwExitCode;
+} EXIT_PROCESS_DEBUG_INFO, *LPEXIT_PROCESS_DEBUG_INFO;
+
+typedef struct _LOAD_DLL_DEBUG_INFO {
+ HANDLE hFile;
+ LPVOID lpBaseOfDll;
+ DWORD dwDebugInfoFileOffset;
+ DWORD nDebugInfoSize;
+ LPVOID lpImageName;
+ WORD fUnicode;
+} LOAD_DLL_DEBUG_INFO, *LPLOAD_DLL_DEBUG_INFO;
+
+typedef struct _UNLOAD_DLL_DEBUG_INFO {
+ LPVOID lpBaseOfDll;
+} UNLOAD_DLL_DEBUG_INFO, *LPUNLOAD_DLL_DEBUG_INFO;
+
+typedef struct _OUTPUT_DEBUG_STRING_INFO {
+ LPSTR lpDebugStringData;
+ WORD fUnicode;
+ WORD nDebugStringLength;
+} OUTPUT_DEBUG_STRING_INFO, *LPOUTPUT_DEBUG_STRING_INFO;
+
+typedef struct _RIP_INFO {
+ DWORD dwError;
+ DWORD dwType;
+} RIP_INFO, *LPRIP_INFO;
+
+typedef struct _DEBUG_EVENT {
+ DWORD dwDebugEventCode;
+ DWORD dwProcessId;
+ DWORD dwThreadId;
+ union {
+ EXCEPTION_DEBUG_INFO Exception;
+ CREATE_THREAD_DEBUG_INFO CreateThread;
+ CREATE_PROCESS_DEBUG_INFO CreateProcessInfo;
+ EXIT_THREAD_DEBUG_INFO ExitThread;
+ EXIT_PROCESS_DEBUG_INFO ExitProcess;
+ LOAD_DLL_DEBUG_INFO LoadDll;
+ UNLOAD_DLL_DEBUG_INFO UnloadDll;
+ OUTPUT_DEBUG_STRING_INFO DebugString;
+ RIP_INFO RipInfo;
+ } u;
+} DEBUG_EVENT, *LPDEBUG_EVENT;
+
+//
+// Define dynamic function table entry.
+//
+
+typedef
+PRUNTIME_FUNCTION
+GET_RUNTIME_FUNCTION_CALLBACK (
+ DWORD64 ControlPc,
+ PVOID Context
+ );
+typedef GET_RUNTIME_FUNCTION_CALLBACK *PGET_RUNTIME_FUNCTION_CALLBACK;
+
+typedef
+DWORD
+OUT_OF_PROCESS_FUNCTION_TABLE_CALLBACK (
+ HANDLE Process,
+ PVOID TableAddress,
+ PDWORD Entries,
+ PRUNTIME_FUNCTION* Functions
+ );
+typedef OUT_OF_PROCESS_FUNCTION_TABLE_CALLBACK *POUT_OF_PROCESS_FUNCTION_TABLE_CALLBACK;
+
+#define OUT_OF_PROCESS_FUNCTION_TABLE_CALLBACK_EXPORT_NAME \
+ "OutOfProcessFunctionTableCallback"
+
+#if defined(FEATURE_PAL_SXS)
+
+// #if !defined(_TARGET_MAC64)
+// typedef LONG (*PEXCEPTION_ROUTINE)(
+ // IN PEXCEPTION_POINTERS pExceptionPointers,
+ // IN LPVOID lpvParam);
+
+// #define DISPATCHER_CONTEXT LPVOID
+
+// #else // defined(_TARGET_MAC64)
+
+//
+// Define unwind history table structure.
+//
+
+#define UNWIND_HISTORY_TABLE_SIZE 12
+
+typedef struct _UNWIND_HISTORY_TABLE_ENTRY {
+ DWORD64 ImageBase;
+ PRUNTIME_FUNCTION FunctionEntry;
+} UNWIND_HISTORY_TABLE_ENTRY, *PUNWIND_HISTORY_TABLE_ENTRY;
+
+typedef struct _UNWIND_HISTORY_TABLE {
+ DWORD Count;
+ BYTE LocalHint;
+ BYTE GlobalHint;
+ BYTE Search;
+ BYTE Once;
+ DWORD64 LowAddress;
+ DWORD64 HighAddress;
+ UNWIND_HISTORY_TABLE_ENTRY Entry[UNWIND_HISTORY_TABLE_SIZE];
+} UNWIND_HISTORY_TABLE, *PUNWIND_HISTORY_TABLE;
+
+typedef
+EXCEPTION_DISPOSITION
+(*PEXCEPTION_ROUTINE) (
+ PEXCEPTION_RECORD ExceptionRecord,
+ ULONG64 EstablisherFrame,
+ PCONTEXT ContextRecord,
+ PVOID DispatcherContext
+ );
+
+#if defined(_ARM_)
+
+typedef struct _DISPATCHER_CONTEXT {
+ DWORD ControlPc;
+ DWORD ImageBase;
+ PRUNTIME_FUNCTION FunctionEntry;
+ DWORD EstablisherFrame;
+ DWORD TargetPc;
+ PCONTEXT ContextRecord;
+ PEXCEPTION_ROUTINE LanguageHandler;
+ PVOID HandlerData;
+ PUNWIND_HISTORY_TABLE HistoryTable;
+ DWORD ScopeIndex;
+ BOOLEAN ControlPcIsUnwound;
+ PBYTE NonVolatileRegisters;
+ DWORD Reserved;
+} DISPATCHER_CONTEXT, *PDISPATCHER_CONTEXT;
+
+#elif defined(_ARM64_)
+
+typedef struct _DISPATCHER_CONTEXT {
+ ULONG64 ControlPc;
+ ULONG64 ImageBase;
+ PRUNTIME_FUNCTION FunctionEntry;
+ ULONG64 EstablisherFrame;
+ ULONG64 TargetPc;
+ PCONTEXT ContextRecord;
+ PEXCEPTION_ROUTINE LanguageHandler;
+ PVOID HandlerData;
+ PUNWIND_HISTORY_TABLE HistoryTable;
+ ULONG64 ScopeIndex;
+ BOOLEAN ControlPcIsUnwound;
+ PBYTE NonVolatileRegisters;
+ ULONG64 Reserved;
+} DISPATCHER_CONTEXT, *PDISPATCHER_CONTEXT;
+
+#else
+
+typedef struct _DISPATCHER_CONTEXT {
+ ULONG64 ControlPc;
+ ULONG64 ImageBase;
+ PRUNTIME_FUNCTION FunctionEntry;
+ ULONG64 EstablisherFrame;
+ ULONG64 TargetIp;
+ PCONTEXT ContextRecord;
+ PEXCEPTION_ROUTINE LanguageHandler;
+ PVOID HandlerData;
+ PUNWIND_HISTORY_TABLE HistoryTable;
+} DISPATCHER_CONTEXT, *PDISPATCHER_CONTEXT;
+
+#endif
+
+// #endif // !defined(_TARGET_MAC64)
+
+typedef DISPATCHER_CONTEXT *PDISPATCHER_CONTEXT;
+
+#define ExceptionContinueSearch EXCEPTION_CONTINUE_SEARCH
+#define ExceptionStackUnwind EXCEPTION_EXECUTE_HANDLER
+#define ExceptionContinueExecution EXCEPTION_CONTINUE_EXECUTION
+
+#endif // FEATURE_PAL_SXS
+
+typedef struct _EXCEPTION_REGISTRATION_RECORD EXCEPTION_REGISTRATION_RECORD;
+typedef EXCEPTION_REGISTRATION_RECORD *PEXCEPTION_REGISTRATION_RECORD;
+
+typedef LPVOID HKEY;
+typedef LPVOID PACL;
+typedef LPVOID LPBC;
+typedef LPVOID PSECURITY_DESCRIPTOR;
+
+typedef struct _EXCEPTION_RECORD64 {
+ DWORD ExceptionCode;
+ ULONG ExceptionFlags;
+ ULONG64 ExceptionRecord;
+ ULONG64 ExceptionAddress;
+ ULONG NumberParameters;
+ ULONG __unusedAlignment;
+ ULONG64 ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
+} EXCEPTION_RECORD64, *PEXCEPTION_RECORD64;
+
+typedef LONG (WINAPI *PTOP_LEVEL_EXCEPTION_FILTER)(
+ IN struct _EXCEPTION_POINTERS *ExceptionInfo
+ );
+typedef PTOP_LEVEL_EXCEPTION_FILTER LPTOP_LEVEL_EXCEPTION_FILTER;
+
+/******************* ntdef ************************************/
+
+#ifndef ANYSIZE_ARRAY
+#define ANYSIZE_ARRAY 1 // winnt
+#endif
+
+/******************* winnt ************************************/
+
+typedef struct LIST_ENTRY32 {
+ ULONG Flink;
+ ULONG Blink;
+} LIST_ENTRY32;
+typedef LIST_ENTRY32 *PLIST_ENTRY32;
+
+typedef struct LIST_ENTRY64 {
+ ULONGLONG Flink;
+ ULONGLONG Blink;
+} LIST_ENTRY64;
+typedef LIST_ENTRY64 *PLIST_ENTRY64;
+
+/******************** PAL RT APIs *******************************/
+
+typedef struct _HSATELLITE *HSATELLITE;
+
+EXTERN_C HSATELLITE PALAPI PAL_LoadSatelliteResourceW(LPCWSTR SatelliteResourceFileName);
+EXTERN_C HSATELLITE PALAPI PAL_LoadSatelliteResourceA(LPCSTR SatelliteResourceFileName);
+EXTERN_C BOOL PALAPI PAL_FreeSatelliteResource(HSATELLITE SatelliteResource);
+EXTERN_C UINT PALAPI PAL_LoadSatelliteStringW(HSATELLITE SatelliteResource,
+ UINT uID,
+ LPWSTR lpBuffer,
+ UINT nBufferMax);
+EXTERN_C UINT PALAPI PAL_LoadSatelliteStringA(HSATELLITE SatelliteResource,
+ UINT uID,
+ LPSTR lpBuffer,
+ UINT nBufferMax);
+
+EXTERN_C HRESULT PALAPI PAL_CoCreateInstance(REFCLSID rclsid,
+ REFIID riid,
+ void **ppv);
+
+// So we can have CoCreateInstance in most of the code base,
+// instead of spreading around of if'def FEATURE_PALs for PAL_CoCreateInstance.
+#define CoCreateInstance(rclsid, pUnkOuter, dwClsContext, riid, ppv) PAL_CoCreateInstance(rclsid, riid, ppv)
+
+/************** verrsrc.h ************************************/
+
+/* ----- VS_VERSION.dwFileFlags ----- */
+#define VS_FF_DEBUG 0x00000001L
+#define VS_FF_PRERELEASE 0x00000002L
+#define VS_FF_PATCHED 0x00000004L
+#define VS_FF_PRIVATEBUILD 0x00000008L
+#define VS_FF_INFOINFERRED 0x00000010L
+#define VS_FF_SPECIALBUILD 0x00000020L
+
+/* ----- Types and structures ----- */
+typedef struct tagVS_FIXEDFILEINFO
+{
+ DWORD dwSignature; /* e.g. 0xfeef04bd */
+ DWORD dwStrucVersion; /* e.g. 0x00000042 = "0.42" */
+ DWORD dwFileVersionMS; /* e.g. 0x00030075 = "3.75" */
+ DWORD dwFileVersionLS; /* e.g. 0x00000031 = "0.31" */
+ DWORD dwProductVersionMS; /* e.g. 0x00030010 = "3.10" */
+ DWORD dwProductVersionLS; /* e.g. 0x00000031 = "0.31" */
+ DWORD dwFileFlagsMask; /* = 0x3F for version "0.42" */
+ DWORD dwFileFlags; /* e.g. VFF_DEBUG | VFF_PRERELEASE */
+ DWORD dwFileOS; /* e.g. VOS_DOS_WINDOWS16 */
+ DWORD dwFileType; /* e.g. VFT_DRIVER */
+ DWORD dwFileSubtype; /* e.g. VFT2_DRV_KEYBOARD */
+ DWORD dwFileDateMS; /* e.g. 0 */
+ DWORD dwFileDateLS; /* e.g. 0 */
+} VS_FIXEDFILEINFO;
+
+/************** Byte swapping & unaligned access ******************/
+
+#include <pal_endian.h>
+
+/******************** external includes *************************/
+
+#include "ntimage.h"
+#ifndef PAL_STDCPP_COMPAT
+#include "cpp/ccombstr.h"
+#include "cpp/cstring.h"
+#endif // !PAL_STDCPP_COMPAT
+#include "sscli_version.h"
+
+#endif // RC_INVOKED
+
+#endif // __PALRT_H__