Зачем callback? Я проверяю длину инструкции всякий раз после считывания ее части, чтобы длина не превышала 15 байт. Можно сделать эту проверку до чтения, чтобы уложиться ровно в 15 байт, для всеобщего спокойствия, но это не очень красиво с т.з. архитектуры. Думаю стоит написать ф-ию, которая получает значение из потока инструкций и контролирует длину. Так я смогу локализовать установку ошибки ERR_TOO_LONG в одном месте.
Код (Text): base = malloc(IN_BUFF_SIZE); ptr = base; end = ptr + IN_BUFF_SIZE; /* ... заполняем буфер */ while(ptr < end) { res = medi_disassemble(ptr, &instr, ¶ms); /* ... */ ptr += res; params.base += res; } дано: ptr = end -1; *ptr = 0xF0; // LOCK ------------- проверка условия: ptr < end ? -> да ------------ вызываем функцию medi_disassemble; 1. читается байт. ага. ето префикс... длина инструкции меньше макс длины... 2. читаем дальше. "А дальше нельзя, дальше стена". тут 2 развития событий - функция выполняется до конца, декодируя байты, расположенные за буфером или вылетает исключение.
Mika0x65 мне из другой части программы пришло 5 байт, и мне надо узнать что эта за инструкция, я конечно могу забить ее нулями "до упора" но лучше сделать чтото вроде f(...., size_t p_MaxSize s=16) и если команда больше чем позволено читать возвращать соответствующий код ошибки
Код (Text): #ifdef UNICODE typedef wchar_t unichar_t; #define _UT(s) L##s #define unistrcpy wcscpy #define unistrncpy wcsncpy #define unistrchr wcschr #define unistrlen wcslen #else typedef char unichar_t; #define _UT(s) s #define unistrcpy strcpy #define unistrncpy strncpy #define unistrchr strchr #define unistrlen strlen #endif А зачем не используешь функции вида *_s ? Их не настолько трудно юзать
Не использую потому, что в *nix этих ф-ий нет, а дизассемблер должен работать как в Win, так и в *nix. Вообще, у меня Unicode зависит только от макроопределения UNICODE.
готов написать что-нибудь эдакое опенсорсное, поначалу взяв Mediana как дизассемблер. тем более опыт в написании таких графов имеется. но это только после того, как мне будут высказаны требования и предложения. лучше даже - конкретное ТЗ.
Под FASM я сделал, но не протестировал. А common_up пропал куда-то . В принципе, можно сделать и под MASM. Но учитывая, что я им никогда не пользовался, это займет какое-то время...
void_ Так там пару хидеров переписать, минутное дело, собрать и сдампить двиг в бинарь(не понятно почему не сделано), прежде немного изменив таким образом, дабы в начале бинаря был вызов двига, или его сервисов в зависимости от передаваемого ID.
Есть предложение немного поменять группировку инструкций (Mediana назначает каждой инструкции одну или несколько групп, например, GRP_GEN -- общие инструкции, GRP_SSE -- SSE инструкции и т.д.) С одной стороны, группировку инструкций определял не я, я просто взял их из готового XML файла (http://ref.x86asm.net), немного изменив. С другой стороны, на группировку инструкций сильно влияет цель дизассемблера, турдно угодить сразу всем. Но я постараюсь. Вот список групп и их описание: Я удалил группы obsolete, prefix, добавил группы VMX, SSE1, SSE2 и т.д. Кто-нибудь хотел бы что-то добавить/убрать/переделать?
Ох уж этот pstdint.h... Попробуй заменить все подключения pstdint.h на <stdint.h>. Кстати, в дизассемблере есть несколько ошибок, которые я еще не исправил (часть исправил, но еще не выложил). Исправление предположительно будет через неделю.
Я к http://wasm.ru/forum/viewtopic.php?id=41579 прикрутить хочу, в WinGraph32 на выходе что бы удобнее код было анализировать. Помогло изменение в mediana.h Код (Text): // #include "pstdint.h" #include <stdint.h> Но при компиляции, уйма предупреждений.