информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Где водятся OGRыПортрет посетителяЗа кого нас держат?
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
 Умер Никлаус Вирт 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[Win32] Своего процесса??? 16.10.03 06:53  Число просмотров: 1318
Автор: makeworld Статус: Member
Отредактировано 16.10.03 07:00  Количество правок: 1
<"чистая" ссылка>
> Тогда не надо морочить себе голову и сделать:
>
> GetModuleFileName(NULL, Buffer, Length);

Так не подойдет. Мне нужно чтобы этот путь к файлу был как-то ассоциирован с pid'ом процесса. Чтобы например 'пролистать' все процессы с помощью Process32First, Process32Next и сравнивать один из элементов структуры соответствующей каждому процессу и путем к файлу. если пути сходятся - значит и pid из этой структуры принадлежит моему процессу. Но это уже проблема решенная, я использовал Module32First/Module32Next. Появилась проблема с получением списка тредов. Вот эта прога не находит ни одного треда в системе:

#include <windows.h>
#include <iostream.h>
#include <tlhelp32.h>

int main() {
	HANDLE tSnap = NULL; 
	THREADENTRY32 t;
	tSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,0); 
	if (tSnap != INVALID_HANDLE_VALUE) {
		if (Thread32First(tSnap, &t)) { 
			cout <<  t.th32ThreadID << endl;
			while (Thread32Next(tSnap, &t))
				cout <<  t.th32ThreadID << endl;
		} else cout << "Thread32First() failed: " << GetLastError() << endl;
	} else cout << "CreateToolhelp32Snapshot() failed" << endl;
	CloseHandle(tSnap);
	return 0;
}

---
<programming>
[Win32] Полный путь к файлу процесса 14.10.03 06:03  
Автор: makeworld Статус: Member
<"чистая" ссылка>
из MSDN (описание структуры PROCESSENTRY32):
szExeFile
Path and filename of the executable file for the process.

На самом деле в szExeFile только имя файла. в MSDN ошибка?

в MSDN есть пример, где получается полный путь к файлу процесса, в котором используется функция GetProcessModule() (полный путь к файлу пишется в lpMe32->szExePath). Проблема в том, что для всех процессов
в моей системе (win2000 sp4, тестировал под админом) эта функция возвращает FALSE. GetLastError() выдает либо 5 (Access Denied), либо 18 (There are no more files). Первыми двумя параметрами для этой функции я передаю p.th32ProcessID и p.th32ModuleID соответственно, являющиеся результатом работы Process32{First|Next}(snapshot,&p). Process32{First|Next}() работает нормально и возвращает нормальные пиды существующих в системе процессов (на всякий случай говорю).

Как мне получить полный путь к файлу процесса и что это за косяки с GetProcessModule()? А вообще, мне нужно всего-то определить PID 'самого себя', вот я и просматриваю все процессы в системе и сравниваю полный путь к процессу с GetCommandLine() (прога запускается без параметров). Может кто-нибудь знает способ проще?

Функция GetProcessModule() не системная, поэтому привожу ее код:

BOOL GetProcessModule (DWORD dwPID, DWORD dwModuleID,
LPMODULEENTRY32 lpMe32, DWORD cbMe32)
{
BOOL bRet = FALSE;
BOOL bFound = FALSE;
HANDLE hModuleSnap = NULL;
MODULEENTRY32 me32 = {0};

// Take a snapshot of all modules in the specified process.

hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPID);
if (hModuleSnap == INVALID_HANDLE_VALUE)
return (FALSE);

// Fill the size of the structure before using it.

me32.dwSize = sizeof(MODULEENTRY32);

// Walk the module list of the process, and find the module of
// interest. Then copy the information to the buffer pointed
// to by lpMe32 so that it can be returned to the caller.

if (Module32First(hModuleSnap, &me32))
{
do
{
if (me32.th32ModuleID == dwModuleID)
{
CopyMemory (lpMe32, &me32, cbMe32);
bFound = TRUE;
}
}
while (!bFound && Module32Next(hModuleSnap, &me32));

bRet = bFound; // if this sets bRet to FALSE, dwModuleID
// no longer exists in specified process
}
else
bRet = FALSE; // could not walk module list

// Do not forget to clean up the snapshot object.

CloseHandle (hModuleSnap);

return (bRet);
}
[Win32] Чего тебе вообще надо то? 17.10.03 08:57  
Автор: IgorR <Igor Razin> Статус: Member
<"чистая" ссылка>
PID свой узнать? Дык GetCurrentProcessId()
[Win32] Своего процесса??? 14.10.03 11:40  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
Тогда не надо морочить себе голову и сделать:

GetModuleFileName(NULL, Buffer, Length);
[Win32] Своего процесса??? 16.10.03 06:53  
Автор: makeworld Статус: Member
Отредактировано 16.10.03 07:00  Количество правок: 1
<"чистая" ссылка>
> Тогда не надо морочить себе голову и сделать:
>
> GetModuleFileName(NULL, Buffer, Length);

