leo Допустим мы захотели сделать себе dll с базонезависимым кодом и данными, релоцировать там нечего (у нас ведь нигде, даже в PE хидере нет абсолютных адресов) и мы фиксапы не юзаем, NT нормально грузит такую dll и она работает по любому адресу! Короче да, я готов согласится, что это особенность\баг 9x, и поскольку в практике такие dll единичны, то можно не тормошить по пустякам Привалова (иначе стоит основательно протестировать и на всех виндах)
Asterix Хотел было, да после регистрации какие-то тормоза пошли страшные с загрузкой - так и не дождался входа А тут bogrus стал тени сомнения сеять в стиле "найдите сперва куда тыкать" и "не тормошить по пустякам" В связи с этим вот какая мысля появилась: а может win 95, а вместе с ней и 98 не поддерживают флаг IMAGE_FILE_RELOCS_STRIPPED ? В спецификации про него сказано "Image only, Windows CE, Windows NT and above". В виндовой иерархии я не очень разбираюсь, но если к 9х это не относится, то получается достаточно логичное объяснение. Вопрос: если релоков нет, то как отличить ситуацию, когда их просто нет и dll можно грузить по любому адресу, от ситуации когда они должны быть, но stripped и dll может работать только при ImageBase, указанном в PE-хидере ? В NT просто проверяется указанный флаг - если он сброшен, то dll позволяет изменять ImageBase даже если размер таблицы релоков = 0. Ну а если предположить, что 9х про этот флаг ничего не знают, то остается единственная возможность различить эти ситуации - по размеру таблицы релоков: если 0, то изменять ImageBase нельзя
Да, похоже 98SE игнорирует флаг RELOCS_STRIPPED Но интересно, что XP SP2 его тоже игнорирует если размер таблицы релоков > 0. А вот если таблицы нет (размер = 0), тогда при сброшенном флаге XP считает что релоков нет и можно грузить dll по другому адресу, а при установленном флаге - на выход с песнями PS: Томаш согласился, что проблема есть, но как и следовало ожидать предлагает решать ее yourself. Спорить и предлагать хотя бы хинты\варнинги выводить - думаю бесполезно