eXeL@B —› Вопросы новичков —› msvcr100.free |
Посл.ответ | Сообщение |
|
Создано: 08 ноября 2016 00:33 · Поправил: zds · Личное сообщение · #1 Здравствуйте Есть прога dotNet. В ней есть dll (пусть будет dll1) mixed mode, которя является какбы прослойкой между програмой и другой нативной dll (dll2) отвечающей за лицензирование. в dll1 есть Net функции например getSN,getDays и так далее, в которых идет вызов native функций dll1 и которые уже в свою очередь обращаются к dll2. интересно, что в Net функциях dll1 все аргументы (1-2 строки) передаются в нативные функции dll1 через указатели и результат тоже указатель, который преобразуется результат фукнции - string, int, bool что я сделал: написал свою dll на делфи, добавил ее в импорт dll2. при запуске моя dll находит секцию кода dll1 и во всех интересующих меня нативных функциях в самом начале делает jump на мои функции, из которых я уже передаю нужный мне результат. все работает отлично с функциями где результат int, string, bool случился затык только с фукнцией где релультатом является List<string> код такой Code:
в своей функции делаю такой результат (список из одной строки "999" для проверки) Code:
краш происходит на <Module>.free , который вызывает msvcr100.free. т.е. идет попытка осовобоить память область памяти где хранятся строки и в конце память где хранятся указатели на эти строки. краш происходит в обоих случаях вызова. исключение вроде такое: попытка чтения или записи в защищенную область памяти если в отладчке занопить эти два вызова, то все отрабатывается на ура. в чем может быть такой косяк? у меня предположение только такое, что нельзя осоводить память выделенную в другом модуле. |
|
Создано: 08 ноября 2016 00:42 · Личное сообщение · #2 |
|
Создано: 08 ноября 2016 01:33 · Личное сообщение · #3 |
|
Создано: 08 ноября 2016 01:44 · Личное сообщение · #4 под отладчиком глянуть и сравнить оригинал и твой код? ну похукай их на крайняк и сам освободи свой буффер ----- [nice coder and reverser] | Сообщение посчитали полезным: zds |
|
Создано: 08 ноября 2016 02:03 · Личное сообщение · #5 zds Во free используется освобождение кучи с её описателем, который хранится в той же либе с ртл. Есно если передать туда указатель из другой кучи или вообще не корректное значение, то возникнет ошибка. Возможно есть есчо проблема, с указателем(он может как то дополнительно обрабатываться этим Module.free). Нужно в отладчике смотреть. ----- vx | Сообщение посчитали полезным: zds |
|
Создано: 08 ноября 2016 02:17 · Поправил: zds · Личное сообщение · #6 Hellspawn смотрел оригинальный код - идет выделение памяти через через malloc, потом идет вызов dll лицензирования (dll2), которая возвращает нулевое значение (у меня нет лицензии) и выделенная память очищается через free. это то, что происходит в GetFeatures (вызов которой я прикладывал в первом посте). сам освободить буффер не могу, повторного обращения нет к этой функции. я в самом начале GetFeatures делаю jump в свою dll где делаю нужный мне ответ Code:
да я тоже уже думал занопить, если не получится разобраться Добавлено спустя 17 минут difexacaw да, спасибо. похоже проблема именно в этом. потому что когда я смотрел, что делает free, заметил что она вызывает BOOL WINAPI HeapFree( _In_ HANDLE hHeap, _In_ DWORD dwFlags, _In_ LPVOID lpMem ); первый аргумент которой это видимо и есть описатель. но в начале я не придал этому значение, т.к. в сама free принимает один аргумент походу вариант только один - занопить эти два вызова и не терять времени |
|
Создано: 08 ноября 2016 08:08 · Личное сообщение · #7 |
|
Создано: 08 ноября 2016 10:21 · Личное сообщение · #8 |
eXeL@B —› Вопросы новичков —› msvcr100.free |