| 1 | /* $Id: nthlpcore.c 2862 2016-09-02 02:39:56Z bird $ */
|
|---|
| 2 | /** @file
|
|---|
| 3 | * MSC + NT core helpers functions and globals.
|
|---|
| 4 | */
|
|---|
| 5 |
|
|---|
| 6 | /*
|
|---|
| 7 | * Copyright (c) 2005-2013 knut st. osmundsen <bird-kBuild-spamx@anduin.net>
|
|---|
| 8 | *
|
|---|
| 9 | * Permission is hereby granted, free of charge, to any person obtaining a
|
|---|
| 10 | * copy of this software and associated documentation files (the "Software"),
|
|---|
| 11 | * to deal in the Software without restriction, including without limitation
|
|---|
| 12 | * the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|---|
| 13 | * and/or sell copies of the Software, and to permit persons to whom the
|
|---|
| 14 | * Software is furnished to do so, subject to the following conditions:
|
|---|
| 15 | *
|
|---|
| 16 | * The above copyright notice and this permission notice shall be included
|
|---|
| 17 | * in all copies or substantial portions of the Software.
|
|---|
| 18 | *
|
|---|
| 19 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|---|
| 20 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|---|
| 21 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|---|
| 22 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|---|
| 23 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|---|
| 24 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|---|
| 25 | * IN THE SOFTWARE.
|
|---|
| 26 | *
|
|---|
| 27 | * Alternatively, the content of this file may be used under the terms of the
|
|---|
| 28 | * GPL version 2 or later, or LGPL version 2.1 or later.
|
|---|
| 29 | */
|
|---|
| 30 |
|
|---|
| 31 | /*******************************************************************************
|
|---|
| 32 | * Header Files *
|
|---|
| 33 | *******************************************************************************/
|
|---|
| 34 | #include <errno.h>
|
|---|
| 35 | #include "nthlp.h"
|
|---|
| 36 | #ifndef NDEBUG
|
|---|
| 37 | # include <stdio.h>
|
|---|
| 38 | #endif
|
|---|
| 39 |
|
|---|
| 40 |
|
|---|
| 41 | /*******************************************************************************
|
|---|
| 42 | * Global Variables *
|
|---|
| 43 | *******************************************************************************/
|
|---|
| 44 | MY_NTSTATUS (WINAPI *g_pfnNtClose)(HANDLE);
|
|---|
| 45 | MY_NTSTATUS (WINAPI *g_pfnNtCreateFile)(PHANDLE, MY_ACCESS_MASK, MY_OBJECT_ATTRIBUTES *, MY_IO_STATUS_BLOCK *,
|
|---|
| 46 | PLARGE_INTEGER, ULONG, ULONG, ULONG, ULONG, PVOID, ULONG);
|
|---|
| 47 | MY_NTSTATUS (WINAPI *g_pfnNtDeleteFile)(MY_OBJECT_ATTRIBUTES *);
|
|---|
| 48 | MY_NTSTATUS (WINAPI *g_pfnNtReadFile)(HANDLE hFile, HANDLE hEvent, MY_IO_APC_ROUTINE *pfnApc, PVOID pvApcCtx,
|
|---|
| 49 | MY_IO_STATUS_BLOCK *, PVOID pvBuf, ULONG cbToRead, PLARGE_INTEGER poffFile,
|
|---|
| 50 | PULONG puKey);
|
|---|
| 51 | MY_NTSTATUS (WINAPI *g_pfnNtQueryInformationFile)(HANDLE, MY_IO_STATUS_BLOCK *, PVOID, LONG, MY_FILE_INFORMATION_CLASS);
|
|---|
| 52 | MY_NTSTATUS (WINAPI *g_pfnNtQueryVolumeInformationFile)(HANDLE, MY_IO_STATUS_BLOCK *, PVOID, LONG, MY_FS_INFORMATION_CLASS);
|
|---|
| 53 | MY_NTSTATUS (WINAPI *g_pfnNtQueryDirectoryFile)(HANDLE, HANDLE, MY_IO_APC_ROUTINE *, PVOID, MY_IO_STATUS_BLOCK *,
|
|---|
| 54 | PVOID, ULONG, MY_FILE_INFORMATION_CLASS, BOOLEAN,
|
|---|
| 55 | MY_UNICODE_STRING *, BOOLEAN);
|
|---|
| 56 | MY_NTSTATUS (WINAPI *g_pfnNtQueryAttributesFile)(MY_OBJECT_ATTRIBUTES *, MY_FILE_BASIC_INFORMATION *);
|
|---|
| 57 | MY_NTSTATUS (WINAPI *g_pfnNtQueryFullAttributesFile)(MY_OBJECT_ATTRIBUTES *, MY_FILE_NETWORK_OPEN_INFORMATION *);
|
|---|
| 58 | MY_NTSTATUS (WINAPI *g_pfnNtSetInformationFile)(HANDLE, MY_IO_STATUS_BLOCK *, PVOID, LONG, MY_FILE_INFORMATION_CLASS);
|
|---|
| 59 | BOOLEAN (WINAPI *g_pfnRtlDosPathNameToNtPathName_U)(PCWSTR, MY_UNICODE_STRING *, PCWSTR *, MY_RTL_RELATIVE_NAME_U *);
|
|---|
| 60 | MY_NTSTATUS (WINAPI *g_pfnRtlAnsiStringToUnicodeString)(MY_UNICODE_STRING *, MY_ANSI_STRING const *, BOOLEAN);
|
|---|
| 61 | BOOLEAN (WINAPI *g_pfnRtlEqualUnicodeString)(MY_UNICODE_STRING const *, MY_UNICODE_STRING const *, BOOLEAN);
|
|---|
| 62 | BOOLEAN (WINAPI *g_pfnRtlEqualString)(MY_ANSI_STRING const *, MY_ANSI_STRING const *, BOOLEAN);
|
|---|
| 63 | UCHAR (WINAPI *g_pfnRtlUpperChar)(UCHAR uch);
|
|---|
| 64 |
|
|---|
| 65 |
|
|---|
| 66 | static struct
|
|---|
| 67 | {
|
|---|
| 68 | FARPROC *ppfn;
|
|---|
| 69 | const char *pszName;
|
|---|
| 70 | } const g_apfnDynamicNtdll[] =
|
|---|
| 71 | {
|
|---|
| 72 | { (FARPROC *)&g_pfnNtClose, "NtClose" },
|
|---|
| 73 | { (FARPROC *)&g_pfnNtCreateFile, "NtCreateFile" },
|
|---|
| 74 | { (FARPROC *)&g_pfnNtDeleteFile, "NtDeleteFile" },
|
|---|
| 75 | { (FARPROC *)&g_pfnNtReadFile, "NtReadFile" },
|
|---|
| 76 | { (FARPROC *)&g_pfnNtQueryInformationFile, "NtQueryInformationFile" },
|
|---|
| 77 | { (FARPROC *)&g_pfnNtQueryVolumeInformationFile, "NtQueryVolumeInformationFile" },
|
|---|
| 78 | { (FARPROC *)&g_pfnNtQueryDirectoryFile, "NtQueryDirectoryFile" },
|
|---|
| 79 | { (FARPROC *)&g_pfnNtQueryAttributesFile, "NtQueryAttributesFile" },
|
|---|
| 80 | { (FARPROC *)&g_pfnNtQueryFullAttributesFile, "NtQueryFullAttributesFile" },
|
|---|
| 81 | { (FARPROC *)&g_pfnNtSetInformationFile, "NtSetInformationFile" },
|
|---|
| 82 | { (FARPROC *)&g_pfnRtlDosPathNameToNtPathName_U, "RtlDosPathNameToNtPathName_U" },
|
|---|
| 83 | { (FARPROC *)&g_pfnRtlAnsiStringToUnicodeString, "RtlAnsiStringToUnicodeString" },
|
|---|
| 84 | { (FARPROC *)&g_pfnRtlEqualUnicodeString, "RtlEqualUnicodeString" },
|
|---|
| 85 | { (FARPROC *)&g_pfnRtlEqualString, "RtlEqualString" },
|
|---|
| 86 | { (FARPROC *)&g_pfnRtlUpperChar, "RtlUpperChar" },
|
|---|
| 87 | };
|
|---|
| 88 | /** Set to 1 if we've successfully resolved the imports, otherwise 0. */
|
|---|
| 89 | int g_fResolvedNtImports = 0;
|
|---|
| 90 |
|
|---|
| 91 |
|
|---|
| 92 |
|
|---|
| 93 | void birdResolveImportsWorker(void)
|
|---|
| 94 | {
|
|---|
| 95 | HMODULE hMod = LoadLibraryW(L"ntdll.dll");
|
|---|
| 96 | int i = sizeof(g_apfnDynamicNtdll) / sizeof(g_apfnDynamicNtdll[0]);
|
|---|
| 97 | while (i-- > 0)
|
|---|
| 98 | {
|
|---|
| 99 | const char *pszSym = g_apfnDynamicNtdll[i].pszName;
|
|---|
| 100 | FARPROC pfn;
|
|---|
| 101 | *g_apfnDynamicNtdll[i].ppfn = pfn = GetProcAddress(hMod, pszSym);
|
|---|
| 102 | if (!pfn)
|
|---|
| 103 | {
|
|---|
| 104 | /* Write short message and die. */
|
|---|
| 105 | static const char s_szMsg[] = "\r\nFatal error resolving NTDLL.DLL symbols!\r\nSymbol: ";
|
|---|
| 106 | DWORD cbWritten;
|
|---|
| 107 | if ( !WriteFile(GetStdHandle(STD_ERROR_HANDLE), s_szMsg, sizeof(s_szMsg) - 1, &cbWritten, NULL)
|
|---|
| 108 | || !WriteFile(GetStdHandle(STD_ERROR_HANDLE), pszSym, (DWORD)strlen(pszSym), &cbWritten, NULL)
|
|---|
| 109 | || !WriteFile(GetStdHandle(STD_ERROR_HANDLE), "\r\n", sizeof("\r\n") - 1, &cbWritten, NULL)
|
|---|
| 110 | )
|
|---|
| 111 | *(void **)i = NULL;
|
|---|
| 112 | ExitProcess(127);
|
|---|
| 113 | }
|
|---|
| 114 | }
|
|---|
| 115 |
|
|---|
| 116 | g_fResolvedNtImports = 1;
|
|---|
| 117 | }
|
|---|
| 118 |
|
|---|
| 119 |
|
|---|
| 120 | void *birdTmpAlloc(size_t cb)
|
|---|
| 121 | {
|
|---|
| 122 | return malloc(cb);
|
|---|
| 123 | }
|
|---|
| 124 |
|
|---|
| 125 |
|
|---|
| 126 | void birdTmpFree(void *pv)
|
|---|
| 127 | {
|
|---|
| 128 | if (pv)
|
|---|
| 129 | free(pv);
|
|---|
| 130 | }
|
|---|
| 131 |
|
|---|
| 132 |
|
|---|
| 133 | void *birdMemAlloc(size_t cb)
|
|---|
| 134 | {
|
|---|
| 135 | return malloc(cb);
|
|---|
| 136 | }
|
|---|
| 137 |
|
|---|
| 138 |
|
|---|
| 139 | void *birdMemAllocZ(size_t cb)
|
|---|
| 140 | {
|
|---|
| 141 | return calloc(cb, 1);
|
|---|
| 142 | }
|
|---|
| 143 |
|
|---|
| 144 |
|
|---|
| 145 | void birdMemFree(void *pv)
|
|---|
| 146 | {
|
|---|
| 147 | if (pv)
|
|---|
| 148 | free(pv);
|
|---|
| 149 | }
|
|---|
| 150 |
|
|---|
| 151 |
|
|---|
| 152 | int birdErrnoFromNtStatus(MY_NTSTATUS rcNt)
|
|---|
| 153 | {
|
|---|
| 154 | switch (rcNt)
|
|---|
| 155 | {
|
|---|
| 156 | /* EPERM = 1 */
|
|---|
| 157 | case STATUS_CANNOT_DELETE:
|
|---|
| 158 | case STATUS_DELETE_PENDING:
|
|---|
| 159 | return EPERM;
|
|---|
| 160 | /* ENOENT = 2 */
|
|---|
| 161 | case STATUS_NOT_FOUND:
|
|---|
| 162 | case STATUS_OBJECT_NAME_NOT_FOUND:
|
|---|
| 163 | case STATUS_OBJECT_PATH_NOT_FOUND:
|
|---|
| 164 | case STATUS_OBJECT_NAME_INVALID:
|
|---|
| 165 | case STATUS_INVALID_COMPUTER_NAME:
|
|---|
| 166 | case STATUS_VARIABLE_NOT_FOUND:
|
|---|
| 167 | case STATUS_MESSAGE_NOT_FOUND:
|
|---|
| 168 | case STATUS_DLL_NOT_FOUND:
|
|---|
| 169 | case STATUS_ORDINAL_NOT_FOUND:
|
|---|
| 170 | case STATUS_ENTRYPOINT_NOT_FOUND:
|
|---|
| 171 | case STATUS_PATH_NOT_COVERED:
|
|---|
| 172 | case STATUS_BAD_NETWORK_PATH:
|
|---|
| 173 | case STATUS_DFS_EXIT_PATH_FOUND:
|
|---|
| 174 | case RPC_NT_OBJECT_NOT_FOUND:
|
|---|
| 175 | return ENOENT;
|
|---|
| 176 | /* ESRCH = 3 */
|
|---|
| 177 | case STATUS_PROCESS_NOT_IN_JOB:
|
|---|
| 178 | return ESRCH;
|
|---|
| 179 | /* EINTR = 4 */
|
|---|
| 180 | case STATUS_ALERTED:
|
|---|
| 181 | case STATUS_USER_APC:
|
|---|
| 182 | return EINTR;
|
|---|
| 183 | /* EIO = 5 */
|
|---|
| 184 | /* ENXIO = 6 */
|
|---|
| 185 | /* E2BIG = 7 */
|
|---|
| 186 | /* ENOEXEC = 8 */
|
|---|
| 187 | case STATUS_INVALID_IMAGE_FORMAT:
|
|---|
| 188 | case STATUS_INVALID_IMAGE_NE_FORMAT:
|
|---|
| 189 | case STATUS_INVALID_IMAGE_LE_FORMAT:
|
|---|
| 190 | case STATUS_INVALID_IMAGE_NOT_MZ:
|
|---|
| 191 | case STATUS_INVALID_IMAGE_PROTECT:
|
|---|
| 192 | case STATUS_INVALID_IMAGE_WIN_16:
|
|---|
| 193 | case STATUS_IMAGE_SUBSYSTEM_NOT_PRESENT:
|
|---|
| 194 | case STATUS_IMAGE_CHECKSUM_MISMATCH:
|
|---|
| 195 | case STATUS_IMAGE_MP_UP_MISMATCH:
|
|---|
| 196 | case STATUS_IMAGE_MACHINE_TYPE_MISMATCH:
|
|---|
| 197 | case STATUS_IMAGE_MACHINE_TYPE_MISMATCH_EXE:
|
|---|
| 198 | case STATUS_SYSTEM_IMAGE_BAD_SIGNATURE:
|
|---|
| 199 | case STATUS_SECTION_NOT_IMAGE:
|
|---|
| 200 | case STATUS_INVALID_IMAGE_WIN_32:
|
|---|
| 201 | case STATUS_INVALID_IMAGE_WIN_64:
|
|---|
| 202 | case STATUS_INVALID_IMAGE_HASH:
|
|---|
| 203 | case STATUS_IMAGE_CERT_REVOKED:
|
|---|
| 204 | return ENOEXEC;
|
|---|
| 205 | /* EBADF = 9 */
|
|---|
| 206 | case STATUS_INVALID_HANDLE:
|
|---|
| 207 | case STATUS_PORT_CLOSED:
|
|---|
| 208 | case STATUS_OPLOCK_HANDLE_CLOSED:
|
|---|
| 209 | case STATUS_HANDLES_CLOSED:
|
|---|
| 210 | case STATUS_FILE_FORCED_CLOSED:
|
|---|
| 211 | return EBADF;
|
|---|
| 212 | /* ECHILD = 10 */
|
|---|
| 213 | /* EAGAIN = 11 */
|
|---|
| 214 | case STATUS_WMI_TRY_AGAIN:
|
|---|
| 215 | case STATUS_GRAPHICS_TRY_AGAIN_LATER:
|
|---|
| 216 | case STATUS_GRAPHICS_TRY_AGAIN_NOW:
|
|---|
| 217 | return EAGAIN;
|
|---|
| 218 | /* ENOMEM = 12 */
|
|---|
| 219 | case STATUS_NO_MEMORY:
|
|---|
| 220 | case STATUS_HV_INSUFFICIENT_MEMORY:
|
|---|
| 221 | case STATUS_INSUFFICIENT_RESOURCES:
|
|---|
| 222 | case STATUS_REMOTE_RESOURCES:
|
|---|
| 223 | case STATUS_INSUFF_SERVER_RESOURCES:
|
|---|
| 224 | return ENOMEM;
|
|---|
| 225 | /* EACCES = 13 */
|
|---|
| 226 | case STATUS_ACCESS_DENIED:
|
|---|
| 227 | case STATUS_NETWORK_ACCESS_DENIED:
|
|---|
| 228 | case RPC_NT_PROXY_ACCESS_DENIED:
|
|---|
| 229 | case STATUS_CTX_SHADOW_DENIED:
|
|---|
| 230 | case STATUS_CTX_WINSTATION_ACCESS_DENIED:
|
|---|
| 231 | return EACCES;
|
|---|
| 232 | /* EFAULT = 14 */
|
|---|
| 233 | case STATUS_ACCESS_VIOLATION:
|
|---|
| 234 | case STATUS_HARDWARE_MEMORY_ERROR:
|
|---|
| 235 | return EFAULT;
|
|---|
| 236 | /* EBUSY = 16 */
|
|---|
| 237 | case STATUS_PIPE_BUSY:
|
|---|
| 238 | case STATUS_RESOURCE_IN_USE:
|
|---|
| 239 | return EBUSY;
|
|---|
| 240 | /* EEXIST = 17 */
|
|---|
| 241 | case STATUS_OBJECT_NAME_EXISTS:
|
|---|
| 242 | case STATUS_OBJECT_NAME_COLLISION:
|
|---|
| 243 | case STATUS_DUPLICATE_NAME:
|
|---|
| 244 | return EEXIST;
|
|---|
| 245 | /* EXDEV = 18 */
|
|---|
| 246 | case STATUS_NOT_SAME_DEVICE:
|
|---|
| 247 | return EXDEV;
|
|---|
| 248 | /* ENODEV = 19 */
|
|---|
| 249 | /* ENOTDIR = 20 */
|
|---|
| 250 | case STATUS_NOT_A_DIRECTORY:
|
|---|
| 251 | case STATUS_DIRECTORY_IS_A_REPARSE_POINT:
|
|---|
| 252 | case STATUS_OBJECT_PATH_SYNTAX_BAD:
|
|---|
| 253 | case STATUS_OBJECT_PATH_INVALID:
|
|---|
| 254 | case STATUS_OBJECT_TYPE_MISMATCH:
|
|---|
| 255 | return ENOTDIR;
|
|---|
| 256 | /* EISDIR = 21 */
|
|---|
| 257 | case STATUS_FILE_IS_A_DIRECTORY:
|
|---|
| 258 | return EISDIR;
|
|---|
| 259 | /* EINVAL = 22 */
|
|---|
| 260 | case STATUS_INVALID_PARAMETER:
|
|---|
| 261 | case STATUS_INVALID_PARAMETER_1:
|
|---|
| 262 | case STATUS_INVALID_PARAMETER_2:
|
|---|
| 263 | case STATUS_INVALID_PARAMETER_3:
|
|---|
| 264 | case STATUS_INVALID_PARAMETER_4:
|
|---|
| 265 | case STATUS_INVALID_PARAMETER_5:
|
|---|
| 266 | case STATUS_INVALID_PARAMETER_6:
|
|---|
| 267 | case STATUS_INVALID_PARAMETER_7:
|
|---|
| 268 | case STATUS_INVALID_PARAMETER_8:
|
|---|
| 269 | case STATUS_INVALID_PARAMETER_9:
|
|---|
| 270 | case STATUS_INVALID_PARAMETER_10:
|
|---|
| 271 | case STATUS_INVALID_PARAMETER_11:
|
|---|
| 272 | case STATUS_INVALID_PARAMETER_12:
|
|---|
| 273 | case STATUS_INVALID_PARAMETER_MIX:
|
|---|
| 274 | return EINVAL;
|
|---|
| 275 | /* ENFILE = 23 */
|
|---|
| 276 | /* EMFILE = 24 */
|
|---|
| 277 | case STATUS_TOO_MANY_OPENED_FILES:
|
|---|
| 278 | return EMFILE;
|
|---|
| 279 | /* ENOTTY = 25 */
|
|---|
| 280 | /* EFBIG = 27 */
|
|---|
| 281 | /* ENOSPC = 28 */
|
|---|
| 282 | case STATUS_DISK_FULL:
|
|---|
| 283 | return ENOSPC;
|
|---|
| 284 | /* ESPIPE = 29 */
|
|---|
| 285 | /* EROFS = 30 */
|
|---|
| 286 | /* EMLINK = 31 */
|
|---|
| 287 | /* EPIPE = 32 */
|
|---|
| 288 | case STATUS_PIPE_BROKEN:
|
|---|
| 289 | case RPC_NT_PIPE_CLOSED:
|
|---|
| 290 | return EPIPE;
|
|---|
| 291 | /* EDOM = 33 */
|
|---|
| 292 | /* ERANGE = 34 */
|
|---|
| 293 | /* EDEADLK = 36 */
|
|---|
| 294 | case STATUS_POSSIBLE_DEADLOCK:
|
|---|
| 295 | return EDEADLK;
|
|---|
| 296 | /* ENAMETOOLONG = 38 */
|
|---|
| 297 | case STATUS_NAME_TOO_LONG:
|
|---|
| 298 | return ENAMETOOLONG;
|
|---|
| 299 | /* ENOLCK = 39 */
|
|---|
| 300 | /* ENOSYS = 40 */
|
|---|
| 301 | case STATUS_NOT_SUPPORTED:
|
|---|
| 302 | return ENOSYS;
|
|---|
| 303 | /* ENOTEMPTY = 41 */
|
|---|
| 304 | case STATUS_DIRECTORY_NOT_EMPTY:
|
|---|
| 305 | return ENOTEMPTY;
|
|---|
| 306 | /* EILSEQ = 42 */
|
|---|
| 307 | /* EADDRINUSE = 100 */
|
|---|
| 308 | /* EADDRNOTAVAIL = 101 */
|
|---|
| 309 | /* EAFNOSUPPORT = 102 */
|
|---|
| 310 | /* EALREADY = 103 */
|
|---|
| 311 | case STATUS_INTERRUPT_VECTOR_ALREADY_CONNECTED:
|
|---|
| 312 | case STATUS_DEVICE_ALREADY_ATTACHED:
|
|---|
| 313 | case STATUS_PORT_ALREADY_SET:
|
|---|
| 314 | case STATUS_IMAGE_ALREADY_LOADED:
|
|---|
| 315 | case STATUS_TOKEN_ALREADY_IN_USE:
|
|---|
| 316 | case STATUS_IMAGE_ALREADY_LOADED_AS_DLL:
|
|---|
| 317 | case STATUS_ADDRESS_ALREADY_EXISTS:
|
|---|
| 318 | case STATUS_ADDRESS_ALREADY_ASSOCIATED:
|
|---|
| 319 | return EALREADY;
|
|---|
| 320 | /* EBADMSG = 104 */
|
|---|
| 321 | /* ECANCELED = 105 */
|
|---|
| 322 | /* ECONNABORTED = 106 */
|
|---|
| 323 | /* ECONNREFUSED = 107 */
|
|---|
| 324 | /* ECONNRESET = 108 */
|
|---|
| 325 | /* EDESTADDRREQ = 109 */
|
|---|
| 326 | /* EHOSTUNREACH = 110 */
|
|---|
| 327 | case STATUS_HOST_UNREACHABLE:
|
|---|
| 328 | return EHOSTUNREACH;
|
|---|
| 329 | /* EIDRM = 111 */
|
|---|
| 330 | /* EINPROGRESS = 112 */
|
|---|
| 331 | /* EISCONN = 113 */
|
|---|
| 332 | /* ELOOP = 114 */
|
|---|
| 333 | /* EMSGSIZE = 115 */
|
|---|
| 334 | /* ENETDOWN = 116 */
|
|---|
| 335 | /* ENETRESET = 117 */
|
|---|
| 336 | /* ENETUNREACH = 118 */
|
|---|
| 337 | case STATUS_NETWORK_UNREACHABLE:
|
|---|
| 338 | return ENETUNREACH;
|
|---|
| 339 | /* ENOBUFS = 119 */
|
|---|
| 340 | /* ENODATA = 120 */
|
|---|
| 341 | /* ENOLINK = 121 */
|
|---|
| 342 | /* ENOMSG = 122 */
|
|---|
| 343 | /* ENOPROTOOPT = 123 */
|
|---|
| 344 | /* ENOSR = 124 */
|
|---|
| 345 | /* ENOSTR = 125 */
|
|---|
| 346 | /* ENOTCONN = 126 */
|
|---|
| 347 | /* ENOTRECOVERABLE = 127 */
|
|---|
| 348 | /* ENOTSOCK = 128 */
|
|---|
| 349 | /* ENOTSUP = 129 */
|
|---|
| 350 | /* EOPNOTSUPP = 130 */
|
|---|
| 351 | /* EOTHER = 131 */
|
|---|
| 352 | /* EOVERFLOW = 132 */
|
|---|
| 353 | /* EOWNERDEAD = 133 */
|
|---|
| 354 | /* EPROTO = 134 */
|
|---|
| 355 | /* EPROTONOSUPPORT = 135 */
|
|---|
| 356 | /* EPROTOTYPE = 136 */
|
|---|
| 357 | /* ETIME = 137 */
|
|---|
| 358 | /* ETIMEDOUT = 138 */
|
|---|
| 359 | case STATUS_VIRTUAL_CIRCUIT_CLOSED:
|
|---|
| 360 | case STATUS_TIMEOUT:
|
|---|
| 361 | return ETIMEDOUT;
|
|---|
| 362 |
|
|---|
| 363 | /* ETXTBSY = 139 */
|
|---|
| 364 | case STATUS_SHARING_VIOLATION:
|
|---|
| 365 | return ETXTBSY;
|
|---|
| 366 | /* EWOULDBLOCK = 140 */
|
|---|
| 367 | }
|
|---|
| 368 |
|
|---|
| 369 | #ifndef NDEBUG
|
|---|
| 370 | __debugbreak();
|
|---|
| 371 | fprintf(stderr, "rcNt=%#x (%d)\n", rcNt, rcNt);
|
|---|
| 372 | #endif
|
|---|
| 373 | return EINVAL;
|
|---|
| 374 | }
|
|---|
| 375 |
|
|---|
| 376 |
|
|---|
| 377 | int birdSetErrnoFromNt(MY_NTSTATUS rcNt)
|
|---|
| 378 | {
|
|---|
| 379 | errno = birdErrnoFromNtStatus(rcNt);
|
|---|
| 380 | return -1;
|
|---|
| 381 | }
|
|---|
| 382 |
|
|---|
| 383 |
|
|---|
| 384 | int birdSetErrnoFromWin32(DWORD dwErr)
|
|---|
| 385 | {
|
|---|
| 386 | switch (dwErr)
|
|---|
| 387 | {
|
|---|
| 388 | default:
|
|---|
| 389 | case ERROR_INVALID_FUNCTION: errno = EINVAL; break;
|
|---|
| 390 | case ERROR_FILE_NOT_FOUND: errno = ENOENT; break;
|
|---|
| 391 | case ERROR_PATH_NOT_FOUND: errno = ENOENT; break;
|
|---|
| 392 | case ERROR_TOO_MANY_OPEN_FILES: errno = EMFILE; break;
|
|---|
| 393 | case ERROR_ACCESS_DENIED: errno = EACCES; break;
|
|---|
| 394 | case ERROR_INVALID_HANDLE: errno = EBADF; break;
|
|---|
| 395 | case ERROR_ARENA_TRASHED: errno = ENOMEM; break;
|
|---|
| 396 | case ERROR_NOT_ENOUGH_MEMORY: errno = ENOMEM; break;
|
|---|
| 397 | case ERROR_INVALID_BLOCK: errno = ENOMEM; break;
|
|---|
| 398 | case ERROR_BAD_ENVIRONMENT: errno = E2BIG; break;
|
|---|
| 399 | case ERROR_BAD_FORMAT: errno = ENOEXEC; break;
|
|---|
| 400 | case ERROR_INVALID_ACCESS: errno = EINVAL; break;
|
|---|
| 401 | case ERROR_INVALID_DATA: errno = EINVAL; break;
|
|---|
| 402 | case ERROR_INVALID_DRIVE: errno = ENOENT; break;
|
|---|
| 403 | case ERROR_CURRENT_DIRECTORY: errno = EACCES; break;
|
|---|
| 404 | case ERROR_NOT_SAME_DEVICE: errno = EXDEV; break;
|
|---|
| 405 | case ERROR_NO_MORE_FILES: errno = ENOENT; break;
|
|---|
| 406 | case ERROR_LOCK_VIOLATION: errno = EACCES; break;
|
|---|
| 407 | case ERROR_BAD_NETPATH: errno = ENOENT; break;
|
|---|
| 408 | case ERROR_NETWORK_ACCESS_DENIED: errno = EACCES; break;
|
|---|
| 409 | case ERROR_BAD_NET_NAME: errno = ENOENT; break;
|
|---|
| 410 | case ERROR_FILE_EXISTS: errno = EEXIST; break;
|
|---|
| 411 | case ERROR_CANNOT_MAKE: errno = EACCES; break;
|
|---|
| 412 | case ERROR_FAIL_I24: errno = EACCES; break;
|
|---|
| 413 | case ERROR_INVALID_PARAMETER: errno = EINVAL; break;
|
|---|
| 414 | case ERROR_NO_PROC_SLOTS: errno = EAGAIN; break;
|
|---|
| 415 | case ERROR_DRIVE_LOCKED: errno = EACCES; break;
|
|---|
| 416 | case ERROR_BROKEN_PIPE: errno = EPIPE; break;
|
|---|
| 417 | case ERROR_DISK_FULL: errno = ENOSPC; break;
|
|---|
| 418 | case ERROR_INVALID_TARGET_HANDLE: errno = EBADF; break;
|
|---|
| 419 | case ERROR_WAIT_NO_CHILDREN: errno = ECHILD; break;
|
|---|
| 420 | case ERROR_CHILD_NOT_COMPLETE: errno = ECHILD; break;
|
|---|
| 421 | case ERROR_DIRECT_ACCESS_HANDLE: errno = EBADF; break;
|
|---|
| 422 | case ERROR_NEGATIVE_SEEK: errno = EINVAL; break;
|
|---|
| 423 | case ERROR_SEEK_ON_DEVICE: errno = EACCES; break;
|
|---|
| 424 | case ERROR_DIR_NOT_EMPTY: errno = ENOTEMPTY; break;
|
|---|
| 425 | case ERROR_NOT_LOCKED: errno = EACCES; break;
|
|---|
| 426 | case ERROR_BAD_PATHNAME: errno = ENOENT; break;
|
|---|
| 427 | case ERROR_MAX_THRDS_REACHED: errno = EAGAIN; break;
|
|---|
| 428 | case ERROR_LOCK_FAILED: errno = EACCES; break;
|
|---|
| 429 | case ERROR_ALREADY_EXISTS: errno = EEXIST; break;
|
|---|
| 430 | case ERROR_FILENAME_EXCED_RANGE: errno = ENOENT; break;
|
|---|
| 431 | case ERROR_NESTING_NOT_ALLOWED: errno = EAGAIN; break;
|
|---|
| 432 | #ifdef EMLINK
|
|---|
| 433 | case ERROR_TOO_MANY_LINKS: errno = EMLINK; break;
|
|---|
| 434 | #endif
|
|---|
| 435 |
|
|---|
| 436 | case ERROR_SHARING_VIOLATION:
|
|---|
| 437 | errno = ETXTBSY;
|
|---|
| 438 | break;
|
|---|
| 439 | }
|
|---|
| 440 |
|
|---|
| 441 | return -1;
|
|---|
| 442 | }
|
|---|
| 443 |
|
|---|
| 444 |
|
|---|
| 445 | int birdSetErrnoToNoMem(void)
|
|---|
| 446 | {
|
|---|
| 447 | errno = ENOMEM;
|
|---|
| 448 | return -1;
|
|---|
| 449 | }
|
|---|
| 450 |
|
|---|
| 451 |
|
|---|
| 452 | int birdSetErrnoToInvalidArg(void)
|
|---|
| 453 | {
|
|---|
| 454 | errno = EINVAL;
|
|---|
| 455 | return -1;
|
|---|
| 456 | }
|
|---|
| 457 |
|
|---|
| 458 |
|
|---|
| 459 | int birdSetErrnoToBadFileNo(void)
|
|---|
| 460 | {
|
|---|
| 461 | errno = EBADF;
|
|---|
| 462 | return -1;
|
|---|
| 463 | }
|
|---|
| 464 |
|
|---|