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

Вниз

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

 
Костя   (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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.015 c
1-3823
evgeny_krasilov
2003-09-19 15:46
2003.10.02
TDBGrid, позиция указателя и нужная запись


1-3906
killer
2003-09-20 19:47
2003.10.02
Как из Ini-файла считать поток?


1-3941
Александр из Минска
2003-09-17 23:19
2003.10.02
Удаление файлов в <B>Windows NT</B>


1-3819
AlexMan
2003-09-22 14:24
2003.10.02
ToolBar


1-3848
HarryP
2003-09-19 11:28
2003.10.02
Тип файла по его содержимому