| 1 | // Copyright (C) Microsoft Corporation. All rights reserved. |
| 2 | #pragma once |
| 3 | |
| 4 | // Lxcore type definitions. |
| 5 | typedef int LX_INT; |
| 6 | typedef unsigned long LX_UID_T; |
| 7 | typedef unsigned long LX_GID_T; |
| 8 | typedef unsigned long LX_MODE_T; |
| 9 | |
| 10 | // Windows-like type definitions |
| 11 | typedef std::uint8_t UINT8; |
| 12 | typedef std::int8_t INT8; |
| 13 | typedef std::uint16_t UINT16; |
| 14 | typedef std::int16_t INT16; |
| 15 | typedef std::uint32_t UINT32; |
| 16 | typedef std::int32_t INT32; |
| 17 | typedef std::uint64_t UINT64; |
| 18 | typedef std::int64_t INT64; |
| 19 | typedef std::uintptr_t ULONG_PTR; |
| 20 | typedef unsigned char UCHAR; |
| 21 | typedef const char* PCSTR; |
| 22 | |
| 23 | typedef struct _GUID |
| 24 | { |
| 25 | std::uint32_t Data1; |
| 26 | std::uint16_t Data2; |
| 27 | std::uint16_t Data3; |
| 28 | std::uint8_t Data4[8]; |
| 29 | |
| 30 | bool operator==(const _GUID& other) const |
| 31 | { |
| 32 | return memcmp(this, &other, sizeof(*this)) == 0; |
| 33 | } |
| 34 | |
| 35 | bool operator!=(const _GUID& other) const |
| 36 | { |
| 37 | return !(*this == other); |
| 38 | } |
| 39 | } GUID; |
| 40 | |
| 41 | static_assert(sizeof(GUID) == 16); |
| 42 | |
| 43 | // Lxcore versions of error values. |
| 44 | // N.B. These are negative. |
| 45 | #define LX_EPERM (-EPERM) |
| 46 | #define LX_ENOENT (-ENOENT) |
| 47 | #define LX_ESRCH (-ESRCH) |
| 48 | #define LX_EINTR (-EINTR) |
| 49 | #define LX_EIO (-EIO) |
| 50 | #define LX_ENXIO (-ENXIO) |
| 51 | #define LX_ENOEXEC (-ENOEXEC) |
| 52 | #define LX_E2BIG (-E2BIG) |
| 53 | #define LX_EBADF (-EBADF) |
| 54 | #define LX_ECHILD (-ECHILD) |
| 55 | #define LX_EAGAIN (-EAGAIN) |
| 56 | #define LX_EWOULDBLOCK (-EWOULDBLOCK) |
| 57 | #define LX_ENOMEM (-ENOMEM) |
| 58 | #define LX_EACCES (-EACCES) |
| 59 | #define LX_EFAULT (-EFAULT) |
| 60 | #define LX_EBUSY (-EBUSY) |
| 61 | #define LX_EEXIST (-EEXIST) |
| 62 | #define LX_EXDEV (-EXDEV) |
| 63 | #define LX_ENODEV (-ENODEV) |
| 64 | #define LX_ENOTDIR (-ENOTDIR) |
| 65 | #define LX_EISDIR (-EISDIR) |
| 66 | #define LX_EINVAL (-EINVAL) |
| 67 | #define LX_ENFILE (-ENFILE) |
| 68 | #define LX_EMFILE (-EMFILE) |
| 69 | #define LX_ENOTTY (-ENOTTY) |
| 70 | #define LX_EFBIG (-EFBIG) |
| 71 | #define LX_ENOSPC (-ENOSPC) |
| 72 | #define LX_ESPIPE (-ESPIPE) |
| 73 | #define LX_EROFS (-EROFS) |
| 74 | #define LX_EMLINK (-EMLINK) |
| 75 | #define LX_EPIPE (-EPIPE) |
| 76 | #define LX_ERANGE (-ERANGE) |
| 77 | #define LX_EDEADLK (-EDEADLK) |
| 78 | #define LX_ENAMETOOLONG (-ENAMETOOLONG) |
| 79 | #define LX_ENOLCK (-ENOLCK) |
| 80 | #define LX_ENOSYS (-ENOSYS) |
| 81 | #define LX_ENOTEMPTY (-ENOTEMPTY) |
| 82 | #define LX_ELOOP (-ELOOP) |
| 83 | #define LX_EIDRM (-EIDRM) |
| 84 | #define LX_ENODATA (-ENODATA) |
| 85 | #define LX_ENOATTR (-ENOATTR) |
| 86 | #define LX_EPROTO (-EPROTO) |
| 87 | #define LX_EOVERFLOW (-EOVERFLOW) |
| 88 | #define LX_EUSERS (-EUSERS) |
| 89 | #define LX_ENOTSOCK (-ENOTSOCK) |
| 90 | #define LX_EDESTADDRREQ (-EDESTADDRREQ) |
| 91 | #define LX_EMSGSIZE (-EMSGSIZE) |
| 92 | #define LX_EPROTOTYPE (-EPROTOTYPE) |
| 93 | #define LX_ENOPROTOOPT (-ENOPROTOOPT) |
| 94 | #define LX_EPROTONOSUPPORT (-EPROTONOSUPPORT) |
| 95 | #define LX_ESOCKTNOSUPPORT (-ESOCKTNOSUPPORT) |
| 96 | #define LX_EOPNOTSUPP (-EOPNOTSUPP) |
| 97 | #define LX_ENOTSUP (-ENOTSUP) |
| 98 | #define LX_EAFNOSUPPORT (-EAFNOSUPPORT) |
| 99 | #define LX_EADDRINUSE (-EADDRINUSE) |
| 100 | #define LX_EADDRNOTAVAIL (-EADDRNOTAVAIL) |
| 101 | #define LX_ENETUNREACH (-ENETUNREACH) |
| 102 | #define LX_ECONNABORTED (-ECONNABORTED) |
| 103 | #define LX_ECONNRESET (-ECONNRESET) |
| 104 | #define LX_ENOBUFS (-ENOBUFS) |
| 105 | #define LX_EISCONN (-EISCONN) |
| 106 | #define LX_ENOTCONN (-ENOTCONN) |
| 107 | #define LX_ETIMEDOUT (-ETIMEDOUT) |
| 108 | #define LX_ECONNREFUSED (-ECONNREFUSED) |
| 109 | #define LX_EHOSTDOWN (-EHOSTDOWN) |
| 110 | #define LX_EHOSTUNREACH (-EHOSTUNREACH) |
| 111 | #define LX_EALREADY (-EALREADY) |
| 112 | #define LX_EINPROGRESS (-EINPROGRESS) |
| 113 | #define LX_ENOMEDIUM (-ENOMEDIUM) |
| 114 | #define LX_EMEDIUMTYPE (-EMEDIUMTYPE) |
| 115 | #define LX_ECANCELED (-ECANCELED) |
| 116 | #define LX_ENOKEY (-ENOKEY) |
| 117 | |
| 118 | // Lxcore version of constants |
| 119 | #define LX_PATH_MAX (PATH_MAX) |
| 120 | #define LX_DT_DIR (DT_DIR) |
| 121 | #define LX_DT_LNK (DT_LNK) |
| 122 | |
| 123 | // Other definitions available on NT. |
| 124 | extern "C++" { |
| 125 | |
| 126 | template <size_t S> |
| 127 | struct _ENUM_FLAG_INTEGER_FOR_SIZE; |
| 128 | |
| 129 | template <> |
| 130 | struct _ENUM_FLAG_INTEGER_FOR_SIZE<1> |
| 131 | { |
| 132 | typedef INT8 type; |
| 133 | }; |
| 134 | |
| 135 | template <> |
| 136 | struct _ENUM_FLAG_INTEGER_FOR_SIZE<2> |
| 137 | { |
| 138 | typedef INT16 type; |
| 139 | }; |
| 140 | |
| 141 | template <> |
| 142 | struct _ENUM_FLAG_INTEGER_FOR_SIZE<4> |
| 143 | { |
| 144 | typedef INT32 type; |
| 145 | }; |
| 146 | |
| 147 | template <> |
| 148 | struct _ENUM_FLAG_INTEGER_FOR_SIZE<8> |
| 149 | { |
| 150 | typedef INT64 type; |
| 151 | }; |
| 152 | |
| 153 | // used as an approximation of std::underlying_type<T> |
| 154 | template <class T> |
| 155 | struct _ENUM_FLAG_SIZED_INTEGER |
| 156 | { |
| 157 | typedef typename _ENUM_FLAG_INTEGER_FOR_SIZE<sizeof(T)>::type type; |
| 158 | }; |
| 159 | } |
| 160 | |
| 161 | #define _ENUM_FLAG_CONSTEXPR constexpr |
| 162 | #define DEFINE_ENUM_FLAG_OPERATORS(ENUMTYPE) \ |
| 163 | extern "C++" { \ |
| 164 | inline _ENUM_FLAG_CONSTEXPR ENUMTYPE operator|(ENUMTYPE a, ENUMTYPE b) throw() \ |
| 165 | { \ |
| 166 | return ENUMTYPE(((_ENUM_FLAG_SIZED_INTEGER<ENUMTYPE>::type)a) | ((_ENUM_FLAG_SIZED_INTEGER<ENUMTYPE>::type)b)); \ |
| 167 | } \ |
| 168 | inline ENUMTYPE& operator|=(ENUMTYPE& a, ENUMTYPE b) throw() \ |
| 169 | { \ |
| 170 | return (ENUMTYPE&)(((_ENUM_FLAG_SIZED_INTEGER<ENUMTYPE>::type&)a) |= ((_ENUM_FLAG_SIZED_INTEGER<ENUMTYPE>::type)b)); \ |
| 171 | } \ |
| 172 | inline _ENUM_FLAG_CONSTEXPR ENUMTYPE operator&(ENUMTYPE a, ENUMTYPE b) throw() \ |
| 173 | { \ |
| 174 | return ENUMTYPE(((_ENUM_FLAG_SIZED_INTEGER<ENUMTYPE>::type)a) & ((_ENUM_FLAG_SIZED_INTEGER<ENUMTYPE>::type)b)); \ |
| 175 | } \ |
| 176 | inline ENUMTYPE& operator&=(ENUMTYPE& a, ENUMTYPE b) throw() \ |
| 177 | { \ |
| 178 | return (ENUMTYPE&)(((_ENUM_FLAG_SIZED_INTEGER<ENUMTYPE>::type&)a) &= ((_ENUM_FLAG_SIZED_INTEGER<ENUMTYPE>::type)b)); \ |
| 179 | } \ |
| 180 | inline _ENUM_FLAG_CONSTEXPR ENUMTYPE operator~(ENUMTYPE a) throw() \ |
| 181 | { \ |
| 182 | return ENUMTYPE(~((_ENUM_FLAG_SIZED_INTEGER<ENUMTYPE>::type)a)); \ |
| 183 | } \ |
| 184 | inline _ENUM_FLAG_CONSTEXPR ENUMTYPE operator^(ENUMTYPE a, ENUMTYPE b) throw() \ |
| 185 | { \ |
| 186 | return ENUMTYPE(((_ENUM_FLAG_SIZED_INTEGER<ENUMTYPE>::type)a) ^ ((_ENUM_FLAG_SIZED_INTEGER<ENUMTYPE>::type)b)); \ |
| 187 | } \ |
| 188 | inline ENUMTYPE& operator^=(ENUMTYPE& a, ENUMTYPE b) throw() \ |
| 189 | { \ |
| 190 | return (ENUMTYPE&)(((_ENUM_FLAG_SIZED_INTEGER<ENUMTYPE>::type&)a) ^= ((_ENUM_FLAG_SIZED_INTEGER<ENUMTYPE>::type)b)); \ |
| 191 | } \ |
| 192 | } |
| 193 | |
| 194 | typedef struct _LIST_ENTRY |
| 195 | { |
| 196 | struct _LIST_ENTRY* Flink; |
| 197 | struct _LIST_ENTRY* Blink; |
| 198 | } LIST_ENTRY, *PLIST_ENTRY; |
| 199 | |
| 200 | inline void InitializeListHead(PLIST_ENTRY listHead) |
| 201 | { |
| 202 | listHead->Flink = listHead->Blink = listHead; |
| 203 | } |
| 204 | |
| 205 | [[nodiscard]] inline bool IsListEmpty(const LIST_ENTRY* listHead) |
| 206 | { |
| 207 | return listHead->Flink == listHead; |
| 208 | } |
| 209 | |
| 210 | inline void InsertTailList(PLIST_ENTRY listHead, PLIST_ENTRY entry) |
| 211 | { |
| 212 | PLIST_ENTRY blink = listHead->Blink; |
| 213 | entry->Flink = listHead; |
| 214 | entry->Blink = blink; |
| 215 | blink->Flink = entry; |
| 216 | listHead->Blink = entry; |
| 217 | } |
| 218 | |
| 219 | inline bool RemoveEntryList(PLIST_ENTRY entry) |
| 220 | { |
| 221 | PLIST_ENTRY flink = entry->Flink; |
| 222 | PLIST_ENTRY blink = entry->Blink; |
| 223 | blink->Flink = flink; |
| 224 | flink->Blink = blink; |
| 225 | return flink == blink; |
| 226 | } |
| 227 | |
| 228 | #define CONTAINING_RECORD(address, type, field) ((type*)((char*)(address) - (ULONG_PTR)(&((type*)0)->field))) |