Если требуется именно автоматизм, а не кракинг, читай тело письма. В большинстве случаев срабатывает.19.02.06 11:03 Число просмотров: 2482 Автор: kstati <Евгений Борисов> Статус: Elderman Отредактировано 19.02.06 11:06 Количество правок: 1
вобщём задача такая нужно удалить фаил который используется другим процессом
сответствино сделать это можно при перезагруске... вот только вопрос как ?
есть стандартный метод MoveFileEx MOVEFILE_DELAY_UNTIL_REBOOT
но он мне не подходит :-( у кого нибудь есть есть ещё идеи ?
> вобщём задача такая нужно удалить фаил который используется > другим процессом > сответствино сделать это можно при перезагруске... вот > только вопрос как ? > есть стандартный метод 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 большое спосибо за грамотный ответ17.02.06 02:43 Автор: 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 :-)
Тогда остается либо драйвер либо native-приложение17.02.06 12:00 Автор: amirul <Serge> Статус: The Elderman
> 1 MoveFileEx нельзя испольховать потому что он всеголиш > добовляет записть в > HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session > Manager\PendingFileRenameOperations > а этот ключь реестра контролирует тодже процес что и фаил > который надо грохнуть
А как контроллирует?
Можно ли обратиться к этому ключу например через "\\.\GLOBALROOT\REGISTRY\MACHINE\System\ControlSet001\Session Manager"?
Или создать в директории объектов симлинк на \REGISTRY и обратиться через свой симлинк. Большинство программ, контроллирующих доступ к файлам/ключам по имени очень плохо работают с симлинками.
> 2 в недрится в процесс который его контролирует тоже нельзя > потомушчто он устанавливает драйвер перехвата api и > контролирует OpenProcess и OpenThread > сответствино и у бить проццес нельзя не зависимо от > привелегий
Если так, то да.
> так что похоже придётся посать драйвер :-(
Можно еще и native-приложение для BootExecute
> PS речь кстати идёт о сервисе ZoneAlarm :-)
Обратится можно :-)17.02.06 18:54 Автор: Tamas Статус: Member
> > 1 MoveFileEx нельзя испольховать потому что он > всеголиш > > добовляет записть в > > > HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session > > Manager\PendingFileRenameOperations > > а этот ключь реестра контролирует тодже процес что и > фаил > > который надо грохнуть > > А как контроллирует? > Можно ли обратиться к этому ключу например через > "\\.\GLOBALROOT\REGISTRY\MACHINE\System\ControlSet001\Sessi > on Manager"? > > Или так: > > "\\.\GLOBALROOT\??\GLOBALROOT\REGISTRY\MACHINE\System\Contr > olSet001\Session Manager" >
Обратится можно :-)
сиё чюдо считавает текушие значение параметра
с определённым интервалом... примерно 500 ms
и если он изменяется в поредённою строну меняет его обратно
> Или создать в директории объектов симлинк на \REGISTRY и > обратиться через свой симлинк. Большинство программ, > контроллирующих доступ к файлам/ключам по имени очень плохо > работают с симлинками. > > > 2 в недрится в процесс который его контролирует тоже > нельзя > > потомушчто он устанавливает драйвер перехвата api > и > > контролирует OpenProcess и OpenThread > > сответствино и у бить проццес нельзя не зависимо от > > привелегий > > Если так, то да. > > > так что похоже придётся посать драйвер :-( > > Можно еще и native-приложение для BootExecute > > > PS речь кстати идёт о сервисе ZoneAlarm :-)
Иногда замечал одну фишку в виндах, которая мне напомнила о...15.02.06 11:41 Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
> вобщём задача такая нужно удалить фаил который используется > другим процессом > сответствино сделать это можно при перезагруске... вот > только вопрос как ?
Иногда замечал одну фишку в виндах, которая мне напомнила о старых добрых операционках.
Фишка в том, что команда удаления завершается успешно, но файл не удаляется. Последующие команды на удаление завершаются с ошибкой. Файл удаляется автоматически, как только заканчивают работу с ним все программы. Пока файл остается в состоянии "помечен на удаление" другие проги не могут получить к нему доступ чтоб что-то сделать.
Эта фишка работает не всегда. Естественно возникает вопрос: "Не глюк ли это у меня и действительно ли это так" и "почему это работает не всегда"?
Если воспользоваться этой фичей, то можно просто попытаться удалить файл. Прога, работающая с ним будет продолжать работать нормально. Все процессы завершаться при завершении работы системы (перезагрузке). Файл должен автоматом удалиться на этапе остановки системы.
не на этапе остановки а на этапе загруски и фича эта...17.02.06 03:12 Автор: Tamas Статус: Member
> Если воспользоваться этой фичей, то можно просто попытаться > удалить файл. Прога, работающая с ним будет продолжать > работать нормально. Все процессы завершаться при завершении > работы системы (перезагрузке). Файл должен автоматом > удалиться на этапе остановки системы.
не на этапе остановки а на этапе загруски и фича эта называется MoveFileEx
Нет. Я тоже сталкивался с этим.17.02.06 11:54 Автор: amirul <Serge> Статус: The Elderman
> не на этапе остановки а на этапе загруски и фича эта > называется MoveFileEx
И это не MoveFileEx
Операция удаления заканчивается (кажется с ошибкой), после чего удаляемый файл нормально энумерируется в каталоге, но при попытке открытия говорит, что такого файла уже нет. Через некоторое время (без всяких перезагрузок) файл пропадает (перестает энумерироваться)
Это movefileex с флагом movefile_write_through17.02.06 18:50 Автор: Tamas Статус: Member
> > не на этапе остановки а на этапе загруски и фича эта > > называется MoveFileEx > > И это не MoveFileEx > Операция удаления заканчивается (кажется с ошибкой), после > чего удаляемый файл нормально энумерируется в каталоге, но > при попытке открытия говорит, что такого файла уже нет. > Через некоторое время (без всяких перезагрузок) файл > пропадает (перестает энумерироваться)
Это MoveFileEx с флагом MOVEFILE_WRITE_THROUGH
хотя я могу ошибатся
Нечто такое наблюдается если открыть файл с file_flag_dele_on_close17.02.06 13:55 Автор: Killer{R} <Dmitry> Статус: Elderman
> Если просто удалить, то войди в сэйв мод и потри, или > перезагрузись с дискеты.
не много не втему всё это дожно происходить в автоматеческом режиме... делать это дожно моё приложение... но я не имею физического доступа к этому компу так что с дискеты не загрузишся :-)
Если требуется именно автоматизм, а не кракинг, читай тело письма. В большинстве случаев срабатывает.19.02.06 11:03 Автор: kstati <Евгений Борисов> Статус: Elderman Отредактировано 19.02.06 11:06 Количество правок: 1