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/me... ============================================================================== --- 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/ntu... ============================================================================== --- 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)