Вот, решил после переписки с baldr сделать сие чудо. Не всё же мне время с клерком прерикаться %). Плагин добавляет метки из фас-файла, для нужд отладки. Если фас файл имеет вид exename.fas, то его подхват происходит автоматически, а если нет, то предлагается указать его. К сожалению, фас файлы не содержат комментариев . А зря, видеть свои комменты было бы очень полезно. Замечена лажа с локальными переменными. Они имели довольно странный вид. Раньше такое было и с константами. Но я поставил проверку на то, чтобы адрес метки не был меньше базы экзешника. Симптомы пропали, но вот локальные переменные с отрицательным смещением получают довольно странные имена. Ввёл проверку на отрицательные смещения - теперь заработало нормально. Но мне не нравиться это решение, видимо я что-то не так посчитал. Дольно забавно выглядят метки от .if и иже с ним, возможно, томасу стоило давать им осмысленные имена. Возможно (по крайнер мере не должно ) не будет работать с длл. А также с ексе с релокациями. Можно довольно легко сделать, но мне некогда, работает - ну, и ладно.... Раньше чем через месяца три я его дорабатывать не буду. Так, что, если кто-то хочет её доработать, то пожалуйста. Если кто хорошо знает олю (надо сделать так, чтобы файл грузился сразу) или хорошо разбирается в fas, то просьба довести плаг до ума. В папке с исходниками лежат: Описание fas формата. Объектник к оле. Plugin.h к оле. Шаблон к 010, для облегчения ковыряния в файле (шаблон примитивный, просто показывает хидер, а также все записи символов). P.S. Просьба не пинать за стиль, просто давно не писал на си. Довольно много времени просто ушло на то, чтобы вспомнить как найти место где последний раз встречается символ, например.
Небольшое исправление. Раньше плуг мог не всегда прочитать файл изза флага NO_BUFFERING. Странно, что если округлить значение в большую сторону ( я беру самый большой размер кластера, мне известный), то всё читается нормально. Почему бы не сделать такое округление в самой апи? Мне эта ошибка встретилась уже на третьем файле. Странно, что никто мне о ней не написал. Пользуется, видимо ровно 2.5 человека Бинарники.
Вот вам минус редактирования А меня новая, она не поддерживает символы и плагины, которых у меня достаточно Если использовать флаг NO_BUFFERING, то надо, чтобы число байт, которые мы читаем через ReadFile должно делиться на размер сектора на данном диске. Число_байт%размер_сектора==0 % - это модуль.
\ZFasConvRebrand.rar\ZFasConv\ZFasConv\readme.txt: "Сделать проверку на отрицательные значения, чтобы не портить лок. переменные." Можете пример задачи дать?
Чего то я слабо понимаю, о чём разговор . Обе задачи я уже решил, просто думал, что кто-нибудь может лучше. P.S. Локальные переменные уже давно не портятся! Они просто не показываются .
Код (Text): left_bytes dd 514 ;надо считать sector_size dd 512 ;байт на сектор partial_bytes dd ? ;left_bytes % sector_size entry $ mov eax,[left_bytes] div [sector_size] sub [left_bytes],edx mov [partial_bytes],edx ...FILE_FLAG_NO_BUFFERING(left_bytes) ...(partial_bytes) ret
edemko не взрывай людям мозг таким кодом Ты б ещё через интеграл посчитал. Размер сектора - степень двойки. А округление в большую сторону до степени двойки это: Код (Text): val = (val+(alignment-1)) & ~(alignment-1); В частности вот этот мега код: Код (Text): filesize=filesize-(filesize%4096)+4096;// biggest sector size what i know По нормальному записывается так: Код (Text): filesize=(filesize+0xFFF) & ~0xFFF; К тому же твой код вообще неправильный - проверь к примеру на filesize=4096
тогда left_bytes станет 0, а partial_bytes примет значение left_bytes filesize=(filesize+0xFFF) & ~0xFFF; <- вы хотите сделать выравнивание, значит "+0xFFF" лишнее из-за "& ~0xFFF" val = (val+(alignment-1)) & ~(alignment-1); Код (Text): mov eax,val mov ebx,eax and eax,val-1 sub ebx,eax ...no_beffering(ebx) ...(eax :) ^) &): : :? ^() <(
Да что ты говоришь. Выровнять надо вверх если кто не заметил. edemko - твой код вычитает остаток от деления - округляет вниз, а просили вверх. А насчёт filesize=4096 я писал про оригинальный код автора. Или сейчас модно отвечать даже исходники не глянув?
cppasm В код глядел но не вникал никак. Так округлять вверх не умею/не умел. В последнем кодесе от меня не val-1, а сектор_размер -1. ...сходил в магазин за крышками...подумал...filesize=(filesize+0xFFF) & ~0xFFF; лучше Чесно, я думал о копировании памяти, потому сразу откинул ваш семпл.
Спасибо, я понимал, что делаю . Ну, если размер будет 4096, то мой код просто добавит ещё 4096. Что хорошего можно накодить в три часа ночи на скорую руку . Главное чтобы работало. А округление через and корректно работает для больших чисел? У меня какие-то смутные воспоминания о этом.
Согласно ф-лы <cppasm>, все зависит от размера сектора и размера куска считывания: возможно переполнение, но это не в наше время.
К сожелению у меня нет семёрки, поэтому отдебажить не могу. В последней версии, вроде бы, ничего не меня, кроме округления размера файла. Могу предположить, что есть какие-то новые заморочки с NO_BUFFERING в семерке. Когда буду дома - пересоберу с буферизацией. Хотя, вы лучше собирете для себя сами. Потому, как дома я буду не скоро. P.S. Семёрка у меня даже не становиться - пишет "плохой диск, иди, плати денежки, меняй, двигай нашу говёную индустрию", дура, что она может понимать в дисках?