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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.03.2012, 00:02   #1
alezha
Форумчанин
 
Регистрация: 16.04.2011
Сообщений: 126
По умолчанию Pid процесса, который использует файл.

Как можно определить pid процесса, который использует файл, путь к которому известен?
alezha вне форума Ответить с цитированием
Старый 15.03.2012, 09:57   #2
Krok27
Форумчанин
 
Аватар для Krok27
 
Регистрация: 08.07.2010
Сообщений: 505
По умолчанию

Возможно здесь найдешь ответ http://wasm.ru/article.php?article=lockfileswork
Знающий не говорит, говорящий не знает (С) Лао Цзы
Krok27 вне форума Ответить с цитированием
Старый 19.03.2012, 12:54   #3
alezha
Форумчанин
 
Регистрация: 16.04.2011
Сообщений: 126
По умолчанию

а как забрать у процесса файл, который его использует?
там вроде такого не написано.
alezha вне форума Ответить с цитированием
Старый 19.03.2012, 18:51   #4
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

При дубликации хендла надо бы установить DUPLICATE_CLOSE_SOURCE.
EUGY вне форума Ответить с цитированием
Старый 05.04.2012, 12:59   #5
alezha
Форумчанин
 
Регистрация: 16.04.2011
Сообщений: 126
По умолчанию

У меня в этих функциях ошибка при компиляции: ссылка на неразрешенный символ.
Ошибка 13 error LNK2019: ссылка на неразрешенный внешний символ __imp__NtQueryInformationFile@20 в функции _GetFileNameThread@4
Ошибка 12 error LNK2019: ссылка на неразрешенный внешний символ __imp__NtQuerySystemInformation@16 в функции _GetInfoTable
Код:
DWORD WINAPI GetFileNameThread(PVOID lpParameter)
{
	PNM_INFO        NmInfo = (PNM_INFO)lpParameter;
	IO_STATUS_BLOCK IoStatus;
	NtQueryInformationFile(NmInfo->hFile, &IoStatus, &NmInfo->Info, sizeof(NM_INFO) - sizeof(HANDLE), FileNameInformation);
	return 0;
}
PVOID GetInfoTable(IN ULONG ATableType,HANDLE hHeap)
{
	ULONG    mSize = 0x8000;
	PVOID    mPtr;
	NTSTATUS status;
	do
	{
		mPtr = HeapAlloc(hHeap, 0, mSize);
		if (!mPtr) return NULL;
		memset(mPtr, 0, mSize);
		status = NtQuerySystemInformation(SystemHandleInformation, mPtr, mSize, NULL); 		
		if (status == STATUS_INFO_LENGTH_MISMATCH)
		{
			HeapFree(hHeap, 0, mPtr);
			mSize = mSize * 2;
		}
	} while (status == STATUS_INFO_LENGTH_MISMATCH);
	if (NT_SUCCESS(status)) return mPtr;
	HeapFree(hHeap, 0, mPtr);
	return NULL;
}
компиляция в Visual Studio 2010.
может ктонить подскажет что ж делать?
alezha вне форума Ответить с цитированием
Старый 05.04.2012, 13:05   #6
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

А как Вы к ntdll.dll подключаетесь?
У вас должна быть прилинкована библиотека ntdll.lib, либо сами получаете адреса экспортируемых функций и вызываете по указателю.
EUGY вне форума Ответить с цитированием
Старый 05.04.2012, 13:30   #7
alezha
Форумчанин
 
Регистрация: 16.04.2011
Сообщений: 126
По умолчанию

спасибо. я действительно неправильно подключал библиотеку.

программа, что в той статье, показывает не все открытые файлы!
и при DUPLICATE_CLOSE_SOURCE у меня виснет все на свете.

Последний раз редактировалось Stilet; 07.04.2012 в 11:54.
alezha вне форума Ответить с цитированием
Старый 06.04.2012, 18:46   #8
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
Сообщение от alezha Посмотреть сообщение
программа, что в той статье, показывает не все открытые файлы!
и при DUPLICATE_CLOSE_SOURCE у меня виснет все на свете.
Живо себе это представляю.
При переборе хендлов, открываете его процесс и с помощью NtDuplicateObject или DuplicateHandle дублируете хендл с закрытием оригинала. И так со всеми хендлами, какие нужно и не нужно. Молодец.
EUGY вне форума Ответить с цитированием
Старый 07.04.2012, 11:23   #9
alezha
Форумчанин
 
Регистрация: 16.04.2011
Сообщений: 126
По умолчанию

Еще один вопрос. У меня есть строка в которой значение определенного хендла и мне надо его завершить.
как эту строку присвоить объекту типу HANDLE или можно сразу как-то завершить?
alezha вне форума Ответить с цитированием
Старый 07.04.2012, 18:54   #10
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
Сообщение от alezha Посмотреть сообщение
Еще один вопрос. У меня есть строка в которой значение определенного хендла и мне надо его завершить.
как эту строку присвоить объекту типу HANDLE или можно сразу как-то завершить?
Как это? Приведите пример строки содержащей хендл.
Я всегда считал, что строка это последовательность элементов char (wсhar_t) завершаемая нулем, ну или это класс инкапулирующий эту последовательность. Преобразовать значение, записанное в строке в число конечно можно, только непонятно как это соотносится с темой?
EUGY вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получить Handle или PID из процесса в котором dll... rangel Win Api 2 09.02.2012 12:44
Получить все окна процесса, зная его PID. Johnson Общие вопросы Delphi 2 11.01.2011 19:27
хэндл окна по PID процесса? Johnson Win Api 1 16.12.2010 16:05
По пути к файлу определить pid процесса Var17 Win Api 1 15.12.2009 11:33