Прежде всего, я новичок, и я начал изучать C ++ в прошлом месяце, поэтому не сердитесь, если я не могу хорошо объяснить проблему. : D
Я использую MS Detours для подключения некоторых пользовательских функций к оригинальным функциям из Windows. Когда я запускаю программное обеспечение, исходные функции, которые показывают текст внутри меню, окон и т. Д., Будут изменены с помощью моих функций, которые будут переводить текст и отображать его как оригинальную функцию, но только на другом языке.
Я сделал традиционную перехват в C ++, где я перезаписываю заголовок функции «горячего исправления», но проблема в том, что такая перехват не работает с 64-битным программным обеспечением, и я понял, что могу использовать MS Detours для перехвата, потомусовместим с программным обеспечением X86 и X64. Традиционный перехват работал в 32-битном режиме, но после реализации MS Detours я получаю сообщение об ошибке:
Unhandled exception at 0x6D3800C8 in Konfig32.exe: 0xC000041D: An unhandled exception was encountered during a user callback.
Вот его фото, где вы можете увидеть функцию иисключение внутри файла wincore.cpp
Перехват работал и проверил отладчиком, что каждая функция была успешно подключена к исходной. Затем программа начинает переводить текст, и это было успешно, и после вызова этой функции я получил эту ошибку.
Я искал ответ в stackoverflow, но ни один из них не был связан с перехватом, так что было бы здорово, если быкто-то может сказать, что может быть возможной проблемой или решением.
Это мой исходный код:
// Constructor
CFunctionControll::CFunctionControll(BYTE* pOrigFunc, BYTE* pDetourFunc)
{
m_pOrigFunc = pOrigFunc;
m_pDetourFunc = pDetourFunc;
}
// Destructor
CFunctionControll::~CFunctionControll()
{
Disable();
}
void CFunctionControll::Enable()
{
try
{
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(LPVOID&)m_pOrigFunc, m_pDetourFunc);
if (!DetourTransactionCommit())
throw transactionerror;
}
catch (TransactionError)
{
// Add proper exception handling later
}
}
void CFunctionControll::Disable()
{
try
{
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourDetach(&(LPVOID&)m_pOrigFunc, m_pDetourFunc);
if (!DetourTransactionCommit())
throw transactionerror;
}
catch (TransactionError)
{
// Add proper exception handling later
}
}
class TransactionError : public std::exception
{
virtual const char* what() const throw()
{
return "DetourTransactionCommit() failed.";
}
} transactionerror;
Параметр pOrigFunc
- это указатель на исходную функцию и параметр pDetourFunc
- указатель на мою настроенную функцию.
Я делаю перехват с этим классом CFunctionControll
, где я могу просто сказать Enable()
[перехватить функцию] или Disable()
[отцепить ее] :)