#include #include $LIBRARY $LIBRARY TYPE PROCLIST count% name$[1024] pid%[1024] path$[1024] priority%[1024] END TYPE 'DOES PROCESS EXIST/RETURN PID OF FIRST FOUND IF FOUND 0 FOR NOT $COMMENT DIM PID[1024] AS CHAR PID$ = "notepad" MSGBOX STR$(ProcessExists(PID$)), "HERE NOW" $COMMENT 'RETURN A LIST OF ALL FUNCTIONS/ 0 RETURNED IF FAILED $COMMENT DIM tPL AS PROCLIST ProcessList(&tPL, "") FOR INTEGER iCC = 0 TO (tPL.count - 1) Print "+++++" & CRLF$ & _ "[" & (iCC) & " ] = " & tPL.name$[iCC] & CRLF$ & _ "PID:" & str$(tPL.pid[iCC]) & CRLF$ & _ "PATH: " & tPL.path$[iCC] & CRLF$ & _ "PRIORITY:" & str$(tPL.priority[iCC]) NEXT iCC PRINT "Total processes received: " & (tPL.count) $COMMENT 'CLOSE ALL PROCESSES BY NAME, OR 1 PROCESS BY STRING PID $COMMENT ProcessClose("NOTEPAD") $COMMENT FUNCTION ProcessWait OPTIONAL(szProcess[] AS CHAR, nTimeOut = 0) IF (nTimeOut > 0) THEN nTimeOut = nTimeOut * 1000 END FUNCTION FUNCTION ProcessList OPTIONAL(BYREF taPL AS PROCLIST, szProcessName$ = "") IF szProcessName$ = "" THEN FUNCTION = smk_ProcessListHandler(&taPL) LOCAL nRValue AS INTEGER LOCAL tTmpPL AS PROCLIST LOCAL nCountMatch AS INTEGER LOCAL szDriveN[MAX_PATH+1] AS CHAR LOCAL szDirN[MAX_PATH+1] AS CHAR LOCAL szFileN[MAX_PATH+1] AS CHAR LOCAL szExtN[MAX_PATH+1] AS CHAR LOCAL szDriveO[MAX_PATH+1] AS CHAR LOCAL szDirO[MAX_PATH+1] AS CHAR LOCAL szFileO[MAX_PATH+1] AS CHAR LOCAL szExtO[MAX_PATH+1] AS CHAR tTmpPL = taPL nRValue = smk_ProcessListHandler(&tTmpPL) IF nRValue = 0 THEN FUNCTION = 0 'Are we looking for all instances of 1 Process, or all of them _splitpath(szProcessName, szDriveN, szDirN, szFileN, szExtN) FOR INTEGER i = 0 TO tTmpPL.count - 1 _splitpath(tTmpPL.name$[i], szDriveO, szDirO, szFileO, szExtO) IF (StrCmpI(szFileO, szFileN) = 0) THEN taPL.name$[nCountMatch] = tTmpPL.name[i] taPL.pid[nCountMatch] = tTmpPL.pid[i] taPL.path$[nCountMatch] = tTmpPL.path[i] taPL.priority[nCountMatch] = tTmpPL.priority[i] nCountMatch++ ENDIF NEXT i taPL.count = nCountMatch IF nCountMatch > 0 THEN FUNCTION = 1 FUNCTION = 0 END FUNCTION FUNCTION ProcessExists(szProcessName AS CHAR PTR) IF szProcessName$ = "" THEN FUNCTION = 0 LOCAL taPL AS PROCLIST LOCAL nTemp AS INTEGER LOCAL nRValue AS INTEGER LOCAL nCountMatch AS INTEGER LOCAL szDriveN[MAX_PATH+1] AS CHAR LOCAL szDirN[MAX_PATH+1] AS CHAR LOCAL szFileN[MAX_PATH+1] AS CHAR LOCAL szExtN[MAX_PATH+1] AS CHAR LOCAL szDriveO[MAX_PATH+1] AS CHAR LOCAL szDirO[MAX_PATH+1] AS CHAR LOCAL szFileO[MAX_PATH+1] AS CHAR LOCAL szExtO[MAX_PATH+1] AS CHAR _splitpath(szProcessName, szDriveN, szDirN, szFileN, szExtN) 'Incase a PID is sent instead of the exe name to find. nTemp = (INT)atoi(szFileN) nRValue = smk_ProcessListHandler(&taPL) IF nRValue = 0 THEN FUNCTION = 0 FOR INTEGER i = 0 TO taPL.count - 1 _splitpath(taPL.name$[i], szDriveO, szDirO, szFileO, szExtO) 'Does the atoi value match the PID IF nTemp = taPL.pid[i] THEN 'If atoi value matches, no extension 'And file+ext of name$ match szProcessName IF (szExtN$ <> "") && _ (StrCmpI(szFileO, szFileN) = 0) THEN FUNCTION = taPL.pid[i] IF (szExtN$ = "") THEN FUNCTION = taPL.pid[i] ENDIF IF (StrCmpI(szFileO, szFileN) = 0) THEN FUNCTION = taPL.pid[i] NEXT i FUNCTION = 0 END FUNCTION FUNCTION ProcessClose(szProcessName$) LOCAL taPL AS PROCLIST LOCAL nRValue AS INTEGER LOCAL nCountMatch AS INTEGER LOCAL nTemp AS INTEGER LOCAL hProcess AS HANDLE LOCAL szDriveN[MAX_PATH+1] AS CHAR LOCAL szDirN[MAX_PATH+1] AS CHAR LOCAL szFileN[MAX_PATH+1] AS CHAR LOCAL szExtN[MAX_PATH+1] AS CHAR LOCAL szDriveO[MAX_PATH+1] AS CHAR LOCAL szDirO[MAX_PATH+1] AS CHAR LOCAL szFileO[MAX_PATH+1] AS CHAR LOCAL szExtO[MAX_PATH+1] AS CHAR _splitpath(szProcessName, szDriveN, szDirN, szFileN, szExtN) 'Incase a PID is sent instead of the exe name to find. nTemp = (INT)atoi(szFileN) 'Set to - 1 if not a PID so we don't attempt to close the system PID IF nTemp = 0 THEN nTemp = -1 nRValue = smk_ProcessListHandler(&taPL) IF nRValue = 0 THEN FUNCTION = 0 FOR INTEGER i = 0 TO taPL.count - 1 _splitpath(taPL.name$[i], szDriveO, szDirO, szFileO, szExtO) 'Does the atoi value match the PID IF nTemp = taPL.pid[i] THEN 'If atoi value matches, no extension 'And file+ext of name$ match szProcessName IF (szExtN$ <> "") && (StrCmpI(szFileO, szFileN) = 0) THEN hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, taPL.pid[i]) IF (hProcess = 0) THEN ProcessSetPrivilege() hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, taPL.pid[i]) ENDIF IF (hProcess) THEN IF TerminateProcess(hProcess, 0) THEN CloseHandle(hProcess) FUNCTION = 1 ENDIF ENDIF FUNCTION = 0 'If atoi matches and there is no extension, try to close it 'If close fails, then we assume the atoi match failed, continue loop ELSEIF (szExtN$ = "") THEN hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, taPL.pid[i]) IF (hProcess = 0) THEN ProcessSetPrivilege() hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, taPL.pid[i]) ENDIF IF (hProcess) THEN IF TerminateProcess(hProcess, 0) THEN CloseHandle(hProcess) FUNCTION = 1 ENDIF ENDIF ENDIF ENDIF 'Do we have a file name match (assumes no PID was sent as param) IF (StrCmpI(szFileO, szFileN) = 0) THEN hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, taPL.pid[i]) IF (hProcess = 0) THEN ProcessSetPrivilege() hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, taPL.pid[i]) ENDIF IF (hProcess) THEN IF TerminateProcess(hProcess, 0) THEN CloseHandle(hProcess) ELSE CloseHandle(hProcess) FUNCTION = 0 ENDIF ENDIF ENDIF NEXT i FUNCTION = 1 END FUNCTION FUNCTION smk_ProcessListHandler(BYREF taPL AS PROCLIST) LOCAL aPList[1024] AS DWORD LOCAL cbNeeded AS DWORD 'LOCAL szProcessName[MAX_PATH+1] AS TCHAR LOCAL hProcess AS HANDLE LOCAL hMod AS HMODULE LOCAL ncbNeeded AS DWORD LOCAL szProcessPath[MAX_PATH+1] AS TCHAR LOCAL nCountProcesses AS INTEGER LOCAL szDrive[MAX_PATH+1] AS CHAR LOCAL szDir[MAX_PATH+1] AS CHAR LOCAL szFile[MAX_PATH+1] AS CHAR LOCAL szExt[MAX_PATH+1] AS CHAR 'Get all the ProcessId's IF EnumProcesses(aPList, sizeof(aPList), &cbNeeded) = 0 THEN FUNCTION = 0 taPL.count = (cbNeeded / sizeof(DWORD)) - 1 FOR INTEGER i = 0 TO taPL.count 'Get the Process Handle from the PID hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | _ PROCESS_VM_READ, FALSE, aPList[i]) 'If we don't have the right permissions to read or query set below IF hProcess = 0 THEN ProcessSetPrivilege() hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | _ PROCESS_VM_READ, FALSE, aPList[i]) ENDIF 'Get an array of all the open modules for the process 'Will make an exception for 64 bit OS later on (doubt 95/98/ME added) EnumProcessModules(hProcess, &hMod, sizeof(hMod), &ncbNeeded) 'Pass the module array to get the ansi file name 'GetModuleBaseNameA(hProcess, hMod, szProcessName, (DWORD)261) 'Pass the module array to get the ansi file path '(may look at _splitpath for later for basename) GetModuleFileNameExA(hProcess, hMod, szProcessPath, (DWORD)261) _splitpath(szProcessPath, szDrive, szDir, szFile, szExt) strcat(szFile, szExt) taPL.name$[nCountProcesses] = szFile taPL.pid[nCountProcesses] = (int)aPList[i] taPL.path$[nCountProcesses] = szProcessPath$ taPL.priority[nCountProcesses] = (int)GetPriorityClass(hProcess) nCountProcesses++ CloseHandle(hProcess) NEXT i taPL.count = nCountProcesses FUNCTION = 1 END FUNCTION FUNCTION ProcessSetPrivilege OPTIONAL(lpszPrivilege AS LPCTSTR = SE_DEBUG_NAME, _ bEnablePrivilege AS BOOL = 1) AS BOOL LOCAL tp AS TOKEN_PRIVILEGES LOCAL luid AS LUID LOCAL hToken AS HANDLE LOCAL hProcess AS HANDLE 'Get the current processes thread handle hProcess = GetCurrentProcess() 'Make sure we at least have query rights and open the token for adjusting IF OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES , &hToken) = 0 THEN CloseHandle(hToken) FUNCTION = 0 ENDIF 'If we don't have the rights we need return false IF LookupPrivilegeValue(NULL, lpszPrivilege, &luid) = 0 THEN CloseHandle(hToken) FUNCTION = 0 ENDIF tp.PrivilegeCount = 1 tp.Privileges[0].Luid = luid IF (bEnablePrivilege) THEN tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED ELSE tp.Privileges[0].Attributes = 0 ENDIF 'Add the lpszPrivilege request (in this case default is debug) IF AdjustTokenPrivileges(hToken, 0, &tp, SIZEOF(TOKEN_PRIVILEGES), _ (PTOKEN_PRIVILEGES)NULL, (PDWORD)NULL) = 0 THEN CloseHandle(hToken) FUNCTION = 0 ENDIF 'If for some reason we were not granted rights, return false IF (GetLastError() = ERROR_NOT_ALL_ASSIGNED) THEN CloseHandle(hToken) FUNCTION = 0 ENDIF CloseHandle(hToken) FUNCTION = 1 END FUNCTION