* 2008/03/20 Split from misc.c
*/
-#include <w32k.h>
+#include <win32k.h>
#define NDEBUG
#include <debug.h>
&Process);
if (!NT_SUCCESS(Status))
{
- SetLastWin32Error(RtlNtStatusToDosError(Status));
+ EngSetLastError(RtlNtStatusToDosError(Status));
return FALSE;
}
Result = (DWORD_PTR)MsqGetMessageExtraInfo();
break;
- case NOPARAM_ROUTINE_ANYPOPUP:
- Result = (DWORD_PTR)IntAnyPopup();
- break;
-
- case NOPARAM_ROUTINE_CSRSS_INITIALIZED:
- Result = (DWORD_PTR)CsrInit();
- break;
-
case NOPARAM_ROUTINE_MSQCLEARWAKEMASK:
RETURN( (DWORD_PTR)IntMsqClearWakeMask());
+ case NOPARAM_ROUTINE_GETMSESSAGEPOS:
+ {
+ PTHREADINFO pti = PsGetCurrentThreadWin32Thread();
+ RETURN( (DWORD_PTR)MAKELONG(pti->ptLast.x, pti->ptLast.y));
+ }
+
default:
DPRINT1("Calling invalid routine number 0x%x in NtUserCallNoParam\n", Routine);
- SetLastWin32Error(ERROR_INVALID_PARAMETER);
+ EngSetLastError(ERROR_INVALID_PARAMETER);
break;
}
RETURN(Result);
MsqPostQuitMessage(pti->MessageQueue, Param);
RETURN(TRUE);
}
+
+ case ONEPARAM_ROUTINE_BEGINDEFERWNDPOS:
+ {
+ PSMWP psmwp;
+ HDWP hDwp = NULL;
+ INT count = (INT)Param;
+
+ if (count < 0)
+ {
+ EngSetLastError(ERROR_INVALID_PARAMETER);
+ RETURN(0);
+ }
+ /* Windows allows zero count, in which case it allocates context for 8 moves */
+ if (count == 0) count = 8;
+
+ psmwp = (PSMWP) UserCreateObject( gHandleTable,
+ NULL,
+ (PHANDLE)&hDwp,
+ otSMWP,
+ sizeof(SMWP));
+ if (!psmwp) RETURN(0);
+ psmwp->acvr = ExAllocatePoolWithTag(PagedPool, count * sizeof(CVR), USERTAG_SWP);
+ if (!psmwp->acvr)
+ {
+ UserDeleteObject(hDwp, otSMWP);
+ RETURN(0);
+ }
+ RtlZeroMemory(psmwp->acvr, count * sizeof(CVR));
+ psmwp->bHandle = TRUE;
+ psmwp->ccvr = 0; // actualCount
+ psmwp->ccvrAlloc = Param; // suggestedCount
+ RETURN((DWORD_PTR)hDwp);
+ }
+
case ONEPARAM_ROUTINE_SHOWCURSOR:
RETURN( (DWORD_PTR)UserShowCursor((BOOL)Param) );
case ONEPARAM_ROUTINE_SETMESSAGEEXTRAINFO:
RETURN( (DWORD_PTR)MsqSetMessageExtraInfo((LPARAM)Param));
- case ONEPARAM_ROUTINE_CREATECURICONHANDLE:
+ case ONEPARAM_ROUTINE_CREATEEMPTYCUROBJECT:
{
PCURICON_OBJECT CurIcon;
- PWINSTATION_OBJECT WinSta;
+ DWORD_PTR Result ;
- WinSta = IntGetWinStaObj();
- if(WinSta == NULL)
+ if (!(CurIcon = IntCreateCurIconHandle()))
{
+ EngSetLastError(ERROR_NOT_ENOUGH_MEMORY);
RETURN(0);
}
- if (!(CurIcon = IntCreateCurIconHandle(WinSta)))
- {
- SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY);
- ObDereferenceObject(WinSta);
- RETURN(0);
- }
-
- ObDereferenceObject(WinSta);
- RETURN((DWORD_PTR)CurIcon->Self);
+ Result = (DWORD_PTR)CurIcon->Self;
+ UserDereferenceObject(CurIcon);
+ RETURN(Result);
}
case ONEPARAM_ROUTINE_GETCURSORPOSITION:
{
- PWINSTATION_OBJECT WinSta;
- NTSTATUS Status;
- POINT Pos;
-
- if(!Param)
- RETURN( (DWORD_PTR)FALSE);
- Status = IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation,
- KernelMode,
- 0,
- &WinSta);
- if (!NT_SUCCESS(Status))
- RETURN( (DWORD_PTR)FALSE);
-
- /* FIXME - check if process has WINSTA_READATTRIBUTES */
- IntGetCursorLocation(WinSta, &Pos);
-
- Status = MmCopyToCaller((PPOINT)Param, &Pos, sizeof(POINT));
- if(!NT_SUCCESS(Status))
- {
- ObDereferenceObject(WinSta);
- SetLastNtError(Status);
- RETURN( FALSE);
- }
-
- ObDereferenceObject(WinSta);
+ BOOL ret = TRUE;
- RETURN( (DWORD_PTR)TRUE);
- }
- case ONEPARAM_ROUTINE_ISWINDOWINDESTROY:
- {
- PWINDOW_OBJECT Window;
- DWORD_PTR Result;
-
- if(!(Window = UserGetWindowObject((HWND)Param)))
+ _SEH2_TRY
{
- RETURN( FALSE);
+ ProbeForWrite((POINT*)Param,sizeof(POINT),1);
+ RtlCopyMemory((POINT*)Param,&gpsi->ptCursor,sizeof(POINT));
}
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ SetLastNtError(_SEH2_GetExceptionCode());
+ ret = FALSE;
+ }
+ _SEH2_END;
- Result = (DWORD_PTR)IntIsWindowInDestroy(Window);
-
- RETURN( Result);
+ RETURN (ret);
}
case ONEPARAM_ROUTINE_ENABLEPROCWNDGHSTING:
RETURN( FALSE);
}
- case ONEPARAM_ROUTINE_MSQSETWAKEMASK:
+ case ONEPARAM_ROUTINE_GETINPUTEVENT:
RETURN( (DWORD_PTR)IntMsqSetWakeMask(Param));
case ONEPARAM_ROUTINE_GETKEYBOARDTYPE:
case ONEPARAM_ROUTINE_GETQUEUESTATUS:
{
- DWORD Ret;
- WORD changed_bits, wake_bits;
- Ret = IntGetQueueStatus(FALSE);
- changed_bits = LOWORD(Ret);
- wake_bits = HIWORD(Ret);
- RETURN( MAKELONG(changed_bits & Param, wake_bits & Param));
+ RETURN (IntGetQueueStatus((DWORD)Param));
}
case ONEPARAM_ROUTINE_ENUMCLIPBOARDFORMATS:
/* FIXME: Should use UserEnterShared */
BOOL Ret = TRUE;
PPOINTL pptl;
PTHREADINFO pti = PsGetCurrentThreadWin32Thread();
- if (pti->hDesktop != InputDesktopHandle) RETURN(FALSE);
+ if (pti->hdesk != InputDesktopHandle) RETURN(FALSE);
_SEH2_TRY
{
pptl = (PPOINTL)Param;
_SEH2_END;
RETURN(Ret);
}
+ case ONEPARAM_ROUTINE_SETPROCDEFLAYOUT:
+ {
+ PPROCESSINFO ppi;
+ if (Param & LAYOUT_ORIENTATIONMASK)
+ {
+ ppi = PsGetCurrentProcessWin32Process();
+ ppi->dwLayout = Param;
+ RETURN(TRUE);
+ }
+ EngSetLastError(ERROR_INVALID_PARAMETER);
+ RETURN(FALSE);
+ }
+ case ONEPARAM_ROUTINE_GETPROCDEFLAYOUT:
+ {
+ BOOL Ret = TRUE;
+ PPROCESSINFO ppi;
+ PDWORD pdwLayout;
+ if ( PsGetCurrentProcess() == CsrProcess)
+ {
+ EngSetLastError(ERROR_INVALID_ACCESS);
+ RETURN(FALSE);
+ }
+ ppi = PsGetCurrentProcessWin32Process();
+ _SEH2_TRY
+ {
+ pdwLayout = (PDWORD)Param;
+ *pdwLayout = ppi->dwLayout;
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ SetLastNtError(_SEH2_GetExceptionCode());
+ Ret = FALSE;
+ }
+ _SEH2_END;
+ RETURN(Ret);
+ }
+ case ONEPARAM_ROUTINE_REPLYMESSAGE:
+ RETURN (co_MsqReplyMessage((LRESULT) Param));
+ case ONEPARAM_ROUTINE_MESSAGEBEEP:
+ RETURN ( UserPostMessage(hwndSAS, WM_LOGONNOTIFY, LN_MESSAGE_BEEP, Param) );
+ /* TODO: Implement sound sentry */
}
DPRINT1("Calling invalid routine number 0x%x in NtUserCallOneParam(), Param=0x%x\n",
Routine, Param);
- SetLastWin32Error(ERROR_INVALID_PARAMETER);
+ EngSetLastError(ERROR_INVALID_PARAMETER);
RETURN( 0);
CLEANUP:
DWORD_PTR Param2,
DWORD Routine)
{
- NTSTATUS Status;
- PWINDOW_OBJECT Window;
+ PWND Window;
DECLARE_RETURN(DWORD_PTR);
DPRINT("Enter NtUserCallTwoParam\n");
switch(Routine)
{
- case TWOPARAM_ROUTINE_GETWINDOWRGNBOX:
- {
- DWORD_PTR Ret;
- RECTL rcRect;
- Window = UserGetWindowObject((HWND)Param1);
- if (!Window) RETURN(ERROR);
-
- Ret = (DWORD_PTR)IntGetWindowRgnBox(Window, &rcRect);
- Status = MmCopyToCaller((PVOID)Param2, &rcRect, sizeof(RECT));
- if(!NT_SUCCESS(Status))
- {
- SetLastNtError(Status);
- RETURN( ERROR);
- }
- RETURN( Ret);
- }
- case TWOPARAM_ROUTINE_GETWINDOWRGN:
- {
- Window = UserGetWindowObject((HWND)Param1);
- if (!Window) RETURN(ERROR);
-
- RETURN( (DWORD_PTR)IntGetWindowRgn(Window, (HRGN)Param2));
- }
case TWOPARAM_ROUTINE_SETMENUBARHEIGHT:
{
DWORD_PTR Ret;
wParam = MAKEWPARAM((Param2 >> 3) & 0x3,
Param2 & (UISF_HIDEFOCUS | UISF_HIDEACCEL | UISF_ACTIVE));
- RETURN( UserUpdateUiState(Window->Wnd, wParam) );
+ RETURN( UserUpdateUiState(Window, wParam) );
}
case TWOPARAM_ROUTINE_SWITCHTOTHISWINDOW:
case TWOPARAM_ROUTINE_REGISTERLOGONPROC:
RETURN( (DWORD_PTR)co_IntRegisterLogonProcess((HANDLE)Param1, (BOOL)Param2));
+
+ case TWOPARAM_ROUTINE_SETCURSORPOS:
+ RETURN( (DWORD_PTR)UserSetCursorPos((int)Param1, (int)Param2, FALSE));
+
+ case TWOPARAM_ROUTINE_UNHOOKWINDOWSHOOK:
+ RETURN( IntUnhookWindowsHook((int)Param1, (HOOKPROC)Param2));
}
DPRINT1("Calling invalid routine number 0x%x in NtUserCallTwoParam(), Param1=0x%x Parm2=0x%x\n",
Routine, Param1, Param2);
- SetLastWin32Error(ERROR_INVALID_PARAMETER);
+ EngSetLastError(ERROR_INVALID_PARAMETER);
RETURN( 0);
CLEANUP:
DWORD Routine)
{
BOOL Ret = 0;
- PWINDOW_OBJECT Window;
- PWND Wnd;
+ PWND Window;
USER_REFERENCE_ENTRY Ref;
DECLARE_RETURN(BOOLEAN);
DPRINT("Enter NtUserCallHwndLock\n");
UserEnterExclusive();
- if (!(Window = UserGetWindowObject(hWnd)) || !Window->Wnd)
+ if (!(Window = UserGetWindowObject(hWnd)))
{
RETURN( FALSE);
}
UserRefObjectCo(Window, &Ref);
- Wnd = Window->Wnd;
-
/* FIXME: Routine can be 0x53 - 0x5E */
switch (Routine)
{
case HWNDLOCK_ROUTINE_DRAWMENUBAR:
{
- PMENU_OBJECT Menu;
DPRINT("HWNDLOCK_ROUTINE_DRAWMENUBAR\n");
- Ret = FALSE;
- if (!((Wnd->style & (WS_CHILD | WS_POPUP)) != WS_CHILD))
- break;
-
- if(!(Menu = UserGetMenuObject((HMENU)(DWORD_PTR) Wnd->IDMenu)))
- break;
-
- Menu->MenuInfo.WndOwner = hWnd;
- Menu->MenuInfo.Height = 0;
-
- co_WinPosSetWindowPos( Window,
- HWND_DESKTOP,
- 0,0,0,0,
- SWP_NOSIZE|
- SWP_NOMOVE|
- SWP_NOZORDER|
- SWP_NOACTIVATE|
- SWP_FRAMECHANGED );
-
Ret = TRUE;
+ if ((Window->style & (WS_CHILD | WS_POPUP)) != WS_CHILD)
+ co_WinPosSetWindowPos( Window,
+ HWND_DESKTOP,
+ 0,0,0,0,
+ SWP_NOSIZE|
+ SWP_NOMOVE|
+ SWP_NOZORDER|
+ SWP_NOACTIVATE|
+ SWP_FRAMECHANGED );
break;
}
SWP_NOZORDER|
SWP_NOACTIVATE|
SWP_FRAMECHANGED );
- if (!IntGetOwner(Window) && !IntGetParent(Window))
+ if (!Window->spwndOwner && !IntGetParent(Window))
{
co_IntShellHookNotify(HSHELL_REDRAW, (LPARAM) hWnd);
}
{
case HWND_ROUTINE_GETWNDCONTEXTHLPID:
{
- PWINDOW_OBJECT Window;
+ PWND Window;
PPROPERTY HelpId;
USER_REFERENCE_ENTRY Ref;
UserEnterExclusive();
- if (!(Window = UserGetWindowObject(hWnd)) || !Window->Wnd)
+ if (!(Window = UserGetWindowObject(hWnd)))
{
UserLeave();
return 0;
case HWNDPARAM_ROUTINE_SETWNDCONTEXTHLPID:
{
- PWINDOW_OBJECT Window;
+ PWND Window;
UserEnterExclusive();
if(!(Window = UserGetWindowObject(hWnd)))
case HWNDPARAM_ROUTINE_SETDIALOGPOINTER:
{
- PWINDOW_OBJECT Window;
PWND pWnd;
USER_REFERENCE_ENTRY Ref;
UserEnterExclusive();
- if (!(Window = UserGetWindowObject(hWnd)) || !Window->Wnd)
+ if (!(pWnd = UserGetWindowObject(hWnd)))
{
UserLeave();
return 0;
}
- UserRefObjectCo(Window, &Ref);
+ UserRefObjectCo(pWnd, &Ref);
- pWnd = Window->Wnd;
if (pWnd->head.pti->ppi == PsGetCurrentProcessWin32Process() &&
pWnd->cbwndExtra == DLGWINDOWEXTRA &&
!(pWnd->state & WNDS_SERVERSIDEWINDOWPROC))
}
}
- UserDerefObjectCo(Window);
+ UserDerefObjectCo(pWnd);
+ UserLeave();
+ return 0;
+ }
+
+ case HWNDPARAM_ROUTINE_ROS_NOTIFYWINEVENT:
+ {
+ PWND pWnd;
+ PNOTIFYEVENT pne;
+ UserEnterExclusive();
+ pne = (PNOTIFYEVENT)Param;
+ if (hWnd)
+ pWnd = UserGetWindowObject(hWnd);
+ else
+ pWnd = NULL;
+ IntNotifyWinEvent(pne->event, pWnd, pne->idObject, pne->idChild, pne->flags);
UserLeave();
return 0;
}
DWORD Param,
DWORD Routine)
{
- UNIMPLEMENTED;
+ DWORD Ret = 0;
+ PWND Window;
+ USER_REFERENCE_ENTRY Ref;
+ DECLARE_RETURN(DWORD);
+
+ DPRINT("Enter NtUserCallHwndParamLock\n");
+ UserEnterExclusive();
+
+ if (!(Window = UserGetWindowObject(hWnd)))
+ {
+ RETURN( FALSE);
+ }
+ UserRefObjectCo(Window, &Ref);
+
+ switch (Routine)
+ {
+ case TWOPARAM_ROUTINE_VALIDATERGN:
+ Ret = (DWORD)co_UserRedrawWindow( Window, NULL, (HRGN)Param, RDW_VALIDATE);
+ break;
+ }
+
+ UserDerefObjectCo(Window);
+
+ RETURN( Ret);
+
+CLEANUP:
+ DPRINT("Leave NtUserCallHwndParamLock, ret=%i\n",_ret_);
+ UserLeave();
+ END_CLEANUP;
- return 0;
}
/* EOF */