Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
[C++] Недостаточно информации 15.02.06 12:18 Число просмотров: 2711
Автор: amirul <Serge> Статус: The Elderman
|
> вобщём задача такая нужно удалить фаил который используется > другим процессом > сответствино сделать это можно при перезагруске... вот > только вопрос как ? > есть стандартный метод 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) Ну и последний - прописаться в автостарт к пользователю. Удаление после логина - самый примитивный и ограниченный в возможностях способ.
|
|
|