void CMainFrame::OnButtonSelectprocess() { CMFCRibbonButton* pButton = (CMFCRibbonButton*)m_wndRibbonBar.FindByID( ID_BUTTON_SELECTPROCESS ); CRect pos = pButton->GetRect( ); ClientToScreen( &pos ); CMenu menu; menu.CreatePopupMenu( ); ClearProcMenuItems( ); HANDLE ProcessList = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, NULL ); if (ProcessList != INVALID_HANDLE_VALUE) { PROCESSENTRY32 ProcInfo; ProcInfo.dwSize = sizeof( PROCESSENTRY32 ); BOOL rp = Process32First( ProcessList, &ProcInfo ); bool bSkip = false; while( rp == TRUE ) { // Are we filtering out processes if ( gbFilterProcesses ) { for ( int i = 0; i < sizeof( CommonProcesses ) / sizeof( CommonProcesses[0] ) ; i ++ ) { if ( strcmp( ProcInfo.szExeFile, CommonProcesses[i].c_str( ) ) == 0 ) { //printf( "True %s\n", ProcInfo.szExeFile ); bSkip = true; } } } if ( bSkip ) { bSkip = false; rp = Process32Next(ProcessList,&ProcInfo); continue; } HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS, false, ProcInfo.th32ProcessID ); if ( hProcess ) { if ( is64bit( hProcess ) ) { char filename[1024]; DWORD len = sizeof(filename); GetModuleFileNameEx(hProcess,NULL,filename,1024); SHFILEINFO sfi; SHGetFileInfo(filename,FILE_ATTRIBUTE_NORMAL,&sfi,sizeof(SHFILEINFO),SHGFI_ICON | SHGFI_USEFILEATTRIBUTES); CBitmap* pBitmap = new CBitmap; CProcessMenuInfo Item; Item.ProcessId = ProcInfo.th32ProcessID; Item.pBitmap = pBitmap; CClientDC clDC(this); CDC dc;dc.CreateCompatibleDC(&clDC); int cx = 16;int cy = 16; pBitmap->CreateCompatibleBitmap(&clDC,cx,cy); CBitmap* pOldBmp = dc.SelectObject(pBitmap); dc.FillSolidRect(0,0,cx,cy,GetSysColor(COLOR_3DFACE)); ::DrawIconEx(dc.GetSafeHdc(),0,0,sfi.hIcon,cx,cy,0,NULL,DI_NORMAL); dc.SelectObject( pOldBmp ); dc.DeleteDC(); DWORD MsgID = WM_PROCESSMENU + ProcMenuItems.size(); menu.AppendMenu( MF_STRING | MF_ENABLED, MsgID , ProcInfo.szExeFile ); menu.SetMenuItemBitmaps(MsgID, MF_BYCOMMAND,pBitmap,pBitmap); ProcMenuItems.push_back(Item); } CloseHandle(hProcess); } rp = Process32Next(ProcessList,&ProcInfo); } CloseHandle(ProcessList); } menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_HORNEGANIMATION,pos.left,pos.bottom,this); }
void CMainFrame::OnButtonSelectProcess() { HANDLE hProcess = 0; void* pBuffer = NULL; ULONG cbBuffer = 0x20000; HANDLE hHeap = NULL; NTSTATUS Status = STATUS_INFO_LENGTH_MISMATCH; bool bHasEnumeratedProcesses = false; PSYSTEM_PROCESS_INFORMATION infoP = NULL; CMFCRibbonButton* pButton = NULL; pButton = static_cast<CMFCRibbonButton*>(m_wndRibbonBar.FindByID(ID_BUTTON_SELECTPROCESS)); CRect pos = pButton->GetRect(); ClientToScreen(&pos); CMenu menu; menu.CreatePopupMenu(); ClearProcMenuItems(); static HMODULE hNtdll = (HMODULE)Utils::GetLocalModuleHandle("ntdll.dll"); static tNtQuerySystemInformation fnQSI = (tNtQuerySystemInformation)Utils::GetProcAddress(hNtdll, "NtQuerySystemInformation"); hHeap = GetProcessHeap(); Status = STATUS_INFO_LENGTH_MISMATCH; while (!bHasEnumeratedProcesses) { pBuffer = HeapAlloc(hHeap, HEAP_ZERO_MEMORY, cbBuffer); if (pBuffer == NULL) return; Status = fnQSI(SystemProcessInformation, pBuffer, cbBuffer, &cbBuffer); if (Status == STATUS_INFO_LENGTH_MISMATCH) { HeapFree(hHeap, NULL, pBuffer); cbBuffer *= 2; } else if (!NT_SUCCESS(Status)) { HeapFree(hHeap, NULL, pBuffer); return; } else { bHasEnumeratedProcesses = true; infoP = (PSYSTEM_PROCESS_INFORMATION)pBuffer; while (infoP) { if (infoP->ImageName.Length) { char pName[256]; memset(pName, 0, sizeof(pName)); WideCharToMultiByte(0, 0, infoP->ImageName.Buffer, infoP->ImageName.Length, pName, 256, NULL, NULL); // Are we filtering out processes if (gbFilterProcesses) { bool skip = false; for (int i = 0; i < sizeof(CommonProcesses) / sizeof(*CommonProcesses); i++) { if ( _stricmp( pName, CommonProcesses[ i ] ) == 0 || (DWORD)infoP->UniqueProcessId == GetCurrentProcessId( ) ) { skip = true; break; } } if (skip) { if (!infoP->NextEntryOffset) break; infoP = (PSYSTEM_PROCESS_INFORMATION)((unsigned char*)infoP + infoP->NextEntryOffset); continue; } } hProcess = OpenProcess(PROCESS_CREATE_THREAD | PROCESS_QUERY_INFORMATION | PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_VM_READ, FALSE, (DWORD)infoP->UniqueProcessId); if (hProcess) { #ifdef _WIN64 if (Utils::GetProcessPlatform(hProcess) == Utils::ProcessPlatformX64) #else if (Utils::GetProcessPlatform(hProcess) == Utils::ProcessPlatformX86) #endif { TCHAR filename[1024]; GetModuleFileNameEx(hProcess, NULL, filename, 1024); SHFILEINFO sfi; SHGetFileInfo(filename, FILE_ATTRIBUTE_NORMAL, &sfi, sizeof(SHFILEINFO), SHGFI_ICON | SHGFI_USEFILEATTRIBUTES); CBitmap* pBitmap = new CBitmap(); CProcessMenuInfo Item; Item.ProcessId = (DWORD)infoP->UniqueProcessId; Item.pBitmap = pBitmap; CClientDC clDC(this); CDC dc; dc.CreateCompatibleDC(&clDC); int size = 16; pBitmap->CreateCompatibleBitmap(&clDC, size, size); CBitmap* pOldBmp = dc.SelectObject(pBitmap); dc.FillSolidRect(0, 0, size, size, GetSysColor(COLOR_3DFACE)); ::DrawIconEx(dc.GetSafeHdc(), 0, 0, sfi.hIcon, size, size, 0, NULL, DI_NORMAL); dc.SelectObject(pOldBmp); dc.DeleteDC(); DWORD MsgID = (DWORD)(WM_PROCESSMENU + ProcMenuItems.size()); CString proccessString; proccessString.Format(_T("%hs (%i)"), pName, (DWORD)infoP->UniqueProcessId); menu.AppendMenu(MF_STRING | MF_ENABLED, MsgID, proccessString.GetBuffer()); menu.SetMenuItemBitmaps(MsgID, MF_BYCOMMAND, pBitmap, pBitmap); ProcMenuItems.push_back(Item); } CloseHandle(hProcess); } } if (!infoP->NextEntryOffset) break; infoP = (PSYSTEM_PROCESS_INFORMATION)((unsigned char*)infoP + infoP->NextEntryOffset); } } } menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_HORNEGANIMATION, pos.left, pos.bottom, this); return; }