none
Qt С++. Psapi.h. OpenProcess. Не отображаются процессы с правами администратора RRS feed

  • Вопрос

  • Пилю кустарный таск-менеджер, хочу отобразить процессы.
    Запускаю экзешник с правами администратора, но не отображаются многие процессы, которые отображаются в стандартном виндосовском Т-М.
    Выяснил, что OpenProcess возвращает нулевой хэндл на процессах, защищённых правами администратора.
    И поэтому нельзя узнать ни имя, ни приоритет. Хотя я exe запускаю с правами админа.
    Как это объяснить? И что сделать, чтобы получить доступ к заветным процессам?

    Вот код:
    #include "mainwindow.h"
    #include "form.h"
    #include "ui_mainwindow.h"
    #include <windows.h>
    #include <psapi.h>
    #include <QDebug>
    #include <QMessageBox>
    #include <QContextMenuEvent>
    
    void MainWindow::ShowProcesses()
    {
        HANDLE  hProc;
        TCHAR    szProcessName [80];
        HMODULE ahMod[1];
        DWORD   dwNeeded;
        DWORD lpidProcess[1024] = {0};
        DWORD cbNeeded;
    
        EnumProcesses(lpidProcess, 1024*sizeof(DWORD), &cbNeeded);
        unsigned int num = cbNeeded/sizeof(DWORD);
        ui->tableWidget->setRowCount(num);
    
        unsigned int j = 0,k=0;
    
        for (unsigned int i = 1; i < num; i ++)
        {
            hProc = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
                               FALSE,
                               lpidProcess[i]);
            if (hProc)
            {
                if (EnumProcessModules(hProc, ahMod, sizeof(ahMod), &dwNeeded))
                {
                    if (GetModuleBaseName(hProc, ahMod[0], szProcessName, sizeof(szProcessName)))
                    {
                        QTableWidgetItem *item1 = new QTableWidgetItem(tr("%1").arg(lpidProcess[i]));
                        ui->tableWidget->setItem(j, 1, item1);
                        QTableWidgetItem *item2 = new QTableWidgetItem(QString::fromUtf16(szProcessName));
                        ui->tableWidget->setItem(j, 0, item2);
                        QTableWidgetItem *item3;
                        switch (GetPriorityClass(hProc))
                        {
                        case REALTIME_PRIORITY_CLASS:
                            item3 = new QTableWidgetItem("Real time");
                            break;
                        case HIGH_PRIORITY_CLASS:
                            item3 = new QTableWidgetItem("High");
                            break;
                        case ABOVE_NORMAL_PRIORITY_CLASS:
                            item3 = new QTableWidgetItem("Above normal");
                            break;
                        case NORMAL_PRIORITY_CLASS:
                            item3 = new QTableWidgetItem("Normal");
                            break;
                        case BELOW_NORMAL_PRIORITY_CLASS:
                            item3 = new QTableWidgetItem("Below normal");
                            break;
                        case IDLE_PRIORITY_CLASS:
                            item3 = new QTableWidgetItem("Idle");
                            break;
                        default:
                            item3 = new QTableWidgetItem("<Couldn't read>");
                            break;
                        }
    
                        ui->tableWidget->setItem(j, 2, item3);
                        j++;
                    }
                }
            }
            else ui->label_3->setText(tr("%1").arg(++k));
            CloseHandle(hProc);
        }
        ui->tableWidget->setRowCount(j);
        ui->label_2->setText(tr("%1").arg(j));
    }
    

    6 июня 2013 г. 16:30

Ответы