| /* |
| * Message spying routines |
| * |
| * Copyright 1994, Bob Amstadt |
| * 1995, Alex Korobka |
| */ |
| |
| #include <stdlib.h> |
| #include <stdio.h> |
| #include <string.h> |
| #include "windows.h" |
| #include "module.h" |
| #include "options.h" |
| #include "stddebug.h" |
| #include "debug.h" |
| #include "spy.h" |
| |
| #define SPY_MAX_MSGNUM WM_USER |
| #define SPY_INDENT_UNIT 4 /* 4 spaces */ |
| |
| static const char *MessageTypeNames[SPY_MAX_MSGNUM + 1] = |
| { |
| "WM_NULL", /* 0x00 */ |
| "WM_CREATE", |
| "WM_DESTROY", |
| "WM_MOVE", |
| "WM_SIZEWAIT", |
| "WM_SIZE", |
| "WM_ACTIVATE", |
| "WM_SETFOCUS", |
| "WM_KILLFOCUS", |
| "WM_SETVISIBLE", |
| "WM_ENABLE", |
| "WM_SETREDRAW", |
| "WM_SETTEXT", |
| "WM_GETTEXT", |
| "WM_GETTEXTLENGTH", |
| "WM_PAINT", |
| "WM_CLOSE", /* 0x10 */ |
| "WM_QUERYENDSESSION", |
| "WM_QUIT", |
| "WM_QUERYOPEN", |
| "WM_ERASEBKGND", |
| "WM_SYSCOLORCHANGE", |
| "WM_ENDSESSION", |
| "WM_SYSTEMERROR", |
| "WM_SHOWWINDOW", |
| "WM_CTLCOLOR", |
| "WM_WININICHANGE", |
| "WM_DEVMODECHANGE", |
| "WM_ACTIVATEAPP", |
| "WM_FONTCHANGE", |
| "WM_TIMECHANGE", |
| "WM_CANCELMODE", |
| "WM_SETCURSOR", /* 0x20 */ |
| "WM_MOUSEACTIVATE", |
| "WM_CHILDACTIVATE", |
| "WM_QUEUESYNC", |
| "WM_GETMINMAXINFO", |
| "WM_UNUSED3", |
| "WM_PAINTICON", |
| "WM_ICONERASEBKGND", |
| "WM_NEXTDLGCTL", |
| "WM_ALTTABACTIVE", |
| "WM_SPOOLERSTATUS", |
| "WM_DRAWITEM", |
| "WM_MEASUREITEM", |
| "WM_DELETEITEM", |
| "WM_VKEYTOITEM", |
| "WM_CHARTOITEM", |
| "WM_SETFONT", /* 0x30 */ |
| "WM_GETFONT", |
| "WM_SETHOTKEY", |
| "WM_GETHOTKEY", |
| "WM_FILESYSCHANGE", |
| "WM_ISACTIVEICON", |
| "WM_QUERYPARKICON", |
| "WM_QUERYDRAGICON", |
| "WM_QUERYSAVESTATE", |
| "WM_COMPAREITEM", |
| "WM_TESTING", |
| NULL, |
| "WM_OTHERWINDOWCREATED", |
| "WM_OTHERWINDOWDESTROYED", |
| "WM_ACTIVATESHELLWINDOW", |
| NULL, |
| |
| NULL, /* 0x40 */ |
| "WM_COMPACTING", NULL, NULL, |
| "WM_COMMNOTIFY", NULL, |
| "WM_WINDOWPOSCHANGING", /* 0x0046 */ |
| "WM_WINDOWPOSCHANGED", /* 0x0047 */ |
| "WM_POWER", NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| |
| NULL, /* 0x0050 */ |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| |
| /* 0x0060 */ |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| |
| /* 0x0070 */ |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| |
| NULL, /* 0x0080 */ |
| "WM_NCCREATE", /* 0x0081 */ |
| "WM_NCDESTROY", /* 0x0082 */ |
| "WM_NCCALCSIZE", /* 0x0083 */ |
| "WM_NCHITTEST", /* 0x0084 */ |
| "WM_NCPAINT", /* 0x0085 */ |
| "WM_NCACTIVATE", /* 0x0086 */ |
| "WM_GETDLGCODE", /* 0x0087 */ |
| "WM_SYNCPAINT", |
| "WM_SYNCTASK", NULL, NULL, NULL, NULL, NULL, NULL, |
| |
| /* 0x0090 */ |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| |
| /* 0x00A0 */ |
| "WM_NCMOUSEMOVE", /* 0x00A0 */ |
| "WM_NCLBUTTONDOWN", /* 0x00A1 */ |
| "WM_NCLBUTTONUP", /* 0x00A2 */ |
| "WM_NCLBUTTONDBLCLK", /* 0x00A3 */ |
| "WM_NCRBUTTONDOWN", /* 0x00A4 */ |
| "WM_NCRBUTTONUP", /* 0x00A5 */ |
| "WM_NCRBUTTONDBLCLK", /* 0x00A6 */ |
| "WM_NCMBUTTONDOWN", /* 0x00A7 */ |
| "WM_NCMBUTTONUP", /* 0x00A8 */ |
| "WM_NCMBUTTONDBLCLK", /* 0x00A9 */ |
| NULL, NULL, NULL, NULL, NULL, NULL, |
| |
| /* 0x00B0 - Win32 Edit controls */ |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| |
| /* 0x00C0 */ |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| |
| /* 0x00D0 */ |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| |
| /* 0x00E0 - Win32 Scrollbars */ |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| |
| /* 0x00F0 - Win32 Buttons */ |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| |
| "WM_KEYDOWN", /* 0x0100 */ |
| "WM_KEYUP", /* 0x0101 */ |
| "WM_CHAR", /* 0x0102 */ |
| "WM_DEADCHAR", /* 0x0103 */ |
| "WM_SYSKEYDOWN", /* 0x0104 */ |
| "WM_SYSKEYUP", /* 0x0105 */ |
| "WM_SYSCHAR", /* 0x0106 */ |
| "WM_SYSDEADCHAR", /* 0x0107 */ |
| "WM_KEYLAST", /* 0x0108 */ |
| NULL, |
| "WM_CONVERTREQUEST", |
| "WM_CONVERTRESULT", |
| "WM_INTERIM", NULL, NULL, NULL, |
| |
| "WM_INITDIALOG", /* 0x0110 */ |
| "WM_COMMAND", /* 0x0111 */ |
| "WM_SYSCOMMAND", /* 0x0112 */ |
| "WM_TIMER", /* 0x0113 */ |
| "WM_HSCROLL", /* 0x0114 */ |
| "WM_VSCROLL", /* 0x0115 */ |
| "WM_INITMENU", /* 0x0116 */ |
| "WM_INITMENUPOPUP", /* 0x0117 */ |
| "WM_SYSTIMER", /* 0x0118 */ |
| NULL, NULL, NULL, NULL, NULL, NULL, |
| "WM_MENUSELECT", /* 0x011f */ |
| |
| "WM_MENUCHAR", /* 0x0120 */ |
| "WM_ENTERIDLE", /* 0x0121 */ |
| NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| |
| /* 0x0130 */ |
| NULL, "wm_lbtrackpoint", |
| NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| |
| /* 0x0140 - Win32 Comboboxes */ |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| |
| /* 0x0150 */ |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| |
| /* 0x0160 */ |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| |
| /* 0x0170 - Win32 Static controls */ |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| |
| /* 0x0180 - Win32 Listboxes */ |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| |
| /* 0x0190 */ |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| |
| /* 0x01A0 */ |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| |
| /* 0x01B0 */ |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| |
| /* 0x01C0 */ |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| |
| /* 0x01D0 */ |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| |
| /* 0x01E0 */ |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| |
| /* 0x01F0 */ |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| |
| "WM_MOUSEMOVE", /* 0x0200 */ |
| "WM_LBUTTONDOWN", /* 0x0201 */ |
| "WM_LBUTTONUP", /* 0x0202 */ |
| "WM_LBUTTONDBLCLK", /* 0x0203 */ |
| "WM_RBUTTONDOWN", /* 0x0204 */ |
| "WM_RBUTTONUP", /* 0x0205 */ |
| "WM_RBUTTONDBLCLK", /* 0x0206 */ |
| "WM_MBUTTONDOWN", /* 0x0207 */ |
| "WM_MBUTTONUP", /* 0x0208 */ |
| "WM_MBUTTONDBLCLK", /* 0x0209 */ |
| NULL, NULL, NULL, NULL, NULL, NULL, |
| |
| "WM_PARENTNOTIFY", /* 0x0210 */ |
| "WM_ENTERMENULOOP", /* 0x0211 */ |
| "WM_EXITMENULOOP", /* 0x0212 */ |
| "WM_NEXTMENU", /* 0x0213 */ |
| NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| |
| "WM_MDICREATE", /* 0x0220 */ |
| "WM_MDIDESTROY", /* 0x0221 */ |
| "WM_MDIACTIVATE", /* 0x0222 */ |
| "WM_MDIRESTORE", /* 0x0223 */ |
| "WM_MDINEXT", /* 0x0224 */ |
| "WM_MDIMAXIMIZE", /* 0x0225 */ |
| "WM_MDITILE", /* 0x0226 */ |
| "WM_MDICASCADE", /* 0x0227 */ |
| "WM_MDIICONARRANGE", /* 0x0228 */ |
| "WM_MDIGETACTIVE", /* 0x0229 */ |
| |
| "wm_dropobject", |
| "wm_querydropobject", |
| "wm_begindrag", |
| "wm_dragloop", |
| "wn_dragselect", |
| "wm_dragmove", |
| |
| /* 0x0230*/ |
| "WM_MDISETMENU", /* 0x0230 */ |
| "WM_ENTERSIZEMOVE", /* 0x0231 */ |
| "WM_EXITSIZEMOVE", /* 0x0232 */ |
| "WM_DROPFILES", /* 0x0233 */ |
| NULL, NULL, NULL, NULL, |
| /* 0x0238*/ |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| |
| /* 0x0240 */ |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| |
| /* 0x0250 */ |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| |
| /* 0x0260 */ |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| |
| /* 0x0280 */ |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| |
| /* 0x02c0 */ |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| |
| "WM_CUT", /* 0x0300 */ |
| "WM_COPY", |
| "WM_PASTE", |
| "WM_CLEAR", |
| "WM_UNDO", |
| "WM_RENDERFORMAT", |
| "WM_RENDERALLFORMATS", |
| "WM_DESTROYCLIPBOARD", |
| "WM_DRAWCLIPBOARD", |
| "WM_PAINTCLIPBOARD", |
| "WM_VSCROLLCLIPBOARD", |
| "WM_SIZECLIPBOARD", |
| "WM_ASKCBFORMATNAME", |
| "WM_CHANGECBCHAIN", |
| "WM_HSCROLLCLIPBOARD", |
| "WM_QUERYNEWPALETTE", /* 0x030f*/ |
| |
| "WM_PALETTEISCHANGING", |
| "WM_PALETTECHANGED", /* 0x0311 */ |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| |
| /* 0x0340 */ |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| |
| /* 0x0380 */ |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| |
| "WM_COALESCE_FIRST", |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| "WM_COALESCE_LAST", |
| |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| |
| /* 0x03c0 */ |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| |
| /* 0x03e0 */ |
| "WM_DDE_INITIATE", /* 0x3E0 */ |
| "WM_DDE_TERMINATE", /* 0x3E1 */ |
| "WM_DDE_ADVISE", /* 0x3E2 */ |
| "WM_DDE_UNADVISE", /* 0x3E3 */ |
| "WM_DDE_ACK", /* 0x3E4 */ |
| "WM_DDE_DATA", /* 0x3E5 */ |
| "WM_DDE_REQUEST", /* 0x3E6 */ |
| "WM_DDE_POKE", /* 0x3E7 */ |
| "WM_DDE_EXECUTE", /* 0x3E8 */ |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| |
| |
| /* 0x03f0 */ |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| |
| "WM_USER" |
| }; |
| |
| |
| static BOOL SPY_Exclude[SPY_MAX_MSGNUM+1] = { FALSE, }; |
| static int SPY_IndentLevel = 0; |
| |
| #define SPY_EXCLUDE(msg) \ |
| (SPY_Exclude[(msg) > SPY_MAX_MSGNUM ? SPY_MAX_MSGNUM : (msg)]) |
| |
| /*********************************************************************** |
| * SPY_GetMsgName |
| */ |
| static const char *SPY_GetMsgName( UINT msg ) |
| { |
| static char buffer[20]; |
| |
| if (msg <= SPY_MAX_MSGNUM) |
| { |
| if (!MessageTypeNames[msg]) return "???"; |
| return MessageTypeNames[msg]; |
| } |
| sprintf( buffer, "WM_USER+%04x\n", msg - WM_USER ); |
| return buffer; |
| } |
| |
| |
| /*********************************************************************** |
| * SPY_EnterMessage |
| */ |
| void SPY_EnterMessage( int iFlag, HWND hWnd, UINT msg, |
| WPARAM wParam, LPARAM lParam ) |
| { |
| if (!debugging_message || SPY_EXCLUDE(msg)) return; |
| |
| /* each SPY_SENDMESSAGE must be complemented by call to ExitSpyMessage */ |
| switch(iFlag) |
| { |
| case SPY_DISPATCHMESSAGE: |
| dprintf_message(stddeb,"(%04x) message [%04x] %s dispatched wp=%04x lp=%08lx\n", |
| hWnd, msg, SPY_GetMsgName( msg ), |
| wParam, lParam); |
| break; |
| |
| case SPY_SENDMESSAGE: |
| { |
| char taskName[30]; |
| HTASK hTask = GetWindowTask(hWnd); |
| if (hTask == GetCurrentTask()) strcpy( taskName, "self" ); |
| else if (!hTask) strcpy( taskName, "Wine" ); |
| else sprintf( taskName, "task %04x %s", |
| hTask, MODULE_GetModuleName( GetExePtr(hTask) ) ); |
| |
| dprintf_message(stddeb,"%*s(%04x) message [%04x] %s sent from %s wp=%04x lp=%08lx\n", |
| SPY_IndentLevel, "", hWnd, msg, |
| SPY_GetMsgName( msg ), taskName, wParam, lParam ); |
| SPY_IndentLevel += SPY_INDENT_UNIT; |
| } |
| break; |
| |
| case SPY_DEFWNDPROC: |
| dprintf_message(stddeb, "%*s(%04x) DefWindowProc: %s [%04x] wp=%04x lp=%08lx\n", |
| SPY_IndentLevel, "", hWnd, SPY_GetMsgName( msg ), |
| msg, wParam, lParam ); |
| break; |
| } |
| } |
| |
| |
| /*********************************************************************** |
| * SPY_ExitMessage |
| */ |
| void SPY_ExitMessage( int iFlag, HWND hWnd, UINT msg, LRESULT lReturn ) |
| { |
| if (!debugging_message || SPY_EXCLUDE(msg)) return; |
| if (SPY_IndentLevel) SPY_IndentLevel -= SPY_INDENT_UNIT; |
| |
| switch(iFlag) |
| { |
| case SPY_RESULT_INVALIDHWND: |
| dprintf_message(stddeb,"%*s(%04x) message [%04x] %s HAS INVALID HWND\n", |
| SPY_IndentLevel, "", hWnd, msg, |
| SPY_GetMsgName( msg ) ); |
| break; |
| case SPY_RESULT_OK: |
| dprintf_message(stddeb,"%*s(%04x) message [%04x] %s returned %08lx\n", |
| SPY_IndentLevel, "", hWnd, msg, |
| SPY_GetMsgName( msg ), lReturn ); |
| break; |
| } |
| } |
| |
| |
| /*********************************************************************** |
| * SPY_Init |
| */ |
| int SPY_Init(void) |
| { |
| int i; |
| char buffer[512]; |
| |
| PROFILE_GetWineIniString( "Spy", "Include", "", buffer, sizeof(buffer) ); |
| if (buffer[0] && strcmp( buffer, "INCLUDEALL" )) |
| { |
| dprintf_message( stddeb, "SpyInit: Include=%s\n", buffer ); |
| for (i = 0; i <= SPY_MAX_MSGNUM; i++) |
| SPY_Exclude[i] = (MessageTypeNames[i] && !strstr(buffer,MessageTypeNames[i])); |
| } |
| |
| PROFILE_GetWineIniString( "Spy", "Exclude", "", buffer, sizeof(buffer) ); |
| if (buffer[0]) |
| { |
| dprintf_message( stddeb, "SpyInit: Exclude=%s\n", buffer ); |
| if (!strcmp( buffer, "EXCLUDEALL" )) |
| for (i = 0; i <= SPY_MAX_MSGNUM; i++) SPY_Exclude[i] = TRUE; |
| else |
| for (i = 0; i <= SPY_MAX_MSGNUM; i++) |
| SPY_Exclude[i] = (MessageTypeNames[i] && strstr(buffer,MessageTypeNames[i])); |
| } |
| return 1; |
| } |