Как получить уведомление о загрузке DLL, происходящей в моем программном обеспечении (только внутри моего собственного процесса) - PullRequest
2 голосов
/ 28 июня 2011

Прежде всего, немного предыстории:

Мое программное обеспечение, написанное на VC ++, использует некоторые большие сторонние библиотеки DLL, которые загружаются вместе с моим приложением.Эти библиотеки часто вызывают исключения с плавающей точкой во время их нормального хода работы, но они не сигнализируются как аппаратные исключения из-за конфигурации по умолчанию управляющего слова с плавающей точкой, чтобы маскировать эти исключения, и, следовательно, программа не падает из-за них.

Теперь проблема в том, что когда некоторые сторонние программы, такие как Zeallsoft Super Screen Capture , внедряют свои собственные библиотеки DLL, написанные на Borland C ++, они устанавливают слово управления FP для включения исключений с плавающей точкой и мое приложение.из-за этого происходит сбой.

Хотя основная проблема может быть связана со сторонней библиотекой и сторонним программным обеспечением, которое внедряет свои собственные библиотеки DLL, я все же хочу защитить свое программное обеспечение от сбоя из-за такой проблемы.

Решение, которое я могу придумать, заключается в том, чтобы получить уведомление о загрузке Dll, происходящей внутри моего процесса, и убедиться, что управляющее слово FP сбрасывается до значения по умолчанию после загрузки dll.

ИтакЯ смотрюg для простых и эффективных способов достижения этого.Есть ли какой-нибудь способ получить уведомление о загрузке Dll в моем процессе?Есть ли другой способ достичь того, что я хочу сделать?Единственное, в чем я хочу быть осторожным, это то, что метод должен работать на Win 2k и WinXP и выше, и, во-вторых, используемый метод не должен иметь такой природы, которая потенциально может вызвать эвристику вредоносных программ антивирусных / шпионских сканеров.

Ответы [ 2 ]

2 голосов
/ 29 июня 2011

Это можно сделать с помощью Windows API отладчика , в частности, вы хотите отслеживать событие отладки LOAD_DLL_DEBUG_EVENT. Следует отметить, что отладка самостоятельно опасна, так как может привести к блокировке приложения, а также означает, что вы не можете отладить ее в обычном режиме.

альтернатива - сделать Hot Patch ( лучшую бумагу на нем ) для всего процесса LoadLibraryEx, LoadLibraryA и LoadLibraryW и проверить прохождение dll через там.

основная проблема в этом заключается в том, что вам необходимо убедиться, что вы устанавливаете крюки / мониторы до всего остального (что вас волнует) в процессе загрузки, что может потребовать больше "черной магии" .. ..

0 голосов
/ 29 июня 2011

Ответственность за восстановление состояния FPU лежит на DLL.

Вы можете обнаружить проблему состояния FPU во время незапланированного исключения n и сбросить состояние FPU , но после этого dll может вести себя некорректно ( некоторые люди полагаются на исключения FPU , и есть причина, по которой они это делают).Вы можете уведомить пользователя о том, что в ваш процесс внедрено несовместимое dll, что приведет к непредсказуемому поведению.

Вы также можете отсканировать папку программных файлов ( или базу данных установщика Windows ) и предупредитьпользователю известна проблема совместимости.

...