From 6557f73c67bac51a055bb46ec1787209d117943f Mon Sep 17 00:00:00 2001 From: Fabian Meumertzheim Date: Mon, 4 Nov 2024 10:15:03 +0100 Subject: [PATCH] Fix arguments --- src/patch_java_manifest_for_utf8.cc | 32 ++++++++++++++++++----------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/src/patch_java_manifest_for_utf8.cc b/src/patch_java_manifest_for_utf8.cc index 3e3aa1d0936d42..0a3b6d9ce597e3 100644 --- a/src/patch_java_manifest_for_utf8.cc +++ b/src/patch_java_manifest_for_utf8.cc @@ -21,9 +21,17 @@ #include // This program patches the app manifest of the java.exe launcher to force its -// active code page to UTF-8. This is necessary because the launcher sets -// sun.jnu.encoding to the system code page, which by default is a legacy -// code page such as Cp1252 on Windows. +// active code page to UTF-8 on Windows 1903 and later. +// https://learn.microsoft.com/en-us/windows/apps/design/globalizing/use-utf8-code-page#set-a-process-code-page-to-utf-8 +// +// This is necessary because the launcher sets sun.jnu.encoding to the system +// code page, which by default is a legacy code page such as Cp1252 on Windows. +// This causes the JVM to be unable to interact with files whose paths contain +// Unicode characters not representable in the system code page, as well as +// command-line arguments and environment variables containing such characters. +// +// Usage in the libjava.dll code: +// https://github.com/openjdk/jdk/blob/e7f0bf11ff0e89b6b156d5e88ca3771c706aa46a/src/java.base/windows/native/libjava/java_props_md.c#L63-L65 int wmain(int argc, wchar_t *argv[]) { if (argc != 2) { fwprintf(stderr, L"Usage: %ls \n", argv[0]); @@ -34,22 +42,22 @@ int wmain(int argc, wchar_t *argv[]) { // executable, which requires loading it as a "module". HMODULE exe = LoadLibraryExW(argv[1], nullptr, LOAD_LIBRARY_AS_DATAFILE); if (!exe) { - fwprintf(stderr, L"Error loading file %ls\n", argv[1]); + fwprintf(stderr, L"Error loading file %ls: %d\n", argv[1], GetLastError()); return 1; } HRSRC manifest_resource = FindResourceA(exe, MAKEINTRESOURCE(1), RT_MANIFEST); if (!manifest_resource) { - fwprintf(stderr, L"Resource not found.\n"); + fwprintf(stderr, L"Resource not found: %d\n", GetLastError()); return 1; } HGLOBAL manifest_handle = LoadResource(exe, manifest_resource); if (!manifest_handle) { - fwprintf(stderr, L"Error loading resource.\n"); + fwprintf(stderr, L"Error loading resource: %d\n", GetLastError()); return 1; } LPVOID manifest_data = LockResource(manifest_handle); if (!manifest_data) { - fwprintf(stderr, L"Error locking resource.\n"); + fwprintf(stderr, L"Error locking resource: %d\n", GetLastError()); return 1; } DWORD manifest_len = SizeofResource(exe, manifest_resource); @@ -63,7 +71,7 @@ int wmain(int argc, wchar_t *argv[]) { // https://github.com/openjdk/jdk/blob/29882bfe7b7e76446a96862cd0a5e81c7e054415/src/java.base/windows/native/launcher/java.manifest#L43 std::size_t insert_pos = manifest.find(""); if (insert_pos == std::wstring::npos) { - fwprintf(stderr, L"End tag not found in manifest:\n%s", manifest.c_str()); + fwprintf(stderr, L"End tag not found in manifest:\n%hs", manifest.c_str()); return 1; } std::string new_manifest = manifest.substr(0, insert_pos) + @@ -73,20 +81,20 @@ int wmain(int argc, wchar_t *argv[]) { // Write back the modified app manifest. HANDLE update_handle = BeginUpdateResourceW(argv[1], false); if (!update_handle) { - fwprintf(stderr, L"Error opening file for update.\n"); + fwprintf(stderr, L"Error opening file %ls for update: %d\n", argv[1], GetLastError()); return 1; } if (!UpdateResourceA(update_handle, - MAKEINTRESOURCE(1), RT_MANIFEST, + MAKEINTRESOURCE(1), MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), const_cast(new_manifest.c_str()), new_manifest.size())) { - fwprintf(stderr, L"Error updating resource.\n"); + fwprintf(stderr, L"Error updating resource: %d\n", GetLastError()); return 1; } if (!EndUpdateResourceW(update_handle, false)) { - fwprintf(stderr, L"Error finalizing update.\n"); + fwprintf(stderr, L"Error finalizing update: %d\n", GetLastError()); return 1; }