#Define SW_HIDE 0 #Define SW_SHOWNORMAL 1 #Define SW_SHOWMINIMIZED 2 #Define SW_SHOWMAXIMIZED 3 #Define TH32CS_SNAPHEAPLIST 0x00000001 #Define TH32CS_SNAPPROCESS 0x00000002 #Define TH32CS_SNAPTHREAD 0x00000004 #Define TH32CS_SNAPMODULE 0x00000008 #Define TH32CS_SNAPALL 0x0000000F #Define TH32CS_INHERIT 0x80000000 #Define MAX_MODULE_NAME32 255 #Define MAX_PATH 260 #Define SIZEOF_PE32 296 #Define SIZEOF_ME32 548 #Define WM_CLOSE 0x0010 #Define WM_QUERYENDSESSION 0x0011 #Define WM_QUIT 0x0012 o = CREATEOBJECT('AppsManager') o.KillModule("tlp_reminder.exe") &&& Kill the exe Define Class AppsManager As Session DataSession = 2 Dimension arrDLLs[1] Me32Structure = '' Pe32Structure = '' ProcListCursor = Sys(2015) ModuleListCursor = Sys(2015) AppsListCursor = Sys(2015) Procedure Init Local Array arrDLLs[1] Adlls(arrDLLs) && Save defined DLLs Acopy(arrDLLs,This.arrDLLs) This.InitDLLs() && Declare DLLs This.Me32Structure = This.Int2Str(SIZEOF_ME32) + ; Replicate(Chr(0), SIZEOF_ME32-4) This.Pe32Structure = This.Int2Str(SIZEOF_PE32) + ; Replicate(Chr(0), SIZEOF_PE32-4) This.CreateCursors() Endproc Procedure CreateCursors Create Cursor (This.ModuleListCursor) ; (ProcessID i, szModule m, szExeFile m) Create Cursor (This.ProcListCursor) ; (ProcessID i,; cntThreads i,; parentPID i,; szExeFile m) Create Cursor (This.AppsListCursor) ; (wHwnd i,Pid i, Tid i,ClassName c(100),WCaption c(200)) Endproc Procedure RemoveCursors Use In (This.ModuleListCursor) Use In (This.ProcListCursor) Use In (This.AppsListCursor) Endproc Procedure GetModulesRunning Lparameters tcCursorName tcCursorName = Iif(Empty(m.tcCursorName),'Modules',m.tcCursorName) This.GetProcessList() Select pl.ProcessID, pl.cntThreads, pl.parentPID, ; Nvl(ml.szModule,pl.szExeFile) As 'ModuleName', ; Nvl(ml.szExeFile,'') As exename ; from (This.ProcListCursor) pl ; left Join (This.ModuleListCursor) ml On pl.ProcessID = ml.ProcessID ; into Cursor (m.tcCursorName) ; nofilter Endproc Procedure InitDLLs && Declare DLLs Declare Sleep In WIN32API Integer dwMillis Declare Integer GetActiveWindow In Win32API Declare short IsWindowVisible In WIN32API Integer HWnd Declare Integer GetWindow In Win32API; INTEGER HWnd, Integer dflag Declare Integer GetWindowText In Win32API ; INTEGER HWnd, String @lptstr, Integer cbmax Declare Integer GetClassName In WIN32API ; Integer HWnd, String @cClass, Integer nMaxBuffer Declare Integer GetWindowThreadProcessId In win32API ; Integer HWnd, Integer @lpdwProcessId Declare Integer CloseHandle In win32API Integer hObject Declare Integer CreateToolhelp32Snapshot In win32API ; INTEGER dwFlags, Integer th32ProcessID Declare Integer Process32First In win32API ; INTEGER hSnapshot, String @ lppe Declare Integer Process32Next In win32API ; INTEGER hSnapshot, String @ lppe Declare Integer Module32First In win32API ; INTEGER hSnapshot, String @ lpme Declare Integer Module32Next In win32API ; INTEGER hSnapshot, String @ lpme Declare RtlMoveMemory In WIN32API ; INTEGER @DestNumeric, ; STRING @pVoidSource, ; INTEGER nLength Declare Integer OpenProcess In Win32API ; integer dwDesiredAccess, Integer bInheritHandle, Integer dwProcessID Declare Integer TerminateProcess In Win32API ; integer hProcess, Integer uExitCode Endproc Procedure Destroy Local lnDLLs Local Array arrDLLs[1] lnDLLs = Adlls(arrDLLs) && Get current DLLs For ix=1 To m.lnDLLs If Empty(This.arrDLLs) Or ; Ascan(This.arrDLLs,arrDLLs[m.ix,2],1,-1,2,1+2+4+8) = 0 Clear Dlls &arrDLLs[m.ix,2] Endif Endfor This.RemoveCursors() Endproc Procedure GetProcessModule Lparameters tnPID Local hModuleSnap, me32 hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, m.tnPID) If hModuleSnap < 0 Return .F. Endif me32 = This.Me32Structure lSuccess = ( Module32First(hModuleSnap, @me32) # 0) This.MODULEENTRY32_ToCursor(m.me32) CloseHandle (hModuleSnap) Endproc Function GetProcessList Local hProcessSnap, pe32, lSuccess hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0) pe32 = This.Pe32Structure * Walk the snapshot of the processes * and for each process, get module info lSuccess = ( Process32First(hProcessSnap, @pe32) # 0 ) Do While m.lSuccess m.th32ProcessID = This.PROCESSENTRY32_ToCursor(m.pe32) This.GetProcessModule(m.th32ProcessID) lSuccess = ( Process32Next(hProcessSnap, @pe32) # 0) Enddo CloseHandle (m.hProcessSnap) Endproc Procedure MODULEENTRY32_ToCursor Lparameters tcBuffer Local ProcessID, szModule, szExeFile With This m.ProcessID = .Substr2Num(m.tcBuffer,9,4) m.tcBuffer = Substr(m.tcBuffer,33) m.szModule = Left(m.tcBuffer,At(Chr(0),m.tcBuffer)-1) m.tcBuffer = Substr(m.tcBuffer,256+1) m.szExeFile = Left(m.tcBuffer,At(Chr(0),m.tcBuffer)-1) Insert Into (.ModuleListCursor) ; (ProcessID,szModule,szExeFile) Values ; (m.ProcessID,m.szModule,m.szExeFile) Endwith Endproc Procedure PROCESSENTRY32_ToCursor Lparameters tcBuffer Local ProcessID, cntThreads, parentPID, szExeFile With This m.ProcessID = .Substr2Num(m.tcBuffer,9,4) m.cntThreads = .Substr2Num(m.tcBuffer,21,4) m.parentPID = .Substr2Num(m.tcBuffer,25,4) m.tcBuffer = Substr(m.tcBuffer,37) m.szExeFile = Left(m.tcBuffer,At(Chr(0),m.tcBuffer)-1) Insert Into (.ProcListCursor) ; (ProcessID, cntThreads, parentPID, szExeFile) ; values ; (m.ProcessID, m.cntThreads, m.parentPID, m.szExeFile) Endwith Return m.ProcessID Endproc Procedure Substr2Num Lparameters tcStr, tnStart, tnSize Return This.Str2Num(Substr(m.tcStr, m.tnStart, m.tnSize), m.tnSize) Endproc Procedure Str2Num Lparameters tcStr,tnSize Local m.lnValue m.lnValue=0 RtlMoveMemory(@lnValue, m.tcStr, m.tnSize) Return m.lnValue Endproc Procedure Int2Str Lparameters tnValue, tnSize Local ix, lcReturn m.tnSize = Iif(Empty(m.tnSize),4,m.tnSize) lcReturn = '' For ix=1 To m.tnSize m.lcReturn = m.lcReturn + ; Chr(Bitand(Bitrshift(m.tnValue, (m.ix-1)*8),0xFF)) Endfor Return m.lcReturn Endproc Procedure KillModule(tcModuleName) Local Array aProcessID[1] This.GetModulesRunning("modulelist") Select ProcessID From moduleList ; WHERE Upper(ModuleName) == Upper(m.tcModuleName) ; INTO Array aProcessID If Used('ModuleList') Use In 'ModuleList' Endif If (_Tally > 0) Return TerminateProcess(OpenProcess(1, 1, aProcessID), 0) > 0 Endif Endproc Enddefine