Annotation of mstools/samples/deb/debmisc.c, revision 1.1.1.1

1.1       root        1: // ************************************************************************
                      2: // MODULE    : DEBMisc.c
                      3: // PURPOSE   : Miscellaneous support functions for the Debug Event Browser
                      4: // FUNCTIONS :
                      5: //   CreateTextButtonBar()         - create a text button bar
                      6: //   OpenDebugee()                 - open a debugee application
                      7: //   ChooseNewFont()               - choose a new font
                      8: //   ChooseNewBkColor()            - choose a new background color
                      9: //   CopyListBoxToClipboard()      - copies a listbox into the clipboard
                     10: //   ListBoxInsert()               - insert a string into a listbox
                     11: //   ListBoxPrintF()               - printf for listboxes
                     12: //   MakeDebugEventString()        - creates standard event info string
                     13: //   OrderFunc()                   - link list ordering function
                     14: //   EnumProcessListFunc()         - enumeration func for active processes
                     15: //   GetPrivateProfileSettings()   - gets stored profile settings
                     16: //   WritePrivateProfileSettings() - stores default settings in profile
                     17: //   UpdateMenuSettings()          - update menu check marks
                     18: //   SubclassWindow()              - generic window subclass func
                     19: //   WritePrivateProfileInt()      - opposite of GetPrivateProfileInt()
                     20: //   SendWmSizeMessage()           - sends a WM_SIZE message with current size
                     21: //   GetPathFromFullPathName()     - extracts path from a pathname
                     22: //   LongToCharUpper()             - converts a long to upper-case string
                     23: // COMMENTS  :
                     24: // ************************************************************************
                     25: #include <Windows.H>
                     26: #include <CommDlg.H>         // GetOpenFileName(), ChooseFont(), etc.
                     27: #include <String.H>          // lstrlen(), lstrcpy(), lstrcat()
                     28: #include <StdLib.H>          // ltoa()
                     29: #include <StdIO.H>           // wsprintf(), vwsprintf()
                     30: #include <StdArg.H>          // va_list, va_start()
                     31: 
                     32: #include "LinkList.H"
                     33: #include "ToolBar.H"
                     34: #include "DEBMain.H"
                     35: #include "DEBDebug.H"
                     36: #include "DEBMisc.H"
                     37: 
                     38: // *************
                     39: // internal data
                     40: // *************
                     41: TCHAR  szInitialDir[256];
                     42: 
                     43: 
                     44: // ************************************************************************
                     45: // FUNCTION : CreateTextButtonBar( HWND, LPINT )
                     46: // PURPOSE  : Creates a Text Button Bar from the resource strings.
                     47: // COMMENTS : Returns window handle to the created text button bar
                     48: // ************************************************************************
                     49: HWND
                     50: CreateTextButtonBar( HWND hWndParent, LPINT lpTextButtonBarHeight )
                     51: {
                     52:   TEXTBUTTON   TextButton[9];
                     53:   static TCHAR szButtonOpen[32];
                     54:   static TCHAR szButtonAttach[32];
                     55:   static TCHAR szButtonCut[32];
                     56:   static TCHAR szButtonCopy[32];
                     57:   static TCHAR szButtonDelete[32];
                     58:   static TCHAR szButtonHelp[32];
                     59: 
                     60:   LoadString( hInstance, IDS_BUTTON_OPEN,   szButtonOpen,   sizeof(szButtonOpen)/sizeof(TCHAR)   );
                     61:   LoadString( hInstance, IDS_BUTTON_ATTACH, szButtonAttach, sizeof(szButtonAttach)/sizeof(TCHAR) );
                     62:   LoadString( hInstance, IDS_BUTTON_CUT,    szButtonCut,    sizeof(szButtonCut)/sizeof(TCHAR)    );
                     63:   LoadString( hInstance, IDS_BUTTON_COPY,   szButtonCopy,   sizeof(szButtonCopy)/sizeof(TCHAR)   );
                     64:   LoadString( hInstance, IDS_BUTTON_DELETE, szButtonDelete, sizeof(szButtonDelete)/sizeof(TCHAR) );
                     65:   LoadString( hInstance, IDS_BUTTON_HELP,   szButtonHelp,   sizeof(szButtonHelp)/sizeof(TCHAR)   );
                     66: 
                     67:   TextButton[0].lpButtonText = szButtonOpen;
                     68:   TextButton[0].idButton     = IDM_FILE_OPEN;
                     69:   TextButton[0].hWndButton   = NULL;
                     70: 
                     71:   TextButton[1].lpButtonText = szButtonAttach;
                     72:   TextButton[1].idButton     = IDM_FILE_ATTACH;
                     73:   TextButton[1].hWndButton   = NULL;
                     74: 
                     75:   TextButton[2].lpButtonText = NULL;
                     76:   TextButton[2].idButton     = TB_SPACE;
                     77:   TextButton[2].hWndButton   = NULL;
                     78: 
                     79:   TextButton[3].lpButtonText = szButtonCut;
                     80:   TextButton[3].idButton     = IDM_EDIT_CUT;
                     81:   TextButton[3].hWndButton   = NULL;
                     82: 
                     83:   TextButton[4].lpButtonText = szButtonCopy;
                     84:   TextButton[4].idButton     = IDM_EDIT_COPY;
                     85:   TextButton[4].hWndButton   = NULL;
                     86: 
                     87:   TextButton[5].lpButtonText = szButtonDelete;
                     88:   TextButton[5].idButton     = IDM_EDIT_DELETE;
                     89:   TextButton[5].hWndButton   = NULL;
                     90: 
                     91:   TextButton[6].lpButtonText = NULL;
                     92:   TextButton[6].idButton     = TB_SPACE;
                     93:   TextButton[6].hWndButton   = NULL;
                     94: 
                     95:   TextButton[7].lpButtonText = szButtonHelp;
                     96:   TextButton[7].idButton     = IDM_HELP_CONTENTS;
                     97:   TextButton[7].hWndButton   = NULL;
                     98: 
                     99:   TextButton[8].lpButtonText = NULL;
                    100:   TextButton[8].idButton     = NULL;
                    101:   TextButton[8].hWndButton   = NULL;
                    102: 
                    103:   return( TextButtonBar( hWndParent, TextButton, lpTextButtonBarHeight ) );
                    104: }
                    105: 
                    106: 
                    107: // ************************************************************************
                    108: // FUNCTION : OpenDebugee( LPPROCESS_INFORMATION, LPSTARTUPINFO )
                    109: // PURPOSE  : Open a debugee and create a debug event processing thread
                    110: // COMMENTS : Return TRUE on success else FALSE
                    111: // ************************************************************************
                    112: BOOL
                    113: OpenDebugee( LPPROCESS_INFORMATION lpProcInfo, LPSTARTUPINFO lpStartInfo )
                    114: {
                    115:   static BOOL  fFirstTime = TRUE;
                    116: 
                    117:   static TCHAR szFilter[128];
                    118:   static TCHAR szTitle[32];
                    119:   static TCHAR szDebugeeTitle[128];
                    120:   static TCHAR szDirName[256];
                    121:   static TCHAR szFile[256];
                    122:   static TCHAR szFileTitle[256];
                    123:   static TCHAR szDefExt[8];
                    124: 
                    125:   static OPENFILENAME OpenFileName;
                    126: 
                    127:   HANDLE hDebugEventThread;
                    128:   DWORD  idDebugEventThread;
                    129: 
                    130:   //-- Load resource strings and init the OpenFileName & lpProcInfo structs
                    131:   //   (do this only one time)
                    132:   if( fFirstTime ) {
                    133:     UINT    FilterNameLen;
                    134: 
                    135:     fFirstTime = FALSE;
                    136:     FilterNameLen = (UINT) LoadString( hInstance, IDS_OFN_FILTERNAME,
                    137:                              szFilter, sizeof(szFilter)/sizeof(TCHAR) );
                    138:     FilterNameLen++;
                    139:     LoadString( hInstance, IDS_OFN_FILTER, &szFilter[FilterNameLen],
                    140:       (sizeof(szFilter)-(FilterNameLen))/sizeof(TCHAR) );
                    141:     LoadString( hInstance, IDS_OFN_TITLE, szTitle, sizeof(szTitle)/sizeof(TCHAR) );
                    142:     LoadString( hInstance, IDS_OFN_DEBUGEE_TITLE, szDebugeeTitle,
                    143:       sizeof(szDebugeeTitle)/sizeof(TCHAR) );
                    144: 
                    145:     lpStartInfo->cb          = sizeof( STARTUPINFO );
                    146:     lpStartInfo->lpDesktop   = NULL;
                    147:     lpStartInfo->lpTitle     = szDebugeeTitle;
                    148:     lpStartInfo->dwX         = 0;
                    149:     lpStartInfo->dwY         = 0;
                    150:     lpStartInfo->dwXSize     = 0;
                    151:     lpStartInfo->dwYSize     = 0;
                    152:     lpStartInfo->dwFlags     = NULL;
                    153:     lpStartInfo->wShowWindow = SW_SHOWDEFAULT;
                    154: 
                    155:     OpenFileName.lStructSize       = sizeof(OPENFILENAME);
                    156:     OpenFileName.hwndOwner         = hWndMain;
                    157:     OpenFileName.hInstance         = hInstance;
                    158:     OpenFileName.lpstrFilter       = (LPSTR) szFilter;
                    159:     OpenFileName.lpstrCustomFilter = (LPSTR) NULL;
                    160:     OpenFileName.nMaxCustFilter    = (DWORD) NULL;
                    161:     OpenFileName.nFilterIndex      = (DWORD) 1;
                    162:     OpenFileName.lpstrFile         = (LPSTR) szFile;
                    163:     OpenFileName.nMaxFile          = sizeof(szFile);
                    164:     OpenFileName.lpstrFileTitle    = (LPSTR) szFileTitle;
                    165:     OpenFileName.nMaxFileTitle     = sizeof(szFileTitle);
                    166:     OpenFileName.lpstrInitialDir   = (LPSTR) (fSavedDirectory ? szInitialDir : NULL);
                    167:     OpenFileName.lpstrTitle        = (LPSTR) szTitle;
                    168:     OpenFileName.Flags             = OFN_HIDEREADONLY;
                    169:     OpenFileName.nFileOffset       = (WORD) NULL;
                    170:     OpenFileName.nFileExtension    = (WORD) NULL;
                    171:     OpenFileName.lpstrDefExt       = (LPSTR) szDefExt;
                    172:     OpenFileName.lCustData         = (DWORD) NULL;
                    173:     OpenFileName.lpfnHook          = (LPOFNHOOKPROC) NULL;
                    174:     OpenFileName.lpTemplateName    = (LPSTR) NULL;
                    175:   }
                    176: 
                    177:   if( !GetOpenFileName(&OpenFileName) )
                    178:     return( FALSE );
                    179: 
                    180:   //-- store recent directory by stripping off the EXE name from the full path
                    181:   GetPathFromFullPathName( (LPTSTR) OpenFileName.lpstrFile, szInitialDir,
                    182:     sizeof(szInitialDir) );
                    183: 
                    184:   //-- now start and detach the debug event processing thread
                    185:   lpProcInfo->hProcess = NULL;
                    186:   if( ( hDebugEventThread = CreateThread(
                    187:                               (LPSECURITY_ATTRIBUTES) NULL,
                    188:                               (DWORD) 0,
                    189:                               (LPTHREAD_START_ROUTINE) DebugEventThread,
                    190:                               (LPVOID) OpenFileName.lpstrFile,
                    191:                               (DWORD) NULL,
                    192:                               (LPDWORD) &idDebugEventThread) ) ) {
                    193: 
                    194:     CloseHandle( hDebugEventThread );
                    195:   }
                    196:   else
                    197:     return( FALSE );
                    198: }
                    199: 
                    200: 
                    201: // ************************************************************************
                    202: // FUNCTION : ChooseNewFont( HWND )
                    203: // PURPOSE  : Choose the displayed font of the debug event listbox
                    204: // COMMENTS : Return TRUE on success else FALSE
                    205: // ************************************************************************
                    206: BOOL
                    207: ChooseNewFont( HWND hWndOwner )
                    208: {
                    209:   static CHOOSEFONT ChooseFontStruct;
                    210:   static BOOL       fFirstTime = TRUE;
                    211: 
                    212:   if( fFirstTime ) {
                    213:     fFirstTime = FALSE;
                    214: 
                    215:     ChooseFontStruct.lStructSize    = sizeof( CHOOSEFONT );
                    216:     ChooseFontStruct.hwndOwner      = hWndOwner;
                    217:     ChooseFontStruct.hDC            = (HDC) NULL;
                    218:     ChooseFontStruct.lpLogFont      = &LogFont;
                    219:     ChooseFontStruct.iPointSize     = (int) NULL;
                    220:     ChooseFontStruct.Flags          = CF_INITTOLOGFONTSTRUCT |
                    221:                                       CF_SCREENFONTS | CF_EFFECTS;
                    222:     ChooseFontStruct.rgbColors      = rgbColor;
                    223:     ChooseFontStruct.lCustData      = (DWORD) NULL;
                    224:     ChooseFontStruct.lpfnHook       = (LPCFHOOKPROC) NULL;
                    225:     ChooseFontStruct.lpTemplateName = (LPSTR) NULL;
                    226:     ChooseFontStruct.hInstance      = (HANDLE) NULL;
                    227:     ChooseFontStruct.lpszStyle      = (LPSTR) NULL;
                    228:     ChooseFontStruct.nFontType      = SCREEN_FONTTYPE;
                    229:     ChooseFontStruct.nSizeMin       = (int) NULL;
                    230:     ChooseFontStruct.nSizeMax       = (int) NULL;
                    231:   }
                    232: 
                    233:   if( ChooseFont( &ChooseFontStruct ) ) {
                    234:     HDC    hDC;
                    235: 
                    236:     hFont = CreateFontIndirect( &LogFont );
                    237:     hDC = GetDC( hWndOwner );
                    238:     SelectObject( hDC, hFont );
                    239:     rgbColor = ChooseFontStruct.rgbColors;
                    240:     InvalidateRect( hWndOwner, NULL, TRUE );
                    241:     SendMessage( hWndOwner, WM_CTLCOLORLISTBOX, (DWORD) hDC,
                    242:       (LONG) hWndOwner );
                    243:     SendMessage( hWndOwner, WM_SETFONT, (DWORD) hFont, TRUE );
                    244:     ReleaseDC( hWndOwner, hDC );
                    245:   }
                    246: 
                    247:   return( TRUE );
                    248: }
                    249: 
                    250: 
                    251: // ************************************************************************
                    252: // FUNCTION : ChooseNewBkColor( HWND )
                    253: // PURPOSE  : Choose the background color of the debug event listbox
                    254: // COMMENTS : Return TRUE on success else FALSE
                    255: // ************************************************************************
                    256: BOOL
                    257: ChooseNewBkColor( HWND hWndOwner )
                    258: {
                    259:   static BOOL        fFirstTime = TRUE;
                    260:   static CHOOSECOLOR ChooseColorStruct;
                    261:   static DWORD       dwCustColors[16];
                    262: 
                    263:   if( fFirstTime ) {
                    264:     int i;
                    265: 
                    266:     fFirstTime = FALSE;
                    267: 
                    268:     //-- set the custom colors to white
                    269:     for( i = 0; i < 16; i++ )
                    270:       dwCustColors[i] = RGB(255,255,255);
                    271: 
                    272:     ChooseColorStruct.lStructSize    = sizeof( CHOOSECOLOR );
                    273:     ChooseColorStruct.hwndOwner      = hWndOwner;
                    274:     ChooseColorStruct.hInstance      = (HANDLE) NULL;
                    275:     ChooseColorStruct.rgbResult      = rgbBkColor;
                    276:     ChooseColorStruct.lpCustColors   = (LPDWORD) dwCustColors;
                    277:     ChooseColorStruct.Flags          = CC_RGBINIT;
                    278:     ChooseColorStruct.lCustData      = 0L;
                    279:     ChooseColorStruct.lpfnHook       = (LPCCHOOKPROC) NULL;
                    280:     ChooseColorStruct.lpTemplateName = (LPSTR) NULL;
                    281:   }
                    282: 
                    283:   if( ChooseColor( &ChooseColorStruct ) ) {
                    284:     HDC    hDC;
                    285: 
                    286:     rgbBkColor = (COLORREF) ChooseColorStruct.rgbResult;
                    287:     hDC = GetDC( hWndOwner );
                    288:     SendMessage( hWndOwner, WM_CTLCOLORLISTBOX, (DWORD) hDC,
                    289:       (LONG) hWndOwner );
                    290:     ReleaseDC( hWndOwner, hDC );
                    291:     InvalidateRect( hWndOwner, NULL, TRUE );
                    292:   }
                    293: 
                    294:   return( TRUE );
                    295: }
                    296: 
                    297: 
                    298: // ************************************************************************
                    299: // FUNCTION : OutOfMemoryMessage( VOID )
                    300: // PURPOSE  : If called, displays an "Out of Memory" message box
                    301: // COMMENTS :
                    302: // ************************************************************************
                    303: VOID
                    304: OutOfMemoryMessage( VOID )
                    305: {
                    306:   MessageBox(
                    307:     GetFocus(),
                    308:     (LPCTSTR) "Out of Memory",
                    309:     (LPCTSTR) "Memory Error",
                    310:     MB_ICONSTOP | MB_APPLMODAL );
                    311: 
                    312:   return;
                    313: }
                    314: 
                    315: 
                    316: // ************************************************************************
                    317: // FUNCTION : CopyListBoxToClipboard( HWND, LONG )
                    318: // PURPOSE  : Copies the entire contents of a listbox into the clipboard.
                    319: // COMMENTS : Returns TRUE on success, FALSE otherwise
                    320: // ************************************************************************
                    321: BOOL
                    322: CopyListBoxToClipboard( HWND hWndListBox, LONG MaxStrLen )
                    323: {
                    324:   LPTSTR  lpDataBuffer;
                    325:   HGLOBAL hDataBuffer;
                    326: 
                    327:   TCHAR  TempBuffer[256];
                    328:   DWORD  dwItemCount;
                    329:   DWORD  Count;
                    330:   LONG   StrLen;
                    331:   DWORD  dwMemSize;
                    332: 
                    333:   dwItemCount = (DWORD) SendMessage( hWndListBox, LB_GETCOUNT, 0 , 0 );
                    334:   dwMemSize = dwItemCount * (DWORD) MaxStrLen;
                    335: 
                    336:   //-- limit the size copied to the clipboard
                    337:   if( dwMemSize > 0xFFFFF )
                    338:     dwMemSize = 0xFFFFF;
                    339: 
                    340:   if( !(hDataBuffer = GlobalAlloc( GMEM_DDESHARE, dwMemSize ) ) ) {
                    341:     OutOfMemoryMessage();
                    342:     return( FALSE );
                    343:   }
                    344:   if( !(lpDataBuffer = (LPTSTR) GlobalLock( hDataBuffer ) ) ) {
                    345:     GlobalFree( hDataBuffer );
                    346:     OutOfMemoryMessage();
                    347:     return( FALSE );
                    348:   }
                    349: 
                    350:   *lpDataBuffer = '\0';
                    351: 
                    352:   for( Count = 0; Count < dwItemCount; Count++ ) {
                    353:     StrLen = SendMessage( hWndListBox, LB_GETTEXTLEN, Count, 0L );
                    354:     if( StrLen > (sizeof(TempBuffer)-3) )
                    355:       continue;
                    356:     StrLen = SendMessage( hWndListBox, LB_GETTEXT, Count, (LPARAM) TempBuffer );
                    357:     TempBuffer[StrLen]   = '\r';
                    358:     TempBuffer[StrLen+1] = '\n';
                    359:     TempBuffer[StrLen+2] = '\0';
                    360:     lstrcat( lpDataBuffer, TempBuffer );
                    361:   }
                    362: 
                    363:   GlobalUnlock( hDataBuffer );
                    364: 
                    365:   if( !OpenClipboard( hWndListBox ) ) {
                    366:     Sleep( 250 );  // wait a quarter second and try again.
                    367:     if( !OpenClipboard( hWndListBox ) ) {
                    368:       MessageBox( GetFocus(),
                    369:         (LPCTSTR) "Could not open the Clipboard!",
                    370:         (LPCTSTR) "Cannot Open Clipboard",
                    371:         MB_ICONSTOP | MB_APPLMODAL );
                    372:       GlobalFree( hDataBuffer );
                    373:       return( FALSE );
                    374:     }
                    375:   }
                    376:   if( !EmptyClipboard() ) {
                    377:     MessageBox( GetFocus(),
                    378:       (LPCTSTR) "Could not empty the Clipboard!",
                    379:       (LPCTSTR) "Cannot Empty Clipboard",
                    380:       MB_ICONSTOP | MB_APPLMODAL );
                    381:     GlobalFree( hDataBuffer );
                    382:     return( FALSE );
                    383:   }
                    384:   if( !SetClipboardData( CF_TEXT, hDataBuffer ) ) {
                    385:     MessageBox( GetFocus(),
                    386:       (LPCTSTR) "Could not copy data to the Clipboard!",
                    387:       (LPCTSTR) "Cannot Set Clipboard Data",
                    388:       MB_ICONSTOP | MB_APPLMODAL );
                    389:     GlobalFree( hDataBuffer );
                    390:     return( FALSE );
                    391:   }
                    392:   CloseClipboard();
                    393: 
                    394:   return( TRUE );
                    395: }
                    396: 
                    397: // ************************************************************************
                    398: // FUNCTION : ListBoxInsert( HWND, LPLONG, LPCTSTR )
                    399: // PURPOSE  : Inserts the string into the listbox.
                    400: // COMMENTS : Returns the index of the string inserted
                    401: // ************************************************************************
                    402: LONG
                    403: ListBoxInsert( HWND hWndListBox, LPLONG lpMaxStrLen, LPCTSTR lpszString )
                    404: {
                    405:   static LONG MaxTextExtent = 0;
                    406: 
                    407:   LONG idx;
                    408: 
                    409:   if( lpszString == NULL ) {
                    410:     MaxTextExtent = 0;
                    411:     SendMessage( hWndListBox, LB_SETHORIZONTALEXTENT, 0, 0 );
                    412:     return( 0 );
                    413:   }
                    414: 
                    415:   if( hWndListBox != NULL ) {
                    416:     HDC  hDC;
                    417:     SIZE size;
                    418:     LONG StrLen;
                    419: 
                    420:     if( (StrLen = lstrlen( lpszString)) > *lpMaxStrLen )
                    421:       *lpMaxStrLen = StrLen;
                    422: 
                    423:     hDC = GetDC( hWndListBox );
                    424:     SelectObject( hDC, hFont );
                    425:     GetTextExtentPoint( hDC, lpszString, StrLen, &size );
                    426:     ReleaseDC( hWndListBox, hDC );
                    427: 
                    428:     if( size.cx > MaxTextExtent ) {
                    429:       MaxTextExtent = size.cx;
                    430:       SendMessage( hWndListBox, LB_SETHORIZONTALEXTENT, (WPARAM) (MaxTextExtent*1.1), 0 );
                    431:     }
                    432: 
                    433:     SendMessage( hWndListBox, WM_SETREDRAW, (WPARAM) FALSE, 0 );
                    434:     idx = SendMessage( hWndListBox, LB_ADDSTRING, 0, (LPARAM) lpszString );
                    435:     SendMessage( hWndListBox, WM_SETREDRAW, (WPARAM) TRUE, 0 );
                    436:     SendMessage( hWndListBox, LB_SETCURSEL, idx, 0 );
                    437:   }
                    438: 
                    439:   return( idx );
                    440: }
                    441: 
                    442: 
                    443: // ************************************************************************
                    444: // FUNCTION : ListBoxPrintF( LPCTSTR, ... )
                    445: // PURPOSE  : Inserts the string format into the Debug Event listbox.
                    446: // COMMENTS : Returns the index of the string inserted
                    447: // ************************************************************************
                    448: LONG
                    449: ListBoxPrintF( LPCTSTR szFormat, ... )
                    450: {
                    451:   va_list valist;
                    452:   static TCHAR szBuf[1024];
                    453:   int n;
                    454: 
                    455:   va_start(valist, szFormat);
                    456:   n = wvsprintf( szBuf, szFormat, valist );
                    457: 
                    458:   return ( ListBoxInsert( hWndDebugList, &MaxStrLen, szBuf ) );
                    459: }
                    460: 
                    461: 
                    462: // ************************************************************************
                    463: // FUNCTION : MakeDebugEventString( LPCTSTR, LPCTSTR, LPDEBUG_EVENT )
                    464: // PURPOSE  : Fill in the Debug Event information into a string buffer
                    465: // COMMENTS : The string buffer contains the information common to all
                    466: //            debug events (PID, TID, Event).
                    467: // ************************************************************************
                    468: BOOL
                    469: MakeDebugEventString(LPTSTR lpszDebugEventBuffer, LPCTSTR lpszDebugEventName,
                    470:   LPDEBUG_EVENT lpDebugEvent)
                    471: {
                    472:   TCHAR szTempBuf[9];
                    473:   TCHAR szTempBuf2[9];
                    474: 
                    475:   wsprintf( lpszDebugEventBuffer, (LPCTSTR) "Pid:%s \tTid:%s \t%s",
                    476:     (LPTSTR) LongToCharUpper( (LONG) lpDebugEvent->dwProcessId, szTempBuf, 16),
                    477:     (LPTSTR) LongToCharUpper( (LONG) lpDebugEvent->dwThreadId, szTempBuf2, 16),
                    478:     lpszDebugEventName );
                    479: 
                    480:   return( TRUE );
                    481: }
                    482: 
                    483: 
                    484: // ************************************************************************
                    485: // FUNCTION : OrderFunc( PNODE, PNODE );
                    486: // PURPOSE  : Provides the sorting/search logic for the double linked
                    487: //            list package
                    488: // COMMENTS : Sorted by thread ID value
                    489: // ************************************************************************
                    490: int
                    491: OrderFunc( PNODE NodeOne, PNODE NodeTwo )
                    492: {
                    493:   if( (NodeOne->NodeData).dwThreadId < (NodeTwo->NodeData).dwThreadId )
                    494:     return( LEFT_OF );
                    495: 
                    496:   if( (NodeOne->NodeData).dwThreadId > (NodeTwo->NodeData).dwThreadId )
                    497:     return( RIGHT_OF );
                    498: 
                    499:   return( MATCH );
                    500: }
                    501: 
                    502: 
                    503: // ************************************************************************
                    504: // FUNCTION : EnumProcessListFunc( HWND, LPARAM )
                    505: // PURPOSE  : Callback function for EnumWindows
                    506: // COMMENTS : Inserts found window title strings into the listbox.
                    507: //            Return !NULL to continue enumeration.
                    508: // ************************************************************************
                    509: BOOL CALLBACK
                    510: EnumProcessListFunc( HWND hWnd, LPARAM lParam )
                    511: {
                    512:   static DWORD dwCurrentProcessId;
                    513:   static BOOL  fFirstTime = TRUE;
                    514:   static LONG  MaxStrLen  = 0;
                    515: 
                    516:   HWND   hWndListBox  = (HWND) lParam;
                    517:   TCHAR  TextBuf[256];
                    518:   DWORD  dwProcessId;
                    519:   LONG   idx;
                    520: 
                    521:   if( fFirstTime ) {
                    522:     fFirstTime = FALSE;
                    523:     dwCurrentProcessId = GetCurrentProcessId();
                    524:   }
                    525: 
                    526:   if( hWnd ) {
                    527:     GetWindowText( hWnd, (LPTSTR) &TextBuf, 256 );
                    528:     if( *TextBuf ) {
                    529:       GetWindowThreadProcessId( hWnd, &dwProcessId );
                    530:       if( dwProcessId != dwCurrentProcessId ) {
                    531:         idx = ListBoxInsert( hWndListBox, &MaxStrLen, TextBuf );
                    532:         SendMessage( hWndListBox, LB_SETITEMDATA, (UINT) idx,
                    533:           (LONG) dwProcessId );
                    534:       }
                    535:     }
                    536:   }
                    537: 
                    538:   return( !NULL );
                    539: }
                    540: 
                    541: 
                    542: // ========================================================================
                    543: // helper functions (use global variables)
                    544: // ========================================================================
                    545: 
                    546: 
                    547: // ************************************************************************
                    548: // FUNCTION : GetPrivateProfileSettings( LPCTSTR, LPCTSTR )
                    549: // PURPOSE  : Retrieves the stored preferences and options from the
                    550: //            profile (registry)
                    551: // COMMENTS :
                    552: // ************************************************************************
                    553: BOOL
                    554: GetPrivateProfileSettings( LPCTSTR lpszAppTitle, LPCTSTR lpszIniPathName )
                    555: {
                    556:   xPos    = (int) GetPrivateProfileInt( lpszAppTitle, (LPCTSTR) "xPos",    (DWORD) CW_USEDEFAULT, lpszIniPathName );
                    557:   yPos    = (int) GetPrivateProfileInt( lpszAppTitle, (LPCTSTR) "yPos",    (DWORD) CW_USEDEFAULT, lpszIniPathName );
                    558:   nWidth  = (int) GetPrivateProfileInt( lpszAppTitle, (LPCTSTR) "nWidth",  (DWORD) CW_USEDEFAULT, lpszIniPathName );
                    559:   nHeight = (int) GetPrivateProfileInt( lpszAppTitle, (LPCTSTR) "nHeight", (DWORD) CW_USEDEFAULT, lpszIniPathName );
                    560: 
                    561:   fMaximized       = (BOOL) GetPrivateProfileInt( lpszAppTitle, (LPCTSTR) "fMaximized",       FALSE, lpszIniPathName );
                    562:   fToolBar         = (BOOL) GetPrivateProfileInt( lpszAppTitle, (LPCTSTR) "fToolBar",         TRUE,  lpszIniPathName );
                    563:   fSavedDirectory  = (BOOL) GetPrivateProfileInt( lpszAppTitle, (LPCTSTR) "fSavedDirectory",  TRUE,  lpszIniPathName );
                    564:   fSavePreferences = (BOOL) GetPrivateProfileInt( lpszAppTitle, (LPCTSTR) "fSavePreferences", FALSE, lpszIniPathName );
                    565:   fSaveOnExit      = (BOOL) GetPrivateProfileInt( lpszAppTitle, (LPCTSTR) "fSaveOnExit",      TRUE,  lpszIniPathName );
                    566:   fClearOnNew      = (BOOL) GetPrivateProfileInt( lpszAppTitle, (LPCTSTR) "fClearOnNew",      TRUE,  lpszIniPathName );
                    567:   fVerbose         = (BOOL) GetPrivateProfileInt( lpszAppTitle, (LPCTSTR) "fVerbose",         FALSE, lpszIniPathName );
                    568:   fShowSymbols     = (BOOL) GetPrivateProfileInt( lpszAppTitle, (LPCTSTR) "fShowSymbols",     FALSE, lpszIniPathName );
                    569: 
                    570:   DebugMode        = (LONG) GetPrivateProfileInt( lpszAppTitle, (LPCTSTR) "DebugMode",       DEBUG_PROCESS        , lpszIniPathName );
                    571:   DebugeePriority  = (LONG) GetPrivateProfileInt( lpszAppTitle, (LPCTSTR) "DebugeePriority", NORMAL_PRIORITY_CLASS, lpszIniPathName );
                    572: 
                    573:   GetPrivateProfileString( lpszAppTitle, (LPCTSTR) "InitialDir", NULL, szInitialDir,
                    574:     sizeof( szInitialDir ), lpszIniPathName );
                    575: 
                    576:   LogFont.lfHeight         = (LONG) GetPrivateProfileInt( lpszAppTitle, (LPCTSTR) "lfHeight",         13   ,       lpszIniPathName ) * -1L;
                    577:   LogFont.lfWidth          = (LONG) GetPrivateProfileInt( lpszAppTitle, (LPCTSTR) "lfWidth",          0    ,       lpszIniPathName );
                    578:   LogFont.lfWeight         = (LONG) GetPrivateProfileInt( lpszAppTitle, (LPCTSTR) "lfWeight",         400  ,       lpszIniPathName );
                    579:   LogFont.lfItalic         = (BYTE) GetPrivateProfileInt( lpszAppTitle, (LPCTSTR) "lfItalic",         FALSE,       lpszIniPathName );
                    580:   LogFont.lfUnderline      = (BYTE) GetPrivateProfileInt( lpszAppTitle, (LPCTSTR) "lfUnderline",      FALSE,       lpszIniPathName );
                    581:   LogFont.lfStrikeOut      = (BYTE) GetPrivateProfileInt( lpszAppTitle, (LPCTSTR) "lfStrikeOut",      FALSE,       lpszIniPathName );
                    582:   LogFont.lfPitchAndFamily = (BYTE) GetPrivateProfileInt( lpszAppTitle, (LPCTSTR) "lfPitchAndFamily", FF_DONTCARE, lpszIniPathName );
                    583: 
                    584:   GetPrivateProfileString( lpszAppTitle, (LPCTSTR) "lfFaceName", (LPCTSTR) "Arial", LogFont.lfFaceName,
                    585:     LF_FACESIZE, lpszIniPathName );
                    586: 
                    587:   rgbColor   = (COLORREF) GetPrivateProfileInt( lpszAppTitle, (LPCTSTR) "rgbColor",
                    588:                             GetSysColor(COLOR_WINDOWTEXT), lpszIniPathName );
                    589:   rgbBkColor = (COLORREF) GetPrivateProfileInt( lpszAppTitle, (LPCTSTR) "rgbBkColor",
                    590:                             GetSysColor(COLOR_WINDOW), lpszIniPathName );
                    591:   return( TRUE );
                    592: }
                    593: 
                    594: 
                    595: // ************************************************************************
                    596: // FUNCTION : WritePrivateProfileSettings( LPCTSTR, LPCTSTR )
                    597: // PURPOSE  : Saves the preferences and options to the profile (registry)
                    598: // COMMENTS :
                    599: // ************************************************************************
                    600: BOOL
                    601: WritePrivateProfileSettings( LPCTSTR lpszAppTitle, LPCTSTR lpszIniPathName )
                    602: {
                    603:   if( fSaveOnExit ) {
                    604:     WritePrivateProfileInt( lpszAppTitle, (LPCTSTR) "xPos",    xPos,    lpszIniPathName );
                    605:     WritePrivateProfileInt( lpszAppTitle, (LPCTSTR) "yPos",    yPos,    lpszIniPathName );
                    606:     WritePrivateProfileInt( lpszAppTitle, (LPCTSTR) "nWidth",  nWidth,  lpszIniPathName );
                    607:     WritePrivateProfileInt( lpszAppTitle, (LPCTSTR) "nHeight", nHeight, lpszIniPathName );
                    608: 
                    609:     WritePrivateProfileInt( lpszAppTitle, (LPCTSTR) "fMaximized",       fMaximized,       lpszIniPathName );
                    610:     WritePrivateProfileInt( lpszAppTitle, (LPCTSTR) "fToolBar",         fToolBar,         lpszIniPathName );
                    611:     WritePrivateProfileInt( lpszAppTitle, (LPCTSTR) "fSavedDirectory",  fSavedDirectory,  lpszIniPathName );
                    612:     WritePrivateProfileInt( lpszAppTitle, (LPCTSTR) "fSavePreferences", fSavePreferences, lpszIniPathName );
                    613: 
                    614:     if( fSavePreferences ) {
                    615:       WritePrivateProfileInt( lpszAppTitle, (LPCTSTR) "fClearOnNew",  fClearOnNew,  lpszIniPathName );
                    616:       WritePrivateProfileInt( lpszAppTitle, (LPCTSTR) "fVerbose",     fVerbose,     lpszIniPathName );
                    617:       WritePrivateProfileInt( lpszAppTitle, (LPCTSTR) "fShowSymbols", fShowSymbols, lpszIniPathName );
                    618: 
                    619:       WritePrivateProfileInt( lpszAppTitle, (LPCTSTR) "DebugMode",       DebugMode,       lpszIniPathName );
                    620:       WritePrivateProfileInt( lpszAppTitle, (LPCTSTR) "DebugeePriority", DebugeePriority, lpszIniPathName );
                    621:     }
                    622: 
                    623:     WritePrivateProfileString( lpszAppTitle, (LPCTSTR) "InitialDir", szInitialDir, lpszIniPathName );
                    624: 
                    625:     WritePrivateProfileInt( lpszAppTitle, (LPCTSTR) "lfHeight",         (INT) abs(LogFont.lfHeight),    lpszIniPathName );
                    626:     WritePrivateProfileInt( lpszAppTitle, (LPCTSTR) "lfWidth",          (INT) LogFont.lfWidth,          lpszIniPathName );
                    627:     WritePrivateProfileInt( lpszAppTitle, (LPCTSTR) "lfWeight",         (INT) LogFont.lfWeight,         lpszIniPathName );
                    628:     WritePrivateProfileInt( lpszAppTitle, (LPCTSTR) "lfItalic",         (INT) LogFont.lfItalic,         lpszIniPathName );
                    629:     WritePrivateProfileInt( lpszAppTitle, (LPCTSTR) "lfUnderline",      (INT) LogFont.lfUnderline,      lpszIniPathName );
                    630:     WritePrivateProfileInt( lpszAppTitle, (LPCTSTR) "lfStrikeOut",      (INT) LogFont.lfStrikeOut,      lpszIniPathName );
                    631:     WritePrivateProfileInt( lpszAppTitle, (LPCTSTR) "lfPitchAndFamily", (INT) LogFont.lfPitchAndFamily, lpszIniPathName );
                    632: 
                    633:     WritePrivateProfileString( lpszAppTitle, (LPCTSTR) "lfFaceName", LogFont.lfFaceName, lpszIniPathName );
                    634: 
                    635:     WritePrivateProfileInt( lpszAppTitle, (LPCTSTR) "rgbColor",   rgbColor  , lpszIniPathName );
                    636:     WritePrivateProfileInt( lpszAppTitle, (LPCTSTR) "rgbBkColor", rgbBkColor, lpszIniPathName );
                    637:   }
                    638:   WritePrivateProfileInt( lpszAppTitle, (LPCTSTR) "fSaveOnExit", fSaveOnExit, lpszIniPathName );
                    639: 
                    640:   return( TRUE );
                    641: }
                    642: 
                    643: 
                    644: // ************************************************************************
                    645: // FUNCTION : UpdateMenuSettings( VOID )
                    646: // PURPOSE  : Adds check marks to active menu items
                    647: // COMMENTS :
                    648: // ************************************************************************
                    649: BOOL
                    650: UpdateMenuSettings( VOID )
                    651: {
                    652:   if( fToolBar )
                    653:     CheckMenuItem( GetMenu( hWndMain), IDM_OPTIONS_TOOLBAR, MF_CHECKED );
                    654:   if( fSavedDirectory )
                    655:     CheckMenuItem( GetMenu( hWndMain), IDM_OPTIONS_SAVEDDIR, MF_CHECKED );
                    656:   if( fSaveOnExit )
                    657:     CheckMenuItem( GetMenu( hWndMain), IDM_OPTIONS_SAVEONEXIT, MF_CHECKED );
                    658: 
                    659:   return( TRUE );
                    660: }
                    661: 
                    662: 
                    663: // ************************************************************************
                    664: // FUNCTION : SubclassWindow( HWND, WNDPROC )
                    665: // PURPOSE  : Subclasses a window procedure
                    666: // COMMENTS : Returns the old window procedure
                    667: // ************************************************************************
                    668: WNDPROC
                    669: SubclassWindow( HWND hWnd, WNDPROC NewWndProc)
                    670: {
                    671:   WNDPROC OldWndProc;
                    672: 
                    673:   OldWndProc = (WNDPROC) GetWindowLong( hWnd, GWL_WNDPROC );
                    674:   SetWindowLong( hWnd, GWL_WNDPROC, (LONG) NewWndProc );
                    675: 
                    676:   return OldWndProc;
                    677: }
                    678: 
                    679: 
                    680: // ************************************************************************
                    681: // FUNCTION: WritePrivateProfileInt( LPCTSTR, LPCTSTR, INT, LPCTSTR )
                    682: // PURPOSE : Writes the value of an integer from a specified keyname within
                    683: //           a specified section of the Private Profile
                    684: // COMMENTS: Matched pair to GetPrivateProfileInt
                    685: // ************************************************************************
                    686: BOOL
                    687: WritePrivateProfileInt( LPCTSTR lpAppName, LPCTSTR lpKeyName, INT Value, LPCTSTR lpFileName )
                    688: {
                    689:   TCHAR ValBuf[16];
                    690: 
                    691:   wsprintf( ValBuf, (LPCSTR) "%i", Value);
                    692: 
                    693:   return( WritePrivateProfileString( lpAppName, lpKeyName, ValBuf, lpFileName ) );
                    694: }
                    695: 
                    696: 
                    697: // ************************************************************************
                    698: // FUNCTION : SendWmSizeMessage( HWND )
                    699: // PURPOSE  : Sends a WM_SIZE message containing the current size
                    700: // COMMENTS : Forces a WM_SIZE message without actually changing the size
                    701: // ************************************************************************
                    702: BOOL
                    703: SendWmSizeMessage( HWND hWnd )
                    704: {
                    705:   RECT rect;
                    706: 
                    707:   if( !GetClientRect( hWnd, &rect ) )
                    708:     return( FALSE );
                    709: 
                    710:   return( SendMessage( hWndMain, WM_SIZE, SIZENORMAL,
                    711:             MAKELONG( rect.right - rect.left, rect.bottom - rect.top) ) );
                    712: }
                    713: 
                    714: 
                    715: // ************************************************************************
                    716: // FUNCTION : GetPathFromFullPathName( LPCTSTR, LPTSTR, UINT )
                    717: // PURPOSE  : Extracts the path given a full pathname
                    718: // COMMENTS :
                    719: // ************************************************************************
                    720: UINT
                    721: GetPathFromFullPathName( LPCTSTR lpFullPathName, LPTSTR lpPathBuffer,
                    722:   UINT nPathBufferLength )
                    723: {
                    724:   UINT nLength;
                    725:   int i;
                    726: 
                    727:   if( (nLength = (UINT) lstrlen( lpFullPathName ) ) > nPathBufferLength )
                    728:     return( nLength );
                    729: 
                    730:   lstrcpy( lpPathBuffer, lpFullPathName );
                    731: 
                    732:   for( i = lstrlen( lpPathBuffer );
                    733:        (lpPathBuffer[i] != '\\') && (lpPathBuffer[i] != ':');
                    734:        i-- )
                    735:   ;
                    736:   if( lpPathBuffer[i] == ':' )
                    737:     lpPathBuffer[i+1] = '\0';
                    738:   else
                    739:     lpPathBuffer[i] = '\0';
                    740: 
                    741:   return( (UINT) i );
                    742: }
                    743: 
                    744: 
                    745: // ************************************************************************
                    746: // FUNCTION : LongToCharUpper( long, LPTSTR, int )
                    747: // PURPOSE  : Converts a long to an upper-case string
                    748: // COMMENTS :
                    749: // ************************************************************************
                    750: LPTSTR
                    751: LongToCharUpper( long Value, LPTSTR String, int Radix )
                    752: {
                    753:   if( Radix > 10 )
                    754:     return( CharUpper( (LPTSTR) ltoa( Value, (LPSTR) String, Radix ) ) );
                    755: 
                    756:   return( (LPTSTR) ltoa( Value, (LPSTR) String, Radix ) );
                    757: }

unix.superglobalmegacorp.com

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