Главная страница
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.015 c
3-23965
sanilo
2002-07-16 23:00
2002.08.08
Именованные каналы


3-23896
Filat
2002-07-16 17:38
2002.08.08
Как создать таблицу в нужной мне директории?


3-23917
KAA
2002-07-17 17:05
2002.08.08
2000 Индексы


6-24165
Secam
2002-05-26 21:38
2002.08.08
TwebBrowser событие OnBeforeNavigate2 проблема с PostData


1-24104
Dark Elf
2002-07-26 16:48
2002.08.08
Chart