Author: jimtabor
Date: Sat Aug 12 19:50:45 2006
New Revision: 23557
URL:
http://svn.reactos.org/svn/reactos?rev=23557&view=rev
Log:
Implement SendNotifyMessage. Needs more testing.
Modified:
trunk/reactos/dll/win32/user32/windows/message.c
trunk/reactos/subsystems/win32/win32k/ntuser/message.c
Modified: trunk/reactos/dll/win32/user32/windows/message.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/user32/windows/m…
==============================================================================
--- trunk/reactos/dll/win32/user32/windows/message.c (original)
+++ trunk/reactos/dll/win32/user32/windows/message.c Sat Aug 12 19:50:45 2006
@@ -1901,8 +1901,30 @@
WPARAM wParam,
LPARAM lParam)
{
- UNIMPLEMENTED;
- return FALSE;
+ MSG AnsiMsg, UcMsg;
+ MSG KMMsg;
+ LRESULT Result;
+
+ AnsiMsg.hwnd = hWnd;
+ AnsiMsg.message = Msg;
+ AnsiMsg.wParam = wParam;
+ AnsiMsg.lParam = lParam;
+ if (! MsgiAnsiToUnicodeMessage(&UcMsg, &AnsiMsg))
+ {
+ return FALSE;
+ }
+
+ if (! MsgiUMToKMMessage(&UcMsg, &KMMsg, TRUE))
+ {
+ MsgiAnsiToUnicodeCleanup(&UcMsg, &AnsiMsg);
+ return FALSE;
+ }
+ Result = NtUserSendNotifyMessage(KMMsg.hwnd, KMMsg.message,
+ KMMsg.wParam, KMMsg.lParam);
+ MsgiUMToKMCleanup(&UcMsg, &KMMsg);
+ MsgiAnsiToUnicodeCleanup(&UcMsg, &AnsiMsg);
+
+ return Result;
}
@@ -1917,8 +1939,22 @@
WPARAM wParam,
LPARAM lParam)
{
- UNIMPLEMENTED;
- return FALSE;
+ MSG UMMsg, KMMsg;
+ LRESULT Result;
+
+ UMMsg.hwnd = hWnd;
+ UMMsg.message = Msg;
+ UMMsg.wParam = wParam;
+ UMMsg.lParam = lParam;
+ if (! MsgiUMToKMMessage(&UMMsg, &KMMsg, TRUE))
+ {
+ return FALSE;
+ }
+ Result = NtUserSendNotifyMessage(KMMsg.hwnd, KMMsg.message,
+ KMMsg.wParam, KMMsg.lParam);
+ MsgiUMToKMCleanup(&UMMsg, &KMMsg);
+
+ return Result;
}
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/message.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/nt…
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/message.c (original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/message.c Sat Aug 12 19:50:45 2006
@@ -1103,13 +1103,19 @@
/* Copy data if required */
if (0 != (MsgMemoryEntry->Flags & MMS_FLAG_READ))
{
- Status = MmCopyFromCaller(KernelMem, (PVOID) UserModeMsg->lParam, Size);
- if (! NT_SUCCESS(Status))
- {
- DPRINT1("Failed to copy message to kernel: invalid usermode
buffer\n");
- ExFreePool(KernelMem);
- return Status;
- }
+
+ DPRINT1("Copy message to kernel from the User! %x from %x\n",
KernelMem, UserModeMsg->lParam);
+ RtlCopyMemory(KernelMem, (PVOID) UserModeMsg->lParam, Size);
+ Status = STATUS_SUCCESS;
+
+
+// Status = MmCopyFromCaller(KernelMem, (PVOID) UserModeMsg->lParam, Size);
+// if (! NT_SUCCESS(Status))
+// {
+// DPRINT1("Failed to copy message to kernel: invalid usermode
buffer\n");
+// ExFreePool(KernelMem);
+// return Status;
+// }
}
else
{
@@ -1700,16 +1706,98 @@
return 0;
}
+
+BOOL FASTCALL
+UserSendNotifyMessage(HWND hWnd,
+ UINT Msg,
+ WPARAM wParam,
+ LPARAM lParam)
+{
+ BOOL Result = TRUE;
+ // Basicly the same as IntPostOrSendMessage
+ if (hWnd == HWND_BROADCAST) //Handle Broadcast
+ {
+ HWND *List;
+ PWINDOW_OBJECT DesktopWindow;
+ ULONG i;
+
+ DesktopWindow = UserGetWindowObject(IntGetDesktopWindow());
+ List = IntWinListChildren(DesktopWindow);
+
+ if (List != NULL)
+ {
+ for (i = 0; List[i]; i++)
+ {
+ UserSendNotifyMessage(List[i], Msg, wParam, lParam);
+ }
+ ExFreePool(List);
+ }
+ }
+ else
+ {
+ ULONG_PTR PResult;
+ PWINDOW_OBJECT Window;
+ NTSTATUS Status;
+ MSG UserModeMsg;
+ MSG KernelModeMsg;
+ PMSGMEMORY MsgMemoryEntry;
+
+ if(!(Window = UserGetWindowObject(hWnd))) return FALSE;
+
+ if(Window->MessageQueue != PsGetCurrentThreadWin32Thread()->MessageQueue)
+ { // Send message w/o waiting for it.
+ Result = UserPostMessage(hWnd, Msg, wParam, lParam);
+ }
+ else
+ { // Handle message and callback.
+ UserModeMsg.hwnd = hWnd;
+ UserModeMsg.message = Msg;
+ UserModeMsg.wParam = wParam;
+ UserModeMsg.lParam = lParam;
+ MsgMemoryEntry = FindMsgMemory(UserModeMsg.message);
+ Status = CopyMsgToKernelMem(&KernelModeMsg, &UserModeMsg,
MsgMemoryEntry);
+ if (! NT_SUCCESS(Status))
+ {
+ SetLastWin32Error(ERROR_INVALID_PARAMETER);
+ return FALSE;
+ }
+ Result = co_IntSendMessageTimeoutSingle(
+ KernelModeMsg.hwnd, KernelModeMsg.message,
+ KernelModeMsg.wParam, KernelModeMsg.lParam,
+ SMTO_NORMAL, 0, &PResult);
+
+ Status = CopyMsgToUserMem(&UserModeMsg, &KernelModeMsg);
+ if (! NT_SUCCESS(Status))
+ {
+ SetLastWin32Error(ERROR_INVALID_PARAMETER);
+ return FALSE;
+ }
+ }
+ }
+ return Result;
+}
+
+
BOOL STDCALL
NtUserSendNotifyMessage(HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam)
{
- UNIMPLEMENTED;
-
- return 0;
-}
+ DECLARE_RETURN(BOOL);
+
+ DPRINT("EnterNtUserSendNotifyMessage\n");
+ UserEnterExclusive();
+
+ RETURN(UserSendNotifyMessage(hWnd, Msg, wParam, lParam));
+
+CLEANUP:
+ DPRINT("Leave NtUserSendNotifyMessage, ret=%i\n",_ret_);
+ UserLeave();
+ END_CLEANUP;
+
+}
+
BOOL STDCALL
NtUserWaitMessage(VOID)