[Win32SS]
authorJames Tabor <james.tabor@reactos.org>
Thu, 6 Aug 2015 00:56:01 +0000 (00:56 +0000)
committerJames Tabor <james.tabor@reactos.org>
Thu, 6 Aug 2015 00:56:01 +0000 (00:56 +0000)
- 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
reactos/win32ss/include/ntuser.h
reactos/win32ss/user/ntuser/callback.c
reactos/win32ss/user/ntuser/callback.h
reactos/win32ss/user/user32/misc/dllmain.c

index 1af7552..20ec95a 100644 (file)
@@ -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 */
index 11994f3..47e16ef 100644 (file)
@@ -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;
index e0537fb..7ba7209 100644 (file)
@@ -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 */
index d60986b..2eee4e9 100644 (file)
@@ -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);
index 80c6e11..3f764a9 100644 (file)
@@ -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);
+}