diff --git a/files/file.c b/files/file.c index e3847c47b01..9b04fc5c151 100644 --- a/files/file.c +++ b/files/file.c @@ -364,6 +364,42 @@ static HANDLE FILE_OpenConsole( BOOL output, DWORD access, DWORD sharing, LPSECU return ret; } +/* FIXME: those routines defined as pointers are needed, because this file is + * currently compiled into NTDLL whereas it belongs to kernel32. + * this shall go away once all the DLL separation process is done + */ +typedef BOOL (WINAPI* pRW)(HANDLE, const void*, DWORD, DWORD*, void*); + +static BOOL FILE_ReadConsole(HANDLE hCon, void* buf, DWORD nb, DWORD* nr, void* p) +{ + static HANDLE hKernel /* = 0 */; + static pRW pReadConsole /* = 0 */; + + if ((!hKernel && !(hKernel = LoadLibraryA("kernel32"))) || + (!pReadConsole && + !(pReadConsole = GetProcAddress(hKernel, "ReadConsoleA")))) + { + *nr = 0; + return 0; + } + return (pReadConsole)(hCon, buf, nb, nr, p); +} + +static BOOL FILE_WriteConsole(HANDLE hCon, const void* buf, DWORD nb, DWORD* nr, void* p) +{ + static HANDLE hKernel /* = 0 */; + static pRW pWriteConsole /* = 0 */; + + if ((!hKernel && !(hKernel = LoadLibraryA("kernel32"))) || + (!pWriteConsole && + !(pWriteConsole = GetProcAddress(hKernel, "WriteConsoleA")))) + { + *nr = 0; + return 0; + } + return (pWriteConsole)(hCon, buf, nb, nr, p); +} +/* end of FIXME */ /*********************************************************************** * FILE_CreateFile @@ -1640,7 +1676,7 @@ BOOL WINAPI ReadFile( HANDLE hFile, LPVOID buffer, DWORD bytesToRead, case FD_TYPE_SMB: return SMB_ReadFile(hFile, buffer, bytesToRead, bytesRead, NULL); case FD_TYPE_CONSOLE: - return ReadConsoleA(hFile, buffer, bytesToRead, bytesRead, NULL); + return FILE_ReadConsole(hFile, buffer, bytesToRead, bytesRead, NULL); default: /* normal unix files */ @@ -1840,7 +1876,7 @@ BOOL WINAPI WriteFile( HANDLE hFile, LPCVOID buffer, DWORD bytesToWrite, case FD_TYPE_CONSOLE: TRACE("%d %s %ld %p %p\n", hFile, debugstr_an(buffer, bytesToWrite), bytesToWrite, bytesWritten, overlapped ); - return WriteConsoleA(hFile, buffer, bytesToWrite, bytesWritten, NULL); + return FILE_WriteConsole(hFile, buffer, bytesToWrite, bytesWritten, NULL); default: if (unix_handle == -1) return FALSE;