palrt.h 55 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794
  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. };
  398. USHORT signscale;
  399. };
  400. USHORT wReserved;
  401. #else
  402. USHORT wReserved;
  403. union {
  404. struct {
  405. BYTE scale;
  406. BYTE sign;
  407. };
  408. USHORT signscale;
  409. };
  410. #endif
  411. ULONG Hi32;
  412. union {
  413. struct {
  414. ULONG Lo32;
  415. ULONG Mid32;
  416. };
  417. ULONGLONG Lo64;
  418. };
  419. } DECIMAL, *LPDECIMAL;
  420. typedef struct tagBLOB {
  421. ULONG cbSize;
  422. BYTE *pBlobData;
  423. } BLOB, *LPBLOB;
  424. interface IStream;
  425. interface IRecordInfo;
  426. typedef unsigned short VARTYPE;
  427. enum VARENUM {
  428. VT_EMPTY = 0,
  429. VT_NULL = 1,
  430. VT_I2 = 2,
  431. VT_I4 = 3,
  432. VT_R4 = 4,
  433. VT_R8 = 5,
  434. VT_CY = 6,
  435. VT_DATE = 7,
  436. VT_BSTR = 8,
  437. VT_DISPATCH = 9,
  438. VT_ERROR = 10,
  439. VT_BOOL = 11,
  440. VT_VARIANT = 12,
  441. VT_UNKNOWN = 13,
  442. VT_DECIMAL = 14,
  443. VT_I1 = 16,
  444. VT_UI1 = 17,
  445. VT_UI2 = 18,
  446. VT_UI4 = 19,
  447. VT_I8 = 20,
  448. VT_UI8 = 21,
  449. VT_INT = 22,
  450. VT_UINT = 23,
  451. VT_VOID = 24,
  452. VT_HRESULT = 25,
  453. VT_PTR = 26,
  454. VT_SAFEARRAY = 27,
  455. VT_CARRAY = 28,
  456. VT_USERDEFINED = 29,
  457. VT_LPSTR = 30,
  458. VT_LPWSTR = 31,
  459. VT_RECORD = 36,
  460. VT_INT_PTR = 37,
  461. VT_UINT_PTR = 38,
  462. VT_FILETIME = 64,
  463. VT_BLOB = 65,
  464. VT_STREAM = 66,
  465. VT_STORAGE = 67,
  466. VT_STREAMED_OBJECT = 68,
  467. VT_STORED_OBJECT = 69,
  468. VT_BLOB_OBJECT = 70,
  469. VT_CF = 71,
  470. VT_CLSID = 72,
  471. VT_VECTOR = 0x1000,
  472. VT_ARRAY = 0x2000,
  473. VT_BYREF = 0x4000,
  474. VT_TYPEMASK = 0xfff,
  475. };
  476. typedef struct tagVARIANT VARIANT, *LPVARIANT;
  477. typedef struct tagSAFEARRAY SAFEARRAY;
  478. struct tagVARIANT
  479. {
  480. union
  481. {
  482. struct
  483. {
  484. #if BIGENDIAN
  485. // We need to make sure vt overlaps with DECIMAL's wReserved.
  486. // See the DECIMAL type for details.
  487. WORD wReserved1;
  488. VARTYPE vt;
  489. #else
  490. VARTYPE vt;
  491. WORD wReserved1;
  492. #endif
  493. WORD wReserved2;
  494. WORD wReserved3;
  495. union
  496. {
  497. LONGLONG llVal;
  498. LONG lVal;
  499. BYTE bVal;
  500. SHORT iVal;
  501. FLOAT fltVal;
  502. DOUBLE dblVal;
  503. VARIANT_BOOL boolVal;
  504. SCODE scode;
  505. CY cyVal;
  506. DATE date;
  507. BSTR bstrVal;
  508. interface IUnknown *punkVal;
  509. interface IDispatch *pdispVal;
  510. SAFEARRAY *parray;
  511. BYTE *pbVal;
  512. SHORT *piVal;
  513. LONG *plVal;
  514. LONGLONG *pllVal;
  515. FLOAT *pfltVal;
  516. DOUBLE *pdblVal;
  517. VARIANT_BOOL *pboolVal;
  518. SCODE *pscode;
  519. CY *pcyVal;
  520. DATE *pdate;
  521. BSTR *pbstrVal;
  522. interface IUnknown **ppunkVal;
  523. VARIANT *pvarVal;
  524. PVOID byref;
  525. CHAR cVal;
  526. USHORT uiVal;
  527. ULONG ulVal;
  528. ULONGLONG ullVal;
  529. INT intVal;
  530. UINT uintVal;
  531. DECIMAL *pdecVal;
  532. CHAR *pcVal;
  533. USHORT *puiVal;
  534. ULONG *pulVal;
  535. ULONGLONG *pullVal;
  536. INT *pintVal;
  537. UINT *puintVal;
  538. struct __tagBRECORD
  539. {
  540. PVOID pvRecord;
  541. interface IRecordInfo *pRecInfo;
  542. } brecVal;
  543. } n3;
  544. } n2;
  545. DECIMAL decVal;
  546. } n1;
  547. };
  548. typedef VARIANT VARIANTARG, *LPVARIANTARG;
  549. STDAPI_(void) VariantInit(VARIANT * pvarg);
  550. STDAPI_(HRESULT) VariantClear(VARIANT * pvarg);
  551. #define V_VT(X) ((X)->n1.n2.vt)
  552. #define V_UNION(X, Y) ((X)->n1.n2.n3.Y)
  553. #define V_RECORDINFO(X) ((X)->n1.n2.n3.brecVal.pRecInfo)
  554. #define V_RECORD(X) ((X)->n1.n2.n3.brecVal.pvRecord)
  555. #define V_UI1(X) V_UNION(X, bVal)
  556. #define V_UI1REF(X) V_UNION(X, pbVal)
  557. #define V_I2(X) V_UNION(X, iVal)
  558. #define V_I2REF(X) V_UNION(X, piVal)
  559. #define V_I4(X) V_UNION(X, lVal)
  560. #define V_I4REF(X) V_UNION(X, plVal)
  561. #define V_I8(X) V_UNION(X, llVal)
  562. #define V_I8REF(X) V_UNION(X, pllVal)
  563. #define V_R4(X) V_UNION(X, fltVal)
  564. #define V_R4REF(X) V_UNION(X, pfltVal)
  565. #define V_R8(X) V_UNION(X, dblVal)
  566. #define V_R8REF(X) V_UNION(X, pdblVal)
  567. #define V_I1(X) V_UNION(X, cVal)
  568. #define V_I1REF(X) V_UNION(X, pcVal)
  569. #define V_UI2(X) V_UNION(X, uiVal)
  570. #define V_UI2REF(X) V_UNION(X, puiVal)
  571. #define V_UI4(X) V_UNION(X, ulVal)
  572. #define V_UI4REF(X) V_UNION(X, pulVal)
  573. #define V_UI8(X) V_UNION(X, ullVal)
  574. #define V_UI8REF(X) V_UNION(X, pullVal)
  575. #define V_INT(X) V_UNION(X, intVal)
  576. #define V_INTREF(X) V_UNION(X, pintVal)
  577. #define V_UINT(X) V_UNION(X, uintVal)
  578. #define V_UINTREF(X) V_UNION(X, puintVal)
  579. #define V_ARRAY(X) V_UNION(X, parray)
  580. #ifdef _WIN64
  581. #define V_INT_PTR(X) V_UNION(X, llVal)
  582. #define V_UINT_PTR(X) V_UNION(X, ullVal)
  583. #define V_INT_PTRREF(X) V_UNION(X, pllVal)
  584. #define V_UINT_PTRREF(X) V_UNION(X, pullVal)
  585. #else
  586. #define V_INT_PTR(X) V_UNION(X, lVal)
  587. #define V_UINT_PTR(X) V_UNION(X, ulVal)
  588. #define V_INT_PTRREF(X) V_UNION(X, plVal)
  589. #define V_UINT_PTRREF(X) V_UNION(X, pulVal)
  590. #endif
  591. #define V_CY(X) V_UNION(X, cyVal)
  592. #define V_CYREF(X) V_UNION(X, pcyVal)
  593. #define V_DATE(X) V_UNION(X, date)
  594. #define V_DATEREF(X) V_UNION(X, pdate)
  595. #define V_BSTR(X) V_UNION(X, bstrVal)
  596. #define V_BSTRREF(X) V_UNION(X, pbstrVal)
  597. #define V_UNKNOWN(X) V_UNION(X, punkVal)
  598. #define V_UNKNOWNREF(X) V_UNION(X, ppunkVal)
  599. #define V_VARIANTREF(X) V_UNION(X, pvarVal)
  600. #define V_DISPATCH(X) V_UNION(X, pdispVal)
  601. #define V_ERROR(X) V_UNION(X, scode)
  602. #define V_ERRORREF(X) V_UNION(X, pscode)
  603. #define V_BOOL(X) V_UNION(X, boolVal)
  604. #define V_BOOLREF(X) V_UNION(X, pboolVal)
  605. #define V_BYREF(X) V_UNION(X, byref)
  606. #define V_DECIMAL(X) ((X)->n1.decVal)
  607. #define V_DECIMALREF(X) V_UNION(X, pdecVal)
  608. #define V_ISBYREF(X) (V_VT(X)&VT_BYREF)
  609. STDAPI CreateStreamOnHGlobal(PVOID hGlobal, BOOL fDeleteOnRelease, interface IStream** ppstm);
  610. #define STGM_DIRECT 0x00000000L
  611. #define STGM_READ 0x00000000L
  612. #define STGM_WRITE 0x00000001L
  613. #define STGM_READWRITE 0x00000002L
  614. #define STGM_SHARE_DENY_NONE 0x00000040L
  615. #define STGM_SHARE_DENY_READ 0x00000030L
  616. #define STGM_SHARE_DENY_WRITE 0x00000020L
  617. #define STGM_SHARE_EXCLUSIVE 0x00000010L
  618. #define STGM_DELETEONRELEASE 0x04000000L
  619. #define STGM_CREATE 0x00001000L
  620. #define STGM_CONVERT 0x00020000L
  621. #define STGM_FAILIFTHERE 0x00000000L
  622. #define STGM_NOSNAPSHOT 0x00200000L
  623. STDAPI IIDFromString(LPOLESTR lpsz, IID* lpiid);
  624. STDAPI_(int) StringFromGUID2(REFGUID rguid, LPOLESTR lpsz, int cchMax);
  625. /******************* CRYPT **************************************/
  626. #define PUBLICKEYBLOB 0x6
  627. //
  628. // Algorithm IDs and Flags
  629. //
  630. #define GET_ALG_CLASS(x) (x & (7 << 13))
  631. #define GET_ALG_TYPE(x) (x & (15 << 9))
  632. #define GET_ALG_SID(x) (x & (511))
  633. typedef unsigned int ALG_ID;
  634. // Algorithm classes
  635. #define ALG_CLASS_SIGNATURE (1 << 13)
  636. #define ALG_CLASS_HASH (4 << 13)
  637. // Algorithm types
  638. #define ALG_TYPE_ANY (0)
  639. // Hash sub ids
  640. #define ALG_SID_SHA1 4
  641. // algorithm identifier definitions
  642. #define CALG_SHA1 (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA1)
  643. /******************* NLS ****************************************/
  644. typedef
  645. enum tagMIMECONTF {
  646. MIMECONTF_MAILNEWS = 0x1,
  647. MIMECONTF_BROWSER = 0x2,
  648. MIMECONTF_MINIMAL = 0x4,
  649. MIMECONTF_IMPORT = 0x8,
  650. MIMECONTF_SAVABLE_MAILNEWS = 0x100,
  651. MIMECONTF_SAVABLE_BROWSER = 0x200,
  652. MIMECONTF_EXPORT = 0x400,
  653. MIMECONTF_PRIVCONVERTER = 0x10000,
  654. MIMECONTF_VALID = 0x20000,
  655. MIMECONTF_VALID_NLS = 0x40000,
  656. MIMECONTF_MIME_IE4 = 0x10000000,
  657. MIMECONTF_MIME_LATEST = 0x20000000,
  658. MIMECONTF_MIME_REGISTRY = 0x40000000
  659. } MIMECONTF;
  660. #define LCMAP_LOWERCASE 0x00000100
  661. #define LCMAP_UPPERCASE 0x00000200
  662. #define LCMAP_SORTKEY 0x00000400
  663. #define LCMAP_BYTEREV 0x00000800
  664. #define LCMAP_HIRAGANA 0x00100000
  665. #define LCMAP_KATAKANA 0x00200000
  666. #define LCMAP_HALFWIDTH 0x00400000
  667. #define LCMAP_FULLWIDTH 0x00800000
  668. #define LCMAP_LINGUISTIC_CASING 0x01000000
  669. // 8 characters for language
  670. // 8 characters for region
  671. // 64 characters for suffix (script)
  672. // 2 characters for '-' separators
  673. // 2 characters for prefix like "i-" or "x-"
  674. // 1 null termination
  675. #define LOCALE_NAME_MAX_LENGTH 85
  676. #define LOCALE_SCOUNTRY 0x00000006
  677. #define LOCALE_SENGCOUNTRY 0x00001002
  678. #define LOCALE_SLANGUAGE 0x00000002
  679. #define LOCALE_SENGLANGUAGE 0x00001001
  680. #define LOCALE_SDATE 0x0000001D
  681. #define LOCALE_STIME 0x0000001E
  682. #define CSTR_LESS_THAN 1
  683. #define CSTR_EQUAL 2
  684. #define CSTR_GREATER_THAN 3
  685. #define NORM_IGNORENONSPACE 0x00000002
  686. #define WC_COMPOSITECHECK 0x00000000 // NOTE: diff from winnls.h
  687. /******************* shlwapi ************************************/
  688. // note: diff in NULL handing and calling convetion
  689. #define StrCpyW PAL_wcscpy
  690. #define StrCpyNW lstrcpynW // note: can't be wcsncpy!
  691. #define StrCatW PAL_wcscat
  692. #define StrChrW (WCHAR*)PAL_wcschr
  693. #define StrCmpW PAL_wcscmp
  694. #define StrCmpIW _wcsicmp
  695. #define StrCmpNW PAL_wcsncmp
  696. #define StrCmpNIW _wcsnicmp
  697. STDAPI_(LPWSTR) StrNCatW(LPWSTR lpFront, LPCWSTR lpBack, int cchMax);
  698. STDAPI_(int) StrToIntW(LPCWSTR lpSrc);
  699. STDAPI_(LPWSTR) StrStrIW(LPCWSTR lpFirst, LPCWSTR lpSrch);
  700. STDAPI_(LPWSTR) StrRChrW(LPCWSTR lpStart, LPCWSTR lpEnd, WCHAR wMatch);
  701. STDAPI_(LPWSTR) StrCatBuffW(LPWSTR pszDest, LPCWSTR pszSrc, int cchDestBuffSize);
  702. #define lstrcmpW PAL_wcscmp
  703. #define lstrcmpiW _wcsicmp
  704. #define wnsprintfW _snwprintf // note: not 100% compatible (wsprintf should be subset of sprintf...)
  705. #define wvnsprintfW _vsnwprintf // note: not 100% compatible (wsprintf should be subset of sprintf...)
  706. #ifdef UNICODE
  707. #define StrCpy StrCpyW
  708. #define StrCpyN StrCpyNW
  709. #define StrCat StrCatW
  710. #define StrNCat StrNCatW
  711. #define StrChr StrChrW
  712. #define StrCmp StrCmpW
  713. #define StrCmpN StrCmpNW
  714. #define StrCmpI StrCmpIW
  715. #define StrCmpNI StrCmpNIW
  716. #define StrToInt StrToIntW
  717. #define StrStrI StrStrIW
  718. #define StrRChr StrRChrW
  719. #define StrCatBuff StrCatBuffW
  720. #define lstrcmp lstrcmpW
  721. #define lstrcmpi lstrcmpiW
  722. #define wnsprintf wnsprintfW
  723. #endif
  724. #ifdef __cplusplus
  725. /*
  726. Safe CRT functions are not available (yet) on all platforms, so we use our own implementations from safecrt.h.
  727. */
  728. #define _CRT_ALTERNATIVE_INLINES
  729. #define _SAFECRT_NO_INCLUDES 1
  730. #define _SAFECRT_USE_INLINES 1
  731. #define _SAFECRT_SET_ERRNO 0
  732. #define _SAFECRT_DEFINE_MBS_FUNCTIONS 0
  733. #define _SAFECRT_DEFINE_TCS_MACROS 1
  734. /*
  735. #define _SAFECRT__ISMBBLEAD(_Character) 0
  736. #define _SAFECRT__MBSDEC(_String, _Current) (_Current - 1)
  737. */
  738. #include "safecrt.h"
  739. #include "specstrings.h"
  740. /*
  741. The wrappers below are simple implementations that may not be as robust as complete functions in the Secure CRT library.
  742. Remember to fix the errcode defintion in safecrt.h.
  743. */
  744. #define _wcslwr_s _wcslwr_unsafe
  745. #define _snwprintf_s _snwprintf_unsafe
  746. #define _vsnwprintf_s _vsnwprintf_unsafe
  747. #define _snprintf_s _snprintf_unsafe
  748. #define _vsnprintf_s _vsnprintf_unsafe
  749. #define swscanf_s swscanf
  750. #define sscanf_s sscanf
  751. #define _wfopen_s _wfopen_unsafe
  752. #define fopen_s _fopen_unsafe
  753. #define _strlwr_s _strlwr_unsafe
  754. #define _vscprintf _vscprintf_unsafe
  755. #define _vscwprintf _vscwprintf_unsafe
  756. #define sprintf_s _snprintf
  757. #define swprintf_s _snwprintf
  758. #define vsprintf_s _vsnprintf
  759. #define vswprintf_s _vsnwprintf
  760. extern "C++" {
  761. #include <safemath.h>
  762. inline errno_t __cdecl _wcslwr_unsafe(WCHAR *str, size_t sz)
  763. {
  764. size_t fullSize;
  765. if(!ClrSafeInt<size_t>::multiply(sz, sizeof(WCHAR), fullSize))
  766. return 1;
  767. WCHAR *copy = (WCHAR *)malloc(fullSize);
  768. if(copy == nullptr)
  769. return 1;
  770. errno_t retCode = wcscpy_s(copy, sz, str);
  771. if(retCode) {
  772. free(copy);
  773. return 1;
  774. }
  775. _wcslwr(copy);
  776. wcscpy_s(str, sz, copy);
  777. free(copy);
  778. return 0;
  779. }
  780. inline errno_t __cdecl _strlwr_unsafe(char *str, size_t sz)
  781. {
  782. char *copy = (char *)malloc(sz);
  783. if(copy == nullptr)
  784. return 1;
  785. errno_t retCode = strcpy_s(copy, sz, str);
  786. if(retCode) {
  787. free(copy);
  788. return 1;
  789. }
  790. _strlwr(copy);
  791. strcpy_s(str, sz, copy);
  792. free(copy);
  793. return 0;
  794. }
  795. inline int __cdecl _vscprintf_unsafe(const char *_Format, va_list _ArgList)
  796. {
  797. int guess = 10;
  798. for (;;)
  799. {
  800. char *buf = (char *)malloc(guess * sizeof(char));
  801. if(buf == nullptr)
  802. return 0;
  803. int ret = _vsnprintf(buf, guess, _Format, _ArgList);
  804. free(buf);
  805. if ((ret != -1) && (ret < guess))
  806. return ret;
  807. guess *= 2;
  808. }
  809. }
  810. inline int __cdecl _vscwprintf_unsafe(const WCHAR *_Format, va_list _ArgList)
  811. {
  812. int guess = 256;
  813. for (;;)
  814. {
  815. WCHAR *buf = (WCHAR *)malloc(guess * sizeof(WCHAR));
  816. if (buf == nullptr)
  817. return 0;
  818. va_list apcopy;
  819. va_copy(apcopy, _ArgList);
  820. int ret = _vsnwprintf(buf, guess, _Format, apcopy);
  821. free(buf);
  822. va_end(apcopy);
  823. if ((ret != -1) && (ret < guess))
  824. return ret;
  825. guess *= 2;
  826. }
  827. }
  828. inline int __cdecl _vsnwprintf_unsafe(WCHAR *_Dst, size_t _SizeInWords, size_t _Count, const WCHAR *_Format, va_list _ArgList)
  829. {
  830. if (_Count == _TRUNCATE) _Count = _SizeInWords - 1;
  831. int ret = _vsnwprintf(_Dst, _Count, _Format, _ArgList);
  832. _Dst[_SizeInWords - 1] = L'\0';
  833. if (ret < 0 && errno == 0)
  834. {
  835. errno = ERANGE;
  836. }
  837. return ret;
  838. }
  839. inline int __cdecl _snwprintf_unsafe(WCHAR *_Dst, size_t _SizeInWords, size_t _Count, const WCHAR *_Format, ...)
  840. {
  841. int ret;
  842. va_list _ArgList;
  843. va_start(_ArgList, _Format);
  844. ret = _vsnwprintf_unsafe(_Dst, _SizeInWords, _Count, _Format, _ArgList);
  845. va_end(_ArgList);
  846. return ret;
  847. }
  848. inline int __cdecl _vsnprintf_unsafe(char *_Dst, size_t _SizeInWords, size_t _Count, const char *_Format, va_list _ArgList)
  849. {
  850. if (_Count == _TRUNCATE) _Count = _SizeInWords - 1;
  851. int ret = _vsnprintf(_Dst, _Count, _Format, _ArgList);
  852. _Dst[_SizeInWords - 1] = L'\0';
  853. if (ret < 0 && errno == 0)
  854. {
  855. errno = ERANGE;
  856. }
  857. return ret;
  858. }
  859. inline int __cdecl _snprintf_unsafe(char *_Dst, size_t _SizeInWords, size_t _Count, const char *_Format, ...)
  860. {
  861. int ret;
  862. va_list _ArgList;
  863. va_start(_ArgList, _Format);
  864. ret = _vsnprintf_unsafe(_Dst, _SizeInWords, _Count, _Format, _ArgList);
  865. va_end(_ArgList);
  866. return ret;
  867. }
  868. inline errno_t __cdecl _wfopen_unsafe(PAL_FILE * *ff, const WCHAR *fileName, const WCHAR *mode)
  869. {
  870. PAL_FILE *result = _wfopen(fileName, mode);
  871. if(result == 0) {
  872. return 1;
  873. } else {
  874. *ff = result;
  875. return 0;
  876. }
  877. }
  878. inline errno_t __cdecl _fopen_unsafe(PAL_FILE * *ff, const char *fileName, const char *mode)
  879. {
  880. PAL_FILE *result = PAL_fopen(fileName, mode);
  881. if(result == 0) {
  882. return 1;
  883. } else {
  884. *ff = result;
  885. return 0;
  886. }
  887. }
  888. /* _itow_s */
  889. _SAFECRT__EXTERN_C
  890. errno_t __cdecl _itow_s(int _Value, WCHAR *_Dst, size_t _SizeInWords, int _Radix);
  891. #if defined(__cplusplus) && _SAFECRT_USE_CPP_OVERLOADS
  892. template <size_t _SizeInWords>
  893. inline
  894. errno_t __cdecl _itow_s(int _Value, WCHAR (&_Dst)[_SizeInWords], int _Radix)
  895. {
  896. return _itow_s(_Value, _Dst, _SizeInWords, _Radix);
  897. }
  898. #endif
  899. #if _SAFECRT_USE_INLINES
  900. __inline
  901. errno_t __cdecl _itow_s(int _Value, WCHAR *_Dst, size_t _SizeInWords, int _Radix)
  902. {
  903. /* validation section */
  904. _SAFECRT__VALIDATE_STRING(_Dst, _SizeInWords);
  905. /* TODO: do not write past buffer size */
  906. _itow(_Value, _Dst, _Radix);
  907. return 0;
  908. }
  909. #endif
  910. /* _i64tow_s */
  911. _SAFECRT__EXTERN_C
  912. errno_t __cdecl _i64tow_s(__int64 _Value, WCHAR *_Dst, size_t _SizeInWords, int _Radix);
  913. #if defined(__cplusplus) && _SAFECRT_USE_CPP_OVERLOADS
  914. template <size_t _SizeInWords>
  915. inline
  916. errno_t __cdecl _i64tow_s(__int64 _Value, WCHAR (&_Dst)[_SizeInWords], int _Radix)
  917. {
  918. return _i64tow_s(_Value, _Dst, _SizeInWords, _Radix);
  919. }
  920. #endif
  921. #if _SAFECRT_USE_INLINES
  922. __inline
  923. errno_t __cdecl _i64tow_s(__int64 _Value, WCHAR *_Dst, size_t _SizeInWords, int _Radix)
  924. {
  925. /* validation section */
  926. _SAFECRT__VALIDATE_STRING(_Dst, _SizeInWords);
  927. /* TODO: do not write past buffer size */
  928. _i64tow(_Value, _Dst, _Radix);
  929. return 0;
  930. }
  931. #endif
  932. /* getenv_s */
  933. /*
  934. * _ReturnValue indicates if the variable has been found and size needed
  935. */
  936. _SAFECRT__EXTERN_C
  937. errno_t __cdecl getenv_s(size_t *_ReturnValue, char *_Dst, size_t _SizeInWords, const char *_Name);
  938. #if defined(__cplusplus) && _SAFECRT_USE_CPP_OVERLOADS
  939. template <size_t _SizeInWords>
  940. inline
  941. errno_t __cdecl getenv_s(size_t *_ReturnValue, char *_Dst, size_t _SizeInWords, const char *_Name)
  942. {
  943. return getenv_s(_ReturnValue, _Dst, _SizeInWords, _Name);
  944. }
  945. #endif
  946. #if _SAFECRT_USE_INLINES
  947. __inline
  948. errno_t __cdecl getenv_s(size_t *_ReturnValue, char *_Dst, size_t _SizeInWords, const char *_Name)
  949. {
  950. char *szFound;
  951. /* validation section */
  952. _SAFECRT__VALIDATE_STRING(_Dst, _SizeInWords);
  953. szFound = getenv(_Name);
  954. if (szFound == nullptr)
  955. {
  956. *_ReturnValue = 0;
  957. return 0;
  958. }
  959. *_ReturnValue = strlen(szFound) + 1;
  960. return strcpy_s(_Dst, _SizeInWords, szFound);
  961. }
  962. #endif
  963. }
  964. #endif /* __cplusplus */
  965. STDAPI_(BOOL) PathAppendW(LPWSTR pszPath, LPCWSTR pszMore);
  966. STDAPI_(int) PathCommonPrefixW(LPCWSTR pszFile1, LPCWSTR pszFile2, LPWSTR pszPath);
  967. PALIMPORT LPWSTR PALAPI PathFindFileNameW(LPCWSTR pPath);
  968. STDAPI_(int) PathGetDriveNumberW(LPCWSTR lpsz);
  969. STDAPI_(BOOL) PathIsRelativeW(LPCWSTR lpszPath);
  970. STDAPI_(BOOL) PathIsUNCW(LPCWSTR pszPath);
  971. STDAPI_(LPWSTR) PathAddBackslashW(LPWSTR lpszPath);
  972. STDAPI_(LPWSTR) PathRemoveBackslashW(LPWSTR lpszPath);
  973. STDAPI_(void) PathRemoveExtensionW(LPWSTR pszPath);
  974. STDAPI_(LPWSTR) PathCombineW(LPWSTR lpszDest, LPCWSTR lpszDir, LPCWSTR lpszFile);
  975. STDAPI_(BOOL) PathCanonicalizeW(LPWSTR lpszDst, LPCWSTR lpszSrc);
  976. STDAPI_(BOOL) PathRelativePathToW(LPWSTR pszPath, LPCWSTR pszFrom, DWORD dwAttrFrom, LPCWSTR pszTo, DWORD dwAttrTo);
  977. STDAPI_(BOOL) PathRenameExtensionW(LPWSTR pszPath, LPCWSTR pszExt);
  978. STDAPI_(BOOL) PathRemoveFileSpecW(LPWSTR pFile);
  979. STDAPI_(void) PathStripPathW (LPWSTR pszPath);
  980. STDAPI PathCreateFromUrlW(LPCWSTR pszUrl, LPWSTR pszPath, LPDWORD pcchPath, DWORD dwFlags);
  981. STDAPI_(BOOL) PathIsURLW(LPCWSTR pszPath);
  982. #define URL_UNESCAPE 0x10000000
  983. #define URL_ESCAPE_PERCENT 0x00001000
  984. typedef enum {
  985. URLIS_FILEURL = 3,
  986. } URLIS;
  987. typedef enum {
  988. URL_PART_SCHEME = 1,
  989. URL_PART_HOSTNAME = 2,
  990. } URL_PART;
  991. STDAPI UrlCanonicalizeW(LPCWSTR pszUrl, LPWSTR pszCanonicalized, LPDWORD pcchCanonicalized, DWORD dwFlags);
  992. STDAPI UrlCombineW(LPCWSTR pszBase, LPCWSTR pszRelative, LPWSTR pszCombined, LPDWORD pcchCombined, DWORD dwFlags);
  993. STDAPI UrlEscapeW(LPCWSTR pszUrl, LPWSTR pszEscaped, LPDWORD pcchEscaped, DWORD dwFlags);
  994. STDAPI UrlUnescapeW(LPWSTR pszURL, LPWSTR pszUnescaped, LPDWORD pcchUnescaped, DWORD dwFlags);
  995. STDAPI_(BOOL) UrlIsW(LPCWSTR pszUrl, URLIS dwUrlIs);
  996. STDAPI UrlGetPartW(LPCWSTR pszIn, LPWSTR pszOut, LPDWORD pcchOut, DWORD dwPart, DWORD dwFlags);
  997. #ifdef UNICODE
  998. #define PathAppend PathAppendW
  999. #define PathCommonPrefix PathCommonPrefixW
  1000. #define PathFindFileName PathFindFileNameW
  1001. #define PathIsRelative PathIsRelativeW
  1002. #define PathGetDriveNumber PathGetDriveNumberW
  1003. #define PathIsUNC PathIsUNCW
  1004. #define PathAddBackslash PathAddBackslashW
  1005. #define PathRemoveBackslash PathRemoveBackslashW
  1006. #define PathRemoveExtension PathRemoveExtensionW
  1007. #define PathCombine PathCombineW
  1008. #define PathSkipRoot PathSkipRootW
  1009. #define PathFindExtension PathFindExtensionW
  1010. #define PathCanonicalize PathCanonicalizeW
  1011. #define PathRelativePathTo PathRelativePathToW
  1012. #define PathRemoveFileSpec PathRemoveFileSpecW
  1013. #define PathRenameExtension PathRenameExtensionW
  1014. #define PathStripPath PathStripPathW
  1015. #define PathCreateFromUrl PathCreateFromUrlW
  1016. #define PathIsURL PathIsURLW
  1017. #define UrlCanonicalize UrlCanonicalizeW
  1018. #define UrlCombine UrlCombineW
  1019. #define UrlEscape UrlEscapeW
  1020. #define UrlUnescape UrlUnescapeW
  1021. #define UrlIs UrlIsW
  1022. #define UrlGetPart UrlGetPartW
  1023. #endif // UNICODE
  1024. /******************* misc ***************************************/
  1025. #ifdef __cplusplus
  1026. namespace std
  1027. {
  1028. typedef decltype(nullptr) nullptr_t;
  1029. }
  1030. template< class T >
  1031. typename std::remove_reference<T>::type&& move( T&& t );
  1032. #endif // __cplusplus
  1033. #define __RPC__out
  1034. #define __RPC__in
  1035. #define __RPC__deref_out_opt
  1036. #define __RPC__in_opt
  1037. #define __RPC__inout_xcount(x)
  1038. #define __RPC__in_ecount_full(x)
  1039. #define __RPC__out_ecount_part(x, y)
  1040. #define __RPC__in_xcount(x)
  1041. #define __RPC__inout
  1042. #define __RPC__deref_out_ecount_full_opt(x)
  1043. typedef DWORD OLE_COLOR;
  1044. typedef union __m128i {
  1045. __int8 m128i_i8[16];
  1046. __int16 m128i_i16[8];
  1047. __int32 m128i_i32[4];
  1048. __int64 m128i_i64[2];
  1049. unsigned __int8 m128i_u8[16];
  1050. unsigned __int16 m128i_u16[8];
  1051. unsigned __int32 m128i_u32[4];
  1052. unsigned __int64 m128i_u64[2];
  1053. } __m128i;
  1054. #define PF_COMPARE_EXCHANGE_DOUBLE 2
  1055. typedef VOID (NTAPI * WAITORTIMERCALLBACKFUNC) (PVOID, BOOLEAN );
  1056. typedef HANDLE HWND;
  1057. #define IS_TEXT_UNICODE_SIGNATURE 0x0008
  1058. #define IS_TEXT_UNICODE_UNICODE_MASK 0x000F
  1059. BOOL IsTextUnicode(CONST VOID* lpv, int iSize, LPINT lpiResult);
  1060. typedef struct _LIST_ENTRY {
  1061. struct _LIST_ENTRY *Flink;
  1062. struct _LIST_ENTRY *Blink;
  1063. } LIST_ENTRY, *PLIST_ENTRY;
  1064. typedef VOID (__stdcall *WAITORTIMERCALLBACK)(PVOID, BOOLEAN);
  1065. // PORTABILITY_ASSERT and PORTABILITY_WARNING macros are meant to be used to
  1066. // mark places in the code that needs attention for portability. The usual
  1067. // usage pattern is:
  1068. //
  1069. // int get_scratch_register() {
  1070. // #if defined(_TARGET_X86_)
  1071. // return eax;
  1072. // #elif defined(_TARGET_AMD64_)
  1073. // return rax;
  1074. // #elif defined(_TARGET_ARM_)
  1075. // return r0;
  1076. // #else
  1077. // PORTABILITY_ASSERT("scratch register");
  1078. // return 0;
  1079. // #endif
  1080. // }
  1081. //
  1082. // PORTABILITY_ASSERT is meant to be used inside functions/methods. It can
  1083. // introduce compile-time and/or run-time errors.
  1084. // PORTABILITY_WARNING is meant to be used outside functions/methods. It can
  1085. // introduce compile-time errors or warnings only.
  1086. //
  1087. // People starting new ports will first define these to just cause run-time
  1088. // errors. Once they fix all the places that need attention for portability,
  1089. // they can define PORTABILITY_ASSERT and PORTABILITY_WARNING to cause
  1090. // compile-time errors to make sure that they haven't missed anything.
  1091. //
  1092. // If it is reasonably possible all codepaths containing PORTABILITY_ASSERT
  1093. // should be compilable (e.g. functions should return NULL or something if
  1094. // they are expected to return a value).
  1095. //
  1096. // The message in these two macros should not contain any keywords like TODO
  1097. // or NYI. It should be just the brief description of the problem.
  1098. #if defined(_TARGET_X86_)
  1099. // Finished ports - compile-time errors
  1100. #define PORTABILITY_WARNING(message) NEED_TO_PORT_THIS_ONE(NEED_TO_PORT_THIS_ONE)
  1101. #define PORTABILITY_ASSERT(message) NEED_TO_PORT_THIS_ONE(NEED_TO_PORT_THIS_ONE)
  1102. #else
  1103. // Ports in progress - run-time asserts only
  1104. #define PORTABILITY_WARNING(message)
  1105. #define PORTABILITY_ASSERT(message) _ASSERTE(false && message)
  1106. #endif
  1107. #define UNREFERENCED_PARAMETER(P) (void)(P)
  1108. #ifdef BIT64
  1109. #define VALPTR(x) VAL64(x)
  1110. #define GET_UNALIGNED_PTR(x) GET_UNALIGNED_64(x)
  1111. #define GET_UNALIGNED_VALPTR(x) GET_UNALIGNED_VAL64(x)
  1112. #define SET_UNALIGNED_PTR(p,x) SET_UNALIGNED_64(p,x)
  1113. #define SET_UNALIGNED_VALPTR(p,x) SET_UNALIGNED_VAL64(p,x)
  1114. #else
  1115. #define VALPTR(x) VAL32(x)
  1116. #define GET_UNALIGNED_PTR(x) GET_UNALIGNED_32(x)
  1117. #define GET_UNALIGNED_VALPTR(x) GET_UNALIGNED_VAL32(x)
  1118. #define SET_UNALIGNED_PTR(p,x) SET_UNALIGNED_32(p,x)
  1119. #define SET_UNALIGNED_VALPTR(p,x) SET_UNALIGNED_VAL32(p,x)
  1120. #endif
  1121. #ifdef _TARGET_AMD64_
  1122. #define RUNTIME_FUNCTION_INDIRECT 0x1
  1123. #endif
  1124. #define _ReturnAddress() __builtin_return_address(0)
  1125. #ifdef PLATFORM_UNIX
  1126. #define DIRECTORY_SEPARATOR_CHAR_A '/'
  1127. #define DIRECTORY_SEPARATOR_CHAR_W W('/')
  1128. #define DIRECTORY_SEPARATOR_STR_W W("/")
  1129. #define PATH_SEPARATOR_CHAR_W W(':')
  1130. #define PATH_SEPARATOR_STR_W W(":")
  1131. #define VOLUME_SEPARATOR_CHAR_W W('/')
  1132. #else // PLATFORM_UNIX
  1133. #define DIRECTORY_SEPARATOR_CHAR_A '\\'
  1134. #define DIRECTORY_SEPARATOR_CHAR_W W('\\')
  1135. #define DIRECTORY_SEPARATOR_STR_W W("\\")
  1136. #define PATH_SEPARATOR_CHAR_W W(';')
  1137. #define PATH_SEPARATOR_STR_W W(";")
  1138. #define VOLUME_SEPARATOR_CHAR_W W(':')
  1139. #endif // PLATFORM_UNIX
  1140. #ifndef IMAGE_IMPORT_DESC_FIELD
  1141. #define IMAGE_IMPORT_DESC_FIELD(img, f) ((img).u.f)
  1142. #endif
  1143. #ifndef IMAGE_COR20_HEADER_FIELD
  1144. #define IMAGE_COR20_HEADER_FIELD(obj, f) ((obj).f)
  1145. #endif
  1146. // copied from winnt.h
  1147. #define PROCESSOR_ARCHITECTURE_INTEL 0
  1148. #define PROCESSOR_ARCHITECTURE_MIPS 1
  1149. #define PROCESSOR_ARCHITECTURE_ALPHA 2
  1150. #define PROCESSOR_ARCHITECTURE_PPC 3
  1151. #define PROCESSOR_ARCHITECTURE_SHX 4
  1152. #define PROCESSOR_ARCHITECTURE_ARM 5
  1153. #define PROCESSOR_ARCHITECTURE_IA64 6
  1154. #define PROCESSOR_ARCHITECTURE_ALPHA64 7
  1155. #define PROCESSOR_ARCHITECTURE_MSIL 8
  1156. #define PROCESSOR_ARCHITECTURE_AMD64 9
  1157. #define PROCESSOR_ARCHITECTURE_IA32_ON_WIN64 10
  1158. #define PROCESSOR_ARCHITECTURE_NEUTRAL 11
  1159. #define PROCESSOR_ARCHITECTURE_ARM64 12
  1160. #define PROCESSOR_ARCHITECTURE_UNKNOWN 0xFFFF
  1161. //
  1162. // JIT Debugging Info. This structure is defined to have constant size in
  1163. // both the emulated and native environment.
  1164. //
  1165. typedef struct _JIT_DEBUG_INFO {
  1166. DWORD dwSize;
  1167. DWORD dwProcessorArchitecture;
  1168. DWORD dwThreadID;
  1169. DWORD dwReserved0;
  1170. ULONG64 lpExceptionAddress;
  1171. ULONG64 lpExceptionRecord;
  1172. ULONG64 lpContextRecord;
  1173. } JIT_DEBUG_INFO, *LPJIT_DEBUG_INFO;
  1174. typedef JIT_DEBUG_INFO JIT_DEBUG_INFO32, *LPJIT_DEBUG_INFO32;
  1175. typedef JIT_DEBUG_INFO JIT_DEBUG_INFO64, *LPJIT_DEBUG_INFO64;
  1176. /******************* resources ***************************************/
  1177. #define MAKEINTRESOURCEW(i) ((LPWSTR)((ULONG_PTR)((WORD)(i))))
  1178. #define RT_RCDATA MAKEINTRESOURCE(10)
  1179. #define RT_VERSION MAKEINTRESOURCE(16)
  1180. /******************* SAFEARRAY ************************/
  1181. #define FADF_VARIANT ( 0x800 )
  1182. typedef struct tagSAFEARRAYBOUND
  1183. {
  1184. ULONG cElements;
  1185. LONG lLbound;
  1186. } SAFEARRAYBOUND;
  1187. typedef struct tagSAFEARRAYBOUND *LPSAFEARRAYBOUND;
  1188. typedef struct tagSAFEARRAY
  1189. {
  1190. USHORT cDims;
  1191. USHORT fFeatures;
  1192. ULONG cbElements;
  1193. ULONG cLocks;
  1194. PVOID pvData;
  1195. SAFEARRAYBOUND rgsabound[ 1 ];
  1196. } SAFEARRAY;
  1197. typedef SAFEARRAY *LPSAFEARRAY;
  1198. STDAPI_(SAFEARRAY *) SafeArrayCreateVector(VARTYPE vt, LONG lLbound, ULONG cElements);
  1199. STDAPI_(UINT) SafeArrayGetDim(SAFEARRAY * psa);
  1200. STDAPI SafeArrayGetElement(SAFEARRAY * psa, LONG * rgIndices, void * pv);
  1201. STDAPI SafeArrayGetLBound(SAFEARRAY * psa, UINT nDim, LONG * plLbound);
  1202. STDAPI SafeArrayGetUBound(SAFEARRAY * psa, UINT nDim, LONG * plUbound);
  1203. STDAPI SafeArrayGetVartype(SAFEARRAY * psa, VARTYPE * pvt);
  1204. STDAPI SafeArrayPutElement(SAFEARRAY * psa, LONG * rgIndices, void * pv);
  1205. STDAPI SafeArrayDestroy(SAFEARRAY * psa);
  1206. EXTERN_C void * _stdcall _lfind(const void *, const void *, unsigned int *, unsigned int,
  1207. int (__cdecl *)(const void *, const void *));
  1208. /*<TODO>****************** clean this up ***********************</TODO>*/
  1209. interface IDispatch;
  1210. interface ITypeInfo;
  1211. interface ITypeLib;
  1212. interface IMoniker;
  1213. typedef VOID (WINAPI *LPOVERLAPPED_COMPLETION_ROUTINE)(
  1214. DWORD dwErrorCode,
  1215. DWORD dwNumberOfBytesTransfered,
  1216. LPVOID lpOverlapped);
  1217. //
  1218. // Debug APIs
  1219. //
  1220. #define EXCEPTION_DEBUG_EVENT 1
  1221. #define CREATE_THREAD_DEBUG_EVENT 2
  1222. #define CREATE_PROCESS_DEBUG_EVENT 3
  1223. #define EXIT_THREAD_DEBUG_EVENT 4
  1224. #define EXIT_PROCESS_DEBUG_EVENT 5
  1225. #define LOAD_DLL_DEBUG_EVENT 6
  1226. #define UNLOAD_DLL_DEBUG_EVENT 7
  1227. #define OUTPUT_DEBUG_STRING_EVENT 8
  1228. #define RIP_EVENT 9
  1229. typedef struct _EXCEPTION_DEBUG_INFO {
  1230. EXCEPTION_RECORD ExceptionRecord;
  1231. DWORD dwFirstChance;
  1232. } EXCEPTION_DEBUG_INFO, *LPEXCEPTION_DEBUG_INFO;
  1233. typedef struct _CREATE_THREAD_DEBUG_INFO {
  1234. HANDLE hThread;
  1235. LPVOID lpThreadLocalBase;
  1236. LPTHREAD_START_ROUTINE lpStartAddress;
  1237. } CREATE_THREAD_DEBUG_INFO, *LPCREATE_THREAD_DEBUG_INFO;
  1238. typedef struct _CREATE_PROCESS_DEBUG_INFO {
  1239. HANDLE hFile;
  1240. HANDLE hProcess;
  1241. HANDLE hThread;
  1242. LPVOID lpBaseOfImage;
  1243. DWORD dwDebugInfoFileOffset;
  1244. DWORD nDebugInfoSize;
  1245. LPVOID lpThreadLocalBase;
  1246. LPTHREAD_START_ROUTINE lpStartAddress;
  1247. LPVOID lpImageName;
  1248. WORD fUnicode;
  1249. } CREATE_PROCESS_DEBUG_INFO, *LPCREATE_PROCESS_DEBUG_INFO;
  1250. typedef struct _EXIT_THREAD_DEBUG_INFO {
  1251. DWORD dwExitCode;
  1252. } EXIT_THREAD_DEBUG_INFO, *LPEXIT_THREAD_DEBUG_INFO;
  1253. typedef struct _EXIT_PROCESS_DEBUG_INFO {
  1254. DWORD dwExitCode;
  1255. } EXIT_PROCESS_DEBUG_INFO, *LPEXIT_PROCESS_DEBUG_INFO;
  1256. typedef struct _LOAD_DLL_DEBUG_INFO {
  1257. HANDLE hFile;
  1258. LPVOID lpBaseOfDll;
  1259. DWORD dwDebugInfoFileOffset;
  1260. DWORD nDebugInfoSize;
  1261. LPVOID lpImageName;
  1262. WORD fUnicode;
  1263. } LOAD_DLL_DEBUG_INFO, *LPLOAD_DLL_DEBUG_INFO;
  1264. typedef struct _UNLOAD_DLL_DEBUG_INFO {
  1265. LPVOID lpBaseOfDll;
  1266. } UNLOAD_DLL_DEBUG_INFO, *LPUNLOAD_DLL_DEBUG_INFO;
  1267. typedef struct _OUTPUT_DEBUG_STRING_INFO {
  1268. LPSTR lpDebugStringData;
  1269. WORD fUnicode;
  1270. WORD nDebugStringLength;
  1271. } OUTPUT_DEBUG_STRING_INFO, *LPOUTPUT_DEBUG_STRING_INFO;
  1272. typedef struct _RIP_INFO {
  1273. DWORD dwError;
  1274. DWORD dwType;
  1275. } RIP_INFO, *LPRIP_INFO;
  1276. typedef struct _DEBUG_EVENT {
  1277. DWORD dwDebugEventCode;
  1278. DWORD dwProcessId;
  1279. DWORD dwThreadId;
  1280. union {
  1281. EXCEPTION_DEBUG_INFO Exception;
  1282. CREATE_THREAD_DEBUG_INFO CreateThread;
  1283. CREATE_PROCESS_DEBUG_INFO CreateProcessInfo;
  1284. EXIT_THREAD_DEBUG_INFO ExitThread;
  1285. EXIT_PROCESS_DEBUG_INFO ExitProcess;
  1286. LOAD_DLL_DEBUG_INFO LoadDll;
  1287. UNLOAD_DLL_DEBUG_INFO UnloadDll;
  1288. OUTPUT_DEBUG_STRING_INFO DebugString;
  1289. RIP_INFO RipInfo;
  1290. } u;
  1291. } DEBUG_EVENT, *LPDEBUG_EVENT;
  1292. //
  1293. // Define dynamic function table entry.
  1294. //
  1295. typedef
  1296. PRUNTIME_FUNCTION
  1297. GET_RUNTIME_FUNCTION_CALLBACK (
  1298. DWORD64 ControlPc,
  1299. PVOID Context
  1300. );
  1301. typedef GET_RUNTIME_FUNCTION_CALLBACK *PGET_RUNTIME_FUNCTION_CALLBACK;
  1302. typedef
  1303. DWORD
  1304. OUT_OF_PROCESS_FUNCTION_TABLE_CALLBACK (
  1305. HANDLE Process,
  1306. PVOID TableAddress,
  1307. PDWORD Entries,
  1308. PRUNTIME_FUNCTION* Functions
  1309. );
  1310. typedef OUT_OF_PROCESS_FUNCTION_TABLE_CALLBACK *POUT_OF_PROCESS_FUNCTION_TABLE_CALLBACK;
  1311. #define OUT_OF_PROCESS_FUNCTION_TABLE_CALLBACK_EXPORT_NAME \
  1312. "OutOfProcessFunctionTableCallback"
  1313. #if defined(FEATURE_PAL_SXS)
  1314. // #if !defined(_TARGET_MAC64)
  1315. // typedef LONG (*PEXCEPTION_ROUTINE)(
  1316. // IN PEXCEPTION_POINTERS pExceptionPointers,
  1317. // IN LPVOID lpvParam);
  1318. // #define DISPATCHER_CONTEXT LPVOID
  1319. // #else // defined(_TARGET_MAC64)
  1320. //
  1321. // Define unwind history table structure.
  1322. //
  1323. #define UNWIND_HISTORY_TABLE_SIZE 12
  1324. typedef struct _UNWIND_HISTORY_TABLE_ENTRY {
  1325. DWORD64 ImageBase;
  1326. PRUNTIME_FUNCTION FunctionEntry;
  1327. } UNWIND_HISTORY_TABLE_ENTRY, *PUNWIND_HISTORY_TABLE_ENTRY;
  1328. typedef struct _UNWIND_HISTORY_TABLE {
  1329. DWORD Count;
  1330. BYTE LocalHint;
  1331. BYTE GlobalHint;
  1332. BYTE Search;
  1333. BYTE Once;
  1334. DWORD64 LowAddress;
  1335. DWORD64 HighAddress;
  1336. UNWIND_HISTORY_TABLE_ENTRY Entry[UNWIND_HISTORY_TABLE_SIZE];
  1337. } UNWIND_HISTORY_TABLE, *PUNWIND_HISTORY_TABLE;
  1338. typedef
  1339. EXCEPTION_DISPOSITION
  1340. (*PEXCEPTION_ROUTINE) (
  1341. PEXCEPTION_RECORD ExceptionRecord,
  1342. ULONG64 EstablisherFrame,
  1343. PCONTEXT ContextRecord,
  1344. PVOID DispatcherContext
  1345. );
  1346. #if defined(_ARM_)
  1347. typedef struct _DISPATCHER_CONTEXT {
  1348. DWORD ControlPc;
  1349. DWORD ImageBase;
  1350. PRUNTIME_FUNCTION FunctionEntry;
  1351. DWORD EstablisherFrame;
  1352. DWORD TargetPc;
  1353. PCONTEXT ContextRecord;
  1354. PEXCEPTION_ROUTINE LanguageHandler;
  1355. PVOID HandlerData;
  1356. PUNWIND_HISTORY_TABLE HistoryTable;
  1357. DWORD ScopeIndex;
  1358. BOOLEAN ControlPcIsUnwound;
  1359. PBYTE NonVolatileRegisters;
  1360. DWORD Reserved;
  1361. } DISPATCHER_CONTEXT, *PDISPATCHER_CONTEXT;
  1362. #elif defined(_ARM64_)
  1363. typedef struct _DISPATCHER_CONTEXT {
  1364. ULONG64 ControlPc;
  1365. ULONG64 ImageBase;
  1366. PRUNTIME_FUNCTION FunctionEntry;
  1367. ULONG64 EstablisherFrame;
  1368. ULONG64 TargetPc;
  1369. PCONTEXT ContextRecord;
  1370. PEXCEPTION_ROUTINE LanguageHandler;
  1371. PVOID HandlerData;
  1372. PUNWIND_HISTORY_TABLE HistoryTable;
  1373. ULONG64 ScopeIndex;
  1374. BOOLEAN ControlPcIsUnwound;
  1375. PBYTE NonVolatileRegisters;
  1376. ULONG64 Reserved;
  1377. } DISPATCHER_CONTEXT, *PDISPATCHER_CONTEXT;
  1378. #else
  1379. typedef struct _DISPATCHER_CONTEXT {
  1380. ULONG64 ControlPc;
  1381. ULONG64 ImageBase;
  1382. PRUNTIME_FUNCTION FunctionEntry;
  1383. ULONG64 EstablisherFrame;
  1384. ULONG64 TargetIp;
  1385. PCONTEXT ContextRecord;
  1386. PEXCEPTION_ROUTINE LanguageHandler;
  1387. PVOID HandlerData;
  1388. PUNWIND_HISTORY_TABLE HistoryTable;
  1389. } DISPATCHER_CONTEXT, *PDISPATCHER_CONTEXT;
  1390. #endif
  1391. // #endif // !defined(_TARGET_MAC64)
  1392. typedef DISPATCHER_CONTEXT *PDISPATCHER_CONTEXT;
  1393. #define ExceptionContinueSearch EXCEPTION_CONTINUE_SEARCH
  1394. #define ExceptionStackUnwind EXCEPTION_EXECUTE_HANDLER
  1395. #define ExceptionContinueExecution EXCEPTION_CONTINUE_EXECUTION
  1396. #endif // FEATURE_PAL_SXS
  1397. typedef struct _EXCEPTION_REGISTRATION_RECORD EXCEPTION_REGISTRATION_RECORD;
  1398. typedef EXCEPTION_REGISTRATION_RECORD *PEXCEPTION_REGISTRATION_RECORD;
  1399. typedef LPVOID HKEY;
  1400. typedef LPVOID PACL;
  1401. typedef LPVOID LPBC;
  1402. typedef LPVOID PSECURITY_DESCRIPTOR;
  1403. typedef struct _EXCEPTION_RECORD64 {
  1404. DWORD ExceptionCode;
  1405. ULONG ExceptionFlags;
  1406. ULONG64 ExceptionRecord;
  1407. ULONG64 ExceptionAddress;
  1408. ULONG NumberParameters;
  1409. ULONG __unusedAlignment;
  1410. ULONG64 ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
  1411. } EXCEPTION_RECORD64, *PEXCEPTION_RECORD64;
  1412. typedef LONG (WINAPI *PTOP_LEVEL_EXCEPTION_FILTER)(
  1413. IN struct _EXCEPTION_POINTERS *ExceptionInfo
  1414. );
  1415. typedef PTOP_LEVEL_EXCEPTION_FILTER LPTOP_LEVEL_EXCEPTION_FILTER;
  1416. /******************* ntdef ************************************/
  1417. #ifndef ANYSIZE_ARRAY
  1418. #define ANYSIZE_ARRAY 1 // winnt
  1419. #endif
  1420. /******************* winnt ************************************/
  1421. typedef struct LIST_ENTRY32 {
  1422. ULONG Flink;
  1423. ULONG Blink;
  1424. } LIST_ENTRY32;
  1425. typedef LIST_ENTRY32 *PLIST_ENTRY32;
  1426. typedef struct LIST_ENTRY64 {
  1427. ULONGLONG Flink;
  1428. ULONGLONG Blink;
  1429. } LIST_ENTRY64;
  1430. typedef LIST_ENTRY64 *PLIST_ENTRY64;
  1431. /******************** PAL RT APIs *******************************/
  1432. typedef struct _HSATELLITE *HSATELLITE;
  1433. EXTERN_C HSATELLITE PALAPI PAL_LoadSatelliteResourceW(LPCWSTR SatelliteResourceFileName);
  1434. EXTERN_C HSATELLITE PALAPI PAL_LoadSatelliteResourceA(LPCSTR SatelliteResourceFileName);
  1435. EXTERN_C BOOL PALAPI PAL_FreeSatelliteResource(HSATELLITE SatelliteResource);
  1436. EXTERN_C UINT PALAPI PAL_LoadSatelliteStringW(HSATELLITE SatelliteResource,
  1437. UINT uID,
  1438. LPWSTR lpBuffer,
  1439. UINT nBufferMax);
  1440. EXTERN_C UINT PALAPI PAL_LoadSatelliteStringA(HSATELLITE SatelliteResource,
  1441. UINT uID,
  1442. LPSTR lpBuffer,
  1443. UINT nBufferMax);
  1444. EXTERN_C HRESULT PALAPI PAL_CoCreateInstance(REFCLSID rclsid,
  1445. REFIID riid,
  1446. void **ppv);
  1447. // So we can have CoCreateInstance in most of the code base,
  1448. // instead of spreading around of if'def FEATURE_PALs for PAL_CoCreateInstance.
  1449. #define CoCreateInstance(rclsid, pUnkOuter, dwClsContext, riid, ppv) PAL_CoCreateInstance(rclsid, riid, ppv)
  1450. /************** verrsrc.h ************************************/
  1451. /* ----- VS_VERSION.dwFileFlags ----- */
  1452. #define VS_FF_DEBUG 0x00000001L
  1453. #define VS_FF_PRERELEASE 0x00000002L
  1454. #define VS_FF_PATCHED 0x00000004L
  1455. #define VS_FF_PRIVATEBUILD 0x00000008L
  1456. #define VS_FF_INFOINFERRED 0x00000010L
  1457. #define VS_FF_SPECIALBUILD 0x00000020L
  1458. /* ----- Types and structures ----- */
  1459. typedef struct tagVS_FIXEDFILEINFO
  1460. {
  1461. DWORD dwSignature; /* e.g. 0xfeef04bd */
  1462. DWORD dwStrucVersion; /* e.g. 0x00000042 = "0.42" */
  1463. DWORD dwFileVersionMS; /* e.g. 0x00030075 = "3.75" */
  1464. DWORD dwFileVersionLS; /* e.g. 0x00000031 = "0.31" */
  1465. DWORD dwProductVersionMS; /* e.g. 0x00030010 = "3.10" */
  1466. DWORD dwProductVersionLS; /* e.g. 0x00000031 = "0.31" */
  1467. DWORD dwFileFlagsMask; /* = 0x3F for version "0.42" */
  1468. DWORD dwFileFlags; /* e.g. VFF_DEBUG | VFF_PRERELEASE */
  1469. DWORD dwFileOS; /* e.g. VOS_DOS_WINDOWS16 */
  1470. DWORD dwFileType; /* e.g. VFT_DRIVER */
  1471. DWORD dwFileSubtype; /* e.g. VFT2_DRV_KEYBOARD */
  1472. DWORD dwFileDateMS; /* e.g. 0 */
  1473. DWORD dwFileDateLS; /* e.g. 0 */
  1474. } VS_FIXEDFILEINFO;
  1475. /************** Byte swapping & unaligned access ******************/
  1476. #include <pal_endian.h>
  1477. /******************** external includes *************************/
  1478. #include "ntimage.h"
  1479. #ifndef PAL_STDCPP_COMPAT
  1480. // #include "cpp/ccombstr.h"
  1481. // #include "cpp/cstring.h"
  1482. #endif // !PAL_STDCPP_COMPAT
  1483. // #include "sscli_version.h"
  1484. #endif // RC_INVOKED
  1485. #endif // __PALRT_H__