Retool SetSysColors and use SEH.

svn path=/trunk/; revision=33922
This commit is contained in:
James Tabor 2008-06-10 21:57:16 +00:00
parent 78c0b7a1df
commit 93c1e5a013
5 changed files with 34 additions and 83 deletions

View file

@ -69,9 +69,6 @@
#define NtUserGetSysColors(ColorRefs, count) \
(BOOL)NtUserCallTwoParam((DWORD)(ColorRefs), (DWORD)(count), TWOPARAM_ROUTINE_GETSYSCOLORS)
#define NtUserSetSysColors(ColorRefs, count) \
(BOOL)NtUserCallTwoParam((DWORD)(ColorRefs), (DWORD)(count), TWOPARAM_ROUTINE_SETSYSCOLORS)
#define NtUserSetCaretBlinkTime(uMSeconds) \
(BOOL)NtUserCallOneParam((DWORD)uMSeconds, ONEPARAM_ROUTINE_SETCARETBLINKTIME)

View file

@ -110,27 +110,7 @@ SetSysColors(
CONST INT *lpaElements,
CONST COLORREF *lpaRgbValues)
{
BOOL Ret;
struct
{
INT *Elements;
COLORREF *Colors;
} ChangeSysColors;
ChangeSysColors.Elements = (INT*)lpaElements;
ChangeSysColors.Colors = (COLORREF*)lpaRgbValues;
if(cElements > 0)
{
Ret = NtUserSetSysColors(&ChangeSysColors, cElements);
}
else
{
SetLastError(ERROR_INVALID_PARAMETER);
Ret = FALSE;
}
return Ret;
return NtUserSetSysColors(cElements, lpaElements, lpaRgbValues, 0);
}
void

View file

@ -2230,12 +2230,12 @@ NtUserSetShellWindowEx(
HWND hwndShell,
HWND hwndShellListView);
DWORD
BOOL
NTAPI
NtUserSetSysColors(
DWORD Unknown0,
DWORD Unknown1,
DWORD Unknown2,
int cElements,
IN INT *lpaElements,
IN COLORREF *lpaRgbValues,
DWORD Unknown3);
BOOL
@ -2639,7 +2639,6 @@ typedef struct tagKMDDELPARAM
#define TWOPARAM_ROUTINE_GETSYSCOLORBRUSHES 0xfffd0063
#define TWOPARAM_ROUTINE_GETSYSCOLORPENS 0xfffd0064
#define TWOPARAM_ROUTINE_GETSYSCOLORS 0xfffd0065
#define TWOPARAM_ROUTINE_SETSYSCOLORS 0xfffd0066 // use NtUserSetSysColors
#define TWOPARAM_ROUTINE_ROS_SHOWWINDOW 0x1000
#define TWOPARAM_ROUTINE_ROS_ISACTIVEICON 0x1001
#define TWOPARAM_ROUTINE_ROS_NCDESTROY 0x1002

View file

@ -521,17 +521,39 @@ NtUserSetRipFlags(
return 0;
}
DWORD
BOOL
STDCALL
NtUserSetSysColors(
DWORD Unknown0,
DWORD Unknown1,
DWORD Unknown2,
int cElements,
IN INT *lpaElements,
IN COLORREF *lpaRgbValues,
DWORD Unknown3)
{
UNIMPLEMENTED
return 0;
DWORD Ret = FALSE;
NTSTATUS Status = STATUS_SUCCESS;
UserEnterExclusive();
_SEH_TRY
{
ProbeForRead(lpaElements,
sizeof(INT),
1);
ProbeForRead(lpaRgbValues,
sizeof(INT),
1);
Ret = IntSetSysColors(cElements, lpaElements, lpaRgbValues);
}
_SEH_HANDLE
{
Status = _SEH_GetExceptionCode();
}
_SEH_END;
if (!NT_SUCCESS(Status))
{
SetLastNtError(Status);
Ret = FALSE;
}
UserLeave();
return Ret;
}
DWORD

View file

@ -612,53 +612,6 @@ NtUserCallTwoParam(
case TWOPARAM_ROUTINE_REGISTERLOGONPROC:
RETURN( (DWORD)co_IntRegisterLogonProcess((HANDLE)Param1, (BOOL)Param2));
case TWOPARAM_ROUTINE_SETSYSCOLORS:
{
DWORD Ret = 0;
PVOID Buffer;
struct
{
INT *Elements;
COLORREF *Colors;
}
ChangeSysColors;
/* FIXME - we should make use of SEH here... */
Status = MmCopyFromCaller(&ChangeSysColors, (PVOID)Param1, sizeof(ChangeSysColors));
if(!NT_SUCCESS(Status))
{
SetLastNtError(Status);
RETURN( 0);
}
Buffer = ExAllocatePool(PagedPool, (Param2 * sizeof(INT)) + (Param2 * sizeof(COLORREF)));
if(Buffer != NULL)
{
INT *Elements = (INT*)Buffer;
COLORREF *Colors = (COLORREF*)Buffer + Param2;
Status = MmCopyFromCaller(Elements, ChangeSysColors.Elements, Param2 * sizeof(INT));
if(NT_SUCCESS(Status))
{
Status = MmCopyFromCaller(Colors, ChangeSysColors.Colors, Param2 * sizeof(COLORREF));
if(NT_SUCCESS(Status))
{
Ret = (DWORD)IntSetSysColors((UINT)Param2, Elements, Colors);
}
else
SetLastNtError(Status);
}
else
SetLastNtError(Status);
ExFreePool(Buffer);
}
RETURN( Ret);
}
case TWOPARAM_ROUTINE_GETSYSCOLORBRUSHES:
case TWOPARAM_ROUTINE_GETSYSCOLORPENS:
case TWOPARAM_ROUTINE_GETSYSCOLORS: