Доблестные доны, помогите с направлением в котором решать задачу: написал небольшую библиотечку, которая перехватывает ряд вызовов WinAPI. Пока dll работает в одном потоке - все ок, когда же несколько потоков ее одновременно использует - крах приложения. Я использовал велосипед - смарт-пойнтер с критической секцией (аналог boost::shared_ptr, boost::noncopyable) с автоматическим EnterCriticalSection/LeaveCriticalSection. В данном пойнтере храню указатель на std::map<int, int>. Если с этой мапы только читать - все ок, а вот если в мапу записывать - коллизии...
PiterPen У краха есть причины и их нужно выяснить используя отладчик. Иначе ничего не будет, то что вы функци сплайсите и кс используете ниочём не говорит.
Коллеги, еще вопрос. Использую библиотеку 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; } Не работает, совсем не работает. Во время инъекции данной библиотеки в код он просто падает. Перехват массы других функций - обработка сообщений/устройства контекста/оконных функций проходит по этой же схеме на ура.
Слишком общий ответ, не могу (в связи с небольшим опытом) получить нужную информацию. Из документации следует, что во время привязки трамполайн функций (DetourAttach) необходимо приостановить все другие треды процесса, использующие функцию которую мы сплайсим. Я этого НЕ ДЕЛАЛ для большого количества апи функций и все работало ОКейно, но вот с битмап функциями наступил облом. Стандартная ошибка - С000...05, указатель 0x6f000... является недействительным.
PiterPen Ну так расширяйте опыт, начните изучать отладчик и методы отладки, или забейте на перехваты и прочие шалости.
PaCHER В самом верху раздела Win32 прикреплён топик про такие проблемы. Нужно непосредственно тыкнуть автора, да ?
Разобрался, всем спасибо - отдельно Клерку, за K.I.SS (Kick Into...). Detours 2.1 спасла отца русской демократии, действительно причина бага - неправильная работа с тредами, данная версия библиотеки берет эту работу на себя.