Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> CreateToolhelp32Snapshot и Win64 
V
    Опции темы
Cheloveck
Дата 4.10.2009, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 1
Всего: 32



Руководствуясь этой  статьёй и этим предостережением в MSDN склонился к использованию CreateToolhelp32Snapshot для получения различной информации о процессах. Но меня очень смущает цифра 32 в названии функции, как впрочем и в типах для работы с процессами. Собственно вопрос, корректно ли это будет работать в 64-разрядной Windows? Я поставил себе на виртуалку 64-разрядную винду, немного потестил, вроде бы работает, но у меня нет достоверной информации, будет ли работать с 64-битными процессами...


--------------------
user posted image
PM Jabber   Вверх
Cheloveck
Дата 5.10.2009, 08:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 1
Всего: 32



Нашёл оговорку в MSDN
Цитата

If the specified process is a 64-bit process and the caller is a 32-bit process, this call will fail.



--------------------
user posted image
PM Jabber   Вверх
Cheloveck
Дата 5.10.2009, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 1
Всего: 32



Для тех, кто озадачен получением списка процессов в ОС Windows поделюсь своими изысканиями. 
Как было сказано в двух постах выше: 
  • функция ZwQuerySystemInformation не рекомендуема к использованию Microsoft'ом
  • CreateToolhelp32Snapshot не работает с 64-разрядными процессами
Остальные способы, приведённые в указанной статье показались мне несколько невзрачными. Приведу код, с помощью которого можно решить поставленную задачу (а именно, получение списка процессов с PID, а значит и со всей сопутствующей информацией)
Код

    // Оказалось, что для некоторых процессов в Windows Vista (н/р csrss.exe)
    // необходимо получить привелегии SE_DEBUG_NAME.
    HANDLE htoken;
    if(OpenProcessToken(GetCurrentProcess(),
        TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &htoken)) 
    {
        TOKEN_PRIVILEGES tkp;
        LookupPrivilegeValueW(NULL, SE_DEBUG_NAME, &tkp.Privileges[0].Luid);
        tkp.PrivilegeCount = 1;
        tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
        AdjustTokenPrivileges(htoken, FALSE, &tkp, 0, NULL, 0);
        CloseHandle(htoken);
    }

    std::wofstream output(L"processes.log");
    if(!output.is_open())
    {
        std::cerr << "Can't open log file\n";
        system("pause");
        return 1;
    }
    WTS_PROCESS_INFO *ppinfo;
    DWORD count;
    WTSEnumerateProcesses(WTS_CURRENT_SERVER_HANDLE, 0, 1, &ppinfo, &count);

    const DWORD len = 256;
    wchar_t username[len];
    wchar_t domainname[len];
    DWORD dname_len = len;
    DWORD uname_len = len;
    SID_NAME_USE snu;
    for(DWORD i = 0; i < count; i++)
    {
        output << "[" << ppinfo[i].pProcessName << "]\n" <<
            "PID = " << ppinfo[i].ProcessId << "\nUser = ";
        
        if(LookupAccountSid(NULL, ppinfo[i].pUserSid, 
                username, &uname_len, domainname, &dname_len, &snu))
            output << username << "\nDomain = " << domainname;
        else
            output << "<Unknown>\nDomain = <Unknown>";
        output << std::endl << std::endl;
        dname_len = len;
        uname_len = len;
    }

    WTSFreeMemory(ppinfo);
    output.close();

Данный код запишет все процессы в файл в виде
Код

[имя_программы.exe]
PID = 500
User = имя_пользователя
Domain = доменное имя


P.S. пример не оптимизирован, но наглядно демонстрирует работу.

Это сообщение отредактировал(а) Cheloveck - 5.10.2009, 15:31


--------------------
user posted image
PM Jabber   Вверх
dumb
Дата 5.10.2009, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 27
Всего: 158



одна оговорка: для успешного выполнения данного кода должна быть запущена служба "Terminal Services"("Службы терминалов").
PM MAIL   Вверх
Cheloveck
Дата 5.10.2009, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 1
Всего: 32



dumb, спасибо, не знал, буду проверять перед выполнением.


--------------------
user posted image
PM Jabber   Вверх
Cheloveck
Дата 6.10.2009, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 1
Всего: 32



dumb, я отключил "службы терминалов" и запустил программу, всё работает!

Добавлено через 1 минуту и 2 секунды
возможно, что не будет доступа на удалённую машину с отключённой службой, но на локальной проблем нет.


--------------------
user posted image
PM Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0453 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.