Проводник Windows отслеживает изменения каталога сложным способом?

#winapi #explorer #readdirectorychangesw

#winapi #проводник #readdirectorychangesw

Вопрос:

У меня есть изолированная система, перенаправляющая изменения файлов путем подключения API файловой системы Ntxxx. Интересно, что если я перемещаю файлы в Блокнот-> Файл / Открыть диалоговое окно в моей изолированной среде, например, из desktopa.txt чтобы desktopba.txt , в a.txt файл на реальном рабочем столе просто исчезает, и он возвращается после того, как я обновляю реальный рабочий стол, нажав клавишу F5. на самом деле никаких изменений в папке рабочего стола вообще нет,потому что все изменения направлены. Я знаю, что большинство приложений используют API, такие как ReadDirectoryChanges, для отслеживания изменений, но, по-видимому, Explorer делает что-то другое. Я пробовал такие инструменты, как https://directorymonitor.com /, они не наблюдали никаких изменений на рабочем столе. Я предполагаю, что SHFileOperation каким-то образом внутренне взаимодействует с explorer, но кто знает подробности и как я могу предотвратить это уведомление? Для пользователей действительно странно видеть, что файл исчезает, хотя на самом деле он все еще там.

Комментарии:

1. learn.microsoft.com/en-us/windows/win32/api/shlobj_core/…

2. Не уверен, что я понимаю, что вы видите. Но оболочка также использует learn.microsoft.com/en-us/windows/win32/api/shlobj_core /… это для получения уведомлений об изменениях. Любая папка в пространстве имен может уведомить любого, кто прослушивает эти события, о том, что что-то изменилось, даже если на самом деле это не изменилось. Например, если я уведомлю explorer, что элемент был удален, он будет удален визуально и появится при следующем обновлении

3. Но я не вижу SHChangeNotify, вызываемого в windbg

4. нет, я хочу знать, что получает noficiation explorer.

5. хорошо, это определенно не SHChangeXXX, я заблокировал все вызовы SHChangeNotifyRegister и SHChangeNotifyRegisterThread в проводнике, но он все равно исчезает!!!

Ответ №1:

windows вызывает windows_storage!SHChangeNotify вместо этого в shell32. Почему в Windows есть две копии одного и того же API, они разные?