void WINAPI ReplyMessage(LRESULT lParam) { if (lpSendMessageStack && lpSendMessageStack->hReceivingTask == GetCurrentTask()) { lpSendMessageStack->lResult = lParam; lpSendMessageStack->bSendCompleted = TRUE; DirectedYield(lpSendMessageStack->hSendingTask); } }
restart_opts DebugeeWaitForMessage( void ) { MSG msg; HANDLE huser; HWND hwnddtop; HWND capture; HWND wnd; HANDLE hinst; /* * give up any capture in context of debugee */ capture = SetCapture(NULL); if( capture != NULL ) { ReleaseCapture(); Out((OUT_SOFT,"Capture hwnd=%04x", capture )); } /* * hang out and wait */ huser = GetModuleHandle( "USER"); hwnddtop = GetDesktopWindow(); wnd = GetFocus(); if( IsTaskWnd( wnd ) ) { FocusWnd = wnd; } wnd = GetActiveWindow(); if( IsTaskWnd( wnd ) ) { ActiveWnd = wnd; } if( HardModeRequired || SystemDebugState == SDS_NOTASKQUEUE || DebuggerWindow == NULL ) { Out((OUT_SOFT,"In HardMode Loop! req=%d,SDS=%d,Window=%4.4x",HardModeRequired,SystemDebugState,DebuggerWindow )); while( DebuggerState == ACTIVE ) { DirectedYield( DebuggerTask ); } if( capture != NULL ) { SetCapture( capture ); } return( AppMessage ); } Out((OUT_SOFT,"In SoftMode Loop task=%04x(%04x), act=%04x, foc=%04x, t=%d, DW=%04x", GetCurrentTask(), DebugeeTask, ActiveWnd, FocusWnd, TraceOn, DebuggerWindow )); DefaultProcInstance = (FARPROC)MakeProcInstance( (FARPROC)DefaultProc, DebugeeInstance ); EnumTaskProcInstance = MakeProcInstance( (FARPROC)EnumTaskWindowsFunc, DebugeeInstance ); EnumChildProcInstance = MakeProcInstance( (FARPROC)EnumChildWindowsFunc, DebugeeInstance ); EnumTaskWindows( GetCurrentTask(), (WNDENUMPROC)EnumTaskProcInstance, 0 ); FreeProcInstance( EnumChildProcInstance ); FreeProcInstance( EnumTaskProcInstance ); while( 1 ) { GetMessage( &msg, NULL, 0, 0 ); if( msg.hwnd == NULL && msg.message == WM_NULL && msg.lParam == MAGIC_COOKIE ) break; if( msg.hwnd != NULL ) { hinst = (HINSTANCE)GetWindowWord( msg.hwnd, GWW_HINSTANCE ); } else { hinst = NULL; } if( msg.hwnd == hwnddtop || hinst == huser ) { TranslateMessage( &msg ); DispatchMessage( &msg ); } else { SubClassProc( msg.hwnd, msg.message, msg.wParam, msg.lParam ); } } if( !TraceOn && DebuggerWindow != NULL ) { if( IsTaskWnd( FocusWnd ) ) { Out((OUT_SOFT,"Focus Window to %4.4x", FocusWnd )); SetFocus( FocusWnd ); } if( IsTaskWnd( ActiveWnd ) ) { Out((OUT_SOFT,"Active Window to %4.4x", ActiveWnd )); SetActiveWindow( ActiveWnd ); } } ExitSoftMode(); FreeProcInstance( DefaultProcInstance ); if( capture != NULL ) { SetCapture( capture ); } Out((OUT_SOFT,"active=%04x, focus=%04x, TraceOn=%d, DW=%04x", ActiveWnd, FocusWnd, TraceOn, DebuggerWindow )); PostAppMessage( GetCurrentTask(), WM_NULL, 0, 0L ); return( msg.wParam ); } /* DebugeeWaitForMessage */
LRESULT WINAPI SendMessage(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam) { #ifdef STRICT WNDPROC lpfnWndProc; #else FARPROC lpfnWndProc; #endif DWORD rc; BOOL cInSendMessage; MSG msg; HWND32 hWnd32; #ifdef DEBUG memset((LPSTR)&msg,'\0',sizeof(MSG)); #endif if(hWnd == HWND_BROADCAST) { msg.message = wMsg; msg.wParam = wParam; msg.lParam = lParam; /*send to all top level windows */ return EnumWindows((WNDENUMPROC)MultiSendMsg,(LONG)&msg); } /* * Is this a valid window? */ if (!(hWnd32 = CHECKHWND32(hWnd))) return 0; /* * Does the window have a valid task? */ if (GetWindowTask(hWnd) == 0 || !TWIN_IsLiveTask(GetWindowTask(hWnd))) { RELEASEWININFO(hWnd32); return 0; } /* * Is this window dead? */ if (hWnd32->dwWinFlags & WFDEAD) { RELEASEWININFO(hWnd32); return 0; } /* * Window is a good destination. Intertask send? */ if (hWnd != 0 && GetWindowTask(hWnd) != GetCurrentTask()) { ITSMINFO smse; /* save current InSendMessage Flag */ cInSendMessage = bInSendMessage; /* we are now in sendmessage */ bInSendMessage = TRUE; smse.hSendingTask = GetCurrentTask(); smse.hReceivingTask = GetWindowTask(hWnd); smse.msg.hwnd = hWnd; smse.msg.message = wMsg; smse.msg.wParam = wParam; smse.msg.lParam = lParam; smse.bSendReceived = FALSE; smse.bSendCompleted = FALSE; smse.lpPrev = lpSendMessageStack; lpSendMessageStack = &smse; DirectedYield(smse.hReceivingTask); while (!smse.bSendCompleted) { TWIN_ReceiveMessage(TRUE); } lpSendMessageStack = smse.lpPrev; /* back to what it was before... */ bInSendMessage = cInSendMessage; RELEASEWININFO(hWnd32); return smse.lResult; } if ((lpfnWndProc = #ifdef STRICT (WNDPROC) #else (FARPROC) #endif GetWindowLong(hWnd, GWL_WNDPROC)) == NULL) { ERRSTR((LF_WARNING,"SendMessage: Null wndproc!\n")); RELEASEWININFO(hWnd32); return(0L); } /* save current InSendMessage Flag */ cInSendMessage = bInSendMessage; /* we are now in sendmessage */ bInSendMessage = TRUE; if (lpHookList[WH_CALLWNDPROC+1]) { ATOM atmClassName; HOOKINFO hki; if ((atmClassName = GetClassWord(hWnd,GCW_ATOM)) != atmGlobalLookup[LOOKUP_FRAME]) { hki.hWnd = hWnd; hki.msg = wMsg; hki.wParam = wParam; hki.lParam = lParam; msg.hwnd = hWnd; msg.message = wMsg; msg.wParam = wParam; msg.lParam = lParam; lpHookList[WH_CALLWNDPROC+1]->lpfnHookProc(0,0,(LPARAM)&hki); } } rc = TWIN_CallWindowProc(lpfnWndProc,0,hWnd, wMsg, wParam, lParam); RELEASEWININFO(hWnd32); /* back to what it was before... */ bInSendMessage = cInSendMessage; return rc; }
void zDirectedYield (DWORD dwThreadId) { DirectedYield (dwThreadId); }