diff options
Diffstat (limited to 'win32/winutil.c')
-rw-r--r-- | win32/winutil.c | 319 |
1 files changed, 317 insertions, 2 deletions
diff --git a/win32/winutil.c b/win32/winutil.c index e59e049775..cd009cadc0 100644 --- a/win32/winutil.c +++ b/win32/winutil.c @@ -20,9 +20,11 @@ /* $Id$ */ #include "php.h" +#include "winutil.h" #include <wincrypt.h> +#include <lmcons.h> -PHPAPI char *php_win32_error_to_msg(HRESULT error) +PHP_WINUTIL_API char *php_win32_error_to_msg(HRESULT error) { char *buf = NULL; @@ -77,7 +79,7 @@ void php_win32_free_rng_lock() -PHPAPI int php_win32_get_random_bytes(unsigned char *buf, size_t size) { /* {{{ */ +PHP_WINUTIL_API int php_win32_get_random_bytes(unsigned char *buf, size_t size) { /* {{{ */ BOOL ret; @@ -123,6 +125,319 @@ PHPAPI int php_win32_get_random_bytes(unsigned char *buf, size_t size) { /* {{{ } /* }}} */ + +/* +* This functions based on the code from the UNIXem project under +* the BSD like license. Modified for PHP by ab@php.net +* +* Home: http://synesis.com.au/software/ +* +* Copyright (c) 2005-2010, Matthew Wilson and Synesis Software +*/ + +PHP_WINUTIL_API int php_win32_code_to_errno(unsigned long w32Err) +{ + size_t i; + + struct code_to_errno_map + { + unsigned long w32Err; + int eerrno; + }; + + static const struct code_to_errno_map errmap[] = + { + /* 1 */ { ERROR_INVALID_FUNCTION , EINVAL } + /* 2 */ , { ERROR_FILE_NOT_FOUND , ENOENT } + /* 3 */ , { ERROR_PATH_NOT_FOUND , ENOENT } + /* 4 */ , { ERROR_TOO_MANY_OPEN_FILES , EMFILE } + /* 5 */ , { ERROR_ACCESS_DENIED , EACCES } + /* 6 */ , { ERROR_INVALID_HANDLE , EBADF } + /* 7 */ , { ERROR_ARENA_TRASHED , ENOMEM } + /* 8 */ , { ERROR_NOT_ENOUGH_MEMORY , ENOMEM } + /* 9 */ , { ERROR_INVALID_BLOCK , ENOMEM } + /* 10 */ , { ERROR_BAD_ENVIRONMENT , E2BIG } + /* 11 */ , { ERROR_BAD_FORMAT , ENOEXEC } + /* 12 */ , { ERROR_INVALID_ACCESS , EINVAL } + /* 13 */ , { ERROR_INVALID_DATA , EINVAL } + /* 14 */ , { ERROR_OUTOFMEMORY , ENOMEM } + /* 15 */ , { ERROR_INVALID_DRIVE , ENOENT } + /* 16 */ , { ERROR_CURRENT_DIRECTORY , ECURDIR } + /* 17 */ , { ERROR_NOT_SAME_DEVICE , EXDEV } + /* 18 */ , { ERROR_NO_MORE_FILES , ENOENT } + /* 19 */ , { ERROR_WRITE_PROTECT , EROFS } + /* 20 */ , { ERROR_BAD_UNIT , ENXIO } + /* 21 */ , { ERROR_NOT_READY , EBUSY } + /* 22 */ , { ERROR_BAD_COMMAND , EIO } + /* 23 */ , { ERROR_CRC , EIO } + /* 24 */ , { ERROR_BAD_LENGTH , EIO } + /* 25 */ , { ERROR_SEEK , EIO } + /* 26 */ , { ERROR_NOT_DOS_DISK , EIO } + /* 27 */ , { ERROR_SECTOR_NOT_FOUND , ENXIO } + /* 28 */ , { ERROR_OUT_OF_PAPER , EBUSY } + /* 29 */ , { ERROR_WRITE_FAULT , EIO } + /* 30 */ , { ERROR_READ_FAULT , EIO } + /* 31 */ , { ERROR_GEN_FAILURE , EIO } + /* 32 */ , { ERROR_SHARING_VIOLATION , EAGAIN } + /* 33 */ , { ERROR_LOCK_VIOLATION , EACCES } + /* 34 */ , { ERROR_WRONG_DISK , ENXIO } + /* 35 */ , { 35 , ENFILE } + /* 36 */ , { ERROR_SHARING_BUFFER_EXCEEDED , ENFILE } + /* 37 */ , { ERROR_HANDLE_EOF , EINVAL } + /* 38 */ , { ERROR_HANDLE_DISK_FULL , ENOSPC } +#if 0 + /* 39 */ , { 0 , 0 } + /* 40 */ , { 0 , 0 } + /* 41 */ , { 0 , 0 } + /* 42 */ , { 0 , 0 } + /* 43 */ , { 0 , 0 } + /* 44 */ , { 0 , 0 } + /* 45 */ , { 0 , 0 } + /* 46 */ , { 0 , 0 } + /* 47 */ , { 0 , 0 } + /* 48 */ , { 0 , 0 } + /* 49 */ , { 0 , 0 } +#endif + /* 50 */ , { ERROR_NOT_SUPPORTED , ENOSYS } +#if 0 + /* 51 */ , { 0 , 0 } + /* 52 */ , { 0 , 0 } +#endif + /* 53 */ , { ERROR_BAD_NETPATH , ENOENT } +#if 0 + /* 54 */ , { 0 , 0 } + /* 55 */ , { 0 , 0 } + /* 56 */ , { 0 , 0 } + /* 57 */ , { 0 , 0 } + /* 58 */ , { 0 , 0 } + /* 59 */ , { 0 , 0 } + /* 60 */ , { 0 , 0 } + /* 61 */ , { 0 , 0 } + /* 62 */ , { 0 , 0 } + /* 63 */ , { 0 , 0 } + /* 64 */ , { 0 , 0 } +#endif + /* 65 */ , { ERROR_NETWORK_ACCESS_DENIED , EACCES } +#if 0 + /* 66 */ , { 0 , 0 } +#endif + /* 67 */ , { ERROR_BAD_NET_NAME , ENOENT } +#if 0 + /* 68 */ , { 0 , 0 } + /* 69 */ , { 0 , 0 } + /* 70 */ , { 0 , 0 } + /* 71 */ , { 0 , 0 } + /* 72 */ , { 0 , 0 } + /* 73 */ , { 0 , 0 } + /* 74 */ , { 0 , 0 } + /* 75 */ , { 0 , 0 } + /* 76 */ , { 0 , 0 } + /* 77 */ , { 0 , 0 } + /* 78 */ , { 0 , 0 } + /* 79 */ , { 0 , 0 } +#endif + /* 80 */ , { ERROR_FILE_EXISTS , EEXIST } +#if 0 + /* 81 */ , { 0 , 0 } +#endif + /* 82 */ , { ERROR_CANNOT_MAKE , EACCES } + /* 83 */ , { ERROR_FAIL_I24 , EACCES } +#if 0 + /* 84 */ , { 0 , 0 } + /* 85 */ , { 0 , 0 } + /* 86 */ , { 0 , 0 } +#endif + /* 87 */ , { ERROR_INVALID_PARAMETER , EINVAL } +#if 0 + /* 88 */ , { 0 , 0 } +#endif + /* 89 */ , { ERROR_NO_PROC_SLOTS , EAGAIN } +#if 0 + /* 90 */ , { 0 , 0 } + /* 91 */ , { 0 , 0 } + /* 92 */ , { 0 , 0 } + /* 93 */ , { 0 , 0 } + /* 94 */ , { 0 , 0 } + /* 95 */ , { 0 , 0 } + /* 96 */ , { 0 , 0 } + /* 97 */ , { 0 , 0 } + /* 98 */ , { 0 , 0 } + /* 99 */ , { 0 , 0 } + /* 100 */ , { 0 , 0 } + /* 101 */ , { 0 , 0 } + /* 102 */ , { 0 , 0 } + /* 103 */ , { 0 , 0 } + /* 104 */ , { 0 , 0 } + /* 105 */ , { 0 , 0 } + /* 106 */ , { 0 , 0 } + /* 107 */ , { 0 , 0 } +#endif + /* 108 */ , { ERROR_DRIVE_LOCKED , EACCES } + /* 109 */ , { ERROR_BROKEN_PIPE , EPIPE } +#if 0 + /* 110 */ , { 0 , 0 } +#endif + /* 111 */ , { ERROR_BUFFER_OVERFLOW , ENAMETOOLONG } + /* 112 */ , { ERROR_DISK_FULL , ENOSPC } +#if 0 + /* 113 */ , { 0 , 0 } +#endif + /* 114 */ , { ERROR_INVALID_TARGET_HANDLE , EBADF } +#if 0 + /* 115 */ , { 0 , 0 } + /* 116 */ , { 0 , 0 } + /* 117 */ , { 0 , 0 } + /* 118 */ , { 0 , 0 } + /* 119 */ , { 0 , 0 } + /* 120 */ , { 0 , 0 } + /* 121 */ , { 0 , 0 } +#endif + /* 122 */ , { ERROR_INSUFFICIENT_BUFFER , ERANGE } + /* 123 */ , { ERROR_INVALID_NAME , ENOENT } + /* 124 */ , { ERROR_INVALID_HANDLE , EINVAL } +#if 0 + /* 125 */ , { 0 , 0 } + /* 126 */ , { 0 , 0 } + /* 127 */ , { 0 , 0 } +#endif + /* 128 */ , { ERROR_WAIT_NO_CHILDREN , ECHILD } + /* 129 */ , { ERROR_CHILD_NOT_COMPLETE , ECHILD } + /* 130 */ , { ERROR_DIRECT_ACCESS_HANDLE , EBADF } + /* 131 */ , { ERROR_NEGATIVE_SEEK , EINVAL } + /* 132 */ , { ERROR_SEEK_ON_DEVICE , EACCES } +#if 0 + /* 133 */ , { 0 , 0 } + /* 134 */ , { 0 , 0 } + /* 135 */ , { 0 , 0 } + /* 136 */ , { 0 , 0 } + /* 137 */ , { 0 , 0 } + /* 138 */ , { 0 , 0 } + /* 139 */ , { 0 , 0 } + /* 140 */ , { 0 , 0 } + /* 141 */ , { 0 , 0 } + /* 142 */ , { 0 , 0 } + /* 143 */ , { 0 , 0 } + /* 144 */ , { 0 , 0 } +#endif + /* 145 */ , { ERROR_DIR_NOT_EMPTY , ENOTEMPTY } +#if 0 + /* 146 */ , { 0 , 0 } + /* 147 */ , { 0 , 0 } + /* 148 */ , { 0 , 0 } + /* 149 */ , { 0 , 0 } + /* 150 */ , { 0 , 0 } + /* 151 */ , { 0 , 0 } + /* 152 */ , { 0 , 0 } + /* 153 */ , { 0 , 0 } + /* 154 */ , { 0 , 0 } + /* 155 */ , { 0 , 0 } + /* 156 */ , { 0 , 0 } + /* 157 */ , { 0 , 0 } +#endif + /* 158 */ , { ERROR_NOT_LOCKED , EACCES } +#if 0 + /* 159 */ , { 0 , 0 } + /* 160 */ , { 0 , 0 } +#endif + /* 161 */ , { ERROR_BAD_PATHNAME , ENOENT } +#if 0 + /* 162 */ , { 0 , 0 } + /* 163 */ , { 0 , 0 } +#endif + /* 164 */ , { ERROR_MAX_THRDS_REACHED , EAGAIN } +#if 0 + /* 165 */ , { 0 , 0 } + /* 166 */ , { 0 , 0 } +#endif + /* 167 */ , { ERROR_LOCK_FAILED , EACCES } +#if 0 + /* 168 */ , { 0 , 0 } + /* 169 */ , { 0 , 0 } + /* 170 */ , { 0 , 0 } + /* 171 */ , { 0 , 0 } + /* 172 */ , { 0 , 0 } + /* 173 */ , { 0 , 0 } + /* 174 */ , { 0 , 0 } + /* 175 */ , { 0 , 0 } + /* 176 */ , { 0 , 0 } + /* 177 */ , { 0 , 0 } + /* 178 */ , { 0 , 0 } + /* 179 */ , { 0 , 0 } + /* 180 */ , { 0 , 0 } + /* 181 */ , { 0 , 0 } + /* 182 */ , { 0 , 0 } +#endif + /* 183 */ , { ERROR_ALREADY_EXISTS , EEXIST } +#if 0 + /* 184 */ , { 0 , 0 } + /* 185 */ , { 0 , 0 } + /* 186 */ , { 0 , 0 } + /* 187 */ , { 0 , 0 } + /* 188 */ , { 0 , 0 } + /* 189 */ , { 0 , 0 } + /* 190 */ , { 0 , 0 } + /* 191 */ , { 0 , 0 } + /* 192 */ , { 0 , 0 } + /* 193 */ , { 0 , 0 } + /* 194 */ , { 0 , 0 } + /* 195 */ , { 0 , 0 } + /* 196 */ , { 0 , 0 } + /* 197 */ , { 0 , 0 } + /* 198 */ , { 0 , 0 } + /* 199 */ , { 0 , 0 } +#endif + + /* 206 */ , { ERROR_FILENAME_EXCED_RANGE , ENAMETOOLONG } + + /* 215 */ , { ERROR_NESTING_NOT_ALLOWED , EAGAIN } + /* 258 */ , { WAIT_TIMEOUT, ETIME} + + /* 267 */ , { ERROR_DIRECTORY , ENOTDIR } + + /* 996 */ , { ERROR_IO_INCOMPLETE , EAGAIN } + /* 997 */ , { ERROR_IO_PENDING , EAGAIN } + + /* 1004 */ , { ERROR_INVALID_FLAGS , EINVAL } + /* 1113 */ , { ERROR_NO_UNICODE_TRANSLATION , EINVAL } + /* 1168 */ , { ERROR_NOT_FOUND , ENOENT } + /* 1816 */ , { ERROR_NOT_ENOUGH_QUOTA , ENOMEM } + , { ERROR_ABANDONED_WAIT_0 , EIO } + }; + + for(i = 0; i < sizeof(errmap)/sizeof(struct code_to_errno_map); ++i) + { + if(w32Err == errmap[i].w32Err) + { + return errmap[i].eerrno; + } + } + + assert(!"Unrecognised value"); + + return EINVAL; +} + +PHP_WINUTIL_API char *php_win32_get_username(void) +{ + wchar_t unamew[UNLEN + 1]; + size_t uname_len; + char *uname; + DWORD unsize = UNLEN; + + GetUserNameW(unamew, &unsize); + uname = php_win32_cp_conv_w_to_any(unamew, unsize - 1, &uname_len); + if (!uname) { + return NULL; + } + + /* Ensure the length doesn't overflow. */ + if (uname_len > UNLEN) { + uname[uname_len] = '\0'; + } + + return uname; +} + /* * Local variables: * tab-width: 4 |