Read the registry to set the wallpaper mode in in WinSta. Modified: trunk/reactos/subsys/win32k/ntuser/misc.c _____
Modified: trunk/reactos/subsys/win32k/ntuser/misc.c --- trunk/reactos/subsys/win32k/ntuser/misc.c 2005-11-25 03:50:49 UTC (rev 19540) +++ trunk/reactos/subsys/win32k/ntuser/misc.c 2005-11-25 04:14:59 UTC (rev 19541) @@ -6,7 +6,7 @@
* FILE: subsys/win32k/ntuser/misc.c * PROGRAMER: Ge van Geldorp (ge@gse.nl) * REVISION HISTORY: - * 2003/05/22 Created + * 2003/05/22 CreatedStyleNum */
#include <w32k.h> @@ -928,7 +928,18 @@ the current wallpaper bitmap */ HBITMAP hOldBitmap, hNewBitmap; ASSERT(pvParam); - + UNICODE_STRING Key = RTL_CONSTANT_STRING(L"\Registry\User\.Default\Control Panel\Desktop"); + UNICODE_STRING Tile = RTL_CONSTANT_STRING(L"TileWallpaper"); + UNICODE_STRING Style = RTL_CONSTANT_STRING(L"WallpaperStyle"); + OBJECT_ATTRIBUTES KeyAttributes; + NTSTATUS Status; + HANDLE KeyHandle = NULL; + PKEY_VALUE_PARTIAL_INFORMATION KeyValuePartialInfo; + ULONG Length = 0; + ULONG ResLength = 0; + ULONG TileNum = 0; + ULONG StyleNum = 0; + hNewBitmap = *(HBITMAP*)pvParam; if(hNewBitmap != NULL) { @@ -953,6 +964,96 @@ /* delete the old wallpaper */ NtGdiDeleteObject(hOldBitmap); } + + /* Set the style */ + + /*default value is center */ + WinStaObject->WallpaperMode = wmCenter; + + /* find the tile value in the registry */ + InitializeObjectAttributes(&KeyAttributes, &Key, OBJ_CASE_INSENSITIVE, + NULL, NULL); + ZwOpenKey(&KeyHandle, KEY_READ, &KeyAttributes); + + Status = ZwQueryValueKey(KeyHandle, &Tile, KeyValuePartialInformation, + 0, 0, &ResLength); + + ResLength += sizeof(KEY_VALUE_PARTIAL_INFORMATION); + KeyValuePartialInfo = ExAllocatePoolWithTag(PagedPool, ResLength, TAG_STRING); + Length = ResLength; + + if(!KeyValuePartialInfo) + { + NtClose(KeyHandle); + return 0; + } + + Status = ZwQueryValueKey(KeyHandle, &Tile, KeyValuePartialInformation, + (PVOID)KeyValuePartialInfo, Length, &ResLength); + if(!NT_SUCCESS(Status) || (KeyValuePartialInfo->Type != REG_SZ)) + { + NtClose(KeyHandle); + ExFreePool(KeyValuePartialInfo); + return 0; + } + + Tile.Length = KeyValuePartialInfo->DataLength; + Tile.MaximumLength = KeyValuePartialInfo->DataLength; + Tile.Buffer = (PWSTR)KeyValuePartialInfo->Data; + + Status = RtlUnicodeStringToInteger(&Tile, 0, &TileNum); + if(!NT_SUCCESS(Status)) + { + TileNum = 0; + } + ExFreePool(KeyValuePartialInfo); + + /* start over again and look for the style*/ + ResLength = 0; + Status = ZwQueryValueKey(KeyHandle, &Style, KeyValuePartialInformation, + 0, 0, &ResLength); + + ResLength += sizeof(KEY_VALUE_PARTIAL_INFORMATION); + KeyValuePartialInfo = ExAllocatePoolWithTag(PagedPool, ResLength, TAG_STRING); + Length = ResLength; + + if(!KeyValuePartialInfo) + { + NtClose(KeyHandle); + return 0; + } + + Status = ZwQueryValueKey(KeyHandle, &Style, KeyValuePartialInformation, + (PVOID)KeyValuePartialInfo, Length, &ResLength); + if(!NT_SUCCESS(Status) || (KeyValuePartialInfo->Type != REG_SZ)) + { + NtClose(KeyHandle); + ExFreePool(KeyValuePartialInfo); + return 0; + } + + Style.Length = KeyValuePartialInfo->DataLength; + Style.MaximumLength = KeyValuePartialInfo->DataLength; + Style.Buffer = (PWSTR)KeyValuePartialInfo->Data; + + Status = RtlUnicodeStringToInteger(&Style, 0, &StyleNum); + if(!NT_SUCCESS(Status)) + { + StyleNum = 0; + } + ExFreePool(KeyValuePartialInfo); + + /* Check the values we found in the registry */ + if(TileNum && !StyleNum) + { + WinStaObject->WallpaperMode = wmTile; + } + else if(!TileNum && StyleNum == 2) + { + WinStaObject->WallpaperMode = wmStretch; + } + + NtClose(KeyHandle); break; } case SPI_GETDESKWALLPAPER: