Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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.46 MB
Время: 0.025 c
1-24066
Valeris
2002-07-26 11:03
2002.08.08
Какой фукцией вызвать запуск ...?


7-24256
Посетитель
2002-05-24 14:52
2002.08.08
Как приостановить Shutdown компа


1-23997
iNew
2002-07-26 18:19
2002.08.08
Прочита в хелпе про stdcall и др. дериктивы и ничё не понял,


14-24237
Olgerd
2002-07-12 11:40
2002.08.08
О видеокартах...


1-24002
Hooch
2002-07-25 16:36
2002.08.08
ShareMem





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский