Page 1 of 1

Get full Filename of running processes (solved)

Posted: Thu Jun 29, 2006 7:58 am
by Michael Vogel
Hi,

I'd like to write a "Shutdown" program for my USB memory stick, but before "ejecting" the stick I need to kill all programs, which have been started directly from the stick...

I found a program which lists all running processes, but I would need the information from which drive they have been started. How to do that?

What I tried, does not work:

Code: Select all

handle=FindWindow_(0,0)
handle=GetWindow_(handle,#GW_HWNDFIRST)

While handle<>0
	name.s = Space(128)
	GetWindowText_(handle,@name,127)
	
	path.s = Space(#MAX_PATH+1)
GetModuleFileName_(GetWindowLong_(handle,#GWL_HINSTANCE),@path,#MAX_PATH)
	Debug Hex(handle)+" - "+path
				
	If Len(name)
		;MessageBox_(0,name,"Information",#MB_ICONERROR| #MB_OK)
		Debug name+"."
		If killautohotkey
		If FindString(LCase(name),"autohotkey v",1)
			Debug ">> Autohotkey found"
			PostMessage_(handle, #WM_CLOSE, 0, 0)
			Debug ">> Autohotkey killed"
		EndIf
		EndIf
	EndIf
	handle=GetWindow_(handle,#GW_HWNDNEXT)
	
	
Wend

Posted: Thu Jun 29, 2006 8:44 am
by netmaestro
One simple way to do it would be to write a little shell for the stick that starts/shutsdown any programs on it. A popup menu running in the system tray, maybe. Anyway, the shell would always know what was running from the stick and when you pulled it out it would shut down those processes. It could even autostart selected programs from the stick upon sensing its presence.

Posted: Thu Jun 29, 2006 9:48 am
by Michael Vogel
Good idea, netmaestro, but my shell is also started from the stick and cannot be killed before the same shell program should eject the USB stick...

There is also a problem when I would start something "manually" and not from the shell.

What I did for now is to seperate the shell (the "runner") from a second program (the "killer") which copies itself automatically to the harddisk, so it can not lock the USB while running...

It must be possible to see the full path (e.g. http://www.teamcti.com/pview/PrcView_5_2_15.zip), but it seems that I do not get the right handle for the GetModuleFileName_() command...

Posted: Thu Jun 29, 2006 11:27 am
by xgp
This has already been posted here, i think by freak.
Anyway, here is a sample on how to get the process path from a window handle.
(Note: It won't run on 9x/Me, because they do not have the psapi.dll library)

Update: Read again your post and i think, this can do the job.

Code: Select all

Declare.s ProcessNameFromHwnd(hwnd)
Declare   CheckWindowsProcess(WndHwnd, p)


Global  USB_ROOT.s  = "F:\"   ;  the root of your USB stick

; assuming that all applications started on your USB stick have a window, we could enumerate all windows
; and send a #wm_close message to the ones that have started on your USB stick.

Procedure CheckWindowsProcess(WndHwnd, p)
  
  ; check if the first third caracters of the process path are the USB_ROOT.s
  Protected ProcessPath.s = ProcessNameFromHwnd(WndHwnd)
  Protected Caption.s = Space(255)
  
  
  If UCase(Mid(ProcessPath, 1, 3)) = UCase(USB_ROOT)
    
    GetWindowText_(WndHwnd, @Caption, 255)
    Debug "Title: " + Caption
    Debug "Path:  " + ProcessPath
    Debug "Hwnd:  " + Str(WndHwnd)
    Debug "---------------------------"
    
    ; here, as you already have the Window Handle, you could send the #wm_close message
    
  EndIf
  
  ProcedureReturn #True   ; return 1 to continue the enumeration
EndProcedure
Procedure.s ProcessNameFromHwnd(hwnd)
  
  Protected   ProcessID
  Protected   hProcess
  Protected   hModule
  Protected   ProcessName.s   =   Space(#MAX_PATH)
  Protected   EnumProcessModules
  Protected   GetModuleFileNameEx
  
  If  OpenLibrary(0, "psapi.dll")
    EnumProcessModules  =   GetFunction(0, "EnumProcessModules")
    GetModuleFileNameEx =   GetFunction(0, "GetModuleFileNameExA")
    
    GetWindowThreadProcessId_(hwnd, @ProcessID)
    hProcess    =   OpenProcess_(#PROCESS_QUERY_INFORMATION|#PROCESS_VM_READ, 0, ProcessID)
    
    CallFunctionFast(EnumProcessModules, hProcess, @hModule, 1, 0)
    CallFunctionFast(GetModuleFileNameEx, hProcess, hModule, @ProcessName, #MAX_PATH)
    
    CloseHandle_(hProcess)
    CloseLibrary(0)
  EndIf
  
  ProcedureReturn ProcessName
EndProcedure 


Debug "applications started on " + USB_ROOT
Debug "------------------------------------"
EnumWindows_(@CheckWindowsProcess(), 1)
Debug "------------------------------------"
Debug "end"
Hope this helps.

Posted: Thu Jun 29, 2006 1:08 pm
by Michael Vogel
Thanks xgp,
I didn't find that in the forum - that's exact what I need!

Re: Get full Filename of running processes (solved)

Posted: Sun Jul 02, 2006 3:22 am
by NoahPhense
How about my lib?

http://www.liquidbuzz.com/pb/libs/

- np