Нарушение доступа вызывая импортированную функцию - PullRequest
1 голос
/ 01 июня 2011

У меня есть функция, импортированная из DLL.Я контролирую источник исполняемого файла хоста и динамической библиотеки.Теперь в DLLMain я использовал MessageBox, чтобы открыть адрес экспортируемой функции, и сравнил его, используя точку останова, с указателем на функцию, возвращаемым GetProcAddress, и они идентичны.

Однако, когда я пытаюсь вызвать функцию, я получаю нарушение прав доступа.Рассматриваемая функция просто возвращает NULL и не имеет логики, поэтому она не может быть специально сгенерирована функцией.

Как вызов известного действительного указателя функции с правильной подписью и проверенной безопасной логикой может привести к нарушению доступа?

Редактировать: информация, полученная в результате отдельного вопроса о том, почему отладчик умираетв этой ситуации говорит о том, что мой стек тоже разбился?Это имеет больше смысла, чем AV, но указатель на функцию и функция полностью совместимы, а адрес верен.

extern "C" Render* __cdecl CreateRender(WindowsOS* ptr) {
    return nullptr;
}

typedef Render*(__cdecl *RendererCreateFunction)(WindowsOS*);

Я использовал небольшой фрагмент кода в DLLMain, чтобы определить, что онифактически совместим с компилятором.

BOOL WINAPI DllMain(
  __in  HINSTANCE hinstDLL,
  __in  DWORD fdwReason,
  __in  LPVOID lpvReserved
) {
    RendererCreateFunction func = &CreateRender;
}

Если они несовместимы (они содержат одинаковый заголовок), тогда компилятор должен выдать ошибку и отказаться от сборки DLL, но он принимаетэто просто отлично.

Ответы [ 2 ]

1 голос
/ 01 июня 2011

Если это DLLMain, который вы используете в своем коде, то он не имеет оператора return и, скорее всего, возвращает не инициализированное значение, вполне вероятно, 0 как хорошую основную функцию, которая эффективно выгружает DLL из памяти. Убедитесь, что DLLMain возвращает TRUE.

0 голосов
/ 01 июня 2011

Я полностью провалил это. Написал класс, который управляет ресурсом, не уважая мой ход и правильно копируя семантику. Оказывается, я ошибочно вызывал FreeLibrary() в соответствующей библиотеке, прежде чем мне пришлось ее использовать.

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