Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.11.2011, 15:17   #1
reddiego
Пользователь
 
Регистрация: 09.04.2010
Сообщений: 11
По умолчанию Не могу разобраться с компилятором

Здравствуйте, уважаемые программисты! Передо мной стоит следующая задача: в консоль вывести список процессов (всех!) и пути к их EXE (это мне понадобится чтобы взять их хеш).
Поискал по форуму, много чего нашел и получил код.

Но! При запуске на Visual Studio 2010 (нажимаю кнопку Начать Отладку), все происходит верно.
Если же я запускаю программу просто из проводника, то мой код не показывает пути до системных процессов ((((((( Как мне быть, что не так?

Помогите, пожалуйста

Вот мой код:
PHP код:
#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <tlhelp32.h>
#include <stdio.h>
#include <tchar.h>
#include <psapi.h>
using namespace std;
#pragma comment(lib, "psapi")

void PrintProcessNameAndIDDWORD processID )
{
  
TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>");

  
HANDLE hProcess OpenProcessPROCESS_QUERY_INFORMATION |
                                                    
PROCESS_VM_READ,
                                                    
FALSE
                                                    
processID );

  if (
NULL != hProcess )
  {
      
HMODULE hMod;
      
DWORD cbNeeded;

      if ( 
EnumProcessModuleshProcess
                                            &
hMod
                                            
sizeof(hMod), 
                                            &
cbNeeded) )
      {
        
GetModuleFileNameExhProcess
                                        
hMod
                                        
szProcessName
                                        
sizeof(szProcessName) );
      }
      else 
        return;
  }
  else 
      return;

  
_tprintf(TEXT("%s\n"), szProcessName);

  
CloseHandlehProcess );
}


void main(void)
{

    
OSVERSIONINFO osinfo;

    
osinfo.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
    if (!
GetVersionEx(&osinfo))
    {
        
printf("Unable to get OS version!\n");
        return;
    }

    if (
osinfo.dwPlatformId VER_PLATFORM_WIN32_NT)
    {

        if (
osinfo.dwMajorVersion<5)
        {
            
printf("ToolHelp API isn't support on NT versions prior to Windows 2000!\n");
            return;
        }
    }

    
HANDLE hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    if (!
hSnapshot)
    {
        
printf("Unable to create snapshot!\n");
        return;
    }

    
PROCESSENTRY32 pe;
    
ULONG count=0;

    
pe.dwSize=sizeof(PROCESSENTRY32);
    
BOOL retval=Process32First(hSnapshot,&pe);
    while(
retval)
    {
        
count++;

        
_tprintfTEXT("%s\n"),pe.szExeFile);
        
PrintProcessNameAndID(pe.th32ProcessID);
        
cout<<endl;
        
retval=Process32Next(hSnapshot,&pe);
    }

    
CloseHandle(hSnapshot);


    
printf("%lu processes enumerated\n",count);
    
int a;
    
cin>>a;

reddiego вне форума Ответить с цитированием
Старый 09.11.2011, 19:54   #2
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

у меня работает

вот немного измененный код


Код:
int main(void)  // по стандарту должна возвращать значение
{ 
    setlocale(LC_ALL,"rus"); // для вывода русских символов

    OSVERSIONINFO osinfo; 

    osinfo.dwOSVersionInfoSize=sizeof(OSVERSIONINFO); 
    if (!GetVersionEx(&osinfo)) 
    { 
        printf("Unable to get OS version!\n"); 
        return 1; 
    } 

    if (osinfo.dwPlatformId & VER_PLATFORM_WIN32_NT) 
    { 

        if (osinfo.dwMajorVersion<5) 
        { 
            printf("ToolHelp API isn't support on NT versions prior to Windows 2000!\n"); 
            return 1; 
        } 
    } 

    HANDLE hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); 
    if (!hSnapshot) 
    { 
        printf("Unable to create snapshot!\n"); 
        return 1; 
    } 

    PROCESSENTRY32 pe; 
    ULONG count=0; 

    pe.dwSize=sizeof(PROCESSENTRY32); 
    BOOL retval=Process32First(hSnapshot,&pe); 
    while(retval) 
    { 
        count++; 

        _tprintf( TEXT("%s\n"),pe.szExeFile); 
        PrintProcessNameAndID(pe.th32ProcessID); 
        cout<<endl; 
        retval=Process32Next(hSnapshot,&pe); 
    } 

    CloseHandle(hSnapshot); 


    printf("%lu processes enumerated\n",count); 
    
	system("pause"); // ждать нажатия клавиши
     // return 0; - можно не писать, по стандарту main вернет 0
}
counter вне форума Ответить с цитированием
Старый 09.11.2011, 20:20   #3
reddiego
Пользователь
 
Регистрация: 09.04.2010
Сообщений: 11
По умолчанию

Спасибо большое за поправки!

Но у меня все равно проблема не решилась. Нажимаю начать отладку прога запускается, выводит процессы и я вижу путь "C:\Windows\system32\svchost.ex e".

А если просто руками запускаю exe, то выводит просто svchost без пути!
Почему так?
Компилятор VC 2010
Windows 7...
reddiego вне форума Ответить с цитированием
Старый 09.11.2011, 20:36   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а вы запустите руками от админа.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 09.11.2011, 20:42   #5
reddiego
Пользователь
 
Регистрация: 09.04.2010
Сообщений: 11
По умолчанию

Спасибо за замечание.
Попробовал. Тоже самое, ничего не изменилось... тип проекта релиз.
Вот прикладываю exe, который получается
Вложения
Тип файла: zip proga.zip (3.9 Кб, 6 просмотров)
reddiego вне форума Ответить с цитированием
Старый 09.11.2011, 21:02   #6
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

привилегии процессу выставлять пробовали?
counter вне форума Ответить с цитированием
Старый 09.11.2011, 21:12   #7
reddiego
Пользователь
 
Регистрация: 09.04.2010
Сообщений: 11
По умолчанию

Не совсем понял, попробовать поменять приоритет процесса?

Может надо как-нибудь по другому библиотеки грузить?
Печаль, почему так непонятно ((
reddiego вне форума Ответить с цитированием
Старый 09.11.2011, 21:14   #8
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

http://www.rsdn.ru/article/baseserv/privileges.xml
http://msdn.microsoft.com/en-us/library/aa379306.aspx
http://msdn.microsoft.com/en-us/library/bb530716.aspx
counter вне форума Ответить с цитированием
Старый 09.11.2011, 21:20   #9
reddiego
Пользователь
 
Регистрация: 09.04.2010
Сообщений: 11
По умолчанию

Вполне может быть! Спасибо!
А вы могли бы попробовать выставить привелегию? Ума не хватает, где её использовать...
SE_DEBUG_NAME - вот наверное компилятор запускает вот с такой привелегией
reddiego вне форума Ответить с цитированием
Старый 09.11.2011, 21:40   #10
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

примеры там есть, пробуйте.

Код:
bool SetProcessPrivileges(wchar_t *privileges)
{
	HANDLE processToken;
	TOKEN_PRIVILEGES tp;

	if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&processToken))
		return false;
	
	if(!LookupPrivilegeValue(NULL,privileges,&tp.Privileges[0].Luid))
		return false;

	tp.PrivilegeCount=1;
	tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;

	AdjustTokenPrivileges(processToken,false,&tp,0,0,0);
	if(GetLastError()!=ERROR_SUCCESS)
		return false;

	return true;
}
counter вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
не могу разобраться feesta Помощь студентам 3 17.09.2011 23:46
НЕ могу разобраться Smagulov85 БД в Delphi 9 29.09.2010 16:13
не могу разобраться Var17 Общие вопросы Delphi 6 27.03.2010 01:21
Не могу разобраться semAz Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 10.03.2010 17:43