Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 2003.10.02;
Скачать: [xml.tar.bz2];

Вниз

Как насильно закрыть файл   Найти похожие ветки 

 
Костя   (2003-07-03 08:29) [0]

Следующая проблема: в Окошках другим юзером открыт файл.
Как насильно его закрыть (функцию или код)! Еще было бы интересно получение информации об открытом файле (кто, откуда....)
Заранее спасибо


 
Bis   (2003-07-03 09:22) [1]

информацию можешь получить:
берешь утилиту на sysinternals
ей кстати можно прибить, я так несколько файлов прибил, которые
система почему-то открывает и не дает удалить из-за этого папки.


 
tiam   (2003-07-03 09:25) [2]

в Win2k есть встроенная утилита: "Консоль управления" ММС.
Там много чего есть.


 
Alone Corsar   (2003-07-03 09:33) [3]

Данная команда закроет окно
PostMessage(FindWindow(nil,{FormNameOld}"Имя окна"),WM_SYSCOMMAND, SC_CLOSE, 0);


 
Alone Corsar   (2003-07-03 09:34) [4]

Почитай в форуме про АПИ функции там много чего написано


 
R4D][   (2003-07-03 12:28) [5]

Хм... А о чем собственно речь??? Фаил в Windows открывается с помощью функции CreateFile(Ex), которая оперирует с хэндлами, а хэндлы для каждого процесса свои, поэтому закрыть фаил УДАЛЕННО невозможно(поправьте меня если я не прав). Другое дело, если внедрить свой код в адресное пространство нужного тебе процесса и каким-то образом(???брутфорс???) узнать этот хэндл и закрыть его с помощью CloseHandle, но, как наверное ты уже понял, это задачка не из тривиальных.


 
Игорь Шевченко   (2003-07-03 13:22) [6]

R4D][ (03.07.03 12:28)


> поэтому закрыть фаил УДАЛЕННО невозможно(поправьте меня
> если я не прав).


Возможно. Поправляю :)


 
boa   (2003-07-04 05:59) [7]

> Игорь Шевченко

> Возможно.

А можете, хотя бы концептуально, объяснить - КАК программно закрыть файл открытый другим приложением?
Сколько встречал подобных вопросов, не разу ни кто не дал внятный ответ (одни рассуждения). По этому у меня, на пример, тоже сложилось впечатление что это невозможно.


 
Zero Ice   (2003-07-04 11:25) [8]

Это возможно, если попасть в адресное пространство "вражьего" процесса. Тогда можно найти таблицу хэндлов (у каждой винды она фиксированна) и уже пробежаться по ним. Ведь значение хэндла это всего лишь смешение относительно начала таблицы.


 
R4D][   (2003-07-04 11:25) [9]

>>Игорь Шевченко © (03.07.03 13:22)
А как???
Если вы имеете в виду различные DuplicateHandle"ы, то это актуально только для отношений между дочерним и родительским процессами. В общем случае я че-то не представляю, как это сделать. Поясните, please...


 
R4D][   (2003-07-04 11:53) [10]

>> Zero Ice (04.07.03 11:25)
>>... (у каждой винды она фиксированна)...

Не подкинешь адресок для XP... А еще лучше какую-нибудь статейку на эту тему...
Да и еще - откуда вы узнаете, что полученный хэндл - это и есть тот самый фаил(???брутфорс??? :))) ). Не легче ли(да и совместимость будет больше) просто перебором все числа от 0 до Integer"авского предела??? Знаешь типа:
for x:=0 to 65536 do
begin
z:=ReadFile(x,Buf);
if z<>0 then MessageBox(0, Buf, "aaa", MB_OK);
end;


Тока в чужом процессе.


 
Игорь Шевченко   (2003-07-04 12:13) [11]

В NT этим занимается Server manager - значит, есть способ


 
R4D][   (2003-07-04 12:20) [12]

Че енто за сервер менеджер такой :). В XP такой в наличии? А то SoftIce и IDA - наши лучшие друзья!


 
Zero Ice   (2003-07-05 12:47) [13]

