Собственно тривиальная задача - расшарить данные между копиями загруженной библиотеки. Средства IPC использовать не хочется поскольку данных очень мало (два DWORD'а и короткая строка), можно ли как-нибудь изменить уже скомпиленную библиотеку чтобы добавить к ней расшаренную на запись и на чтение секцию?
Да, есть ещё один вопрос. Что произойдёт если процесс загрузивший библиотеку, выгрузит её после того как та создаст поток, который будет висеть на WaitForSingleObject(). Ведь рано или поздно объект синхронизации может освободится.... (или я чего-то не знаю, и не понимаю)
как только WaitForSingleObject() вернет управление произойдет исключение (тк память по тому будет адресу либо невыделена либо занята чем нибудь другим)
Да, собственно идея заключается в том, что можно написать функцию на асме ,которую можно забить NOP'ами, после чего в коде использовать её адрес для записи и чтения этих самых данных. PS: Можно ли измнить аттрибуты секции кода?
можно. у меня не раз получалось.... пока не понял что надо так Код (Text): push 0 push hInstance push ExitThread jmp FreeLibrary или так FreeLibraryAndExitThread()
Dusk В делфи не в курсе. Можно при выполнении: см. VirtualProtect. kropalik Это если один поток. А если в ней второй поток и он спит?
а по существу вопроса так и не ответили... как заставить dlphi поместить переменные в отдельную секцию я не знаю (хотя наверно можно) поэтому предложу поюзать Код (Text): h=CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE|SEC_COMMIT,0,size,"name_xxx"); p=MapViewOfFile(h,FILE_MAP_WRITE,0,0,0);
Dusk Разрешить запись в страницу кода конечно можно, но при записи сработает copy-on-write и измененная страница dll станет приватной для данного приложения, т.е. расшарить таким способом данные между разными процессами ИМХО не удасться - винду так просто не обманешь
Я тогда эту задачу не решил, обошёл с помощью файлмаппинга, но всё ж таки интересно. Собственно подкорректирую вопрос: в готовой библиотеке на делфях (скомпилированной), т.е. в dll'ке возможно ли создать shared секцию. и как добраться до этой секции в рантайме?