Форум: "Сети";
Текущий архив: 2002.08.08;
Скачать: [xml.tar.bz2];
ВнизЗакрыть открытый другим процессом файл Найти похожие ветки
← →
Guardian (2002-05-28 18:38) [0]Уважаемые, подскажите!
Дано: лежит себе на сервере NT/2000 файл, его кто-то открыл (возможно exclusive)
Надо: освободить этот файл (есть права админа сервера)
← →
cypher (2002-05-29 00:23) [1]Ну дык, шлешь ему енту самую NetFileClose... или нет?
← →
Guardian (2002-05-29 07:34) [2]В хелпе 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.
← →
Song (2002-05-29 08:47) [3]2Guardian © (29.05.02 07:34)
И что от этого её нельзя использовать? :))
← →
paul_shmakov (2002-05-29 13:26) [4]довольно непростая задача, но решаемая.
получаем список всех хендлов во всех работающих процессах с помощью 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 или форуме - это частый вопрос).
← →
Guardian (2002-05-29 14:05) [5]Подскажите, где взять ее описание и приемр использования
← →
Guardian (2002-05-29 14:30) [6]2paul_shmakov
Спасибо, буду рыть
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2002.08.08;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.006 c