【HSP3】プロセス(全スレッド)を一時停止するモジュール

プロセス名とPIDのどちらでも指定して一時停止が可能です。昔作ったのですので不具合があるかもしれません。

プロセス名とPIDのどちらでも指定して一時停止が可能です。昔作ったのですので不具合があるかもしれません。

#include "kernel32.as"
#include "user32.as"

#define global STANDARD_RIGHTS_REQUIRED 0x000f0000
#define global SYNCHRONIZE 0x00100000
#define global THREAD_TERMINATE 0x0001
#define global THREAD_SUSPEND_RESUME 0x0002
#define global THREAD_GET_CONTEXT 0x0008
#define global THREAD_SET_CONTEXT 0x0010
#define global THREAD_SET_INFORMATION 0x0020
#define global THREAD_QUERY_INFORMATION 0x0040
#define global THREAD_SET_THREAD_TOKEN 0x0080
#define global THREAD_IMPERSONATE 0x0100
#define global THREAD_DIRECT_IMPERSONATION 0x0200
#define global THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3ff)
#define global TH32CS_SNAPPROCESS 0x02
#define global TH32CS_SNAPTHREAD 0x04

#module _processkill_
#deffunc _init
	Count = 0
return
#defcfunc CountCheck
return Count
#deffunc PIDPauseResume int pid,int flag
	
	CreateToolhelp32Snapshot TH32CS_SNAPTHREAD,pid
	hThreadSnap = stat
	
	// エラー発生(INVALID_HANDLE_VALUE)
	if hThreadSnap = 0xFFFFFFFF : return -1

	dim th32,7 : th32.0 = length(th32) * 4
	Thread32First hThreadSnap,varptr(th32)

	repeat
	
		if th32.3 = pid {
			OpenThread 0x0002, 0, th32.2
			hThread = stat
			if hThread!=0{
				if flag = 0{
					// 休止
					repeat
						SuspendThread hThread
						if (stat != 0){
							break
						}
					loop
				}else{
					// 再開
					repeat
						ResumeThread hThread
						if ((stat = 1)| (stat = 0)){
							break
						}
					loop
				}
				CloseHandle hThread
			}
			
		}

		dim th32,7 : th32.0 = length(th32) * 4
		Thread32Next hThreadSnap,varptr(th32)
		if stat = 0 : break
		
	loop
	if flag = 0 : Count++ : else : Count--
	
return Count
#deffunc ProcessPauseResume str fname,int flg
	// スナップショット作成
	CreateToolhelp32Snapshot TH32CS_SNAPPROCESS,0
	hProcessSnap = stat

	dim pe32 , 9 + (260/4) 
	pe32.0 = length(pe32) * 4
	Process32First hProcessSnap,varptr(pe32)

	;mes "PID:"+pe32.2
	if pe32.9!=0{
		sdim filename,261
		memcpy filename,pe32.9,260,0,0
		;mes filename
	}
	
	repeat
	
		dim pe32 , 9 + (260/4) 
		pe32.0 = length(pe32) * 4
		Process32Next hProcessSnap,varptr(pe32)
		if stat = 0 : break
	
		;mes "PID:"+pe32.2
		if pe32.9!=0{
			sdim filename,261
			memcpy filename,pe32.9,260,0,0
			;mes filename
			// 小文字に変換
			filename = getpath(filename,16)
			if instr(filename,0,fname)!=-1 : PIDPauseResume pe32.2,flg
		}
	
	loop
return
#global
_init

	// サンプル
	ProcessPauseResume "chrome.exe", 0
	dialog "OKを押すと復活します"
	ProcessPauseResume "chrome.exe", 1

	// PIDが分かっている場合はこっち
	;PIDPauseResume pid, 0