/*! * \param pParent */ AttachToProcessDialog::AttachToProcessDialog(QWidget *pParent) : QDialog(pParent) { setWindowTitle(QString(Helper::applicationName).append(" - ").append(Helper::attachToRunningProcess)); setAttribute(Qt::WA_DeleteOnClose); resize(500, 400); // attach to process id mpAttachToProcessIDLabel = new Label(tr("Attach to Process ID:")); mpAttachToProcessIDTextBox = new QLineEdit; // filter mpFilterProcessesTextBox = new QLineEdit; mpFilterProcessesTextBox->setPlaceholderText(tr("Filter Processes")); // processes tree view model & proxy mpProcessListModel = new ProcessListModel; mProcessListFilterModel.setSourceModel(mpProcessListModel); mProcessListFilterModel.setFilterRegExp(mpFilterProcessesTextBox->text()); // processes tree view mpProcessesTreeView = new QTreeView; mpProcessesTreeView->setItemDelegate(new ItemDelegate(mpProcessesTreeView)); mpProcessesTreeView->setModel(&mProcessListFilterModel); mpProcessesTreeView->setTextElideMode(Qt::ElideMiddle); mpProcessesTreeView->setIndentation(0); mpProcessesTreeView->setSelectionBehavior(QAbstractItemView::SelectRows); mpProcessesTreeView->setSelectionMode(QAbstractItemView::SingleSelection); mpProcessesTreeView->setUniformRowHeights(true); //mpProcessesTreeView->setRootIsDecorated(false); mpProcessesTreeView->setSortingEnabled(true); mpProcessesTreeView->header()->setDefaultSectionSize(100); mpProcessesTreeView->header()->setStretchLastSection(true); mpProcessesTreeView->sortByColumn(1, Qt::AscendingOrder); // Create the buttons mpOkButton = new QPushButton(Helper::ok); mpOkButton->setEnabled(false); connect(mpOkButton, SIGNAL(clicked()), SLOT(attachProcess())); mpRefreshButton = new QPushButton(Helper::refresh); connect(mpRefreshButton, SIGNAL(clicked()), SLOT(updateProcessList())); mpCancelButton = new QPushButton(Helper::cancel); connect(mpCancelButton, SIGNAL(clicked()), SLOT(reject())); // create buttons box mpButtonBox = new QDialogButtonBox(Qt::Horizontal); mpButtonBox->addButton(mpOkButton, QDialogButtonBox::ActionRole); mpButtonBox->addButton(mpRefreshButton, QDialogButtonBox::ActionRole); mpButtonBox->addButton(mpCancelButton, QDialogButtonBox::ActionRole); connect(mpAttachToProcessIDTextBox, SIGNAL(textChanged(QString)), this, SLOT(processIDChanged(QString))); connect(mpFilterProcessesTextBox, SIGNAL(textChanged(QString)), this, SLOT(setFilterString(QString))); connect(mpProcessesTreeView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(processSelected(QModelIndex))); connect(mpProcessesTreeView, SIGNAL(clicked(QModelIndex)), this, SLOT(processClicked(QModelIndex))); // set the layout QGridLayout *pMainLayout = new QGridLayout; pMainLayout->setAlignment(Qt::AlignTop | Qt::AlignLeft); pMainLayout->addWidget(mpAttachToProcessIDLabel, 0, 0); pMainLayout->addWidget(mpAttachToProcessIDTextBox, 0, 1); pMainLayout->addWidget(mpFilterProcessesTextBox, 1, 0, 1 ,2); pMainLayout->addWidget(mpProcessesTreeView, 2, 0, 1 ,2); pMainLayout->addWidget(mpButtonBox, 3, 0, 1, 2, Qt::AlignRight); setLayout(pMainLayout); // get the list of processes updateProcessList(); }
SelectProcess::SelectProcess(QWidget *parent) : QDialog(parent) , ui(new Ui::SelectProcess) { ui->setupUi(this); setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); ui->processList->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch); updateProcessList(); }
MaemoRemoteProcessesDialog::MaemoRemoteProcessesDialog(const LinuxDeviceConfiguration::ConstPtr &devConfig, QWidget *parent): QDialog(parent), m_ui(new Ui::MaemoRemoteProcessesDialog), m_processList(new MaemoRemoteProcessList(devConfig, this)), m_proxyModel(new QSortFilterProxyModel(this)) { m_ui->setupUi(this); m_ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows); m_proxyModel->setSourceModel(m_processList); m_proxyModel->setDynamicSortFilter(true); m_proxyModel->setFilterKeyColumn(1); m_ui->tableView->setModel(m_proxyModel); connect(m_ui->processFilterLineEdit, SIGNAL(textChanged(QString)), m_proxyModel, SLOT(setFilterRegExp(QString))); // Manually gathered process information is missing the command line for // some system processes. Dont's show these lines by default. if (devConfig->osType() == LinuxDeviceConfiguration::Maemo5OsType) m_ui->processFilterLineEdit->setText(QLatin1String("[^ ]+")); connect(m_ui->tableView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), SLOT(handleSelectionChanged())); connect(m_ui->updateListButton, SIGNAL(clicked()), SLOT(updateProcessList())); connect(m_ui->killProcessButton, SIGNAL(clicked()), SLOT(killProcess())); connect(m_processList, SIGNAL(error(QString)), SLOT(handleRemoteError(QString))); connect(m_processList, SIGNAL(modelReset()), SLOT(handleProcessListUpdated())); connect(m_processList, SIGNAL(processKilled()), SLOT(handleProcessKilled()), Qt::QueuedConnection); connect(m_proxyModel, SIGNAL(layoutChanged()), SLOT(handleProcessListUpdated())); handleSelectionChanged(); updateProcessList(); }
//reg 0 is c2_base0 and 1 is c2_base1 void Context_PGDWriteCallback(DECAF_Callback_Params* params) { struct timeval t; gettimeofday(&t, NULL); DEFENSIVE_CHECK0(params == NULL); //TODO: Keep a record of what the current PGD is and the new PGD is // so that we don't do unnecessary updates - this applies to the // skipupdates flag that is set when system calls are made as well if (!bSkipNextPGDUpdate) { updateProcessList(params->pgd.env, params->pgd.newPGD, UPDATE_PROCESSES | UPDATE_THREADS); } //reset this flag bSkipNextPGDUpdate = 0; }
void initProcessList( struct SensorModul* sm ) { if( (procdir = opendir( PROCDIR )) == NULL ) { print_error( "cannot open \"%s\" for reading\n", PROCDIR ); return; } pagesz=getpagesize(); ProcessList = new_ctnr(); updateProcessList(); /* * register the supported monitors & commands */ registerMonitor( "pscount", "integer", printProcessCount, printProcessCountInfo, sm ); registerMonitor( "ps", "table", printProcessList, printProcessListInfo, sm ); if (!RunAsDaemon) { registerCommand("kill", killProcess); registerCommand("setpriority", setPriority); } }
void MaemoRemoteProcessesDialog::handleProcessKilled() { updateProcessList(); }
//LOK: My tests have shown that do_fork -> then update on a PGD write is a perfect choice. Should change the logic to do that. // it seems to cover many more cases than do_fork and schedule() //TODO: have to fix the potential problem where this is called twice before the return is processed // in which case the process name will not be updated properly void contextBBCallback(DECAF_Callback_Params* params) { static gva_t taskAddr = INV_ADDR; static int updateMask = 0; gpid_t pid = -1; TranslationBlock* tb = NULL; CPUState* env = NULL; DEFENSIVE_CHECK0(params == NULL); env = params->bb.env; tb = params->bb.tb; if (NULL == tb) { return; } if ( (tb->pc == SET_TASK_COMM_ADDR) || (tb->pc == DO_PRCTL_ADDR) )//set_task_comm { //In this case, we just update the name when the function returns //TODO: Fix i386 support //TODO: Make sure this taskAddr is NOT the thread's task #ifdef TARGET_ARM taskAddr = env->regs[0]; Context_retAddr = env->regs[14]; #elif TARGET_I386 taskAddr = env->regs[R_EAX]; DECAF_read_mem(env, env->regs[R_ESP], &Context_retAddr, sizeof(Context_retAddr)); #endif } else if ( (tb->pc == DO_EXECVE_ADDR) || (tb->pc == DO_CLONE_ADDR) )//do_execve { //we OR the update mask since its possible for the system call // to call another test - e.g. do_fork - and without declaring // the updateMask as static and using |= the flags will be // overwritten //TODO: Implement a STACK for the return addresses!!! //in this case we update the process, threads and module lists updateMask |= UPDATE_PROCESSES | UPDATE_THREADS | UPDATE_MODULES; #ifdef TARGET_ARM Context_retAddr = env->regs[14]; #endif } else if (tb->pc == DO_FORK_ADDR) //do_fork { //In this case we just update the process and threads lists updateMask |= UPDATE_PROCESSES | UPDATE_THREADS; #ifdef TARGET_ARM Context_retAddr = env->regs[14]; #endif } if (tb->pc == Context_retAddr) { if (taskAddr != INV_ADDR) //if we need to update the names only { pid = DECAF_get_pid(env, taskAddr); if (pid != -1) { //if we found the PID then just read the names and update updateProcessListByTask(env, taskAddr, UPDATE_PROCESSES | UPDATE_THREADS | UPDATE_MODULES, 0); } taskAddr = INV_ADDR; } else { updateProcessList(env, getCurrentPGD(), updateMask); } //since we updated the list already - lets skip the next PGD //write update bSkipNextPGDUpdate = 1; Context_retAddr = 0; DECAF_flushTranslationBlock_env(env, Context_retAddr); } if (Context_retAddr != 0) { //instead of registering for a new callback - we will just update our //conditions list and flush the entry for retAddr DECAF_flushTranslationBlock_env(env, Context_retAddr); } return; }
void SelectProcess::on_pushButton_Update_clicked() { updateProcessList(); }