Здравствуйте, EreTIk, Вы писали:
ETI>Если при создании секции запрашивается исполнение (PAGE_EXECUTE_READWRITE), то и при открытии надо его запрашивать (GENERIC_EXECUTE, или хотя бы FILE_EXECUTE) для описателя файла.
Мeтодом перебора пытался подставлять те или иные флажки — код ошибки сменился на 0xC00000F4.
Если за основу брать эмулятор KolibriOS под Windows и его исходники klbrinwin на ассемблере, то там ничего подобного и близко нет.
Изучая весь текст, я так и не понял, как в нём под сегмент gs подставляется графический буфер экрана. Там есть блиттинг операции, но мне не ясно, как именно сегмент gs под это настроен.
В документации Intel по i386 сказано, что можно построить таблицу из миллиона описателей, где 4 Гб — это 1024 ссылки на 1024 дескриптора на регионы памяти по 4 Кб. Но как под Windows добраться до этих механизмов легально и демократично, чтобы не опускаться на уровень написания драйвера?
С этим вопросом никак не могу справиться с NtSetLdtEntries, чтобы перенастроить селекторы памяти, так как она для этого и предназначена.
Выше я писал, что мне, для начала, необходимо все 4 Гб памяти зеркалами свернуть и сослать на один дефолтный регион в 64 Кб, чтобы, как в калейдоскопе, по всей протяжённости 4 Гб повторялись одни и те же дефолтный 64 Кб ровно 65536 раз.
(Но позднее будет управляться через Escape-инструкции вместо команд FPU, чтобы любой из 65536 отражений дефолтных 64 Кб можно было переназначить под какой-либо другой ресурс: Мэппинг-фрагмент файла, текстовый терминал консоли, буфер обмена и т.п…)
Главная проблема в том, что я никогда не выходил за рамки написания прикладных задач.
А здесь — уже системный уровень и существенно не хватает ни опыта, ни знаний.
Мне советуют изучить исходники Bochs или QEmu. Но это — совсем не то, так как 12 лет назад я писал эмулятор i386 именно с целью запуска «бот-кода как демонстрацию…
Но, так как у современных процессоров есть встроенные аппаратные механизмы виртуализации, хочу выйти за рамки эмулятора байт-кода и перейти на уровень гипервизора, чтобы сосредоточиться лишь на основных моментах управления памятью и портами.
Если в самом тексте программы аккуратно вставлять инлайн-блоки на ассемблере, то всё работает, как и задумано.
Но мне теперь надо динамически подгружать процессы из файлов, но
оформлять их не как Windows-приложения, а как в случае с KolibriOS — как «бот-ферму» моего клеточного автомата…
Вы понимаете, что основные условия задачи крайне просты, так как не требуется эмулировать никакого API и портов ввода/вывода.
Просто «бот» помещается в абсолютную инкапсуляцию, где он может делать абсолютно всё…
Только два момента мне нужно преодолеть:
Подготовить адресное пространство из 4 Гб как 65536 блоков по 64 Кб без намёков на API
Загрузить туда файл и объявить его как отлаживаемый процесс
Всё остальное, точечно и локально, я уже как бы сделал.
Спасибо!