home *** CD-ROM | disk | FTP | other *** search
/ CICA 1992 November / CICA_MS_Windows_CD-ROM_Walnut_Creek_November_1992.iso / win3 / util / trmnat / terminat.c next >
C/C++ Source or Header  |  1992-02-05  |  7KB  |  289 lines

  1. /* 
  2.  * TERMINAT.C -- Terminate Apps and Tasks
  3.  *         Copyright (c) 1991, Gordon Harris, Data Arts
  4.  *         3349 Humboldt Ave. S.
  5.  *         Minneapolis, MN 55408
  6.  *
  7.  *         (612) 825-5436
  8.  *
  9.  *         Comments to CIS [72611,620]
  10.  */
  11.  
  12.  
  13. #define WIN31
  14. #define STRICT
  15. #include <windows.h>
  16. #include <windowsx.h>
  17. #ifdef DEBUG
  18. #include <debug.h>
  19. #endif
  20. #include <toolhelp.h>
  21. #include "terminat.h"
  22.  
  23.  
  24. char szAppName[] = "Terminat";
  25. HINSTANCE   hInst;
  26. MODULEENTRY me;
  27. TASKENTRY   te;
  28. WNDENUMPROC lpfn;
  29.  
  30. #define hLst GetDlgItem(hDlg, ID_LIST)
  31. #define hBut GetDlgItem(hDlg, ID_CLOSE)
  32.  
  33. int PASCAL WinMain (HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpszCmdLine, int nCmdShow)
  34.    {
  35.    DLGPROC lpfnDlg;
  36.    hInst = hInstance;
  37.  
  38.    if (hPrevInst)
  39.       return 0;
  40.  
  41.    lpfnDlg = (DLGPROC) MakeProcInstance((FARPROC)DlgProc, hInstance);
  42.    DialogBox(hInstance, "TERMINAT", NULL, lpfnDlg);
  43.    FreeProcInstance((FARPROC)lpfnDlg);
  44.    return 0;
  45.    }
  46.  
  47. BOOL _export CALLBACK AboutProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  48.    {
  49.    if (message == WM_COMMAND)
  50.       {
  51.       HANDLE_WM_COMMAND(OnCommand, hDlg, wParam, lParam);
  52.       return TRUE;
  53.       }
  54.    return FALSE;
  55.    }
  56.  
  57.  
  58. BOOL _export CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  59.    {
  60.    switch (message)
  61.       {
  62.       case WM_INITDIALOG:
  63.      return (BOOL) HANDLE_WM_INITDIALOG(OnInitDialog, hDlg, wParam, lParam);
  64.  
  65.       case WM_ICONERASEBKGND:
  66.      return (BOOL) HANDLE_WM_ICONERASEBKGND(OnIconEraseBkgnd, hDlg, wParam, lParam);
  67.  
  68.       case WM_SYSCOMMAND:
  69.      HANDLE_WM_SYSCOMMAND(OnSysCommand, hDlg, wParam, lParam);
  70.      return FALSE;
  71.  
  72.       case WM_ACTIVATEAPP:
  73.      HANDLE_WM_ACTIVATEAPP(OnActivateApp, hDlg, wParam, lParam);
  74.      return FALSE;
  75.  
  76.       case WM_COMMAND:
  77.      HANDLE_WM_COMMAND(OnCommand, hDlg, wParam, lParam);
  78.      return TRUE;
  79.  
  80.       case WM_DESTROY:
  81.      HANDLE_WM_DESTROY(OnDestroy, hDlg, wParam, lParam);
  82.      return FALSE;
  83.  
  84.       default:
  85.      return FALSE;
  86.       }
  87.    return FALSE;
  88.    }
  89.  
  90. BOOL OnInitDialog(HWND hDlg, HWND hwndFocus, LPARAM lParam)
  91.    {
  92.    HMENU hMenu;
  93.  
  94.    hMenu = GetSystemMenu(hDlg,FALSE);
  95.    DeleteMenu (hMenu, SC_MAXIMIZE, MF_BYCOMMAND);
  96.    DeleteMenu (hMenu, SC_SIZE,       MF_BYCOMMAND);
  97.    AppendMenu(hMenu, MF_SEPARATOR, 0, (LPSTR)NULL);
  98.    AppendMenu(hMenu, MF_STRING, ID_REREAD, (LPSTR)"&Reread task list");
  99.    AppendMenu(hMenu, MF_STRING, ID_ABOUT,  (LPSTR)"A&bout Terminator...");
  100.  
  101.    /* Give our minimized dialog box an icon.. */
  102.    SetClassWord(hDlg, GCW_HICON, (WPARAM) LoadIcon(hInst, szAppName));
  103.    te.dwSize = sizeof(TASKENTRY);
  104.    me.dwSize = sizeof(MODULEENTRY);
  105.    lpfn = (WNDENUMPROC) MakeProcInstance((FARPROC) EnumProc, hInst);
  106.    PostMessage(hDlg, WM_COMMAND, ID_GETLIST, 0L);
  107.    return TRUE;
  108.    }
  109.  
  110. BOOL OnIconEraseBkgnd(HWND hwnd, HDC hdc)
  111.    {
  112.    SetClassWord(hwnd, GCW_HICON, (WPARAM) LoadIcon(hInst, szAppName));
  113.    return TRUE;
  114.    }
  115.  
  116. void OnSysCommand(HWND hDlg, UINT cmd, int x, int y)
  117.    {
  118.    DLGPROC lpfnDlg;
  119.  
  120.    switch (cmd)
  121.       {
  122.       case ID_REREAD:
  123.      MessageBeep(MB_ICONQUESTION);
  124.      PostMessage(hDlg, WM_COMMAND, ID_GETLIST, 0L);
  125.      break;
  126.  
  127.       case ID_ABOUT:
  128.      lpfnDlg = (DLGPROC) MakeProcInstance((FARPROC)AboutProc, hInst);
  129.      DialogBox(hInst, "ABOUT", NULL, lpfnDlg);
  130.      FreeProcInstance((FARPROC)lpfnDlg);
  131.      break;
  132.  
  133.       case SC_CLOSE:
  134.      EndDialog(hDlg, TRUE);
  135.       }
  136.    }
  137.  
  138. void OnActivateApp(HWND hDlg, BOOL fActivate, HTASK htaskActDeact)
  139.    {
  140.    if (fActivate)
  141.       PostMessage(hDlg, WM_COMMAND, ID_GETLIST, 0L);
  142.    }
  143.  
  144. BOOL dYield (void)
  145.    {
  146.    MSG msg;
  147.  
  148.    while (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))
  149.       {
  150.       TranslateMessage (&msg);
  151.       DispatchMessage (&msg);
  152.       }
  153.    return FALSE;
  154.    }
  155.  
  156. void dWait (unsigned nMsecs)
  157.    {
  158.    HCURSOR hcursor;
  159.    DWORD dwTime = GetTickCount();
  160.    hcursor = SetCursor(LoadCursor(NULL, IDC_WAIT));
  161.    while (GetTickCount() < dwTime + (DWORD) nMsecs)
  162.       dYield();
  163.    SetCursor(hcursor);
  164.    }
  165.  
  166. #define TASKFLAG HIWORD(l)
  167.  
  168. void OnCommand(HWND hDlg, int id, HWND hwndCtl, UINT codeNotify)
  169.    {
  170.    int n, j;
  171.    LONG   l;
  172.    char szMsg[120];
  173.    switch (id)
  174.       {
  175.       case ID_LIST:
  176.      n = ListBox_GetCurSel(hLst);
  177.      if (n == LB_ERR)
  178.         return;
  179.      l = ListBox_GetItemData(hLst, n);
  180.  
  181.      if (codeNotify == LBN_SELCHANGE)
  182.         Button_Enable(hBut, HIWORD(l));
  183.  
  184.      else if (codeNotify == LBN_DBLCLK)
  185.         {
  186.         if (HIWORD(l))
  187.            {
  188.            TaskFindHandle(&te, (HANDLE)LOWORD(l));
  189.            wsprintf(szMsg, "Task   %04X %s hInst %04X hModule %04X SS %04X SP %04X sTop %04X sMin %04X sBot %04X",
  190.              te.hTask, (LPSTR)te.szModule, te.hInst, te.hModule, te.wSS, te.wSP, te.wStackTop, te.wStackMinimum, te.wStackBottom);
  191.            }
  192.         else
  193.            {
  194.            ModuleFindHandle(&me, (HANDLE)LOWORD(l));
  195.            wsprintf(szMsg, "Module %04X %s refcount %d", me.hModule, (LPSTR)me.szExePath, me.wcUsage);
  196.            }
  197.         MessageBox(hDlg, szMsg, szAppName, MB_ICONINFORMATION | MB_OK);
  198.         }
  199.      return;
  200.  
  201.       case ID_GETLIST:
  202.      Button_Enable(hBut, FALSE);
  203.      SetWindowRedraw(hLst, FALSE);
  204.  
  205.      j = ListBox_GetCurSel(hLst);
  206.      ListBox_ResetContent(hLst);
  207.  
  208.      /* Enumerate the loaded modules.. */
  209.      me.dwSize = sizeof(MODULEENTRY);
  210.      ModuleFirst(&me);
  211.      do {
  212.         n = ListBox_AddString(hLst, me.szModule);
  213.         ListBox_SetItemData(hLst, n, MAKELONG(me.hModule,0)); // HIWORD == 0 == module
  214.         } while (ModuleNext(&me));
  215.  
  216.      /* Now enumerate the tasks.. */
  217.      te.dwSize = sizeof(TASKENTRY);
  218.      TaskFirst(&te);
  219.      do {
  220.         /* Find the module which matches the task.. */
  221.         n = ListBox_FindString(hLst, 0, te.szModule);
  222.         /* Replace the module handle with the task handle.. */
  223.         if (n != LB_ERR)
  224.            ListBox_SetItemData(hLst, n, MAKELONG(te.hTask,1)); // HIWORD == 1 == task
  225.         } while (TaskNext(&te));
  226.  
  227.      if (j != LB_ERR)
  228.         ListBox_SetCurSel(hLst, j);
  229.      else
  230.         ListBox_SetCurSel(hLst, 0);
  231.  
  232.      SetWindowRedraw(hLst, TRUE);
  233.  
  234.      InvalidateRect(hLst, NULL, TRUE);
  235.      return;
  236.  
  237.       case ID_TERMINATE:
  238.      n = ListBox_GetCurSel(hLst);
  239.      if (n == LB_ERR)
  240.         return;
  241.      l = ListBox_GetItemData(hLst, n);
  242.      /* If this is a task, terminate it.. */
  243.      if ( HIWORD(l) && IsTask( (HTASK) LOWORD(l)) )
  244.         TerminateApp((HANDLE)LOWORD(l), NO_UAE_BOX);
  245.      /* Else, reduce the reference count to 0.. */
  246.      else
  247.         {
  248.         j = 0;
  249.         while (n = FreeModule((HINSTANCE)LOWORD(l)))
  250.            {
  251.            if (j == n)
  252.           break;
  253.            j = n;
  254.            }
  255.         }
  256.  
  257.      dWait(2000);
  258.      PostMessage(hDlg, WM_COMMAND, ID_GETLIST, 0L);
  259.      return;
  260.  
  261.       case ID_CLOSE:
  262.      n = ListBox_GetCurSel(hLst);
  263.      if (n == LB_ERR)
  264.         return;
  265.      l = ListBox_GetItemData(hLst, n);
  266.      if (HIWORD(l) && IsTask((HTASK) LOWORD(l)) )
  267.         EnumTaskWindows((HTASK)LOWORD(l), (WNDENUMPROC)lpfn, 0L); //Kill the app..
  268.      dWait(2000);
  269.      PostMessage(hDlg, WM_COMMAND, ID_GETLIST, 0L);
  270.      return;
  271.  
  272.       case ID_QUIT:
  273.      EndDialog(hDlg, TRUE);
  274.      return;
  275.       }
  276.    }
  277.  
  278. void OnDestroy(HWND hwnd)
  279.    {
  280.    FreeProcInstance((FARPROC)lpfn);
  281.    }
  282.  
  283. BOOL _export CALLBACK EnumProc (HWND hwnd, LPARAM lParam)
  284.    {
  285.    PostMessage(hwnd, WM_CLOSE, 0, 0L);
  286.    MessageBeep(MB_ICONEXCLAMATION);
  287.    return 0;
  288.    }
  289.