Перехват системных вызовов с помощью detours.lib
От: shadow_shaman  
Дата: 17.01.11 21:00
Оценка:
Добрый день. Делаю проект по замене стандартного диалога открытия и сохранения файлов в openoffice своим диалогом. (Смысл в том, чтобы разрешать пользователю сохранять файлы и открывать их только из определенных папок). Для этого осуществляю перехват функций SHBrowseForFolder, GetOpenFileName и GetSaveFileName при вызове их из openoffice с помощью библиотеки detours.lib от microsoft. В второй версии openoffice перехват работает, и я заменяю диалог открытия своим, с только разрешенными папками. В третьей версии openoffice моя библиотека уже не работает. Почему? Может там другие функции надо перехватывать?
Re: Перехват системных вызовов с помощью detours.lib
От: EreTIk EreTIk's Box
Дата: 18.01.11 08:25
Оценка:
_>... Почему? Может там другие функции надо перехватывать?
Вполне может быть. И это можно проверить любым отладчиком:


Такой функционал есть и в Process Explorer(для процесса: Properties->Threads), если правильно настроены пути к символам (переменная окружения _NT_SYMBOL_PATH), то имя вызываемой API-функции будет в стеке вызовов одно из нитей.

_> Смысл в том, чтобы разрешать пользователю сохранять файлы и открывать их только из определенных папок

Решение, мягко говоря, не самое лучше: проблемы могут быть с каждой новой версией или установленным софтом конечного пользователя
Re: Перехват системных вызовов с помощью detours.lib
От: ononim  
Дата: 18.01.11 09:07
Оценка:
У многих версий MSOffice используется самописные велосипеды для open/save диалогов, которые нигде не описаны и не экспортируются
Кстати некоторые офисы юзают при возможности IFileSaveDialog/IFileOpenDialog так что имеет смысл посмотреть что там ходит через CoCreateInstance(Ex)
Как много веселых ребят, и все делают велосипед...
Re: Перехват системных вызовов с помощью detours.lib
От: Геннадий Майко США  
Дата: 18.01.11 10:40
Оценка: +1
Здравствуйте, shadow_shaman,

_>Добрый день. Делаю проект по замене стандартного диалога открытия и сохранения файлов в openoffice своим диалогом. (Смысл в том, чтобы разрешать пользователю сохранять файлы и открывать их только из определенных папок).

--
Почему бы это не сделать стандатными средствами Windows, раздав разным пользователям нужные привелегии/права?

C уважением,
Геннадий Майко.
Re[2]: Перехват системных вызовов с помощью detours.lib
От: shadow_shaman  
Дата: 18.01.11 18:48
Оценка:
Здравствуйте, EreTIk, Вы писали:

_>>... Почему? Может там другие функции надо перехватывать?

ETI>Вполне может быть. И это можно проверить любым отладчиком:

ETI>

ETI>Такой функционал есть и в Process Explorer(для процесса: Properties->Threads), если правильно настроены пути к символам (переменная окружения _NT_SYMBOL_PATH), то имя вызываемой API-функции будет в стеке вызовов одно из нитей.


_>> Смысл в том, чтобы разрешать пользователю сохранять файлы и открывать их только из определенных папок

ETI>Решение, мягко говоря, не самое лучше: проблемы могут быть с каждой новой версией или установленным софтом конечного пользователя

Подсоединился в студии к openoffice writer 2 версии и увидел здесь вот такой стек вызовов. Но где там функции GetOpenFileName или SHBrowseForFolder?
Re[2]: Перехват системных вызовов с помощью detours.lib
От: shadow_shaman  
Дата: 18.01.11 19:00
Оценка:
Здравствуйте, 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
От: EreTIk EreTIk's Box
Дата: 18.01.11 22:23
Оценка:
_>Подсоединился в студии к openoffice writer 2 версии и увидел здесь вот такой стек вызовов. Но где там функции GetOpenFileName или SHBrowseForFolder?
Остальные нити? Что в них? Если эта нить единственная(или остальные "мирно спят"), то склоняюсь к версии ononim'а — вероятно, что диалог реализован внутри бинарника openoffice.
Re[4]: Перехват системных вызовов с помощью detours.lib
От: shadow_shaman  
Дата: 19.01.11 20:51
Оценка:
Здравствуйте, 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)
С ней как разобраться?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.