powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / QueryFullProcessImageName: Access is denied.
20 сообщений из 20, страница 1 из 1
QueryFullProcessImageName: Access is denied.
    #38565148
ProcessImage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всех приветствую!

Друзья, пытаюсь выполнить функцию QueryFullProcessImageName, однако получаю ошибку:
GetLastError() ERROR_ACCESS_DENIED
5 (0x5)
Access is denied.
Код очень простой:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
  PROCESSENTRY32 pe32;
  pe32.dwSize = sizeof(PROCESSENTRY32);
  LPTSTR lpExeName;
  DWORD buf;

  HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL);

  if( hProcessSnap == INVALID_HANDLE_VALUE) return 0;

  if( Process32First(hProcessSnap, &pe32) )
	{
	   do
		 {
		   if( !strcmp(pe32.szExeFile, "Skype.exe") )
			 {
				HANDLE proc = OpenProcess(PROCESS_VM_READ, 0, pe32.th32ProcessID);

				if (QueryFullProcessImageName(proc, 0, lpExeName, &buf))
				  {
					ShowMessage(lpExeName);
				  }
				else
				  {
					ShowMessage(GetLastError()); // 5 (0x5)
				  }

				CloseHandle(proc);
				CloseHandle(hProcessSnap);
			 }
		 }
	   while ( Process32Next(hProcessSnap, &pe32) );
	 }



Но при выполнении получаю access denied .

Подскажите, пожалуйста, в чем может быть проблема?


Спасибо!
...
Рейтинг: 0 / 0
QueryFullProcessImageName: Access is denied.
    #38565159
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProcessImageв чем может быть проблема?
В том, что ты запрашиваешь право на PROCESS_VM_READ, а QueryFullProcessImageName требует
PROCESS_QUERY_INFORMATION или PROCESS_QUERY_LIMITED_INFORMATION, о чём чёрным по белому
написано в её описании.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
QueryFullProcessImageName: Access is denied.
    #38565180
ProcessImage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov , благодарю, поправил.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
  PROCESSENTRY32 pe32;
  pe32.dwSize = sizeof(PROCESSENTRY32);
  LPTSTR lpExeName;
  DWORD buf;

  HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL);

  if( hProcessSnap == INVALID_HANDLE_VALUE) return 0;
  if( Process32First(hProcessSnap, &pe32) )
	{
	   do
		 {
		   if( !strcmp(pe32.szExeFile, "Skype.exe") )
			 {
				HANDLE proc = OpenProcess(PROCESS_QUERY_INFORMATION, 0, pe32.th32ProcessID);

				if ( QueryFullProcessImageName(proc, 0, lpExeName, &buf) )
				  {
					std::cout << lpExeName;
				  }
				else
				  {
					std::cout << GetLastError(); // 8 (0x8)
				  }

				CloseHandle(proc);
				CloseHandle(hProcessSnap);
				return 0;
			 }
		 }
	   while ( Process32Next(hProcessSnap, &pe32) );
	 }

  CloseHandle(hProcessSnap);
  return 0;



Теперь получаю:
GetLastError() ERROR_NOT_ENOUGH_MEMORY
8 (0x8)
Not enough storage is available to process this command.

Не пойму в чем дело на этот раз... LPTSTR мало?!
...
Рейтинг: 0 / 0
QueryFullProcessImageName: Access is denied.
    #38565187
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProcessImageНе пойму в чем дело на этот раз... LPTSTR мало?!Мало.
Прочитай учебник K&R, пятую главу.
...
Рейтинг: 0 / 0
QueryFullProcessImageName: Access is denied.
    #38565189
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProcessImageНе пойму в чем дело на этот раз...
http://msdn.microsoft.com/en-us/library/windows/desktop/ms684919(v=vs.85).aspx

Прочитай хотя бы комментарии.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
QueryFullProcessImageName: Access is denied.
    #38565204
ProcessImage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov ,
Dimitry SibiryakovПрочитай хотя бы комментарии.

Прочитал.
На что был намек?

На это?
Коммент#1The QueryFullProcessImageName doesn't work on win2008-serv64 when the process path contains spaces.


На это?
Коммент#2For the best results use the following table to convert paths.

Windows 2000 = GetModuleFileName()
Windows XP x32 = GetProcessImageFileName()
Windows XP x64 = GetProcessImageFileName()
Windows Vista = QueryFullProcessImageName()
Windows 7 = QueryFullProcessImageName()

На это?
RemarksTo compile an application that uses this function, define _WIN32_WINNT as 0x0600 or later.

У меня Windows 7 x64.
Код: plaintext
1.
#define _WIN32_WINNT 0x0601

- также ошибка №8.
...
Рейтинг: 0 / 0
QueryFullProcessImageName: Access is denied.
    #38565217
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProcessImageНа что был намек?

На это?
И на это, и на то, а главное - на
lpdwSize [in, out]

On input, specifies the size of the lpExeName buffer, in characters. On
success, receives the number of characters written to the buffer, not including the
null-terminating character.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
QueryFullProcessImageName: Access is denied.
    #38565236
