Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.08.08;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.016 c
6-24147
Jeck
2002-05-27 17:48
2002.08.08
Простой вопросик


1-23990
Sam Stone
2002-07-27 16:24
2002.08.08
Проблема с комбобоксами


3-23915
andrey_pst
2002-07-18 11:42
2002.08.08
Как заблокировать пользователя БД


4-24284
ted
2002-05-12 19:43
2002.08.08
кол-во страниц отправленых на принтер


8-24137
Deus
2002-03-28 16:12
2002.08.08
live 5.1