no more direct callout in file handling from ntdll to console
Name: con_file ChangeLog: made the calls the (Read|Write)Console thru a function pointer to ease up ntdll/kernel separation License: X11 GenDate: 2002/07/30 19:18:45 UTC ModifiedFiles: files/file.c AddedFiles: =================================================================== RCS file: /home/cvs/cvsroot/wine/wine/files/file.c,v retrieving revision 1.149 diff -u -u -r1.149 file.c --- files/file.c 5 Jun 2002 00:47:38 -0000 1.149 +++ files/file.c 30 Jul 2002 17:18:42 -0000 @@ -361,9 +361,50 @@ ret = reply->handle; } SERVER_END_REQ; + if (!ret && 0) + { + if (wine_server_fd_to_handle(output ? 1 : 0, access, sharing, &ret)) + ret = 0; + } 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 @@ -1644,7 +1685,7 @@ 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 */ @@ -1844,7 +1885,7 @@ 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;