![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Закрыть открытый другим процессом файл
Guardian © (2002-05-28 18:38:00)Уважаемые, подскажите!
Дано: лежит себе на сервере NT/2000 файл, его кто-то открыл (возможно exclusive)
Надо: освободить этот файл (есть права админа сервера)
Guardian (2002-05-29 14:30:00) [1]2paul_shmakov
Спасибо, буду рыть
Guardian (2002-05-29 14:05:00) [2]Подскажите, где взять ее описание и приемр использования
paul_shmakov (2002-05-29 13:26:00) [3]довольно непростая задача, но решаемая.
получаем список всех хендлов во всех работающих процессах с помощью NtQuerySystemInformation(16,...) (ищите более подробно в инете). полученный список будет содержать не только значения хэндлов, но и некоторую полезную информацию:
TSystemHandle = packed record
ProcessID: DWord;
HandleType: Word;
HandleNumber: Word;
KernelAddress: Word;
Flags: Word;
end;
ProcessID - идентификатор процесса, которому пренадлежит хэндл, HandleNumber - само значение хэндла.
теперь нужно определить, тип объекта-ядра, на который ссылается хэндл. для этого предназначена функция NtQueryObject. но хэндл принадлежит чужому процессу, а NtQueryObject работает только с хэндлами нашего процесса. для решения этой проблемы открываем чужой процесс (OpenProcess с правами доступа PROCESS_DUP_HANDLE), благо знаем его идентификатор, и с помощью DuplicateHandle делаем доступным этот хэндл в нашем процессе.
теперь с помощью NtQueryObject определяем тип объекта. нас интересуют объекты-файлы.
далее с помощью NtQueryInformationFile можно получить имя открытого файла (описание опять же ищите в инете).
сравниваем имя файла с тем, который нам нужно освободить. если это он, то все, что нам нужно - это закрыть этот хэндл в чужом процессе. как это сделать? благо есть такая функция CreateRemoteThread, позволяющая создать поток в чужом процессе. для потока нужно указать адрес функции и передать в нее параметр. укажем в качестве адреса адрес функции CloseHandle, а в качестве параметра передадим само значение хэндла.
CloseHandle выполнится в чужом процессе, закроет хэндл на файл, и поток завершится.
вот и все, задача решена.
да, для выполнения всего этого скорее всего потребуются debug priviliges (как их себе назначить - ищи в faq или форуме - это частый вопрос).
Song (2002-05-29 08:47:00) [4]2Guardian © (29.05.02 07:34)
И что от этого её нельзя использовать? :))
Guardian (2002-05-29 07:34:00) [5]В хелпе Delphi5 написано:
The NetFileClose function is obsolete in the Win32-based application programming interface (API). It is included for compatibility with 16-bit versions of Windows.
cypher (2002-05-29 00:23:00) [6]Ну дык, шлешь ему енту самую NetFileClose... или нет?