Beispiel #1
0
void    WINAPI 
ReplyMessage(LRESULT lParam)
{
    if (lpSendMessageStack && 
	lpSendMessageStack->hReceivingTask == GetCurrentTask())
    {
	lpSendMessageStack->lResult = lParam;
	lpSendMessageStack->bSendCompleted = TRUE;
	DirectedYield(lpSendMessageStack->hSendingTask);
    }
}
Beispiel #2
0
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 */
Beispiel #3
0
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;
}
Beispiel #4
0
void zDirectedYield (DWORD dwThreadId)
{
	DirectedYield (dwThreadId);	
}