mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-11-03 13:30:52 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			285 lines
		
	
	
		
			9.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			285 lines
		
	
	
		
			9.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#include <windows.h>
 | 
						|
#include <tlhelp32.h>
 | 
						|
#include <iostream>
 | 
						|
 | 
						|
int killbyname(const char *szToTerminate)
 | 
						|
// Created: 6/23/2000  (Ravi Kochhar)
 | 
						|
// Last modified: 3/10/2002  (RK)
 | 
						|
// Please report any problems or bugs to kochhar@physiology.wisc.edu
 | 
						|
// The latest version of this routine can be found at:
 | 
						|
//     http://www.neurophys.wisc.edu/ravi/software/killproc/
 | 
						|
// Terminate the process "szToTerminate" if it is currently running
 | 
						|
// This works for Win/95/98/ME and also Win/NT/2000/XP
 | 
						|
// The process name is case-insensitive, i.e. "notepad.exe" and "NOTEPAD.EXE"
 | 
						|
// will both work (for szToTerminate)
 | 
						|
// Return codes are as follows:
 | 
						|
//   0   = Process was successfully terminated
 | 
						|
//   602 = Unable to terminate process for some other reason
 | 
						|
//   603 = Process was not currently running
 | 
						|
//   604 = No permission to terminate process
 | 
						|
//   605 = Unable to load PSAPI.DLL
 | 
						|
//   606 = Unable to identify system type
 | 
						|
//   607 = Unsupported OS
 | 
						|
//   632 = Invalid process name
 | 
						|
//   700 = Unable to get procedure address from PSAPI.DLL
 | 
						|
//   701 = Unable to get process list, EnumProcesses failed
 | 
						|
//   702 = Unable to load KERNEL32.DLL
 | 
						|
//   703 = Unable to get procedure address from KERNEL32.DLL
 | 
						|
