Контекст для предотвращения XY Проблема: (Потому что там вполне может быть более простое решение)
Моя цель — отслеживать explorer.exe
Перемещение файлов, когда пользователь перетаскивает файлы (а также использует вырезку из буфера обмена и копирование). Я пытался решить эту проблему с помощью расширения Windows Shell, однако интерфейсы, которые я реализовал, никогда не срабатывали. Я последовал за этот руководство от CodeProject, которое работало красиво. Тем не менее, когда я реализовал IFileOperation интерфейс, ни одна из моих функций никогда не вызывалась explorer.exe
во время этих пользовательских операций (есть ли другое место, которое я должен добавить к *.rgs
файл из учебника? Некоторое конкретное место регистрации для интерфейса IFileOperation, например, txtfile, было для контекстного меню?).
В ответ написал файл DLL, который перехватывает ntdll.dll
вызовы функций с использованием mhook
а также этот другой учебник CodeProject, который все происходит в течение DLLMain
, Вместо использования AppInit
запись в реестре, как в учебнике, я использовал сторонняя программа для инъекции DLL заставить explorer.exe
загрузить мою DLL. Фильтруя NtReadFile
, NtWriteFile
, а также NtSetInformationFile
звонки, я могу различать операции перемещения и копирования. Это сработало довольно хорошо!
Проблема:
Инъекция кода, тем не менее, неудачна, поэтому я вернулся и слил DLLMain
с первым руководством, так что мой код перехвата находится внутри расширения оболочки. когда explorer.exe
загружает расширение оболочки, мой код перехвата также выполняется. Что ж, explorer.exe
умный и загружает только библиотеки DLL, как это необходимо. Чтобы мой перехватывавший код начал работать, мне нужно щелкнуть правой кнопкой мыши текстовый файл, чтобы вызвать код расширения оболочки исходного руководства, и с этого момента DLL, похоже, с тех пор остается загруженной.
Вопрос:
Есть ли интерфейс расширения оболочки, который я могу псевдо реализовать, чтобы получить explorer.exe
загрузить расширение оболочки при запуске и никогда не выгружать его? Есть ли более элегантное решение для того, что я делаю?
Редактировать: есть похожий сообщение относительно BHO, который загружает как explorer.exe
а также iexplorer.exe
при запуске. Я думал, что это была просто вещь IE, когда я читал это, но я был неправ. Существует дополнительный ключ (NoExplorer), который вы можете написать, чтобы предотвратить explorer.exe
от загрузки, но есть ли подобная команда, чтобы предотвратить загрузку IE? Все мои поиски продолжают вызывать NoExplorer.
Редактировать: через немного эмпирических экспериментов, ICopyHook Интерфейс настолько близок к постоянному расширению оболочки, насколько это возможно. Причина, по которой IFileOperation не вызывался, была в том, что explorer.exe
не вызывает его, а скорее исходит от других программ, запрашивающих оболочку выполнить определенную операцию под этим интерфейсом. В любом случае, я реализовал довольно пустое расширение оболочки ICopyHook, и оно, похоже, загружается в explorer.exe
вскоре после запуска, хотя это очень недетерминировано. Если у кого-то есть лучшее решение, пожалуйста, поделитесь.
There is an additional key (NoExplorer) you can write to prevent explorer.exe from loading it, but is there a similar command to prevent IE from loading it?
Просто вернитесь ЛОЖНЫЙ в DllMain DLL_PROCESS_ATTACH когда расширение вашей оболочки загружено Internet Explorer.
Других решений пока нет …