Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
1 большое спосибо за грамотный ответ 17.02.06 02:43 Число просмотров: 2689
Автор: Tamas Статус: Member
|
> > вобщём задача такая нужно удалить фаил который > используется > > другим процессом > > сответствино сделать это можно при перезагруске... вот > > только вопрос как ? > > есть стандартный метод MoveFileEx > > MOVEFILE_DELAY_UNTIL_REBOOT > > но он мне не подходит :-( у кого нибудь есть есть ещё > идеи > > ? > > Если бы прояснить почему не подходит такой метод, то искать > решение было бы проще. > > > PS к сожелению грохнуть процес который его использует > > нельзя :-((( > > При ОЧЕНЬ большом желании грохнуть файл можно и без > перезагрузки. Например, прямым доступом к диску или закрыть > хендл на этот файл в процессе, который его держит (и то и > то делается легко в третьем кольце, нужны лишь привилегии). > Оба способа могут привести к нестабильной работе этого > процесса (а первый может завалить еще и винду или файловую > систему, ибо метаданные закешированы, а при прямом доступе > к диску нарушится консистентность кеша). Можно также > внедриться в процесс, который держит файл и, если при > открытии был указан GENERIC_WRITE, GENERIC_ALL или нечто > подобное, то удалить этот файл через хендл этого же > процесса. > > В нулевом кольце пространство для маневра больше: во-первых > можно сделать все вышеперечисленное (только внедряться > никуда не нужно), во-вторых можно на лету заменить объект > на который указывает открытый хендл на новый > (свежесозданный файл), а старый удалить > > Это первое что пришло в голову на тему удаления отрытого > файла без перезагрузки. > > С перезагрузкой все еще легче. > 1) Совершенно непонятно почему нельзя использовать > MoveFileEx. Удаление происходит в первом созданном > пользовательском процессе - smss.exe (Session Manager). В > этот момент нет ни одного открытого хендла на файлы. > > 2) Удаление можно произвести в специальном драйвере, > написанном специально для этого. Удаление произойдет до > создания первого пользовательского процесса. В этот момент > также нет ни одного открытого хендла на файлы. > > 3) Можно написать Native приложение, которое будет удалять > файл и прописать его в BootExecute. Удаление произойдет в > пользовательском процессе, запущенном из smss (в > зависимости от номера строки в значении BootExecute это > будет второй, третий и т.д. процесс). Открытых хендлов все > еще нет и удаление чего угодно совершенно безопасно. > > 4) Можно написать системный сервис пользовательского режима > (или использовать специальную заворачивалку обычных > exe-шников в сервисы). Удаление произойдет после создания > кучи пользовательских процессов, но до логина. Будет > открыто уже до фига файлов и не все получится удалить > > 5) Ну и последний - прописаться в автостарт к пользователю. > Удаление после логина - самый примитивный и ограниченный в > возможностях способ.
1 большое спосибо за грамотный ответ
1 MoveFileEx нельзя испольховать потому что он всеголиш добовляет записть в HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations
а этот ключь реестра контролирует тодже процес что и фаил который надо грохнуть
2 в недрится в процесс который его контролирует тоже нельзя
потомушчто он устанавливает драйвер перехвата api и контролирует OpenProcess и OpenThread
сответствино и у бить проццес нельзя не зависимо от привелегий
3 процес который его контралирует евляется сервисом... ивыполняется от имини SYSTEM
4 я согласен примой доступ к диску это уж слишком грубо
так что похоже придётся посать драйвер :-(
PS речь кстати идёт о сервисе ZoneAlarm :-)
|
|
|