2003-05-11 10:47:33 +00:00
|
|
|
/* $Id: message.c,v 1.15 2003/05/11 10:47:33 jfilby Exp $
|
2001-06-12 17:51:51 +00:00
|
|
|
*
|
|
|
|
* COPYRIGHT: See COPYING in the top level directory
|
|
|
|
* PROJECT: ReactOS kernel
|
|
|
|
* PURPOSE: Messages
|
|
|
|
* FILE: subsys/win32k/ntuser/message.c
|
|
|
|
* PROGRAMER: Casper S. Hornstrup (chorns@users.sourceforge.net)
|
|
|
|
* REVISION HISTORY:
|
|
|
|
* 06-06-2001 CSH Created
|
|
|
|
*/
|
2002-01-13 22:52:08 +00:00
|
|
|
|
|
|
|
/* INCLUDES ******************************************************************/
|
|
|
|
|
2001-06-12 17:51:51 +00:00
|
|
|
#include <ddk/ntddk.h>
|
|
|
|
#include <win32k/win32k.h>
|
2002-01-13 22:52:08 +00:00
|
|
|
#include <include/guicheck.h>
|
|
|
|
#include <include/msgqueue.h>
|
2001-06-12 17:51:51 +00:00
|
|
|
#include <include/window.h>
|
|
|
|
#include <include/class.h>
|
|
|
|
#include <include/error.h>
|
|
|
|
#include <include/object.h>
|
|
|
|
#include <include/winsta.h>
|
2002-01-27 01:11:24 +00:00
|
|
|
#include <include/callback.h>
|
2002-07-04 19:56:38 +00:00
|
|
|
#include <include/painting.h>
|
2001-06-12 17:51:51 +00:00
|
|
|
|
2003-05-04 15:42:21 +00:00
|
|
|
#define NDEBUG
|
2001-06-12 17:51:51 +00:00
|
|
|
#include <debug.h>
|
|
|
|
|
2002-01-13 22:52:08 +00:00
|
|
|
/* FUNCTIONS *****************************************************************/
|
2001-06-12 17:51:51 +00:00
|
|
|
|
|
|
|
NTSTATUS
|
2002-01-13 22:52:08 +00:00
|
|
|
W32kInitMessageImpl(VOID)
|
2001-06-12 17:51:51 +00:00
|
|
|
{
|
2002-01-13 22:52:08 +00:00
|
|
|
return(STATUS_SUCCESS);
|
2001-06-12 17:51:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
NTSTATUS
|
2002-01-13 22:52:08 +00:00
|
|
|
W32kCleanupMessageImpl(VOID)
|
2001-06-12 17:51:51 +00:00
|
|
|
{
|
2002-01-13 22:52:08 +00:00
|
|
|
return(STATUS_SUCCESS);
|
2001-06-12 17:51:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2002-01-13 22:52:08 +00:00
|
|
|
LRESULT STDCALL
|
2002-09-17 23:43:29 +00:00
|
|
|
NtUserDispatchMessage(CONST MSG* lpMsg)
|
2001-06-12 17:51:51 +00:00
|
|
|
{
|
2002-01-27 01:11:24 +00:00
|
|
|
LRESULT Result;
|
2002-07-04 19:56:38 +00:00
|
|
|
ULONG PaintingFlag;
|
|
|
|
PWINDOW_OBJECT WindowObject;
|
|
|
|
NTSTATUS Status;
|
2002-01-27 01:11:24 +00:00
|
|
|
|
|
|
|
/* Process timer messages. */
|
|
|
|
if (lpMsg->message == WM_TIMER)
|
|
|
|
{
|
|
|
|
if (lpMsg->lParam)
|
|
|
|
{
|
|
|
|
/* FIXME: Call hooks. */
|
|
|
|
|
|
|
|
/* FIXME: Check for continuing validity of timer. */
|
|
|
|
|
|
|
|
return(W32kCallWindowProc((WNDPROC)lpMsg->lParam,
|
|
|
|
lpMsg->hwnd,
|
|
|
|
lpMsg->message,
|
|
|
|
lpMsg->wParam,
|
|
|
|
0 /* GetTickCount() */));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2002-07-04 19:56:38 +00:00
|
|
|
/* Get the window object. */
|
|
|
|
Status =
|
|
|
|
ObmReferenceObjectByHandle(PsGetWin32Process()->WindowStation->HandleTable,
|
|
|
|
lpMsg->hwnd,
|
|
|
|
otWindow,
|
|
|
|
(PVOID*)&WindowObject);
|
|
|
|
if (!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
return(0);
|
|
|
|
}
|
2002-01-27 01:11:24 +00:00
|
|
|
|
|
|
|
/* FIXME: Check for paint message. */
|
2002-07-04 19:56:38 +00:00
|
|
|
PaintingFlag = (lpMsg->message == WM_PAINT);
|
|
|
|
if (PaintingFlag)
|
|
|
|
{
|
|
|
|
WindowObject->Flags |= WINDOWOBJECT_NEED_BEGINPAINT;
|
|
|
|
}
|
2002-01-27 01:11:24 +00:00
|
|
|
|
2002-07-04 19:56:38 +00:00
|
|
|
/* FIXME: Call hook procedures. */
|
|
|
|
|
|
|
|
/* Call the window procedure. */
|
2002-01-27 01:11:24 +00:00
|
|
|
Result = W32kCallWindowProc(NULL /* WndProc */,
|
|
|
|
lpMsg->hwnd,
|
|
|
|
lpMsg->message,
|
|
|
|
lpMsg->wParam,
|
|
|
|
lpMsg->lParam);
|
|
|
|
|
2002-07-04 19:56:38 +00:00
|
|
|
if (PaintingFlag && WindowObject->Flags & WINDOWOBJECT_NEED_BEGINPAINT &&
|
|
|
|
WindowObject->UpdateRegion)
|
|
|
|
{
|
|
|
|
DbgBreakPoint();
|
|
|
|
}
|
2002-01-27 01:11:24 +00:00
|
|
|
|
|
|
|
return(Result);
|
2001-06-12 17:51:51 +00:00
|
|
|
}
|
|
|
|
|
2001-12-20 03:56:10 +00:00
|
|
|
BOOL STDCALL
|
|
|
|
NtUserGetMessage(LPMSG lpMsg,
|
|
|
|
HWND hWnd,
|
|
|
|
UINT wMsgFilterMin,
|
|
|
|
UINT wMsgFilterMax)
|
2002-01-13 22:52:08 +00:00
|
|
|
/*
|
|
|
|
* FUNCTION: Get a message from the calling thread's message queue.
|
|
|
|
* ARGUMENTS:
|
|
|
|
* lpMsg - Pointer to the structure which receives the returned message.
|
|
|
|
* hWnd - Window whose messages are to be retrieved.
|
|
|
|
* wMsgFilterMin - Integer value of the lowest message value to be
|
|
|
|
* retrieved.
|
|
|
|
* wMsgFilterMax - Integer value of the highest message value to be
|
|
|
|
* retrieved.
|
|
|
|
*/
|
2001-06-12 17:51:51 +00:00
|
|
|
{
|
2002-01-13 22:52:08 +00:00
|
|
|
PUSER_MESSAGE_QUEUE ThreadQueue;
|
|
|
|
BOOLEAN Present;
|
|
|
|
PUSER_MESSAGE Message;
|
|
|
|
NTSTATUS Status;
|
|
|
|
|
2002-01-27 01:11:24 +00:00
|
|
|
/* Initialize the thread's win32 state if necessary. */
|
2002-01-13 22:52:08 +00:00
|
|
|
W32kGuiCheck();
|
|
|
|
|
|
|
|
ThreadQueue = (PUSER_MESSAGE_QUEUE)PsGetWin32Thread()->MessageQueue;
|
|
|
|
|
|
|
|
do
|
|
|
|
{
|
2002-07-04 19:56:38 +00:00
|
|
|
/* Dispatch sent messages here. */
|
|
|
|
while (MsqDispatchOneSentMessage(ThreadQueue));
|
2002-01-13 22:52:08 +00:00
|
|
|
|
|
|
|
/* Now look for a quit message. */
|
|
|
|
/* FIXME: WINE checks the message number filter here. */
|
|
|
|
if (ThreadQueue->QuitPosted)
|
|
|
|
{
|
|
|
|
lpMsg->hwnd = hWnd;
|
|
|
|
lpMsg->message = WM_QUIT;
|
|
|
|
lpMsg->wParam = ThreadQueue->QuitExitCode;
|
|
|
|
lpMsg->lParam = 0;
|
|
|
|
ThreadQueue->QuitPosted = FALSE;
|
|
|
|
return(FALSE);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Now check for normal messages. */
|
|
|
|
Present = MsqFindMessage(ThreadQueue,
|
|
|
|
FALSE,
|
|
|
|
TRUE,
|
|
|
|
hWnd,
|
|
|
|
wMsgFilterMin,
|
|
|
|
wMsgFilterMax,
|
|
|
|
&Message);
|
|
|
|
if (Present)
|
|
|
|
{
|
|
|
|
RtlCopyMemory(lpMsg, &Message->Msg, sizeof(MSG));
|
|
|
|
ExFreePool(Message);
|
|
|
|
return(TRUE);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Check for hardware events. */
|
|
|
|
Present = MsqFindMessage(ThreadQueue,
|
|
|
|
TRUE,
|
|
|
|
TRUE,
|
|
|
|
hWnd,
|
|
|
|
wMsgFilterMin,
|
|
|
|
wMsgFilterMax,
|
|
|
|
&Message);
|
|
|
|
if (Present)
|
|
|
|
{
|
|
|
|
RtlCopyMemory(lpMsg, &Message->Msg, sizeof(MSG));
|
|
|
|
ExFreePool(Message);
|
|
|
|
return(TRUE);
|
|
|
|
}
|
|
|
|
|
2002-07-04 19:56:38 +00:00
|
|
|
/* Check for sent messages again. */
|
|
|
|
while (MsqDispatchOneSentMessage(ThreadQueue));
|
2002-01-13 22:52:08 +00:00
|
|
|
|
2002-07-04 19:56:38 +00:00
|
|
|
/* Check for paint messages. */
|
|
|
|
if (ThreadQueue->PaintPosted)
|
|
|
|
{
|
2002-08-26 23:20:54 +00:00
|
|
|
PWINDOW_OBJECT WindowObject;
|
|
|
|
|
2002-07-04 19:56:38 +00:00
|
|
|
lpMsg->hwnd = PaintingFindWinToRepaint(hWnd, PsGetWin32Thread());
|
|
|
|
lpMsg->message = WM_PAINT;
|
|
|
|
lpMsg->wParam = lpMsg->lParam = 0;
|
2002-08-26 23:20:54 +00:00
|
|
|
|
|
|
|
WindowObject = W32kGetWindowObject(lpMsg->hwnd);
|
|
|
|
if (WindowObject != NULL)
|
|
|
|
{
|
|
|
|
if (WindowObject->Style & WS_MINIMIZE &&
|
|
|
|
(HICON)NtUserGetClassLong(lpMsg->hwnd, GCL_HICON) != NULL)
|
|
|
|
{
|
|
|
|
lpMsg->message = WM_PAINTICON;
|
|
|
|
lpMsg->wParam = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (lpMsg->hwnd == NULL || lpMsg->hwnd == hWnd ||
|
|
|
|
W32kIsChildWindow(hWnd, lpMsg->hwnd))
|
|
|
|
{
|
|
|
|
if (WindowObject->Flags & WINDOWOBJECT_NEED_INTERNALPAINT &&
|
|
|
|
WindowObject->UpdateRegion == NULL)
|
|
|
|
{
|
|
|
|
WindowObject->Flags &= ~WINDOWOBJECT_NEED_INTERNALPAINT;
|
|
|
|
MsqDecPaintCountQueue(WindowObject->MessageQueue);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
W32kReleaseWindowObject(WindowObject);
|
|
|
|
}
|
|
|
|
|
2002-07-04 19:56:38 +00:00
|
|
|
return(TRUE);
|
|
|
|
}
|
2002-01-13 22:52:08 +00:00
|
|
|
|
|
|
|
/* Nothing found so far. Wait for new messages. */
|
|
|
|
Status = MsqWaitForNewMessages(ThreadQueue);
|
|
|
|
}
|
2002-10-31 00:03:31 +00:00
|
|
|
while (Status >= STATUS_WAIT_0 && Status <= STATUS_WAIT_63);
|
2002-01-13 22:52:08 +00:00
|
|
|
return((BOOLEAN)(-1));
|
2001-06-12 17:51:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
DWORD
|
|
|
|
STDCALL
|
|
|
|
NtUserMessageCall(
|
|
|
|
DWORD Unknown0,
|
|
|
|
DWORD Unknown1,
|
|
|
|
DWORD Unknown2,
|
|
|
|
DWORD Unknown3,
|
|
|
|
DWORD Unknown4,
|
|
|
|
DWORD Unknown5,
|
|
|
|
DWORD Unknown6)
|
|
|
|
{
|
|
|
|
UNIMPLEMENTED
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2002-01-13 22:52:08 +00:00
|
|
|
BOOL STDCALL
|
|
|
|
NtUserPeekMessage(LPMSG lpMsg,
|
2002-06-06 17:50:16 +00:00
|
|
|
HWND hWnd,
|
|
|
|
UINT wMsgFilterMin,
|
|
|
|
UINT wMsgFilterMax,
|
|
|
|
UINT wRemoveMsg)
|
|
|
|
/*
|
|
|
|
* FUNCTION: Get a message from the calling thread's message queue.
|
|
|
|
* ARGUMENTS:
|
|
|
|
* lpMsg - Pointer to the structure which receives the returned message.
|
|
|
|
* hWnd - Window whose messages are to be retrieved.
|
|
|
|
* wMsgFilterMin - Integer value of the lowest message value to be
|
|
|
|
* retrieved.
|
|
|
|
* wMsgFilterMax - Integer value of the highest message value to be
|
|
|
|
* retrieved.
|
|
|
|
* wRemoveMsg - Specificies whether or not to remove messages from the queue after processing
|
|
|
|
*/
|
2001-06-12 17:51:51 +00:00
|
|
|
{
|
2002-06-06 17:50:16 +00:00
|
|
|
PUSER_MESSAGE_QUEUE ThreadQueue;
|
|
|
|
BOOLEAN Present;
|
|
|
|
PUSER_MESSAGE Message;
|
|
|
|
BOOLEAN RemoveMessages;
|
|
|
|
|
|
|
|
/* Initialize the thread's win32 state if necessary. */
|
|
|
|
W32kGuiCheck();
|
|
|
|
|
|
|
|
ThreadQueue = (PUSER_MESSAGE_QUEUE)PsGetWin32Thread()->MessageQueue;
|
|
|
|
|
|
|
|
/* Inspect wRemoveMsg flags */
|
|
|
|
/* FIXME: The only flag we process is PM_REMOVE - processing of others must still be implemented */
|
|
|
|
RemoveMessages = wRemoveMsg & PM_REMOVE;
|
|
|
|
|
2003-05-10 21:47:04 +00:00
|
|
|
/* Dispatch sent messages here. */
|
|
|
|
while (MsqDispatchOneSentMessage(ThreadQueue));
|
2002-06-06 17:50:16 +00:00
|
|
|
|
|
|
|
/* Now look for a quit message. */
|
|
|
|
/* FIXME: WINE checks the message number filter here. */
|
|
|
|
if (ThreadQueue->QuitPosted)
|
|
|
|
{
|
|
|
|
lpMsg->hwnd = hWnd;
|
|
|
|
lpMsg->message = WM_QUIT;
|
|
|
|
lpMsg->wParam = ThreadQueue->QuitExitCode;
|
|
|
|
lpMsg->lParam = 0;
|
|
|
|
ThreadQueue->QuitPosted = FALSE;
|
|
|
|
return(FALSE);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Now check for normal messages. */
|
|
|
|
Present = MsqFindMessage(ThreadQueue,
|
|
|
|
FALSE,
|
|
|
|
RemoveMessages,
|
|
|
|
hWnd,
|
|
|
|
wMsgFilterMin,
|
|
|
|
wMsgFilterMax,
|
|
|
|
&Message);
|
|
|
|
if (Present)
|
|
|
|
{
|
|
|
|
RtlCopyMemory(lpMsg, &Message->Msg, sizeof(MSG));
|
|
|
|
ExFreePool(Message);
|
|
|
|
return(TRUE);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Check for hardware events. */
|
|
|
|
Present = MsqFindMessage(ThreadQueue,
|
|
|
|
TRUE,
|
|
|
|
RemoveMessages,
|
|
|
|
hWnd,
|
|
|
|
wMsgFilterMin,
|
|
|
|
wMsgFilterMax,
|
|
|
|
&Message);
|
|
|
|
if (Present)
|
|
|
|
{
|
|
|
|
RtlCopyMemory(lpMsg, &Message->Msg, sizeof(MSG));
|
|
|
|
ExFreePool(Message);
|
|
|
|
return(TRUE);
|
|
|
|
}
|
|
|
|
|
2003-05-10 21:47:04 +00:00
|
|
|
/* Check for sent messages again. */
|
|
|
|
while (MsqDispatchOneSentMessage(ThreadQueue));
|
2002-06-06 17:50:16 +00:00
|
|
|
|
|
|
|
/* FIXME: Check for paint messages. */
|
|
|
|
|
2003-05-10 21:47:04 +00:00
|
|
|
return FALSE;
|
2001-06-12 17:51:51 +00:00
|
|
|
}
|
|
|
|
|
2002-01-13 22:52:08 +00:00
|
|
|
BOOL STDCALL
|
|
|
|
NtUserPostMessage(HWND hWnd,
|
|
|
|
UINT Msg,
|
|
|
|
WPARAM wParam,
|
|
|
|
LPARAM lParam)
|
2001-06-12 17:51:51 +00:00
|
|
|
{
|
2003-03-06 23:57:03 +00:00
|
|
|
PUSER_MESSAGE_QUEUE ThreadQueue;
|
|
|
|
|
2003-05-11 10:47:33 +00:00
|
|
|
switch (Msg)
|
|
|
|
{
|
|
|
|
case WM_NULL:
|
|
|
|
break;
|
|
|
|
|
|
|
|
case WM_QUIT:
|
|
|
|
ThreadQueue = (PUSER_MESSAGE_QUEUE)PsGetWin32Thread()->MessageQueue;
|
|
|
|
ThreadQueue->QuitPosted = TRUE;
|
|
|
|
ThreadQueue->QuitExitCode = wParam;
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
DPRINT1("Unhandled message: %u\n", Msg);
|
|
|
|
return FALSE;
|
|
|
|
}
|
2003-03-06 23:57:03 +00:00
|
|
|
|
2003-05-11 10:47:33 +00:00
|
|
|
return TRUE;
|
2001-06-12 17:51:51 +00:00
|
|
|
}
|
|
|
|
|
2002-01-13 22:52:08 +00:00
|
|
|
BOOL STDCALL
|
|
|
|
NtUserPostThreadMessage(DWORD idThread,
|
|
|
|
UINT Msg,
|
|
|
|
WPARAM wParam,
|
|
|
|
LPARAM lParam)
|
2001-06-12 17:51:51 +00:00
|
|
|
{
|
2002-01-13 22:52:08 +00:00
|
|
|
UNIMPLEMENTED;
|
2001-06-12 17:51:51 +00:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2002-01-13 22:52:08 +00:00
|
|
|
DWORD STDCALL
|
|
|
|
NtUserQuerySendMessage(DWORD Unknown0)
|
2001-06-12 17:51:51 +00:00
|
|
|
{
|
2002-01-13 22:52:08 +00:00
|
|
|
UNIMPLEMENTED;
|
2001-06-12 17:51:51 +00:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2002-07-04 19:56:38 +00:00
|
|
|
LRESULT STDCALL
|
2002-07-17 21:04:57 +00:00
|
|
|
W32kSendMessage(HWND hWnd,
|
|
|
|
UINT Msg,
|
|
|
|
WPARAM wParam,
|
|
|
|
LPARAM lParam,
|
|
|
|
BOOL KernelMessage)
|
2002-05-06 22:20:32 +00:00
|
|
|
{
|
2002-07-04 19:56:38 +00:00
|
|
|
LRESULT Result;
|
|
|
|
NTSTATUS Status;
|
|
|
|
PWINDOW_OBJECT Window;
|
|
|
|
|
|
|
|
/* FIXME: Check for a broadcast or topmost destination. */
|
|
|
|
|
|
|
|
/* FIXME: Call hooks. */
|
|
|
|
|
|
|
|
Status =
|
|
|
|
ObmReferenceObjectByHandle(PsGetWin32Process()->WindowStation->HandleTable,
|
|
|
|
hWnd,
|
|
|
|
otWindow,
|
|
|
|
(PVOID*)&Window);
|
|
|
|
if (!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
return(FALSE);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* FIXME: Check for an exiting window. */
|
|
|
|
|
2003-05-04 15:42:21 +00:00
|
|
|
if (NULL != PsGetWin32Thread() &&
|
|
|
|
Window->MessageQueue == PsGetWin32Thread()->MessageQueue)
|
2002-07-04 19:56:38 +00:00
|
|
|
{
|
2002-07-17 21:04:57 +00:00
|
|
|
if (KernelMessage)
|
|
|
|
{
|
|
|
|
Result = W32kCallTrampolineWindowProc(NULL, hWnd, Msg, wParam,
|
|
|
|
lParam);
|
|
|
|
return(Result);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
Result = W32kCallWindowProc(NULL, hWnd, Msg, wParam, lParam);
|
|
|
|
return(Result);
|
|
|
|
}
|
2002-07-04 19:56:38 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
PUSER_SENT_MESSAGE Message;
|
|
|
|
PKEVENT CompletionEvent;
|
2003-05-10 21:47:04 +00:00
|
|
|
|
2002-07-04 19:56:38 +00:00
|
|
|
CompletionEvent = ExAllocatePool(NonPagedPool, sizeof(KEVENT));
|
|
|
|
KeInitializeEvent(CompletionEvent, NotificationEvent, FALSE);
|
|
|
|
|
|
|
|
Message = ExAllocatePool(NonPagedPool, sizeof(USER_SENT_MESSAGE));
|
|
|
|
Message->Msg.hwnd = hWnd;
|
|
|
|
Message->Msg.message = Msg;
|
|
|
|
Message->Msg.wParam = wParam;
|
|
|
|
Message->Msg.lParam = lParam;
|
|
|
|
Message->CompletionEvent = CompletionEvent;
|
|
|
|
Message->Result = &Result;
|
|
|
|
Message->CompletionQueue = NULL;
|
|
|
|
Message->CompletionCallback = NULL;
|
|
|
|
MsqSendMessage(Window->MessageQueue, Message);
|
|
|
|
|
|
|
|
ObmDereferenceObject(Window);
|
|
|
|
Status = KeWaitForSingleObject(CompletionEvent,
|
|
|
|
UserRequest,
|
|
|
|
UserMode,
|
|
|
|
FALSE,
|
|
|
|
NULL);
|
|
|
|
if (Status == STATUS_WAIT_0)
|
|
|
|
{
|
|
|
|
return(Result);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
return(FALSE);
|
|
|
|
}
|
|
|
|
}
|
2002-05-06 22:20:32 +00:00
|
|
|
}
|
|
|
|
|
2002-07-17 21:04:57 +00:00
|
|
|
LRESULT STDCALL
|
|
|
|
NtUserSendMessage(HWND hWnd,
|
|
|
|
UINT Msg,
|
|
|
|
WPARAM wParam,
|
|
|
|
LPARAM lParam)
|
|
|
|
{
|
|
|
|
return(W32kSendMessage(hWnd, Msg, wParam, lParam, FALSE));
|
|
|
|
}
|
|
|
|
|
2002-01-13 22:52:08 +00:00
|
|
|
BOOL STDCALL
|
|
|
|
NtUserSendMessageCallback(HWND hWnd,
|
|
|
|
UINT Msg,
|
|
|
|
WPARAM wParam,
|
|
|
|
LPARAM lParam,
|
|
|
|
SENDASYNCPROC lpCallBack,
|
|
|
|
ULONG_PTR dwData)
|
2001-06-12 17:51:51 +00:00
|
|
|
{
|
2002-07-04 19:56:38 +00:00
|
|
|
return(0);
|
2001-06-12 17:51:51 +00:00
|
|
|
}
|
|
|
|
|
2002-01-13 22:52:08 +00:00
|
|
|
BOOL STDCALL
|
|
|
|
NtUserSendNotifyMessage(HWND hWnd,
|
|
|
|
UINT Msg,
|
|
|
|
WPARAM wParam,
|
|
|
|
LPARAM lParam)
|
2001-06-12 17:51:51 +00:00
|
|
|
{
|
2002-01-13 22:52:08 +00:00
|
|
|
UNIMPLEMENTED;
|
2001-06-12 17:51:51 +00:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2002-01-13 22:52:08 +00:00
|
|
|
BOOL STDCALL
|
2001-06-12 17:51:51 +00:00
|
|
|
NtUserWaitMessage(VOID)
|
|
|
|
{
|
2002-01-13 22:52:08 +00:00
|
|
|
UNIMPLEMENTED;
|
2001-06-12 17:51:51 +00:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* EOF */
|