При замене DLL 0xC0000005: место выполнения нарушения прав доступа 0xFFFFFFFF - PullRequest
2 голосов
/ 03 августа 2020

Я пытаюсь обойти ненужную DLL, но у нас нет источника, потому что он от сторонней компании, код которой больше не поддерживается. У нас есть альтернативное решение этой DLL. Однако, к сожалению, для нашего проекта это огромная работа по компиляции, поэтому сейчас для меня практически невозможно перекомпилировать весь проект за такой короткий период. Поэтому я думаю, что смогу создать фальшивую DLL и поместить свой собственный алгоритм в критическую функцию. Но теперь я получаю нарушение 0XC000005 и не могу его устранить.

DLL была загружена и выгружена таким образом. Это в источнике, и я этого не писал. Я просто хочу, чтобы моя DLL обошла это. * И mydll. c

#include "mydll.h"

extern "C" {    
    int CheckPoint1(long *parmValue)
    {   
        // Try to see if it's loaded
        char szMessage[250];
        strcpy_s(szMessage, "Loaded...");
        MessageBoxA(0, szMessage, "INFORMATION", MB_OK | MB_ICONINFORMATION);
        int result = 10000;
        return result;
    }

    void WaitForFinish() {
    // Try to see if it's loaded
        char szMessage[250];
        strcpy_s(szMessage, "Waiting...");
        MessageBoxA(0, szMessage, "INFORMATION", MB_OK | MB_ICONINFORMATION);
    }
}

Вышеупомянутая реализация в DLL является моей реализацией для тестирования этого решения. Он скомпилирован без ошибок. Затем я заменил старую dll на эту новую. DLL была успешно загружена, и я мог видеть, как моя функция алгоритма запускалась из всплывающего диалогового окна. Затем программа вылетела (после того, как я нажал «ОК» во всплывающем окне). Я использовал отладчик в VC2017, и он сообщает мне, что у меня

Exception thrown at 0xFFFFFFFF in mindcontrol.exe: 0xC0000005: Access violation executing location 0xFFFFFFFF.

Журнал отладки выглядит следующим образом:

'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\ntdll.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\kernel32.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\KernelBase.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\apphelp.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\AcLayers.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\msvcrt.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\user32.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\win32u.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\gdi32.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\gdi32full.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\msvcp_win.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\ucrtbase.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\shell32.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\shlwapi.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\oleaut32.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\combase.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\rpcrt4.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\setupapi.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\cfgmgr32.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\bcrypt.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\mpr.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\sfc.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\winspool.drv'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\sfc_os.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\AcGenral.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\sechost.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\ole32.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\advapi32.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\uxtheme.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\winmm.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\samcli.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\msacm32.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\version.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\userenv.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\dwmapi.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\urlmon.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\sspicli.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\winmmbase.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\iertutil.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\SHCore.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\imm32.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\comdlg32.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\msimg32.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\oledlg.dll'. Symbols loaded.
'MindControl.exe' (Win32): Unloaded 'C:\Windows\WinSxS\x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.19041.1_none_fd031af45b0106f2\comctl32.dll'
'MindControl.exe' (Win32): Loaded 'C:\Windows\WinSxS\x86_microsoft.windows.gdiplus_6595b64144ccf1df_1.1.19041.388_none_429cd6de8a9002ce\GdiPlus.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\oleacc.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\kernel.appcore.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\bcryptprimitives.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\riched32.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\riched20.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\usp10.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\msls31.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Program Files (x86)\MindControl\mydll.dll'. Symbols loaded.
The thread 0x7fec has exited with code 0 (0x0).
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\msctf.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\TextInputFramework.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\CoreUIComponents.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\CoreMessaging.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\ws2_32.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\ntmarta.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\WinTypes.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\WinTypes.dll'. Symbols loaded.
'MindControl.exe' (Win32): Unloaded 'C:\Windows\SysWOW64\WinTypes.dll'
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\TextShaping.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\clbcatq.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\DataExchange.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\d3d11.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\dcomp.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\dxgi.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\twinapi.appcore.dll'. Cannot find or open the PDB file.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\WindowsCodecs.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\ExplorerFrame.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\windows.storage.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\wldp.dll'. Symbols loaded.
'MindControl.exe' (Win32): Loaded 'C:\Windows\SysWOW64\propsys.dll'. Symbols loaded.
Exception thrown at 0xFFFFFFFF in MindControl.exe: 0xC0000005: Access violation executing location 0xFFFFFFFF.

The program '[32632] MindControl.exe' has exited with code 0 (0x0).

Я предполагаю, что это потому, что WaitForFinish() не был загружен успешно, потому что Всплывающего окна не было. Другой причиной может быть вызов FreeLibary() в потоке. Но в любом случае я не знаю, как это решить. Может ли кто-нибудь помочь определить, где я сделал не так, и, возможно, предложить решение?

Спасибо за помощь.

1 Ответ

2 голосов
/ 03 августа 2020

Я собираюсь изложить здесь то, что я сказал в своем комментарии, потому что, внимательно изучив его, я примерно на 90% уверен, что это проблема.

В созданной вами библиотеке ваши экспортные данные определены как __cdecl.

Один из вызовов вашей DLL (CheckPoint1) должен работать нормально, потому что вы определили его так:

typedef int (*CheckPoint1)(long *ParmValue);

Вы не указали соглашение о вызовах в это определение, поэтому по умолчанию используется __cdecl.

Однако в другом экспорте WaitForFinish вы определили его как:

typedef void (WINAPI *WaitForFinish)();

Здесь вы указываете соглашение о вызовах как WINAPI (это просто __stdcall).

Итак, чтобы исправить это, вы можете просто изменить его на:

typedef void (*WaitForFinish)();

или

typedef void (__cdecl *WaitForFinish)();

Оба означают то же самое.

Если вам интересно, что делают эти соглашения о вызовах, взгляните на эту статью .

ETA: This может быть проблемой, а может и нет:

unloadhandle = CreateThread(NULL, 0, UnloadDLL, &dllhandle, 0, &UnloadDLLThreadID);
if( unloadhandle ){ CloseHandle(unloadhandle); }

Как правило, вы должны дождаться завершения потока sh, прежде чем закрывать его дескриптор. Вы можете сделать это, используя WaitForSingleObject().

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