Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/*++
* * WOW v3.5 * * Copyright (c) 1980-1994, Microsoft Corporation * * DEBUG.C * USER16 debug support * * History: * * Created 18-Aug-94 by Dave Hart (davehart) * Copied from WIN31 and edited (as little as possible) for WOW16. * At this time, all we want is GetSystemDebugState. --*/
/* Debug api support */ #include "user.h"
#ifndef WOW
#include "menu.h"
typedef struct tagMSGR { LPARAM lParam; WPARAM wParam; WORD message; HWND hwnd; } MSGR; typedef MSGR FAR *LPMSGR;
/* A debug hook gets called by Windows just before calling any other type of
* hook. Let us call the hook which is about to be called as "App hook"; Debug * hook is provided with all the details of the App hook so that it can decide * whether to prevent Windows from calling the App hook or not; If the debug * hook wants Windows to skip the call to the App hook, it must return TRUE; * Otherwise, it must call the DefHookProc. */
/* Debug Hooks recieve three params just like anyother type of hook:
iCode = Hook Code (must be HC_ACTION in the current implementaion). wParam = hook type of the App hook, which is about to be called by Windows. lParam = a FAR pointer to DEBUGHOOKSTRUCT structure which contains all the details about the App hook; */
/* Our helper call which returns a pointer to the senders message queue.
*/ LPMSGR FAR PASCAL QuerySendMessageReversed(void);
BOOL API QuerySendMessage(HANDLE h1, HANDLE h2, HANDLE h3, LPMSG lpmsg) { LPMSGR lpmsgr;
if (h1 || h2 || h3) return(FALSE);
if (!InSendMessage()) return(FALSE);
/* Get the inter task sendmessage we are servicing out of the apps queue.
*/ lpmsgr = QuerySendMessageReversed();
lpmsg->hwnd = lpmsgr->hwnd; lpmsg->message = lpmsgr->message; lpmsg->wParam = lpmsgr->wParam; lpmsg->lParam = lpmsgr->lParam;
return(TRUE); }
typedef struct { BOOL fOldHardwareInputState; BOOL fMessageBox; BOOL fDialog;
BOOL fMenu; BOOL fInsideMenuLoop; PPOPUPMENU pGlobalPopupMenu;
RECT rcClipCursor;
HWND hwndFocus; HWND hwndActive; HWND hwndSysModal; HWND hwndCapture; } SAVESTATESTRUCT; typedef SAVESTATESTRUCT NEAR *PSAVESTATESTRUCT; typedef SAVESTATESTRUCT FAR *LPSAVESTATESTRUCT;
static PSAVESTATESTRUCT pLockInputSaveState=NULL;
BOOL API LockInput(HANDLE h1, HWND hwndInput, BOOL fLock) { if (h1) return(FALSE);
if (fLock) { if (pLockInputSaveState) { /* Save state struct currently in use.
*/ DebugErr(DBF_ERROR, "LockInput() called when already locked"); return(NULL); }
if (!hwndInput || hwndInput != GetTopLevelWindow(hwndInput)) return(FALSE);
pLockInputSaveState=(PSAVESTATESTRUCT)UserLocalAlloc(ST_LOCKINPUTSTATE, LPTR, sizeof(SAVESTATESTRUCT));
if (!pLockInputSaveState) /* No memory, can't lock.
*/ return(FALSE);
if (hwndInput) ChangeToCurrentTask(hwndInput, hwndDesktop);
LockMyTask(TRUE);
/* Set global which tells us a task is locked. Needs to be set after
* calling LockMyTask... */ hTaskLockInput = GetCurrentTask();
/* For DBCS, save are we in a dlg box global. */ pLockInputSaveState->fDialog = fDialog;
/* Save menu state and clear it so that the debugger can bring up menus
* if needed. */ pLockInputSaveState->fMenu = fMenu; pLockInputSaveState->fInsideMenuLoop = fInsideMenuLoop; fMenu = FALSE; fInsideMenuLoop = FALSE;
pLockInputSaveState->pGlobalPopupMenu = pGlobalPopupMenu; pGlobalPopupMenu = NULL;
/* Change focus etc without sending messages...
*/ pLockInputSaveState->hwndFocus = hwndFocus; pLockInputSaveState->hwndActive = hwndActive; hwndFocus = hwndInput; hwndActive = hwndInput; /* Save capture and set it to null */ pLockInputSaveState->hwndCapture = hwndCapture; SetCapture(NULL);
/* Save sysmodal window */ pLockInputSaveState->hwndSysModal= hwndSysModal; pLockInputSaveState->fMessageBox = fMessageBox; SetSysModalWindow(hwndInput);
/* Save clipcursor rect */ CopyRect(&pLockInputSaveState->rcClipCursor, &rcCursorClip); ClipCursor(NULL);
/* Enable hardware input so that we can get mouse/keyboard messages.
*/ pLockInputSaveState->fOldHardwareInputState=EnableHardwareInput(TRUE);
} else { if (!pLockInputSaveState) { /* Save state struct not in use, nothing to restore.
*/ DebugErr(DBF_ERROR, "LockInput called with input already unlocked"); return(NULL); }
/* For DBCS, save are we in a dlg box global. */ fDialog = pLockInputSaveState->fDialog;
/* Restore clipcursor rect */ ClipCursor(&pLockInputSaveState->rcClipCursor);
/* Set active and focus windows manually so we avoid sending messages to
* the applications. */ hwndFocus = pLockInputSaveState->hwndFocus; hwndActive= pLockInputSaveState->hwndActive;
SetSysModalWindow(pLockInputSaveState->hwndSysModal); fMessageBox = pLockInputSaveState->fMessageBox;
pGlobalPopupMenu = pLockInputSaveState->pGlobalPopupMenu; fMenu = pLockInputSaveState->fMenu; fInsideMenuLoop = pLockInputSaveState->fInsideMenuLoop;
SetCapture(pLockInputSaveState->hwndCapture); EnableHardwareInput(pLockInputSaveState->fOldHardwareInputState);
/* Unset global which tells us a task is locked. Has to be unset before
* we call LockMyTask... */ hTaskLockInput = NULL; LockMyTask(FALSE);
LocalFree((HANDLE)pLockInputSaveState); pLockInputSaveState = NULL; }
return(TRUE); } #endif // !WOW
LONG API GetSystemDebugState(void) { LONG returnval = 0; HANDLE hTask;
hTask = GetCurrentTask(); if (!GetTaskQueue(hTask)) returnval = returnval | SDS_NOTASKQUEUE;
#ifndef WOW
if (fMenu) returnval = returnval | SDS_MENU;
if (fDialog) returnval = returnval | SDS_DIALOG;
if (fTaskIsLocked) returnval = returnval | SDS_TASKLOCKED;
if (hwndSysModal) returnval = returnval | SDS_SYSMODAL; #endif // !WOW
return(returnval); }
|