From 86be9f20dac6543df962a2e9d618b391bb1c2375 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Wed, 27 Apr 2005 08:18:20 +0000 Subject: [PATCH] Removed the MESSAGEQUEUE structure, and store the corresponding information directly in the TEB, in the Win32ClientInfo field. --- dlls/kernel/task.c | 51 ++++-------------- dlls/ntdll/thread.c | 1 - dlls/user/Makefile.in | 1 - dlls/user/cursoricon.c | 28 +++++----- dlls/user/hook.c | 21 ++++---- dlls/user/hook16.c | 18 +++---- dlls/user/input.c | 4 +- dlls/user/message.c | 109 +++++++++++++++++++------------------ dlls/user/message.h | 26 --------- dlls/user/user16.c | 10 ++++ dlls/user/user_main.c | 5 +- dlls/user/user_private.h | 27 ++++++++++ dlls/user/wnd16.c | 2 +- include/thread.h | 45 +++++----------- windows/queue.c | 138 ----------------------------------------------- 15 files changed, 151 insertions(+), 335 deletions(-) delete mode 100644 windows/queue.c diff --git a/dlls/kernel/task.c b/dlls/kernel/task.c index 628e4d8bd45..37e9ba0826b 100644 --- a/dlls/kernel/task.c +++ b/dlls/kernel/task.c @@ -1021,16 +1021,8 @@ BOOL16 WINAPI DefineHandleTable16( WORD wOffset ) */ HQUEUE16 WINAPI SetTaskQueue16( HTASK16 hTask, HQUEUE16 hQueue ) { - HQUEUE16 hPrev; - TDB *pTask; - - if (!hTask) hTask = GetCurrentTask(); - if (!(pTask = TASK_GetPtr( hTask ))) return 0; - - hPrev = pTask->hQueue; - pTask->hQueue = hQueue; - - return hPrev; + FIXME( "stub, should not get called\n" ); + return 0xbeef; } @@ -1039,11 +1031,8 @@ HQUEUE16 WINAPI SetTaskQueue16( HTASK16 hTask, HQUEUE16 hQueue ) */ HQUEUE16 WINAPI GetTaskQueue16( HTASK16 hTask ) { - TDB *pTask; - - if (!hTask) hTask = GetCurrentTask(); - if (!(pTask = TASK_GetPtr( hTask ))) return 0; - return pTask->hQueue; + FIXME( "stub, should not get called\n" ); + return 0xbeef; } /*********************************************************************** @@ -1051,17 +1040,8 @@ HQUEUE16 WINAPI GetTaskQueue16( HTASK16 hTask ) */ HQUEUE16 WINAPI SetThreadQueue16( DWORD thread, HQUEUE16 hQueue ) { - HQUEUE16 oldQueue = NtCurrentTeb()->queue; - - if (thread && thread != GetCurrentThreadId()) - { - FIXME( "not supported on other thread %04lx\n", thread ); - return 0; - } - NtCurrentTeb()->queue = hQueue; - if ( GetTaskQueue16( NtCurrentTeb()->htask16 ) == oldQueue ) - SetTaskQueue16( NtCurrentTeb()->htask16, hQueue ); - return oldQueue; + FIXME( "stub, should not get called\n" ); + return 0xbeef; } /*********************************************************************** @@ -1069,12 +1049,8 @@ HQUEUE16 WINAPI SetThreadQueue16( DWORD thread, HQUEUE16 hQueue ) */ HQUEUE16 WINAPI GetThreadQueue16( DWORD thread ) { - if (thread && thread != GetCurrentThreadId()) - { - FIXME( "not supported on other thread %04lx\n", thread ); - return 0; - } - return NtCurrentTeb()->queue; + FIXME( "stub, should not get called\n" ); + return 0xbeef; } /*********************************************************************** @@ -1082,10 +1058,7 @@ HQUEUE16 WINAPI GetThreadQueue16( DWORD thread ) */ VOID WINAPI SetFastQueue16( DWORD thread, HQUEUE16 hQueue ) { - if (!thread || thread == GetCurrentThreadId()) - NtCurrentTeb()->queue = hQueue; - else - FIXME( "not supported on other thread %04lx\n", thread ); + FIXME( "stub, should not get called\n" ); } /*********************************************************************** @@ -1093,10 +1066,8 @@ VOID WINAPI SetFastQueue16( DWORD thread, HQUEUE16 hQueue ) */ HQUEUE16 WINAPI GetFastQueue16( void ) { - HQUEUE16 ret = NtCurrentTeb()->queue; - - if (!ret) FIXME("(): should initialize thread-local queue, expect failure!\n" ); - return ret; + FIXME( "stub, should not get called\n" ); + return 0xbeef; } /*********************************************************************** diff --git a/dlls/ntdll/thread.c b/dlls/ntdll/thread.c index 13d6f9d11db..712e3c38221 100644 --- a/dlls/ntdll/thread.c +++ b/dlls/ntdll/thread.c @@ -262,7 +262,6 @@ NTSTATUS WINAPI RtlCreateUserThread( HANDLE process, const SECURITY_DESCRIPTOR * teb->ClientId.UniqueProcess = (HANDLE)GetCurrentProcessId(); teb->ClientId.UniqueThread = (HANDLE)tid; - teb->exit_code = STILL_ACTIVE; teb->request_fd = request_pipe[1]; teb->reply_fd = -1; teb->wait_fd[0] = -1; diff --git a/dlls/user/Makefile.in b/dlls/user/Makefile.in index ff5a009184e..d03ef7d9a43 100644 --- a/dlls/user/Makefile.in +++ b/dlls/user/Makefile.in @@ -17,7 +17,6 @@ SPEC_SRCS16 = \ C_SRCS = \ $(TOPOBJDIR)/windows/driver.c \ $(TOPOBJDIR)/windows/multimon.c \ - $(TOPOBJDIR)/windows/queue.c \ $(TOPOBJDIR)/windows/syscolor.c \ $(TOPOBJDIR)/windows/user.c \ button.c \ diff --git a/dlls/user/cursoricon.c b/dlls/user/cursoricon.c index a55bd4964b0..b18f551f466 100644 --- a/dlls/user/cursoricon.c +++ b/dlls/user/cursoricon.c @@ -1378,7 +1378,7 @@ WORD WINAPI DestroyIcon32( HGLOBAL16 handle, UINT16 flags ) /* Check whether destroying active cursor */ - if ( QUEUE_Current()->cursor == HICON_32(handle) ) + if ( get_user_thread_info()->cursor == HICON_32(handle) ) { WARN_(cursor)("Destroying active cursor!\n" ); SetCursor( 0 ); @@ -1483,15 +1483,15 @@ DWORD WINAPI DumpIcon16( SEGPTR pInfo, WORD *lpLen, */ HCURSOR WINAPI SetCursor( HCURSOR hCursor /* [in] Handle of cursor to show */ ) { - MESSAGEQUEUE *queue = QUEUE_Current(); + struct user_thread_info *thread_info = get_user_thread_info(); HCURSOR hOldCursor; - if (hCursor == queue->cursor) return hCursor; /* No change */ + if (hCursor == thread_info->cursor) return hCursor; /* No change */ TRACE_(cursor)("%p\n", hCursor ); - hOldCursor = queue->cursor; - queue->cursor = hCursor; + hOldCursor = thread_info->cursor; + thread_info->cursor = hCursor; /* Change the cursor shape only if it is visible */ - if (queue->cursor_count >= 0 && USER_Driver.pSetCursor) + if (thread_info->cursor_count >= 0 && USER_Driver.pSetCursor) { USER_Driver.pSetCursor( (CURSORICONINFO*)GlobalLock16(HCURSOR_16(hCursor)) ); GlobalUnlock16(HCURSOR_16(hCursor)); @@ -1504,24 +1504,24 @@ HCURSOR WINAPI SetCursor( HCURSOR hCursor /* [in] Handle of cursor to show */ ) */ INT WINAPI ShowCursor( BOOL bShow ) { - MESSAGEQUEUE *queue = QUEUE_Current(); + struct user_thread_info *thread_info = get_user_thread_info(); - TRACE_(cursor)("%d, count=%d\n", bShow, queue->cursor_count ); + TRACE_(cursor)("%d, count=%d\n", bShow, thread_info->cursor_count ); if (bShow) { - if (++queue->cursor_count == 0 && USER_Driver.pSetCursor) /* Show it */ + if (++thread_info->cursor_count == 0 && USER_Driver.pSetCursor) /* Show it */ { - USER_Driver.pSetCursor((CURSORICONINFO*)GlobalLock16(HCURSOR_16(queue->cursor))); - GlobalUnlock16(HCURSOR_16(queue->cursor)); + USER_Driver.pSetCursor((CURSORICONINFO*)GlobalLock16(HCURSOR_16(thread_info->cursor))); + GlobalUnlock16(HCURSOR_16(thread_info->cursor)); } } else { - if (--queue->cursor_count == -1 && USER_Driver.pSetCursor) /* Hide it */ + if (--thread_info->cursor_count == -1 && USER_Driver.pSetCursor) /* Hide it */ USER_Driver.pSetCursor( NULL ); } - return queue->cursor_count; + return thread_info->cursor_count; } /*********************************************************************** @@ -1529,7 +1529,7 @@ INT WINAPI ShowCursor( BOOL bShow ) */ HCURSOR WINAPI GetCursor(void) { - return QUEUE_Current()->cursor; + return get_user_thread_info()->cursor; } diff --git a/dlls/user/hook.c b/dlls/user/hook.c index 8823fcef38d..7625fddb4ee 100644 --- a/dlls/user/hook.c +++ b/dlls/user/hook.c @@ -324,7 +324,7 @@ static void *get_hook_proc( void *proc, const WCHAR *module ) */ LRESULT HOOK_CallHooks( INT id, INT code, WPARAM wparam, LPARAM lparam, BOOL unicode ) { - MESSAGEQUEUE *queue = QUEUE_Current(); + struct user_thread_info *thread_info = get_user_thread_info(); HOOKPROC proc = NULL; HHOOK handle = 0; DWORD pid = 0, tid = 0; @@ -334,7 +334,6 @@ LRESULT HOOK_CallHooks( INT id, INT code, WPARAM wparam, LPARAM lparam, BOOL uni USER_CheckNotLock(); - if (!queue) return 0; SERVER_START_REQ( start_hook_chain ) { req->id = id; @@ -380,10 +379,10 @@ LRESULT HOOK_CallHooks( INT id, INT code, WPARAM wparam, LPARAM lparam, BOOL uni if (!module[0] || (proc = get_hook_proc( proc, module )) != NULL) { - HHOOK prev = queue->hook; - queue->hook = handle; + HHOOK prev = thread_info->hook; + thread_info->hook = handle; ret = call_hook( proc, id, code, wparam, lparam, unicode, unicode_hook ); - queue->hook = prev; + thread_info->hook = prev; } } @@ -492,7 +491,7 @@ BOOL WINAPI UnhookWindowsHookEx( HHOOK hhook ) */ LRESULT WINAPI CallNextHookEx( HHOOK hhook, INT code, WPARAM wparam, LPARAM lparam ) { - MESSAGEQUEUE *queue = QUEUE_Current(); + struct user_thread_info *thread_info = get_user_thread_info(); HOOKPROC proc = NULL; WCHAR module[MAX_PATH]; HHOOK handle = 0; @@ -501,11 +500,9 @@ LRESULT WINAPI CallNextHookEx( HHOOK hhook, INT code, WPARAM wparam, LPARAM lpar BOOL prev_unicode = FALSE, next_unicode = FALSE; LRESULT ret = 0; - if (!queue) return 0; - SERVER_START_REQ( get_next_hook ) { - req->handle = queue->hook; + req->handle = thread_info->hook; req->event = EVENT_MIN; wine_server_set_reply( req, module, sizeof(module)-sizeof(WCHAR) ); if (!wine_server_call_err( req )) @@ -550,10 +547,10 @@ LRESULT WINAPI CallNextHookEx( HHOOK hhook, INT code, WPARAM wparam, LPARAM lpar if (!module[0] || (proc = get_hook_proc( proc, module )) != NULL) { - HHOOK prev = queue->hook; - queue->hook = handle; + HHOOK prev = thread_info->hook; + thread_info->hook = handle; ret = call_hook( proc, id, code, wparam, lparam, prev_unicode, next_unicode ); - queue->hook = prev; + thread_info->hook = prev; } } return ret; diff --git a/dlls/user/hook16.c b/dlls/user/hook16.c index 073d91dfe3c..ab7a0fc3299 100644 --- a/dlls/user/hook16.c +++ b/dlls/user/hook16.c @@ -110,7 +110,7 @@ inline static void map_msg_32_to_16( const MSG *msg32, MSG16 *msg16 ) */ static LRESULT call_hook_16( INT id, INT code, WPARAM wp, LPARAM lp ) { - struct hook16_queue_info *info = QUEUE_Current()->hook16_info; + struct hook16_queue_info *info = get_user_thread_info()->hook16_info; WORD args[4]; LRESULT ret; INT prev_id = info->id; @@ -348,12 +348,11 @@ FARPROC16 WINAPI SetWindowsHook16( INT16 id, HOOKPROC16 proc ) */ HHOOK WINAPI SetWindowsHookEx16( INT16 id, HOOKPROC16 proc, HINSTANCE16 hInst, HTASK16 hTask ) { - MESSAGEQUEUE *queue = QUEUE_Current(); + struct user_thread_info *thread_info = get_user_thread_info(); struct hook16_queue_info *info; HHOOK hook; int index = id - WH_MINHOOK; - if (!queue) return 0; if (id < WH_MINHOOK || id > WH_MAXHOOK16) return 0; if (!hook_procs[index]) { @@ -367,10 +366,10 @@ HHOOK WINAPI SetWindowsHookEx16( INT16 id, HOOKPROC16 proc, HINSTANCE16 hInst, H return 0; } - if (!(info = queue->hook16_info)) + if (!(info = thread_info->hook16_info)) { if (!(info = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*info) ))) return 0; - queue->hook16_info = info; + thread_info->hook16_info = info; } if (info->hook[index]) { @@ -389,12 +388,11 @@ HHOOK WINAPI SetWindowsHookEx16( INT16 id, HOOKPROC16 proc, HINSTANCE16 hInst, H */ BOOL16 WINAPI UnhookWindowsHook16( INT16 id, HOOKPROC16 proc ) { - MESSAGEQUEUE *queue = QUEUE_Current(); struct hook16_queue_info *info; int index = id - WH_MINHOOK; if (id < WH_MINHOOK || id > WH_MAXHOOK16) return FALSE; - if (!queue || !(info = queue->hook16_info)) return FALSE; + if (!(info = get_user_thread_info()->hook16_info)) return FALSE; if (info->proc[index] != proc) return FALSE; if (!UnhookWindowsHookEx( info->hook[index] )) return FALSE; info->hook[index] = 0; @@ -408,11 +406,10 @@ BOOL16 WINAPI UnhookWindowsHook16( INT16 id, HOOKPROC16 proc ) */ BOOL16 WINAPI UnhookWindowsHookEx16( HHOOK hhook ) { - MESSAGEQUEUE *queue = QUEUE_Current(); struct hook16_queue_info *info; int index; - if (!queue || !(info = queue->hook16_info)) return FALSE; + if (!(info = get_user_thread_info()->hook16_info)) return FALSE; for (index = 0; index < NB_HOOKS16; index++) { if (info->hook[index] == hhook) @@ -472,11 +469,10 @@ BOOL16 WINAPI CallMsgFilter16( MSG16 *msg, INT16 code ) */ LRESULT WINAPI CallNextHookEx16( HHOOK hhook, INT16 code, WPARAM16 wparam, LPARAM lparam ) { - MESSAGEQUEUE *queue = QUEUE_Current(); struct hook16_queue_info *info; LRESULT ret = 0; - if (!queue || !(info = queue->hook16_info)) return 0; + if (!(info = get_user_thread_info()->hook16_info)) return 0; switch (info->id) { diff --git a/dlls/user/input.c b/dlls/user/input.c index ab60cd084af..2499073520c 100644 --- a/dlls/user/input.c +++ b/dlls/user/input.c @@ -138,10 +138,8 @@ BOOL WINAPI GetCursorPos( POINT *pt ) */ BOOL WINAPI GetCursorInfo( PCURSORINFO pci ) { - MESSAGEQUEUE *queue = QUEUE_Current(); - if (!pci) return 0; - if (queue->cursor_count >= 0) pci->flags = CURSOR_SHOWING; + if (get_user_thread_info()->cursor_count >= 0) pci->flags = CURSOR_SHOWING; else pci->flags = 0; GetCursorPos(&pci->ptScreenPos); return 1; diff --git a/dlls/user/message.c b/dlls/user/message.c index d4d5e426e90..1be9873176a 100644 --- a/dlls/user/message.c +++ b/dlls/user/message.c @@ -1486,14 +1486,14 @@ static BOOL unpack_dde_message( HWND hwnd, UINT message, WPARAM *wparam, LPARAM static LRESULT call_window_proc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam, BOOL unicode, BOOL same_thread ) { + struct user_thread_info *thread_info = get_user_thread_info(); LRESULT result = 0; WNDPROC winproc; CWPSTRUCT cwp; CWPRETSTRUCT cwpret; - MESSAGEQUEUE *queue = QUEUE_Current(); - if (queue->recursion_count > MAX_SENDMSG_RECURSION) return 0; - queue->recursion_count++; + if (thread_info->recursion_count > MAX_SENDMSG_RECURSION) return 0; + thread_info->recursion_count++; if (msg & 0x80000000) { @@ -1529,7 +1529,7 @@ static LRESULT call_window_proc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lpar cwpret.hwnd = hwnd; HOOK_CallHooks( WH_CALLWNDPROCRET, HC_ACTION, same_thread, (LPARAM)&cwpret, unicode ); done: - queue->recursion_count--; + thread_info->recursion_count--; return result; } @@ -1903,7 +1903,7 @@ static BOOL peek_message( MSG *msg, HWND hwnd, UINT first, UINT last, int flags { LRESULT result; ULONG_PTR extra_info = 0; - MESSAGEQUEUE *queue = QUEUE_Current(); + struct user_thread_info *thread_info = get_user_thread_info(); struct received_message_info info, *old_info; unsigned int hw_id = 0; /* id of previous hardware message */ @@ -2023,10 +2023,10 @@ static BOOL peek_message( MSG *msg, HWND hwnd, UINT first, UINT last, int flags TRACE("dropping msg %x\n", info.msg.message ); goto next; /* ignore it */ } - queue->GetMessagePosVal = MAKELONG( info.msg.pt.x, info.msg.pt.y ); + thread_info->GetMessagePosVal = MAKELONG( info.msg.pt.x, info.msg.pt.y ); /* fall through */ case MSG_POSTED: - queue->GetMessageExtraInfoVal = extra_info; + thread_info->GetMessageExtraInfoVal = extra_info; if (info.msg.message >= WM_DDE_FIRST && info.msg.message <= WM_DDE_LAST) { if (!unpack_dde_message( info.msg.hwnd, info.msg.message, &info.msg.wParam, @@ -2044,12 +2044,12 @@ static BOOL peek_message( MSG *msg, HWND hwnd, UINT first, UINT last, int flags } /* if we get here, we have a sent message; call the window procedure */ - old_info = queue->receive_info; - queue->receive_info = &info; + old_info = thread_info->receive_info; + thread_info->receive_info = &info; result = call_window_proc( info.msg.hwnd, info.msg.message, info.msg.wParam, info.msg.lParam, (info.type != MSG_ASCII), FALSE ); reply_message( &info, result, TRUE ); - queue->receive_info = old_info; + thread_info->receive_info = old_info; next: HeapFree( GetProcessHeap(), 0, buffer ); } @@ -2069,15 +2069,38 @@ inline static void process_sent_messages(void) /*********************************************************************** + * get_server_queue_handle + * + * Get a handle to the server message queue for the current thread. + */ +static HANDLE get_server_queue_handle(void) +{ + struct user_thread_info *thread_info = get_user_thread_info(); + HANDLE ret; + + if (!(ret = thread_info->server_queue)) + { + SERVER_START_REQ( get_msg_queue ) + { + wine_server_call( req ); + ret = reply->handle; + } + SERVER_END_REQ; + thread_info->server_queue = ret; + if (!ret) ERR( "Cannot get server thread queue\n" ); + } + return ret; +} + + +/*********************************************************************** * wait_message_reply * * Wait until a sent message gets replied to. */ static void wait_message_reply( UINT flags ) { - MESSAGEQUEUE *queue; - - if (!(queue = QUEUE_Current())) return; + HANDLE server_queue = get_server_queue_handle(); for (;;) { @@ -2110,10 +2133,10 @@ static void wait_message_reply( UINT flags ) ReleaseThunkLock( &dwlc ); if (USER_Driver.pMsgWaitForMultipleObjectsEx) - res = USER_Driver.pMsgWaitForMultipleObjectsEx( 1, &queue->server_queue, + res = USER_Driver.pMsgWaitForMultipleObjectsEx( 1, &server_queue, INFINITE, QS_ALLINPUT, 0 ); else - res = WaitForSingleObject( queue->server_queue, INFINITE ); + res = WaitForSingleObject( server_queue, INFINITE ); if (dwlc) RestoreThunkLock( dwlc ); } @@ -2534,8 +2557,7 @@ BOOL WINAPI SendMessageCallbackW( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lpa */ BOOL WINAPI ReplyMessage( LRESULT result ) { - MESSAGEQUEUE *queue = QUEUE_Current(); - struct received_message_info *info = queue->receive_info; + struct received_message_info *info = get_user_thread_info()->receive_info; if (!info) return FALSE; reply_message( info, result, FALSE ); @@ -2557,8 +2579,7 @@ BOOL WINAPI InSendMessage(void) */ DWORD WINAPI InSendMessageEx( LPVOID reserved ) { - MESSAGEQUEUE *queue = QUEUE_Current(); - struct received_message_info *info = queue->receive_info; + struct received_message_info *info = get_user_thread_info()->receive_info; if (info) return info->flags; return ISMEX_NOSEND; @@ -2661,7 +2682,7 @@ void WINAPI PostQuitMessage( INT exitCode ) */ BOOL WINAPI PeekMessageW( MSG *msg_out, HWND hwnd, UINT first, UINT last, UINT flags ) { - MESSAGEQUEUE *queue; + struct user_thread_info *thread_info = get_user_thread_info(); MSG msg; USER_CheckNotLock(); @@ -2694,12 +2715,9 @@ BOOL WINAPI PeekMessageW( MSG *msg_out, HWND hwnd, UINT first, UINT last, UINT f else break; } - if ((queue = QUEUE_Current())) - { - queue->GetMessageTimeVal = msg.time; - msg.pt.x = LOWORD( queue->GetMessagePosVal ); - msg.pt.y = HIWORD( queue->GetMessagePosVal ); - } + thread_info->GetMessageTimeVal = msg.time; + msg.pt.x = LOWORD( thread_info->GetMessagePosVal ); + msg.pt.y = HIWORD( thread_info->GetMessagePosVal ); HOOK_CallHooks( WH_GETMESSAGE, HC_ACTION, flags & PM_REMOVE, (LPARAM)&msg, TRUE ); @@ -2733,7 +2751,7 @@ BOOL WINAPI PeekMessageA( MSG *msg, HWND hwnd, UINT first, UINT last, UINT flags */ BOOL WINAPI GetMessageW( MSG *msg, HWND hwnd, UINT first, UINT last ) { - MESSAGEQUEUE *queue = QUEUE_Current(); + HANDLE server_queue = get_server_queue_handle(); int mask = QS_POSTMESSAGE | QS_SENDMESSAGE; /* Always selected */ if (first || last) @@ -2769,15 +2787,15 @@ BOOL WINAPI GetMessageW( MSG *msg, HWND hwnd, UINT first, UINT last ) if (changed_bits & mask) continue; if (wake_bits & QS_SENDMESSAGE) continue; - TRACE( "(%04x) mask=%08x, bits=%08x, changed=%08x, waiting\n", - queue->self, mask, wake_bits, changed_bits ); + TRACE( "(%04lx) mask=%08x, bits=%08x, changed=%08x, waiting\n", + GetCurrentThreadId(), mask, wake_bits, changed_bits ); ReleaseThunkLock( &dwlc ); if (USER_Driver.pMsgWaitForMultipleObjectsEx) - USER_Driver.pMsgWaitForMultipleObjectsEx( 1, &queue->server_queue, INFINITE, + USER_Driver.pMsgWaitForMultipleObjectsEx( 1, &server_queue, INFINITE, QS_ALLINPUT, 0 ); else - WaitForSingleObject( queue->server_queue, INFINITE ); + WaitForSingleObject( server_queue, INFINITE ); if (dwlc) RestoreThunkLock( dwlc ); } @@ -3008,10 +3026,7 @@ LONG WINAPI DispatchMessageW( const MSG* msg ) */ DWORD WINAPI GetMessagePos(void) { - MESSAGEQUEUE *queue; - - if (!(queue = QUEUE_Current())) return 0; - return queue->GetMessagePosVal; + return get_user_thread_info()->GetMessagePosVal; } @@ -3032,10 +3047,7 @@ DWORD WINAPI GetMessagePos(void) */ LONG WINAPI GetMessageTime(void) { - MESSAGEQUEUE *queue; - - if (!(queue = QUEUE_Current())) return 0; - return queue->GetMessageTimeVal; + return get_user_thread_info()->GetMessageTimeVal; } @@ -3045,10 +3057,7 @@ LONG WINAPI GetMessageTime(void) */ LPARAM WINAPI GetMessageExtraInfo(void) { - MESSAGEQUEUE *queue; - - if (!(queue = QUEUE_Current())) return 0; - return queue->GetMessageExtraInfoVal; + return get_user_thread_info()->GetMessageExtraInfoVal; } @@ -3057,12 +3066,9 @@ LPARAM WINAPI GetMessageExtraInfo(void) */ LPARAM WINAPI SetMessageExtraInfo(LPARAM lParam) { - MESSAGEQUEUE *queue; - LONG old_value; - - if (!(queue = QUEUE_Current())) return 0; - old_value = queue->GetMessageExtraInfoVal; - queue->GetMessageExtraInfoVal = lParam; + struct user_thread_info *thread_info = get_user_thread_info(); + LONG old_value = thread_info->GetMessageExtraInfoVal; + thread_info->GetMessageExtraInfoVal = lParam; return old_value; } @@ -3088,7 +3094,6 @@ DWORD WINAPI MsgWaitForMultipleObjectsEx( DWORD count, CONST HANDLE *pHandles, { HANDLE handles[MAXIMUM_WAIT_OBJECTS]; DWORD i, ret, lock; - MESSAGEQUEUE *msgQueue; if (count > MAXIMUM_WAIT_OBJECTS-1) { @@ -3096,8 +3101,6 @@ DWORD WINAPI MsgWaitForMultipleObjectsEx( DWORD count, CONST HANDLE *pHandles, return WAIT_FAILED; } - if (!(msgQueue = QUEUE_Current())) return WAIT_FAILED; - /* set the queue mask */ SERVER_START_REQ( set_queue_mask ) { @@ -3110,7 +3113,7 @@ DWORD WINAPI MsgWaitForMultipleObjectsEx( DWORD count, CONST HANDLE *pHandles, /* Add the thread event to the handle list */ for (i = 0; i < count; i++) handles[i] = pHandles[i]; - handles[count] = msgQueue->server_queue; + handles[count] = get_server_queue_handle(); ReleaseThunkLock( &lock ); if (USER_Driver.pMsgWaitForMultipleObjectsEx) diff --git a/dlls/user/message.h b/dlls/user/message.h index ecbbde46123..b03ffd069c9 100644 --- a/dlls/user/message.h +++ b/dlls/user/message.h @@ -27,34 +27,8 @@ #include "winbase.h" #include "wine/windef16.h" -struct received_message_info; -struct hook16_queue_info; - -/* Message queue */ -typedef struct tagMESSAGEQUEUE -{ - HQUEUE16 self; /* Handle to self (was: reserved) */ - HANDLE server_queue; /* Handle to server-side queue */ - DWORD recursion_count; /* Counter to prevent infinite SendMessage recursion */ - HHOOK hook; /* Current hook */ - struct received_message_info *receive_info; /* Info about message being currently received */ - struct hook16_queue_info *hook16_info; /* Opaque pointer for 16-bit hook support */ - - DWORD GetMessageTimeVal; /* Value for GetMessageTime */ - DWORD GetMessagePosVal; /* Value for GetMessagePos */ - DWORD GetMessageExtraInfoVal; /* Value for GetMessageExtraInfo */ - - HCURSOR cursor; /* current cursor */ - INT cursor_count; /* cursor show count */ -} MESSAGEQUEUE; - - #define MAX_SENDMSG_RECURSION 64 -/* queue.c */ -extern MESSAGEQUEUE *QUEUE_Current(void); -extern void QUEUE_DeleteMsgQueue(void); - /* message.c */ extern LRESULT MSG_SendInternalMessageTimeout( DWORD dest_pid, DWORD dest_tid, UINT msg, WPARAM wparam, LPARAM lparam, diff --git a/dlls/user/user16.c b/dlls/user/user16.c index 98659949dd6..020765aec52 100644 --- a/dlls/user/user16.c +++ b/dlls/user/user16.c @@ -1097,6 +1097,16 @@ HCURSOR16 WINAPI CreateCursor16(HINSTANCE16 hInstance, } +/*********************************************************************** + * InitThreadInput (USER.409) + */ +HQUEUE16 WINAPI InitThreadInput16( WORD unknown, WORD flags ) +{ + /* nothing to do here */ + return 0xbeef; +} + + /******************************************************************* * InsertMenu (USER.410) */ diff --git a/dlls/user/user_main.c b/dlls/user/user_main.c index 70be706ffd7..9a63756219b 100644 --- a/dlls/user/user_main.c +++ b/dlls/user/user_main.c @@ -239,9 +239,6 @@ static BOOL process_attach(void) /* Initialize message spying */ if (!SPY_Init()) return FALSE; - /* Create message queue of initial thread */ - InitThreadInput16( 0, 0 ); - /* Create desktop window */ if (!WIN_CreateDesktopWindow()) return FALSE; @@ -268,7 +265,7 @@ static void thread_detach(void) WDML_NotifyThreadDetach(); WIN_DestroyThreadWindows( GetDesktopWindow() ); - QUEUE_DeleteMsgQueue(); + CloseHandle( get_user_thread_info()->server_queue ); exiting_thread_id = 0; } diff --git a/dlls/user/user_private.h b/dlls/user/user_private.h index 4b85db80a95..711f88bece7 100644 --- a/dlls/user/user_private.h +++ b/dlls/user/user_private.h @@ -26,6 +26,8 @@ #include "winbase.h" #include "wingdi.h" #include "winuser.h" +#include "winreg.h" +#include "winternl.h" #include "local.h" extern WORD USER_HeapSel; @@ -119,6 +121,31 @@ typedef struct tagUSER_DRIVER { extern USER_DRIVER USER_Driver; +struct received_message_info; +struct hook16_queue_info; + +/* this is the structure stored in TEB->Win32ClientInfo */ +/* no attempt is made to keep the layout compatible with the Windows one */ +struct user_thread_info +{ + HANDLE server_queue; /* 00 Handle to server-side queue */ + DWORD recursion_count; /* 04 SendMessage recursion counter */ + HHOOK hook; /* 08 Current hook */ + struct received_message_info *receive_info; /* 0c Message being currently received */ + struct hook16_queue_info *hook16_info; /* 10 Opaque pointer for 16-bit hook support */ + DWORD GetMessageTimeVal; /* 14 Value for GetMessageTime */ + DWORD GetMessagePosVal; /* 18 Value for GetMessagePos */ + DWORD GetMessageExtraInfoVal; /* 1c Value for GetMessageExtraInfo */ + HCURSOR cursor; /* 20 Current cursor */ + INT cursor_count; /* 24 Cursor show count */ + /* 28-7c Available for more data */ +}; + +static inline struct user_thread_info *get_user_thread_info(void) +{ + return (struct user_thread_info *)NtCurrentTeb()->Win32ClientInfo; +} + extern HMODULE user32_module; extern DWORD USER16_AlertableWait; extern HBRUSH SYSCOLOR_55AABrush; diff --git a/dlls/user/wnd16.c b/dlls/user/wnd16.c index 170f67b74e4..1042a5a6cde 100644 --- a/dlls/user/wnd16.c +++ b/dlls/user/wnd16.c @@ -20,10 +20,10 @@ #include "wine/winuser16.h" #include "wownt32.h" -#include "user_private.h" #include "win.h" #include "winproc.h" #include "stackframe.h" +#include "user_private.h" /* handle <--> handle16 conversions */ #define HANDLE_16(h32) (LOWORD(h32)) diff --git a/include/thread.h b/include/thread.h index 3548547c826..baaf6c13831 100644 --- a/include/thread.h +++ b/include/thread.h @@ -63,35 +63,15 @@ typedef struct _TEB NT_TIB Tib; /* 12- 00 Thread information block */ PVOID EnvironmentPointer; /* 12- 1c EnvironmentPointer (win95: tib flags + win16 mutex count) */ CLIENT_ID ClientId; /* -2- 20 Process and thread id (win95: debug context) */ - HQUEUE16 queue; /* 1!- 28 Message queue (NT: DWORD ActiveRpcHandle)*/ - WORD pad1; /* --n 2a */ - PVOID ThreadLocalStoragePointer; /* 1-- 2c Pointer to TLS array */ - PEB *Peb; /* 12- 30 owning process PEB */ - DWORD LastErrorValue; /* -2- 34 Last error code */ - DWORD exit_code; /* 1-- 38 Termination status */ - WORD teb_sel; /* 1-- 3c Selector to TEB */ - WORD emu_sel; /* 1-n 3e 80387 emulator selector */ - DWORD unknown1; /* --n 40 */ - DWORD unknown2; /* --n 44 */ - DWORD unknown3; /* --n 48 */ - int thread_errno; /* --3 4c Per-thread errno (was: ring0_thread) */ - int thread_h_errno; /* --3 50 Per-thread h_errno (was: ptr to tdbx structure) */ - void *stack_base; /* 1-n 54 Stack base (unused) */ - void *exit_stack; /* 1-n 58 Exit stack */ - void *emu_data; /* --n 5c Related to 80387 emulation */ - DWORD last_error; /* 1-- 60 Last error code */ - HANDLE debug_cb; /* 1-n 64 Debugger context block */ - DWORD debug_thread; /* 1-n 68 Thread debugging this one (?) */ - void *pcontext; /* 1-n 6c Thread register context */ - DWORD cur_stack; /* --3 70 Current stack (was: unknown) */ - DWORD ThunkConnect; /* 1-n 74 */ - DWORD NegStackBase; /* 1-n 78 */ - WORD current_ss; /* 1-n 7c Another 16-bit stack selector */ - WORD pad2; /* --n 7e */ - void *ss_table; /* --n 80 Pointer to info about 16-bit stack */ - WORD stack_sel; /* --3 84 16-bit stack selector */ - HTASK16 htask16; /* --3 86 Win16 task handle */ - DWORD pad4[15]; /* --n 88 */ + PVOID ActiveRpcHandle; /* 028 */ + PVOID ThreadLocalStoragePointer; /* 02c Pointer to TLS array */ + PEB *Peb; /* 030 owning process PEB */ + DWORD LastErrorValue; /* 034 Last error code */ + ULONG CountOfOwnedCriticalSections; /* 038 */ + PVOID CsrClientThread; /* 03c */ + PVOID Win32ThreadInfo; /* 040 */ + ULONG Win32ClientInfo[0x1f]; /* 044 */ + PVOID WOW32Reserved; /* 0c0 */ ULONG CurrentLocale; /* -2- C4 */ DWORD pad5[48]; /* --n C8 */ DWORD delta_priority; /* 1-n 188 Priority delta */ @@ -105,7 +85,8 @@ typedef struct _TEB /* The following are Wine-specific fields (NT: GDI stuff) */ UINT code_page; /* --3 1fc Thread code page */ - DWORD unused[2]; /* --3 200 Was server buffer */ + DWORD cur_stack; /* --3 200 Current stack */ + DWORD teb_sel; /* --3 204 Selector to TEB */ DWORD gs_sel; /* --3 208 %gs selector for this thread */ int request_fd; /* --3 20c fd for sending server requests */ int reply_fd; /* --3 210 fd for receiving server replies */ @@ -117,10 +98,12 @@ typedef struct _TEB DWORD dpmi_vif; /* --3 22c Protected mode virtual interrupt flag */ DWORD vm86_pending; /* --3 230 Data for vm86 mode */ void *vm86_ptr; /* --3 234 Data for vm86 mode */ + WORD stack_sel; /* --3 238 16-bit stack selector */ + HTASK16 htask16; /* --3 23a Win16 task handle */ /* here is plenty space for wine specific fields (don't forget to change pad6!!) */ /* the following are nt specific fields */ - DWORD pad6[623]; /* --n 238 */ + DWORD pad6[622]; /* --n 23c */ ULONG LastStatusValue; /* -2- bf4 */ UNICODE_STRING StaticUnicodeString; /* -2- bf8 used by advapi32 */ WCHAR StaticUnicodeBuffer[261]; /* -2- c00 used by advapi32 */ diff --git a/windows/queue.c b/windows/queue.c deleted file mode 100644 index af60eae36bb..00000000000 --- a/windows/queue.c +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Message queues related functions - * - * Copyright 1993, 1994 Alexandre Julliard - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "config.h" -#include "wine/port.h" - -#include -#include -#include -#include -#include "windef.h" -#include "winbase.h" -#include "wingdi.h" -#include "winerror.h" -#include "wine/winbase16.h" -#include "wine/winuser16.h" -#include "message.h" -#include "win.h" -#include "user_private.h" -#include "thread.h" -#include "wine/debug.h" -#include "wine/server.h" - -WINE_DEFAULT_DEBUG_CHANNEL(msg); - - -/*********************************************************************** - * QUEUE_CreateMsgQueue - * - * Creates a message queue. Doesn't link it into queue list! - */ -static HQUEUE16 QUEUE_CreateMsgQueue(void) -{ - HQUEUE16 hQueue; - HANDLE handle; - MESSAGEQUEUE * msgQueue; - - TRACE_(msg)("(): Creating message queue...\n"); - - if (!(hQueue = GlobalAlloc16( GMEM_FIXED | GMEM_ZEROINIT, - sizeof(MESSAGEQUEUE) ))) - return 0; - - msgQueue = (MESSAGEQUEUE *) GlobalLock16( hQueue ); - if ( !msgQueue ) - return 0; - - SERVER_START_REQ( get_msg_queue ) - { - wine_server_call_err( req ); - handle = reply->handle; - } - SERVER_END_REQ; - if (!handle) - { - ERR_(msg)("Cannot get thread queue\n"); - GlobalFree16( hQueue ); - return 0; - } - msgQueue->server_queue = handle; - msgQueue->self = hQueue; - return hQueue; -} - - -/*********************************************************************** - * QUEUE_Current - * - * Get the current thread queue, creating it if required. - * QUEUE_Unlock is not needed since the queue can only be deleted by - * the current thread anyway. - */ -MESSAGEQUEUE *QUEUE_Current(void) -{ - HQUEUE16 hQueue = NtCurrentTeb()->queue; - - if (!hQueue) - { - if (!(hQueue = QUEUE_CreateMsgQueue())) return NULL; - SetThreadQueue16( 0, hQueue ); - } - - return GlobalLock16( hQueue ); -} - - - -/*********************************************************************** - * QUEUE_DeleteMsgQueue - * - * Delete a message queue. - */ -void QUEUE_DeleteMsgQueue(void) -{ - HQUEUE16 hQueue = NtCurrentTeb()->queue; - MESSAGEQUEUE * msgQueue; - - if (!hQueue) return; /* thread doesn't have a queue */ - - TRACE("(): Deleting message queue %04x\n", hQueue); - - if (!(msgQueue = GlobalLock16( hQueue ))) - { - ERR("invalid thread queue\n"); - return; - } - - SetThreadQueue16( 0, 0 ); - CloseHandle( msgQueue->server_queue ); - GlobalFree16( hQueue ); -} - - -/*********************************************************************** - * InitThreadInput (USER.409) - */ -HQUEUE16 WINAPI InitThreadInput16( WORD unknown, WORD flags ) -{ - MESSAGEQUEUE *queue = QUEUE_Current(); - return queue ? queue->self : 0; -} -- 2.11.4.GIT