Так не подойдет. Мне нужно чтобы этот путь к файлу был как-то ассоциирован с pid'ом процесса. Чтобы например 'пролистать' все процессы с помощью Process32First, Process32Next и сравнивать один из элементов структуры соответствующей каждому процессу и путем к файлу. если пути сходятся - значит и pid из этой структуры принадлежит моему процессу. Но это уже проблема решенная, я использовал Module32First/Module32Next. Появилась проблема с получением списка тредов. Вот эта прога не находит ни одного треда в системе:

#include <windows.h>
#include <iostream.h>
#include <tlhelp32.h>

int main() {
	HANDLE tSnap = NULL; 
	THREADENTRY32 t;
	tSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,0); 
	if (tSnap != INVALID_HANDLE_VALUE) {
		if (Thread32First(tSnap, &t)) { 
			cout <<  t.th32ThreadID << endl;
			while (Thread32Next(tSnap, &t))
				cout <<  t.th32ThreadID << endl;
		} else cout << "Thread32First() failed: " << GetLastError() << endl;
	} else cout << "CreateToolhelp32Snapshot() failed" << endl;
	CloseHandle(tSnap);
	return 0;
}

---
[Win32] Странно все это 16.10.03 10:53  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> > GetModuleFileName(NULL, Buffer, Length);
>
> Так не подойдет. Мне нужно чтобы этот путь к файлу был
> как-то ассоциирован с pid'ом процесса. Чтобы например
А так
HANDLE hProcess = OpenProcess(MAXIMUM_ALLOWED, FALSE, Pid);
if (hProcess == INVALID_HANDLE_VALUE)
    goto fail;
GetModuleFileName(hProcess, Buffer, Length);
CloseHandle(hProcess);

---

> соответствующей каждому процессу и путем к файлу. если пути
> сходятся - значит и pid из этой структуры принадлежит моему
Ой. По pid-у найти путь, а потом по пути найти pid. Странный подход, надеюсь обоснованный.

>
#include <windows.h>> #include <iostream.h>
> #include <tlhelp32.h>
> 
> int main() {
> 	HANDLE tSnap = NULL; 
> 	THREADENTRY32 t;
> 	tSnap =
> CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,0); 
> 	if (tSnap != INVALID_HANDLE_VALUE) {
> 		if (Thread32First(tSnap, &t)) { 
> 			cout <<  t.th32ThreadID
> << endl;
> 			while (Thread32Next(tSnap, &t))
> 				cout << 
> t.th32ThreadID << endl;
> 		} else cout << "Thread32First()
> failed: " << GetLastError() << endl;
> 	} else cout << "CreateToolhelp32Snapshot()
> failed" << endl;
> 	CloseHandle(tSnap);
> 	return 0;
> }

---

Э-э-э-э. Читайте MSDN и да наступит вам счастье "The calling application must set the dwSize member of THREADENTRY32 to the size, in bytes, of the structure. Thread32First"

Было бы неплохо брать GetLastError() тогда ошибка нашлась бы гораздо быстрее :-)
[Win32] Странно все это 17.10.03 06:45  
Автор: makeworld Статус: Member
<"чистая" ссылка>
> Ой. По pid-у найти путь, а потом по пути найти pid.
> Странный подход, надеюсь обоснованный.
Не. Найти путь, а потом сравнивая пути всех процессов с исходным, найти pid. Первой что в голову пришло.
>
> Э-э-э-э. Читайте MSDN и да наступит вам счастье "The
> calling application must set the dwSize member of
> THREADENTRY32 to the size, in bytes, of the structure.
> Thread32First"
Да.. Уже нашел. Главное для Process32First() и Module32First() тоже самое написано, но и без указания размера структуры все работает.

>
> Было бы неплохо брать GetLastError() тогда ошибка нашлась
> бы гораздо быстрее :-)

Так у меня брался GetLastError(), если Thread32First ноль возвращал. Только он какую-то лажу выдавал о неверной команде и что-то типа этого.
[Win32] Странно все это 17.10.03 13:10  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> Да.. Уже нашел. Главное для Process32First() и
> Module32First() тоже самое написано, но и без указания
> размера структуры все работает.
Вообще то надо практически всегда заполнять. Потому как если есть размер, значит структура в принципе variable-sized, так что надо указать размер памяти под текущей структурой. А то что иногда работает, так это уже ошибки микрософта - не проверяют входные параметры. Точно так же вылазит довольно много ошибок с переполнением буфера и другими методами переписывания kernel-space memory. :-)
[Win32] Странно все это 17.10.03 08:20  
Автор: Killer{R} <Dmitry> Статус: Elderman
<"чистая" ссылка>
> Да.. Уже нашел. Главное для Process32First() и
> Module32First() тоже самое написано, но и без указания
> размера структуры все работает.
Прикол в том что иногда работает иногда нет. Сам с этим сталкивался.
[Win32] А если твоя прога в нескольких экземплярах? 17.10.03 08:04  
Автор: Zef <Alloo Zef> Статус: Elderman
<"чистая" ссылка>
[Win32] А если твоя прога в нескольких экземплярах? 18.10.03 06:25  
Автор: makeworld Статус: Member
Отредактировано 18.10.03 06:30  Количество правок: 1
<"чистая" ссылка>
в нескольких экземплярах она не может быть запущена.
2 IgorR: насчет GetCurrentProcessId() - спасибо, не нашел я ее сначала в MSDN.
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 1 s   Design: Vadim Derkach