KILL.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:8k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /******************************************************************************
  2. *       This is a part of the Microsoft Source Code Samples. 
  3. *       Copyright (C) 1994-1996 Microsoft Corporation.
  4. *       All rights reserved. 
  5. *       This source code is only intended as a supplement to 
  6. *       Microsoft Development Tools and/or WinHelp documentation.
  7. *       See these sources for detailed information regarding the 
  8. *       Microsoft samples programs.
  9. ******************************************************************************/
  10. /*++
  11. Module Name:
  12.     kill.c
  13. Abstract:
  14.     This module implements a task killer application.
  15. --*/
  16. #include <windows.h>
  17. #include <stdio.h>
  18. #include <stdlib.h>
  19. #include <string.h>
  20. #include "common.h"
  21. #define MAX_TASKS           256
  22. BOOL        ForceKill;
  23. DWORD       pid;
  24. CHAR        pname[MAX_PATH];
  25. TASK_LIST   tlist[MAX_TASKS];
  26. VOID GetCommandLineArgs(VOID);
  27. VOID Usage(VOID);
  28. int _cdecl
  29. main(
  30.     int argc,
  31.     char *argv[]
  32.     )
  33. {
  34.     DWORD             i;
  35.     DWORD             numTasks;
  36.     TASK_LIST_ENUM    te;
  37.     int               rval = 0;
  38.     char              tname[PROCESS_SIZE];
  39.     LPSTR             p;
  40.     DWORD             ThisPid;
  41.     OSVERSIONINFO     verInfo = {0};
  42.     LPGetTaskList     GetTaskList;
  43.     LPEnableDebugPriv EnableDebugPriv;
  44.     GetCommandLineArgs();
  45.     if (pid == 0 && pname[0] == 0) {
  46.         printf( "missing pid or task namen"
  47.                 "type kill /? for helpn");
  48.         return 1;
  49.     }
  50.     //
  51.     // Determine what system we're on and do the right thing
  52.     //
  53.     verInfo.dwOSVersionInfoSize = sizeof (verInfo);
  54.     GetVersionEx(&verInfo);
  55.     switch (verInfo.dwPlatformId)
  56.     {
  57.     case VER_PLATFORM_WIN32_NT:
  58.        GetTaskList     = GetTaskListNT;
  59.        EnableDebugPriv = EnableDebugPrivNT;
  60.        break;
  61.     case VER_PLATFORM_WIN32_WINDOWS:
  62.        GetTaskList = GetTaskList95;
  63.        EnableDebugPriv = EnableDebugPriv95;
  64.        break;
  65.     default:
  66.        printf ("tlist requires Windows NT or Windows 95n");
  67.        return 1;
  68.     }
  69.     //
  70.     // Obtain the ability to manipulate other processes
  71.     //
  72.     EnableDebugPriv();
  73.     if (pid) {
  74.         tlist[0].dwProcessId = pid;
  75.         if (KillProcess( tlist, TRUE )) {
  76.             printf( "process #%d killedn", pid );
  77.             return 0;
  78.         } else {
  79.             printf( "process #%d could not be killedn", pid );
  80.             return 1;
  81.         }
  82.     }
  83.     //
  84.     // get the task list for the system
  85.     //
  86.     numTasks = GetTaskList( tlist, MAX_TASKS );
  87.     //
  88.     // enumerate all windows and try to get the window
  89.     // titles for each task
  90.     //
  91.     te.tlist = tlist;
  92.     te.numtasks = numTasks;
  93.     GetWindowTitles( &te );
  94.     ThisPid = GetCurrentProcessId();
  95.     for (i=0; i<numTasks; i++) {
  96.         //
  97.         // this prevents the user from killing KILL.EXE and
  98.         // it's parent cmd window too
  99.         //
  100.         if (ThisPid == tlist[i].dwProcessId) {
  101.             continue;
  102.         }
  103.         if (MatchPattern( tlist[i].WindowTitle, "*KILL*" )) {
  104.             continue;
  105.         }
  106.         tname[0] = 0;
  107.         strcpy( tname, tlist[i].ProcessName );
  108.         p = strchr( tname, '.' );
  109.         if (p) {
  110.             p[0] = '';
  111.         }
  112.         if (MatchPattern( tname, pname )) {
  113.             tlist[i].flags = TRUE;
  114.         } else if (MatchPattern( tlist[i].ProcessName, pname )) {
  115.             tlist[i].flags = TRUE;
  116.         } else if (MatchPattern( tlist[i].WindowTitle, pname )) {
  117.             tlist[i].flags = TRUE;
  118.         }
  119.     }
  120.     for (i=0; i<numTasks; i++) {
  121.         if (tlist[i].flags) {
  122.             if (KillProcess( &tlist[i], ForceKill )) {
  123.                 printf( "process #%d [%s] killedn", tlist[i].dwProcessId, tlist[i].ProcessName );
  124.             } else {
  125.                 printf( "process #%d [%s] could not be killedn", tlist[i].dwProcessId, tlist[i].ProcessName );
  126.                 rval = 1;
  127.             }
  128.         }
  129.     }
  130.     return rval;
  131. }
  132. VOID
  133. GetCommandLineArgs(
  134.     VOID
  135.     )
  136. {
  137.     char        *lpstrCmd;
  138.     UCHAR       ch;
  139.     char        *p = pname;
  140.     pid = 0;
  141.     *p = '';
  142.     lpstrCmd = GetCommandLine();
  143.     // skip over program name
  144.     do 
  145.     {
  146.        ch = *lpstrCmd++;
  147.     }
  148.     while (!isspace(ch));
  149.     //  skip over any white space following the program name
  150.     while (isspace(ch)) 
  151.     {
  152.        ch = *lpstrCmd++;
  153.     }
  154.     // Follow this pattern strictly:
  155.     //  KILL [options] <<pid> | <pattern>>nn" 
  156.     //  where options is /f,
  157.     //  and PID is a positive or negative decimal number, and
  158.     //  pattern is a string of characters
  159.     // Look for an option, which will be prefaced with '/'
  160.     if (ch == '/')
  161.     {
  162.        ch = *lpstrCmd++;
  163.   
  164.        switch (ch) 
  165.        {
  166.        case 'F':     // found "kill /f" so far
  167.        case 'f':
  168.           ForceKill = TRUE;
  169.           ch = *lpstrCmd++;
  170.           break;
  171.        case '?':    // found "kill /?"
  172.           Usage();
  173.           return;   // don't do anything after printing usage
  174.           break;
  175.        default:
  176.           printf ("%c is an invalid switchn", ch);  // invalid switch
  177.           return;   
  178.        }
  179.     
  180.        // eat whitepace after option switch
  181.        while (isspace(ch)) 
  182.        {
  183.           ch = *lpstrCmd++;
  184.        }
  185.     }
  186.     // In the 3 cases below, look for either a PID or a pattern 
  187.     // a PID could be a positive or negative decimal integer
  188.     // Look for a negative PID
  189.     if (ch == '-')
  190.     {
  191.        ch = *lpstrCmd++;
  192.        while (isdigit(ch)) 
  193.        {
  194.           pid = pid * 10 - ( ch - '0' );
  195.           ch = *lpstrCmd++;
  196.        }
  197.        return; // found "kill -pid" or "kill /f -pid" so we're done
  198.     }
  199.     // Look for a postive PID
  200.     if (isdigit(ch)) 
  201.     {
  202.        while (isdigit(ch)) 
  203.        {
  204.           pid = pid * 10 + ch - '0';
  205.           ch = *lpstrCmd++;
  206.        }
  207.        return;  // found "kill pid" or "kill /f pid" so we're done
  208.     }
  209.  
  210.     // Look for a pattern
  211.     while (ch) 
  212.     {
  213.        *p++ = ch;
  214.        ch = *lpstrCmd++;
  215.     }
  216.     *p = '';
  217.     strupr(pname);
  218.     return;  // found "kill pattern" or "kill /f pattern" so we're done
  219. }
  220.       
  221. VOID
  222. Usage(
  223.     VOID
  224.     )
  225. /*++
  226. Routine Description:
  227.     Prints usage text for this tool.
  228. Arguments:
  229.     None.
  230. Return Value:
  231.     None.
  232. --*/
  233. {
  234.     fprintf( stderr, "Microsoft (R) Windows (TM) KILLn" );
  235.     fprintf( stderr, "Copyright (C) 1994-1996 Microsoft Corp. All rights reservednn" );
  236.     fprintf( stderr, "usage: KILL [options] <<pid> | <pattern>>nn" );
  237.     fprintf( stderr, "           [options]:n" );
  238.     fprintf( stderr, "               /?     This helpnn" );
  239.     fprintf( stderr, "               /f     Force process killnn" );
  240.     fprintf( stderr, "           <pid>n" );
  241.     fprintf( stderr, "              This is the process id for the taskn" );
  242.     fprintf( stderr, "               to be killed.  Use TLIST to get an" );
  243.     fprintf( stderr, "               valid pidnn" );
  244.     fprintf( stderr, "           <pattern>n" );
  245.     fprintf( stderr, "              The pattern can be a complete taskn" );
  246.     fprintf( stderr, "              name or a regular expression patternn" );
  247.     fprintf( stderr, "              to use as a match.  Kill matches then" );
  248.     fprintf( stderr, "              supplied pattern against the task namesn" );
  249.     fprintf( stderr, "              and the window titles.n" );
  250.     ExitProcess(0);
  251. }