2 R4D][
Нет, адреса не знаю, хотя при желании его можно найти (дизасм SetHandleInformation).
А почитать можно у Д. Рихтера (глава 3). Вот отрывок (надеюсь его не за"del"ят из-за объёма):
Все функции, создающие объекты ядра, возвращают описатели, которые привязаны к конкретному процессу и могут быть использованы в любом потоке данного процесса Значение описателя представляет собой индекс в таблице описателей, принадлежащей процессу, и таким образом идентифицирует место, где хранится информация, связанная с объектом ядра. Вот поэтому при отладке своего приложения и просмотре фактического значения описателя объекта ядра Вы и видите такие малые величины: 1, 2 и т. д. Но помните, что физическое содержимое описателей не задокументировано и может быть изменено. Кстати, в Windows 2000 это значение определяет, по сути, не индекс, а скорее байтовое смещение нужной записи от начала таблицы описателей.

Всякий раз, когда Вы вызываете функцию, принимающую описатель объекта ядра как аргумент, Вы передаете ей значение, возвращенное одной из Create-функций. При этом функция смотрит в таблицу описателей, принадлежащую Вашему процессу, и считывает адрес нужного объекта ядра.



 
R4D][   (2003-07-05 13:23) [14]

Это-то я знаю, но зачем эта таблица нужна если нам не требуется узнать адрес объекта ядра. Мы же не пишем свою Create функцию. Нам всего-то и нужно узнать этот самый индекс(байтовое смещение). Другое дело, если хочется узнать, что из себя представляет объект ядра. Но это несколько другая тема, хотя и не менее интересная.


 
TankMan   (2003-07-10 03:09) [15]

ааа... задача не облегчится, если нужно лишь узнать, что за программа открыла файл и "убить" ее?...


 
Германн   (2003-07-10 03:56) [16]

Имхо, общая (главная) идеология развития операционных систем состоит в "недопущении" пользователя к конкретным файлам и каталогам. И сие есть "правильно" и "грамотно".
А вот порядок действий, когда "злоумышленник" уже проник в дом и пытается вынести "некий золотой запас" - трудно алгоритмизуем.


 
R4D][   (2003-07-10 13:35) [17]

Хм... Насчет "правильно" и "грамотно" можно поспорить - есть задачи, которые ТРЕБУЮТ доступ к ресурсам(в широком смысле слова) другого приложения. Именно поэтому Microsoft и оставляет официальные и неофицальные "лазейки". Причем эти самые задачи порой требуются решить не только злоумышленнику, но и системному администратору, а иногда даже рядовому пользователю.


 
TankMan   (2003-07-13 01:53) [18]

Так и всеже? Насколько я понял, человеку задавшему этот вопрос, нужно было найти программу, которая открыла определенный файл, найти хендл потока и закрыть этот файл? (или я что-то не так понял? )... а вообще, всетаки реально просто найти, что за приложение открыло файл?... а дальше уж и делать с этим приложением все что угодно... у меня например, очень часто бывает, что я не могу удалить какой-то файл, из-за того, что он открыт каким-то приложением, а каким не ясно... вот я и думаю, возможно ли это? и насколько легко это узнать?


 
Ihor Osov'yak   (2003-07-13 04:08) [19]

2 TankMan

> вообще, всетаки реально просто найти, что за приложение открыло файл?.

реально. www.sysinternals.com, утилитка называeтся или thandle, или handleview, одним словом - handle есть в названии..

Зы - с Шевченко поспорил, что написание аналога этой утилиты не есть особенная проблема. Но вот все руки не доходят, текучка :-(.. Но надежды не теряю.


 
R4D][   (2003-07-13 16:23) [20]

А я "закрыватель фаилов" почти написал - вот только psapi.dll из sp1 заберу для GetMappedFileName() и все будет готово :). Кому интересно мыльте мне.


 
TankMan   (2003-07-19 03:34) [21]

>>Ihor Osov"yak
... на счет ЗЫ... кажется ВЫ мне говорили написать вам на мыло, чтобы напомнить, сделать такую прожку... а на сисинтерналс.ком ... насколько я помню прожка работает только под НТ... что не есть гуд для меня...



Страницы: 1 вся ветка

Форум: "Система";
Текущий архив: 2003.10.02;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.01 c
14-4058
DeMoN-777
2003-09-14 18:25
2003.10.02
Проблемка с 1С


1-3896
ALena
2003-09-22 13:13
2003.10.02
Общие вопросы


6-4034
iPasha
2003-08-05 15:47
2003.10.02
Кодировка KOI-8R в Indy


14-4121
Viktor Kushnir
2003-09-12 15:36
2003.10.02
Переустановка Винды


14-4067
tria
2003-09-15 13:16
2003.10.02
Собираюсь перейти с D5 на D7. А стоит ли?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский