//////////////////////////////////////////////////////////////
//定義
#define TITLENAME "モジュール取得 サンプル"
//////////////////////////////////////////////////////////////
//関数の登録
#uselib "kernel32.dll"
#func CreateToolhelp32Snapshot "CreateToolhelp32Snapshot" int,int
#func Module32First "Module32First" int , sptr
#func Module32Next "Module32Next" int , sptr
#func Process32First "Process32First" int , sptr
#func Process32Next "Process32Next" int , sptr
#func CloseHandle "CloseHandle" int
#uselib "user32.dll"
#func GetWindowLongA "GetWindowLongA" int,int
#func SetWindowLongA "SetWindowLongA" int,int,int
#func SetWindowPos "SetWindowPos" int,int,int,int,int,int,int
#func MoveWindow "MoveWindow" int,int,int,int,int,int
//////////////////////////////////////////////////////////////
//変数
dim er
dim lb1
dim lb2
sdim lbdata , 1024
sdim data , 260
sdim mbdata , 1024
dim hpsnap
dim hmsnap
dim p_entry, 74
dim p_id , 64
dim m_entry, 137
//////////////////////////////////////////////////////////////
//ウィンドウをサイズ変更可能にする
screen 0 , ginfo_dispx , ginfo_dispy
cls 1
title TITLENAME
width 300 , 300
GetWindowLongA hwnd , -16
SetWindowLongA hwnd , -16 , stat | 0x50000
SetWindowPos hwnd,0,0,0,0,0,0x23
//////////////////////////////////////////////////////////////
//オブジェクト配置
objsize 300 , 20
pos 0 , 0 : button "プロセスの更新" , *p_reload
objsize ginfo_winx , 110
pos 0 , 20: listbox lb1 , 10 , lbdata
pos 0 , 130: mesbox mbdata , ginfo_winx , ginfo_winy-130
//////////////////////////////////////////////////////////////
// スナップショット作成
//#func CreateToolhelp32Snapshot "CreateToolhelp32Snapshot" int,int
// 戻り値にスナップショットのハンドル
//
// 第一引数
// 「TH32CS_INHERIT:(0x80000000)」スナップショットのハンドルを継承
// 「TH32CS_SNAPALL:(0x0f)」以下4つをあわせたもの
// 「TH32CS_SNAPHEAPLIST:(0x01)」指定したプロセスのヒープリストを含む
// 「TH32CS_SNAPMODULE:(0x08)」指定したプロセスのモジュールリストを含む
// 「TH32CS_SNAPPROCESS(0x02)」プロセスリストを含む
// 「TH32CS_SNAPTHREAD(0x04)」スレッドリストを含む
// 第二引数
// プロセス識別子を指定(TH32CS_SNAPMODULEを指定した時のみ)
// 0を指定すると現在のプロセスになる
/* p_entry & m_entry構造体
typedef struct tagPROCESSENTRY32
{
DWORD dwSize;
DWORD cntUsage;
DWORD th32ProcessID; // this process
ULONG_PTR th32DefaultHeapID;
DWORD th32ModuleID; // associated exe
DWORD cntThreads;
DWORD th32ParentProcessID; // this process's parent process
LONG pcPriClassBase; // Base priority of process's threads
DWORD dwFlags;
CHAR szExeFile[MAX_PATH]; // Path
} PROCESSENTRY32;
typedef struct tagMODULEENTRY32
{
DWORD dwSize;
DWORD th32ModuleID; // This module
DWORD th32ProcessID; // owning process
DWORD GlblcntUsage; // Global usage count on the module
DWORD ProccntUsage; // Module usage count in th32ProcessID's context
BYTE * modBaseAddr; // Base address of module in th32ProcessID's context
DWORD modBaseSize; // Size in bytes of module starting at modBaseAddr
HMODULE hModule; // The hModule of this module in th32ProcessID's context
char szModule[MAX_MODULE_NAME32 + 1];
char szExePath[MAX_PATH];
} MODULEENTRY32;
*/
//プロセスの取得
gosub *get_process
//////////////////////////////////////////////////////////////
//メッセージ割り込み
oncmd gosub *WM_SIZE , 0x0005
oncmd gosub *WM_CLOSE , 0x0010
//////////////////////////////////////////////////////////////
//メインループ
*main
if lb1 != lb2{
gosub *get_module
lb2 = lb1
}
wait 10
goto *main
//////////////////////////////////////////////////////////////
//モジュール取得
*p_reload
gosub *get_process
goto *main
//////////////////////////////////////////////////////////////
//プロセスの取得
*get_process
CreateToolhelp32Snapshot 0x0f , 0
hpsnap = stat
if hpsnap==-1 : dialog "CreateToolhelp32Snapshot error" : stop
dim p_id , 64
lbdata="" : notesel lbdata
p_entry(0) = 296
Process32First hpsnap , varptr(p_entry)
er = stat
repeat -1
if er == 0 : break
getstr data , p_entry , 36 , '\0'
noteadd data , -1
p_id(cnt) = p_entry(2)
Process32Next hpsnap , varptr(p_entry)
er = stat
loop
objprm 1 , lbdata
objprm 1 , 0
CloseHandle hpsnap
return
//////////////////////////////////////////////////////////////
//モジュールの取得
*get_module
CreateToolhelp32Snapshot 0x0f , p_id(lb1)
hmsnap = stat
if hmsnap==-1{
title TITLENAME +" : error"
objprm 2 , ""
return
}
notesel lbdata : noteget data , lb1
title TITLENAME+" : "+data
mbdata = "" : notesel mbdata
m_entry(0) = 548
Module32First hmsnap , varptr(m_entry) : er = stat
repeat -1
if er == 0 : break
getstr data , m_entry , 288 , '\0'
noteadd data , -1
Module32Next hmsnap , varptr(m_entry) : er = stat
loop
objprm 2 , mbdata
CloseHandle hmsnap
return
//////////////////////////////////////////////////////////////
//ウィンドウサイズ変更
*WM_SIZE
MoveWindow objinfo(0,2) , 0 , 0 , ginfo_winx , 20 , 1
MoveWindow objinfo(1,2) , 0 , 20 , ginfo_winx , 110 , 1
MoveWindow objinfo(2,2) , 0 , 130 , ginfo_winx , ginfo_winy-130 , 1
return
//////////////////////////////////////////////////////////////
//終了
*WM_CLOSE
if hsnap!=0 : CloseHandle hpsnap
return
|