среда, 6 мая 2009 г.

Не называйте вашу DLL именем "Security.dll"

Это перевод Don't name your DLL "Security.dll". Автор: Реймонд Чен.

Снова ныряем в водоворот истории...

Некоторые люди обнаружили, что если вы назовёте свою DLL "security.dll", то начнут происходить странные вещи.

Причина в том, что в системе уже есть системная DLL библиотека с именем "security.dll"; это DLL интерфейса Security Support Provider, она известна под именем "security.dll", хотя сегодня более предпочитаемо имя "secur32.dll". Если вы посмотрите в свою папку system32, вы увидите оба варианта ("security.dll" и "secur32.dll"). А если вы владаете dump-илкой экспорта, то увидите, что "security.dll" - это просто заглушка, которая перенаправляет все вызовы на "secur32.dll". Если вы посмотрите на документацию MSDN, вы увидите, что все говорят о "secur32.dll" и очень редко когда упоминают "security.dll".

Окей, вот теперь начинается история. Перематываем время назад в Windows 95.

В те далёкие дни, Security Support Provider Interface был реализован в двух DLL. Какую вы должны использовать, зависело от того, используете ли вы Windows NT или Windows 95. На Windows 95 библиотека называлась "secur32.dll", но на Windows NT она называлась "security.dll".

Очевидно, что это было весьма запутанно, поэтому разработчики Windows NT решили поплыть по течению и переименовали их DLL в "secur32.dll". Это было сделано по соображениям совместимости: приложения, которые были написаны для Windows 95 и никогда не тестировались на Windows NT, просто запрашивали сразу "secur32.dll", вместо того, чтобы загружать корректную DLL, в зависимости от системы.

Окей, возвращаемся в наши дни. Что происходит, когда вы кладёте в свою папку DLL с именем "Security.dll"?

Вспомним, что правила поиска DLL для загрузки таковы, что DLL сперва проверяется в папке программы, а только затем - в системной папке. В результате, любой в вашей программе, кто хочет "Security.dll", получит вашу версию, вместо системной версии.

Даже, если на самом деле они хотели системную версию.

Именно поэтому "перезапись" системной Security.dll на вашу приводит к куче ошибок SSPI. Компоненты, которые вы используете в своей программе, пытаются общаться с SSPI через "security.dll", но вместо системной они получают вашу DLL. Но ваша библиотека и не проектировалась как замена для "security.dll" от SSPI; это просто какая-то библиотека, которая просто случайно имеет такое же имя.

У вас была бы точно такая же проблема, если бы вы назвали свою DLL как нибудь вроде "DDRAW.DLL", а какой нибудь компонент в вашей программе решил бы создать поверхность DirectDraw. У "Security.dll" есть недостаток, что она имеет простое имя (которое люди наверняка хотят для своих DLL), а её важность для правильного функционирования в системе не очеь хорошо известна (хотя, если бы создали библиотеку с именем "kernel32.dll" и положили бы в папку с программой, то уж в этом-то случае каждому было бы очевидно, что ничего хорошего из этого не выйдет).

Комментариев нет:

Отправить комментарий

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.