- 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
#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
{
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
User32CallDDEPostFromKernel(PVOID Arguments, ULONG ArgumentLength);
NTSTATUS WINAPI
User32CallDDEGetFromKernel(PVOID Arguments, ULONG ArgumentLength);
+NTSTATUS WINAPI
+User32CallOBMFromKernel(PVOID Arguments, ULONG ArgumentLength);
#endif /* __INCLUDE_USER32_CALLBACK_H */
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];
DWORD dwKeyCache;
DWORD dwAsyncKeyCache;
ULONG cCaptures;
- OEMBITMAPINFO oembmi[93];
+ OEMBITMAPINFO oembmi[OBI_CTYPES];
RECT rcScreenReal;
USHORT BitCount;
USHORT dmLogPixels;
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 */
BOOL FASTCALL co_IntSetWndIcons(VOID);
VOID FASTCALL co_IntDeliverUserAPC(VOID);
+VOID FASTCALL co_IntSetupOBM(VOID);
User32DeliverUserAPC,
User32CallDDEPostFromKernel,
User32CallDDEGetFromKernel,
+ User32CallOBMFromKernel,
};
{
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);
+}