Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
|
Иногда замечал одну фишку в виндах, которая мне напомнила о... 15.02.06 11:41 Число просмотров: 2424
Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
|
> вобщём задача такая нужно удалить фаил который используется > другим процессом > сответствино сделать это можно при перезагруске... вот > только вопрос как ?
Иногда замечал одну фишку в виндах, которая мне напомнила о старых добрых операционках.
Фишка в том, что команда удаления завершается успешно, но файл не удаляется. Последующие команды на удаление завершаются с ошибкой. Файл удаляется автоматически, как только заканчивают работу с ним все программы. Пока файл остается в состоянии "помечен на удаление" другие проги не могут получить к нему доступ чтоб что-то сделать.
Эта фишка работает не всегда. Естественно возникает вопрос: "Не глюк ли это у меня и действительно ли это так" и "почему это работает не всегда"?
Если воспользоваться этой фичей, то можно просто попытаться удалить файл. Прога, работающая с ним будет продолжать работать нормально. Все процессы завершаться при завершении работы системы (перезагрузке). Файл должен автоматом удалиться на этапе остановки системы.
|
<programming>
|
[C++] Delete File on reboot XP 15.02.06 02:37
Автор: Tamas Статус: Member
|
вобщём задача такая нужно удалить фаил который используется другим процессом
сответствино сделать это можно при перезагруске... вот только вопрос как ?
есть стандартный метод MoveFileEx MOVEFILE_DELAY_UNTIL_REBOOT
но он мне не подходит :-( у кого нибудь есть есть ещё идеи ?
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations
не предлагать... это тоже самое что и MoveFileEx MOVEFILE_DELAY_UNTIL_REBOOT
PS к сожелению грохнуть процес который его использует нельзя :-(((
|
|
[C++] Недостаточно информации 15.02.06 12:18
Автор: 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) Ну и последний - прописаться в автостарт к пользователю. Удаление после логина - самый примитивный и ограниченный в возможностях способ.
|
| |
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"?
Или так:
"\\.\GLOBALROOT\??\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_through 17.02.06 18:50
Автор: Tamas Статус: Member
|
> > не на этапе остановки а на этапе загруски и фича эта > > называется MoveFileEx > > И это не MoveFileEx > Операция удаления заканчивается (кажется с ошибкой), после > чего удаляемый файл нормально энумерируется в каталоге, но > при попытке открытия говорит, что такого файла уже нет. > Через некоторое время (без всяких перезагрузок) файл > пропадает (перестает энумерироваться)
Это MoveFileEx с флагом MOVEFILE_WRITE_THROUGH
хотя я могу ошибатся
|
| | | |
Нечто такое наблюдается если открыть файл с file_flag_dele_on_close 17.02.06 13:55
Автор: Killer{R} <Dmitry> Статус: Elderman
|
А вообще это имхо происки того что для удаления файлов винда как ни странно юзает ZwSetInformationFile а не ZwDeleteFile
|
| |
а можно пример на WinApi ? 17.02.06 02:44
Автор: Tamas Статус: Member
|
|
|
моя qrd 15.02.06 11:08
Автор: Killer{R} <Dmitry> Статус: Elderman Отредактировано 15.02.06 11:08 Количество правок: 1
|
ставит свой драйвер которым и удаляет. если указать ключик /r
http://www.killprog.com/qrd.zip
|
| |
а исходничек можно ? :-) 17.02.06 02:47
Автор: Tamas Статус: Member
|
|
|
[C++] Удалить или незаметно удалить? 15.02.06 05:01
Автор: Zef <Alloo Zef> Статус: Elderman
|
Если просто удалить, то войди в сэйв мод и потри, или перезагрузись с дискеты.
|
| |
не много не втему всё это дожно происходить в автоматеческом... 17.02.06 02:27
Автор: Tamas Статус: Member
|
> Если просто удалить, то войди в сэйв мод и потри, или > перезагрузись с дискеты.
не много не втему всё это дожно происходить в автоматеческом режиме... делать это дожно моё приложение... но я не имею физического доступа к этому компу так что с дискеты не загрузишся :-)
|
| | |
Если требуется именно автоматизм, а не кракинг, читай тело письма. В большинстве случаев срабатывает. 19.02.06 11:03
Автор: kstati <Евгений Борисов> Статус: Elderman Отредактировано 19.02.06 11:06 Количество правок: 1
|
1. Получаешь путь к скрипту:
path = [[["\HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\"]]]
path = path + "\/cleanup.bat";
2. Пишешь в него:
@echo off
SET target=Целевой файл в кавычках
if not exists %target% del %0
del %tagert%
%0
---
--------------
Например такая "тулза" очистки TEMP-а работает на ура. Хотя временные файлы используются другими программами cleartemp.cmd:
@echo off
del /q /s %TEMP%
del /q /s %WINDIR%\temp
rd /q /s %TEMP%
rd /q /s %WINDIR%\temp
mkdir %TEMP%
mkdir %WINDIR%\temp
---
|
|
|