2003-11-30 20:03:47 +00:00
|
|
|
/* $Id: misc.c,v 1.32 2003/11/30 20:03:47 navaraf Exp $
|
2003-05-26 18:52:37 +00:00
|
|
|
*
|
|
|
|
* COPYRIGHT: See COPYING in the top level directory
|
|
|
|
* PROJECT: ReactOS kernel
|
|
|
|
* PURPOSE: Misc User funcs
|
|
|
|
* FILE: subsys/win32k/ntuser/misc.c
|
|
|
|
* PROGRAMER: Ge van Geldorp (ge@gse.nl)
|
|
|
|
* REVISION HISTORY:
|
|
|
|
* 2003/05/22 Created
|
|
|
|
*/
|
|
|
|
#include <ddk/ntddk.h>
|
2003-08-24 23:52:29 +00:00
|
|
|
#include <ddk/ntddmou.h>
|
2003-05-26 18:52:37 +00:00
|
|
|
#include <win32k/win32k.h>
|
2003-08-24 23:52:29 +00:00
|
|
|
#include <win32k/dc.h>
|
2003-09-24 21:09:22 +00:00
|
|
|
#include <internal/safe.h>
|
2003-05-26 18:52:37 +00:00
|
|
|
#include <include/error.h>
|
|
|
|
#include <include/window.h>
|
|
|
|
#include <include/painting.h>
|
2003-08-17 09:17:04 +00:00
|
|
|
#include <include/dce.h>
|
2003-08-24 23:52:29 +00:00
|
|
|
#include <include/mouse.h>
|
2003-08-24 18:52:18 +00:00
|
|
|
#include <include/winsta.h>
|
2003-10-16 22:07:37 +00:00
|
|
|
#include <include/caret.h>
|
2003-11-10 17:44:50 +00:00
|
|
|
#include <include/object.h>
|
2003-11-30 20:03:47 +00:00
|
|
|
#include <include/focus.h>
|
2003-05-26 18:52:37 +00:00
|
|
|
|
|
|
|
#define NDEBUG
|
|
|
|
#include <debug.h>
|
|
|
|
|
2003-10-09 06:13:05 +00:00
|
|
|
void W32kRegisterPrimitiveMessageQueue() {
|
|
|
|
extern PUSER_MESSAGE_QUEUE pmPrimitiveMessageQueue;
|
|
|
|
if( !pmPrimitiveMessageQueue ) {
|
|
|
|
PW32THREAD pThread;
|
|
|
|
pThread = PsGetWin32Thread();
|
|
|
|
if( pThread && pThread->MessageQueue ) {
|
|
|
|
pmPrimitiveMessageQueue = pThread->MessageQueue;
|
2003-11-24 16:19:58 +00:00
|
|
|
DPRINT( "Installed primitive input queue.\n" );
|
2003-10-09 06:13:05 +00:00
|
|
|
}
|
|
|
|
} else {
|
2003-11-24 16:19:58 +00:00
|
|
|
DPRINT1( "Alert! Someone is trying to steal the primitive queue.\n" );
|
2003-10-09 06:13:05 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
PUSER_MESSAGE_QUEUE W32kGetPrimitiveMessageQueue() {
|
|
|
|
extern PUSER_MESSAGE_QUEUE pmPrimitiveMessageQueue;
|
|
|
|
return pmPrimitiveMessageQueue;
|
|
|
|
}
|
2003-05-26 18:52:37 +00:00
|
|
|
|
2003-08-28 18:04:59 +00:00
|
|
|
/*
|
2003-09-12 12:54:26 +00:00
|
|
|
* @unimplemented
|
2003-08-28 18:04:59 +00:00
|
|
|
*/
|
2003-08-06 11:32:17 +00:00
|
|
|
DWORD
|
|
|
|
STDCALL
|
2003-10-09 06:13:05 +00:00
|
|
|
NtUserCallNoParam(DWORD Routine)
|
2003-08-06 11:32:17 +00:00
|
|
|
{
|
2003-10-16 22:07:37 +00:00
|
|
|
DWORD Result = 0;
|
2003-08-06 11:32:17 +00:00
|
|
|
|
2003-10-16 22:07:37 +00:00
|
|
|
switch(Routine)
|
|
|
|
{
|
|
|
|
case NOPARAM_ROUTINE_REGISTER_PRIMITIVE:
|
|
|
|
W32kRegisterPrimitiveMessageQueue();
|
|
|
|
Result = (DWORD)TRUE;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case NOPARAM_ROUTINE_DESTROY_CARET:
|
|
|
|
Result = (DWORD)IntDestroyCaret(PsGetCurrentThread()->Win32Thread);
|
|
|
|
break;
|
|
|
|
|
2003-11-19 13:19:40 +00:00
|
|
|
case NOPARAM_ROUTINE_INIT_MESSAGE_PUMP:
|
|
|
|
Result = (DWORD)IntInitMessagePumpHook();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case NOPARAM_ROUTINE_UNINIT_MESSAGE_PUMP:
|
|
|
|
Result = (DWORD)IntUninitMessagePumpHook();
|
|
|
|
break;
|
|
|
|
|
2003-10-16 22:07:37 +00:00
|
|
|
default:
|
|
|
|
DPRINT1("Calling invalid routine number 0x%x in NtUserCallTwoParam\n");
|
|
|
|
SetLastWin32Error(ERROR_INVALID_PARAMETER);
|
|
|
|
break;
|
2003-10-09 06:13:05 +00:00
|
|
|
}
|
2003-10-16 22:07:37 +00:00
|
|
|
return Result;
|
|
|
|
}
|
2003-08-06 11:32:17 +00:00
|
|
|
|
2003-08-28 18:04:59 +00:00
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
2003-08-06 11:32:17 +00:00
|
|
|
DWORD
|
|
|
|
STDCALL
|
|
|
|
NtUserCallOneParam(
|
|
|
|
DWORD Param,
|
|
|
|
DWORD Routine)
|
|
|
|
{
|
2003-08-28 14:22:05 +00:00
|
|
|
NTSTATUS Status;
|
2003-08-06 11:32:17 +00:00
|
|
|
DWORD Result = 0;
|
2003-08-28 14:22:05 +00:00
|
|
|
PWINSTATION_OBJECT WinStaObject;
|
2003-08-06 11:32:17 +00:00
|
|
|
PWINDOW_OBJECT WindowObject;
|
2003-08-28 14:22:05 +00:00
|
|
|
|
2003-08-06 11:32:17 +00:00
|
|
|
switch(Routine)
|
|
|
|
{
|
|
|
|
case ONEPARAM_ROUTINE_GETMENU:
|
2003-08-19 11:48:50 +00:00
|
|
|
WindowObject = IntGetWindowObject((HWND)Param);
|
2003-08-06 11:32:17 +00:00
|
|
|
if(!WindowObject)
|
|
|
|
{
|
|
|
|
SetLastWin32Error(ERROR_INVALID_HANDLE);
|
|
|
|
return FALSE;
|
|
|
|
}
|
2003-08-18 00:11:17 +00:00
|
|
|
|
2003-09-13 13:58:38 +00:00
|
|
|
Result = (DWORD)WindowObject->IDMenu;
|
2003-08-18 00:11:17 +00:00
|
|
|
|
2003-08-19 11:48:50 +00:00
|
|
|
IntReleaseWindowObject(WindowObject);
|
2003-08-06 11:32:17 +00:00
|
|
|
return Result;
|
2003-08-06 13:17:44 +00:00
|
|
|
|
2003-08-06 11:32:17 +00:00
|
|
|
case ONEPARAM_ROUTINE_ISWINDOWUNICODE:
|
2003-08-19 11:48:50 +00:00
|
|
|
WindowObject = IntGetWindowObject((HWND)Param);
|
2003-08-06 11:32:17 +00:00
|
|
|
if(!WindowObject)
|
|
|
|
{
|
|
|
|
SetLastWin32Error(ERROR_INVALID_HANDLE);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
Result = WindowObject->Unicode;
|
2003-08-19 11:48:50 +00:00
|
|
|
IntReleaseWindowObject(WindowObject);
|
2003-08-06 11:32:17 +00:00
|
|
|
return Result;
|
2003-08-17 09:17:04 +00:00
|
|
|
|
|
|
|
case ONEPARAM_ROUTINE_WINDOWFROMDC:
|
2003-08-19 11:48:50 +00:00
|
|
|
return (DWORD)IntWindowFromDC((HDC)Param);
|
2003-08-18 00:11:17 +00:00
|
|
|
|
|
|
|
case ONEPARAM_ROUTINE_GETWNDCONTEXTHLPID:
|
2003-08-19 11:48:50 +00:00
|
|
|
WindowObject = IntGetWindowObject((HWND)Param);
|
2003-08-18 00:11:17 +00:00
|
|
|
if(!WindowObject)
|
|
|
|
{
|
|
|
|
SetLastWin32Error(ERROR_INVALID_HANDLE);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
Result = WindowObject->ContextHelpId;
|
|
|
|
|
2003-08-19 11:48:50 +00:00
|
|
|
IntReleaseWindowObject(WindowObject);
|
2003-08-18 00:11:17 +00:00
|
|
|
return Result;
|
2003-10-16 22:07:37 +00:00
|
|
|
|
2003-08-28 14:22:05 +00:00
|
|
|
case ONEPARAM_ROUTINE_SWAPMOUSEBUTTON:
|
2003-11-23 11:39:48 +00:00
|
|
|
Status = IntValidateWindowStationHandle(PROCESS_WINDOW_STATION(),
|
|
|
|
KernelMode,
|
|
|
|
0,
|
|
|
|
&WinStaObject);
|
2003-08-28 14:22:05 +00:00
|
|
|
if (!NT_SUCCESS(Status))
|
|
|
|
return (DWORD)FALSE;
|
|
|
|
|
|
|
|
Result = (DWORD)IntSwapMouseButton(WinStaObject, (BOOL)Param);
|
|
|
|
|
|
|
|
ObDereferenceObject(WinStaObject);
|
|
|
|
return Result;
|
2003-10-16 22:07:37 +00:00
|
|
|
|
2003-10-17 20:31:56 +00:00
|
|
|
case ONEPARAM_ROUTINE_SWITCHCARETSHOWING:
|
|
|
|
return (DWORD)IntSwitchCaretShowing((PVOID)Param);
|
|
|
|
|
2003-10-16 22:07:37 +00:00
|
|
|
case ONEPARAM_ROUTINE_SETCARETBLINKTIME:
|
|
|
|
return (DWORD)IntSetCaretBlinkTime((UINT)Param);
|
2003-08-06 11:32:17 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
DPRINT1("Calling invalid routine number 0x%x in NtUserCallOneParam()\n Param=0x%x\n",
|
|
|
|
Routine, Param);
|
|
|
|
SetLastWin32Error(ERROR_INVALID_PARAMETER);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2003-08-28 18:04:59 +00:00
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
2003-05-26 18:52:37 +00:00
|
|
|
DWORD
|
|
|
|
STDCALL
|
|
|
|
NtUserCallTwoParam(
|
|
|
|
DWORD Param1,
|
|
|
|
DWORD Param2,
|
|
|
|
DWORD Routine)
|
|
|
|
{
|
2003-08-24 18:52:18 +00:00
|
|
|
NTSTATUS Status;
|
2003-08-18 00:11:17 +00:00
|
|
|
PWINDOW_OBJECT WindowObject;
|
2003-08-24 23:52:29 +00:00
|
|
|
PSYSTEM_CURSORINFO CurInfo;
|
2003-08-24 18:52:18 +00:00
|
|
|
PWINSTATION_OBJECT WinStaObject;
|
2003-09-24 21:09:22 +00:00
|
|
|
POINT Pos;
|
2003-08-24 18:52:18 +00:00
|
|
|
|
2003-05-26 18:52:37 +00:00
|
|
|
switch(Routine)
|
2003-08-06 11:32:17 +00:00
|
|
|
{
|
|
|
|
case TWOPARAM_ROUTINE_ENABLEWINDOW:
|
|
|
|
UNIMPLEMENTED
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
case TWOPARAM_ROUTINE_UNKNOWN:
|
|
|
|
UNIMPLEMENTED
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
case TWOPARAM_ROUTINE_SHOWOWNEDPOPUPS:
|
|
|
|
UNIMPLEMENTED
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
case TWOPARAM_ROUTINE_SWITCHTOTHISWINDOW:
|
|
|
|
UNIMPLEMENTED
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
case TWOPARAM_ROUTINE_VALIDATERGN:
|
|
|
|
return (DWORD)NtUserValidateRgn((HWND) Param1, (HRGN) Param2);
|
2003-08-18 00:11:17 +00:00
|
|
|
|
|
|
|
case TWOPARAM_ROUTINE_SETWNDCONTEXTHLPID:
|
2003-08-19 11:48:50 +00:00
|
|
|
WindowObject = IntGetWindowObject((HWND)Param1);
|
2003-08-18 00:11:17 +00:00
|
|
|
if(!WindowObject)
|
|
|
|
{
|
|
|
|
SetLastWin32Error(ERROR_INVALID_HANDLE);
|
2003-08-21 16:04:26 +00:00
|
|
|
return (DWORD)FALSE;
|
2003-08-18 00:11:17 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
WindowObject->ContextHelpId = Param2;
|
|
|
|
|
2003-08-19 11:48:50 +00:00
|
|
|
IntReleaseWindowObject(WindowObject);
|
2003-08-21 16:04:26 +00:00
|
|
|
return (DWORD)TRUE;
|
2003-08-24 18:52:18 +00:00
|
|
|
|
|
|
|
case TWOPARAM_ROUTINE_CURSORPOSITION:
|
|
|
|
if(!Param1)
|
|
|
|
return (DWORD)FALSE;
|
2003-11-23 11:39:48 +00:00
|
|
|
Status = IntValidateWindowStationHandle(PROCESS_WINDOW_STATION(),
|
|
|
|
KernelMode,
|
|
|
|
0,
|
|
|
|
&WinStaObject);
|
2003-08-24 18:52:18 +00:00
|
|
|
if (!NT_SUCCESS(Status))
|
|
|
|
return (DWORD)FALSE;
|
|
|
|
|
|
|
|
if(Param2)
|
|
|
|
{
|
|
|
|
/* set cursor position */
|
2003-08-24 23:52:29 +00:00
|
|
|
|
2003-09-24 21:09:22 +00:00
|
|
|
Status = MmCopyFromCaller(&Pos, (PPOINT)Param1, sizeof(POINT));
|
|
|
|
if(!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
ObDereferenceObject(WinStaObject);
|
|
|
|
SetLastNtError(Status);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2003-08-24 23:52:29 +00:00
|
|
|
CurInfo = &WinStaObject->SystemCursor;
|
2003-08-24 18:52:18 +00:00
|
|
|
/* FIXME - check if process has WINSTA_WRITEATTRIBUTES */
|
|
|
|
|
2003-08-25 00:28:23 +00:00
|
|
|
//CheckClipCursor(&Pos->x, &Pos->y, CurInfo);
|
2003-09-24 21:09:22 +00:00
|
|
|
if((Pos.x != CurInfo->x) || (Pos.y != CurInfo->y))
|
2003-08-24 23:52:29 +00:00
|
|
|
{
|
2003-09-24 21:09:22 +00:00
|
|
|
MouseMoveCursor(Pos.x, Pos.y);
|
2003-08-24 23:52:29 +00:00
|
|
|
}
|
|
|
|
|
2003-08-24 18:52:18 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* get cursor position */
|
|
|
|
/* FIXME - check if process has WINSTA_READATTRIBUTES */
|
2003-09-24 21:09:22 +00:00
|
|
|
Pos.x = WinStaObject->SystemCursor.x;
|
|
|
|
Pos.y = WinStaObject->SystemCursor.y;
|
|
|
|
|
|
|
|
Status = MmCopyToCaller((PPOINT)Param1, &Pos, sizeof(POINT));
|
|
|
|
if(!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
ObDereferenceObject(WinStaObject);
|
|
|
|
SetLastNtError(Status);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2003-08-24 18:52:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
ObDereferenceObject(WinStaObject);
|
|
|
|
|
|
|
|
return (DWORD)TRUE;
|
2003-10-16 22:07:37 +00:00
|
|
|
|
|
|
|
case TWOPARAM_ROUTINE_SETCARETPOS:
|
|
|
|
return (DWORD)IntSetCaretPos((int)Param1, (int)Param2);
|
2003-08-06 11:32:17 +00:00
|
|
|
}
|
2003-11-11 20:28:21 +00:00
|
|
|
DPRINT1("Calling invalid routine number 0x%x in NtUserCallTwoParam()\n Param1=0x%x Parm2=0x%x\n",
|
2003-08-06 11:32:17 +00:00
|
|
|
Routine, Param1, Param2);
|
|
|
|
SetLastWin32Error(ERROR_INVALID_PARAMETER);
|
|
|
|
return 0;
|
2003-05-26 18:52:37 +00:00
|
|
|
}
|
2003-08-28 18:04:59 +00:00
|
|
|
|
2003-11-30 20:03:47 +00:00
|
|
|
/*
|
|
|
|
* @unimplemented
|
|
|
|
*/
|
|
|
|
BOOL
|
|
|
|
STDCALL
|
|
|
|
NtUserCallHwndLock(
|
|
|
|
HWND hWnd,
|
|
|
|
DWORD Routine)
|
|
|
|
{
|
|
|
|
BOOL Ret = 0;
|
|
|
|
PWINDOW_OBJECT Window;
|
|
|
|
|
|
|
|
Window = IntGetWindowObject(hWnd);
|
|
|
|
if (Window == 0)
|
|
|
|
{
|
|
|
|
SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* FIXME: Routine can be 0x53 - 0x5E */
|
|
|
|
switch (Routine)
|
|
|
|
{
|
|
|
|
case HWNDLOCK_ROUTINE_ARRANGEICONICWINDOWS:
|
|
|
|
/* FIXME */
|
|
|
|
break;
|
|
|
|
|
|
|
|
case HWNDLOCK_ROUTINE_DRAWMENUBAR:
|
|
|
|
/* FIXME */
|
|
|
|
break;
|
|
|
|
|
|
|
|
case HWNDLOCK_ROUTINE_REDRAWFRAME:
|
|
|
|
/* FIXME */
|
|
|
|
break;
|
|
|
|
|
|
|
|
case HWNDLOCK_ROUTINE_SETFOREGROUNDWINDOW:
|
|
|
|
Ret = IntSetForegroundWindow(Window);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case HWNDLOCK_ROUTINE_UPDATEWINDOW:
|
|
|
|
/* FIXME */
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
IntReleaseWindowObject(Window);
|
|
|
|
|
|
|
|
return Ret;
|
|
|
|
}
|
|
|
|
|
2003-11-22 11:01:28 +00:00
|
|
|
HWND
|
|
|
|
STDCALL
|
|
|
|
NtUserCallHwndOpt(
|
|
|
|
HWND Param,
|
|
|
|
DWORD Routine)
|
|
|
|
{
|
|
|
|
switch (Routine)
|
|
|
|
{
|
|
|
|
case HWNDOPT_ROUTINE_SETPROGMANWINDOW:
|
|
|
|
/* FIXME */
|
|
|
|
break;
|
|
|
|
|
|
|
|
case HWNDOPT_ROUTINE_SETTASKMANWINDOW:
|
|
|
|
/* FIXME */
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
2003-08-28 18:04:59 +00:00
|
|
|
|
2003-11-30 20:03:47 +00:00
|
|
|
/*
|
|
|
|
* @unimplemented
|
|
|
|
*/
|
|
|
|
DWORD STDCALL
|
|
|
|
NtUserGetThreadState(
|
|
|
|
DWORD Routine)
|
|
|
|
{
|
|
|
|
switch (Routine)
|
|
|
|
{
|
|
|
|
case 0:
|
|
|
|
return (DWORD)IntGetThreadFocusWindow();
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2003-08-28 18:04:59 +00:00
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
|
|
|
DWORD
|
|
|
|
STDCALL
|
|
|
|
NtUserSystemParametersInfo(
|
|
|
|
UINT uiAction,
|
|
|
|
UINT uiParam,
|
|
|
|
PVOID pvParam,
|
|
|
|
UINT fWinIni)
|
|
|
|
{
|
2003-08-29 09:29:11 +00:00
|
|
|
/* FIXME: This should be obtained from the registry */
|
|
|
|
static LOGFONTW CaptionFont =
|
|
|
|
{ 14, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET,
|
|
|
|
0, 0, DEFAULT_QUALITY, VARIABLE_PITCH | FF_SWISS, L"" };
|
|
|
|
/* { 12, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, OEM_CHARSET,
|
|
|
|
0, 0, DEFAULT_QUALITY, FF_MODERN, L"Bitstream Vera Sans Bold" };*/
|
2003-08-28 18:04:59 +00:00
|
|
|
NTSTATUS Status;
|
|
|
|
PWINSTATION_OBJECT WinStaObject;
|
|
|
|
|
|
|
|
switch(uiAction)
|
|
|
|
{
|
|
|
|
case SPI_SETDOUBLECLKWIDTH:
|
|
|
|
case SPI_SETDOUBLECLKHEIGHT:
|
|
|
|
case SPI_SETDOUBLECLICKTIME:
|
|
|
|
{
|
2003-11-23 11:39:48 +00:00
|
|
|
Status = IntValidateWindowStationHandle(PROCESS_WINDOW_STATION(),
|
|
|
|
KernelMode,
|
|
|
|
0,
|
|
|
|
&WinStaObject);
|
2003-11-10 17:44:50 +00:00
|
|
|
if (!NT_SUCCESS(Status))
|
|
|
|
return (DWORD)FALSE;
|
|
|
|
|
|
|
|
switch(uiAction)
|
|
|
|
{
|
|
|
|
case SPI_SETDOUBLECLKWIDTH:
|
|
|
|
/* FIXME limit the maximum value? */
|
|
|
|
WinStaObject->SystemCursor.DblClickWidth = uiParam;
|
|
|
|
break;
|
|
|
|
case SPI_SETDOUBLECLKHEIGHT:
|
|
|
|
/* FIXME limit the maximum value? */
|
|
|
|
WinStaObject->SystemCursor.DblClickHeight = uiParam;
|
|
|
|
break;
|
|
|
|
case SPI_SETDOUBLECLICKTIME:
|
|
|
|
/* FIXME limit the maximum time to 1000 ms? */
|
|
|
|
WinStaObject->SystemCursor.DblClickSpeed = uiParam;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* FIXME save the value to the registry */
|
|
|
|
|
|
|
|
ObDereferenceObject(WinStaObject);
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
case SPI_SETWORKAREA:
|
|
|
|
{
|
|
|
|
PDESKTOP_OBJECT Desktop = PsGetWin32Thread()->Desktop;
|
|
|
|
|
|
|
|
if(!Desktop)
|
|
|
|
{
|
|
|
|
/* FIXME - Set last error */
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
Status = MmCopyFromCaller(Desktop->WorkArea, (PRECT)pvParam, sizeof(RECT));
|
|
|
|
if(!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
SetLastNtError(Status);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
return TRUE;
|
2003-08-28 18:04:59 +00:00
|
|
|
}
|
2003-08-29 09:29:11 +00:00
|
|
|
case SPI_GETWORKAREA:
|
|
|
|
{
|
2003-11-10 17:44:50 +00:00
|
|
|
PDESKTOP_OBJECT Desktop = PsGetWin32Thread()->Desktop;
|
|
|
|
|
|
|
|
if(!Desktop)
|
|
|
|
{
|
|
|
|
/* FIXME - Set last error */
|
|
|
|
return FALSE;
|
|
|
|
}
|
2003-09-24 21:09:22 +00:00
|
|
|
|
2003-11-10 17:44:50 +00:00
|
|
|
Status = MmCopyToCaller((PRECT)pvParam, Desktop->WorkArea, sizeof(RECT));
|
2003-09-24 21:09:22 +00:00
|
|
|
if(!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
SetLastNtError(Status);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2003-08-29 09:29:11 +00:00
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
case SPI_GETICONTITLELOGFONT:
|
|
|
|
{
|
2003-09-24 21:09:22 +00:00
|
|
|
Status = MmCopyToCaller(pvParam, &CaptionFont, sizeof(CaptionFont));
|
|
|
|
if(!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
SetLastNtError(Status);
|
|
|
|
return FALSE;
|
|
|
|
}
|
2003-08-29 09:29:11 +00:00
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
case SPI_GETNONCLIENTMETRICS:
|
|
|
|
{
|
2003-09-24 21:09:22 +00:00
|
|
|
/* FIXME - use MmCopyToCaller() !!! */
|
2003-08-29 09:29:11 +00:00
|
|
|
LPNONCLIENTMETRICSW pMetrics = (LPNONCLIENTMETRICSW)pvParam;
|
|
|
|
|
|
|
|
if (pMetrics->cbSize != sizeof(NONCLIENTMETRICSW) ||
|
|
|
|
uiParam != sizeof(NONCLIENTMETRICSW))
|
|
|
|
{
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
memset((char *)pvParam + sizeof(pMetrics->cbSize), 0,
|
|
|
|
pMetrics->cbSize - sizeof(pMetrics->cbSize));
|
|
|
|
|
|
|
|
pMetrics->iBorderWidth = 1;
|
|
|
|
pMetrics->iScrollWidth = NtUserGetSystemMetrics(SM_CXVSCROLL);
|
|
|
|
pMetrics->iScrollHeight = NtUserGetSystemMetrics(SM_CYHSCROLL);
|
|
|
|
pMetrics->iCaptionWidth = NtUserGetSystemMetrics(SM_CXSIZE);
|
|
|
|
pMetrics->iCaptionHeight = NtUserGetSystemMetrics(SM_CYSIZE);
|
|
|
|
memcpy((LPVOID)&(pMetrics->lfCaptionFont), &CaptionFont, sizeof(CaptionFont));
|
|
|
|
pMetrics->lfCaptionFont.lfWeight = FW_BOLD;
|
|
|
|
pMetrics->iSmCaptionWidth = NtUserGetSystemMetrics(SM_CXSMSIZE);
|
|
|
|
pMetrics->iSmCaptionHeight = NtUserGetSystemMetrics(SM_CYSMSIZE);
|
|
|
|
memcpy((LPVOID)&(pMetrics->lfSmCaptionFont), &CaptionFont, sizeof(CaptionFont));
|
|
|
|
pMetrics->iMenuWidth = NtUserGetSystemMetrics(SM_CXMENUSIZE);
|
|
|
|
pMetrics->iMenuHeight = NtUserGetSystemMetrics(SM_CYMENUSIZE);
|
|
|
|
memcpy((LPVOID)&(pMetrics->lfMenuFont), &CaptionFont, sizeof(CaptionFont));
|
|
|
|
memcpy((LPVOID)&(pMetrics->lfStatusFont), &CaptionFont, sizeof(CaptionFont));
|
|
|
|
memcpy((LPVOID)&(pMetrics->lfMessageFont), &CaptionFont, sizeof(CaptionFont));
|
|
|
|
return TRUE;
|
|
|
|
}
|
2003-08-28 18:04:59 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
return FALSE;
|
|
|
|
}
|
2003-09-12 12:54:26 +00:00
|
|
|
|
|
|
|
UINT
|
|
|
|
STDCALL
|
|
|
|
NtUserGetDoubleClickTime(VOID)
|
|
|
|
{
|
|
|
|
UINT Result;
|
|
|
|
NTSTATUS Status;
|
|
|
|
PWINSTATION_OBJECT WinStaObject;
|
|
|
|
|
2003-11-23 11:39:48 +00:00
|
|
|
Status = IntValidateWindowStationHandle(PROCESS_WINDOW_STATION(),
|
|
|
|
KernelMode,
|
|
|
|
0,
|
|
|
|
&WinStaObject);
|
2003-09-12 12:54:26 +00:00
|
|
|
if (!NT_SUCCESS(Status))
|
|
|
|
return (DWORD)FALSE;
|
|
|
|
|
|
|
|
Result = WinStaObject->SystemCursor.DblClickSpeed;
|
|
|
|
|
|
|
|
ObDereferenceObject(WinStaObject);
|
|
|
|
return Result;
|
|
|
|
}
|
|
|
|
|
2003-11-18 23:33:31 +00:00
|
|
|
BOOL
|
|
|
|
STDCALL
|
|
|
|
NtUserGetGUIThreadInfo(
|
|
|
|
DWORD idThread,
|
|
|
|
LPGUITHREADINFO lpgui)
|
|
|
|
{
|
|
|
|
NTSTATUS Status;
|
|
|
|
PTHRDCARETINFO CaretInfo;
|
|
|
|
GUITHREADINFO SafeGui;
|
|
|
|
PDESKTOP_OBJECT Desktop;
|
|
|
|
PUSER_MESSAGE_QUEUE MsgQueue;
|
|
|
|
PETHREAD Thread = NULL;
|
|
|
|
|
|
|
|
Status = MmCopyFromCaller(&SafeGui, lpgui, sizeof(DWORD));
|
|
|
|
if(!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
SetLastNtError(Status);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(SafeGui.cbSize != sizeof(GUITHREADINFO))
|
|
|
|
{
|
|
|
|
SetLastWin32Error(ERROR_INVALID_PARAMETER);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(idThread)
|
|
|
|
{
|
|
|
|
Status = PsLookupThreadByThreadId((PVOID)idThread, &Thread);
|
|
|
|
if(!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
SetLastWin32Error(ERROR_ACCESS_DENIED);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
Desktop = Thread->Win32Thread->Desktop;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* get the foreground thread */
|
|
|
|
PW32THREAD W32Thread = PsGetCurrentThread()->Win32Thread;
|
|
|
|
Desktop = W32Thread->Desktop;
|
|
|
|
if(Desktop)
|
|
|
|
{
|
|
|
|
MsgQueue = Desktop->ActiveMessageQueue;
|
|
|
|
if(MsgQueue)
|
|
|
|
{
|
|
|
|
Thread = MsgQueue->Thread;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if(!Thread || !Desktop)
|
|
|
|
{
|
2003-11-23 13:46:33 +00:00
|
|
|
if(idThread && Thread)
|
|
|
|
ObDereferenceObject(Thread);
|
2003-11-18 23:33:31 +00:00
|
|
|
SetLastWin32Error(ERROR_ACCESS_DENIED);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
CaretInfo = ThrdCaretInfo(Thread->Win32Thread);
|
|
|
|
MsgQueue = (PUSER_MESSAGE_QUEUE)Desktop->ActiveMessageQueue;
|
|
|
|
|
|
|
|
SafeGui.flags = (CaretInfo->Visible ? GUI_CARETBLINKING : 0);
|
2003-11-23 12:04:54 +00:00
|
|
|
if(MsgQueue->MenuOwner)
|
|
|
|
SafeGui.flags |= GUI_INMENUMODE | MsgQueue->MenuState;
|
|
|
|
if(MsgQueue->MoveSize)
|
|
|
|
SafeGui.flags |= GUI_INMOVESIZE;
|
|
|
|
|
|
|
|
/* FIXME add flag GUI_16BITTASK */
|
2003-11-18 23:33:31 +00:00
|
|
|
|
|
|
|
SafeGui.hwndActive = MsgQueue->ActiveWindow;
|
|
|
|
SafeGui.hwndFocus = MsgQueue->FocusWindow;
|
|
|
|
SafeGui.hwndCapture = MsgQueue->CaptureWindow;
|
2003-11-23 12:04:54 +00:00
|
|
|
SafeGui.hwndMenuOwner = MsgQueue->MenuOwner;
|
|
|
|
SafeGui.hwndMoveSize = MsgQueue->MoveSize;
|
2003-11-18 23:33:31 +00:00
|
|
|
SafeGui.hwndCaret = CaretInfo->hWnd;
|
|
|
|
|
|
|
|
SafeGui.rcCaret.left = CaretInfo->Pos.x;
|
|
|
|
SafeGui.rcCaret.top = CaretInfo->Pos.y;
|
|
|
|
SafeGui.rcCaret.right = SafeGui.rcCaret.left + CaretInfo->Size.cx;
|
|
|
|
SafeGui.rcCaret.bottom = SafeGui.rcCaret.top + CaretInfo->Size.cy;
|
|
|
|
|
2003-11-23 13:46:33 +00:00
|
|
|
if(idThread)
|
|
|
|
ObDereferenceObject(Thread);
|
|
|
|
|
2003-11-18 23:33:31 +00:00
|
|
|
Status = MmCopyToCaller(lpgui, &SafeGui, sizeof(GUITHREADINFO));
|
|
|
|
if(!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
SetLastNtError(Status);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2003-11-19 12:25:03 +00:00
|
|
|
|
|
|
|
DWORD
|
|
|
|
STDCALL
|
|
|
|
NtUserGetGuiResources(
|
|
|
|
HANDLE hProcess,
|
|
|
|
DWORD uiFlags)
|
|
|
|
{
|
|
|
|
PEPROCESS Process;
|
|
|
|
PW32PROCESS W32Process;
|
|
|
|
NTSTATUS Status;
|
|
|
|
DWORD Ret = 0;
|
|
|
|
|
|
|
|
Status = ObReferenceObjectByHandle(hProcess,
|
|
|
|
PROCESS_QUERY_INFORMATION,
|
|
|
|
PsProcessType,
|
|
|
|
ExGetPreviousMode(),
|
|
|
|
(PVOID*)&Process,
|
|
|
|
NULL);
|
|
|
|
|
|
|
|
if(!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
SetLastNtError(Status);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
W32Process = Process->Win32Process;
|
|
|
|
if(!W32Process)
|
|
|
|
{
|
2003-11-23 13:46:33 +00:00
|
|
|
ObDereferenceObject(Process);
|
2003-11-19 12:25:03 +00:00
|
|
|
SetLastWin32Error(ERROR_INVALID_PARAMETER);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
switch(uiFlags)
|
|
|
|
{
|
|
|
|
case GR_GDIOBJECTS:
|
|
|
|
{
|
|
|
|
Ret = (DWORD)W32Process->GDIObjects;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case GR_USEROBJECTS:
|
|
|
|
{
|
|
|
|
Ret = (DWORD)W32Process->UserObjects;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
default:
|
|
|
|
{
|
|
|
|
SetLastWin32Error(ERROR_INVALID_PARAMETER);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
ObDereferenceObject(Process);
|
|
|
|
|
|
|
|
return Ret;
|
|
|
|
}
|
|
|
|
|