diff options
Diffstat (limited to 'win32/winutil.c')
| -rw-r--r-- | win32/winutil.c | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/win32/winutil.c b/win32/winutil.c index 7faf3bf7bf..e44d876d49 100644 --- a/win32/winutil.c +++ b/win32/winutil.c @@ -19,19 +19,36 @@ #include "php.h" #include "winutil.h" +#include "codepage.h" #include <bcrypt.h> #include <lmcons.h> PHP_WINUTIL_API char *php_win32_error_to_msg(HRESULT error) {/*{{{*/ - char *buf = NULL; + wchar_t *bufw = NULL; + char *buf; - FormatMessage( - FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, error, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&buf, 0, NULL + DWORD ret = FormatMessageW( + FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, error, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPWSTR)&bufw, 0, NULL ); - return (buf ? (char *) buf : ""); + if (!ret || !bufw) { + return ""; + } + + buf = php_win32_cp_conv_w_to_any(bufw, ret, PHP_WIN32_CP_IGNORE_LEN_P); + + LocalFree(bufw); + + return (buf ? buf : ""); +}/*}}}*/ + +PHP_WINUTIL_API void php_win32_error_msg_free(char *msg) +{/*{{{*/ + if (msg && msg[0]) { + free(msg); + } }/*}}}*/ int php_win32_check_trailing_space(const char * path, const size_t path_len) @@ -378,6 +395,7 @@ PHP_WINUTIL_API int php_win32_code_to_errno(unsigned long w32Err) /* 1113 */ , { ERROR_NO_UNICODE_TRANSLATION , EINVAL } /* 1168 */ , { ERROR_NOT_FOUND , ENOENT } /* 1224 */ , { ERROR_USER_MAPPED_FILE , EACCES } + /* 1314 */ , { ERROR_PRIVILEGE_NOT_HELD , EACCES } /* 1816 */ , { ERROR_NOT_ENOUGH_QUOTA , ENOMEM } , { ERROR_ABANDONED_WAIT_0 , EIO } }; |
