Как получить информацию для динамической библиотеки загрузки во время выполнения, если LoadLibrary возвращает NULL? - PullRequest
0 голосов
/ 12 января 2019

В myDLClient.c я использую LoadLibraryW () для загрузки lib2.dll, которая, в свою очередь, зависит и пытается загрузить lib1.dll.
lib1.dll может быть
1) настоящее время,
2) присутствует и не читается,
3) присутствовать и иметь пропущенные символы или быть
4) отсутствует вообще.
В случае 2) и 3) мне нужно, чтобы в моем коде отображалась дополнительная информация, а не средства отладки, такие как dumpbin или listdlls.

В моей текущей реализации, для случаев 2) и 3), GetLastError () дает мне Код системной ошибки 193. Я могу извлечь подробное сообщение, используя FormatMessage. Поэтому сообщение об ошибке 193 «% 1 не является допустимым приложением Win32». При 4) я получаю ошибку 126, соответствующую сообщению: «Указанный модуль не найден».

Я хочу больше информации в случае 2) и 3), например, полный путь к DLL, которую он пытался загрузить (lib1.dll, а не lib2.dll; GetModuleFileName () дает мне путь к lib2.dll). Если это случай 3), также сообщите мне имя отсутствующего символа.

int main(){
    HINSTANCE lib2_handle;
    LPCWSTR lib2_name = L"../lib2.dll";
    lib2_handle = LoadLibraryW(lib2_name);
    if (!lib2_handle) {
        ErrorExit();
        return -2;
    }
    return 0;
}
void ErrorExit(){
    // Retrieve the system error message for the last-error code
    LPVOID msgBuf;
    DWORD errCode = GetLastError();

    FormatMessage(
        FORMAT_MESSAGE_ALLOCATE_BUFFER |
        FORMAT_MESSAGE_FROM_SYSTEM | 
        FORMAT_MESSAGE_IGNORE_INSERTS,      //Flags
        NULL,                               //Source
        errCode,                            //MsgID
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),  //LanguageID
        (LPTSTR)&msgBuf,                //BufferPointer
        0, NULL);                       //MinimumBufferSize, Arguments

    // Display the error message
    printf("Process %d exitted with system error: %d\n", GetCurrentProcessId(), errCode);
    printf("%s\n", (LPTSTR)msgBuf);

    LocalFree(msgBuf);
}

Перечисление с использованием EnumProcessModules () неосуществимо, потому что процесс myDLClient.exe может содержать тысячи модулей, и сравнение их со списком модулей в lib2.dll займет много времени. (Я могу ошибаться, поправьте меня, если я неправильно понял этот подход.)

Я нашел RtlGetUnloadEventTraceEx () , но я не знаю, ищу ли это. Я также был бы признателен за пример кода, поскольку я не могу найти ни одного. ( Вопрос по стеку )

Я также наткнулся на C Функции времени выполнения и Функции Sym в dbghelp.h ( Проверьте это тоже ), но не смог понять, как использовать их.

Я воздержался от упоминания деталей внутри двух библиотек, потому что я думаю, что это не имеет значения, поскольку мы знаем, что lib2.dll зависит от lib1.dll и что lib2.dll всегда будет там в правильной форме, но lib1 .dll может быть неправильным / отсутствовать в соответствии с упомянутыми ранее случаями. Хотя, если вам нужно, чтобы я опубликовал код DLL или списки экспорта / импорта, дайте мне знать, и я могу это сделать.

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