[KERNEL32][CONSRV]
authorHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Mon, 12 Aug 2013 16:12:58 +0000 (16:12 +0000)
committerHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Mon, 12 Aug 2013 16:12:58 +0000 (16:12 +0000)
Half-plement SetConsolePalette.

svn path=/trunk/; revision=59711

reactos/dll/win32/kernel32/client/console/console.c
reactos/win32ss/user/winsrv/consrv/api.h
reactos/win32ss/user/winsrv/consrv/condrv/conoutput.c
reactos/win32ss/user/winsrv/consrv/conoutput.c
reactos/win32ss/user/winsrv/consrv/frontendctl.c
reactos/win32ss/user/winsrv/consrv/init.c

index 6b43874..8e76da6 100644 (file)
@@ -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;
 }
 
index a7f340b..80c24ac 100644 (file)
@@ -25,6 +25,7 @@ CSR_API(SrvGetConsoleNumberOfInputEvents);
 
 /* conoutput.c */
 CSR_API(SrvInvalidateBitMapRect);
+CSR_API(SrvSetConsolePalette);
 CSR_API(SrvReadConsoleOutput);
 CSR_API(SrvWriteConsole);
 CSR_API(SrvWriteConsoleOutput);
index 03d5745..e0c4340 100644 (file)
@@ -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,
index 223f6ca..af3325a 100644 (file)
@@ -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,
index 92c147a..f6e148f 100644 (file)
@@ -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,
index 1cc32b6..a1ba235 100644 (file)
@@ -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",