NtUserConsoleControl(
IN CONSOLECONTROL ConsoleCtrl,
IN PVOID ConsoleCtrlInfo,
- IN DWORD ConsoleCtrlInfoLength)
+ IN ULONG ConsoleCtrlInfoLength)
{
NTSTATUS Status = STATUS_SUCCESS;
{
_SEH2_TRY
{
- ProbeForRead(ConsoleCtrlInfo, ConsoleCtrlInfoLength, 1);
ASSERT(ConsoleCtrlInfoLength == sizeof(ATOM));
+ ProbeForRead(ConsoleCtrlInfo, ConsoleCtrlInfoLength, 1);
gaGuiConsoleWndClass = *(ATOM*)ConsoleCtrlInfo;
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
break;
}
+ case ConsoleMakePalettePublic:
+ {
+ _SEH2_TRY
+ {
+ ASSERT(ConsoleCtrlInfoLength == sizeof(HPALETTE));
+ ProbeForRead(ConsoleCtrlInfo, ConsoleCtrlInfoLength, 1);
+ /*
+ * Make the palette handle public - Use the extended
+ * function introduced by Timo in revision 60725.
+ */
+ GreSetObjectOwnerEx(*(HPALETTE*)ConsoleCtrlInfo,
+ GDI_OBJ_HMGR_PUBLIC,
+ GDIOBJFLAG_IGNOREPID);
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ Status = _SEH2_GetExceptionCode();
+ }
+ _SEH2_END;
+
+ break;
+ }
+
case ConsoleAcquireDisplayOwnership:
{
+ ERR("NtUserConsoleControl - ConsoleAcquireDisplayOwnership is UNIMPLEMENTED\n");
+ Status = STATUS_NOT_IMPLEMENTED;
break;
}
// PGRAPHICS_SCREEN_BUFFER Buffer;
PCONSOLE_SCREEN_BUFFER Buffer;
-
-/******************************************************************************\
-|************** HACK! HACK! HACK! HACK! HACK! HACK! HACK! HACK! ***************|
-\******************************************************************************/
-
-#define PALETTESIZE 256
-
- LPLOGPALETTE LogPalette; /* Pointer to logical palette */
- PALETTEENTRY MyPalette[] =
- { {0, 0, 0x80,0} , // 1
- {0, 0x80,0, 0} , // 2
- {0, 0, 0, 0} , // 0
- {0, 0x80,0x80,0} , // 3
- {0x80,0, 0, 0} , // 4
- {0x80,0, 0x80,0} , // 5
- {0x80,0x80,0, 0} , // 6
- {0xC0,0xC0,0xC0,0} , // 7
- {0x80,0x80,0x80,0} , // 8
- {0, 0, 0xFF,0} , // 9
- {0, 0xFF,0, 0} , // 10
- {0, 0xFF,0xFF,0} , // 11
- {0xFF,0, 0, 0} , // 12
- {0xFF,0, 0xFF,0} , // 13
- {0xFF,0xFF,0, 0} , // 14
- {0xFF,0xFF,0xFF,0} }; // 15
-
-/******************************************************************************\
-|************** HACK! HACK! HACK! HACK! HACK! HACK! HACK! HACK! ***************|
-\******************************************************************************/
-
-
- DPRINT1("SrvSetConsolePalette\n");
+ 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.
&Buffer, GENERIC_WRITE, TRUE);
if (!NT_SUCCESS(Status)) return Status;
-
-/******************************************************************************\
-|************** HACK! HACK! HACK! HACK! HACK! HACK! HACK! HACK! ***************|
-\******************************************************************************/
-
- DPRINT1("HACK: FIXME: SrvSetConsolePalette - Use hacked palette for testing purposes!!\n");
-
- LogPalette = (LPLOGPALETTE)ConsoleAllocHeap(HEAP_ZERO_MEMORY,
- (sizeof(LOGPALETTE) +
- (sizeof(PALETTEENTRY) * PALETTESIZE)));
- if (LogPalette)
- {
- UINT i;
-
- LogPalette->palVersion = 0x300;
- LogPalette->palNumEntries = PALETTESIZE;
-
- for (i = 0 ; i < PALETTESIZE ; i++)
- {
- LogPalette->palPalEntry[i] = MyPalette[i % sizeof(MyPalette)/sizeof(MyPalette[0])];
- }
-
- SetPaletteRequest->PaletteHandle = CreatePalette(LogPalette);
- SetPaletteRequest->Usage = SYSPAL_NOSTATIC256;
- ConsoleFreeHeap(LogPalette);
- }
- else
- {
- DPRINT1("SrvSetConsolePalette - Hacked LogPalette is NULL\n");
- }
-
-/******************************************************************************\
-|************** HACK! HACK! HACK! HACK! HACK! HACK! HACK! HACK! ***************|
-\******************************************************************************/
-
-
- DPRINT1("ConDrvSetConsolePalette calling...\n");
+ /*
+ * Make the palette handle public, so that it can be
+ * used by other threads calling GDI functions on it.
+ * Indeed, the palette handle comes from a console app
+ * calling ourselves, running in CSRSS.
+ */
+ NtUserConsoleControl(ConsoleMakePalettePublic,
+ &SetPaletteRequest->PaletteHandle,
+ sizeof(SetPaletteRequest->PaletteHandle));
Status = ConDrvSetConsolePalette(Buffer->Header.Console,
Buffer,
SetPaletteRequest->PaletteHandle,
SetPaletteRequest->Usage);
- DPRINT1("ConDrvSetConsolePalette returned Status 0x%08lx\n", Status);
-
ConSrvReleaseScreenBuffer(Buffer, TRUE);
return Status;
}