From: Hermès Bélusca-Maïto Date: Mon, 12 Aug 2013 16:12:58 +0000 (+0000) Subject: [KERNEL32][CONSRV] X-Git-Tag: ReactOS-0.3.16~1758 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=38c812cfc9a448ba7ff8e438bece2c3375036bac [KERNEL32][CONSRV] Half-plement SetConsolePalette. svn path=/trunk/; revision=59711 --- diff --git a/reactos/dll/win32/kernel32/client/console/console.c b/reactos/dll/win32/kernel32/client/console/console.c index 6b438749149..8e76da6abe6 100644 --- a/reactos/dll/win32/kernel32/client/console/console.c +++ b/reactos/dll/win32/kernel32/client/console/console.c @@ -711,7 +711,7 @@ SetConsoleMenuClose(BOOL bEnable) /* - * @unimplemented (Undocumented) + * @implemented (Undocumented) * @note See http://comments.gmane.org/gmane.comp.lang.harbour.devel/27844 * Usage example: https://github.com/harbour/core/commit/d79a1b7b812cbde6ddf718ebfd6939a24f633e52 */ @@ -721,9 +721,24 @@ SetConsolePalette(HANDLE hConsoleOutput, HPALETTE hPalette, UINT dwUsage) { - DPRINT1("SetConsolePalette(0x%x, 0x%x, %d) UNIMPLEMENTED!\n", hConsoleOutput, hPalette, dwUsage); - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - // Return TRUE so that we don't fail when being used by NTVDM even if not implemented. + NTSTATUS Status; + CONSOLE_API_MESSAGE ApiMessage; + PCONSOLE_SETPALETTE SetPaletteRequest = &ApiMessage.Data.SetPaletteRequest; + + SetPaletteRequest->OutputHandle = hConsoleOutput; + SetPaletteRequest->PaletteHandle = hPalette; + SetPaletteRequest->Usage = dwUsage; + + Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, + NULL, + CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepSetPalette), + sizeof(CONSOLE_SETPALETTE)); + if (!NT_SUCCESS(Status)) + { + BaseSetLastNTError(Status); + return FALSE; + } + return TRUE; } diff --git a/reactos/win32ss/user/winsrv/consrv/api.h b/reactos/win32ss/user/winsrv/consrv/api.h index a7f340bc742..80c24ac1577 100644 --- a/reactos/win32ss/user/winsrv/consrv/api.h +++ b/reactos/win32ss/user/winsrv/consrv/api.h @@ -25,6 +25,7 @@ CSR_API(SrvGetConsoleNumberOfInputEvents); /* conoutput.c */ CSR_API(SrvInvalidateBitMapRect); +CSR_API(SrvSetConsolePalette); CSR_API(SrvReadConsoleOutput); CSR_API(SrvWriteConsole); CSR_API(SrvWriteConsoleOutput); diff --git a/reactos/win32ss/user/winsrv/consrv/condrv/conoutput.c b/reactos/win32ss/user/winsrv/consrv/condrv/conoutput.c index 03d5745f754..e0c4340f1d8 100644 --- a/reactos/win32ss/user/winsrv/consrv/condrv/conoutput.c +++ b/reactos/win32ss/user/winsrv/consrv/condrv/conoutput.c @@ -203,6 +203,16 @@ ConDrvInvalidateBitMapRect(IN PCONSOLE Console, return STATUS_SUCCESS; } +NTSTATUS NTAPI +ConDrvSetConsolePalette(IN PCONSOLE Console, + IN PGRAPHICS_SCREEN_BUFFER Buffer, + IN HPALETTE PaletteHandle, + IN UINT Usage) +{ + DPRINT1("ConDrvSetConsolePalette is UNIMPLEMENTED but returns STATUS_SUCCESS\n"); + return STATUS_SUCCESS; +} + NTSTATUS NTAPI ConDrvGetConsoleCursorInfo(IN PCONSOLE Console, IN PTEXTMODE_SCREEN_BUFFER Buffer, diff --git a/reactos/win32ss/user/winsrv/consrv/conoutput.c b/reactos/win32ss/user/winsrv/consrv/conoutput.c index 223f6caf781..af3325a1a48 100644 --- a/reactos/win32ss/user/winsrv/consrv/conoutput.c +++ b/reactos/win32ss/user/winsrv/consrv/conoutput.c @@ -50,6 +50,36 @@ CSR_API(SrvInvalidateBitMapRect) return Status; } +NTSTATUS NTAPI +ConDrvSetConsolePalette(IN PCONSOLE Console, + IN PGRAPHICS_SCREEN_BUFFER Buffer, + IN HPALETTE PaletteHandle, + IN UINT Usage); +CSR_API(SrvSetConsolePalette) +{ + NTSTATUS Status; + PCONSOLE_SETPALETTE SetPaletteRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetPaletteRequest; + // PCONSOLE_SCREEN_BUFFER Buffer; + PGRAPHICS_SCREEN_BUFFER Buffer; + + DPRINT("SrvSetConsolePalette\n"); + + // NOTE: Tests show that this function is used only for graphics screen buffers + // and otherwise it returns false + sets last error to invalid handle. + Status = ConSrvGetGraphicsBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), + SetPaletteRequest->OutputHandle, + &Buffer, GENERIC_WRITE, TRUE); + if (!NT_SUCCESS(Status)) return Status; + + Status = ConDrvSetConsolePalette(Buffer->Header.Console, + Buffer, + SetPaletteRequest->PaletteHandle, + SetPaletteRequest->Usage); + + ConSrvReleaseScreenBuffer(Buffer, TRUE); + return Status; +} + NTSTATUS NTAPI ConDrvGetConsoleCursorInfo(IN PCONSOLE Console, IN PTEXTMODE_SCREEN_BUFFER Buffer, diff --git a/reactos/win32ss/user/winsrv/consrv/frontendctl.c b/reactos/win32ss/user/winsrv/consrv/frontendctl.c index 92c147a5a36..f6e148fc4a9 100644 --- a/reactos/win32ss/user/winsrv/consrv/frontendctl.c +++ b/reactos/win32ss/user/winsrv/consrv/frontendctl.c @@ -220,7 +220,7 @@ CSR_API(SrvSetConsoleCursor) PCONSOLE_SCREEN_BUFFER Buff; // FIXME: Tests show that this function is used only for graphics screen buffers - // and otherwise it returns false + set last error to invalid handle. + // and otherwise it returns false + sets last error to invalid handle. // NOTE: I find that behaviour is ridiculous but ok, let's accept that at the moment... Status = ConSrvGetGraphicsBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), SetCursorRequest->OutputHandle, diff --git a/reactos/win32ss/user/winsrv/consrv/init.c b/reactos/win32ss/user/winsrv/consrv/init.c index 1cc32b6acd9..a1ba2357a99 100644 --- a/reactos/win32ss/user/winsrv/consrv/init.c +++ b/reactos/win32ss/user/winsrv/consrv/init.c @@ -75,7 +75,7 @@ PCSR_API_ROUTINE ConsoleServerApiDispatchTable[ConsolepMaxApiNumber - CONSRV_FIR SrvSetConsoleCursor, SrvShowConsoleCursor, SrvConsoleMenuControl, - // SrvSetConsolePalette, + SrvSetConsolePalette, SrvSetConsoleDisplayMode, // SrvRegisterConsoleVDM, SrvGetConsoleHardwareState, @@ -166,7 +166,7 @@ BOOLEAN ConsoleServerApiServerValidTable[ConsolepMaxApiNumber - CONSRV_FIRST_API FALSE, // SrvSetConsoleCursor, FALSE, // SrvShowConsoleCursor, FALSE, // SrvConsoleMenuControl, - // FALSE, // SrvSetConsolePalette, + FALSE, // SrvSetConsolePalette, FALSE, // SrvSetConsoleDisplayMode, // FALSE, // SrvRegisterConsoleVDM, FALSE, // SrvGetConsoleHardwareState, @@ -257,7 +257,7 @@ PCHAR ConsoleServerApiNameTable[ConsolepMaxApiNumber - CONSRV_FIRST_API_NUMBER] "SetConsoleCursor", "ShowConsoleCursor", "ConsoleMenuControl", - // "SetConsolePalette", + "SetConsolePalette", "SetConsoleDisplayMode", // "RegisterConsoleVDM", "GetConsoleHardwareState",