📄 misc.c
字号:
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:
/* FIXME */
break;
case HWNDLOCK_ROUTINE_SETFOREGROUNDWINDOW:
Ret = co_IntSetForegroundWindow(Window);
break;
case HWNDLOCK_ROUTINE_UPDATEWINDOW:
/* FIXME */
break;
}
UserDerefObjectCo(Window);
RETURN( Ret);
CLEANUP:
DPRINT("Leave NtUserCallHwndLock, ret=%i\n",_ret_);
UserLeave();
END_CLEANUP;
}
/*
* @unimplemented
*/
HWND
STDCALL
NtUserCallHwndOpt(
HWND Param,
DWORD Routine)
{
switch (Routine)
{
case HWNDOPT_ROUTINE_SETPROGMANWINDOW:
GetW32ThreadInfo()->Desktop->hProgmanWindow = Param;
break;
case HWNDOPT_ROUTINE_SETTASKMANWINDOW:
GetW32ThreadInfo()->Desktop->hTaskManWindow = Param;
break;
}
return Param;
}
/*
* @unimplemented
*/
DWORD STDCALL
NtUserGetThreadState(
DWORD Routine)
{
DECLARE_RETURN(DWORD);
DPRINT("Enter NtUserGetThreadState\n");
if (Routine != THREADSTATE_GETTHREADINFO)
{
UserEnterShared();
}
else
{
UserEnterExclusive();
}
switch (Routine)
{
case THREADSTATE_GETTHREADINFO:
GetW32ThreadInfo();
RETURN(0);
case THREADSTATE_FOCUSWINDOW:
RETURN( (DWORD)IntGetThreadFocusWindow());
case THREADSTATE_PROGMANWINDOW:
RETURN( (DWORD)GetW32ThreadInfo()->Desktop->hProgmanWindow);
case THREADSTATE_TASKMANWINDOW:
RETURN( (DWORD)GetW32ThreadInfo()->Desktop->hTaskManWindow);
}
RETURN( 0);
CLEANUP:
DPRINT("Leave NtUserGetThreadState, ret=%i\n",_ret_);
UserLeave();
END_CLEANUP;
}
VOID FASTCALL
IntGetFontMetricSetting(LPWSTR lpValueName, PLOGFONTW font)
{
RTL_QUERY_REGISTRY_TABLE QueryTable[2];
NTSTATUS Status;
/* Firefox 1.0.7 depends on the lfHeight value being negative */
static LOGFONTW DefaultFont = {
-11, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET,
0, 0, DEFAULT_QUALITY, VARIABLE_PITCH | FF_SWISS,
L"MS Sans Serif"
};
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));
}
}
ULONG FASTCALL
IntSystemParametersInfo(
UINT uiAction,
UINT uiParam,
PVOID pvParam,
UINT fWinIni)
{
PWINSTATION_OBJECT WinStaObject;
NTSTATUS Status;
BOOL bChanged = FALSE;
static BOOL bInitialized = FALSE;
static LOGFONTW IconFont;
static NONCLIENTMETRICSW pMetrics;
static MINIMIZEDMETRICS MinimizedMetrics;
static BOOL GradientCaptions = TRUE;
static UINT FocusBorderHeight = 1;
static UINT FocusBorderWidth = 1;
if (!bInitialized)
{
RtlZeroMemory(&IconFont, sizeof(LOGFONTW));
RtlZeroMemory(&pMetrics, sizeof(NONCLIENTMETRICSW));
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);
pMetrics.iBorderWidth = 1;
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);
pMetrics.cbSize = sizeof(NONCLIENTMETRICSW);
MinimizedMetrics.cbSize = sizeof(MINIMIZEDMETRICS);
MinimizedMetrics.iWidth = UserGetSystemMetrics(SM_CXMINIMIZED);
MinimizedMetrics.iHorzGap = UserGetSystemMetrics(SM_CXMINSPACING);
MinimizedMetrics.iVertGap = UserGetSystemMetrics(SM_CYMINSPACING);
MinimizedMetrics.iArrange = ARW_HIDE;
bInitialized = TRUE;
}
switch(uiAction)
{
case SPI_SETDOUBLECLKWIDTH:
case SPI_SETDOUBLECLKHEIGHT:
case SPI_SETDOUBLECLICKTIME:
case SPI_SETDESKWALLPAPER:
case SPI_SETSCREENSAVERRUNNING:
case SPI_SETSCREENSAVETIMEOUT:
case SPI_SETFLATMENU:
/* We will change something, so set the flag here */
bChanged = TRUE;
case SPI_GETDESKWALLPAPER:
case SPI_GETWHEELSCROLLLINES:
case SPI_GETWHEELSCROLLCHARS:
case SPI_GETSCREENSAVERRUNNING:
case SPI_GETSCREENSAVETIMEOUT:
case SPI_GETSCREENSAVEACTIVE:
case SPI_GETFLATMENU:
{
PSYSTEM_CURSORINFO CurInfo;
Status = IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation,
KernelMode,
0,
&WinStaObject);
if(!NT_SUCCESS(Status))
{
SetLastNtError(Status);
return (DWORD)FALSE;
}
switch(uiAction)
{
case SPI_GETFLATMENU:
ASSERT(pvParam);
*((UINT*)pvParam) = WinStaObject->FlatMenu;
break;
case SPI_SETFLATMENU:
WinStaObject->FlatMenu = uiParam;
break;
case SPI_GETSCREENSAVETIMEOUT:
ASSERT(pvParam);
*((UINT*)pvParam) = WinStaObject->ScreenSaverTimeOut;
break;
case SPI_SETSCREENSAVETIMEOUT:
WinStaObject->ScreenSaverTimeOut = uiParam;
break;
case SPI_GETSCREENSAVERRUNNING:
if (pvParam != NULL) *((BOOL*)pvParam) = WinStaObject->ScreenSaverRunning;
break;
case SPI_SETSCREENSAVERRUNNING:
if (pvParam != NULL) *((BOOL*)pvParam) = WinStaObject->ScreenSaverRunning;
WinStaObject->ScreenSaverRunning = uiParam;
break;
case SPI_GETSCREENSAVEACTIVE:
/* FIXME: how to disable the screensaver? */
ASSERT(pvParam);
*((BOOL*)pvParam) = TRUE;
break;
case SPI_GETWHEELSCROLLLINES:
ASSERT(pvParam);
CurInfo = IntGetSysCursorInfo(WinStaObject);
*((UINT*)pvParam) = CurInfo->WheelScroLines;
/* FIXME add this value to scroll list as scroll value ?? */
break;
case SPI_GETWHEELSCROLLCHARS:
ASSERT(pvParam);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -