"Dimitrie O. Paun" <dpaun(a)rogers.com> writes:
@@ -426,19 +425,21 @@ static LRESULT WINAPI EditWndProc_common { EDITSTATE *es = (EDITSTATE *)GetWindowLongW( hwnd, 0 ); LRESULT result = 0; + STACK16FRAME *stack16; + HANDLE16 oldDS;
TRACE("hwnd=%p msg=%x (%s) wparam=%x lparam=%lx\n", hwnd, msg, SPY_GetMsgName(msg, hwnd), wParam, lParam);
if (!es && msg != WM_NCCREATE) return DefWindowProcT(hwnd, msg, wParam, lParam, unicode); - else if (msg == WM_NCCREATE) - return EDIT_WM_NCCreate(hwnd, (LPCREATESTRUCTW)lParam, unicode); - else if (msg == WM_DESTROY) - return EDIT_WM_Destroy(es);
+ if (es && (msg != WM_DESTROY)) EDIT_LockBuffer(es); + + /* Make sure DS points to hInstance for 16-bit apps */ + stack16 = (STACK16FRAME*)MapSL((SEGPTR)NtCurrentTeb()->WOW32Reserved); + oldDS = stack16->ds; + stack16->ds = GetWindowLongPtrW( hwnd, GWLP_HINSTANCE );
It seems dangerous to set DS for the whole window procedure, it will be calling a lot of other functions that may end up depending on DS. It's especially dangerous here since the window instance won't be a valid DS for 32-bit windows. I think you really want to set it only around the Local* calls and restore it as soon as possible. -- Alexandre Julliard julliard(a)winehq.org