summaryrefslogtreecommitdiff
path: root/win32/winutil.c
diff options
context:
space:
mode:
Diffstat (limited to 'win32/winutil.c')
-rw-r--r--win32/winutil.c28
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 }
};