From: Hugh McMaster Subject: [PATCH] wineconsole: Set input stream buffer length per OS limit Message-Id: Date: Thu, 26 Mar 2015 22:32:45 +1100 --- programs/wineconsole/wineconsole.c | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/programs/wineconsole/wineconsole.c b/programs/wineconsole/wineconsole.c index 3c2faf5..81300ed 100644 --- a/programs/wineconsole/wineconsole.c +++ b/programs/wineconsole/wineconsole.c @@ -797,6 +797,11 @@ static UINT WINECON_ParseOptions(const char* lpCmdLine, struct wc_init* wci) return 0; } +#define MAXSTRING_NON_NT 128 +#define MAXSTRING_NT351 260 +#define MAXSTRING_NT4_W2K 2048 +#define MAXSTRING_XP 8192 + /****************************************************************** * WinMain * @@ -830,9 +835,32 @@ int PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmdLine, INT nCmdSh break; case from_process_name: { - WCHAR buffer[256]; + OSVERSIONINFOW osv; + WCHAR *buffer; + int max_cmd_str_len = MAXSTRING_NON_NT; + + /* The maximum length of a command prompt string depends on the OS platform and version */ + osv.dwOSVersionInfoSize = sizeof(osv); + GetVersionExW(&osv); + + if (osv.dwPlatformId == VER_PLATFORM_WIN32_NT) + { + /* Windows NT 3.51 */ + if (osv.dwMajorVersion == 3) + max_cmd_str_len = MAXSTRING_NT351; + /* Windows NT 4, 2000 */ + else if (osv.dwMajorVersion == 4 || (osv.dwMajorVersion == 5 && osv.dwMinorVersion == 0)) + max_cmd_str_len = MAXSTRING_NT4_W2K; + /* Windows XP and higher */ + else if ((osv.dwMajorVersion > 5) || (osv.dwMajorVersion == 5 && osv.dwMinorVersion >= 1)) + max_cmd_str_len = MAXSTRING_XP; + } + + buffer = HeapAlloc(GetProcessHeap(), 0, max_cmd_str_len * sizeof(WCHAR)); + if (!buffer) + return 0; - MultiByteToWideChar(CP_ACP, 0, wci.ptr, -1, buffer, sizeof(buffer) / sizeof(buffer[0])); + MultiByteToWideChar(CP_ACP, 0, wci.ptr, -1, buffer, max_cmd_str_len); if (!(data = WINECON_Init(hInst, GetCurrentProcessId(), buffer, wci.backend, nCmdShow))) return 0; -- 1.9.1