Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Terminateprocess()

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] > 2 <
010
06.03.2003, 22:02 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo Uli,
Hab Deinen Code einmal getestet, bei mir läuft Deine Variante. Da Du aber Deiner Funktion den Namen des Processes mit auf den Weg gibst, prüfe mal ob diese Variante auf Deinen Rechnern läuft!

C++:
int EndProcess(const char *szToTerminate)
// Return codes:
//   0   = Process was successfully terminated
//   603 = Process was not currently running
//   604 = No permission to terminate process
//   605 = Unable to load PSAPI.DLL
//   602 = Unable to terminate process for some other reason
//   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,j,iFound=0;
    char szName[MAX_PATH],szToTermUpper[MAX_PATH];
    HANDLE hProc,hSnapShot,hSnapShotm;
    OSVERSIONINFO osvi;
    HINSTANCE hInstLib;
    int iLen,iLenP,indx;
    HMODULE hMod;
    PROCESSENTRY32 procentry;      
    MODULEENTRY32 modentry;

    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;

    BOOL (WINAPI *lpfEnumProcesses)( DWORD *, DWORD cb, DWORD * );
    BOOL (WINAPI *lpfEnumProcessModules)( HANDLE, HMODULE *,
        DWORD, LPDWORD );
    DWORD (WINAPI *lpfGetModuleBaseName)( HANDLE, HMODULE,
        LPTSTR, DWORD );

    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) ;

    // check ersion of Windows
    osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
    bResult=GetVersionEx(&osvi);
    if(!bResult)    
        return 606;

    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
        // references to the PSAPI.DLL.
         hInstLib = LoadLibraryA("PSAPI.DLL");
         if(hInstLib == NULL)
            return 605;

        // Get procedure addresses.
        lpfEnumProcesses = (BOOL(WINAPI *)(DWORD *,DWORD,DWORD*))
            GetProcAddress( hInstLib, "EnumProcesses" ) ;
        lpfEnumProcessModules = (BOOL(WINAPI *)(HANDLE, HMODULE *,
            DWORD, LPDWORD)) GetProcAddress( hInstLib,
            "EnumProcessModules" ) ;
        lpfGetModuleBaseName =(DWORD (WINAPI *)(HANDLE, HMODULE,
            LPTSTR, DWORD )) GetProcAddress( hInstLib,
            "GetModuleBaseNameA" ) ;

        if(lpfEnumProcesses == NULL || lpfEnumProcessModules == NULL ||
            lpfGetModuleBaseName == NULL){
            FreeLibrary(hInstLib);
            return 700;
        }
        
        bResult=lpfEnumProcesses(aiPID,iCb,&iCbneeded);
        if(!bResult){
            FreeLibrary(hInstLib);
            return 701;
        }

        // How many processes ?
        iNumProc=iCbneeded/sizeof(DWORD);
        for(j=0;j<iNumProc;j++){
        // Get the (module) name for this process
            strcpy(szName,"Unknown");
            hProc=OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,FALSE,
                aiPID[j]);
            //get the process name
            if(hProc){
                if(lpfEnumProcessModules(hProc,&hMod,sizeof(hMod),&iCbneeded) ){
                    iLen=lpfGetModuleBaseName(hProc,hMod,szName,MAX_PATH);
                }
            }
            CloseHandle(hProc);
            if(strcmp(_strupr(szName),szToTermUpper)==0){
                iFound=1;
                hProc=OpenProcess(PROCESS_TERMINATE,FALSE,aiPID[j]);
                if(hProc){
                    if(TerminateProcess(hProc,0)){
                        CloseHandle(hProc);
                        FreeLibrary(hInstLib);
                        return 0;
                    }
                    else{
                        CloseHandle(hProc);
                        FreeLibrary(hInstLib);
                        return 602;
                    }
                }
                else{
                    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;
        lpfCreateToolhelp32Snapshot=
            (HANDLE(WINAPI *)(DWORD,DWORD))
            GetProcAddress( hInstLib,
            "CreateToolhelp32Snapshot" ) ;
        lpfProcess32First=
            (BOOL(WINAPI *)(HANDLE,LPPROCESSENTRY32))
            GetProcAddress( hInstLib, "Process32First" ) ;
        lpfProcess32Next=
            (BOOL(WINAPI *)(HANDLE,LPPROCESSENTRY32))
            GetProcAddress( hInstLib, "Process32Next" ) ;
        lpfModule32First=
            (BOOL(WINAPI *)(HANDLE,LPMODULEENTRY32))
            GetProcAddress( hInstLib, "Module32First" ) ;
        lpfModule32Next=
            (BOOL(WINAPI *)(HANDLE,LPMODULEENTRY32))
            GetProcAddress( hInstLib, "Module32Next" ) ;
        if( lpfProcess32Next == NULL ||
            lpfProcess32First == NULL ||
            lpfModule32Next == NULL ||
            lpfModule32First == NULL ||
            lpfCreateToolhelp32Snapshot == NULL ){
            FreeLibrary(hInstLib);
            return 703;
        }
            
        hSnapShot = lpfCreateToolhelp32Snapshot(
            TH32CS_SNAPPROCESS, 0 ) ;
        if( hSnapShot == INVALID_HANDLE_VALUE ){
            FreeLibrary(hInstLib);
            return 704;
        }
        procentry.dwSize = sizeof(PROCESSENTRY32);
        bResult=lpfProcess32First(hSnapShot,&procentry);
        while(bResult){
            hSnapShotm = lpfCreateToolhelp32Snapshot(
                TH32CS_SNAPMODULE, procentry.th32ProcessID) ;
            if( hSnapShotm == INVALID_HANDLE_VALUE ){
                CloseHandle(hSnapShot);
                FreeLibrary(hInstLib);
                return 704;
            }
            modentry.dwSize=sizeof(MODULEENTRY32);
            bResultm=lpfModule32First(hSnapShotm,&modentry);
            while(bResultm){
                if(strcmp(modentry.szModule,szToTermUpper)==0){
                    iFound=1;
                    hProc=OpenProcess(PROCESS_TERMINATE,FALSE,procentry.th32ProcessID);
                    if(hProc){
                        if(TerminateProcess(hProc,0)){
                            CloseHandle(hSnapShotm);
                            CloseHandle(hSnapShot);
                            CloseHandle(hProc);
                            FreeLibrary(hInstLib);
                            return 0;
                        }
                        else{
                            CloseHandle(hSnapShotm);
                            CloseHandle(hSnapShot);
                            CloseHandle(hProc);
                            FreeLibrary(hInstLib);
                            return 602;
                        }
                    }
                    else{
                        CloseHandle(hSnapShotm);
                        CloseHandle(hSnapShot);
                        FreeLibrary(hInstLib);
                        return 604;
                    }
                }
                else{
                    modentry.dwSize=sizeof(MODULEENTRY32);
                    bResultm=lpfModule32Next(hSnapShotm,&modentry);
                }
            }
            CloseHandle(hSnapShotm);
            procentry.dwSize = sizeof(PROCESSENTRY32);
            bResult = lpfProcess32Next(hSnapShot,&procentry);
        }
        CloseHandle(hSnapShot);
    }
    if(iFound==0){
        FreeLibrary(hInstLib);
        return 603;
    }
    FreeLibrary(hInstLib);
    return 0;
}


--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
06.03.2003, 22:23 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


hehe
Grossmeister Uwe hat gesprochen ...
solche Codeschnipsel würde ich auch gerne mal im Kopf (bzw Platte) haben

Die Funktion ist manchmal echt praktisch
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: