📄 misc.c
字号:
/* 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;
static ANIMATIONINFO anim;
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_GETDRAGFULLWINDOWS:
/* FIXME: Implement this, don't just return constant */
*(PBOOL)pvParam = FALSE;
break;
case SPI_GETKEYBOARDCUES:
case SPI_SETDOUBLECLKWIDTH:
case SPI_SETDOUBLECLKHEIGHT:
case SPI_SETDOUBLECLICKTIME:
case SPI_SETDESKWALLPAPER:
case SPI_SETSCREENSAVERRUNNING:
case SPI_SETSCREENSAVETIMEOUT:
case SPI_SETFLATMENU:
case SPI_SETMOUSEHOVERTIME:
case SPI_SETMOUSEHOVERWIDTH:
case SPI_SETMOUSEHOVERHEIGHT:
case SPI_SETMOUSE:
case SPI_SETMOUSESPEED:
case SPI_SETMOUSEBUTTONSWAP:
/* 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:
case SPI_GETMOUSEHOVERTIME:
case SPI_GETMOUSEHOVERWIDTH:
case SPI_GETMOUSEHOVERHEIGHT:
case SPI_GETMOUSE:
case SPI_GETMOUSESPEED:
{
PSYSTEM_CURSORINFO CurInfo;
Status = IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation,
KernelMode,
0,
&WinStaObject);
if(!NT_SUCCESS(Status))
{
SetLastNtError(Status);
return (DWORD)FALSE;
}
switch(uiAction)
{
case SPI_GETKEYBOARDCUES:
ASSERT(pvParam);
*((BOOL*)pvParam) = TRUE;
case SPI_GETFLATMENU:
ASSERT(pvParam);
*((UINT*)pvParam) = WinStaObject->FlatMenu;
break;
case SPI_SETFLATMENU:
WinStaObject->FlatMenu = (BOOL)pvParam;
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_SETSCREENSAVEACTIVE:
WinStaObject->ScreenSaverActive = uiParam;
break;
case SPI_GETSCREENSAVEACTIVE:
if (pvParam != NULL) *((BOOL*)pvParam) = WinStaObject->ScreenSaverActive;
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);
CurInfo = IntGetSysCursorInfo(WinStaObject);
*((UINT*)pvParam) = CurInfo->WheelScroChars;
// FIXME add this value to scroll list as scroll value ??
break;
case SPI_SETDOUBLECLKWIDTH:
CurInfo = IntGetSysCursorInfo(WinStaObject);
/* FIXME limit the maximum value? */
CurInfo->DblClickWidth = uiParam;
break;
case SPI_SETDOUBLECLKHEIGHT:
CurInfo = IntGetSysCursorInfo(WinStaObject);
/* FIXME limit the maximum value? */
CurInfo->DblClickHeight = uiParam;
break;
case SPI_SETDOUBLECLICKTIME:
CurInfo = IntGetSysCursorInfo(WinStaObject);
/* FIXME limit the maximum time to 1000 ms? */
CurInfo->DblClickSpeed = uiParam;
break;
case SPI_GETMOUSEHOVERTIME:
CurInfo = IntGetSysCursorInfo(WinStaObject);
*((UINT*)pvParam) = CurInfo->MouseHoverTime;
break;
case SPI_SETMOUSEHOVERTIME:
/* see http://msdn2.microsoft.com/en-us/library/ms724947.aspx
* copy text from it, if some agument why xp and 2003 behovir diffent
* only if they do not have SP install
* " Windows Server 2003 and Windows XP: The operating system does not
* enforce the use of USER_TIMER_MAXIMUM and USER_TIMER_MINIMUM until
* Windows Server 2003 SP1 and Windows XP SP2 "
*/
CurInfo = IntGetSysCursorInfo(WinStaObject);
CurInfo->MouseHoverTime = uiParam;
if(CurInfo->MouseHoverTime < USER_TIMER_MINIMUM)
{
CurInfo->MouseHoverTime = USER_TIMER_MINIMUM;
}
if(CurInfo->MouseHoverTime > USER_TIMER_MAXIMUM)
{
CurInfo->MouseHoverTime = USER_TIMER_MAXIMUM;
}
break;
case SPI_GETMOUSEHOVERWIDTH:
CurInfo = IntGetSysCursorInfo(WinStaObject);
*(PUINT)pvParam = CurInfo->MouseHoverWidth;
break;
case SPI_GETMOUSEHOVERHEIGHT:
CurInfo = IntGetSysCursorInfo(WinStaObject);
*(PUINT)pvParam = CurInfo->MouseHoverHeight;
break;
case SPI_SETMOUSEHOVERWIDTH:
CurInfo = IntGetSysCursorInfo(WinStaObject);
CurInfo->MouseHoverWidth = uiParam;
break;
case SPI_SETMOUSEHOVERHEIGHT:
CurInfo = IntGetSysCursorInfo(WinStaObject);
CurInfo->MouseHoverHeight = uiParam;
break;
case SPI_SETMOUSEBUTTONSWAP:
CurInfo = IntGetSysCursorInfo(WinStaObject);
CurInfo->SwapButtons = uiParam;
break;
case SPI_SETMOUSE:
CurInfo = IntGetSysCursorInfo(WinStaObject);
CurInfo->CursorAccelerationInfo = *(PCURSORACCELERATION_INFO)pvParam;
break;
case SPI_GETMOUSE:
CurInfo = IntGetSysCursorInfo(WinStaObject);
*(PCURSORACCELERATION_INFO)pvParam = CurInfo->CursorAccelerationInfo;
break;
case SPI_SETMOUSESPEED:
CurInfo = IntGetSysCursorInfo(WinStaObject);
CurInfo->MouseSpeed = (UINT)pvParam;
/* Limit value to 1...20 range */
if(CurInfo->MouseSpeed < 1)
{
CurInfo->MouseSpeed = 1;
}
else if(CurInfo->MouseSpeed > 20)
{
CurInfo->MouseSpeed = 20;
}
break;
case SPI_GETMOUSESPEED:
CurInfo = IntGetSysCursorInfo(WinStaObject);
*(PUINT)pvParam = CurInfo->MouseSpeed;
break;
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;
UNICODE_STRING Key = RTL_CONSTANT_STRING(L"Control Panel\\Desktop");
UNICODE_STRING Tile = RTL_CONSTANT_STRING(L"TileWallpaper");
UNICODE_STRING Style = RTL_CONSTANT_STRING(L"WallpaperStyle");
UNICODE_STRING KeyPath;
OBJECT_ATTRIBUTES KeyAttributes;
OBJECT_ATTRIBUTES ObjectAttributes;
NTSTATUS Status;
HANDLE CurrentUserKey = NULL;
HANDLE KeyHandle = NULL;
PKEY_VALUE_PARTIAL_INFORMATION KeyValuePartialInfo;
ULONG Length = 0;
ULONG ResLength = 0;
ULONG TileNum = 0;
ULONG StyleNum = 0;
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;
BITMAPOBJ_UnlockBitmap(bmp);
/* change the bitmap's ownership */
GDIOBJ_SetOwnership(GdiHandleTable, hNewBitmap, NULL);
}
hOldBitmap = (HBITMAP)InterlockedExchange((LONG*)&WinStaObject->hbmWallpaper, (LONG)hNewBitmap);
if(hOldBitmap != NULL)
{
/* delete the old wallpaper */
NtGdiDeleteObject(hOldBitmap);
}
/* Set the style */
/*default value is center */
WinStaObject->WallpaperMode = wmCenter;
/* Get a handle to the current users settings */
RtlFormatCurrentUserKeyPath(&KeyPath);
InitializeObjectAttributes(&ObjectAttributes,&KeyPath,OBJ_CASE_INSENSITIVE,NULL,NULL);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -