Добрый день. Делаю проект по замене стандартного диалога открытия и сохранения файлов в openoffice своим диалогом. (Смысл в том, чтобы разрешать пользователю сохранять файлы и открывать их только из определенных папок). Для этого осуществляю перехват функций SHBrowseForFolder, GetOpenFileName и GetSaveFileName при вызове их из openoffice с помощью библиотеки detours.lib от microsoft. В второй версии openoffice перехват работает, и я заменяю диалог открытия своим, с только разрешенными папками. В третьей версии openoffice моя библиотека уже не работает. Почему? Может там другие функции надо перехватывать?
Re: Перехват системных вызовов с помощью detours.lib
_>... Почему? Может там другие функции надо перехватывать?
Вполне может быть. И это можно проверить любым отладчиком:
вызываем диалог сохранения файла
attach'имся отладчиком к работающему процессу и останавливаем его исполнение
смотрим call-stack нити, выводящей диалог
Такой функционал есть и в Process Explorer(для процесса: Properties->Threads), если правильно настроены пути к символам (переменная окружения _NT_SYMBOL_PATH), то имя вызываемой API-функции будет в стеке вызовов одно из нитей.
_> Смысл в том, чтобы разрешать пользователю сохранять файлы и открывать их только из определенных папок
Решение, мягко говоря, не самое лучше: проблемы могут быть с каждой новой версией или установленным софтом конечного пользователя
Re: Перехват системных вызовов с помощью detours.lib
У многих версий MSOffice используется самописные велосипеды для open/save диалогов, которые нигде не описаны и не экспортируются
Кстати некоторые офисы юзают при возможности IFileSaveDialog/IFileOpenDialog так что имеет смысл посмотреть что там ходит через CoCreateInstance(Ex)
Как много веселых ребят, и все делают велосипед...
Re: Перехват системных вызовов с помощью detours.lib
Здравствуйте, shadow_shaman,
_>Добрый день. Делаю проект по замене стандартного диалога открытия и сохранения файлов в openoffice своим диалогом. (Смысл в том, чтобы разрешать пользователю сохранять файлы и открывать их только из определенных папок).
--
Почему бы это не сделать стандатными средствами Windows, раздав разным пользователям нужные привелегии/права?
C уважением,
Геннадий Майко.
Re[2]: Перехват системных вызовов с помощью detours.lib
Здравствуйте, EreTIk, Вы писали:
_>>... Почему? Может там другие функции надо перехватывать? ETI>Вполне может быть. И это можно проверить любым отладчиком:
ETI>
ETI>вызываем диалог сохранения файла ETI>attach'имся отладчиком к работающему процессу и останавливаем его исполнение ETI>смотрим call-stack нити, выводящей диалог ETI>
ETI>Такой функционал есть и в Process Explorer(для процесса: Properties->Threads), если правильно настроены пути к символам (переменная окружения _NT_SYMBOL_PATH), то имя вызываемой API-функции будет в стеке вызовов одно из нитей.
_>> Смысл в том, чтобы разрешать пользователю сохранять файлы и открывать их только из определенных папок ETI>Решение, мягко говоря, не самое лучше: проблемы могут быть с каждой новой версией или установленным софтом конечного пользователя
Подсоединился в студии к openoffice writer 2 версии и увидел здесь вот такой стек вызовов. Но где там функции GetOpenFileName или SHBrowseForFolder?
Re[2]: Перехват системных вызовов с помощью detours.lib
Здравствуйте, ononim, Вы писали:
O>У многих версий MSOffice используется самописные велосипеды для open/save диалогов, которые нигде не описаны и не экспортируются O>Кстати некоторые офисы юзают при возможности IFileSaveDialog/IFileOpenDialog так что имеет смысл посмотреть что там ходит через CoCreateInstance(Ex)
Нашел в исходниках 3 версии openoffice(файл FPEntry3.cxx) такой код:
static Reference< XInterface > SAL_CALL createInstance(
const Reference< XMultiServiceFactory >& rServiceManager )
{
Reference< XInterface > xDlg;
bool bVista = IsWindowsVista();
if (bVista)
{
fprintf(stdout, "use special (vista) system file picker ...\n");
xDlg.set(
static_cast< XFilePicker2* >(
new ::fpicker::win32::vista::VistaFilePicker( rServiceManager ) ) );
}
else
{
fprintf(stdout, "use normal system file picker ...\n");
xDlg.set(
static_cast< XFilePicker2* >(
new CFilePicker( rServiceManager ) ) );
}
return xDlg;
}
во второй версии аналогичный код выглядит как:
static Reference< XInterface > SAL_CALL createInstance(
const Reference< XMultiServiceFactory >& rServiceManager )
{
return Reference< XInterface >(
static_cast< XFilePicker2* >(
new CFilePicker( rServiceManager ) ) );
}
По идее на системах vista и выше используется другой класс. Но я тестирую на xp sp3.
Может все равно на ней используется класс VistaFilePicker? И какие его методы тогда надо перехватывать?
Re[3]: Перехват системных вызовов с помощью detours.lib
_>Подсоединился в студии к openoffice writer 2 версии и увидел здесь вот такой стек вызовов. Но где там функции GetOpenFileName или SHBrowseForFolder?
Остальные нити? Что в них? Если эта нить единственная(или остальные "мирно спят"), то склоняюсь к версии ononim'а — вероятно, что диалог реализован внутри бинарника openoffice.
Re[4]: Перехват системных вызовов с помощью detours.lib
Здравствуйте, EreTIk, Вы писали:
ETI>Остальные нити? Что в них? Если эта нить единственная(или остальные "мирно спят"), то склоняюсь к версии ononim'а — вероятно, что диалог реализован внутри бинарника openoffice.
Я посмотрел, в третьей версии офиса на системах xp в итоге вызываются те же функции создания диалога, что и во второй версии: SHBrowseForFolder, GetOpenFileName и GetSaveFileName. Со второй версией офиса перехват работает корректно, и даже перехватываются вызовы этих функций из других программ при открытии диалога открытия/сохранения файла, а в 3 версии офиса(http://download.i-rs.ru/pub/openoffice/3.2.1/ru/OOo_3.2.1_Win_x86_install-wJRE_ru_infra.exe") почему-то не срабатывает. Как такое возможно?
Попробовал сделать ребилд с последней версией detours.lib, собранной из исходников с сайта microsoft, и получил ошибку:
Ошибка 5 error LNK2019: ссылка на неразрешенный внешний символ "struct HINSTANCE__ * __stdcall Detoured(void)" (?Detoured@@YGPAUHINSTANCE__@@XZ) в функции _DetourAttachEx@20 z:\HookDlg32\Detours21.lib(detours.obj)
С ней как разобраться?