/**************************************************************************** PROGRAM: DdeSpy.c ****************************************************************************/ #define UNICODE #include /* required for all Windows applications */ #include #include #include #include #include #include #include #include #include #include "ddespy.h" #include "lists.h" /* GLOBAL Variables used for DDESPY */ UINT idInst = 0; HINSTANCE hInst; HICON hIcon; HWND hWndString = NULL; HWND hwndSpy = NULL; HANDLE fhOutput = NULL; OFSTRUCT ofsOpen; TCHAR OpenName[MAX_FNAME + 1]; TCHAR TBuf[BUFFER_SIZE]; TCHAR TBuf2[BUFFER_SIZE]; TCHAR szNULL[] = TEXT(""); LPTSTR apszResources[IDS_LAST + 1]; PFNCALLBACK pfnDdeCallback = NULL; HWND hwndTrack[IT_COUNT] = { 0 }; LPTSTR TrackTitle[IT_COUNT]; BOOL fBlockMsg[WM_DDE_LAST - WM_DDE_FIRST + 1] = { 0 }; BOOL fBlockCb[15] = { 0 }; LPTSTR TrackHeading[IT_COUNT]; struct { /* profile data */ BOOL fOutput[IO_COUNT]; BOOL fFilter[IF_COUNT]; BOOL fTrack[IT_COUNT]; BOOL fTerse; } pro; BOOL LoadResourceStrings() { int i, cbLeft, cbRes; LPTSTR psz; cbLeft = 0x1000; psz = LocalAlloc(LPTR, sizeof(TCHAR) * cbLeft); for (i = 0; i <= IDS_LAST; i++) { apszResources[i] = psz; cbRes = LoadString(hInst, i, psz, cbLeft) + 1; cbLeft -= cbRes; psz += cbRes; } for (i = 0; i < IT_COUNT; i++) { TrackTitle[i] = RefString(IDS_TRACKTITLE_1 + i); TrackHeading[i] = RefString(IDS_TRACKHEADING_1 + i); } lstrcpy(TBuf, RefString(IDS_DEFAULT_OUTPUT_FNAME)); GetFullPathName(TBuf, sizeof(OpenName) / sizeof(TCHAR), OpenName, (LPTSTR *)TBuf2); return(TRUE); } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MSG msg; UNREFERENCED_PARAMETER(lpCmdLine); hInst = hInstance; if (!LoadResourceStrings()) { return (FALSE); } if (!hPrevInstance) if (!InitApplication(hInstance)) /* Initialize shared things */ return (FALSE); /* Exits if unable to initialize */ /* Perform initializations that apply to a specific instance */ if (!InitInstance(hInstance, nCmdShow)) { CloseApp(); return (FALSE); } /* Acquire and dispatch messages until a WM_QUIT message is received. */ while (GetMessage(&msg, /* message structure */ NULL, /* handle of window receiving the message */ 0, /* lowest message to examine */ 0)) /* highest message to examine */ { TranslateMessage(&msg); /* Translates virtual key codes */ DispatchMessage(&msg); /* Dispatches message to window */ } CloseApp(); return ((int)msg.wParam); /* Returns the value from PostQuitMessage */ } BOOL InitApplication(HINSTANCE hInstance) { WNDCLASS wc; if (!InitTestSubs()) return(FALSE); /* Fill in window class structure with parameters that describe the */ /* main window. */ wc.style = 0; /* Class style(s). */ wc.lpfnWndProc = (WNDPROC)MainWndProc; /* Function to retrieve messages for */ /* windows of this class. */ wc.cbClsExtra = 0; /* No per-class extra data. */ wc.cbWndExtra = 0; /* No per-window extra data. */ wc.hInstance = hInstance; /* Application that owns the class. */ /* faster, also can localize "DDESpy" */ hIcon = wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_DDESPY)); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = GetStockObject(WHITE_BRUSH); wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU); /* Name of menu resource in .RC file. */ wc.lpszClassName = RefString(IDS_CLASS); /* Register the window class and return success/failure code. */ return (RegisterClass(&wc)); } BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { RECT Rect; INT i; /* Save the instance handle in static variable, which will be used in */ /* many subsequence calls from this application to Windows. */ pfnDdeCallback = (PFNCALLBACK)MakeProcInstance((FARPROC)DdeCallback, hInstance); GetProfile(); /* Create a main window for this application instance. */ hwndSpy = CreateWindow( RefString(IDS_CLASS), RefString(IDS_TITLE), WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN, CW_USEDEFAULT, /* Default horizontal position. */ CW_USEDEFAULT, /* Default vertical position. */ CW_USEDEFAULT, /* Default width. */ CW_USEDEFAULT, /* Default height. */ NULL, /* Overlapped windows have no parent. */ NULL, /* Use the window class menu. */ hInstance, /* This instance owns this window. */ NULL /* Pointer not needed. */ ); GetClientRect(hwndSpy, (LPRECT) &Rect); hWndString = CreateWindow( /* String Window (class Registered in Teststubs)*/ RefString(IDS_STRINGCLASS), szNULL, WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL, 0, 0, Rect.right - Rect.left, Rect.bottom - Rect.top, hwndSpy, NULL, hInst, (LPTSTR)LongToPtr(MAKELONG(CCHARS, CLINES))); for (i = 0; i < IT_COUNT; i++) { if (pro.fTrack[i]) { pro.fTrack[i] = FALSE; SendMessage(hwndSpy, WM_COMMAND, GET_WM_COMMAND_MPS(IDM_TRACK_FIRST + i, 0, 0)); } } if (!hwndSpy || !hWndString) { CloseApp(); return (FALSE); } /* Make the window visible; update its client area; and return "success" */ ShowWindow(hwndSpy, nCmdShow); /* Show the window */ UpdateWindow(hwndSpy); /* Sends WM_PAINT message */ if (SetFilters()) { return(FALSE); } return(TRUE); } VOID CloseApp() { DdeUninitialize(idInst); /* perform cleanup and store profile */ SaveProfile(); if (fhOutput != NULL) CloseHandle(fhOutput); UnregisterClass(RefString(IDS_CLASS), hInst); CloseTestSubs(hInst); } LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int i; switch (message) { case WM_CREATE: LoadAccelerators(hInst, MAKEINTRESOURCE(IDR_ACCEL)); if (pro.fOutput[IO_FILE]) fhOutput = (HANDLE)DoDialog( MAKEINTRESOURCE(IDD_OPEN), (DLGPROC)OpenDlg, 0, TRUE, hWnd, hInst); pro.fOutput[IO_FILE] = (fhOutput != NULL); break; case WM_INITMENU: if (GetMenu(hWnd) != (HMENU)wParam) break; for (i = 0; i < IO_COUNT; i++) { CheckMenuItem((HMENU)wParam, IDM_OUTPUT_FIRST + i, pro.fOutput[i] ? MF_CHECKED : MF_UNCHECKED); } for (i = 0; i < IF_COUNT; i++) { CheckMenuItem((HMENU)wParam, IDM_FILTER_FIRST + i, pro.fFilter[i] ? MF_CHECKED : MF_UNCHECKED); } for (i = 0; i < IT_COUNT; i++) { CheckMenuItem((HMENU)wParam, IDM_TRACK_FIRST + i, pro.fTrack[i] ? MF_CHECKED : MF_UNCHECKED); } break; case WM_COMMAND: /* message: command from application menu */ switch (GET_WM_COMMAND_ID(wParam, lParam)) { case IDM_OUTPUT_FILE: case IDM_OUTPUT_DEBUG: case IDM_OUTPUT_SCREEN: switch (wParam) { case IDM_OUTPUT_FILE: if (fhOutput != NULL) { wsprintf(TBuf, RefString(IDS_QCLOSEFILE_TEXT), OpenName); if (IDYES != MessageBox(hWnd, TBuf, RefString(IDS_QCLOSEFILE_CAPTION), MB_YESNO | MB_ICONQUESTION)) { break; } CloseHandle(fhOutput); } fhOutput = (HANDLE)DoDialog( MAKEINTRESOURCE(IDD_OPEN), (DLGPROC)OpenDlg, 0, TRUE, hWnd, hInst); pro.fOutput[IO_FILE] = (fhOutput != NULL); break; case IDM_OUTPUT_DEBUG: pro.fOutput[IO_DEBUG] = !pro.fOutput[IO_DEBUG]; break; case IDM_OUTPUT_SCREEN: pro.fOutput[IO_SCREEN] = !pro.fOutput[IO_SCREEN]; break; } break; case IDM_CLEARSCREEN: if (hWndString) { HANDLE hpsw; STRWND *psw; hpsw = (HANDLE)GetWindowLongPtr(hWndString, 0); psw = (STRWND *)LocalLock(hpsw); ClearScreen(psw); LocalUnlock(hpsw); InvalidateRect(hWndString, NULL, TRUE); } break; case IDM_MARK: DoDialog(MAKEINTRESOURCE(IDD_VALUEENTRY), (DLGPROC)MarkDlgProc, 0, TRUE, hWnd, hInst); break; case IDM_FILTER_HSZINFO: case IDM_FILTER_INIT_TERM: case IDM_FILTER_DDEMSGS: case IDM_FILTER_CALLBACKS: case IDM_FILTER_ERRORS: pro.fFilter[wParam - IDM_FILTER_FIRST] = !pro.fFilter[wParam - IDM_FILTER_FIRST]; SetFilters(); break; case IDM_FILTER_DIALOG: DoDialog(MAKEINTRESOURCE(IDD_MSGFILTERS), (DLGPROC)FilterDlgProc, 0, TRUE, hWnd, hInst); break; case IDM_TRACK_HSZS: case IDM_TRACK_CONVS: case IDM_TRACK_LINKS: case IDM_TRACK_SVRS: pro.fTrack[wParam - IDM_TRACK_FIRST] = !pro.fTrack[wParam - IDM_TRACK_FIRST]; if (pro.fTrack[wParam - IDM_TRACK_FIRST]) { hwndTrack[wParam - IDM_TRACK_FIRST] = CreateMCLBFrame( NULL, TrackTitle[wParam - IDM_TRACK_FIRST], WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_MINIMIZE, hIcon, (HBRUSH)(COLOR_APPWORKSPACE + 1), TrackHeading[wParam - IDM_TRACK_FIRST]); } else { DestroyWindow(hwndTrack[wParam - IDM_TRACK_FIRST]); hwndTrack[wParam - IDM_TRACK_FIRST] = 0; } SetFilters(); break; case IDM_ABOUT: DoDialog(MAKEINTRESOURCE(IDD_ABOUTBOX), (DLGPROC)About, 0, TRUE, hWnd, hInst); break; default: return (DefWindowProc(hWnd, message, wParam, lParam)); } break; case WM_DESTROY: /* message: window being destroyed */ for (i = IDM_TRACK_FIRST; i <= IDM_TRACK_LAST; i++) { if (pro.fTrack[i - IDM_TRACK_FIRST]) { DestroyWindow(hwndTrack[i - IDM_TRACK_FIRST]); hwndTrack[i - IDM_TRACK_FIRST] = 0; } } PostQuitMessage(0); break; case WM_SIZE: if (hWndString) { RECT rc; GetClientRect(hWnd, &rc); MoveWindow(hWndString, 0, 0, rc.right, rc.bottom, TRUE); } // fall through default: return (DefWindowProc(hWnd, message, wParam, lParam)); } return (0); } BOOL CALLBACK About( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_INITDIALOG: /* message: initialize dialog box */ return (TRUE); case WM_COMMAND: /* message: received a command */ if (GET_WM_COMMAND_ID(wParam, lParam) == IDOK || GET_WM_COMMAND_ID(wParam, lParam) == IDCANCEL) { EndDialog(hDlg, TRUE); /* Exits the dialog box */ return (TRUE); } break; } return (FALSE); /* Didn't process a message */ } HDDEDATA CALLBACK DdeCallback( UINT wType, UINT wFmt, HCONV hConv, HSZ hsz1, HSZ hsz2, HDDEDATA hData, UINT dwData1, UINT dwData2) { LPVOID pData; UINT cb; TCHAR *psz1, *psz2, *psz3; TCHAR *szAction; INT i; BOOL fInt = FALSE; wFmt; hConv; dwData1; switch (wType) { case XTYP_MONITOR: if (pData = DdeAccessData(hData, (LPDWORD)&cb)) { switch (dwData2) { case MF_HSZ_INFO: if (pro.fTrack[IT_HSZS]) { switch (((MONHSZSTRUCT FAR *)pData)->fsAction) { case MH_DELETE: wsprintf(TBuf, fInt ? TEXT("0x%lx\t*\t%s(int)") : TEXT("0x%lx\t*\t%s"), ((MONHSZSTRUCT FAR *)pData)->hsz, (LPTSTR)((MONHSZSTRUCT FAR *)pData)->str); i = GetMCLBColValue(TBuf, hwndTrack[IT_HSZS], 2); if (i > 1) { wsprintf(TBuf2, fInt ? TEXT("0x%lx\t%d\t%s(int)") : TEXT("0x%lx\t%d\t%s"), ((MONHSZSTRUCT FAR *)pData)->hsz, i - 1, (LPTSTR)((MONHSZSTRUCT FAR *)pData)->str); AddMCLBText(TBuf, TBuf2, hwndTrack[IT_HSZS]); } else if (i == 1) { DeleteMCLBText(TBuf, hwndTrack[IT_HSZS]); } break; case MH_KEEP: case MH_CREATE: wsprintf(TBuf, fInt ? TEXT("0x%lx\t*\t%s(int)") : TEXT("0x%lx\t*\t%s"), ((MONHSZSTRUCT FAR *)pData)->hsz, (LPTSTR)((MONHSZSTRUCT FAR *)pData)->str); i = GetMCLBColValue(TBuf, hwndTrack[IT_HSZS], 2) + 1; wsprintf(TBuf2, fInt ? TEXT("0x%lx\t%d\t%s(int)") : TEXT("0x%lx\t%d\t%s"), ((MONHSZSTRUCT FAR *)pData)->hsz, i, (LPTSTR)((MONHSZSTRUCT FAR *)pData)->str); AddMCLBText(TBuf, TBuf2, hwndTrack[IT_HSZS]); } } if (!pro.fFilter[IF_HSZ]) { DdeUnaccessData(hData); return(0); } switch (((MONHSZSTRUCT FAR *)pData)->fsAction) { case MH_CLEANUP: szAction = RefString(IDS_ACTION_CLEANEDUP); break; case MH_DELETE: szAction = RefString(IDS_ACTION_DESTROYED); break; case MH_KEEP: szAction = RefString(IDS_ACTION_INCREMENTED); break; case MH_CREATE: szAction = RefString(IDS_ACTION_CREATED); break; default: DdeUnaccessData(hData); return(0); } if (pro.fTerse) { wsprintf(TBuf, TEXT("[%x:%ld] HSZ %s: %lx(%s)"), ((MONHSZSTRUCT FAR *)pData)->hTask, ((MONHSZSTRUCT FAR *)pData)->dwTime, (LPTSTR)szAction, ((MONHSZSTRUCT FAR *)pData)->hsz, (LPTSTR)((MONHSZSTRUCT FAR *)pData)->str); } else { wsprintf(TBuf, /* so we can localize message */ RefString(IDS_FMT_SH_MSG1), ((MONHSZSTRUCT FAR *)pData)->hTask, ((MONHSZSTRUCT FAR *)pData)->dwTime, (LPTSTR)szAction, ((MONHSZSTRUCT FAR *)pData)->hsz, (LPTSTR)((MONHSZSTRUCT FAR *)pData)->str); } break; case MF_SENDMSGS: case MF_POSTMSGS: if (fBlockMsg[((MONMSGSTRUCT FAR *)pData)->wMsg - WM_DDE_FIRST]) { DdeUnaccessData(hData); return(0); } if (pro.fTerse) { wsprintf(TBuf, RefString(IDS_FMT_TRS_MSG1), ((MONMSGSTRUCT FAR *)pData)->hTask, ((MONMSGSTRUCT FAR *)pData)->dwTime, ((MONMSGSTRUCT FAR *)pData)->wParam, ((MONMSGSTRUCT FAR *)pData)->hwndTo, (dwData2 == MF_SENDMSGS) ? RefString(IDS_SENT) : RefString(IDS_POSTED), (LPTSTR)DdeMsg2String(((MONMSGSTRUCT FAR *)pData)->wMsg)); } else { wsprintf(TBuf, RefString(IDS_FMT_MSG1), ((MONMSGSTRUCT FAR *)pData)->hTask, ((MONMSGSTRUCT FAR *)pData)->dwTime, ((MONMSGSTRUCT FAR *)pData)->hwndTo, (dwData2 == MF_SENDMSGS) ? RefString(IDS_SENT) : RefString(IDS_POSTED), (LPTSTR)DdeMsg2String(((MONMSGSTRUCT FAR *)pData)->wMsg)); } OutputString(TBuf); wsprintf(TBuf, pro.fTerse ? RefString(IDS_FMT_TRS_MSG2) : RefString(IDS_FMT_MSG2), ((MONMSGSTRUCT FAR *)pData)->wParam); DisectMsgLP(((MONMSGSTRUCT FAR *)pData)->wMsg, ((MONMSGSTRUCT FAR *)pData), &TBuf[lstrlen(TBuf)]); break; case MF_CALLBACKS: if (fBlockCb[(((MONCBSTRUCT FAR *)pData)->wType & XTYP_MASK) >> XTYP_SHIFT]) { DdeUnaccessData(hData); return(0); } wsprintf(TBuf, pro.fTerse ? RefString(IDS_FMT_TRS_CB1) : RefString(IDS_FMT_CB1), ((MONCBSTRUCT FAR *)pData)->hTask, ((MONCBSTRUCT FAR *)pData)->dwTime, (LPTSTR)Type2String(((MONCBSTRUCT FAR *)pData)->wType)); wsprintf(DumpFormat(((MONCBSTRUCT FAR *)pData)->wFmt, &TBuf[lstrlen(TBuf)]), pro.fTerse ? RefString(IDS_FMT_TRS_CB2) : RefString(IDS_FMT_CB2), (UINT_PTR)((MONCBSTRUCT FAR *)pData)->hConv, ((MONCBSTRUCT FAR *)pData)->hsz1, (LPTSTR)(psz1 = GetHszName(((MONCBSTRUCT FAR *)pData)->hsz1)), ((MONCBSTRUCT FAR *)pData)->hsz2, (LPTSTR)(psz2 = GetHszName(((MONCBSTRUCT FAR *)pData)->hsz2)), ((MONCBSTRUCT FAR *)pData)->hData, ((MONCBSTRUCT FAR *)pData)->dwData1, ((MONCBSTRUCT FAR *)pData)->dwData2, ((MONCBSTRUCT FAR *)pData)->dwRet); MyFree(psz1); MyFree(psz2); OutputString(TBuf); if (((MONCBSTRUCT FAR *)pData)->dwData1 && (((MONCBSTRUCT FAR *)pData)->wType == XTYP_CONNECT || ((MONCBSTRUCT FAR *)pData)->wType == XTYP_WILDCONNECT)) { // display proposed context wsprintf(TBuf, pro.fTerse ? RefString(IDS_FMT_TRS_CTXT1) : RefString(IDS_FMT_CTXT1), ((MONCBSTRUCT FAR *)pData)->cc.wFlags, ((MONCBSTRUCT FAR *)pData)->cc.wCountryID, ((MONCBSTRUCT FAR *)pData)->cc.iCodePage, ((MONCBSTRUCT FAR *)pData)->cc.dwLangID, ((MONCBSTRUCT FAR *)pData)->cc.dwSecurity, ((MONCBSTRUCT FAR *)pData)->cc.qos.ImpersonationLevel, ((MONCBSTRUCT FAR *)pData)->cc.qos.ContextTrackingMode, ((MONCBSTRUCT FAR *)pData)->cc.qos.EffectiveOnly); OutputString(TBuf); } if (((MONCBSTRUCT FAR *)pData)->hData && ((MONCBSTRUCT FAR *)pData)->cbData) { wsprintf(TBuf, RefString(IDS_INPUT_DATA)); OutputString(TBuf); DumpData((LPBYTE)((MONCBSTRUCT FAR *)pData)->Data, ((MONCBSTRUCT FAR *)pData)->cbData, TBuf, ((MONCBSTRUCT FAR *)pData)->wFmt); OutputString(TBuf); if (cb > MAX_DISPDATA) OutputString(RefString(IDS_TABDDD)); // DdeUnaccessData(((MONCBSTRUCT FAR *)pData)->hData); } if ((((MONCBSTRUCT FAR *)pData)->wType & XCLASS_DATA) && ((MONCBSTRUCT FAR *)pData)->dwRet && ((MONCBSTRUCT FAR *)pData)->cbData) { wsprintf(TBuf, RefString(IDS_OUTPUT_DATA)); OutputString(TBuf); DumpData((LPBYTE)((MONCBSTRUCT FAR *)pData)->Data, ((MONCBSTRUCT FAR *)pData)->cbData, TBuf, ((MONCBSTRUCT FAR *)pData)->wFmt); OutputString(TBuf); if (cb > MAX_DISPDATA) OutputString(RefString(IDS_TABDDD)); // DdeUnaccessData(((MONCBSTRUCT FAR *)pData)->dwRet); } DdeUnaccessData(hData); return(0); break; case MF_ERRORS: wsprintf(TBuf, pro.fTerse ? RefString(IDS_FMT_TRS_ER1) : RefString(IDS_FMT_ER1), ((MONERRSTRUCT FAR *)pData)->hTask, ((MONERRSTRUCT FAR *)pData)->dwTime, ((MONERRSTRUCT FAR *)pData)->wLastError, (LPTSTR)Error2String(((MONERRSTRUCT FAR *)pData)->wLastError)); break; case MF_LINKS: psz1 = GetHszName(((MONLINKSTRUCT FAR *)pData)->hszSvc); psz2 = GetHszName(((MONLINKSTRUCT FAR *)pData)->hszTopic); psz3 = GetHszName(((MONLINKSTRUCT FAR *)pData)->hszItem); if (!GetClipboardFormatName(((MONLINKSTRUCT FAR *)pData)->wFmt, TBuf2, BUFFER_SIZE)) lstrcpy(TBuf2, pdf(((MONLINKSTRUCT FAR *)pData)->wFmt)); if (!lstrcmp(RefString(IDS_HUH), TBuf2)) { wsprintf(TBuf2, TEXT("%d"), ((MONLINKSTRUCT FAR *)pData)->wFmt); } wsprintf(TBuf, TEXT("%s\t%s\t%s\t%s\t%s\t%lx\t%lx"), (LPTSTR)psz1, (LPTSTR)psz2, (LPTSTR)psz3, (LPTSTR)TBuf2, ((MONLINKSTRUCT FAR *)pData)->fNoData ? RefString(IDS_WARM) : RefString(IDS_HOT), ((MONLINKSTRUCT FAR *)pData)->hConvClient, ((MONLINKSTRUCT FAR *)pData)->hConvServer); if (((MONLINKSTRUCT FAR *)pData)->fEstablished) { AddMCLBText(TBuf, TBuf, hwndTrack[IT_LINKS]); } else { DeleteMCLBText(TBuf, hwndTrack[IT_LINKS]); } MyFree(psz1); MyFree(psz2); MyFree(psz3); DdeUnaccessData(hData); return(0); case MF_CONV: psz1 = GetHszName(((MONCONVSTRUCT FAR *)pData)->hszSvc); psz2 = GetHszName(((MONCONVSTRUCT FAR *)pData)->hszTopic); wsprintf(TBuf, TEXT("%s\t%s\t%lx\t%lx"), (LPTSTR)psz1, (LPTSTR)psz2, ((MONCONVSTRUCT FAR *)pData)->hConvClient, ((MONCONVSTRUCT FAR *)pData)->hConvServer); if (((MONCONVSTRUCT FAR *)pData)->fConnect) { AddMCLBText(TBuf, TBuf, hwndTrack[IT_CONVS]); } else { DeleteMCLBText(TBuf, hwndTrack[IT_CONVS]); } MyFree(psz1); MyFree(psz2); DdeUnaccessData(hData); return(0); default: lstrcpy(TBuf, RefString(IDS_UNKNOWN_CALLBACK)); } DdeUnaccessData(hData); OutputString(TBuf); } break; case XTYP_REGISTER: case XTYP_UNREGISTER: if (!pro.fTrack[IT_SVRS]) { return(0); } psz1 = GetHszName(hsz1); psz2 = GetHszName(hsz2); wsprintf(TBuf, TEXT("%s\t%s"), (LPTSTR)psz1, (LPTSTR)psz2); if (wType == XTYP_REGISTER) { AddMCLBText(NULL, TBuf, hwndTrack[IT_SVRS]); } else { DeleteMCLBText(TBuf, hwndTrack[IT_SVRS]); } MyFree(psz1); MyFree(psz2); break; } return(0); } LPTSTR DisectMsgLP(UINT msg, MONMSGSTRUCT *pmms, LPTSTR pszBuf) { static LONG m2t[] = { /* LOW HIGH */ MAKELONG(T_APP | T_ATOM, T_TOPIC | T_ATOM), // WM_DDE_INITIATE 0, // WM_DDE_TERMINATE MAKELONG(T_OPTIONHANDLE, T_ITEM | T_ATOM), // WM_DDE_ADVISE MAKELONG(T_FORMAT, T_ITEM | T_ATOM), // WM_DDE_UNADVISE MAKELONG(T_APP | T_ATOM | T_OR | T_STATUS, T_TOPIC | T_ITEM | T_ATOM | T_OR | T_STRINGHANDLE), // WM_DDE_ACK MAKELONG(T_DATAHANDLE, T_ITEM | T_ATOM), // WM_DDE_DATA MAKELONG(T_FORMAT, T_ITEM | T_ATOM), // WM_DDE_REQUEST MAKELONG(T_DATAHANDLE, T_ITEM | T_ATOM), // WM_DDE_POKE MAKELONG(0, T_STRINGHANDLE), // WM_DDE_EXECUTE }; // ASSUMED: msg is a valid DDE message!!! pszBuf = DisectWord(LOWORD(m2t[msg - WM_DDE_FIRST]), (UINT)pmms->dmhd.uiLo, &pmms->dmhd, pszBuf); *pszBuf++ = TEXT('\r'); *pszBuf++ = TEXT('\n'); *pszBuf++ = TEXT('\t'); return(DisectWord(HIWORD(m2t[msg - WM_DDE_FIRST]), (UINT)pmms->dmhd.uiHi, &pmms->dmhd, pszBuf)); } /* * Allocates local memory for and retrieves the string form of an HSZ. * Returns a pointer to the local memory or NULL if failure. * The string must be freed via MyFree(). */ LPTSTR GetHszName(HSZ hsz) { LPTSTR psz; UINT cb; cb = (UINT)DdeQueryString(idInst, hsz, NULL, 0, 0) + 1; psz = LocalAlloc (LPTR, sizeof(TCHAR) * cb); DdeQueryString(idInst, hsz, psz, cb, 0); return(psz); } LPTSTR DisectWord( UINT type, UINT data, DDEML_MSG_HOOK_DATA *pdmhd, LPTSTR pstr ) { UINT wT; *pstr = TEXT('\0'); // in case we do nothing. if (type & T_ATOM) { wT = GlobalGetAtomName((ATOM)data, (LPTSTR)pstr, 25); if (wT || data == 0) { if (type & T_APP) { lstrcpy(pstr, RefString(IDS_APPIS)); pstr += lstrlen(pstr); } if (type & T_TOPIC) { lstrcpy(pstr, RefString(IDS_TOPICIS)); pstr += lstrlen(pstr); } if (type & T_ITEM) { lstrcpy(pstr, RefString(IDS_ITEMIS)); pstr += lstrlen(pstr); } } if (wT) { wsprintf(pstr, TEXT("0x%x(\""), data); pstr += lstrlen(pstr); GlobalGetAtomName((ATOM)data, (LPTSTR)pstr, 25); pstr += wT; if (wT == 25) { *pstr++ = TEXT('.'); *pstr++ = TEXT('.'); *pstr++ = TEXT('.'); } *pstr++ = TEXT('\"'); *pstr++ = TEXT(')'); *pstr = TEXT('\0'); type &= ~(T_OR | T_STRINGHANDLE); // its an atom, so its not an object! } else if (data == 0) { // could be a wild atom *pstr++ = TEXT('*'); *pstr = TEXT('\0'); } else if (type & T_OR) { type &= ~T_OR; // not an atom, must be somthin else. } else { /* so we can localize message */ wsprintf(pstr, RefString(IDS_BADATOM), data); pstr += lstrlen(pstr); } } if (type & T_OR) { lstrcpy(pstr, RefString(IDS_OR)); pstr += lstrlen(pstr); } if (type & T_OPTIONHANDLE) { if (pdmhd->cbData >= 4) { wsprintf(pstr, pro.fTerse ? RefString(IDS_FMT_TRS_STATUSIS) : RefString(IDS_FMT_STATUSIS), LOWORD(pdmhd->Data[0])); pstr += lstrlen(pstr); if (LOWORD(pdmhd->Data[0]) & DDE_FACKREQ) { lstrcpy(pstr, RefString(IDS_FACKREQ)); pstr += lstrlen(pstr); } if (LOWORD(pdmhd->Data[0]) & DDE_FDEFERUPD) { lstrcpy(pstr, RefString(IDS_DEFERUPD)); pstr += lstrlen(pstr); } *pstr++ = TEXT(')'); *pstr++ = TEXT(' '); pstr = DumpFormat((UINT)HIWORD(pdmhd->Data[0]), pstr); } } if (type & T_FORMAT) { pstr = DumpFormat(data, pstr); } if (type & T_STATUS) { wsprintf(pstr, pro.fTerse ? RefString(IDS_FMT_TRS_STATUSIS) : RefString(IDS_FMT_STATUSIS), LOWORD(data)); pstr += lstrlen(pstr); if (data & DDE_FACK) { lstrcpy(pstr, RefString(IDS_FACK)); pstr += lstrlen(pstr); } if (data & DDE_FBUSY) { lstrcpy(pstr, RefString(IDS_FBUSY)); pstr += lstrlen(pstr); } *pstr++ = TEXT(')'); *pstr = TEXT('\0'); } if (type & T_STRINGHANDLE && pdmhd->cbData) { WCHAR szData[16]; memset(szData, '\0', 16 * sizeof(WCHAR)); memcpy(szData, pdmhd->Data, min(16 * sizeof(WCHAR), pdmhd->cbData)); szData[15] = L'\0'; wsprintf(pstr, pro.fTerse ? RefString(IDS_FMT_TRS_EXEC1) : RefString(IDS_FMT_EXEC1), (LPWSTR)szData); pstr += lstrlen(pstr); *pstr = TEXT('\0'); } if (type & T_DATAHANDLE && pdmhd->cbData) { wsprintf(pstr, pro.fTerse ? RefString(IDS_FMT_TRS_STATUSIS) : RefString(IDS_FMT_STATUSIS), LOWORD(pdmhd->Data[0])); pstr += lstrlen(pstr); if (LOWORD(pdmhd->Data[0]) & DDE_FRELEASE) { lstrcpy(pstr, RefString(IDS_FRELEASE)); pstr += lstrlen(pstr); } if (LOWORD(pdmhd->Data[0]) & DDE_FREQUESTED) { lstrcpy(pstr, RefString(IDS_FREQUESTED)); pstr += lstrlen(pstr); } *pstr++ = TEXT(')'); *pstr++ = TEXT(' '); pstr = DumpFormat(HIWORD(pdmhd->Data[0]), pstr); lstrcpy(pstr, pro.fTerse ? RefString(IDS_FMT_TRS_DATAIS1) : RefString(IDS_FMT_DATAIS1)); pstr += lstrlen(pstr); pstr = DumpData((LPBYTE)&pdmhd->Data[1], min(28, pdmhd->cbData - 4), pstr, HIWORD(pdmhd->Data[0])); } return(pstr); } LPTSTR pdf(UINT fmt) { INT i; static struct { UINT fmt; LPTSTR psz; } fmts[] = { { CF_TEXT , TEXT("CF_TEXT") } , { CF_UNICODETEXT , TEXT("CF_UNICODETEXT") } , { CF_BITMAP , TEXT("CF_BITMAP") } , { CF_METAFILEPICT , TEXT("CF_METAFILEPICT") } , { CF_ENHMETAFILE , TEXT("CF_ENHMETAFILE") } , { CF_SYLK , TEXT("CF_SYLK") } , { CF_DIF , TEXT("CF_DIF") } , { CF_TIFF , TEXT("CF_TIFF") } , { CF_OEMTEXT , TEXT("CF_OEMTEXT") } , { CF_DIB , TEXT("CF_DIB") } , { CF_PALETTE , TEXT("CF_PALETTE") } , }; for (i = 0; i < 10; i++) if (fmts[i].fmt == fmt) return(fmts[i].psz); return(RefString(IDS_HUH)); } LPTSTR DumpFormat(UINT fmt, LPTSTR pstr) { UINT cb; wsprintf(pstr, TEXT("fmt=0x%x(\""), (WORD)fmt); pstr += lstrlen(pstr); if (cb = GetClipboardFormatName(fmt, pstr, 25)) { pstr += cb; *pstr++ = TEXT('\"'); *pstr++ = TEXT(')'); } else { wsprintf(pstr, TEXT("%s\")"), (LPTSTR)pdf(fmt)); pstr += lstrlen(pstr); } return(pstr); } LPTSTR DumpData(LPBYTE pData, UINT cb, TCHAR *szBuf, UINT fmt) { register INT i; LPTSTR psz = szBuf; while (cb) { if (fmt == CF_TEXT || fmt == CF_UNICODETEXT) { *szBuf++ = TEXT('\t'); if (fmt == CF_UNICODETEXT) { *szBuf++ = TEXT('U'); } *szBuf++ = TEXT('\"'); if (fmt == CF_UNICODETEXT) { memcpy(szBuf, pData, cb); } else { MultiByteToWideChar(CP_ACP, 0, pData, cb, szBuf, cb / sizeof(TCHAR)); } szBuf[cb - 2] = TEXT('\0'); lstrcat(szBuf, TEXT("\"")); cb = 0; } else { for (i = 0; i < 80 ; i++) { szBuf[i] = TEXT(' '); } szBuf[0] = TEXT('\t'); i = 0; while (cb && (i < 16)) { wsprintf(&szBuf[i * 3 + 1], TEXT("%02x "), pData[0]); wsprintf(&szBuf[17 * 3 + i + 1], TEXT("%c"), MPRT(pData[0])); pData++; cb--; i++; } szBuf[i * 3 + 1] = TEXT(' '); szBuf[17 * 3 + i + 1] = TEXT(' '); szBuf[68] = TEXT('\0'); } szBuf += lstrlen(szBuf); } return(szBuf); } LPTSTR Error2String(UINT error) { static TCHAR szErr[23]; if (error == 0) { lstrcpy(szErr, RefString(IDS_ZERO)); } else if (error > DMLERR_LAST || error < DMLERR_FIRST) { lstrcpy(szErr, RefString(IDS_HUH)); } else { lstrcpy(szErr, apszResources[IDS_ERRST0 + error - DMLERR_FIRST]); } return(szErr); } LPTSTR DdeMsg2String(UINT msg) { static TCHAR szBadMsg[10]; if (msg < WM_DDE_FIRST || msg > WM_DDE_LAST) { wsprintf (szBadMsg, TEXT("%ld"), szBadMsg); return (szBadMsg); // return((LPTSTR)itoa(msg, szBadMsg, 10)); } else { return(apszResources[IDS_MSG0 + msg - WM_DDE_FIRST]); } } VOID OutputString(LPTSTR pstr) { DWORD cbWritten; if (pro.fOutput[IO_FILE] && fhOutput != NULL) { static CHAR szT[200]; WideCharToMultiByte( CP_ACP, 0, pstr, -1, szT, 200, NULL, NULL); WriteFile(fhOutput, (LPCSTR) szT, lstrlenA(szT), &cbWritten, NULL); WriteFile(fhOutput, (LPCSTR) "\r\n", 2, &cbWritten, NULL); FlushFileBuffers(fhOutput); } if (pro.fOutput[IO_DEBUG]) { OutputDebugString((LPTSTR)pstr); OutputDebugString(RefString(IDS_CRLF)); } if (pro.fOutput[IO_SCREEN]) { if (IsWindow(hWndString)) DrawString(hWndString, pstr); } } BOOL SetFilters() { UINT cbf; cbf = 0; if (pro.fTrack[IT_HSZS] || pro.fFilter[IF_HSZ]) cbf |= MF_HSZ_INFO; if (pro.fTrack[IT_LINKS]) cbf |= MF_LINKS; if (pro.fTrack[IT_CONVS]) cbf |= MF_CONV; if (pro.fFilter[IF_SEND]) cbf |= MF_SENDMSGS; if (pro.fFilter[IF_POST]) cbf |= MF_POSTMSGS; if (pro.fFilter[IF_CB]) cbf |= MF_CALLBACKS; if (pro.fFilter[IF_ERR]) cbf |= MF_ERRORS; return((BOOL)DdeInitialize(&idInst, pfnDdeCallback, APPCLASS_MONITOR | cbf, 0)); } /* * This dialog returns a file handle to the opened file name given or NULL * if cancel. */ BOOL CALLBACK OpenDlg(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { HANDLE fh; lParam; switch (message) { case WM_INITDIALOG: SetDlgItemText(hDlg, IDC_EDIT, (LPTSTR)OpenName); SendDlgItemMessage(hDlg, IDC_EDIT, EM_SETSEL, GET_EM_SETSEL_MPS(0, 0x7fff)); SetFocus(GetDlgItem(hDlg, IDC_EDIT)); return (FALSE); /* Indicates the focus is set to a control */ break; case WM_COMMAND: switch (GET_WM_COMMAND_ID(wParam, lParam)) { case IDOK: GetDlgItemText(hDlg, IDC_EDIT, TBuf, MAX_FNAME); GetFullPathName(TBuf, sizeof(OpenName), OpenName, (LPTSTR *)TBuf2); fh = CreateFile( OpenName, GENERIC_WRITE, FILE_SHARE_READ, (PSECURITY_ATTRIBUTES)NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (fh == INVALID_HANDLE_VALUE) { MessageBox(hDlg, RefString(IDS_INVALID_FNAME), NULL, MB_OK | MB_ICONHAND); return (TRUE); } EndDialog(hDlg, (INT_PTR)fh); return (TRUE); case IDCANCEL: EndDialog(hDlg, 0); return (FALSE); } break; } return FALSE; } BOOL CALLBACK FilterDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { int i; lParam; switch (message) { case WM_INITDIALOG: for (i = IDRB_WM_DDE_INITIATE; i <= IDRB_WM_DDE_EXECUTE; i++) { CheckDlgButton(hDlg, i, !fBlockMsg[i - IDRB_WM_DDE_INITIATE]); } for (i = IDRB_XTYP_ERROR; i <= IDRB_XTYP_WILDCONNECT; i++) { CheckDlgButton(hDlg, i, !fBlockCb[i - IDRB_XTYP_ERROR]); } CheckDlgButton(hDlg, IDRB_TERSE, pro.fTerse); return TRUE; break; case WM_COMMAND: switch (GET_WM_COMMAND_ID(wParam, lParam)) { case IDOK: for (i = IDRB_WM_DDE_INITIATE; i <= IDRB_WM_DDE_EXECUTE; i++) { fBlockMsg[i - IDRB_WM_DDE_INITIATE] = !IsDlgButtonChecked(hDlg, i); } for (i = IDRB_XTYP_ERROR; i <= IDRB_XTYP_WILDCONNECT; i++) { fBlockCb[i - IDRB_XTYP_ERROR] = !IsDlgButtonChecked(hDlg, i); } pro.fTerse = IsDlgButtonChecked(hDlg, IDRB_TERSE); EndDialog(hDlg, TRUE); break; case IDCANCEL: EndDialog(hDlg, 0); break; } break; } return FALSE; } VOID GetProfile() { pro.fOutput[IO_FILE] = GetProfileBoolean(RefString(IDS_PROF_OUT_FILE),FALSE); pro.fOutput[IO_DEBUG] = GetProfileBoolean(RefString(IDS_PROF_OUT_DEBUG),FALSE); pro.fOutput[IO_SCREEN] = GetProfileBoolean(RefString(IDS_PROF_OUT_SCREEN),FALSE); pro.fFilter[IF_HSZ] = GetProfileBoolean(RefString(IDS_PROF_MONITOR_STRINGHANDLES),FALSE); pro.fFilter[IF_SEND] = GetProfileBoolean(RefString(IDS_PROF_MONITOR_INITIATES), FALSE); pro.fFilter[IF_POST] = GetProfileBoolean(RefString(IDS_PROF_MONITOR_DDE_MESSAGES), FALSE); pro.fFilter[IF_CB] = GetProfileBoolean(RefString(IDS_PROF_MONITOR_CALLBACKS), FALSE); pro.fFilter[IF_ERR] = GetProfileBoolean(RefString(IDS_PROF_MONITOR_ERRORS),FALSE); pro.fTrack[IT_HSZS] = GetProfileBoolean(RefString(IDS_PROF_TRACK_STRINGHANDLES), FALSE); pro.fTrack[IT_LINKS] = GetProfileBoolean(RefString(IDS_PROF_TRACK_LINKS), FALSE); pro.fTrack[IT_CONVS] = GetProfileBoolean(RefString(IDS_PROF_TRACK_CONVERSATIONS), FALSE); pro.fTrack[IT_SVRS] = GetProfileBoolean(RefString(IDS_PROF_TRACK_SERVICES), FALSE); pro.fTerse = GetProfileBoolean(RefString(IDS_PROF_TERSE), FALSE); } VOID SaveProfile() { SetProfileBoolean(RefString(IDS_PROF_OUT_FILE), pro.fOutput[IO_FILE] ); SetProfileBoolean(RefString(IDS_PROF_OUT_DEBUG), pro.fOutput[IO_DEBUG] ); SetProfileBoolean(RefString(IDS_PROF_OUT_SCREEN), pro.fOutput[IO_SCREEN]); SetProfileBoolean(RefString(IDS_PROF_MONITOR_STRINGHANDLES), pro.fFilter[IF_HSZ] ); SetProfileBoolean(RefString(IDS_PROF_MONITOR_INITIATES), pro.fFilter[IF_SEND] ); SetProfileBoolean(RefString(IDS_PROF_MONITOR_DDE_MESSAGES), pro.fFilter[IF_POST] ); SetProfileBoolean(RefString(IDS_PROF_MONITOR_CALLBACKS), pro.fFilter[IF_CB] ); SetProfileBoolean(RefString(IDS_PROF_MONITOR_ERRORS), pro.fFilter[IF_ERR] ); SetProfileBoolean(RefString(IDS_PROF_TRACK_STRINGHANDLES), pro.fTrack[IT_HSZS] ); SetProfileBoolean(RefString(IDS_PROF_TRACK_LINKS), pro.fTrack[IT_LINKS] ); SetProfileBoolean(RefString(IDS_PROF_TRACK_CONVERSATIONS), pro.fTrack[IT_CONVS] ); SetProfileBoolean(RefString(IDS_PROF_TRACK_SERVICES), pro.fTrack[IT_SVRS] ); SetProfileBoolean(RefString(IDS_PROF_TERSE), pro.fTerse ); } BOOL GetProfileBoolean(LPTSTR pszKey, BOOL fDefault) { GetPrivateProfileString(RefString(IDS_TITLE), pszKey, fDefault ? RefString(IDS_YES) : RefString(IDS_NO), TBuf, sizeof(TBuf), RefString(IDS_INIFNAME)); return(lstrcmpi(RefString(IDS_NO), TBuf)); } VOID SetProfileBoolean(LPTSTR pszKey, BOOL fSet) { WritePrivateProfileString(RefString(IDS_TITLE), pszKey, fSet ? RefString(IDS_YES) : RefString(IDS_NO), RefString(IDS_INIFNAME)); } /* * Generic dialog invocation routine. Handles procInstance stuff and param * passing. */ INT_PTR FAR DoDialog( LPTSTR lpTemplateName, DLGPROC lpDlgProc, UINT param, BOOL fRememberFocus, HWND hwndParent, HANDLE hInst ) { UINT wRet; HWND hwndFocus; if (fRememberFocus) hwndFocus = GetFocus(); lpDlgProc = (DLGPROC)MakeProcInstance(lpDlgProc, hInst); wRet = (UINT)DialogBoxParam(hInst, (LPCTSTR)lpTemplateName, hwndParent, lpDlgProc, param); FreeProcInstance((FARPROC)lpDlgProc); if (fRememberFocus) SetFocus(hwndFocus); return wRet; } BOOL CALLBACK MarkDlgProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { TCHAR szT[MAX_MARK + 1]; lParam; switch (msg){ case WM_INITDIALOG: SetWindowText(hwnd, RefString(IDS_MARKDLGTITLE)); SendDlgItemMessage(hwnd, IDEF_VALUE, EM_LIMITTEXT, MAX_MARK, 0); SetDlgItemText(hwnd, IDEF_VALUE, RefString(IDS_SEPERATOR)); SetDlgItemText(hwnd, IDTX_VALUE, RefString(IDS_MARKTEXT)); return(1); break; case WM_COMMAND: switch (GET_WM_COMMAND_ID(wParam, lParam)) { case IDOK: GetDlgItemText(hwnd, IDEF_VALUE, szT, MAX_MARK); OutputString(szT); // fall through case IDCANCEL: EndDialog(hwnd, 0); break; default: return(FALSE); } break; } return(FALSE); } #ifdef DBCS /**************************************************************************** My_mbschr: strchr() DBCS version ****************************************************************************/ LPTSTR __cdecl My_mbschr( LPTSTR psz, TCHAR uiSep) { while (*psz != '\0' && *psz != uiSep) { psz = CharNext(psz); } if (*psz == '\0' && uiSep != '\0') { return NULL; } else { return psz; } } #endif