Отладка на кофейной гуще
May 22, 2009 · CommentsОтладкаUACWindows
При определённой сноровке, можно отлаживать код прямо из любимого почтового клиента. На днях пришло письмо с вопросом. Некоторое приложение, будучи установленным в каталог отличный от “Program Files”, при запуске вызывало появление окна UAC с требованием повысить привилегии. Приложение работало нормально, в случае, если оно было установлено в “Program Files”. Как такое может быть?
Надо сказать, что разработчики подсистем Windows, которые обеспечивают обратную совместимость, вплотную приблизились к созданию искусственного интеллекта. :-) Windows умеет распознавать и, что самое главное, исправлять на ходу многие некорректные с точки зрения системы действия программ. Заметная часть этого «интеллекта» задействована для обеспечения совместимости с приложениями, которые не умеют работать без прав локального администратора, т.е. при включенном UAC.
Предположение, что программа делает что-то нехорошее, - пытается создать файл в «Program Files» например, вскоре частично подтвердилось. Автор приложения обнаружил, что оно пытается создать ключ реестра “HKEY_CLASSES_ROOT.foobar”. Интересная особенность всех ключей в ветке “HKEY_CLASSES_ROOT” состоит в том, что эти ключи … не существуют. “HKEY_CLASSES_ROOT” – это виртуальный ключ, объединение двух других ключей: “HKEY_LOCAL_MACHINE\Software\Classes” и “HKEY_CURRENT_USER\Software\Classes”. Соответственно попытка создать ключ “HKEY_CLASSES_ROOT.foobar” может, при определённых условиях, быть интерпретирована как попытка создания “HKEY_LOCAL_MACHINE\Software\Classes.foobar”, что уже попахивает криминалом.
Далее, существует такая штука как LUA Virtualization. Если коротко, то это механизм как бы позволяющий приложению писать в ключи и каталоги, защищенные от записи. На самом деле, система на лету подменяет оригинальный ключ доступной на запись копией, локальной для этого конкретного приложения.
Соединив эти три кусочка информации, можно примерно догадаться что произошло. Хотя точно сказать, что именно произошло, я не берусь. Скорее всего, программа попыталась создать “HKEY_LOCAL_MACHINE\Software\Classes.foobar”. Эта попытка была перехвачена механизмом LUA Virtualization. В случае, когда исполняемый файл находился в “Program Files”, механизм виртуализации делал свое черное дело, подсовывая приложению локальную копию ключа. В другом случае виртуализация не срабатывала, приводя к тому, что запрещенная операция перехватывалась уже логикой активации UAC.