Форум: "Система";
Текущий архив: 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.018 c