Treat 0xffff the same as 0 for the handle generation field to avoid

sign extension problems.
This commit is contained in:
Alexandre Julliard 2005-05-07 15:03:00 +00:00
parent c0cb4d352b
commit 90af05f060
2 changed files with 8 additions and 5 deletions

View File

@ -307,13 +307,14 @@ WND *WIN_GetPtr( HWND hwnd )
USER_Lock(); USER_Lock();
if ((ptr = user_handles[index])) if ((ptr = user_handles[index]))
{ {
if (ptr->dwMagic == WND_MAGIC && (!HIWORD(hwnd) || hwnd == ptr->hwndSelf)) if (ptr->dwMagic == WND_MAGIC &&
(hwnd == ptr->hwndSelf || !HIWORD(hwnd) || HIWORD(hwnd) == 0xffff))
return ptr; return ptr;
ptr = NULL; ptr = NULL;
} }
else if (index == USER_HANDLE_TO_INDEX(hwndDesktop)) else if (index == USER_HANDLE_TO_INDEX(hwndDesktop))
{ {
if (!HIWORD(hwnd) || hwnd == GetDesktopWindow()) ptr = WND_DESKTOP; if (hwnd == GetDesktopWindow() || !HIWORD(hwnd) || HIWORD(hwnd) == 0xffff) ptr = WND_DESKTOP;
else ptr = NULL; else ptr = NULL;
} }
else ptr = WND_OTHER_PROCESS; else ptr = WND_OTHER_PROCESS;

View File

@ -35,12 +35,14 @@ static int allocated_handles;
static struct user_handle *handle_to_entry( user_handle_t handle ) static struct user_handle *handle_to_entry( user_handle_t handle )
{ {
unsigned short generation;
int index = (((unsigned int)handle & 0xffff) - FIRST_USER_HANDLE) >> 1; int index = (((unsigned int)handle & 0xffff) - FIRST_USER_HANDLE) >> 1;
if (index < 0 || index >= nb_handles) return NULL; if (index < 0 || index >= nb_handles) return NULL;
if (!handles[index].type) return NULL; if (!handles[index].type) return NULL;
if (((unsigned int)handle >> 16) && ((unsigned int)handle >> 16 != handles[index].generation)) generation = (unsigned int)handle >> 16;
return NULL; if (generation == handles[index].generation || !generation || generation == 0xffff)
return &handles[index]; return &handles[index];
return NULL;
} }
inline static user_handle_t entry_to_handle( struct user_handle *ptr ) inline static user_handle_t entry_to_handle( struct user_handle *ptr )