Annotation of mstools/samples/deb/debmain.c, revision 1.1

1.1     ! root        1: // ************************************************************************
        !             2: // MODULE    : DEBMain.c
        !             3: // PURPOSE   : A Win32 Application demonstrating the Debug APIs
        !             4: // FUNCTIONS :
        !             5: //   WinMain()                - application entry point
        !             6: //   MainWndProc()            - processes messages
        !             7: //   ProcessCommandsWndProc() - processes WM_COMMAND messages
        !             8: //   PreferencesDlgProc()     - processes messages for "Preferences" dialog box
        !             9: //   AttachDlgProc()          - processes messages for "Attach" dialog box
        !            10: //   AboutDlgProc()           - processes messages for "About" dialog box
        !            11: //   NewListBoxWndProc()      - subclass procedure to prevent listbox moving
        !            12: // COMMENTS  :
        !            13: // ************************************************************************
        !            14: #include <Windows.H>           // required for all Windows applications
        !            15: #include <StdIO.H>             // sprintf()
        !            16: #include <String.H>            // lstrcat()
        !            17: #include <Memory.H>            // memcmp()
        !            18: 
        !            19: #include "LinkList.H"          // double linked list package (OBJ)
        !            20: #include "ToolBar.H"           // various ToolBar controls (DLL)
        !            21: #include "DEBDebug.H"          // debugging support functions
        !            22: #include "DEBMisc.H"           // misc support functions
        !            23: #include "DEBMain.H"           // specific to this module
        !            24: 
        !            25: // ***********
        !            26: // global data
        !            27: // ***********
        !            28: HWND      hWndMain;            // main window handle
        !            29: HWND      hWndDebugList;       // debug event listbox handle
        !            30: HWND      hWndTextButtonBar;   // windows handle to the text toolbar
        !            31: HINSTANCE hInstance;           // instance handle of this EXE
        !            32: LIST      ProcessList;         // linked list of debugee process information
        !            33: INT       ActiveProcesses = 0; // count of active debugee processes
        !            34: TCHAR     szAppTitle[32];      // name of the application
        !            35: HANDLE    hProcess;            // handle to current running debugee process
        !            36: LONG      MaxStrLen = 0;       // maximum string length in Debug Event listbox
        !            37: 
        !            38: //-- debugee specific data
        !            39: PROCESS_INFORMATION pi;        // process information
        !            40: STARTUPINFO         si;        // debugee startup information
        !            41: 
        !            42: //-- private profile settings
        !            43: int      xPos;                 // application window's horizontal position
        !            44: int      yPos;                 // application window's vertical position
        !            45: int      nWidth;               // application window's width
        !            46: int      nHeight;              // application window's height
        !            47: BOOL     fMaximized;           // flag: maximized state?
        !            48: BOOL     fToolBar;             // flag: display the ToolBar?
        !            49: BOOL     fSaveOnExit;          // flag: save settings upon exit?
        !            50: BOOL     fSavedDirectory;      // flag: use saved directory for opening files?
        !            51: BOOL     fClearOnNew;          // flag: clears the event listbox on a new debugee
        !            52: BOOL     fVerbose;             // flag: verbose event listings
        !            53: BOOL     fShowSymbols;         // flag: show symbols (limited)
        !            54: BOOL     fSavePreferences;     // flag: save the preferences settings
        !            55: HFONT    hFont;                // current handle to the Debug Event listbox font
        !            56: LOGFONT  LogFont;              // current logical font
        !            57: COLORREF rgbColor;             // current listbox text foreground color
        !            58: COLORREF rgbBkColor;           // current listbox text foreground color
        !            59: LONG     DebugMode;            // debug mode flag CreateProcess
        !            60: LONG     DebugeePriority;      // debugee priority CreateProcess
        !            61: 
        !            62: // *************
        !            63: // internal data
        !            64: // *************
        !            65: #define TOP_BORDER      4
        !            66: #define BOTTOM_BORDER   4
        !            67: #define SIDE_BORDER     4
        !            68: #define MIN_HEIGHT    128
        !            69: 
        !            70: WNDPROC OldListBoxWndProc;     // original listbox procedure
        !            71: TCHAR   szShortAppTitle[16];   // short name of the application
        !            72: BOOL    fHelpUsed = FALSE;     // boolean denoting online help invoked
        !            73: SIZE    ClientSize;            // client windows size
        !            74: SIZE    DebugListBoxSize;      // debug event listbox size
        !            75: int     TextButtonBarHeight;   // text button bar height
        !            76: int     xPosOld;               // application window's old horizontal position
        !            77: int     yPosOld;               // application window's old vertical position
        !            78: 
        !            79: //-- location of various files
        !            80: TCHAR   szPath[MAX_PATH];         // path where the running application resides
        !            81: TCHAR   szExePathName[MAX_PATH];  // full pathname of the application
        !            82: TCHAR   szHelpPathName[MAX_PATH]; // full pathname of the application's help file
        !            83: TCHAR   szIniPathName[MAX_PATH];  // full pathname of the application's ini file
        !            84: 
        !            85: 
        !            86: // ************************************************************************
        !            87: // FUNCTION : WinMain( HINSTANCE, HINSTANCE, LPSTR, int )
        !            88: // PURPOSE  : initialize the window, process the message dispatch loop
        !            89: // COMMENTS :
        !            90: // ************************************************************************
        !            91: int PASCAL
        !            92: WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow )
        !            93: {
        !            94:   MSG       msg;
        !            95:   WNDCLASS  wndclass;
        !            96: 
        !            97:   LPCTSTR lpszMenuName    = (LPCTSTR) "DebugMenu";
        !            98:   LPCTSTR lpszClassName   = (LPCTSTR) "DebugClass";
        !            99:   LPCTSTR lpszIconName    = (LPCTSTR) "DebugIcon";
        !           100:   LPCTSTR lpszAccelName   = (LPCTSTR) "DebugAccel";
        !           101:   LPCTSTR lpszIniFileExt  = (LPCTSTR) "INI";
        !           102:   LPCTSTR lpszHelpFileExt = (LPCTSTR) "HLP";
        !           103: 
        !           104:   HANDLE hAccel;                // handle to the accelerator table
        !           105: 
        !           106:   UNREFERENCED_PARAMETER( lpCmdLine );  // avoid warnings
        !           107:   UNREFERENCED_PARAMETER( hPrevInst );
        !           108: 
        !           109:   hInstance = hInst;
        !           110: 
        !           111:   //-- register the debug event window class
        !           112:   wndclass.style         = (UINT) NULL;
        !           113:   wndclass.lpfnWndProc   = (WNDPROC) MainWndProc;
        !           114:   wndclass.cbClsExtra    = (int) NULL;
        !           115:   wndclass.cbWndExtra    = (int) NULL;
        !           116:   wndclass.hInstance     = hInstance;
        !           117:   wndclass.hIcon         = LoadIcon( hInstance, lpszIconName );
        !           118:   wndclass.hCursor       = LoadCursor( hInstance, (LPTSTR) IDC_ARROW );
        !           119:   wndclass.hbrBackground = (HBRUSH) (COLOR_APPWORKSPACE+1);
        !           120:   wndclass.lpszMenuName  = lpszMenuName;
        !           121:   wndclass.lpszClassName = lpszClassName;
        !           122: 
        !           123:   if( !RegisterClass(&wndclass) )
        !           124:     return( FALSE );
        !           125: 
        !           126:   //-- Load resource strings
        !           127:   LoadString( hInstance, IDS_APPTITLE, szAppTitle, sizeof(szAppTitle) );
        !           128:   LoadString( hInstance, IDS_SHORT_APPTITLE, szShortAppTitle,
        !           129:     sizeof(szShortAppTitle) );
        !           130: 
        !           131:   //-- get application pathname and store the ini and help file pathname
        !           132:   //   (which is located in the same directory as the application)
        !           133:   GetModuleFileName( (HANDLE) NULL, szExePathName, sizeof(szExePathName)/sizeof(TCHAR) );
        !           134:   GetPathFromFullPathName( szExePathName, szPath, sizeof(szPath) );
        !           135:   wsprintf( szIniPathName,  (LPCSTR) "%s\\%s.%s", szPath, szShortAppTitle, lpszIniFileExt  );
        !           136:   wsprintf( szHelpPathName, (LPCSTR) "%s\\%s.%s", szPath, szShortAppTitle, lpszHelpFileExt );
        !           137: 
        !           138:   //-- retrieve stored default location from private profile data
        !           139:   GetPrivateProfileSettings( szAppTitle, szIniPathName );
        !           140: 
        !           141:   //-- Create a main window for this application instance
        !           142:   hWndMain = CreateWindow(
        !           143:                lpszClassName,         // See RegisterClass() call
        !           144:                szAppTitle,            // Text for window title bar
        !           145:                WS_OVERLAPPEDWINDOW,   // Window style
        !           146:                xPos,                  // horizontal position
        !           147:                yPos,                  // vertical position
        !           148:                nWidth,                // width
        !           149:                nHeight,               // height
        !           150:                NULL,                  // Overlapped windows have no parent
        !           151:                NULL,                  // Use the window class menu
        !           152:                hInstance,             // This instance owns this window
        !           153:                NULL );                // Extra pointer not needed
        !           154: 
        !           155:   //-- If window could not be created, return "failure"
        !           156:   if( !hWndMain )
        !           157:     return( FALSE );
        !           158: 
        !           159:   //-- Load main menu accelerators
        !           160:   if( !(hAccel = LoadAccelerators( hInstance, lpszAccelName) ) )
        !           161:     return( FALSE );
        !           162: 
        !           163:   //-- modify the menu to reflect saved settings
        !           164:   UpdateMenuSettings();
        !           165: 
        !           166:   //-- Make the window visible; update its client area; and return "success"
        !           167:   ShowWindow( hWndMain, (fMaximized) ? SW_SHOWMAXIMIZED : nCmdShow );
        !           168:   UpdateWindow( hWndMain );          // Sends WM_PAINT message
        !           169: 
        !           170:   //-- initialize the double linked list package that stores the thread handles
        !           171:   InitList( &ProcessList, OrderFunc );
        !           172: 
        !           173:   //-- Acquire and dispatch messages until a WM_QUIT message is received.
        !           174:   while( GetMessage( &msg, NULL, 0, 0 ) ) {
        !           175:     if( !TranslateAccelerator( hWndMain, hAccel, &msg ) ) {
        !           176:       TranslateMessage( &msg );     // Translates virtual key codes
        !           177:       DispatchMessage( &msg );      // Dispatches message to window
        !           178:     }
        !           179:   }
        !           180: 
        !           181:   return( msg.wParam );           // Returns the value from PostQuitMessage
        !           182: }
        !           183: 
        !           184: 
        !           185: // ************************************************************************
        !           186: // FUNCTION : MainWndProc( HWND, UINT, WPARAM, LPARAM )
        !           187: // PURPOSE  : Processes uMsgs
        !           188: // MESSAGES :
        !           189: //   WM_COMMAND   - passed to ProcessCommandsWndProc()
        !           190: //   WM_DESTROY   - destroy window
        !           191: //    ...
        !           192: // COMMENTS : !! I will document this better at a later date !!
        !           193: // ************************************************************************
        !           194: LRESULT CALLBACK
        !           195: MainWndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
        !           196: {
        !           197:   static HDC hDC;
        !           198: 
        !           199:   switch( uMsg ) {
        !           200: 
        !           201:     case WM_COMMAND:
        !           202:       return( ProcessCommandsWndProc( hWnd, uMsg, wParam, lParam) );
        !           203: 
        !           204:     //-- create debug event listbox
        !           205:     case UM_CREATE_LISTBOX: {
        !           206:       TCHAR  szWindowName[64];
        !           207: 
        !           208:       LoadString( hInstance, IDS_DEBUG_EVENTS, szWindowName,
        !           209:         sizeof(szWindowName) );
        !           210: 
        !           211:       hWndDebugList = CreateWindow(
        !           212:                         (LPCTSTR) "ListBox",
        !           213:                         szWindowName,
        !           214:                         WS_CHILD            | WS_VISIBLE      |
        !           215:                         WS_CAPTION          | WS_VSCROLL      |
        !           216:                         WS_HSCROLL          | LBS_NOTIFY      |
        !           217:                         LBS_DISABLENOSCROLL | LBS_USETABSTOPS |
        !           218:                         LBS_NOINTEGRALHEIGHT,
        !           219:                         SIDE_BORDER,
        !           220:                         fToolBar ? TextButtonBarHeight + TOP_BORDER : TOP_BORDER,
        !           221:                         DebugListBoxSize.cx, DebugListBoxSize.cy,
        !           222:                         hWnd, (HMENU) NULL, hInstance, NULL );
        !           223: 
        !           224:       //-- Subclass the listbox so the user cannot move it
        !           225:       OldListBoxWndProc = SubclassWindow( hWndDebugList, (WNDPROC) NewListBoxWndProc );
        !           226: 
        !           227:       //-- set listbox font & background color
        !           228:       hDC = GetDC( hWndDebugList );
        !           229:       hFont = CreateFontIndirect( &LogFont );
        !           230:       SelectObject( hDC, hFont );
        !           231:       SendMessage( hWndDebugList, WM_CTLCOLORLISTBOX, (DWORD) hDC,
        !           232:         (LONG) hWndDebugList );
        !           233:       SendMessage( hWndDebugList, WM_SETFONT, (DWORD) hFont, TRUE );
        !           234:       ReleaseDC( hWndDebugList, hDC );
        !           235: 
        !           236:       return( NULL );
        !           237:     }
        !           238: 
        !           239:     //-- Create ToolBar & Debug Events listbox
        !           240:     case WM_CREATE:
        !           241:       hWndTextButtonBar = CreateTextButtonBar( hWnd, &TextButtonBarHeight );
        !           242:       if( fToolBar )
        !           243:         ShowWindow( hWndTextButtonBar, SW_SHOW );
        !           244:       PostMessage( hWnd, UM_CREATE_LISTBOX, 0, 0 );
        !           245:       return( NULL );
        !           246: 
        !           247:     //-- resize the debug event listbox when the window size changes
        !           248:     case WM_SIZE:
        !           249:       ClientSize.cx = LOWORD( lParam );
        !           250:       ClientSize.cy = HIWORD( lParam );
        !           251:       DebugListBoxSize.cx = ClientSize.cx - ( 2*SIDE_BORDER );
        !           252:       DebugListBoxSize.cy = max( ClientSize.cy, MIN_HEIGHT + TOP_BORDER )
        !           253:         - (TOP_BORDER + BOTTOM_BORDER);
        !           254: 
        !           255:       if( fToolBar )
        !           256:         DebugListBoxSize.cy -= TextButtonBarHeight;
        !           257: 
        !           258:       if( hWndDebugList != NULL)
        !           259:         MoveWindow( hWndDebugList,
        !           260:           SIDE_BORDER,
        !           261:           fToolBar ? TextButtonBarHeight + TOP_BORDER : TOP_BORDER,
        !           262:           DebugListBoxSize.cx, DebugListBoxSize.cy, TRUE );
        !           263: 
        !           264:       if( wParam == SIZEFULLSCREEN ) {
        !           265:         fMaximized = 1;
        !           266:         xPos = xPosOld;
        !           267:         yPos = yPosOld;
        !           268:       }
        !           269:       else if( wParam == SIZENORMAL ) {
        !           270:         RECT rect;
        !           271: 
        !           272:         fMaximized = 0;
        !           273:         GetWindowRect( hWndMain, &rect );
        !           274:         nWidth  = (int) (rect.right - rect.left);
        !           275:         nHeight = (int) (rect.bottom - rect.top);
        !           276:       }
        !           277: 
        !           278:       return( NULL );
        !           279: 
        !           280:     case WM_MOVE: {
        !           281:       RECT rect;
        !           282: 
        !           283:       GetWindowRect( hWndMain, &rect );
        !           284:       xPosOld = xPos;
        !           285:       yPosOld = yPos;
        !           286:       xPos    = (int) rect.left;
        !           287:       yPos    = (int) rect.top;
        !           288:       return( NULL );
        !           289:     }
        !           290: 
        !           291:     case WM_CTLCOLORLISTBOX: {
        !           292:       LOGBRUSH LogBrush;
        !           293: 
        !           294:       LogBrush.lbStyle = BS_SOLID;
        !           295:       LogBrush.lbColor = rgbBkColor;
        !           296:       LogBrush.lbHatch = NULL;
        !           297: 
        !           298:       SetTextColor( (HDC) wParam, rgbColor );
        !           299:       SetBkColor( (HDC) wParam, rgbBkColor );
        !           300: 
        !           301:       return( (LPARAM) CreateBrushIndirect( &LogBrush ) );
        !           302:     }
        !           303: 
        !           304:     case WM_CLOSE:
        !           305:       if( ActiveProcesses ) {
        !           306:         TCHAR  szExitBoxTitle[64];
        !           307:         TCHAR  szExitBoxText[256];
        !           308: 
        !           309:         LoadString( hInstance, IDS_EXIT_BOX_TITLE, szExitBoxTitle,
        !           310:           sizeof(szExitBoxTitle) );
        !           311:         LoadString( hInstance, IDS_EXIT_BOX_TEXT, szExitBoxText,
        !           312:           sizeof(szExitBoxText) );
        !           313:         if ( MessageBox( hWnd, szExitBoxText, szExitBoxTitle,
        !           314:                MB_YESNO | MB_ICONEXCLAMATION ) == IDNO )
        !           315:           return( NULL );
        !           316:       }
        !           317: 
        !           318:       //-- store location information to private profile data
        !           319:       WritePrivateProfileSettings( szAppTitle, szIniPathName );
        !           320: 
        !           321:       DestroyWindow( hWndTextButtonBar );
        !           322:       DestroyWindow( hWndDebugList );
        !           323:       DestroyWindow( hWndMain );
        !           324: 
        !           325:       return( NULL );
        !           326: 
        !           327:     case WM_DESTROY:
        !           328:       if( fHelpUsed )
        !           329:         WinHelp( hWnd, szHelpPathName, (UINT) HELP_QUIT, (DWORD) NULL );
        !           330:       PostQuitMessage( 0 );
        !           331:       return( NULL );
        !           332: 
        !           333:     default:               // Passes it on if unproccessed
        !           334:       return( DefWindowProc(hWnd, uMsg, wParam, lParam) );
        !           335:   }
        !           336: 
        !           337:   return( NULL );
        !           338: }
        !           339: 
        !           340: 
        !           341: // ************************************************************************
        !           342: // FUNCTION : ProcessCommandsWndProc( HWND, UINT, WPARAM, LPARAM )
        !           343: // PURPOSE  : Processes WM_COMMAND messages for MainWndProc()
        !           344: // MESSAGES :
        !           345: //   WM_COMMAND         - application menu
        !           346: //     IDM_FILE_EXIT    - exit the application
        !           347: //     IDM_FILE_ABOUT   - About Dialog Box
        !           348: //    ...
        !           349: // COMMENTS : !! I will document this better at a later date !!
        !           350: // ************************************************************************
        !           351: LRESULT CALLBACK
        !           352: ProcessCommandsWndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
        !           353: {
        !           354:   static LPCTSTR  lpszAboutDlgBox       = (LPCTSTR) "AboutDlgBox";
        !           355:   static LPCTSTR  lpszAttachDlgBox      = (LPCTSTR) "AttachDlgBox";
        !           356:   static LPCTSTR  lpszPreferencesDlgBox = (LPCTSTR) "PreferencesDlgBox";
        !           357: 
        !           358:   switch( LOWORD(wParam) ) {
        !           359: 
        !           360:     case IDM_FILE_OPEN:
        !           361:       if( ActiveProcesses ) {
        !           362:         MessageBox( hWndMain,
        !           363:           (LPTSTR) "This build of DEB is limited to\n"
        !           364:           "debugging only one process at a time.",
        !           365:           (LPTSTR) "Cannot Open Debugee",
        !           366:           MB_OK | MB_ICONEXCLAMATION );
        !           367:         return( FALSE );
        !           368:       }
        !           369:       if( !OpenDebugee( &pi, &si ) ) {
        !           370:         // handle cancel condition
        !           371:       }
        !           372:       else {
        !           373:         if( fClearOnNew ) {
        !           374:           SendMessage( hWndDebugList, LB_RESETCONTENT, 0, 0 );
        !           375:           MaxStrLen = 0;
        !           376:         }
        !           377:       }
        !           378:       return(NULL);
        !           379: 
        !           380:     case IDM_FILE_ATTACH:
        !           381:       if( ActiveProcesses ) {
        !           382:         MessageBox( hWndMain,
        !           383:           (LPTSTR) "This build of DEB is limited to\n"
        !           384:           "debugging only one process at a time.",
        !           385:           (LPTSTR) "Cannot Attach to Debugee",
        !           386:           MB_OK | MB_ICONEXCLAMATION );
        !           387:         return( FALSE );
        !           388:       }
        !           389:       if( !DialogBox( hInstance, lpszAttachDlgBox, hWnd,
        !           390:             (DLGPROC) AttachDlgProc ) ) {
        !           391:         // handle cancel condition
        !           392:       }
        !           393:       else {
        !           394:         if( fClearOnNew ) {
        !           395:           SendMessage( hWndDebugList, LB_RESETCONTENT, 0, 0 );
        !           396:           MaxStrLen = 0;
        !           397:         }
        !           398:       }
        !           399:       return(NULL);
        !           400: 
        !           401:     case IDM_EDIT_CUT:
        !           402:       CopyListBoxToClipboard( hWndDebugList, MaxStrLen );
        !           403:       SendMessage( hWnd, WM_COMMAND, IDM_EDIT_DELETE, 0 );
        !           404:       return( NULL );
        !           405: 
        !           406:     case IDM_EDIT_COPY: {
        !           407:       CopyListBoxToClipboard( hWndDebugList, MaxStrLen );
        !           408:       return( NULL );
        !           409:     }
        !           410: 
        !           411:     case IDM_EDIT_DELETE:
        !           412:       SendMessage( hWndDebugList, LB_RESETCONTENT, 0, 0 );
        !           413:       MaxStrLen = 0;
        !           414:       return( NULL );
        !           415: 
        !           416:     case IDM_OPTIONS_FONT:
        !           417:       if( !ChooseNewFont( hWndDebugList ) ) {
        !           418:         // handle cancel condition
        !           419:       }
        !           420:       return( NULL );
        !           421: 
        !           422:     case IDM_OPTIONS_COLOR:
        !           423:       ChooseNewBkColor( hWndDebugList );
        !           424:       return( NULL );
        !           425: 
        !           426:     case IDM_OPTIONS_PREFERENCES:
        !           427:       DialogBox( hInstance, lpszPreferencesDlgBox, hWnd,
        !           428:         (DLGPROC) PreferencesDlgProc );
        !           429:       return( NULL );
        !           430: 
        !           431:     case IDM_OPTIONS_TOOLBAR:
        !           432:       if( fToolBar ) {
        !           433:         fToolBar = 0;
        !           434:         CheckMenuItem( GetMenu(hWndMain), IDM_OPTIONS_TOOLBAR, MF_UNCHECKED );
        !           435:         ShowWindow( hWndTextButtonBar, SW_HIDE );
        !           436:         SendWmSizeMessage( hWndMain );
        !           437:       }
        !           438:       else {
        !           439:         fToolBar = 1;
        !           440:         CheckMenuItem( GetMenu(hWndMain), IDM_OPTIONS_TOOLBAR, MF_CHECKED );
        !           441:         ShowWindow( hWndTextButtonBar, SW_SHOW );
        !           442:         SendWmSizeMessage( hWndMain );
        !           443:       }
        !           444:       return( NULL );
        !           445: 
        !           446:     case IDM_OPTIONS_SAVEDDIR:
        !           447:       if( fSavedDirectory ) {
        !           448:         fSavedDirectory = 0;
        !           449:         CheckMenuItem( GetMenu(hWndMain), IDM_OPTIONS_SAVEDDIR,
        !           450:           MF_UNCHECKED );
        !           451:       }
        !           452:       else {
        !           453:         fSavedDirectory = 1;
        !           454:         CheckMenuItem( GetMenu(hWndMain), IDM_OPTIONS_SAVEDDIR,
        !           455:           MF_CHECKED );
        !           456:       }
        !           457:       return( NULL );
        !           458: 
        !           459:     case IDM_OPTIONS_SAVEONEXIT:
        !           460:       if( fSaveOnExit ) {
        !           461:         fSaveOnExit = 0;
        !           462:         CheckMenuItem( GetMenu(hWndMain), IDM_OPTIONS_SAVEONEXIT,
        !           463:           MF_UNCHECKED );
        !           464:       }
        !           465:       else {
        !           466:         fSaveOnExit = 1;
        !           467:         CheckMenuItem( GetMenu(hWndMain), IDM_OPTIONS_SAVEONEXIT,
        !           468:           MF_CHECKED );
        !           469:       }
        !           470:       return( NULL );
        !           471: 
        !           472:     case IDM_HELP_CONTENTS:
        !           473:       fHelpUsed = TRUE;
        !           474:       WinHelp( hWnd, (LPCTSTR) szHelpPathName, HELP_INDEX, (DWORD) NULL );
        !           475:       return( NULL );
        !           476: 
        !           477:     case IDM_HELP_SEARCH:
        !           478:       fHelpUsed = TRUE;
        !           479:       WinHelp( hWnd, (LPCTSTR) szHelpPathName, HELP_PARTIALKEY, (DWORD) "" );
        !           480:       return( NULL );
        !           481: 
        !           482:     case IDM_HELP_HOWTOUSE:
        !           483:       fHelpUsed = TRUE;
        !           484:       WinHelp( hWnd, (LPTSTR) NULL, HELP_HELPONHELP, (DWORD) NULL );
        !           485:       return( NULL );
        !           486: 
        !           487:     case IDM_HELP_ABOUT:
        !           488:       DialogBox( hInstance, lpszAboutDlgBox, hWnd, (DLGPROC) AboutDlgProc );
        !           489:       return( NULL );
        !           490: 
        !           491:     case IDM_FILE_EXIT:
        !           492:       SendMessage( hWndMain, WM_CLOSE, 0, 0 );
        !           493:       return( NULL );
        !           494: 
        !           495:     default:
        !           496:         return( DefWindowProc(hWnd, uMsg, wParam, lParam) );
        !           497:   }
        !           498: 
        !           499: }
        !           500: 
        !           501: 
        !           502: // ************************************************************************
        !           503: // FUNCTION : PreferencesDlgProc( HWND, UINT, WPARAM, LPARAM )
        !           504: // PURPOSE  : Processes message for "Preferences" dialog box
        !           505: // MESSAGES :
        !           506: //   WM_INITDIALOG - initialize dialog box
        !           507: //   WM_COMMAND    - Input received
        !           508: // COMMENTS :
        !           509: //
        !           510: //   Wait for user to click on "Ok" button, then close the dialog box.
        !           511: // ************************************************************************
        !           512: BOOL CALLBACK
        !           513: PreferencesDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
        !           514: {
        !           515:   UNREFERENCED_PARAMETER( lParam );
        !           516: 
        !           517:   switch( uMsg ) {
        !           518: 
        !           519:     case WM_COMMAND:
        !           520:       switch( LOWORD(wParam) ) {
        !           521: 
        !           522:         case IDOK:
        !           523:           if( SendMessage( GetDlgItem( hDlg, IDC_DEBUG_PROCESS), BM_GETCHECK, 0, 0 ) )
        !           524:             DebugMode = DEBUG_PROCESS;
        !           525:           if( SendMessage( GetDlgItem( hDlg, IDC_DEBUG_ONLY_THIS_PROCESS), BM_GETCHECK, 0, 0 ) )
        !           526:             DebugMode = DEBUG_PROCESS | DEBUG_ONLY_THIS_PROCESS;
        !           527:           if( SendMessage( GetDlgItem( hDlg, IDC_IDLE_PRIORITY_CLASS), BM_GETCHECK, 0, 0 ) )
        !           528:             DebugeePriority = IDLE_PRIORITY_CLASS;
        !           529:           if( SendMessage( GetDlgItem( hDlg, IDC_NORMAL_PRIORITY_CLASS), BM_GETCHECK, 0, 0 ) )
        !           530:             DebugeePriority = NORMAL_PRIORITY_CLASS;
        !           531:           if( SendMessage( GetDlgItem( hDlg, IDC_HIGH_PRIORITY_CLASS), BM_GETCHECK, 0, 0 ) )
        !           532:             DebugeePriority = HIGH_PRIORITY_CLASS;
        !           533:           fClearOnNew      = (BOOL) SendMessage( GetDlgItem( hDlg, IDC_CLEAR_ON_NEW),
        !           534:             BM_GETCHECK, 0 , 0 );
        !           535:           fVerbose         = (BOOL) SendMessage( GetDlgItem( hDlg, IDC_VERBOSE),
        !           536:             BM_GETCHECK, 0 , 0 );
        !           537:           fShowSymbols     = (BOOL) SendMessage( GetDlgItem( hDlg, IDC_SHOW_SYMBOLS),
        !           538:             BM_GETCHECK, 0 , 0 );
        !           539:           fSavePreferences = (BOOL) SendMessage( GetDlgItem( hDlg, IDC_SAVE_PREFERENCES),
        !           540:             BM_GETCHECK, 0 , 0 );
        !           541:           EndDialog( hDlg, TRUE );
        !           542:           return( TRUE );
        !           543: 
        !           544:         case IDCANCEL:
        !           545:           EndDialog( hDlg, FALSE );
        !           546:           return( TRUE );
        !           547: 
        !           548:         case IDHELP:
        !           549:           return( TRUE );
        !           550: 
        !           551:       }
        !           552:       break;
        !           553: 
        !           554:     case WM_INITDIALOG:
        !           555: 
        !           556:       switch( DebugMode ) {
        !           557: 
        !           558:         case DEBUG_PROCESS:
        !           559:           SendMessage( GetDlgItem( hDlg, IDC_DEBUG_PROCESS),
        !           560:             BM_SETCHECK, 1, 0);
        !           561:           break;
        !           562: 
        !           563:         case ( DEBUG_PROCESS | DEBUG_ONLY_THIS_PROCESS ):
        !           564:           SendMessage( GetDlgItem( hDlg, IDC_DEBUG_ONLY_THIS_PROCESS),
        !           565:             BM_SETCHECK, 1, 0);
        !           566:           break;
        !           567:       }
        !           568: 
        !           569:       switch( DebugeePriority ) {
        !           570: 
        !           571:         case IDLE_PRIORITY_CLASS:
        !           572:           SendMessage( GetDlgItem( hDlg, IDC_IDLE_PRIORITY_CLASS),
        !           573:             BM_SETCHECK, 1, 0);
        !           574:           break;
        !           575: 
        !           576:         case NORMAL_PRIORITY_CLASS:
        !           577:           SendMessage( GetDlgItem( hDlg, IDC_NORMAL_PRIORITY_CLASS),
        !           578:             BM_SETCHECK, 1, 0);
        !           579:           break;
        !           580: 
        !           581:         case HIGH_PRIORITY_CLASS:
        !           582:           SendMessage( GetDlgItem( hDlg, IDC_HIGH_PRIORITY_CLASS),
        !           583:             BM_SETCHECK, 1, 0);
        !           584:           break;
        !           585:       }
        !           586: 
        !           587:       SendMessage( GetDlgItem( hDlg, IDC_CLEAR_ON_NEW),     BM_SETCHECK,
        !           588:         fClearOnNew, 0 );
        !           589:       SendMessage( GetDlgItem( hDlg, IDC_VERBOSE),          BM_SETCHECK,
        !           590:         fVerbose, 0 );
        !           591:       SendMessage( GetDlgItem( hDlg, IDC_SHOW_SYMBOLS),     BM_SETCHECK,
        !           592:         fShowSymbols, 0 );
        !           593:       SendMessage( GetDlgItem( hDlg, IDC_SAVE_PREFERENCES), BM_SETCHECK,
        !           594:         fSavePreferences, 0 );
        !           595: 
        !           596:       return( TRUE );
        !           597:   }
        !           598: 
        !           599:   return( FALSE );
        !           600: }
        !           601: 
        !           602: 
        !           603: // ************************************************************************
        !           604: // FUNCTION : AttachDlgProc( HWND, UINT, WPARAM, LPARAM )
        !           605: // PURPOSE  : Processes messages for "Attach" dialog box
        !           606: // MESSAGES :
        !           607: //   WM_INITDIALOG - initialize dialog box
        !           608: //   WM_COMMAND    - Input received
        !           609: // COMMENTS :
        !           610: //
        !           611: //   Wait for user to click on "Ok" button, then close the dialog box.
        !           612: // ************************************************************************
        !           613: BOOL CALLBACK
        !           614: AttachDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
        !           615: {
        !           616:   static HWND  hWndProcessList;
        !           617:   static DWORD idDebugEventThread;
        !           618:   static DWORD dwProcessId;
        !           619:   static LONG  idx;
        !           620: 
        !           621:   UNREFERENCED_PARAMETER( lParam );
        !           622: 
        !           623:   switch( uMsg ) {
        !           624: 
        !           625:     case WM_COMMAND:
        !           626:       switch( LOWORD(wParam) ) {
        !           627: 
        !           628:         case IDOK:
        !           629:           idx = (UINT) SendMessage( hWndProcessList, LB_GETCURSEL,
        !           630:                          NULL, NULL );
        !           631:           dwProcessId = (DWORD) SendMessage( hWndProcessList,
        !           632:                                   LB_GETITEMDATA,
        !           633:                                   idx, NULL );
        !           634: 
        !           635:           //-- create debug event processing thread and attach to the process
        !           636:           CreateThread(
        !           637:             (LPSECURITY_ATTRIBUTES) NULL,
        !           638:             (DWORD) 0,
        !           639:             (LPTHREAD_START_ROUTINE) DebugEventThread,
        !           640:             (LPVOID) dwProcessId,
        !           641:             (DWORD) NULL,
        !           642:             (LPDWORD) &idDebugEventThread);
        !           643:           EndDialog( hDlg, TRUE );
        !           644:           return( TRUE );
        !           645: 
        !           646:         case IDCANCEL:
        !           647:           EndDialog( hDlg, FALSE );
        !           648:           return( TRUE );
        !           649: 
        !           650:         case IDHELP:
        !           651:           return( TRUE );
        !           652: 
        !           653:       }
        !           654: 
        !           655:       switch( HIWORD( wParam ) ) {
        !           656: 
        !           657:         case LBN_DBLCLK:
        !           658:           SendMessage( hDlg, WM_COMMAND, (WPARAM) IDOK, (LPARAM) 0L );
        !           659:           return( TRUE );
        !           660:       }
        !           661:       break;
        !           662: 
        !           663:     case WM_INITDIALOG:
        !           664:       hWndProcessList = GetDlgItem( hDlg, IDC_PROCESSLIST );
        !           665:       SendMessage( hWndProcessList, LB_RESETCONTENT, 0 , 0 );
        !           666:       for(; !EnumWindows( (WNDENUMPROC) EnumProcessListFunc,
        !           667:                (LPARAM) hWndProcessList ); )
        !           668:         ; // continue looping until done
        !           669:       return( TRUE );
        !           670:   }
        !           671: 
        !           672:   return( FALSE );
        !           673: }
        !           674: 
        !           675: 
        !           676: // ************************************************************************
        !           677: // FUNCTION : AboutDlgProc( HWND, UINT, WPARAM, LPARAM )
        !           678: // PURPOSE  : Processes messages for "About" dialog box
        !           679: // MESSAGES :
        !           680: //   WM_INITDIALOG - initialize dialog box
        !           681: //   WM_COMMAND    - Input received
        !           682: // COMMENTS :
        !           683: //   No initialization is needed for this particular dialog box, but TRUE
        !           684: //   must be returned to Windows.
        !           685: //
        !           686: //   Wait for user to click on "Ok" button, then close the dialog box.
        !           687: // ************************************************************************
        !           688: BOOL CALLBACK
        !           689: AboutDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
        !           690: {
        !           691:   UNREFERENCED_PARAMETER( lParam );
        !           692: 
        !           693:   switch( uMsg ) {
        !           694: 
        !           695:     case WM_COMMAND:
        !           696:       switch( LOWORD(wParam) ) {
        !           697: 
        !           698:         case IDOK:
        !           699:           EndDialog( hDlg, TRUE );
        !           700:           return( TRUE );
        !           701:       }
        !           702:       break;
        !           703: 
        !           704:     case WM_INITDIALOG:
        !           705:       return( TRUE );
        !           706: 
        !           707:     case WM_CLOSE:
        !           708:       EndDialog( hDlg, TRUE );
        !           709:       return( TRUE );
        !           710: 
        !           711:   }
        !           712: 
        !           713:   return( FALSE );
        !           714: }
        !           715: 
        !           716: 
        !           717: // ************************************************************************
        !           718: // FUNCTION : NewListBoxWndProc( HWND, UINT, WPARAM, LPARAM )
        !           719: // PURPOSE  : Processes messages for "LISTBOX" class.
        !           720: // COMMENTS : Prevents the user from moving the window
        !           721: //            by dragging the titlebar.
        !           722: // ************************************************************************
        !           723: LRESULT CALLBACK
        !           724: NewListBoxWndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
        !           725: {
        !           726:   switch( uMsg ) {
        !           727: 
        !           728:     case WM_NCLBUTTONDOWN:
        !           729:       if( wParam == HTCAPTION ) {
        !           730:         SetFocus( hWnd );
        !           731:         return( NULL );
        !           732:       }
        !           733:       else
        !           734:         break;
        !           735:   }
        !           736: 
        !           737:   return( CallWindowProc( OldListBoxWndProc, hWnd, uMsg, wParam, lParam) );
        !           738: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.