Необработанное исключение в 0x6D3800C8 в Konfig32.exe: 0xC000041D после использования обходов MS - PullRequest
0 голосов
/ 30 сентября 2019

Прежде всего, я новичок, и я начал изучать 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() [отцепить ее] :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...