//   704 = CreateToolhelp32Snapshot failed
 | 
						|
 | 
						|
{
 | 
						|
  BOOL bResult,bResultm;
 | 
						|
  DWORD aiPID[1000],iCb=1000,iNumProc;  //,iV2000=0;
 | 
						|
  DWORD iCbneeded,i,iFound=0;
 | 
						|
  char szName[MAX_PATH],szToTermUpper[MAX_PATH];
 | 
						|
  HANDLE hProc,hSnapShot,hSnapShotm;
 | 
						|
  OSVERSIONINFO osvi;
 | 
						|
  HINSTANCE hInstLib;
 | 
						|
//  int iLen,iLenP,indx;
 | 
						|
  int iLenP,indx;
 | 
						|
  HMODULE hMod;
 | 
						|
  PROCESSENTRY32 procentry;
 | 
						|
  MODULEENTRY32 modentry;
 | 
						|
 | 
						|
  // Transfer Process name into "szToTermUpper" and convert to upper case
 | 
						|
  iLenP=strlen(szToTerminate);
 | 
						|
  if(iLenP<1 || iLenP>MAX_PATH) return 632;
 | 
						|
  for(indx=0;indx<iLenP;indx++)
 | 
						|
    szToTermUpper[indx]=toupper(szToTerminate[indx]);
 | 
						|
  szToTermUpper[iLenP]=0;
 | 
						|
 | 
						|
  // PSAPI Function Pointers.
 | 
						|
  BOOL (WINAPI *lpfEnumProcesses)( DWORD *, DWORD cb, DWORD * );
 | 
						|
  BOOL (WINAPI *lpfEnumProcessModules)( HANDLE, HMODULE *,
 | 
						|
                                        DWORD, LPDWORD );
 | 
						|
  DWORD (WINAPI *lpfGetModuleBaseName)( HANDLE, HMODULE,
 | 
						|
                                        LPTSTR, DWORD );
 | 
						|
 | 
						|
  // ToolHelp Function Pointers.
 | 
						|
  HANDLE (WINAPI *lpfCreateToolhelp32Snapshot)(DWORD,DWORD) ;
 | 
						|
  BOOL (WINAPI *lpfProcess32First)(HANDLE,LPPROCESSENTRY32) ;
 | 
						|
  BOOL (WINAPI *lpfProcess32Next)(HANDLE,LPPROCESSENTRY32) ;
 | 
						|
  BOOL (WINAPI *lpfModule32First)(HANDLE,LPMODULEENTRY32) ;
 | 
						|
  BOOL (WINAPI *lpfModule32Next)(HANDLE,LPMODULEENTRY32) ;
 | 
						|
 | 
						|
  // First check what version of Windows we're in
 | 
						|
  osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
 | 
						|
  bResult=GetVersionEx(&osvi);
 | 
						|
  if(!bResult) return 606;    // Unable to identify system version
 | 
						|
 | 
						|
  // At Present we only support Win/NT/2000/XP or Win/9x/ME
 | 
						|
  // Seems to work OK in Win7
 | 
						|
  if((osvi.dwPlatformId != VER_PLATFORM_WIN32_NT) &&
 | 
						|
     (osvi.dwPlatformId != VER_PLATFORM_WIN32_WINDOWS)) return 607;
 | 
						|
 | 
						|
  if(osvi.dwPlatformId==VER_PLATFORM_WIN32_NT)
 | 
						|
  {
 | 
						|
    // Win/NT or 2000 or XP
 | 
						|
 | 
						|
    // Load library and get the procedures explicitly. We do
 | 
						|
    // this so that we don't have to worry about modules using
 | 
						|
    // this code failing to load under Windows 9x, because
 | 
						|
    // it can't resolve references to the PSAPI.DLL.
 | 
						|
    hInstLib = LoadLibraryA("PSAPI.DLL");
 | 
						|
    if(hInstLib == NULL) return 605;
 | 
						|
 | 
						|
    // Get procedure addresses.
 | 
						|
    lpfEnumProcesses = (BOOL(WINAPI *)(DWORD *,DWORD,DWORD*))(void (*)())
 | 
						|
        GetProcAddress( hInstLib, "EnumProcesses" ) ;
 | 
						|
    lpfEnumProcessModules = (BOOL(WINAPI *)(HANDLE, HMODULE *,
 | 
						|
        DWORD, LPDWORD))(void (*)()) GetProcAddress( hInstLib,                                                                     "EnumProcessModules" ) ;
 | 
						|
        lpfGetModuleBaseName =(DWORD (WINAPI *)(HANDLE, HMODULE, LPTSTR,
 | 
						|
        DWORD ))(void (*)()) GetProcAddress( hInstLib, "GetModuleBaseNameA" ) ;
 | 
						|
 | 
						|
    if(lpfEnumProcesses == NULL || lpfEnumProcessModules == NULL ||
 | 
						|
         lpfGetModuleBaseName == NULL) {
 | 
						|
      FreeLibrary(hInstLib);
 | 
						|
      return 700;
 | 
						|
    }
 | 
						|
 | 
						|
    bResult=lpfEnumProcesses(aiPID,iCb,&iCbneeded);
 | 
						|
    if(!bResult) {
 | 
						|
      // Unable to get process list, EnumProcesses failed
 | 
						|
      FreeLibrary(hInstLib);
 | 
						|
      return 701;
 | 
						|
    }
 | 
						|
 | 
						|
    // How many processes are there?
 | 
						|
    iNumProc=iCbneeded/sizeof(DWORD);
 | 
						|
 | 
						|
    // Get and match the name of each process
 | 
						|
    for(i=0;i<iNumProc;i++) {
 | 
						|
      // Get the (module) name for this process
 | 
						|
      strcpy(szName,"Unknown");
 | 
						|
      // First, get a handle to the process
 | 
						|
      hProc=OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,FALSE,
 | 
						|
                        aiPID[i]);
 | 
						|
      // Now, get the process name
 | 
						|
      if(hProc) {
 | 
						|
        if(lpfEnumProcessModules(hProc,&hMod,sizeof(hMod),&iCbneeded) ) {
 | 
						|
//          iLen=lpfGetModuleBaseName(hProc,hMod,szName,MAX_PATH);
 | 
						|
          lpfGetModuleBaseName(hProc,hMod,szName,MAX_PATH);
 | 
						|
        }
 | 
						|
      }
 | 
						|
      CloseHandle(hProc);
 | 
						|
      // We will match regardless of lower or upper case
 | 
						|
      if(strcmp(_strupr(szName),szToTermUpper)==0) {
 | 
						|
        // Process found, now terminate it
 | 
						|
        iFound=1;
 | 
						|
        // First open for termination
 | 
						|
        hProc=OpenProcess(PROCESS_TERMINATE,FALSE,aiPID[i]);
 | 
						|
        if(hProc) {
 | 
						|
          if(TerminateProcess(hProc,0)) {
 | 
						|
            // process terminated
 | 
						|
            CloseHandle(hProc);
 | 
						|
            FreeLibrary(hInstLib);
 | 
						|
            return 0;
 | 
						|
          } else {
 | 
						|
            // Unable to terminate process
 | 
						|
            CloseHandle(hProc);
 | 
						|
            FreeLibrary(hInstLib);
 | 
						|
            return 602;
 | 
						|
          }
 | 
						|
        } else {
 | 
						|
          // Unable to open process for termination
 | 
						|
          FreeLibrary(hInstLib);
 | 
						|
          return 604;
 | 
						|
        }
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  if(osvi.dwPlatformId==VER_PLATFORM_WIN32_WINDOWS)
 | 
						|
  {
 | 
						|
    // Win/95 or 98 or ME
 | 
						|
 | 
						|
    hInstLib = LoadLibraryA("Kernel32.DLL");
 | 
						|
    if( hInstLib == NULL )
 | 
						|
      return 702;
 | 
						|
 | 
						|
    // Get procedure addresses.
 | 
						|
    // We are linking to these functions of Kernel32
 | 
						|
    // explicitly, because otherwise a module using
 | 
						|
    // this code would fail to load under Windows NT,
 | 
						|
    // which does not have the Toolhelp32
 | 
						|
    // functions in the Kernel 32.
 | 
						|
    lpfCreateToolhelp32Snapshot=
 | 
						|
        (HANDLE(WINAPI *)(DWORD,DWORD))(void (*)())
 | 
						|
        GetProcAddress( hInstLib,
 | 
						|
                        "CreateToolhelp32Snapshot" ) ;
 | 
						|
    lpfProcess32First=
 | 
						|
        (BOOL(WINAPI *)(HANDLE,LPPROCESSENTRY32))(void (*)())
 | 
						|
        GetProcAddress( hInstLib, "Process32First" ) ;
 | 
						|
    lpfProcess32Next=
 | 
						|
        (BOOL(WINAPI *)(HANDLE,LPPROCESSENTRY32))(void (*)())
 | 
						|
        GetProcAddress( hInstLib, "Process32Next" ) ;
 | 
						|
    lpfModule32First=
 | 
						|
        (BOOL(WINAPI *)(HANDLE,LPMODULEENTRY32))(void (*)())
 | 
						|
        GetProcAddress( hInstLib, "Module32First" ) ;
 | 
						|
    lpfModule32Next=
 | 
						|
        (BOOL(WINAPI *)(HANDLE,LPMODULEENTRY32))(void (*)())
 | 
						|
        GetProcAddress( hInstLib, "Module32Next" ) ;
 | 
						|
    if( lpfProcess32Next == NULL ||
 | 
						|
        lpfProcess32First == NULL ||
 | 
						|
        lpfModule32Next == NULL ||
 | 
						|
        lpfModule32First == NULL ||
 | 
						|
        lpfCreateToolhelp32Snapshot == NULL )
 | 
						|
    {
 | 
						|
      FreeLibrary(hInstLib);
 | 
						|
      return 703;
 | 
						|
    }
 | 
						|
 | 
						|
    // The Process32.. and Module32.. routines return names in all uppercase
 | 
						|
 | 
						|
    // Get a handle to a Toolhelp snapshot of all the systems processes.
 | 
						|
 | 
						|
    hSnapShot = lpfCreateToolhelp32Snapshot(
 | 
						|
          TH32CS_SNAPPROCESS, 0 ) ;
 | 
						|
    if( hSnapShot == INVALID_HANDLE_VALUE )
 | 
						|
    {
 | 
						|
      FreeLibrary(hInstLib);
 | 
						|
      return 704;
 | 
						|
    }
 | 
						|
 | 
						|
    // Get the first process' information.
 | 
						|
    procentry.dwSize = sizeof(PROCESSENTRY32);
 | 
						|
    bResult=lpfProcess32First(hSnapShot,&procentry);
 | 
						|
 | 
						|
    // While there are processes, keep looping and checking.
 | 
						|
    while(bResult)
 | 
						|
    {
 | 
						|
      // Get a handle to a Toolhelp snapshot of this process.
 | 
						|
      hSnapShotm = lpfCreateToolhelp32Snapshot(
 | 
						|
            TH32CS_SNAPMODULE, procentry.th32ProcessID) ;
 | 
						|
      if( hSnapShotm == INVALID_HANDLE_VALUE )
 | 
						|
      {
 | 
						|
        CloseHandle(hSnapShot);
 | 
						|
        FreeLibrary(hInstLib);
 | 
						|
        return 704;
 | 
						|
      }
 | 
						|
      // Get the module list for this process
 | 
						|
      modentry.dwSize=sizeof(MODULEENTRY32);
 | 
						|
      bResultm=lpfModule32First(hSnapShotm,&modentry);
 | 
						|
 | 
						|
      // While there are modules, keep looping and checking
 | 
						|
      while(bResultm)
 | 
						|
      {
 | 
						|
        if(strcmp(modentry.szModule,szToTermUpper)==0)
 | 
						|
        {
 | 
						|
          // Process found, now terminate it
 | 
						|
          iFound=1;
 | 
						|
          // First open for termination
 | 
						|
          hProc=OpenProcess(PROCESS_TERMINATE,FALSE,procentry.th32ProcessID);
 | 
						|
          if(hProc)
 | 
						|
          {
 | 
						|
            if(TerminateProcess(hProc,0))
 | 
						|
            {
 | 
						|
              // process terminated
 | 
						|
              CloseHandle(hSnapShotm);
 | 
						|
              CloseHandle(hSnapShot);
 | 
						|
              CloseHandle(hProc);
 | 
						|
              FreeLibrary(hInstLib);
 | 
						|
              return 0;
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
              // Unable to terminate process
 | 
						|
              CloseHandle(hSnapShotm);
 | 
						|
              CloseHandle(hSnapShot);
 | 
						|
              CloseHandle(hProc);
 | 
						|
              FreeLibrary(hInstLib);
 | 
						|
              return 602;
 | 
						|
            }
 | 
						|
          }
 | 
						|
          else
 | 
						|
          {
 | 
						|
            // Unable to open process for termination
 | 
						|
            CloseHandle(hSnapShotm);
 | 
						|
            CloseHandle(hSnapShot);
 | 
						|
            FreeLibrary(hInstLib);
 | 
						|
            return 604;
 | 
						|
          }
 | 
						|
        }
 | 
						|
        else
 | 
						|
        {  // Look for next modules for this process
 | 
						|
          modentry.dwSize=sizeof(MODULEENTRY32);
 | 
						|
          bResultm=lpfModule32Next(hSnapShotm,&modentry);
 | 
						|
        }
 | 
						|
      }
 | 
						|
 | 
						|
      //Keep looking
 | 
						|
      CloseHandle(hSnapShotm);
 | 
						|
      procentry.dwSize = sizeof(PROCESSENTRY32);
 | 
						|
      bResult = lpfProcess32Next(hSnapShot,&procentry);
 | 
						|
    }
 | 
						|
    CloseHandle(hSnapShot);
 | 
						|
  }
 | 
						|
  if(iFound==0)
 | 
						|
  {
 | 
						|
    FreeLibrary(hInstLib);
 | 
						|
    return 603;
 | 
						|
  }
 | 
						|
  FreeLibrary(hInstLib);
 | 
						|
  return 0;
 | 
						|
}
 |