ProcessImage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov , так и замечательно :)
У меня в параметрах адрес переменной типа DWORD (unsigned long) - туда может не влезть значение, описывающее количество знаков, которые записываются в буффер lpExeName?
...
Рейтинг: 0 / 0
QueryFullProcessImageName: Access is denied.
    #38565245
ProcessImage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ах, елки-ж-палки... Дошло наконец-то, где я ступил :-)

Благодарю за помощь!
...
Рейтинг: 0 / 0
QueryFullProcessImageName: Access is denied.
    #38565248
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты выделенное предложение прочитать в состоянии?
ProcessImageУ меня в параметрах адрес переменной типа DWORD (unsigned long)
Какое значение имеет эта переменная на входе в функцию?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
QueryFullProcessImageName: Access is denied.
    #38565267
ProcessImage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov , все же ключевой момент был не в этом, а в выделении памяти:
Код: plaintext
1.
LPTSTR lpExeName = new char;


, на что мне выше намекали.
...
Рейтинг: 0 / 0
QueryFullProcessImageName: Access is denied.
    #38565338
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProcessImage Dimitry Sibiryakov , все же ключевой момент был не в этом, а в выделении памяти:
Код: plaintext
1.
LPTSTR lpExeName = new char;


, на что мне выше намекали.Начал в правильном направлении, но не дошел...
Ты уверен что полное имя твоего процесса уместится в одну букву?
...
Рейтинг: 0 / 0
QueryFullProcessImageName: Access is denied.
    #38565339
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProcessImage Dimitry Sibiryakov , все же ключевой момент был не в этом, а в выделении памяти:И прислушайся к совету Дмитрия...
...
Рейтинг: 0 / 0
QueryFullProcessImageName: Access is denied.
    #38565354
ProcessImage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl , так я уже ко всем прислушался :-)
Код: plaintext
1.
2.
LPTSTR lpExeName = new char [MAX_PATH];
DWORD buf = MAX_PATH;


Но на самом деле, выделение массива под один символ тоже работает и это очень смущает.

Я не успокоился и для теста записал в lpExeName больше 1000 знаков, где lpExeName:
Код: plaintext
1.
LPTSTR lpExeName = new char;

- никакого Access Violation'а =|
...
Рейтинг: 0 / 0
QueryFullProcessImageName: Access is denied.
    #38565369
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProcessImageНо на самом деле, выделение массива под один символ тоже работает и это очень смущает.

Я не успокоился и для теста записал в lpExeName больше 1000 знаков, где lpExeName:
Код: plaintext
1.
LPTSTR lpExeName = new char;

- никакого Access Violation'а =|Просто повезло.

1) ОС тебя пристрелит когда ты полезешь в чужую память.
2) ОС физически не может выделить тебе ровно один байт. Она выделяет один байт, плюс структуру - описывающую что "вот тут один байт занят". Как именно выглядит эта структура и где она находися знает только ОС. Ты не имеешь права туда лазить. Эта структура потом обрабатывается командой delete.
3) Сколько бы ты памяти не запрашивал - ОС всегда выделяет память страницами . Сколько памяти влезает на одну страницу знает только сама ОС. Но обычно размер страницы кратен килобайту, и обычно в странице от 1Кб до 16Кб.
4) Когда ты делаешь new - ОС находит на выданных тебе страницах незанятый кусок памяти соответсвующего размера, если не находит - добавляет тебе страниц. Где конкретно внутри страницы будет выделена память предсказать заранее не возможно.

Так что если твой new char выделил один байт в начале страницы, то ты сможешь без последствий вылезти за пределы массива на весь размер страницы. Пока ты за грань страницы не выйдешь - Access Violation ты не получишь.

примерно так можно поиграться:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
#include <iostream>
int main(int argc, char **argv) {
   char* c = new char;
   int i=0;
   while (1) {
       c[i]=0;
       std::cout << i << std::endl;
       i++;
   }
}


До скольки это чудо досчитает прежде чем помрет - предсказать почти невозможно. Но то что оно сможет нарисовать число больше чем нуль это почти гарантированно.

Подробнее читай Таненбаума.
...
Рейтинг: 0 / 0
QueryFullProcessImageName: Access is denied.
    #38565795
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProcessImage Dimitry Sibiryakov , все же ключевой момент был не в этом, а в выделении памяти:
Код: plaintext
1.
LPTSTR lpExeName = new char;


, на что мне выше намекали.

Ребята, это просто пи3/\ец ...
Индустрия в опасности...
...
Рейтинг: 0 / 0
QueryFullProcessImageName: Access is denied.
    #38566064
ProcessImage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl , благодарю за разъяснения!

Если не сложно, то поясните, пожалуйста, следующее.

White Owl2) ОС физически не может выделить тебе ровно один байт. Она выделяет один байт, плюс структуру - описывающую что "вот тут один байт занят". Как именно выглядит эта структура и где она находися знает только ОС.
Так а что мне делать, если мне необходимо записать всего один символ? Я бы сделал так:
Код: plaintext
1.
char* c = new char[2]; // с учетом нуля-терминатора


