Commit 63e11558 authored by Frédéric Delanoy's avatar Frédéric Delanoy Committed by Alexandre Julliard

cmd: Improve handle type recognition in WCMD_ReadFile.

parent e2fd09c2
......@@ -233,6 +233,11 @@ void WCMD_leave_paged_mode(void)
pagedMessage = NULL;
}
static inline BOOL is_console_handle(HANDLE h)
{
return (((DWORD_PTR)h) & 3) == 3;
}
/***************************************************************************
* WCMD_Readfile
*
......@@ -240,30 +245,23 @@ void WCMD_leave_paged_mode(void)
*/
BOOL WCMD_ReadFile(const HANDLE hIn, WCHAR *intoBuf, const DWORD maxChars, LPDWORD charsRead)
{
BOOL res;
/* Try to read from console as Unicode */
res = ReadConsoleW(hIn, intoBuf, maxChars, charsRead, NULL);
/* If reading from console has failed we assume its file
i/o so read in and convert from OEM codepage */
if (!res) {
DWORD numRead;
char *buffer;
DWORD numRead;
char *buffer;
if (is_console_handle(hIn))
/* Try to read from console as Unicode */
return ReadConsoleW(hIn, intoBuf, maxChars, charsRead, NULL);
if (!(buffer = get_file_buffer()))
return FALSE;
/* We assume it's a file handle and read then convert from assumed OEM codepage */
if (!(buffer = get_file_buffer()))
return FALSE;
/* Read from file (assume OEM codepage) */
res = ReadFile(hIn, buffer, maxChars, &numRead, NULL);
if (!ReadFile(hIn, buffer, maxChars, &numRead, NULL))
return FALSE;
/* Convert from OEM */
*charsRead = MultiByteToWideChar(GetConsoleCP(), 0, buffer, numRead,
intoBuf, maxChars);
*charsRead = MultiByteToWideChar(GetConsoleCP(), 0, buffer, numRead, intoBuf, maxChars);
}
return res;
return TRUE;
}
/*******************************************************************
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment