Подтвердить что ты не робот

Фиксированный адрес занят в .NET.

У FIPS, поддерживающего OpenSSL, есть одно ограничение - он должен загружать libeay32.dll по фиксированному адресу, а если он загружается по любому другому адресу, он не выполняет проверку инициализации, поэтому он не может использоваться в режиме FIPS.

Таким образом, мы выбрали адрес в соответствии с рекомендацией Microsoft, а на некоторых машинах, которые время от времени обращаются, заняты различными другими библиотеками - например, MSVCR120_CLR0400.dll или mscorlib.ni.dll или clr.dll, вы получаете точку.

Есть ли способ проверить, если какой-либо фиксированный адрес + длина принимается, и попросить ОС освободить эту часть памяти для меня, например, переустановить эти dll на другие части памяти или что-то вроде этого?

Update:

Я собрал информацию из 20 устройств с ListDLLs, и есть некоторый шаблон, который загружается где, но он далеко не определен. Итак, я запустил некоторую математику, нашел большой пробел, где ничего не было загружено в этих 20 журналах, которые у меня были, изменил базовый адрес libeay32 где-то в этом промежутке (разрыв был ~ 6 раз больше, чем dll, поэтому я выбрал ~ в середине его), и еще после пары попыток приложение удалось загрузить что-то в этом промежутке до libeay32 (для конкретного - clrjit.dll, у него есть базовый адрес 0x10000000, который, как мне кажется, по умолчанию), хотя в приложении я пытаюсь загрузить libeay32 как можно скорее.

4b9b3361

Ответ 1

Почему бы вам не объединить намеки:

  • Используйте /INCLUDE с символом libeay.dll при связывании вашей программы, чтобы заставить статическую зависимость от этой библиотеки.
  • Скомпилируйте libeay32.dll с /FIXED, чтобы его нельзя было перемещать.

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