Index: runtime/bin/process_win.cc |
diff --git a/runtime/bin/process_win.cc b/runtime/bin/process_win.cc |
index 4b09367baca1f560f3135e70f2a1e4649e61f6d6..624b1f2f44f6046f3b08dd41545c1047d21d5ccc 100644 |
--- a/runtime/bin/process_win.cc |
+++ b/runtime/bin/process_win.cc |
@@ -294,24 +294,27 @@ static void CloseProcessPipes(HANDLE handles1[2], |
CloseProcessPipe(handles4); |
} |
-static int SetOsErrorMessage(char* os_error_message, |
- int os_error_message_len) { |
+ |
+static int SetOsErrorMessage(char** os_error_message) { |
int error_code = GetLastError(); |
+ static const int kMaxMessageLength = 256; |
+ wchar_t message[kMaxMessageLength]; |
DWORD message_size = |
- FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, |
- NULL, |
- error_code, |
- MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), |
- os_error_message, |
- os_error_message_len, |
- NULL); |
+ FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, |
+ NULL, |
+ error_code, |
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), |
+ message, |
+ kMaxMessageLength, |
+ NULL); |
if (message_size == 0) { |
if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) { |
Log::PrintErr("FormatMessage failed %d\n", GetLastError()); |
} |
- snprintf(os_error_message, os_error_message_len, "OS Error %d", error_code); |
+ _snwprintf(message, kMaxMessageLength, L"OS Error %d", error_code); |
} |
- os_error_message[os_error_message_len - 1] = '\0'; |
+ message[kMaxMessageLength - 1] = '\0'; |
+ *os_error_message = StringUtils::WideToUtf8(message); |
return error_code; |
} |
@@ -327,8 +330,7 @@ int Process::Start(const char* path, |
intptr_t* err, |
intptr_t* id, |
intptr_t* exit_handler, |
- char* os_error_message, |
- int os_error_message_len) { |
+ char** os_error_message) { |
HANDLE stdin_handles[2] = { INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE }; |
HANDLE stdout_handles[2] = { INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE }; |
HANDLE stderr_handles[2] = { INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE }; |
@@ -339,15 +341,15 @@ int Process::Start(const char* path, |
UUID uuid; |
RPC_STATUS status = UuidCreateSequential(&uuid); |
if (status != RPC_S_OK && status != RPC_S_UUID_LOCAL_ONLY) { |
+ SetOsErrorMessage(os_error_message); |
Log::PrintErr("UuidCreateSequential failed %d\n", status); |
- SetOsErrorMessage(os_error_message, os_error_message_len); |
return status; |
} |
RPC_CSTR uuid_string; |
status = UuidToString(&uuid, &uuid_string); |
if (status != RPC_S_OK) { |
+ SetOsErrorMessage(os_error_message); |
Log::PrintErr("UuidToString failed %d\n", status); |
- SetOsErrorMessage(os_error_message, os_error_message_len); |
return status; |
} |
for (int i = 0; i < 4; i++) { |
@@ -358,31 +360,31 @@ int Process::Start(const char* path, |
} |
status = RpcStringFree(&uuid_string); |
if (status != RPC_S_OK) { |
+ SetOsErrorMessage(os_error_message); |
Log::PrintErr("RpcStringFree failed %d\n", status); |
- SetOsErrorMessage(os_error_message, os_error_message_len); |
return status; |
} |
if (!CreateProcessPipe(stdin_handles, pipe_names[0], kInheritRead)) { |
- int error_code = SetOsErrorMessage(os_error_message, os_error_message_len); |
+ int error_code = SetOsErrorMessage(os_error_message); |
CloseProcessPipes( |
stdin_handles, stdout_handles, stderr_handles, exit_handles); |
return error_code; |
} |
if (!CreateProcessPipe(stdout_handles, pipe_names[1], kInheritWrite)) { |
- int error_code = SetOsErrorMessage(os_error_message, os_error_message_len); |
+ int error_code = SetOsErrorMessage(os_error_message); |
CloseProcessPipes( |
stdin_handles, stdout_handles, stderr_handles, exit_handles); |
return error_code; |
} |
if (!CreateProcessPipe(stderr_handles, pipe_names[2], kInheritWrite)) { |
- int error_code = SetOsErrorMessage(os_error_message, os_error_message_len); |
+ int error_code = SetOsErrorMessage(os_error_message); |
CloseProcessPipes( |
stdin_handles, stdout_handles, stderr_handles, exit_handles); |
return error_code; |
} |
if (!CreateProcessPipe(exit_handles, pipe_names[3], kInheritNone)) { |
- int error_code = SetOsErrorMessage(os_error_message, os_error_message_len); |
+ int error_code = SetOsErrorMessage(os_error_message); |
CloseProcessPipes( |
stdin_handles, stdout_handles, stderr_handles, exit_handles); |
return error_code; |
@@ -404,7 +406,7 @@ int Process::Start(const char* path, |
// ERROR_INSUFFICIENT_BUFFER and that error should be ignored. |
if (!InitializeProcThreadAttributeList(NULL, 1, 0, &size) && |
GetLastError() != ERROR_INSUFFICIENT_BUFFER) { |
- int error_code = SetOsErrorMessage(os_error_message, os_error_message_len); |
+ int error_code = SetOsErrorMessage(os_error_message); |
CloseProcessPipes( |
stdin_handles, stdout_handles, stderr_handles, exit_handles); |
return error_code; |
@@ -413,7 +415,7 @@ int Process::Start(const char* path, |
reinterpret_cast<LPPROC_THREAD_ATTRIBUTE_LIST>(malloc(size)); |
ZeroMemory(attribute_list, size); |
if (!InitializeProcThreadAttributeList(attribute_list, 1, 0, &size)) { |
- int error_code = SetOsErrorMessage(os_error_message, os_error_message_len); |
+ int error_code = SetOsErrorMessage(os_error_message); |
CloseProcessPipes( |
stdin_handles, stdout_handles, stderr_handles, exit_handles); |
free(attribute_list); |
@@ -432,7 +434,7 @@ int Process::Start(const char* path, |
NULL, |
NULL)) { |
DeleteProcThreadAttributeList(attribute_list); |
- int error_code = SetOsErrorMessage(os_error_message, os_error_message_len); |
+ int error_code = SetOsErrorMessage(os_error_message); |
CloseProcessPipes( |
stdin_handles, stdout_handles, stderr_handles, exit_handles); |
free(attribute_list); |
@@ -444,9 +446,9 @@ int Process::Start(const char* path, |
ZeroMemory(&process_info, sizeof(process_info)); |
// Transform input strings to system format. |
- path = StringUtils::Utf8ToSystemString(path); |
+ path = StringUtils::Utf8ToConsoleString(path); |
for (int i = 0; i < arguments_length; i++) { |
- arguments[i] = StringUtils::Utf8ToSystemString(arguments[i]); |
+ arguments[i] = StringUtils::Utf8ToConsoleString(arguments[i]); |
} |
// Compute command-line length. |
@@ -458,7 +460,7 @@ int Process::Start(const char* path, |
command_line_length += arguments_length + 1; |
static const int kMaxCommandLineLength = 32768; |
if (command_line_length > kMaxCommandLineLength) { |
- int error_code = SetOsErrorMessage(os_error_message, os_error_message_len); |
+ int error_code = SetOsErrorMessage(os_error_message); |
CloseProcessPipes( |
stdin_handles, stdout_handles, stderr_handles, exit_handles); |
free(const_cast<char*>(path)); |
@@ -490,7 +492,7 @@ int Process::Start(const char* path, |
if (environment != NULL) { |
// Convert environment strings to system strings. |
for (intptr_t i = 0; i < environment_length; i++) { |
- environment[i] = StringUtils::Utf8ToSystemString(environment[i]); |
+ environment[i] = StringUtils::Utf8ToConsoleString(environment[i]); |
} |
// An environment block is a sequence of zero-terminated strings |
@@ -518,7 +520,7 @@ int Process::Start(const char* path, |
} |
if (working_directory != NULL) { |
- working_directory = StringUtils::Utf8ToSystemString(working_directory); |
+ working_directory = StringUtils::Utf8ToConsoleString(working_directory); |
} |
// Create process. |
@@ -544,7 +546,7 @@ int Process::Start(const char* path, |
free(attribute_list); |
if (result == 0) { |
- int error_code = SetOsErrorMessage(os_error_message, os_error_message_len); |
+ int error_code = SetOsErrorMessage(os_error_message); |
CloseProcessPipes( |
stdin_handles, stdout_handles, stderr_handles, exit_handles); |
return error_code; |