const wxString wxProcessKiller::Name(int pid) { wxString str; str.Printf(_T("id=%d"),pid); #ifdef _DEBUG #ifdef _WIN32 if(VER_PLATFORM_WIN32_NT==GetPlatform() && hInstLib1){ static BOOL (WINAPI *lpfEnumProcessModules)( HANDLE, HMODULE *, DWORD, LPDWORD ) = (BOOL(WINAPI *)(HANDLE, HMODULE *, DWORD, LPDWORD)) GetProcAddress( (HINSTANCE) hInstLib1,"EnumProcessModules" ) ; static DWORD (WINAPI *lpfGetModuleFileNameEx)( HANDLE, HMODULE, LPTSTR, DWORD )= (DWORD (WINAPI *)(HANDLE, HMODULE,LPTSTR, DWORD )) GetProcAddress( (HINSTANCE) hInstLib1,"GetModuleFileNameExA" ) ; if( lpfEnumProcessModules && lpfGetModuleFileNameEx ) { HANDLE hProcess=::OpenProcess(PROCESS_ALL_ACCESS,false,pid); if(hProcess) { HMODULE hMod; DWORD dwSize; if(lpfEnumProcessModules( hProcess, &hMod, sizeof(HMODULE), &dwSize ) ){ // Get Full pathname: TCHAR buf[1+MAX_PATH]; lpfGetModuleFileNameEx( hProcess, hMod, buf, MAX_PATH); str+=_TCHAR(' '); str+=buf; } CloseHandle(hProcess); } } } #endif #endif return str; }
// // ウィンドウハンドルから、そのモジュールのフルパスを取得します。 // // パラメータ // hWnd // 調べるウィンドウのハンドル // lpszFileName // モジュールの完全修飾パスを受け取るバッファへのポインタ // nSize // 取得したい文字の最大の長さ // // 戻り値 // 正常にウィンドウを作成したモジュールのフルパス名が取得でき // たら TRUE が返ります。それ以外は FALSE が返ります。 // BOOL GetFileNameFromHwnd(HWND hWnd, LPTSTR lpszFileName, DWORD nSize) { BOOL bResult = FALSE; // ウィンドウを作成したプロセスの ID を取得 DWORD dwProcessId; GetWindowThreadProcessId(hWnd , &dwProcessId); // 現在実行している OS のバージョン情報を取得 OSVERSIONINFO osverinfo; osverinfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); if ( !GetVersionEx(&osverinfo) ) return FALSE; // プラットフォームが Windows NT/2000 の場合 if ( osverinfo.dwPlatformId == VER_PLATFORM_WIN32_NT ) { // PSAPI 関数のポインタ BOOL (WINAPI *lpfEnumProcessModules) (HANDLE, HMODULE*, DWORD, LPDWORD); DWORD (WINAPI *lpfGetModuleFileNameEx) (HANDLE, HMODULE, LPTSTR, DWORD); // PSAPI.DLL ライブラリをロード HINSTANCE hInstLib = LoadLibrary("PSAPI.DLL"); if ( hInstLib == NULL ) return FALSE ; // プロシージャのアドレスを取得 lpfEnumProcessModules = (BOOL(WINAPI *) (HANDLE, HMODULE *, DWORD, LPDWORD))GetProcAddress( hInstLib, "EnumProcessModules"); lpfGetModuleFileNameEx =(DWORD (WINAPI *) (HANDLE, HMODULE, LPTSTR, DWORD))GetProcAddress( hInstLib, "GetModuleFileNameExA"); if ( lpfEnumProcessModules && lpfGetModuleFileNameEx ) { // プロセスオブジェクトのハンドルを取得 HANDLE hProcess; hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwProcessId); if ( hProcess ) { // .EXE モジュールのハンドルを取得 HMODULE hModule; DWORD dwNeed; if (lpfEnumProcessModules(hProcess, &hModule, sizeof(hModule), &dwNeed)) { // モジュールハンドルからフルパス名を取得 if ( lpfGetModuleFileNameEx(hProcess, hModule, lpszFileName, nSize) ) bResult = TRUE; } // プロセスオブジェクトのハンドルをクローズ CloseHandle( hProcess ) ; } } // PSAPI.DLL ライブラリを開放 FreeLibrary( hInstLib ) ; } // プラットフォームが Windows 9x の場合 else if ( osverinfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS ) { // ToolHelp 関数ポインタ HANDLE (WINAPI *lpfCreateSnapshot)(DWORD, DWORD); BOOL (WINAPI *lpfProcess32First)(HANDLE, LPPROCESSENTRY32); BOOL (WINAPI *lpfProcess32Next)(HANDLE, LPPROCESSENTRY32); // プロシージャのアドレスを取得 lpfCreateSnapshot = (HANDLE(WINAPI*)(DWORD,DWORD))GetProcAddress( GetModuleHandle("kernel32.dll"), "CreateToolhelp32Snapshot" ); lpfProcess32First= (BOOL(WINAPI*)(HANDLE,LPPROCESSENTRY32))GetProcAddress( GetModuleHandle("kernel32.dll"), "Process32First" ); lpfProcess32Next= (BOOL(WINAPI*)(HANDLE,LPPROCESSENTRY32))GetProcAddress( GetModuleHandle("kernel32.dll"), "Process32Next" ); if ( !lpfCreateSnapshot || !lpfProcess32First || !lpfProcess32Next) return FALSE; // システム プロセスの Toolhelp スナップショットを作成 HANDLE hSnapshot; hSnapshot = lpfCreateSnapshot(TH32CS_SNAPPROCESS , 0); if (hSnapshot != (HANDLE)-1) { // 最初のプロセスに関する情報を取得 PROCESSENTRY32 pe; pe.dwSize = sizeof(PROCESSENTRY32); if ( lpfProcess32First(hSnapshot, &pe) ) { do { // 同じプロセスID であれば、ファイル名を取得 if (pe.th32ProcessID == dwProcessId) { lstrcpy(lpszFileName, pe.szExeFile); bResult = TRUE; break; } } while ( lpfProcess32Next(hSnapshot, &pe) ); } // スナップショットを破棄 CloseHandle(hSnapshot); } } else return FALSE; GetLongPathName(lpszFileName, lpszFileName, nSize); return bResult; }
BOOL CdllsDlg::OnInitDialog() { __super::OnInitDialog(); //AddAnchor(IDC_APP_ICON,TOP_LEFT); //AddAnchor(IDC_STATIC_VER,TOP_LEFT); //AddAnchor(IDC_STATIC_COPY,TOP_LEFT); //AddAnchor(IDB_SAVE,TOP_RIGHT); //AddAnchor(IDOK,TOP_RIGHT); AddAnchor(IDB_SAVE,TOP_LEFT); AddAnchor(IDCANCEL,TOP_RIGHT); AddAnchor(IDC_LVW,TOP_LEFT , BOTTOM_RIGHT); // TODO: Add extra initialization here HWND hwndListView =GetDlgItem(IDC_LVW)->m_hWnd; DWORD dwStyle = ListView_GetExtendedListViewStyle(hwndListView); dwStyle |= LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_HEADERDRAGDROP ; ListView_SetExtendedListViewStyle(hwndListView, dwStyle); LV_COLUMN lvColumn; lvColumn.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; lvColumn.fmt = LVCFMT_LEFT; lvColumn.cx = 300; lvColumn.pszText = _T("Module name"); ListView_InsertColumn (hwndListView, 0, &lvColumn); lvColumn.pszText = _T("version"); RECT rc; ::GetWindowRect(hwndListView,&rc); lvColumn.cx = 200/*(rc.right-rc.left)-300-20*/; ListView_InsertColumn (hwndListView, 1, &lvColumn); HANDLE pProcessHandle = NULL; pProcessHandle = GetCurrentProcess(); HMODULE hInstLib = LoadLibrary( _T("PSAPI.DLL") ) ; if (pProcessHandle != NULL&&hInstLib!=NULL) { HMODULE pLoadedModules[4096]; DWORD nLoadedBytes = 0; // Get array of loaded modules BOOL (WINAPI *lpfEnumProcessModules)( HANDLE, HMODULE *, DWORD, LPDWORD ); DWORD (WINAPI *lpfGetModuleFileNameEx)( HANDLE, HMODULE, LPTSTR, DWORD ); lpfEnumProcessModules = (BOOL(WINAPI *)(HANDLE, HMODULE *, DWORD, LPDWORD)) GetProcAddress( hInstLib, "EnumProcessModules" ) ; lpfGetModuleFileNameEx =(DWORD (WINAPI *)(HANDLE, HMODULE, LPTSTR, DWORD )) GetProcAddress( hInstLib, #ifdef _UNICODE "GetModuleFileNameExW" #else "GetModuleFileNameExA" #endif ) ; if (lpfEnumProcessModules(pProcessHandle, pLoadedModules, (DWORD)sizeof(pLoadedModules), &nLoadedBytes)) { // Compute effective number of modules int nNumberOfModules = nLoadedBytes/sizeof(HMODULE); // Loop on all modules for (int i=0; i<nNumberOfModules; i++) { // Fetch module file name TCHAR pFileName[_MAX_PATH]; pFileName[0]=0; CString cleanFileName; if (lpfGetModuleFileNameEx(pProcessHandle, pLoadedModules[i], pFileName, _MAX_PATH) > 0) { if(_tcslen(pFileName)>0&&_tcslen(pFileName)<ARRAY_SIZE(pFileName)) { CDLLVersion dll_ver(pFileName); LVITEM lvI; lvI.mask = LVIF_TEXT ; lvI.state = 0; lvI.stateMask = 0; lvI.iItem = i; lvI.iSubItem = 0; lvI.pszText = (pFileName); ListView_InsertItem(hwndListView, &lvI); LV_ITEM lv_sub; memset(&lv_sub,0,sizeof(LV_ITEM)); lv_sub.mask = LVIF_TEXT ; lv_sub.state = 0; lv_sub.stateMask = 0; lv_sub.iItem = i; lv_sub.iSubItem = 1; lv_sub.pszText = (LPTSTR)(LPCTSTR)dll_ver.GetFullVersion(); ListView_SetItem(hwndListView, &lv_sub); } } } } // Close process handle CloseHandle(pProcessHandle); } FreeLibrary(hInstLib); return TRUE; // return TRUE unless you set the focus to a control return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE }