Ms. Detours + multithreading

Тема в разделе "WASM.BEGINNERS", создана пользователем PiterPen, 18 мар 2010.

  1. PiterPen

    PiterPen New Member

    Публикаций:
    0
    Регистрация:
    10 ноя 2009
    Сообщения:
    8
    Доблестные доны,
    помогите с направлением в котором решать задачу: написал небольшую библиотечку, которая перехватывает ряд вызовов WinAPI. Пока dll работает в одном потоке - все ок, когда же несколько потоков ее одновременно использует - крах приложения.
    Я использовал велосипед - смарт-пойнтер с критической секцией (аналог boost::shared_ptr, boost::noncopyable) с автоматическим EnterCriticalSection/LeaveCriticalSection. В данном пойнтере храню указатель на std::map<int, int>. Если с этой мапы только читать - все ок, а вот если в мапу записывать - коллизии...
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    PiterPen
    У краха есть причины и их нужно выяснить используя отладчик. Иначе ничего не будет, то что вы функци сплайсите и кс используете ниочём не говорит.
     
  3. PiterPen

    PiterPen New Member

    Публикаций:
    0
    Регистрация:
    10 ноя 2009
    Сообщения:
    8
    Коллеги, еще вопрос.
    Использую библиотеку Detours v1.5

    #include "Windows.h"
    #include "psapi.h"
    #include "Tlhelp32.h"
    #include "detours.h"

    // Объявление функции
    DETOUR_TRAMPOLINE(HBITMAP WINAPI Real_LoadBitmapW(HINSTANCE hApp, LPCWSTR lStr),
    LoadBitmapW));

    BOOL APIENTRY DllMain( HANDLE hModule,
    DWORD ul_reason_for_call,
    LPVOID lpReserved
    )
    {
    if (ul_reason_for_call == DLL_PROCESS_ATTACH)
    {
    DetourFunctionWithTrampoline((PBYTE)Real_LoadBitmapW, (PBYTE)DetourLoadBitmapW);
    }
    else if (ul_reason_for_call == DLL_PROCESS_DETACH)
    {
    DetourRemove((PBYTE)Real_LoadBitmapW, (PBYTE)DetourLoadBitmapW);
    }
    return TRUE;
    }

    Не работает, совсем не работает. Во время инъекции данной библиотеки в код он просто падает. Перехват массы других функций - обработка сообщений/устройства контекста/оконных функций проходит по этой же схеме на ура.
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    PiterPen
     
  5. PiterPen

    PiterPen New Member

    Публикаций:
    0
    Регистрация:
    10 ноя 2009
    Сообщения:
    8
    Слишком общий ответ, не могу (в связи с небольшим опытом) получить нужную информацию.
    Из документации следует, что во время привязки трамполайн функций (DetourAttach) необходимо приостановить все другие треды процесса, использующие функцию которую мы сплайсим. Я этого НЕ ДЕЛАЛ для большого количества апи функций и все работало ОКейно, но вот с битмап функциями наступил облом. Стандартная ошибка - С000...05, указатель 0x6f000... является недействительным.
     
  6. PaCHER

    PaCHER New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2006
    Сообщения:
    852
    PiterPen
    Ну так расширяйте опыт, начните изучать отладчик и методы отладки, или забейте на перехваты и прочие шалости.
     
  7. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    PaCHER
    В самом верху раздела Win32 прикреплён топик про такие проблемы. Нужно непосредственно тыкнуть автора, да ?
     
  8. PiterPen

    PiterPen New Member

    Публикаций:
    0
    Регистрация:
    10 ноя 2009
    Сообщения:
    8
    Разобрался, всем спасибо - отдельно Клерку, за K.I.SS (Kick Into...). Detours 2.1 спасла отца русской демократии, действительно причина бага - неправильная работа с тредами, данная версия библиотеки берет эту работу на себя.