Author: jimtabor Date: Thu May 10 06:08:51 2012 New Revision: 56557
URL: http://svn.reactos.org/svn/reactos?rev=56557&view=rev Log: [Win32SS] - Fix the remaining wine Win tests for FindWindow/Ex/A/W. Check the buffer not the length, buffer could be pointing to a null. Enable the message window handling. Use wine code for FindWindowExA.
Modified: trunk/reactos/win32ss/user/ntuser/window.c trunk/reactos/win32ss/user/user32/windows/window.c
Modified: trunk/reactos/win32ss/user/ntuser/window.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/ntuser/window.... ============================================================================== --- trunk/reactos/win32ss/user/ntuser/window.c [iso-8859-1] (original) +++ trunk/reactos/win32ss/user/ntuser/window.c [iso-8859-1] Thu May 10 06:08:51 2012 @@ -2509,7 +2509,7 @@
ASSERT(Parent);
- CheckWindowName = WindowName->Length != 0; + CheckWindowName = WindowName->Buffer != 0;
if((List = IntWinListChildren(Parent))) { @@ -2588,6 +2588,7 @@ PWND Parent, ChildAfter; UNICODE_STRING ClassName = {0}, WindowName = {0}; HWND Desktop, Ret = NULL; + BOOL DoMessageWnd = FALSE; RTL_ATOM ClassAtom = (RTL_ATOM)0; DECLARE_RETURN(HWND);
@@ -2657,7 +2658,10 @@ Desktop = IntGetCurrentThreadDesktopWindow();
if(hwndParent == NULL) + { hwndParent = Desktop; + DoMessageWnd = TRUE; + } else if(hwndParent == HWND_MESSAGE) { hwndParent = IntGetMessageWindow(); @@ -2698,7 +2702,7 @@ ; }
- CheckWindowName = WindowName.Length != 0; + CheckWindowName = WindowName.Buffer != 0;
/* search children */ while(*phWnd) @@ -2741,15 +2745,13 @@ } } else + { + ERR("FindWindowEx: Not Desktop Parent!\n"); Ret = IntFindWindow(Parent, ChildAfter, ClassAtom, &WindowName); - -#if 0 - - if(Ret == NULL && hwndParent == NULL && hwndChildAfter == NULL) + } + + if (Ret == NULL && DoMessageWnd) { - /* FIXME: If both hwndParent and hwndChildAfter are NULL, we also should - search the message-only windows. Should this also be done if - Parent is the desktop window??? */ PWND MsgWindows;
if((MsgWindows = UserGetWindowObject(IntGetMessageWindow()))) @@ -2757,7 +2759,6 @@ Ret = IntFindWindow(MsgWindows, ChildAfter, ClassAtom, &WindowName); } } -#endif } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) {
Modified: trunk/reactos/win32ss/user/user32/windows/window.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/user32/windows... ============================================================================== --- trunk/reactos/win32ss/user/user32/windows/window.c [iso-8859-1] (original) +++ trunk/reactos/win32ss/user/user32/windows/window.c [iso-8859-1] Thu May 10 06:08:51 2012 @@ -744,54 +744,29 @@ LPCSTR lpszClass, LPCSTR lpszWindow) { - UNICODE_STRING ucClassName, *pucClassName = NULL; - UNICODE_STRING ucWindowName, *pucWindowName = NULL; - HWND Result; - - if (IS_ATOM(lpszClass)) - { - ucClassName.Buffer = (LPWSTR)lpszClass; - ucClassName.Length = 0; - pucClassName = &ucClassName; - } - else if (lpszClass != NULL) - { - if (!RtlCreateUnicodeStringFromAsciiz(&ucClassName, - (LPSTR)lpszClass)) - { - SetLastError(ERROR_NOT_ENOUGH_MEMORY); - return NULL; - } - pucClassName = &ucClassName; - } - - if (lpszWindow != NULL) - { - if (!RtlCreateUnicodeStringFromAsciiz(&ucWindowName, - (LPSTR)lpszWindow)) - { - if (!IS_ATOM(lpszClass) && lpszClass != NULL) - RtlFreeUnicodeString(&ucWindowName); - - SetLastError(ERROR_NOT_ENOUGH_MEMORY); - return NULL; - } - - pucWindowName = &ucWindowName; - } - - Result = NtUserFindWindowEx(hwndParent, - hwndChildAfter, - pucClassName, - pucWindowName, - 0); - - if (!IS_ATOM(lpszClass) && lpszClass != NULL) - RtlFreeUnicodeString(&ucClassName); - if (lpszWindow != NULL) - RtlFreeUnicodeString(&ucWindowName); - - return Result; + LPWSTR titleW = NULL; + HWND hwnd = 0; + + if (lpszWindow) + { + DWORD len = MultiByteToWideChar( CP_ACP, 0, lpszWindow, -1, NULL, 0 ); + if (!(titleW = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) ))) return 0; + MultiByteToWideChar( CP_ACP, 0, lpszWindow, -1, titleW, len ); + } + + if (!IS_INTRESOURCE(lpszClass)) + { + WCHAR classW[256]; + if (MultiByteToWideChar( CP_ACP, 0, lpszClass, -1, classW, sizeof(classW)/sizeof(WCHAR) )) + hwnd = FindWindowExW( hwndParent, hwndChildAfter, classW, titleW ); + } + else + { + hwnd = FindWindowExW( hwndParent, hwndChildAfter, (LPCWSTR)lpszClass, titleW ); + } + + HeapFree( GetProcessHeap(), 0, titleW ); + return hwnd; }