Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Закрыть открытый другим процессом файл


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... или нет?


Наверх

Титульная страница Поиск, карта сайта Написать письмо