"Dimitrie O. Paun" dpaun@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.
From: "Alexandre Julliard" julliard@winehq.org
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.
True, but it is so clean and simple :) Also, I thought DS would only be relevant for 16-bit code, and moreover this will be (in the near future) the only remnant of local handles we will have.
But yeah, we do have notifications to worry about, I guess we have to push the set/restore closer to where it's needed.