Приложения Win32 автоматически связаны с ntdll.dll?
Я просто случайно обнаружил, что делает это GetModuleHandle("ntdll.dll")
работает без предварительного звонка LoadLibrary("ntdll.dll")
,
Это означает ntdll.dll
уже загружен в моем процессе.
Можно ли предположить, что ntdll.dll
всегда будет загружаться в приложениях Win32, так что вызов LoadLibrary
не обязательно?
1 ответ
Из MSDN на LoadLibrary() (выделено мое):
Система поддерживает подсчет ссылок для каждого загруженного модуля. Вызов LoadLibrary увеличивает счетчик ссылок. Вызов функции FreeLibrary или FreeLibraryAndExitThread уменьшает счетчик ссылок. Система выгружает модуль, когда его счетчик ссылок достигает нуля или когда процесс завершается (независимо от счетчика ссылок).
Другими словами, продолжайте вызывать LoadLibrary() и убедитесь, что вы получите свой дескриптор ntdll.dll
чтобы быть безопасным - но система почти наверняка будет увеличивать счетчик ссылок, поскольку он уже должен быть загружен.
Что касается "действительно ли оно всегда загружено?", См. Windows Internals на Image Loader (краткий ответ - да, ntdll.dll
является частью самого загрузчика и присутствует всегда).
Соответствующий пункт:
Загрузчик образа находится в системной библиотеке DLL пользовательского режима Ntdll.dll, а не в библиотеке ядра. Следовательно, он ведет себя так же, как стандартный код, который является частью DLL, и на него распространяются те же ограничения с точки зрения доступа к памяти и прав безопасности. Что делает этот код особенным, так это то, что он всегда присутствует в работающем процессе (всегда загружается Ntdll.dll) и является первым фрагментом кода, который запускается в пользовательском режиме как часть нового приложения. (Когда система создает начальный контекст, счетчик программы или указатель инструкции устанавливаются на функцию инициализации внутри Ntdll.dll.)