From 5961d101b5870df1365a03113b9f12396b654eab 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 | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/src/patch_java_manifest_for_utf8.cc b/src/patch_java_manifest_for_utf8.cc index 3e3aa1d0936d42..148440772d445a 100644 --- a/src/patch_java_manifest_for_utf8.cc +++ b/src/patch_java_manifest_for_utf8.cc @@ -23,7 +23,13 @@ // 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. +// code page such as Cp1252 on Windows. This would cause 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 +40,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 +69,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 +79,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; }