|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
01.11.2011, 14:34 | #1 |
Пользователь
Регистрация: 01.11.2011
Сообщений: 13
|
Отлов удаления файлов в Windows
Здравствуйте народ!
При удалении файла в виндовс вылазиет окошко для подтверждения удаления "Вы уверены, что хотите удалить файл?". Мне нужно это окошко заменить своей формой. Возможно так же еще запретить удаление. Всвязи с этим нужно как-то отлавливать сам процесс удаления. У меня Wibdows XP SP3. Пробовал делать хук на DeleteFile() и ShFileOperation(). Я в хуках не разбираюсь особо, но нашел как это делается: http://forum.sources.ru/index.php?sh...5&view=showall Так вот, если DeleteFile() или ShFileOperation() писать в своей программе, то они замечательно отлавливаются, но удаление файлов в эксплорере проходит на ура и хуки не работают. Так вот вопрос: как поймать процесс или событие удаления файла в эксплорере? Просто если DeleteFile() или ShFileOperation() не ловятся, может есть еще какие команды по удалению файлов? есть такая штука ReadDirectoryChanges, которая следит за папкой, но это слишком локально. Так же в библиотеке компонентов RX есть RxFolderMonitor, но это тоже слежение за папкой и это не то. |
01.11.2011, 15:28 | #2 |
Форумчанин
Регистрация: 05.10.2011
Сообщений: 368
|
надо перехватывать NtDeleteFile из ntdll.dll. функции DeleteFile и ShFileOperation обращаются к ней
Не стоит будить спящего Бога! (с) Меланхолия Харухи Судзумии
|
03.11.2011, 09:53 | #3 |
Пользователь
Регистрация: 01.11.2011
Сообщений: 13
|
Отлов удаления файлов в Windows
Почитал в инете, из ntdll.dll перехватывают с помощью сплайсинга API. Нашел как это делают:
http://ms-rem.narod.ru/hook/ApiHook1/apihook.htm сделал аналогично подмену NtDeleteFile, но ничего не происходит. Файлы как удалялись так и удаляются. Там на этом сайте есть пример перехвата MessageBox методом сплайсинга, он у меня тоже не работает, точнее ничего не происходит. Может я делаю что не так? Или это как по-другому делается? Хотелось бы какой-нибудь рабочий примерчик что ли или мой код посмотреть. |
03.11.2011, 17:56 | #4 |
Форумчанин
Регистрация: 23.04.2009
Сообщений: 346
|
Есть довольно нелепое предположение, что NtDeleteFile вызывается уже несколько позже формы о подтверждении удаления файла, ну а вообще, она там не вызывается.
Нет, ну правда..
|
03.11.2011, 19:06 | #5 |
добрый няша
Старожил
Регистрация: 29.10.2006
Сообщений: 4,804
|
в любом случае всё сводится к NtDeleteFile
|
03.11.2011, 19:18 | #6 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
а вообще, никто не заметил что ТС нужно не перехват самого удаления, а именно перехватить форму?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
03.11.2011, 19:48 | #7 |
Форумчанин
Регистрация: 23.04.2009
Сообщений: 346
|
Да нет там никакого NtDeleteFile. Приаттачтесь к эксплореру, поставьте бряк на данную функцию, да удалите что либо. Как там чего происходит разбираться лень, по крайней мере сегодня.
Нет, ну правда..
|
03.11.2011, 20:03 | #8 |
добрый няша
Старожил
Регистрация: 29.10.2006
Сообщений: 4,804
|
посмотрел в отладчике что делает функция kernel32.DeleteFileW : NtOpenFile -> NtSetInformationFile
в данном случае лучший вариант это перехват NtOpenFile и запрет если файл хотят открыть с доступом на запись Последний раз редактировалось rpy3uH; 03.11.2011 в 20:05. |
05.11.2011, 20:35 | #9 |
Форумчанин
Регистрация: 23.04.2009
Сообщений: 346
|
Диалог удаления файлов в эксплорере вызывается функцией DialogBoxParamW, ресурсы диалога берутся из библиотеки shell32.dll номера диалогов в ресурсах, в ХР: 1011 -удаление файла,1012 - удаление папки, 1013 - удаление группы объектов
Можно проверять по строкам в ресурсах, вероятно данные идентификаторы могут разниться от версии shell32. Собственно сам перехват тривиален - ставим перехват на вышеобозначенную DialogBoxParamW, проверяем хендл модуля с ресурсами, идентификатор ресурса, если наш клиент, то вызываем её в обработчике (или вызываем свою форму вместо данной, почистив параметры DialogBoxParamW) и изменяем/оставляем результат, он может быть двух видов как и у MessageBox с параметром MB_YESNO, то есть: #define IDYES 6 ; был нажат баттон "Да" #define IDNO 7 ; был нажат баттон "Нет"
Нет, ну правда..
|
05.11.2011, 20:41 | #10 | |
Форумчанин
Регистрация: 05.10.2011
Сообщений: 368
|
Цитата:
а так всё намного проще становится, можно через стандартный механизм хуков (WH_CBT)
Не стоит будить спящего Бога! (с) Меланхолия Харухи Судзумии
Последний раз редактировалось haruhi; 05.11.2011 в 20:43. |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Отмена удаления в Windows | artemavd | Общие вопросы Delphi | 8 | 30.11.2010 13:43 |
Защита файлов от удаления (assembler) | Omega1 | Помощь студентам | 16 | 17.11.2010 16:14 |
Программа для удаления файлов | 1malder1 | Софт | 10 | 29.05.2010 15:38 |
Защита файлов от удаления | Viteef | Свободное общение | 5 | 15.06.2007 22:44 |
Защита файлов от удаления | Viteef | Общие вопросы Delphi | 10 | 02.06.2007 07:40 |