Но Вы говорите про структуру, про которую мы ничего знать не можем. Так как я могу позаботиться о свободном месте для этой структуры? Плюсовать на всякий случай всегда по 2-10 байт? :)


White Owlпримерно так можно поиграться:
...
До скольки это чудо досчитает прежде чем помрет - предсказать почти невозможно. Но то что оно сможет нарисовать число больше чем нуль это почти гарантированно.
У меня это чудо вылетает на числе 37627.
1. White OwlСколько памяти влезает на одну страницу знает только сама ОС. Но обычно размер страницы кратен килобайту, и обычно в странице от 1Кб до 16Кб.
37627 - это явно больше 16К Б . Получается, что ОС предоставила больше одной страницы?
2. Интересно то, что это число повторяется, когда я запускаю программу вновь. И где же Random Access Memory в таком случае? Или дело в том, что при запуске приложения ОС просто предоставляет ту же самую страницу/страницы?


White OwlПодробнее читай Таненбаума.
А что именно?
...
Рейтинг: 0 / 0
QueryFullProcessImageName: Access is denied.
    #38566773
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProcessImageЕсли не сложно, то поясните, пожалуйста, следующее.
....
Но Вы говорите про структуру, про которую мы ничего знать не можем. Так как я могу позаботиться о свободном месте для этой структуры? Плюсовать на всякий случай всегда по 2-10 байт? :)Кажется я зря упомянул об этой стороне memory management.... На данном этапе можешь смело забыть про эту структуру и не обращать на нее внимание. Пока ты пишешь приложения, тебе лично ничего делать не надо.
Просто те несколько байт которые будут описывать твой запрошенный кусок памяти в один байт тоже будут занимать некоторое место в памяти. Иными словами, если ты запросишь один кусок в тысячу байт, то ОС даст твоему процессу 1000+X байт. А если ты выделишь тысячу кусков памяти по одному байту каждый, то это займет 1000+X*1000 байт. С точки зрения твоего процесса оба случая хороши. С точки зрения остальных процессов - твой будет жадиной хапающим много памяти.
Самому тебе заботиться о месте под эти X*1000 байт не нужно, это внутренние дела ОС. Но они всегда будут присутствовать и отъедать какой-то объем памяти...


ProcessImage37627 - это явно больше 16К Б . Получается, что ОС предоставила больше одной страницы?Это возможно. Не зная потрохов конкретной ОС и ее настроек нельзя предсказать сколько памяти будет выделено процессу при старте.
ProcessImage2. Интересно то, что это число повторяется, когда я запускаю программу вновь. И где же Random Access Memory в таком случае? Или дело в том, что при запуске приложения ОС просто предоставляет ту же самую страницу/страницы?Не ту-же саму, а с теми же параметрами. И да, в пределах одной машины оно будет повторяться пока ты не сделаешь перенастройку ОС, не добавишь/уберешь памяти, не сменишь размер файла подкачки, не сделаешь другие настройки компилятора (который может сменить минимальные требования приложения). Там много параметров...
Запусти эту-же программку на другой машине, или собери ее в другом компиляторе - скорее всего получишь другое число. Но оно опять будет повторяться.



ProcessImageWhite OwlПодробнее читай Таненбаума.
А что именно?Все. Весь учебник.
http://www.amazon.com/Modern-Operating-Systems-3rd-Edition/dp/0136006639
...
Рейтинг: 0 / 0
QueryFullProcessImageName: Access is denied.
    #38566859
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProcessImage,

авторНо Вы говорите про структуру, про которую мы ничего знать не можем. Так как я могу позаботиться о свободном месте для этой структуры? Плюсовать на всякий случай всегда по 2-10 байт? :)


Это общее место во многих API на С и в API многих OS.
И тут существует два подхода:
Приложение или клиент библиотеки выделяет буфер какого-то заранее достаточного и большого размера, но если его не хватает , функция API или библиотеки выдаёт ошибку (и, видимо, не заполняет буфер).

Функция API или библиотеки имеет два режима работы. В первом режиме буфер не указывается (NULL), и функция подсчитывает и возвращает достаточный размер для буфера. Затем приложение выделяет буфер нужного размера и снова вызывает функцию, уже указывая буфер. Функция API или библиотеки отрабатывает во втором режиме и уже заполняет буфер.

По первой схеме работает например
http://msdn.microsoft.com/en-us/library/windows/desktop/aa364428(v=vs.85).aspx
По второй схеме работает например
http://msdn.microsoft.com/en-us/library/windows/desktop/dd374130(v=vs.85).aspx
...
Рейтинг: 0 / 0
QueryFullProcessImageName: Access is denied.
    #38566870
Alex the coder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv, добавлю по первому подходу - зачастую у ОС есть стандартные константы для таких случаев. Например, для неюникодного пути это MAX_PATH. Соотв. просто выделяем буфер под путь размера MAX_PATH и не паримся - больше путь гарантированно быть не может.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / QueryFullProcessImageName: Access is denied.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]