palrt.h 56 KB

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