From 6995f22fa9e769f8f94629926c84725aa628fff3 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Thu, 6 Aug 2015 00:56:01 +0000 Subject: [PATCH] [Win32SS] - Implement OEM bitmaps sizes for server information. If more is need, it will be added. This will be plugged in later. svn path=/trunk/; revision=68603 --- reactos/win32ss/include/callback.h | 10 ++++- reactos/win32ss/include/ntuser.h | 13 ++++++- reactos/win32ss/user/ntuser/callback.c | 45 ++++++++++++++++++++++ reactos/win32ss/user/ntuser/callback.h | 1 + reactos/win32ss/user/user32/misc/dllmain.c | 35 +++++++++++++++++ 5 files changed, 102 insertions(+), 2 deletions(-) diff --git a/reactos/win32ss/include/callback.h b/reactos/win32ss/include/callback.h index 1af7552ae7c..20ec95afe7b 100644 --- a/reactos/win32ss/include/callback.h +++ b/reactos/win32ss/include/callback.h @@ -16,7 +16,8 @@ #define USER32_CALLBACK_DELIVERUSERAPC (12) #define USER32_CALLBACK_DDEPOST (13) #define USER32_CALLBACK_DDEGET (14) -#define USER32_CALLBACK_MAXIMUM (14) +#define USER32_CALLBACK_SETOBM (15) +#define USER32_CALLBACK_MAXIMUM (15) typedef struct _WINDOWPROC_CALLBACK_ARGUMENTS { @@ -133,6 +134,11 @@ typedef struct _DDEPOSTGET_CALLBACK_ARGUMENTS BYTE buffer[1]; } DDEPOSTGET_CALLBACK_ARGUMENTS, *PDDEPOSTGET_CALLBACK_ARGUMENTS; +typedef struct _SETOBM_CALLBACK_ARGUMENTS +{ + struct tagOEMBITMAPINFO oembmi[93]; +} SETOBM_CALLBACK_ARGUMENTS, *PSETOBM_CALLBACK_ARGUMENTS; + NTSTATUS WINAPI User32CallCopyImageFromKernel(PVOID Arguments, ULONG ArgumentLength); NTSTATUS WINAPI @@ -163,4 +169,6 @@ NTSTATUS WINAPI User32CallDDEPostFromKernel(PVOID Arguments, ULONG ArgumentLength); NTSTATUS WINAPI User32CallDDEGetFromKernel(PVOID Arguments, ULONG ArgumentLength); +NTSTATUS WINAPI +User32CallOBMFromKernel(PVOID Arguments, ULONG ArgumentLength); #endif /* __INCLUDE_USER32_CALLBACK_H */ diff --git a/reactos/win32ss/include/ntuser.h b/reactos/win32ss/include/ntuser.h index 11994f3ff4a..47e16ef0640 100644 --- a/reactos/win32ss/include/ntuser.h +++ b/reactos/win32ss/include/ntuser.h @@ -902,6 +902,17 @@ typedef struct tagOEMBITMAPINFO INT cy; } OEMBITMAPINFO, *POEMBITMAPINFO; +typedef enum _OBI_TYPES +{ + OBI_CLOSE = 0, + OBI_UPARROW = 46, + OBI_UPARROWI = 49, + OBI_DNARROW = 50, + OBI_DNARROWI = 53, + OBI_MNARROW = 62, + OBI_CTYPES = 93 +} OBI_TYPES; + typedef struct tagMBSTRING { WCHAR szName[16]; @@ -953,7 +964,7 @@ typedef struct _PERUSERSERVERINFO DWORD dwKeyCache; DWORD dwAsyncKeyCache; ULONG cCaptures; - OEMBITMAPINFO oembmi[93]; + OEMBITMAPINFO oembmi[OBI_CTYPES]; RECT rcScreenReal; USHORT BitCount; USHORT dmLogPixels; diff --git a/reactos/win32ss/user/ntuser/callback.c b/reactos/win32ss/user/ntuser/callback.c index e0537fbb689..7ba72094d93 100644 --- a/reactos/win32ss/user/ntuser/callback.c +++ b/reactos/win32ss/user/ntuser/callback.c @@ -1148,4 +1148,49 @@ co_IntDeliverUserAPC(VOID) ERR("Delivering User APC callback failed!\n"); } } + +VOID FASTCALL +co_IntSetupOBM(VOID) +{ + NTSTATUS Status; + ULONG ArgumentLength, ResultLength; + PVOID Argument, ResultPointer; + PSETOBM_CALLBACK_ARGUMENTS Common; + + ResultPointer = NULL; + ResultLength = ArgumentLength = sizeof(SETOBM_CALLBACK_ARGUMENTS); + + Argument = IntCbAllocateMemory(ArgumentLength); + if (NULL == Argument) + { + ERR("Set Window Icons callback failed: out of memory\n"); + return; + } + Common = (PSETOBM_CALLBACK_ARGUMENTS) Argument; + + UserLeaveCo(); + + Status = KeUserModeCallback(USER32_CALLBACK_SETOBM, + Argument, + ArgumentLength, + &ResultPointer, + &ResultLength); + + + UserEnterCo(); + + if (!NT_SUCCESS(Status)) + { + ERR("Set Window Icons callback failed!\n"); + IntCbFreeMemory(Argument); + return; + } + + RtlMoveMemory(Common, ResultPointer, ArgumentLength); + RtlCopyMemory(gpsi->oembmi, Common->oembmi, sizeof(gpsi->oembmi)); + + IntCbFreeMemory(Argument); +} + + /* EOF */ diff --git a/reactos/win32ss/user/ntuser/callback.h b/reactos/win32ss/user/ntuser/callback.h index d60986b6fd9..2eee4e9b4dd 100644 --- a/reactos/win32ss/user/ntuser/callback.h +++ b/reactos/win32ss/user/ntuser/callback.h @@ -74,3 +74,4 @@ HANDLE FASTCALL co_IntCopyImage(HANDLE,UINT,INT,INT,UINT); BOOL FASTCALL co_IntSetWndIcons(VOID); VOID FASTCALL co_IntDeliverUserAPC(VOID); +VOID FASTCALL co_IntSetupOBM(VOID); diff --git a/reactos/win32ss/user/user32/misc/dllmain.c b/reactos/win32ss/user/user32/misc/dllmain.c index 80c6e115679..3f764a9b3b4 100644 --- a/reactos/win32ss/user/user32/misc/dllmain.c +++ b/reactos/win32ss/user/user32/misc/dllmain.c @@ -205,6 +205,7 @@ PVOID apfnDispatch[USER32_CALLBACK_MAXIMUM + 1] = User32DeliverUserAPC, User32CallDDEPostFromKernel, User32CallDDEGetFromKernel, + User32CallOBMFromKernel, }; @@ -602,3 +603,37 @@ User32DeliverUserAPC(PVOID Arguments, ULONG ArgumentLength) { return ZwCallbackReturn(0, 0, STATUS_SUCCESS); } + +NTSTATUS +WINAPI +User32CallOBMFromKernel(PVOID Arguments, ULONG ArgumentLength) +{ + BITMAP bmp; + PSETOBM_CALLBACK_ARGUMENTS Common = Arguments; + + GetObjectW(LoadBitmapW(0, MAKEINTRESOURCEW(OBM_CLOSE)), sizeof(bmp), &bmp); + Common->oembmi[OBI_CLOSE].cx = bmp.bmWidth; + Common->oembmi[OBI_CLOSE].cy = bmp.bmHeight; + + GetObjectW(LoadBitmapW(0, MAKEINTRESOURCEW(OBM_MNARROW)), sizeof(bmp), &bmp); + Common->oembmi[OBI_MNARROW].cx = bmp.bmWidth; + Common->oembmi[OBI_MNARROW].cy = bmp.bmHeight; + + GetObjectW(LoadBitmapW(0, MAKEINTRESOURCEW(OBM_DNARROW)), sizeof(bmp), &bmp); + Common->oembmi[OBI_DNARROW].cx = bmp.bmWidth; + Common->oembmi[OBI_DNARROW].cy = bmp.bmHeight; + + GetObjectW(LoadBitmapW(0, MAKEINTRESOURCEW(OBM_DNARROWI)), sizeof(bmp), &bmp); + Common->oembmi[OBI_DNARROWI].cx = bmp.bmWidth; + Common->oembmi[OBI_DNARROWI].cy = bmp.bmHeight; + + GetObjectW(LoadBitmapW(0, MAKEINTRESOURCEW(OBM_UPARROW)), sizeof(bmp), &bmp); + Common->oembmi[OBI_UPARROW].cx = bmp.bmWidth; + Common->oembmi[OBI_UPARROW].cy = bmp.bmHeight; + + GetObjectW(LoadBitmapW(0, MAKEINTRESOURCEW(OBM_UPARROWI)), sizeof(bmp), &bmp); + Common->oembmi[OBI_UPARROWI].cx = bmp.bmWidth; + Common->oembmi[OBI_UPARROWI].cy = bmp.bmHeight; + + return ZwCallbackReturn(Arguments, ArgumentLength, STATUS_SUCCESS); +}