2005-01-06 13:58:04 +00:00
|
|
|
/* $Id$
|
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
|
|
|
|
*/
|
2004-05-10 17:07:20 +00:00
|
|
|
|
|
|
|
#include <w32k.h>
|
2003-05-26 18:52:37 +00:00
|
|
|
|
2005-07-31 06:22:05 +00:00
|
|
|
#define NDEBUG
|
2003-05-26 18:52:37 +00:00
|
|
|
#include <debug.h>
|
|
|
|
|
2004-05-01 16:43:15 +00:00
|
|
|
/* registered Logon process */
|
|
|
|
PW32PROCESS LogonProcess = NULL;
|
|
|
|
|
2005-03-17 13:07:28 +00:00
|
|
|
VOID W32kRegisterPrimitiveMessageQueue(VOID)
|
|
|
|
{
|
2003-10-09 06:13:05 +00:00
|
|
|
extern PUSER_MESSAGE_QUEUE pmPrimitiveMessageQueue;
|
|
|
|
if( !pmPrimitiveMessageQueue ) {
|
|
|
|
PW32THREAD pThread;
|
|
|
|
pThread = PsGetWin32Thread();
|
|
|
|
if( pThread && pThread->MessageQueue ) {
|
|
|
|
pmPrimitiveMessageQueue = pThread->MessageQueue;
|
2005-03-17 13:07:28 +00:00
|
|
|
IntReferenceMessageQueue(pmPrimitiveMessageQueue);
|
2003-11-24 16:19:58 +00:00
|
|
|
DPRINT( "Installed primitive input queue.\n" );
|
2005-05-08 02:11:54 +00:00
|
|
|
}
|
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
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2005-03-17 13:07:28 +00:00
|
|
|
VOID W32kUnregisterPrimitiveMessageQueue(VOID)
|
|
|
|
{
|
|
|
|
extern PUSER_MESSAGE_QUEUE pmPrimitiveMessageQueue;
|
|
|
|
IntDereferenceMessageQueue(pmPrimitiveMessageQueue);
|
|
|
|
pmPrimitiveMessageQueue = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
PUSER_MESSAGE_QUEUE W32kGetPrimitiveMessageQueue()
|
|
|
|
{
|
2003-10-09 06:13:05 +00:00
|
|
|
extern PUSER_MESSAGE_QUEUE pmPrimitiveMessageQueue;
|
|
|
|
return pmPrimitiveMessageQueue;
|
|
|
|
}
|
2003-05-26 18:52:37 +00:00
|
|
|
|
2004-05-01 16:43:15 +00:00
|
|
|
BOOL FASTCALL
|
2005-09-05 21:19:23 +00:00
|
|
|
co_IntRegisterLogonProcess(HANDLE ProcessId, BOOL Register)
|
2004-05-01 16:43:15 +00:00
|
|
|
{
|
|
|
|
PEPROCESS Process;
|
|
|
|
NTSTATUS Status;
|
Large change to modify NTDLL'S CSR Functions to be compatible with NT. They are external and we should at least try to match the number of arguments (one vs eight? come on!). Because this is also the direction that Emanuele wants to be taking, the whole external calling interface was modified to be more compatible with NT (although internally it still isn't, and does not have a reason to be). API Names are now generated by a macro from the Server ID, like Emanuele and I noticed from traces, and I've entirely removed the concept of a reply structure. CSRSS uses full-duplex one-way structures, not dual-strutures (this would've been incompatible with the external interface anyways). I don't seem to have introduced any new bugs (console-ROS works great for me, as does the GUI), but there is still a chance some obscure bug might happen, so please bear with me, I had to hand-edit over 250 calls. Also, this now allows full removal of ntdll headers and the next commits will clean this up
svn path=/trunk/; revision=16213
2005-06-22 04:02:32 +00:00
|
|
|
CSR_API_MESSAGE Request;
|
2004-07-08 14:36:18 +00:00
|
|
|
|
2005-01-26 00:03:05 +00:00
|
|
|
Status = PsLookupProcessByProcessId(ProcessId,
|
2004-07-08 14:36:18 +00:00
|
|
|
&Process);
|
|
|
|
if (!NT_SUCCESS(Status))
|
2004-05-01 16:43:15 +00:00
|
|
|
{
|
2004-07-08 14:36:18 +00:00
|
|
|
SetLastWin32Error(RtlNtStatusToDosError(Status));
|
2004-05-01 16:43:15 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
2004-07-08 14:36:18 +00:00
|
|
|
|
2004-07-12 20:09:35 +00:00
|
|
|
if (Register)
|
2004-05-01 16:43:15 +00:00
|
|
|
{
|
2004-07-08 14:36:18 +00:00
|
|
|
/* Register the logon process */
|
|
|
|
if (LogonProcess != NULL)
|
2004-05-01 16:43:15 +00:00
|
|
|
{
|
2004-07-08 14:36:18 +00:00
|
|
|
ObDereferenceObject(Process);
|
|
|
|
return FALSE;
|
2004-05-01 16:43:15 +00:00
|
|
|
}
|
2004-07-08 14:36:18 +00:00
|
|
|
|
2005-05-06 22:55:52 +00:00
|
|
|
LogonProcess = (PW32PROCESS)Process->Win32Process;
|
2004-05-01 16:43:15 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2004-07-08 14:36:18 +00:00
|
|
|
/* Deregister the logon process */
|
2005-05-06 22:55:52 +00:00
|
|
|
if (LogonProcess != (PW32PROCESS)Process->Win32Process)
|
2004-07-08 14:36:18 +00:00
|
|
|
{
|
|
|
|
ObDereferenceObject(Process);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2004-05-01 16:43:15 +00:00
|
|
|
LogonProcess = NULL;
|
|
|
|
}
|
2004-07-08 14:36:18 +00:00
|
|
|
|
|
|
|
ObDereferenceObject(Process);
|
|
|
|
|
Large change to modify NTDLL'S CSR Functions to be compatible with NT. They are external and we should at least try to match the number of arguments (one vs eight? come on!). Because this is also the direction that Emanuele wants to be taking, the whole external calling interface was modified to be more compatible with NT (although internally it still isn't, and does not have a reason to be). API Names are now generated by a macro from the Server ID, like Emanuele and I noticed from traces, and I've entirely removed the concept of a reply structure. CSRSS uses full-duplex one-way structures, not dual-strutures (this would've been incompatible with the external interface anyways). I don't seem to have introduced any new bugs (console-ROS works great for me, as does the GUI), but there is still a chance some obscure bug might happen, so please bear with me, I had to hand-edit over 250 calls. Also, this now allows full removal of ntdll headers and the next commits will clean this up
svn path=/trunk/; revision=16213
2005-06-22 04:02:32 +00:00
|
|
|
Request.Type = MAKE_CSR_API(REGISTER_LOGON_PROCESS, CSR_GUI);
|
2004-07-12 20:09:35 +00:00
|
|
|
Request.Data.RegisterLogonProcessRequest.ProcessId = ProcessId;
|
|
|
|
Request.Data.RegisterLogonProcessRequest.Register = Register;
|
|
|
|
|
2005-09-05 21:19:23 +00:00
|
|
|
Status = co_CsrNotify(&Request);
|
2004-07-12 20:09:35 +00:00
|
|
|
if (! NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
DPRINT1("Failed to register logon process with CSRSS\n");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2004-05-01 16:43:15 +00:00
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
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;
|
2005-09-05 21:19:23 +00:00
|
|
|
DECLARE_RETURN(DWORD);
|
|
|
|
|
|
|
|
DPRINT("Enter NtUserCallNoParam\n");
|
|
|
|
UserEnterExclusive();
|
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;
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2003-10-16 22:07:37 +00:00
|
|
|
case NOPARAM_ROUTINE_DESTROY_CARET:
|
2005-09-05 21:19:23 +00:00
|
|
|
Result = (DWORD)co_IntDestroyCaret(PsGetCurrentThread()->Tcb.Win32Thread);
|
2003-10-16 22:07:37 +00:00
|
|
|
break;
|
2005-05-08 02:11:54 +00:00
|
|
|
|
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;
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2003-12-19 19:30:05 +00:00
|
|
|
case NOPARAM_ROUTINE_GETMESSAGEEXTRAINFO:
|
|
|
|
Result = (DWORD)MsqGetMessageExtraInfo();
|
|
|
|
break;
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-05-01 18:06:59 +00:00
|
|
|
case NOPARAM_ROUTINE_ANYPOPUP:
|
|
|
|
Result = (DWORD)IntAnyPopup();
|
|
|
|
break;
|
2004-05-28 21:33:41 +00:00
|
|
|
|
|
|
|
case NOPARAM_ROUTINE_CSRSS_INITIALIZED:
|
|
|
|
Result = (DWORD)CsrInit();
|
|
|
|
break;
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-12-25 22:59:10 +00:00
|
|
|
case NOPARAM_ROUTINE_MSQCLEARWAKEMASK:
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( (DWORD)IntMsqClearWakeMask());
|
2004-12-25 22:59:10 +00:00
|
|
|
|
2003-10-16 22:07:37 +00:00
|
|
|
default:
|
2004-05-28 21:33:41 +00:00
|
|
|
DPRINT1("Calling invalid routine number 0x%x in NtUserCallNoParam\n", Routine);
|
2003-10-16 22:07:37 +00:00
|
|
|
SetLastWin32Error(ERROR_INVALID_PARAMETER);
|
|
|
|
break;
|
2003-10-09 06:13:05 +00:00
|
|
|
}
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN(Result);
|
|
|
|
|
|
|
|
CLEANUP:
|
|
|
|
DPRINT("Leave NtUserCallNoParam, ret=%i\n",_ret_);
|
|
|
|
UserLeave();
|
|
|
|
END_CLEANUP;
|
2003-10-16 22:07:37 +00:00
|
|
|
}
|
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)
|
|
|
|
{
|
2005-09-05 21:19:23 +00:00
|
|
|
DECLARE_RETURN(DWORD);
|
|
|
|
|
|
|
|
DPRINT("Enter NtUserCallOneParam\n");
|
|
|
|
UserEnterExclusive();
|
|
|
|
|
2003-08-06 11:32:17 +00:00
|
|
|
switch(Routine)
|
|
|
|
{
|
|
|
|
case ONEPARAM_ROUTINE_GETMENU:
|
2004-05-02 17:25:21 +00:00
|
|
|
{
|
|
|
|
PWINDOW_OBJECT WindowObject;
|
|
|
|
DWORD Result;
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2003-08-19 11:48:50 +00:00
|
|
|
WindowObject = IntGetWindowObject((HWND)Param);
|
2003-08-06 11:32:17 +00:00
|
|
|
if(!WindowObject)
|
|
|
|
{
|
2004-05-02 17:25:21 +00:00
|
|
|
SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE);
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( FALSE);
|
2003-08-06 11:32:17 +00:00
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2003-09-13 13:58:38 +00:00
|
|
|
Result = (DWORD)WindowObject->IDMenu;
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2003-08-19 11:48:50 +00:00
|
|
|
IntReleaseWindowObject(WindowObject);
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( Result);
|
2004-05-02 17:25:21 +00:00
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2003-08-06 11:32:17 +00:00
|
|
|
case ONEPARAM_ROUTINE_ISWINDOWUNICODE:
|
2004-05-02 17:25:21 +00:00
|
|
|
{
|
|
|
|
PWINDOW_OBJECT WindowObject;
|
|
|
|
DWORD Result;
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2003-08-19 11:48:50 +00:00
|
|
|
WindowObject = IntGetWindowObject((HWND)Param);
|
2003-08-06 11:32:17 +00:00
|
|
|
if(!WindowObject)
|
|
|
|
{
|
2004-05-02 17:25:21 +00:00
|
|
|
SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE);
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( FALSE);
|
2003-08-06 11:32:17 +00:00
|
|
|
}
|
|
|
|
Result = WindowObject->Unicode;
|
2003-08-19 11:48:50 +00:00
|
|
|
IntReleaseWindowObject(WindowObject);
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( Result);
|
2004-05-02 17:25:21 +00:00
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2003-08-17 09:17:04 +00:00
|
|
|
case ONEPARAM_ROUTINE_WINDOWFROMDC:
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( (DWORD)IntWindowFromDC((HDC)Param));
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2003-08-18 00:11:17 +00:00
|
|
|
case ONEPARAM_ROUTINE_GETWNDCONTEXTHLPID:
|
2004-05-02 17:25:21 +00:00
|
|
|
{
|
|
|
|
PWINDOW_OBJECT WindowObject;
|
|
|
|
DWORD Result;
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2003-08-19 11:48:50 +00:00
|
|
|
WindowObject = IntGetWindowObject((HWND)Param);
|
2003-08-18 00:11:17 +00:00
|
|
|
if(!WindowObject)
|
|
|
|
{
|
2004-05-02 17:25:21 +00:00
|
|
|
SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE);
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( FALSE);
|
2003-08-18 00:11:17 +00:00
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2003-08-18 00:11:17 +00:00
|
|
|
Result = WindowObject->ContextHelpId;
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2003-08-19 11:48:50 +00:00
|
|
|
IntReleaseWindowObject(WindowObject);
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( Result);
|
2004-05-02 17:25:21 +00:00
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2003-08-28 14:22:05 +00:00
|
|
|
case ONEPARAM_ROUTINE_SWAPMOUSEBUTTON:
|
2004-05-02 17:25:21 +00:00
|
|
|
{
|
|
|
|
PWINSTATION_OBJECT WinStaObject;
|
|
|
|
NTSTATUS Status;
|
|
|
|
DWORD Result;
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-11-20 16:46:06 +00:00
|
|
|
Status = IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation,
|
2003-11-23 11:39:48 +00:00
|
|
|
KernelMode,
|
|
|
|
0,
|
|
|
|
&WinStaObject);
|
2003-08-28 14:22:05 +00:00
|
|
|
if (!NT_SUCCESS(Status))
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( (DWORD)FALSE);
|
2003-08-28 14:22:05 +00:00
|
|
|
|
2004-12-12 01:40:39 +00:00
|
|
|
/* FIXME
|
|
|
|
Result = (DWORD)IntSwapMouseButton(WinStaObject, (BOOL)Param); */
|
|
|
|
Result = 0;
|
2003-08-28 14:22:05 +00:00
|
|
|
|
|
|
|
ObDereferenceObject(WinStaObject);
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( Result);
|
2004-05-02 17:25:21 +00:00
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2003-10-17 20:31:56 +00:00
|
|
|
case ONEPARAM_ROUTINE_SWITCHCARETSHOWING:
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( (DWORD)IntSwitchCaretShowing((PVOID)Param));
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2003-10-16 22:07:37 +00:00
|
|
|
case ONEPARAM_ROUTINE_SETCARETBLINKTIME:
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( (DWORD)IntSetCaretBlinkTime((UINT)Param));
|
2003-08-06 11:32:17 +00:00
|
|
|
|
2003-12-14 12:39:32 +00:00
|
|
|
case ONEPARAM_ROUTINE_ENUMCLIPBOARDFORMATS:
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( (DWORD)IntEnumClipboardFormats((UINT)Param));
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-04-02 22:16:09 +00:00
|
|
|
case ONEPARAM_ROUTINE_GETWINDOWINSTANCE:
|
2004-05-02 17:25:21 +00:00
|
|
|
{
|
|
|
|
PWINDOW_OBJECT WindowObject;
|
|
|
|
DWORD Result;
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-04-02 22:16:09 +00:00
|
|
|
if(!(WindowObject = IntGetWindowObject((HWND)Param)))
|
|
|
|
{
|
|
|
|
SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE);
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( FALSE);
|
2004-04-02 22:16:09 +00:00
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-04-02 22:16:09 +00:00
|
|
|
Result = (DWORD)WindowObject->Instance;
|
|
|
|
IntReleaseWindowObject(WindowObject);
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( Result);
|
2004-05-02 17:25:21 +00:00
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2003-12-19 19:30:05 +00:00
|
|
|
case ONEPARAM_ROUTINE_SETMESSAGEEXTRAINFO:
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( (DWORD)MsqSetMessageExtraInfo((LPARAM)Param));
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-05-01 09:31:59 +00:00
|
|
|
case ONEPARAM_ROUTINE_GETCURSORPOSITION:
|
|
|
|
{
|
2004-05-02 17:25:21 +00:00
|
|
|
PWINSTATION_OBJECT WinStaObject;
|
|
|
|
NTSTATUS Status;
|
2004-05-01 09:31:59 +00:00
|
|
|
POINT Pos;
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-05-01 09:31:59 +00:00
|
|
|
if(!Param)
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( (DWORD)FALSE);
|
2004-11-20 16:46:06 +00:00
|
|
|
Status = IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation,
|
2004-05-01 09:31:59 +00:00
|
|
|
KernelMode,
|
|
|
|
0,
|
|
|
|
&WinStaObject);
|
|
|
|
if (!NT_SUCCESS(Status))
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( (DWORD)FALSE);
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-05-01 09:31:59 +00:00
|
|
|
/* FIXME - check if process has WINSTA_READATTRIBUTES */
|
2005-01-27 00:49:24 +00:00
|
|
|
IntGetCursorLocation(WinStaObject, &Pos);
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-05-01 09:31:59 +00:00
|
|
|
Status = MmCopyToCaller((PPOINT)Param, &Pos, sizeof(POINT));
|
|
|
|
if(!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
ObDereferenceObject(WinStaObject);
|
|
|
|
SetLastNtError(Status);
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( FALSE);
|
2004-05-01 09:31:59 +00:00
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-05-01 09:31:59 +00:00
|
|
|
ObDereferenceObject(WinStaObject);
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( (DWORD)TRUE);
|
2004-05-01 09:31:59 +00:00
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-05-02 17:25:21 +00:00
|
|
|
case ONEPARAM_ROUTINE_ISWINDOWINDESTROY:
|
|
|
|
{
|
|
|
|
PWINDOW_OBJECT WindowObject;
|
|
|
|
DWORD Result;
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-05-02 17:25:21 +00:00
|
|
|
WindowObject = IntGetWindowObject((HWND)Param);
|
|
|
|
if(!WindowObject)
|
|
|
|
{
|
|
|
|
SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE);
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( FALSE);
|
2004-05-02 17:25:21 +00:00
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-05-02 17:25:21 +00:00
|
|
|
Result = (DWORD)IntIsWindowInDestroy(WindowObject);
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-05-02 17:25:21 +00:00
|
|
|
IntReleaseWindowObject(WindowObject);
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( Result);
|
2004-05-02 17:25:21 +00:00
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-05-21 10:09:31 +00:00
|
|
|
case ONEPARAM_ROUTINE_ENABLEPROCWNDGHSTING:
|
|
|
|
{
|
|
|
|
BOOL Enable;
|
|
|
|
PW32PROCESS Process = PsGetWin32Process();
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-05-21 10:09:31 +00:00
|
|
|
if(Process != NULL)
|
|
|
|
{
|
|
|
|
Enable = (BOOL)(Param != 0);
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-05-21 10:09:31 +00:00
|
|
|
if(Enable)
|
|
|
|
{
|
|
|
|
Process->Flags &= ~W32PF_NOWINDOWGHOSTING;
|
2005-05-08 02:11:54 +00:00
|
|
|
}
|
2004-05-21 10:09:31 +00:00
|
|
|
else
|
|
|
|
{
|
|
|
|
Process->Flags |= W32PF_NOWINDOWGHOSTING;
|
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( TRUE);
|
2004-05-21 10:09:31 +00:00
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( FALSE);
|
2004-05-21 10:09:31 +00:00
|
|
|
}
|
2004-12-25 22:59:10 +00:00
|
|
|
|
|
|
|
case ONEPARAM_ROUTINE_MSQSETWAKEMASK:
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( (DWORD)IntMsqSetWakeMask(Param));
|
2005-07-13 23:19:59 +00:00
|
|
|
|
|
|
|
case ONEPARAM_ROUTINE_GETKEYBOARDTYPE:
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( UserGetKeyboardType(Param));
|
2005-07-13 23:19:59 +00:00
|
|
|
|
|
|
|
case ONEPARAM_ROUTINE_GETKEYBOARDLAYOUT:
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( (DWORD)UserGetKeyboardLayout(Param));
|
2003-08-06 11:32:17 +00:00
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
DPRINT1("Calling invalid routine number 0x%x in NtUserCallOneParam(), Param=0x%x\n",
|
2003-08-06 11:32:17 +00:00
|
|
|
Routine, Param);
|
|
|
|
SetLastWin32Error(ERROR_INVALID_PARAMETER);
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( 0);
|
|
|
|
|
|
|
|
CLEANUP:
|
|
|
|
DPRINT("Leave NtUserCallOneParam, ret=%i\n",_ret_);
|
|
|
|
UserLeave();
|
|
|
|
END_CLEANUP;
|
2003-08-06 11:32:17 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
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;
|
2005-09-05 21:19:23 +00:00
|
|
|
DECLARE_RETURN(DWORD);
|
|
|
|
|
|
|
|
DPRINT("Enter NtUserCallTwoParam\n");
|
|
|
|
UserEnterExclusive();
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2003-05-26 18:52:37 +00:00
|
|
|
switch(Routine)
|
2003-08-06 11:32:17 +00:00
|
|
|
{
|
2004-04-25 20:05:30 +00:00
|
|
|
case TWOPARAM_ROUTINE_SETDCPENCOLOR:
|
|
|
|
{
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( (DWORD)IntSetDCColor((HDC)Param1, OBJ_PEN, (COLORREF)Param2));
|
2004-04-25 20:05:30 +00:00
|
|
|
}
|
|
|
|
case TWOPARAM_ROUTINE_SETDCBRUSHCOLOR:
|
|
|
|
{
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( (DWORD)IntSetDCColor((HDC)Param1, OBJ_BRUSH, (COLORREF)Param2));
|
2004-04-25 20:05:30 +00:00
|
|
|
}
|
|
|
|
case TWOPARAM_ROUTINE_GETDCCOLOR:
|
|
|
|
{
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( (DWORD)IntGetDCColor((HDC)Param1, (ULONG)Param2));
|
2004-04-25 20:05:30 +00:00
|
|
|
}
|
2004-03-23 21:47:37 +00:00
|
|
|
case TWOPARAM_ROUTINE_GETWINDOWRGNBOX:
|
|
|
|
{
|
|
|
|
DWORD Ret;
|
|
|
|
RECT rcRect;
|
|
|
|
Ret = (DWORD)IntGetWindowRgnBox((HWND)Param1, &rcRect);
|
|
|
|
Status = MmCopyToCaller((PVOID)Param2, &rcRect, sizeof(RECT));
|
|
|
|
if(!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
SetLastNtError(Status);
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( ERROR);
|
2004-03-23 21:47:37 +00:00
|
|
|
}
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( Ret);
|
2004-03-23 21:47:37 +00:00
|
|
|
}
|
|
|
|
case TWOPARAM_ROUTINE_GETWINDOWRGN:
|
|
|
|
{
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( (DWORD)IntGetWindowRgn((HWND)Param1, (HRGN)Param2));
|
2004-03-23 21:47:37 +00:00
|
|
|
}
|
2004-01-26 12:46:16 +00:00
|
|
|
case TWOPARAM_ROUTINE_SETMENUBARHEIGHT:
|
|
|
|
{
|
|
|
|
DWORD Ret;
|
|
|
|
PMENU_OBJECT MenuObject = IntGetMenuObject((HMENU)Param1);
|
|
|
|
if(!MenuObject)
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( 0);
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-01-26 12:46:16 +00:00
|
|
|
if(Param2 > 0)
|
2004-01-26 23:22:48 +00:00
|
|
|
{
|
2004-02-15 07:39:12 +00:00
|
|
|
Ret = (MenuObject->MenuInfo.Height == (int)Param2);
|
|
|
|
MenuObject->MenuInfo.Height = (int)Param2;
|
2004-01-26 23:22:48 +00:00
|
|
|
}
|
|
|
|
else
|
2004-02-15 07:39:12 +00:00
|
|
|
Ret = (DWORD)MenuObject->MenuInfo.Height;
|
2004-01-26 12:46:16 +00:00
|
|
|
IntReleaseMenuObject(MenuObject);
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( Ret);
|
2004-01-26 12:46:16 +00:00
|
|
|
}
|
2004-01-26 08:44:51 +00:00
|
|
|
case TWOPARAM_ROUTINE_SETMENUITEMRECT:
|
2004-01-26 10:09:04 +00:00
|
|
|
{
|
|
|
|
BOOL Ret;
|
|
|
|
SETMENUITEMRECT smir;
|
|
|
|
PMENU_OBJECT MenuObject = IntGetMenuObject((HMENU)Param1);
|
|
|
|
if(!MenuObject)
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( 0);
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-01-26 10:09:04 +00:00
|
|
|
if(!NT_SUCCESS(MmCopyFromCaller(&smir, (PVOID)Param2, sizeof(SETMENUITEMRECT))))
|
|
|
|
{
|
|
|
|
IntReleaseMenuObject(MenuObject);
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( 0);
|
2004-01-26 10:09:04 +00:00
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-01-26 10:09:04 +00:00
|
|
|
Ret = IntSetMenuItemRect(MenuObject, smir.uItem, smir.fByPosition, &smir.rcRect);
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-01-26 10:09:04 +00:00
|
|
|
IntReleaseMenuObject(MenuObject);
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( (DWORD)Ret);
|
2004-01-26 10:09:04 +00:00
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-01-26 08:44:51 +00:00
|
|
|
case TWOPARAM_ROUTINE_SETGUITHRDHANDLE:
|
|
|
|
{
|
2004-09-28 15:02:31 +00:00
|
|
|
PUSER_MESSAGE_QUEUE MsgQueue = PsGetCurrentThread()->Tcb.Win32Thread->MessageQueue;
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-04-15 23:36:03 +00:00
|
|
|
ASSERT(MsgQueue);
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( (DWORD)MsqSetStateWindow(MsgQueue, (ULONG)Param1, (HWND)Param2));
|
2004-01-26 08:44:51 +00:00
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2003-08-06 11:32:17 +00:00
|
|
|
case TWOPARAM_ROUTINE_ENABLEWINDOW:
|
|
|
|
UNIMPLEMENTED
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( 0);
|
2003-08-06 11:32:17 +00:00
|
|
|
|
|
|
|
case TWOPARAM_ROUTINE_UNKNOWN:
|
|
|
|
UNIMPLEMENTED
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( 0);
|
2003-08-06 11:32:17 +00:00
|
|
|
|
|
|
|
case TWOPARAM_ROUTINE_SHOWOWNEDPOPUPS:
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( (DWORD)IntShowOwnedPopups((HWND) Param1, (BOOL) Param2));
|
2003-08-06 11:32:17 +00:00
|
|
|
|
2005-07-18 03:12:01 +00:00
|
|
|
case TWOPARAM_ROUTINE_ROS_SHOWWINDOW:
|
|
|
|
{
|
|
|
|
#define WIN_NEEDS_SHOW_OWNEDPOPUP (0x00000040)
|
|
|
|
PWINDOW_OBJECT Window = IntGetWindowObject((HWND)Param1);
|
|
|
|
DPRINT1("ROS_SHOWWINDOW\n");
|
|
|
|
if (Window == 0)
|
|
|
|
{
|
|
|
|
SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE);
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( FALSE);
|
2005-07-18 03:12:01 +00:00
|
|
|
}
|
|
|
|
if (Param2)
|
|
|
|
{
|
|
|
|
if (!(Window->Flags & WIN_NEEDS_SHOW_OWNEDPOPUP))
|
|
|
|
{
|
|
|
|
IntReleaseWindowObject(Window);
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( TRUE);
|
2005-07-18 03:12:01 +00:00
|
|
|
}
|
|
|
|
Window->Flags &= ~WIN_NEEDS_SHOW_OWNEDPOPUP;
|
|
|
|
}
|
|
|
|
else Window->Flags |= WIN_NEEDS_SHOW_OWNEDPOPUP;
|
|
|
|
DPRINT1("ROS_SHOWWINDOW ---> 0x%x\n",Window->Flags);
|
|
|
|
IntReleaseWindowObject(Window);
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( TRUE);
|
2005-07-18 03:12:01 +00:00
|
|
|
}
|
2003-08-06 11:32:17 +00:00
|
|
|
case TWOPARAM_ROUTINE_SWITCHTOTHISWINDOW:
|
|
|
|
UNIMPLEMENTED
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( 0);
|
2003-08-06 11:32:17 +00:00
|
|
|
|
|
|
|
case TWOPARAM_ROUTINE_VALIDATERGN:
|
2005-09-07 20:59:26 +00:00
|
|
|
{
|
|
|
|
PWINDOW_OBJECT Window = UserGetWindowObject((HWND) Param1);
|
|
|
|
BOOL ret;
|
|
|
|
|
|
|
|
if (!Window) RETURN(FALSE);
|
|
|
|
|
|
|
|
UserRefObjectCo(Window);
|
|
|
|
ret = co_UserValidateRgn(Window, (HRGN) Param2);
|
|
|
|
UserDerefObjectCo(Window);
|
|
|
|
|
|
|
|
RETURN((DWORD) ret);
|
|
|
|
}
|
|
|
|
|
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);
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( (DWORD)FALSE);
|
2003-08-18 00:11:17 +00:00
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2003-08-18 00:11:17 +00:00
|
|
|
WindowObject->ContextHelpId = Param2;
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2003-08-19 11:48:50 +00:00
|
|
|
IntReleaseWindowObject(WindowObject);
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( (DWORD)TRUE);
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2003-10-16 22:07:37 +00:00
|
|
|
case TWOPARAM_ROUTINE_SETCARETPOS:
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( (DWORD)co_IntSetCaretPos((int)Param1, (int)Param2));
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-04-02 20:51:08 +00:00
|
|
|
case TWOPARAM_ROUTINE_GETWINDOWINFO:
|
|
|
|
{
|
|
|
|
WINDOWINFO wi;
|
|
|
|
DWORD Ret;
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-04-02 20:51:08 +00:00
|
|
|
if(!(WindowObject = IntGetWindowObject((HWND)Param1)))
|
|
|
|
{
|
|
|
|
SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE);
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( FALSE);
|
2004-04-02 20:51:08 +00:00
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-05-12 15:28:01 +00:00
|
|
|
#if 0
|
|
|
|
/*
|
|
|
|
* According to WINE, Windows' doesn't check the cbSize field
|
|
|
|
*/
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-04-02 20:51:08 +00:00
|
|
|
Status = MmCopyFromCaller(&wi.cbSize, (PVOID)Param2, sizeof(wi.cbSize));
|
|
|
|
if(!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
IntReleaseWindowObject(WindowObject);
|
|
|
|
SetLastNtError(Status);
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( FALSE);
|
2004-04-02 20:51:08 +00:00
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-04-02 21:03:25 +00:00
|
|
|
if(wi.cbSize != sizeof(WINDOWINFO))
|
|
|
|
{
|
|
|
|
IntReleaseWindowObject(WindowObject);
|
|
|
|
SetLastWin32Error(ERROR_INVALID_PARAMETER);
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( FALSE);
|
2004-04-02 21:03:25 +00:00
|
|
|
}
|
2004-05-12 15:28:01 +00:00
|
|
|
#endif
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-04-02 20:51:08 +00:00
|
|
|
if((Ret = (DWORD)IntGetWindowInfo(WindowObject, &wi)))
|
|
|
|
{
|
|
|
|
Status = MmCopyToCaller((PVOID)Param2, &wi, sizeof(WINDOWINFO));
|
|
|
|
if(!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
IntReleaseWindowObject(WindowObject);
|
|
|
|
SetLastNtError(Status);
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( FALSE);
|
2004-04-02 20:51:08 +00:00
|
|
|
}
|
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-04-02 20:51:08 +00:00
|
|
|
IntReleaseWindowObject(WindowObject);
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( Ret);
|
2004-04-02 20:51:08 +00:00
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-05-01 16:43:15 +00:00
|
|
|
case TWOPARAM_ROUTINE_REGISTERLOGONPROC:
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( (DWORD)co_IntRegisterLogonProcess((HANDLE)Param1, (BOOL)Param2));
|
2004-12-12 01:40:39 +00:00
|
|
|
|
|
|
|
case TWOPARAM_ROUTINE_SETSYSCOLORS:
|
|
|
|
{
|
|
|
|
DWORD Ret = 0;
|
|
|
|
PVOID Buffer;
|
|
|
|
struct
|
|
|
|
{
|
|
|
|
INT *Elements;
|
|
|
|
COLORREF *Colors;
|
|
|
|
} ChangeSysColors;
|
|
|
|
|
|
|
|
/* FIXME - we should make use of SEH here... */
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-12-12 01:40:39 +00:00
|
|
|
Status = MmCopyFromCaller(&ChangeSysColors, (PVOID)Param1, sizeof(ChangeSysColors));
|
|
|
|
if(!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
SetLastNtError(Status);
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( 0);
|
2004-12-12 01:40:39 +00:00
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-12-12 01:40:39 +00:00
|
|
|
Buffer = ExAllocatePool(PagedPool, (Param2 * sizeof(INT)) + (Param2 * sizeof(COLORREF)));
|
|
|
|
if(Buffer != NULL)
|
|
|
|
{
|
|
|
|
INT *Elements = (INT*)Buffer;
|
|
|
|
COLORREF *Colors = (COLORREF*)Buffer + Param2;
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-12-12 01:40:39 +00:00
|
|
|
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);
|
|
|
|
}
|
2005-07-18 03:12:01 +00:00
|
|
|
|
|
|
|
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( Ret);
|
2004-12-12 01:40:39 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
case TWOPARAM_ROUTINE_GETSYSCOLORBRUSHES:
|
|
|
|
case TWOPARAM_ROUTINE_GETSYSCOLORPENS:
|
|
|
|
case TWOPARAM_ROUTINE_GETSYSCOLORS:
|
|
|
|
{
|
2004-12-12 23:08:13 +00:00
|
|
|
DWORD Ret = 0;
|
2004-12-12 01:40:39 +00:00
|
|
|
union
|
|
|
|
{
|
|
|
|
PVOID Pointer;
|
|
|
|
HBRUSH *Brushes;
|
|
|
|
HPEN *Pens;
|
|
|
|
COLORREF *Colors;
|
|
|
|
} Buffer;
|
|
|
|
|
|
|
|
/* FIXME - we should make use of SEH here... */
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-12-12 01:40:39 +00:00
|
|
|
Buffer.Pointer = ExAllocatePool(PagedPool, Param2 * sizeof(HANDLE));
|
|
|
|
if(Buffer.Pointer != NULL)
|
|
|
|
{
|
|
|
|
switch(Routine)
|
|
|
|
{
|
|
|
|
case TWOPARAM_ROUTINE_GETSYSCOLORBRUSHES:
|
|
|
|
Ret = (DWORD)IntGetSysColorBrushes(Buffer.Brushes, (UINT)Param2);
|
|
|
|
break;
|
|
|
|
case TWOPARAM_ROUTINE_GETSYSCOLORPENS:
|
|
|
|
Ret = (DWORD)IntGetSysColorPens(Buffer.Pens, (UINT)Param2);
|
|
|
|
break;
|
|
|
|
case TWOPARAM_ROUTINE_GETSYSCOLORS:
|
|
|
|
Ret = (DWORD)IntGetSysColors(Buffer.Colors, (UINT)Param2);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
Ret = 0;
|
|
|
|
break;
|
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-12-12 01:40:39 +00:00
|
|
|
if(Ret > 0)
|
|
|
|
{
|
|
|
|
Status = MmCopyToCaller((PVOID)Param1, Buffer.Pointer, Param2 * sizeof(HANDLE));
|
|
|
|
if(!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
SetLastNtError(Status);
|
|
|
|
Ret = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
ExFreePool(Buffer.Pointer);
|
|
|
|
}
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( Ret);
|
2004-12-12 01:40:39 +00:00
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2003-08-06 11:32:17 +00:00
|
|
|
}
|
2004-05-01 16:43:15 +00:00
|
|
|
DPRINT1("Calling invalid routine number 0x%x in NtUserCallTwoParam(), Param1=0x%x Parm2=0x%x\n",
|
2003-08-06 11:32:17 +00:00
|
|
|
Routine, Param1, Param2);
|
|
|
|
SetLastWin32Error(ERROR_INVALID_PARAMETER);
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( 0);
|
|
|
|
|
|
|
|
CLEANUP:
|
|
|
|
DPRINT("Leave NtUserCallTwoParam, ret=%i\n",_ret_);
|
|
|
|
UserLeave();
|
|
|
|
END_CLEANUP;
|
2003-05-26 18:52:37 +00:00
|
|
|
}
|
2003-08-28 18:04:59 +00:00
|
|
|
|
2005-07-18 03:12:01 +00:00
|
|
|
|
2003-11-30 20:03:47 +00:00
|
|
|
/*
|
|
|
|
* @unimplemented
|
|
|
|
*/
|
|
|
|
BOOL
|
|
|
|
STDCALL
|
|
|
|
NtUserCallHwndLock(
|
|
|
|
HWND hWnd,
|
|
|
|
DWORD Routine)
|
|
|
|
{
|
|
|
|
BOOL Ret = 0;
|
|
|
|
PWINDOW_OBJECT Window;
|
2005-09-05 21:19:23 +00:00
|
|
|
DECLARE_RETURN(BOOLEAN);
|
|
|
|
|
|
|
|
DPRINT("Enter NtUserCallHwndLock\n");
|
|
|
|
UserEnterExclusive();
|
2003-11-30 20:03:47 +00:00
|
|
|
|
|
|
|
Window = IntGetWindowObject(hWnd);
|
|
|
|
if (Window == 0)
|
|
|
|
{
|
|
|
|
SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE);
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( FALSE);
|
2003-11-30 20:03:47 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* FIXME: Routine can be 0x53 - 0x5E */
|
|
|
|
switch (Routine)
|
|
|
|
{
|
|
|
|
case HWNDLOCK_ROUTINE_ARRANGEICONICWINDOWS:
|
2005-09-05 21:19:23 +00:00
|
|
|
co_WinPosArrangeIconicWindows(Window);
|
2003-11-30 20:03:47 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case HWNDLOCK_ROUTINE_DRAWMENUBAR:
|
2005-07-09 04:11:36 +00:00
|
|
|
{
|
|
|
|
PMENU_OBJECT MenuObject;
|
2005-07-09 04:54:01 +00:00
|
|
|
DPRINT("HWNDLOCK_ROUTINE_DRAWMENUBAR\n");
|
2005-07-09 04:11:36 +00:00
|
|
|
Ret = FALSE;
|
|
|
|
if (!((Window->Style & (WS_CHILD | WS_POPUP)) != WS_CHILD)) break;
|
|
|
|
MenuObject = IntGetMenuObject((HMENU) Window->IDMenu);
|
|
|
|
if(MenuObject == NULL) break;
|
|
|
|
MenuObject->MenuInfo.WndOwner = hWnd;
|
|
|
|
MenuObject->MenuInfo.Height = 0;
|
|
|
|
IntReleaseMenuObject(MenuObject);
|
2005-09-07 20:59:26 +00:00
|
|
|
co_WinPosSetWindowPos(Window, 0, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE |
|
2005-07-09 04:11:36 +00:00
|
|
|
SWP_NOACTIVATE | SWP_NOZORDER | SWP_FRAMECHANGED );
|
|
|
|
Ret = TRUE;
|
|
|
|
break;
|
|
|
|
}
|
2003-11-30 20:03:47 +00:00
|
|
|
|
|
|
|
case HWNDLOCK_ROUTINE_REDRAWFRAME:
|
|
|
|
/* FIXME */
|
|
|
|
break;
|
|
|
|
|
2004-07-08 14:36:18 +00:00
|
|
|
case HWNDLOCK_ROUTINE_SETFOREGROUNDWINDOW:
|
2005-09-05 21:19:23 +00:00
|
|
|
Ret = co_IntSetForegroundWindow(Window);
|
2003-11-30 20:03:47 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case HWNDLOCK_ROUTINE_UPDATEWINDOW:
|
|
|
|
/* FIXME */
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
IntReleaseWindowObject(Window);
|
|
|
|
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( Ret);
|
|
|
|
|
|
|
|
CLEANUP:
|
|
|
|
DPRINT("Leave NtUserCallHwndLock, ret=%i\n",_ret_);
|
|
|
|
UserLeave();
|
|
|
|
END_CLEANUP;
|
2003-11-30 20:03:47 +00:00
|
|
|
}
|
|
|
|
|
2005-07-31 06:22:05 +00:00
|
|
|
/*
|
|
|
|
* @unimplemented
|
|
|
|
*/
|
2003-11-22 11:01:28 +00:00
|
|
|
HWND
|
|
|
|
STDCALL
|
|
|
|
NtUserCallHwndOpt(
|
|
|
|
HWND Param,
|
|
|
|
DWORD Routine)
|
|
|
|
{
|
|
|
|
switch (Routine)
|
|
|
|
{
|
|
|
|
case HWNDOPT_ROUTINE_SETPROGMANWINDOW:
|
2005-07-31 06:22:05 +00:00
|
|
|
/*
|
|
|
|
* FIXME
|
|
|
|
* Nothing too hard...validate the hWnd and save it in the Desktop Info
|
|
|
|
*/
|
|
|
|
DPRINT1("HWNDOPT_ROUTINE_SETPROGMANWINDOW UNIMPLEMENTED\n");
|
2003-11-22 11:01:28 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case HWNDOPT_ROUTINE_SETTASKMANWINDOW:
|
2005-07-31 06:22:05 +00:00
|
|
|
/*
|
|
|
|
* FIXME
|
|
|
|
* Nothing too hard...validate the hWnd and save it in the Desktop Info
|
|
|
|
*/
|
|
|
|
DPRINT1("HWNDOPT_ROUTINE_SETTASKMANWINDOW UNIMPLEMENTED\n");
|
2003-11-22 11:01:28 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2005-07-31 06:22:05 +00:00
|
|
|
return Param;
|
2003-11-22 11:01:28 +00:00
|
|
|
}
|
2003-08-28 18:04:59 +00:00
|
|
|
|
2003-11-30 20:03:47 +00:00
|
|
|
/*
|
|
|
|
* @unimplemented
|
|
|
|
*/
|
|
|
|
DWORD STDCALL
|
|
|
|
NtUserGetThreadState(
|
|
|
|
DWORD Routine)
|
|
|
|
{
|
2005-09-05 21:19:23 +00:00
|
|
|
DECLARE_RETURN(DWORD);
|
|
|
|
|
|
|
|
DPRINT("Enter NtUserGetThreadState\n");
|
|
|
|
UserEnterShared();
|
|
|
|
|
2003-11-30 20:03:47 +00:00
|
|
|
switch (Routine)
|
|
|
|
{
|
|
|
|
case 0:
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( (DWORD)IntGetThreadFocusWindow());
|
2003-11-30 20:03:47 +00:00
|
|
|
}
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( 0);
|
|
|
|
|
|
|
|
CLEANUP:
|
|
|
|
DPRINT("Leave NtUserGetThreadState, ret=%i\n",_ret_);
|
|
|
|
UserLeave();
|
|
|
|
END_CLEANUP;
|
2003-11-30 20:03:47 +00:00
|
|
|
}
|
|
|
|
|
2004-03-07 11:59:43 +00:00
|
|
|
VOID FASTCALL
|
2005-05-08 02:11:54 +00:00
|
|
|
IntGetFontMetricSetting(LPWSTR lpValueName, PLOGFONTW font)
|
|
|
|
{
|
2004-03-07 11:59:43 +00:00
|
|
|
RTL_QUERY_REGISTRY_TABLE QueryTable[2];
|
|
|
|
NTSTATUS Status;
|
|
|
|
static LOGFONTW DefaultFont = {
|
|
|
|
11, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET,
|
|
|
|
0, 0, DEFAULT_QUALITY, VARIABLE_PITCH | FF_SWISS,
|
|
|
|
L"Bitstream Vera Sans"
|
|
|
|
};
|
|
|
|
|
|
|
|
RtlZeroMemory(&QueryTable, sizeof(QueryTable));
|
|
|
|
|
|
|
|
QueryTable[0].Name = lpValueName;
|
|
|
|
QueryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_QUERY_REGISTRY_REQUIRED;
|
|
|
|
QueryTable[0].EntryContext = font;
|
|
|
|
|
|
|
|
Status = RtlQueryRegistryValues(
|
|
|
|
RTL_REGISTRY_USER,
|
|
|
|
L"Control Panel\\Desktop\\WindowMetrics",
|
|
|
|
QueryTable,
|
|
|
|
NULL,
|
|
|
|
NULL);
|
|
|
|
|
|
|
|
if (!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
RtlCopyMemory(font, &DefaultFont, sizeof(LOGFONTW));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2004-05-01 11:38:28 +00:00
|
|
|
ULONG FASTCALL
|
|
|
|
IntSystemParametersInfo(
|
2003-08-28 18:04:59 +00:00
|
|
|
UINT uiAction,
|
|
|
|
UINT uiParam,
|
|
|
|
PVOID pvParam,
|
|
|
|
UINT fWinIni)
|
|
|
|
{
|
|
|
|
PWINSTATION_OBJECT WinStaObject;
|
2004-05-01 11:38:28 +00:00
|
|
|
NTSTATUS Status;
|
2004-03-07 11:59:43 +00:00
|
|
|
|
|
|
|
static BOOL bInitialized = FALSE;
|
|
|
|
static LOGFONTW IconFont;
|
|
|
|
static NONCLIENTMETRICSW pMetrics;
|
2004-05-01 11:38:28 +00:00
|
|
|
static BOOL GradientCaptions = TRUE;
|
|
|
|
static UINT FocusBorderHeight = 1;
|
|
|
|
static UINT FocusBorderWidth = 1;
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-03-07 11:59:43 +00:00
|
|
|
if (!bInitialized)
|
|
|
|
{
|
2005-07-20 07:27:09 +00:00
|
|
|
RtlZeroMemory(&IconFont, sizeof(LOGFONTW));
|
|
|
|
RtlZeroMemory(&pMetrics, sizeof(NONCLIENTMETRICSW));
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-03-07 11:59:43 +00:00
|
|
|
IntGetFontMetricSetting(L"CaptionFont", &pMetrics.lfCaptionFont);
|
|
|
|
IntGetFontMetricSetting(L"SmCaptionFont", &pMetrics.lfSmCaptionFont);
|
|
|
|
IntGetFontMetricSetting(L"MenuFont", &pMetrics.lfMenuFont);
|
|
|
|
IntGetFontMetricSetting(L"StatusFont", &pMetrics.lfStatusFont);
|
|
|
|
IntGetFontMetricSetting(L"MessageFont", &pMetrics.lfMessageFont);
|
|
|
|
IntGetFontMetricSetting(L"IconFont", &IconFont);
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-03-07 11:59:43 +00:00
|
|
|
pMetrics.iBorderWidth = 1;
|
2005-09-05 21:19:23 +00:00
|
|
|
pMetrics.iScrollWidth = UserGetSystemMetrics(SM_CXVSCROLL);
|
|
|
|
pMetrics.iScrollHeight = UserGetSystemMetrics(SM_CYHSCROLL);
|
|
|
|
pMetrics.iCaptionWidth = UserGetSystemMetrics(SM_CXSIZE);
|
|
|
|
pMetrics.iCaptionHeight = UserGetSystemMetrics(SM_CYSIZE);
|
|
|
|
pMetrics.iSmCaptionWidth = UserGetSystemMetrics(SM_CXSMSIZE);
|
|
|
|
pMetrics.iSmCaptionHeight = UserGetSystemMetrics(SM_CYSMSIZE);
|
|
|
|
pMetrics.iMenuWidth = UserGetSystemMetrics(SM_CXMENUSIZE);
|
|
|
|
pMetrics.iMenuHeight = UserGetSystemMetrics(SM_CYMENUSIZE);
|
2004-10-19 08:25:25 +00:00
|
|
|
pMetrics.cbSize = sizeof(NONCLIENTMETRICSW);
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-03-07 11:59:43 +00:00
|
|
|
bInitialized = TRUE;
|
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2003-08-28 18:04:59 +00:00
|
|
|
switch(uiAction)
|
|
|
|
{
|
|
|
|
case SPI_SETDOUBLECLKWIDTH:
|
|
|
|
case SPI_SETDOUBLECLKHEIGHT:
|
|
|
|
case SPI_SETDOUBLECLICKTIME:
|
2004-08-17 21:47:36 +00:00
|
|
|
case SPI_SETDESKWALLPAPER:
|
|
|
|
case SPI_GETDESKWALLPAPER:
|
2004-05-01 11:38:28 +00:00
|
|
|
{
|
2004-05-14 23:57:32 +00:00
|
|
|
PSYSTEM_CURSORINFO CurInfo;
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-11-20 16:46:06 +00:00
|
|
|
Status = IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation,
|
2004-05-01 11:38:28 +00:00
|
|
|
KernelMode,
|
|
|
|
0,
|
|
|
|
&WinStaObject);
|
|
|
|
if(!NT_SUCCESS(Status))
|
2003-08-28 18:04:59 +00:00
|
|
|
{
|
2004-05-01 11:38:28 +00:00
|
|
|
SetLastNtError(Status);
|
|
|
|
return (DWORD)FALSE;
|
2003-11-10 17:44:50 +00:00
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-05-01 11:38:28 +00:00
|
|
|
switch(uiAction)
|
|
|
|
{
|
|
|
|
case SPI_SETDOUBLECLKWIDTH:
|
2004-08-17 21:47:36 +00:00
|
|
|
CurInfo = IntGetSysCursorInfo(WinStaObject);
|
2004-05-01 11:38:28 +00:00
|
|
|
/* FIXME limit the maximum value? */
|
2004-05-14 23:57:32 +00:00
|
|
|
CurInfo->DblClickWidth = uiParam;
|
2004-05-01 11:38:28 +00:00
|
|
|
break;
|
|
|
|
case SPI_SETDOUBLECLKHEIGHT:
|
2004-08-17 21:47:36 +00:00
|
|
|
CurInfo = IntGetSysCursorInfo(WinStaObject);
|
2004-05-01 11:38:28 +00:00
|
|
|
/* FIXME limit the maximum value? */
|
2004-05-14 23:57:32 +00:00
|
|
|
CurInfo->DblClickHeight = uiParam;
|
2004-05-01 11:38:28 +00:00
|
|
|
break;
|
|
|
|
case SPI_SETDOUBLECLICKTIME:
|
2004-08-17 21:47:36 +00:00
|
|
|
CurInfo = IntGetSysCursorInfo(WinStaObject);
|
2004-05-01 11:38:28 +00:00
|
|
|
/* FIXME limit the maximum time to 1000 ms? */
|
2004-05-14 23:57:32 +00:00
|
|
|
CurInfo->DblClickSpeed = uiParam;
|
2004-05-01 11:38:28 +00:00
|
|
|
break;
|
2004-08-17 21:47:36 +00:00
|
|
|
case SPI_SETDESKWALLPAPER:
|
|
|
|
{
|
|
|
|
/* This function expects different parameters than the user mode version!
|
|
|
|
|
|
|
|
We let the user mode code load the bitmap, it passed the handle to
|
|
|
|
the bitmap. We'll change it's ownership to system and replace it with
|
|
|
|
the current wallpaper bitmap */
|
|
|
|
HBITMAP hOldBitmap, hNewBitmap;
|
|
|
|
ASSERT(pvParam);
|
|
|
|
|
|
|
|
hNewBitmap = *(HBITMAP*)pvParam;
|
|
|
|
if(hNewBitmap != NULL)
|
|
|
|
{
|
|
|
|
BITMAPOBJ *bmp;
|
|
|
|
/* try to get the size of the wallpaper */
|
|
|
|
if(!(bmp = BITMAPOBJ_LockBitmap(hNewBitmap)))
|
|
|
|
{
|
|
|
|
ObDereferenceObject(WinStaObject);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
WinStaObject->cxWallpaper = bmp->SurfObj.sizlBitmap.cx;
|
|
|
|
WinStaObject->cyWallpaper = bmp->SurfObj.sizlBitmap.cy;
|
|
|
|
|
2005-06-07 16:34:07 +00:00
|
|
|
BITMAPOBJ_UnlockBitmap(bmp);
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-08-17 21:47:36 +00:00
|
|
|
/* change the bitmap's ownership */
|
|
|
|
GDIOBJ_SetOwnership(hNewBitmap, NULL);
|
|
|
|
}
|
|
|
|
hOldBitmap = (HBITMAP)InterlockedExchange((LONG*)&WinStaObject->hbmWallpaper, (LONG)hNewBitmap);
|
|
|
|
if(hOldBitmap != NULL)
|
|
|
|
{
|
|
|
|
/* delete the old wallpaper */
|
|
|
|
NtGdiDeleteObject(hOldBitmap);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case SPI_GETDESKWALLPAPER:
|
|
|
|
/* This function expects different parameters than the user mode version!
|
|
|
|
|
|
|
|
We basically return the current wallpaper handle - if any. The user
|
|
|
|
mode version should load the string from the registry and return it
|
|
|
|
without calling this function */
|
|
|
|
ASSERT(pvParam);
|
|
|
|
*(HBITMAP*)pvParam = (HBITMAP)WinStaObject->hbmWallpaper;
|
|
|
|
break;
|
2004-05-01 11:38:28 +00:00
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-05-01 11:38:28 +00:00
|
|
|
/* FIXME save the value to the registry */
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-05-01 11:38:28 +00:00
|
|
|
ObDereferenceObject(WinStaObject);
|
|
|
|
return TRUE;
|
|
|
|
}
|
2003-11-10 17:44:50 +00:00
|
|
|
case SPI_SETWORKAREA:
|
2004-05-01 11:38:28 +00:00
|
|
|
{
|
|
|
|
RECT *rc;
|
|
|
|
PDESKTOP_OBJECT Desktop = PsGetWin32Thread()->Desktop;
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-05-01 11:38:28 +00:00
|
|
|
if(!Desktop)
|
2003-11-10 17:44:50 +00:00
|
|
|
{
|
2004-05-01 11:38:28 +00:00
|
|
|
/* FIXME - Set last error */
|
|
|
|
return FALSE;
|
2003-08-28 18:04:59 +00:00
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-05-01 11:38:28 +00:00
|
|
|
ASSERT(pvParam);
|
|
|
|
rc = (RECT*)pvParam;
|
|
|
|
Desktop->WorkArea = *rc;
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-05-01 11:38:28 +00:00
|
|
|
return TRUE;
|
|
|
|
}
|
2003-08-29 09:29:11 +00:00
|
|
|
case SPI_GETWORKAREA:
|
2004-05-01 11:38:28 +00:00
|
|
|
{
|
|
|
|
PDESKTOP_OBJECT Desktop = PsGetWin32Thread()->Desktop;
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-05-01 11:38:28 +00:00
|
|
|
if(!Desktop)
|
2003-08-29 09:29:11 +00:00
|
|
|
{
|
2004-05-01 11:38:28 +00:00
|
|
|
/* FIXME - Set last error */
|
|
|
|
return FALSE;
|
2003-08-29 09:29:11 +00:00
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-05-01 11:38:28 +00:00
|
|
|
ASSERT(pvParam);
|
2004-05-08 12:42:46 +00:00
|
|
|
IntGetDesktopWorkArea(Desktop, (PRECT)pvParam);
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-05-01 11:38:28 +00:00
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
case SPI_SETGRADIENTCAPTIONS:
|
|
|
|
{
|
|
|
|
GradientCaptions = (pvParam != NULL);
|
|
|
|
/* FIXME - should be checked if the color depth is higher than 8bpp? */
|
|
|
|
return TRUE;
|
|
|
|
}
|
2003-12-24 01:26:10 +00:00
|
|
|
case SPI_GETGRADIENTCAPTIONS:
|
2004-05-01 11:38:28 +00:00
|
|
|
{
|
|
|
|
HDC hDC;
|
|
|
|
BOOL Ret = GradientCaptions;
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-05-01 11:38:28 +00:00
|
|
|
hDC = IntGetScreenDC();
|
|
|
|
if(hDC)
|
2003-12-24 01:26:10 +00:00
|
|
|
{
|
2004-07-03 13:55:37 +00:00
|
|
|
Ret = (NtGdiGetDeviceCaps(hDC, BITSPIXEL) > 8) && Ret;
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-05-01 11:38:28 +00:00
|
|
|
ASSERT(pvParam);
|
|
|
|
*((PBOOL)pvParam) = Ret;
|
2003-12-24 01:26:10 +00:00
|
|
|
return TRUE;
|
|
|
|
}
|
2004-05-01 11:38:28 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
case SPI_SETFONTSMOOTHING:
|
|
|
|
{
|
|
|
|
IntEnableFontRendering(uiParam != 0);
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
case SPI_GETFONTSMOOTHING:
|
|
|
|
{
|
|
|
|
ASSERT(pvParam);
|
|
|
|
*((BOOL*)pvParam) = IntIsFontRenderingEnabled();
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
case SPI_GETICONTITLELOGFONT:
|
|
|
|
{
|
|
|
|
ASSERT(pvParam);
|
|
|
|
*((LOGFONTW*)pvParam) = IconFont;
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
case SPI_GETNONCLIENTMETRICS:
|
|
|
|
{
|
|
|
|
ASSERT(pvParam);
|
|
|
|
*((NONCLIENTMETRICSW*)pvParam) = pMetrics;
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
case SPI_GETFOCUSBORDERHEIGHT:
|
|
|
|
{
|
|
|
|
ASSERT(pvParam);
|
|
|
|
*((UINT*)pvParam) = FocusBorderHeight;
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
case SPI_GETFOCUSBORDERWIDTH:
|
|
|
|
{
|
|
|
|
ASSERT(pvParam);
|
|
|
|
*((UINT*)pvParam) = FocusBorderWidth;
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
case SPI_SETFOCUSBORDERHEIGHT:
|
|
|
|
{
|
|
|
|
FocusBorderHeight = (UINT)pvParam;
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
case SPI_SETFOCUSBORDERWIDTH:
|
|
|
|
{
|
|
|
|
FocusBorderWidth = (UINT)pvParam;
|
|
|
|
return TRUE;
|
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-05-01 11:38:28 +00:00
|
|
|
default:
|
|
|
|
{
|
|
|
|
DPRINT1("SystemParametersInfo: Unsupported Action 0x%x (uiParam: 0x%x, pvParam: 0x%x, fWinIni: 0x%x)\n",
|
|
|
|
uiAction, uiParam, pvParam, fWinIni);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
2005-09-05 21:19:23 +00:00
|
|
|
BOOL FASTCALL
|
|
|
|
UserSystemParametersInfo(
|
2004-05-01 11:38:28 +00:00
|
|
|
UINT uiAction,
|
|
|
|
UINT uiParam,
|
|
|
|
PVOID pvParam,
|
|
|
|
UINT fWinIni)
|
|
|
|
{
|
|
|
|
NTSTATUS Status;
|
|
|
|
|
|
|
|
switch(uiAction)
|
|
|
|
{
|
|
|
|
case SPI_SETDOUBLECLKWIDTH:
|
|
|
|
case SPI_SETDOUBLECLKHEIGHT:
|
|
|
|
case SPI_SETDOUBLECLICKTIME:
|
2003-12-24 01:26:10 +00:00
|
|
|
case SPI_SETGRADIENTCAPTIONS:
|
2004-05-01 11:38:28 +00:00
|
|
|
case SPI_SETFONTSMOOTHING:
|
|
|
|
case SPI_SETFOCUSBORDERHEIGHT:
|
|
|
|
case SPI_SETFOCUSBORDERWIDTH:
|
|
|
|
{
|
|
|
|
return (DWORD)IntSystemParametersInfo(uiAction, uiParam, pvParam, fWinIni);
|
|
|
|
}
|
|
|
|
case SPI_SETWORKAREA:
|
|
|
|
{
|
|
|
|
RECT rc;
|
|
|
|
Status = MmCopyFromCaller(&rc, (PRECT)pvParam, sizeof(RECT));
|
|
|
|
if(!NT_SUCCESS(Status))
|
2003-12-24 01:26:10 +00:00
|
|
|
{
|
2004-05-01 11:38:28 +00:00
|
|
|
SetLastNtError(Status);
|
2005-09-05 21:19:23 +00:00
|
|
|
return( FALSE);
|
2003-12-24 01:26:10 +00:00
|
|
|
}
|
2005-09-05 21:19:23 +00:00
|
|
|
return( (DWORD)IntSystemParametersInfo(uiAction, uiParam, &rc, fWinIni));
|
2004-05-01 11:38:28 +00:00
|
|
|
}
|
|
|
|
case SPI_GETWORKAREA:
|
|
|
|
{
|
|
|
|
RECT rc;
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-05-01 11:38:28 +00:00
|
|
|
if(!IntSystemParametersInfo(uiAction, uiParam, &rc, fWinIni))
|
2003-12-26 00:31:22 +00:00
|
|
|
{
|
2005-09-05 21:19:23 +00:00
|
|
|
return( FALSE);
|
2004-05-01 11:38:28 +00:00
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-05-01 11:38:28 +00:00
|
|
|
Status = MmCopyToCaller((PRECT)pvParam, &rc, sizeof(RECT));
|
|
|
|
if(!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
SetLastNtError(Status);
|
2005-09-05 21:19:23 +00:00
|
|
|
return( FALSE);
|
2003-12-26 00:31:22 +00:00
|
|
|
}
|
2005-09-05 21:19:23 +00:00
|
|
|
return( TRUE);
|
2004-05-01 11:38:28 +00:00
|
|
|
}
|
2003-12-26 00:31:22 +00:00
|
|
|
case SPI_GETFONTSMOOTHING:
|
2004-05-01 11:38:28 +00:00
|
|
|
case SPI_GETGRADIENTCAPTIONS:
|
|
|
|
case SPI_GETFOCUSBORDERHEIGHT:
|
|
|
|
case SPI_GETFOCUSBORDERWIDTH:
|
|
|
|
{
|
|
|
|
BOOL Ret;
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-05-01 11:38:28 +00:00
|
|
|
if(!IntSystemParametersInfo(uiAction, uiParam, &Ret, fWinIni))
|
2003-12-26 00:31:22 +00:00
|
|
|
{
|
2005-09-05 21:19:23 +00:00
|
|
|
return( FALSE);
|
2003-12-26 00:31:22 +00:00
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-05-01 11:38:28 +00:00
|
|
|
Status = MmCopyToCaller(pvParam, &Ret, sizeof(BOOL));
|
|
|
|
if(!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
SetLastNtError(Status);
|
2005-09-05 21:19:23 +00:00
|
|
|
return( FALSE);
|
2004-05-01 11:38:28 +00:00
|
|
|
}
|
2005-09-05 21:19:23 +00:00
|
|
|
return( TRUE);
|
2004-05-01 11:38:28 +00:00
|
|
|
}
|
2004-08-17 21:47:36 +00:00
|
|
|
case SPI_SETDESKWALLPAPER:
|
|
|
|
{
|
|
|
|
/* !!! As opposed to the user mode version this version accepts a handle
|
|
|
|
to the bitmap! */
|
|
|
|
HBITMAP hbmWallpaper;
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-08-17 21:47:36 +00:00
|
|
|
Status = MmCopyFromCaller(&hbmWallpaper, pvParam, sizeof(HBITMAP));
|
|
|
|
if(!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
SetLastNtError(Status);
|
2005-09-05 21:19:23 +00:00
|
|
|
return( FALSE);
|
2004-08-17 21:47:36 +00:00
|
|
|
}
|
2005-09-05 21:19:23 +00:00
|
|
|
return( IntSystemParametersInfo(SPI_SETDESKWALLPAPER, 0, &hbmWallpaper, fWinIni));
|
2004-08-17 21:47:36 +00:00
|
|
|
}
|
|
|
|
case SPI_GETDESKWALLPAPER:
|
|
|
|
{
|
|
|
|
/* !!! As opposed to the user mode version this version returns a handle
|
|
|
|
to the bitmap! */
|
|
|
|
HBITMAP hbmWallpaper;
|
|
|
|
BOOL Ret;
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-08-17 21:47:36 +00:00
|
|
|
Ret = IntSystemParametersInfo(SPI_GETDESKWALLPAPER, 0, &hbmWallpaper, fWinIni);
|
|
|
|
|
|
|
|
Status = MmCopyToCaller(pvParam, &hbmWallpaper, sizeof(HBITMAP));
|
|
|
|
if(!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
SetLastNtError(Status);
|
2005-09-05 21:19:23 +00:00
|
|
|
return( FALSE);
|
2004-08-17 21:47:36 +00:00
|
|
|
}
|
2005-09-05 21:19:23 +00:00
|
|
|
return( Ret);
|
2004-08-17 21:47:36 +00:00
|
|
|
}
|
2004-03-07 11:59:43 +00:00
|
|
|
case SPI_GETICONTITLELOGFONT:
|
|
|
|
{
|
2004-05-01 11:38:28 +00:00
|
|
|
LOGFONTW IconFont;
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-05-01 11:38:28 +00:00
|
|
|
if(!IntSystemParametersInfo(uiAction, uiParam, &IconFont, fWinIni))
|
|
|
|
{
|
2005-09-05 21:19:23 +00:00
|
|
|
return( FALSE);
|
2004-05-01 11:38:28 +00:00
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-05-01 11:38:28 +00:00
|
|
|
Status = MmCopyToCaller(pvParam, &IconFont, sizeof(LOGFONTW));
|
|
|
|
if(!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
SetLastNtError(Status);
|
2005-09-05 21:19:23 +00:00
|
|
|
return( FALSE);
|
2004-05-01 11:38:28 +00:00
|
|
|
}
|
2005-09-05 21:19:23 +00:00
|
|
|
return( TRUE);
|
2004-05-01 11:38:28 +00:00
|
|
|
}
|
2004-03-07 11:59:43 +00:00
|
|
|
case SPI_GETNONCLIENTMETRICS:
|
|
|
|
{
|
2004-05-01 11:38:28 +00:00
|
|
|
NONCLIENTMETRICSW metrics;
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-05-01 11:38:28 +00:00
|
|
|
Status = MmCopyFromCaller(&metrics.cbSize, pvParam, sizeof(UINT));
|
|
|
|
if(!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
SetLastNtError(Status);
|
2005-09-05 21:19:23 +00:00
|
|
|
return( FALSE);
|
2004-05-01 11:38:28 +00:00
|
|
|
}
|
2004-10-19 08:25:25 +00:00
|
|
|
if(metrics.cbSize != sizeof(NONCLIENTMETRICSW))
|
2004-05-01 11:38:28 +00:00
|
|
|
{
|
|
|
|
SetLastWin32Error(ERROR_INVALID_PARAMETER);
|
2005-09-05 21:19:23 +00:00
|
|
|
return( FALSE);
|
2004-05-01 11:38:28 +00:00
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-05-01 11:38:28 +00:00
|
|
|
if(!IntSystemParametersInfo(uiAction, uiParam, &metrics, fWinIni))
|
|
|
|
{
|
2005-09-05 21:19:23 +00:00
|
|
|
return( FALSE);
|
2004-05-01 11:38:28 +00:00
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-05-01 11:38:28 +00:00
|
|
|
Status = MmCopyToCaller(pvParam, &metrics.cbSize, sizeof(NONCLIENTMETRICSW));
|
|
|
|
if(!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
SetLastNtError(Status);
|
2005-09-05 21:19:23 +00:00
|
|
|
return( FALSE);
|
2004-05-01 11:38:28 +00:00
|
|
|
}
|
2005-09-05 21:19:23 +00:00
|
|
|
return( TRUE);
|
2004-03-07 11:59:43 +00:00
|
|
|
}
|
2003-08-28 18:04:59 +00:00
|
|
|
}
|
2005-09-05 21:19:23 +00:00
|
|
|
return( FALSE);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
|
|
|
BOOL
|
|
|
|
STDCALL
|
|
|
|
NtUserSystemParametersInfo(
|
|
|
|
UINT uiAction,
|
|
|
|
UINT uiParam,
|
|
|
|
PVOID pvParam,
|
|
|
|
UINT fWinIni)
|
|
|
|
{
|
|
|
|
DECLARE_RETURN(BOOLEAN);
|
|
|
|
|
|
|
|
DPRINT("Enter NtUserSystemParametersInfo\n");
|
|
|
|
UserEnterExclusive();
|
|
|
|
|
|
|
|
RETURN( UserSystemParametersInfo(uiAction, uiParam, pvParam, fWinIni));
|
|
|
|
|
|
|
|
CLEANUP:
|
|
|
|
DPRINT("Leave NtUserSystemParametersInfo, ret=%i\n",_ret_);
|
|
|
|
UserLeave();
|
|
|
|
END_CLEANUP;
|
2003-08-28 18:04:59 +00:00
|
|
|
}
|
2003-09-12 12:54:26 +00:00
|
|
|
|
2005-09-05 21:19:23 +00:00
|
|
|
|
|
|
|
|
2003-09-12 12:54:26 +00:00
|
|
|
UINT
|
|
|
|
STDCALL
|
|
|
|
NtUserGetDoubleClickTime(VOID)
|
|
|
|
{
|
|
|
|
UINT Result;
|
|
|
|
NTSTATUS Status;
|
|
|
|
PWINSTATION_OBJECT WinStaObject;
|
2004-05-14 23:57:32 +00:00
|
|
|
PSYSTEM_CURSORINFO CurInfo;
|
2005-09-05 21:19:23 +00:00
|
|
|
DECLARE_RETURN(UINT);
|
|
|
|
|
|
|
|
DPRINT("Enter NtUserGetDoubleClickTime\n");
|
|
|
|
UserEnterShared();
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-11-20 16:46:06 +00:00
|
|
|
Status = IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation,
|
2003-11-23 11:39:48 +00:00
|
|
|
KernelMode,
|
|
|
|
0,
|
|
|
|
&WinStaObject);
|
2003-09-12 12:54:26 +00:00
|
|
|
if (!NT_SUCCESS(Status))
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( (DWORD)FALSE);
|
2003-09-12 12:54:26 +00:00
|
|
|
|
2004-05-14 23:57:32 +00:00
|
|
|
CurInfo = IntGetSysCursorInfo(WinStaObject);
|
|
|
|
Result = CurInfo->DblClickSpeed;
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2003-09-12 12:54:26 +00:00
|
|
|
ObDereferenceObject(WinStaObject);
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( Result);
|
|
|
|
|
|
|
|
CLEANUP:
|
|
|
|
DPRINT("Leave NtUserGetDoubleClickTime, ret=%i\n",_ret_);
|
|
|
|
UserLeave();
|
|
|
|
END_CLEANUP;
|
2003-09-12 12:54:26 +00:00
|
|
|
}
|
|
|
|
|
2003-11-18 23:33:31 +00:00
|
|
|
BOOL
|
|
|
|
STDCALL
|
|
|
|
NtUserGetGUIThreadInfo(
|
2005-09-05 21:19:23 +00:00
|
|
|
DWORD idThread, /* if NULL use foreground thread */
|
2003-11-18 23:33:31 +00:00
|
|
|
LPGUITHREADINFO lpgui)
|
|
|
|
{
|
|
|
|
NTSTATUS Status;
|
|
|
|
PTHRDCARETINFO CaretInfo;
|
|
|
|
GUITHREADINFO SafeGui;
|
|
|
|
PDESKTOP_OBJECT Desktop;
|
|
|
|
PUSER_MESSAGE_QUEUE MsgQueue;
|
|
|
|
PETHREAD Thread = NULL;
|
2005-09-05 21:19:23 +00:00
|
|
|
DECLARE_RETURN(BOOLEAN);
|
|
|
|
|
|
|
|
DPRINT("Enter NtUserGetGUIThreadInfo\n");
|
|
|
|
UserEnterShared();
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2003-11-18 23:33:31 +00:00
|
|
|
Status = MmCopyFromCaller(&SafeGui, lpgui, sizeof(DWORD));
|
|
|
|
if(!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
SetLastNtError(Status);
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( FALSE);
|
2003-11-18 23:33:31 +00:00
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2003-11-18 23:33:31 +00:00
|
|
|
if(SafeGui.cbSize != sizeof(GUITHREADINFO))
|
|
|
|
{
|
|
|
|
SetLastWin32Error(ERROR_INVALID_PARAMETER);
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( FALSE);
|
2003-11-18 23:33:31 +00:00
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2003-11-18 23:33:31 +00:00
|
|
|
if(idThread)
|
|
|
|
{
|
2005-02-17 16:41:28 +00:00
|
|
|
Status = PsLookupThreadByThreadId((HANDLE)idThread, &Thread);
|
2003-11-18 23:33:31 +00:00
|
|
|
if(!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
SetLastWin32Error(ERROR_ACCESS_DENIED);
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( FALSE);
|
2003-11-18 23:33:31 +00:00
|
|
|
}
|
2004-09-28 15:02:31 +00:00
|
|
|
Desktop = Thread->Tcb.Win32Thread->Desktop;
|
2003-11-18 23:33:31 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* get the foreground thread */
|
2004-09-28 15:02:31 +00:00
|
|
|
PW32THREAD W32Thread = PsGetCurrentThread()->Tcb.Win32Thread;
|
2003-11-18 23:33:31 +00:00
|
|
|
Desktop = W32Thread->Desktop;
|
|
|
|
if(Desktop)
|
|
|
|
{
|
|
|
|
MsgQueue = Desktop->ActiveMessageQueue;
|
|
|
|
if(MsgQueue)
|
|
|
|
{
|
|
|
|
Thread = MsgQueue->Thread;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2003-11-18 23:33:31 +00:00
|
|
|
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);
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( FALSE);
|
2003-11-18 23:33:31 +00:00
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2003-11-18 23:33:31 +00:00
|
|
|
MsgQueue = (PUSER_MESSAGE_QUEUE)Desktop->ActiveMessageQueue;
|
2003-12-20 15:42:47 +00:00
|
|
|
CaretInfo = MsgQueue->CaretInfo;
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2003-11-18 23:33:31 +00:00
|
|
|
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;
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2003-11-23 12:04:54 +00:00
|
|
|
/* FIXME add flag GUI_16BITTASK */
|
2005-05-08 02:11:54 +00:00
|
|
|
|
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;
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2003-11-18 23:33:31 +00:00
|
|
|
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;
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2003-11-23 13:46:33 +00:00
|
|
|
if(idThread)
|
|
|
|
ObDereferenceObject(Thread);
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2003-11-18 23:33:31 +00:00
|
|
|
Status = MmCopyToCaller(lpgui, &SafeGui, sizeof(GUITHREADINFO));
|
|
|
|
if(!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
SetLastNtError(Status);
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( FALSE);
|
2003-11-18 23:33:31 +00:00
|
|
|
}
|
|
|
|
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( TRUE);
|
|
|
|
|
|
|
|
CLEANUP:
|
|
|
|
DPRINT("Leave NtUserGetGUIThreadInfo, ret=%i\n",_ret_);
|
|
|
|
UserLeave();
|
|
|
|
END_CLEANUP;
|
2003-11-18 23:33:31 +00:00
|
|
|
}
|
|
|
|
|
2003-11-19 12:25:03 +00:00
|
|
|
|
|
|
|
DWORD
|
|
|
|
STDCALL
|
|
|
|
NtUserGetGuiResources(
|
|
|
|
HANDLE hProcess,
|
|
|
|
DWORD uiFlags)
|
|
|
|
{
|
|
|
|
PEPROCESS Process;
|
|
|
|
PW32PROCESS W32Process;
|
|
|
|
NTSTATUS Status;
|
|
|
|
DWORD Ret = 0;
|
2005-09-05 21:19:23 +00:00
|
|
|
DECLARE_RETURN(DWORD);
|
|
|
|
|
|
|
|
DPRINT("Enter NtUserGetGuiResources\n");
|
|
|
|
UserEnterShared();
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2003-11-19 12:25:03 +00:00
|
|
|
Status = ObReferenceObjectByHandle(hProcess,
|
|
|
|
PROCESS_QUERY_INFORMATION,
|
|
|
|
PsProcessType,
|
|
|
|
ExGetPreviousMode(),
|
|
|
|
(PVOID*)&Process,
|
|
|
|
NULL);
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2003-11-19 12:25:03 +00:00
|
|
|
if(!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
SetLastNtError(Status);
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( 0);
|
2003-11-19 12:25:03 +00:00
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2005-05-06 22:55:52 +00:00
|
|
|
W32Process = (PW32PROCESS)Process->Win32Process;
|
2003-11-19 12:25:03 +00:00
|
|
|
if(!W32Process)
|
|
|
|
{
|
2003-11-23 13:46:33 +00:00
|
|
|
ObDereferenceObject(Process);
|
2003-11-19 12:25:03 +00:00
|
|
|
SetLastWin32Error(ERROR_INVALID_PARAMETER);
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( 0);
|
2003-11-19 12:25:03 +00:00
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2003-11-19 12:25:03 +00:00
|
|
|
switch(uiFlags)
|
|
|
|
{
|
|
|
|
case GR_GDIOBJECTS:
|
|
|
|
{
|
|
|
|
Ret = (DWORD)W32Process->GDIObjects;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case GR_USEROBJECTS:
|
|
|
|
{
|
|
|
|
Ret = (DWORD)W32Process->UserObjects;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
default:
|
|
|
|
{
|
|
|
|
SetLastWin32Error(ERROR_INVALID_PARAMETER);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2003-11-19 12:25:03 +00:00
|
|
|
ObDereferenceObject(Process);
|
|
|
|
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( Ret);
|
|
|
|
|
|
|
|
CLEANUP:
|
|
|
|
DPRINT("Leave NtUserGetGuiResources, ret=%i\n",_ret_);
|
|
|
|
UserLeave();
|
|
|
|
END_CLEANUP;
|
2003-11-19 12:25:03 +00:00
|
|
|
}
|
|
|
|
|
2003-12-13 15:49:32 +00:00
|
|
|
NTSTATUS FASTCALL
|
|
|
|
IntSafeCopyUnicodeString(PUNICODE_STRING Dest,
|
|
|
|
PUNICODE_STRING Source)
|
|
|
|
{
|
|
|
|
NTSTATUS Status;
|
|
|
|
PWSTR Src;
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2003-12-13 15:49:32 +00:00
|
|
|
Status = MmCopyFromCaller(Dest, Source, sizeof(UNICODE_STRING));
|
|
|
|
if(!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
return Status;
|
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-04-14 23:40:43 +00:00
|
|
|
if(Dest->Length > 0x4000)
|
|
|
|
{
|
|
|
|
return STATUS_UNSUCCESSFUL;
|
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-04-14 23:40:43 +00:00
|
|
|
Src = Dest->Buffer;
|
|
|
|
Dest->Buffer = NULL;
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-04-14 23:40:43 +00:00
|
|
|
if(Dest->Length > 0 && Src)
|
2003-12-13 15:49:32 +00:00
|
|
|
{
|
2004-06-11 20:15:07 +00:00
|
|
|
Dest->MaximumLength = Dest->Length;
|
2004-06-20 00:45:37 +00:00
|
|
|
Dest->Buffer = ExAllocatePoolWithTag(PagedPool, Dest->MaximumLength, TAG_STRING);
|
2003-12-13 15:49:32 +00:00
|
|
|
if(!Dest->Buffer)
|
|
|
|
{
|
|
|
|
return STATUS_NO_MEMORY;
|
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-04-14 23:17:56 +00:00
|
|
|
Status = MmCopyFromCaller(Dest->Buffer, Src, Dest->Length);
|
2003-12-13 15:49:32 +00:00
|
|
|
if(!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
ExFreePool(Dest->Buffer);
|
|
|
|
Dest->Buffer = NULL;
|
|
|
|
return Status;
|
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
|
|
|
|
2003-12-13 15:49:32 +00:00
|
|
|
return STATUS_SUCCESS;
|
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-04-14 23:17:56 +00:00
|
|
|
/* string is empty */
|
|
|
|
return STATUS_SUCCESS;
|
2003-12-13 15:49:32 +00:00
|
|
|
}
|
|
|
|
|
2004-05-19 19:09:20 +00:00
|
|
|
NTSTATUS FASTCALL
|
|
|
|
IntSafeCopyUnicodeStringTerminateNULL(PUNICODE_STRING Dest,
|
|
|
|
PUNICODE_STRING Source)
|
|
|
|
{
|
|
|
|
NTSTATUS Status;
|
|
|
|
PWSTR Src;
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-05-19 19:09:20 +00:00
|
|
|
Status = MmCopyFromCaller(Dest, Source, sizeof(UNICODE_STRING));
|
|
|
|
if(!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
return Status;
|
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-05-19 19:09:20 +00:00
|
|
|
if(Dest->Length > 0x4000)
|
|
|
|
{
|
|
|
|
return STATUS_UNSUCCESSFUL;
|
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-05-19 19:09:20 +00:00
|
|
|
Src = Dest->Buffer;
|
|
|
|
Dest->Buffer = NULL;
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-05-19 19:09:20 +00:00
|
|
|
if(Dest->Length > 0 && Src)
|
|
|
|
{
|
2004-06-11 20:15:07 +00:00
|
|
|
Dest->MaximumLength = Dest->Length + sizeof(WCHAR);
|
2004-06-20 00:45:37 +00:00
|
|
|
Dest->Buffer = ExAllocatePoolWithTag(PagedPool, Dest->MaximumLength, TAG_STRING);
|
2004-05-19 19:09:20 +00:00
|
|
|
if(!Dest->Buffer)
|
|
|
|
{
|
|
|
|
return STATUS_NO_MEMORY;
|
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-05-19 19:09:20 +00:00
|
|
|
Status = MmCopyFromCaller(Dest->Buffer, Src, Dest->Length);
|
|
|
|
if(!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
ExFreePool(Dest->Buffer);
|
|
|
|
Dest->Buffer = NULL;
|
|
|
|
return Status;
|
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-05-19 19:09:20 +00:00
|
|
|
/* make sure the string is null-terminated */
|
|
|
|
Src = (PWSTR)((PBYTE)Dest->Buffer + Dest->Length);
|
|
|
|
*Src = L'\0';
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-05-19 19:09:20 +00:00
|
|
|
return STATUS_SUCCESS;
|
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-05-19 19:09:20 +00:00
|
|
|
/* string is empty */
|
|
|
|
return STATUS_SUCCESS;
|
|
|
|
}
|
|
|
|
|
2004-06-16 06:09:40 +00:00
|
|
|
NTSTATUS FASTCALL
|
|
|
|
IntUnicodeStringToNULLTerminated(PWSTR *Dest, PUNICODE_STRING Src)
|
|
|
|
{
|
|
|
|
if (Src->Length + sizeof(WCHAR) <= Src->MaximumLength
|
|
|
|
&& L'\0' == Src->Buffer[Src->Length / sizeof(WCHAR)])
|
|
|
|
{
|
|
|
|
/* The unicode_string is already nul terminated. Just reuse it. */
|
|
|
|
*Dest = Src->Buffer;
|
|
|
|
return STATUS_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
*Dest = ExAllocatePoolWithTag(PagedPool, Src->Length + sizeof(WCHAR), TAG_STRING);
|
|
|
|
if (NULL == *Dest)
|
|
|
|
{
|
|
|
|
return STATUS_NO_MEMORY;
|
|
|
|
}
|
|
|
|
RtlCopyMemory(*Dest, Src->Buffer, Src->Length);
|
|
|
|
(*Dest)[Src->Length / 2] = L'\0';
|
|
|
|
|
|
|
|
return STATUS_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
void FASTCALL
|
|
|
|
IntFreeNULLTerminatedFromUnicodeString(PWSTR NullTerminated, PUNICODE_STRING UnicodeString)
|
|
|
|
{
|
|
|
|
if (NullTerminated != UnicodeString->Buffer)
|
|
|
|
{
|
|
|
|
ExFreePool(NullTerminated);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2004-12-06 02:23:05 +00:00
|
|
|
BOOL STDCALL
|
|
|
|
NtUserUpdatePerUserSystemParameters(
|
2004-12-10 16:52:04 +00:00
|
|
|
DWORD dwReserved,
|
2004-12-06 02:23:05 +00:00
|
|
|
BOOL bEnable)
|
|
|
|
{
|
2004-12-10 16:52:04 +00:00
|
|
|
BOOL Result = TRUE;
|
2005-09-05 21:19:23 +00:00
|
|
|
DECLARE_RETURN(BOOLEAN);
|
|
|
|
|
|
|
|
DPRINT("Enter NtUserUpdatePerUserSystemParameters\n");
|
|
|
|
UserEnterExclusive();
|
|
|
|
|
2004-12-10 16:52:04 +00:00
|
|
|
Result &= IntDesktopUpdatePerUserSettings(bEnable);
|
2005-09-05 21:19:23 +00:00
|
|
|
RETURN( Result);
|
|
|
|
|
|
|
|
CLEANUP:
|
|
|
|
DPRINT("Leave NtUserUpdatePerUserSystemParameters, ret=%i\n",_ret_);
|
|
|
|
UserLeave();
|
|
|
|
END_CLEANUP;
|
2004-12-06 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
2004-06-16 06:09:40 +00:00
|
|
|
/* EOF */
|