恍兮惚兮 2d6be14fa5 fix
2024-04-19 13:39:58 +08:00

48 lines
1.4 KiB
C++

#include <iostream>
#include <Windows.h>
#define SHIFT_JIS 932
int lewmain(int argc, wchar_t *argv[])
{
std::wstring process = argv[1];
std::wstring cmd = L"";
for (int i = 1; i < argc; i++)
{
cmd += L"\"";
cmd += argv[i];
cmd += L"\" ";
}
auto cmd_x = new wchar_t[cmd.size() + 1];
wcscpy(cmd_x, cmd.c_str());
std::wstring path = std::wstring(process).erase(process.rfind(L'\\'));
PROCESS_INFORMATION info = {};
if (HMODULE localeEmulator = LoadLibraryW(L"LoaderDll"))
{
// https://github.com/xupefei/Locale-Emulator/blob/aa99dec3b25708e676c90acf5fed9beaac319160/LEProc/LoaderWrapper.cs#L252
struct
{
ULONG AnsiCodePage = SHIFT_JIS;
ULONG OemCodePage = SHIFT_JIS;
ULONG LocaleID = LANG_JAPANESE;
ULONG DefaultCharset = SHIFTJIS_CHARSET;
ULONG HookUiLanguageApi = FALSE;
WCHAR DefaultFaceName[LF_FACESIZE] = {};
TIME_ZONE_INFORMATION Timezone;
ULONG64 Unused = 0;
} LEB;
GetTimeZoneInformation(&LEB.Timezone);
auto ret = ((LONG(__stdcall *)(decltype(&LEB), LPCWSTR appName, LPWSTR commandLine, LPCWSTR currentDir, void *, void *, PROCESS_INFORMATION *, void *, void *, void *, void *))
GetProcAddress(localeEmulator, "LeCreateProcess"))(&LEB, NULL, cmd_x, path.c_str(), NULL, NULL, &info, NULL, NULL, NULL, NULL);
if (ret == 0)
{
WaitForSingleObject(info.hProcess, INFINITE);
CloseHandle(info.hProcess);
CloseHandle(info.hThread);
}
}
return 1;
}