📄 misc.c
字号:
case ONEPARAM_ROUTINE_GETKEYBOARDTYPE:
RETURN( UserGetKeyboardType(Param));
case ONEPARAM_ROUTINE_GETKEYBOARDLAYOUT:
RETURN( (DWORD)UserGetKeyboardLayout(Param));
case ONEPARAM_ROUTINE_REGISTERUSERMODULE:
{
PW32THREADINFO ti;
ti = GetW32ThreadInfo();
if (ti == NULL)
{
DPRINT1("Cannot register user32 module instance!\n");
SetLastWin32Error(ERROR_INVALID_PARAMETER);
RETURN(FALSE);
}
if (InterlockedCompareExchangePointer(&ti->kpi->hModUser,
(HINSTANCE)Param,
NULL) == NULL)
{
RETURN(TRUE);
}
}
}
DPRINT1("Calling invalid routine number 0x%x in NtUserCallOneParam(), Param=0x%x\n",
Routine, Param);
SetLastWin32Error(ERROR_INVALID_PARAMETER);
RETURN( 0);
CLEANUP:
DPRINT("Leave NtUserCallOneParam, ret=%i\n",_ret_);
UserLeave();
END_CLEANUP;
}
/*
* @implemented
*/
DWORD
STDCALL
NtUserCallTwoParam(
DWORD Param1,
DWORD Param2,
DWORD Routine)
{
NTSTATUS Status;
PWINDOW_OBJECT Window;
DECLARE_RETURN(DWORD);
DPRINT("Enter NtUserCallTwoParam\n");
UserEnterExclusive();
switch(Routine)
{
case TWOPARAM_ROUTINE_SETDCPENCOLOR:
{
RETURN( (DWORD)IntSetDCColor((HDC)Param1, OBJ_PEN, (COLORREF)Param2));
}
case TWOPARAM_ROUTINE_SETDCBRUSHCOLOR:
{
RETURN( (DWORD)IntSetDCColor((HDC)Param1, OBJ_BRUSH, (COLORREF)Param2));
}
case TWOPARAM_ROUTINE_GETDCCOLOR:
{
RETURN( (DWORD)IntGetDCColor((HDC)Param1, (ULONG)Param2));
}
case TWOPARAM_ROUTINE_GETWINDOWRGNBOX:
{
DWORD Ret;
RECT rcRect;
Window = UserGetWindowObject((HWND)Param1);
if (!Window) RETURN(ERROR);
Ret = (DWORD)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)IntGetWindowRgn(Window, (HRGN)Param2));
}
case TWOPARAM_ROUTINE_SETMENUBARHEIGHT:
{
DWORD Ret;
PMENU_OBJECT MenuObject = IntGetMenuObject((HMENU)Param1);
if(!MenuObject)
RETURN( 0);
if(Param2 > 0)
{
Ret = (MenuObject->MenuInfo.Height == (int)Param2);
MenuObject->MenuInfo.Height = (int)Param2;
}
else
Ret = (DWORD)MenuObject->MenuInfo.Height;
IntReleaseMenuObject(MenuObject);
RETURN( Ret);
}
case TWOPARAM_ROUTINE_SETMENUITEMRECT:
{
BOOL Ret;
SETMENUITEMRECT smir;
PMENU_OBJECT MenuObject = IntGetMenuObject((HMENU)Param1);
if(!MenuObject)
RETURN( 0);
if(!NT_SUCCESS(MmCopyFromCaller(&smir, (PVOID)Param2, sizeof(SETMENUITEMRECT))))
{
IntReleaseMenuObject(MenuObject);
RETURN( 0);
}
Ret = IntSetMenuItemRect(MenuObject, smir.uItem, smir.fByPosition, &smir.rcRect);
IntReleaseMenuObject(MenuObject);
RETURN( (DWORD)Ret);
}
case TWOPARAM_ROUTINE_SETGUITHRDHANDLE:
{
PUSER_MESSAGE_QUEUE MsgQueue = ((PW32THREAD)PsGetCurrentThread()->Tcb.Win32Thread)->MessageQueue;
ASSERT(MsgQueue);
RETURN( (DWORD)MsqSetStateWindow(MsgQueue, (ULONG)Param1, (HWND)Param2));
}
case TWOPARAM_ROUTINE_ENABLEWINDOW:
UNIMPLEMENTED
RETURN( 0);
case TWOPARAM_ROUTINE_UNKNOWN:
UNIMPLEMENTED
RETURN( 0);
case TWOPARAM_ROUTINE_SHOWOWNEDPOPUPS:
{
Window = UserGetWindowObject((HWND)Param1);
if (!Window) RETURN(0);
RETURN( (DWORD)IntShowOwnedPopups(Window, (BOOL) Param2));
}
case TWOPARAM_ROUTINE_ROS_SHOWWINDOW:
{
#define WIN_NEEDS_SHOW_OWNEDPOPUP (0x00000040)
DPRINT1("ROS_SHOWWINDOW\n");
if (!(Window = UserGetWindowObject((HWND)Param1)))
{
RETURN( 1 );
}
if (Param2)
{
if (!(Window->Flags & WIN_NEEDS_SHOW_OWNEDPOPUP))
{
RETURN( -1 );
}
Window->Flags &= ~WIN_NEEDS_SHOW_OWNEDPOPUP;
}
else
Window->Flags |= WIN_NEEDS_SHOW_OWNEDPOPUP;
DPRINT1("ROS_SHOWWINDOW ---> 0x%x\n",Window->Flags);
RETURN( 0 );
}
case TWOPARAM_ROUTINE_SWITCHTOTHISWINDOW:
UNIMPLEMENTED
RETURN( 0);
case TWOPARAM_ROUTINE_SETWNDCONTEXTHLPID:
if(!(Window = UserGetWindowObject((HWND)Param1)))
{
RETURN( (DWORD)FALSE);
}
Window->ContextHelpId = Param2;
RETURN( (DWORD)TRUE);
case TWOPARAM_ROUTINE_SETCARETPOS:
RETURN( (DWORD)co_IntSetCaretPos((int)Param1, (int)Param2));
case TWOPARAM_ROUTINE_GETWINDOWINFO:
{
WINDOWINFO wi;
DWORD Ret;
if(!(Window = UserGetWindowObject((HWND)Param1)))
{
RETURN( FALSE);
}
#if 0
/*
* According to WINE, Windows' doesn't check the cbSize field
*/
Status = MmCopyFromCaller(&wi.cbSize, (PVOID)Param2, sizeof(wi.cbSize));
if(!NT_SUCCESS(Status))
{
SetLastNtError(Status);
RETURN( FALSE);
}
if(wi.cbSize != sizeof(WINDOWINFO))
{
SetLastWin32Error(ERROR_INVALID_PARAMETER);
RETURN( FALSE);
}
#endif
if((Ret = (DWORD)IntGetWindowInfo(Window, &wi)))
{
Status = MmCopyToCaller((PVOID)Param2, &wi, sizeof(WINDOWINFO));
if(!NT_SUCCESS(Status))
{
SetLastNtError(Status);
RETURN( FALSE);
}
}
RETURN( Ret);
}
case TWOPARAM_ROUTINE_REGISTERLOGONPROC:
RETURN( (DWORD)co_IntRegisterLogonProcess((HANDLE)Param1, (BOOL)Param2));
case TWOPARAM_ROUTINE_SETSYSCOLORS:
{
DWORD Ret = 0;
PVOID Buffer;
struct
{
INT *Elements;
COLORREF *Colors;
}
ChangeSysColors;
/* FIXME - we should make use of SEH here... */
Status = MmCopyFromCaller(&ChangeSysColors, (PVOID)Param1, sizeof(ChangeSysColors));
if(!NT_SUCCESS(Status))
{
SetLastNtError(Status);
RETURN( 0);
}
Buffer = ExAllocatePool(PagedPool, (Param2 * sizeof(INT)) + (Param2 * sizeof(COLORREF)));
if(Buffer != NULL)
{
INT *Elements = (INT*)Buffer;
COLORREF *Colors = (COLORREF*)Buffer + Param2;
Status = MmCopyFromCaller(Elements, ChangeSysColors.Elements, Param2 * sizeof(INT));
if(NT_SUCCESS(Status))
{
Status = MmCopyFromCaller(Colors, ChangeSysColors.Colors, Param2 * sizeof(COLORREF));
if(NT_SUCCESS(Status))
{
Ret = (DWORD)IntSetSysColors((UINT)Param2, Elements, Colors);
}
else
SetLastNtError(Status);
}
else
SetLastNtError(Status);
ExFreePool(Buffer);
}
RETURN( Ret);
}
case TWOPARAM_ROUTINE_GETSYSCOLORBRUSHES:
case TWOPARAM_ROUTINE_GETSYSCOLORPENS:
case TWOPARAM_ROUTINE_GETSYSCOLORS:
{
DWORD Ret = 0;
union
{
PVOID Pointer;
HBRUSH *Brushes;
HPEN *Pens;
COLORREF *Colors;
} Buffer;
/* FIXME - we should make use of SEH here... */
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;
}
if(Ret > 0)
{
Status = MmCopyToCaller((PVOID)Param1, Buffer.Pointer, Param2 * sizeof(HANDLE));
if(!NT_SUCCESS(Status))
{
SetLastNtError(Status);
Ret = 0;
}
}
ExFreePool(Buffer.Pointer);
}
RETURN( Ret);
}
}
DPRINT1("Calling invalid routine number 0x%x in NtUserCallTwoParam(), Param1=0x%x Parm2=0x%x\n",
Routine, Param1, Param2);
SetLastWin32Error(ERROR_INVALID_PARAMETER);
RETURN( 0);
CLEANUP:
DPRINT("Leave NtUserCallTwoParam, ret=%i\n",_ret_);
UserLeave();
END_CLEANUP;
}
/*
* @unimplemented
*/
BOOL
STDCALL
NtUserCallHwndLock(
HWND hWnd,
DWORD Routine)
{
BOOL Ret = 0;
PWINDOW_OBJECT Window;
USER_REFERENCE_ENTRY Ref;
DECLARE_RETURN(BOOLEAN);
DPRINT("Enter NtUserCallHwndLock\n");
UserEnterExclusive();
if (!(Window = UserGetWindowObject(hWnd)))
{
RETURN( FALSE);
}
UserRefObjectCo(Window, &Ref);
/* FIXME: Routine can be 0x53 - 0x5E */
switch (Routine)
{
case HWNDLOCK_ROUTINE_ARRANGEICONICWINDOWS:
co_WinPosArrangeIconicWindows(Window);
break;
case HWNDLOCK_ROUTINE_DRAWMENUBAR:
{
PMENU_OBJECT Menu;
DPRINT("HWNDLOCK_ROUTINE_DRAWMENUBAR\n");
Ret = FALSE;
if (!((Window->Style & (WS_CHILD | WS_POPUP)) != WS_CHILD))
break;
if(!(Menu = UserGetMenuObject((HMENU) Window->IDMenu)))
break;
Menu->MenuInfo.WndOwner = hWnd;
Menu->MenuInfo.Height = 0;
co_WinPosSetWindowPos(Window, 0, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE |
SWP_NOACTIVATE | SWP_NOZORDER | SWP_FRAMECHANGED );
Ret = TRUE;
break;
}
case HWNDLOCK_ROUTINE_REDRAWFRAME:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -