Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как насильно закрыть файл


Страницы:   1 2

Костя ©   (2003-07-03 08:29:00) 

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


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

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


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

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


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

2 TankMan

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

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

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


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

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


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

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


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

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


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

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


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

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


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

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

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


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

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


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

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


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

>> 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;


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


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

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


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

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


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

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

> Возможно.

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


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

R4D][ (03.07.03 12:28)


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


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


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

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


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

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


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

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


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

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо