Вы случайно не определили отдельный файл ресурсов (рисование, макет) для старых версий Android? Ваша трассировка стека говорит о том, что она не может накачать кнопку из-за отсутствия прорисовки.
Вы могли изучить GRUB. Я ни в коем случае не эксперт в коде MBR, и это было долго, так как я работал *, отклоняют ОС, но я помню, что загрузчик, обработанный шаг за шагом и, загрузил этапы из диска перед запущенной ОС. Вы могли записать свой собственный этап, чтобы сделать работу, в которой Вы нуждаетесь сделанный перед загрузками ОС и затем загружаете ОС. Я не уверен, насколько практичный эта опция, особенно так как код, кажется, посреди переписывания, потому что версия "прежней версии" была неудобна в сопровождении согласно документации.
Я нашел подобный вопрос, который может помочь:
Однако можно хотеть уточнить то, что Вы планируете сделать. Поскольку я узнал меня, код загрузчика может быть довольно утомительным для работы с. Кроме того, я, конечно, протестировал бы это с дискетой, если это возможно.
До фактического выполнения этого всего из Windows я немного невежествен. Примерно весь мой опыт программирования к этой точке находился под средой Unix.
Почему это обходится без помощи высказывания, что Windows не предоставляет прямой доступ к диску? Страница MSDN для CreateFile () говорит это:
Прямой доступ к диску или к объему ограничивается. Для получения дополнительной информации см. "Изменения в файловой системе и в стопке устройства хранения данных для ограничения прямого доступа к диску и прямого доступа объема в Windows Vista и в Windows Server 2008" в Базе знаний Справки и Поддержки по http://support.microsoft.com/kb/942448.
Windows Server 2003 и Windows XP/2000: Прямой доступ к диску или к объему не ограничивается этим способом.
KB942448 объясняет ограничения, и они, кажется, позволяют процессу с необходимыми полномочиями писать в MBR или в загрузочный сектор раздела.
Существуют различные способы записать в загрузочный сектор диска, и существует общая информация, которую я использовал назад, когда я экспериментировал с домашним пивом разработка ОС: http://wiki.osdev.org/
Я лично просто загружаюсь в соответствии с Linux и использую dd:
Резервное копирование сначала
dd, если =/dev/sda = ~/windows_bootloader.bin bs=512 count=1
Демонтируйте загрузчик
ndisasm-b16-o7c00h ~/windows_bootloader.bin> ~/windows_bootloader.asm
Сделайте свои модификации и повторно соберитесь
nasm ~/windows_bootloader.asm-f мусорное ведро ~/modified_bootloader.bin
Перезапишите загрузчик
dd, если = ~/modified_bootloader.bin =/dev/sda bs=512 count=1
Это принимает Ваш, что 'sda' является корректным блочным устройством. И обратите внимание, что шаг 4 только копирует файл в/dev/sda (который он мог, но затем Вы могли бы перезаписать больше, чем просто первый сектор если выходной двоичный файл> 512 байтов),
Очевидно, Вы не собираетесь хотеть отладить этот подход к живой системе. Это сохранит Вас много головных болей для использования некоторого x86 эмулятора как bochs, qemu или VMware Server.
Однако как Michael Burr заявил, это, вероятно, будет плохой идеей. При изменении загрузчика Windows, вероятно, оставит Вас с минимальной комнатой для Вашего собственного кода.
В основном я полагаю, что вставлю вызов и оставлю остальную часть MBR одной
Что назовет этот вызов подпрограммы? Единственный код в памяти в той точке - то, что находится в MBR или ROM.
Думайте тщательно о том, нужно ли Вам действительно это, или это нет лучшей альтернативы, прежде чем Вы проведете слишком много времени на ней. Сторонний код, написанный к MBR (кроме MBR, который загрузчик ОС помещает там), часто не хорошо принят пользователями потому что:
Таким образом, если Вы действительно решаете продолжить этот путь, действуйте осторожно и быть подготовленными к головным болям.
BIOS загружает компьютер от жесткого диска (или дисковод для гибких дисков) путем чтения первого сектора (512 байтов) каждого устройства загрузки и проверки на определенный набор байтов подписи. Если те байты найдены, 512-байтовый сектор копируется в поршень (в определенном положении) и переходы BIOS для выполнения его.
Другой затем байты подписи, 446 байтов в секторе доступны для Вас для использования в качестве программы начальной загрузки, но программа начальной загрузки должна подойти полностью к тому сектору! Начиная с 446 байтов не является очень большим, необходимо будет выполнить вызовы BIOS для копирования других секторов от жесткого диска (или дисковод для гибких дисков, или безотносительно) в поршень для выполнения их.
После того как Вы загрузились достаточно в поршень для запущения программы, перехода к ней, и Вы хороши для движения.
Именно так операционная система буквально "поднимается своими собственными начальными загрузками"
См. http://en.wikipedia.org/wiki/Master_boot_record
Теперь, нет никакой причины, которую Вы не могли записать загрузочному коду в C или C++ (или большинство что-либо еще) за исключением того, что с блоком, Вы знаете точно, какой код будет сгенерирован, и легко выполнить вызовы BIOS.
Я предложил бы, чтобы Вы записали 512-байтовый дисковод для трамбовки копировального устройства, которое загружает программу из диска в поршень и затем переходит к начальному адресу программы. Можно затем записать программу в любом языке, который Вы хотите. Следует иметь в виду, что, когда Ваш загрузочный код начинает работать, те 512 байтов являются единственной вещью, на которую можно рассчитывать как в поршне. (Ну, BIOS там, можно выполнить вызовы BIOS. BIOS также поместит некоторую информацию о системе в определенных местах в поршне...), Если Вы захотите вызвать какие-либо функции, Вы записали, что вне того сектора, необходимо загрузить их в поршень сами.
Кроме того, самый легкий способ протестировать Ваш код будет состоять в том, чтобы, вероятно, поместить его на гибкий диск и начальную загрузку от этого.
Для ответа на исходный вопрос Вы могли сохранить резервную копию старого MBR где-нибудь, и Ваш новый MBR мог загрузить Вашу функцию в поршень, выполнить его, затем загрузить исходный MBR и выполнить это, позволив окнам продолжить загружаться.
Кроме того, Michael Burr прав, получая то, что Вы хотите сделанный, будет кошмаром.
В ответе на Ваш комментарий о том, как на самом деле записать это на жестком диске, существует несколько "необработанных записей" программы, которые могут скопировать в сектор на диске. Кроме того, Вы могли просто загрузить от Linux живой CD и использовать dd для записи данных в сектор по Вашему выбору на блочном устройстве по Вашему выбору. - Простой как круг та часть.
Редактировать MBR вполне возможно из Windows (XP). Для этого используется шестнадцатеричный редактор HxD, вы можете буквально скопировать и вставить шестнадцатеричный файл поверх MBR, даже на ваш активный системный диск (используйте с осторожностью! :)) http://mh-nexus.de/en / hxd /
В качестве отправной точки a может получить MBR, исходный код которой доступен, например Grub. (Так что пусть grub выполнит загрузку Windows). Это хорошая отправная точка для внесения изменений в MBR. Редактировать MBR не должно быть слишком сложно, так как эта небольшая программа довольно проста. Однако требуются некоторые навыки 16-битного (DOS) ассемблера. Другой способ - позволить grub запускать дополнительную полезную нагрузку и вообще не менять MBR, но я на 100% уверен, что это возможно; пожалуйста, обратитесь к руководствам Grub.
Думаю, вам лучше всего использовать Linux, в нем есть nasm
для компиляции, dd
для копирования кластера (что также означает MBR) и даже меню загрузчика ( lilo
например), если вы не хотите возиться с вашими фактическими разделами.
В прошлом году мне пришлось создать свою собственную последовательность загрузки. По сути, у меня было следующее:
LILO boot menu:
-> WindowsXP
-> linux
Я хотел сделать что-то отдельно с MBR, не влияя на фактическую установку, поэтому я создал новый (небольшой) раздел и добавил его в список LILO (опуская подробности здесь), который дал это :
LILO boot menu:
-> WindowsXP
-> linux
-> TESTMBR
Таким образом, поскольку каждый раздел также имеет свою собственную MBR, я мог бы поместить туда любой дурацкий код, который хотел, без риска заблокировать себя (что немного раздражает, чтобы исправить).
Чтобы фактически изменить эту MBR, я сделал следующее:
dd if = / dev / sda3 of = / home / you / mbr − backup count = 1
nasm boot.asm -o boot.bin -f bin
исправление ошибок dd if = boot.bin of = / dev / sda3
Конечно, вы можете сделать это непосредственно в MBR диска, а не в MBR раздела, как я сделал здесь, но в моем случае это было более практично.
Что касается фактического выхода кода из MBR, вам необходимо использовать прерывание INT 13,42 , которое загружает любой кластер на диск. Для целей моего теста мне просто нужно было отобразить его содержимое, но я могу взглянуть поближе, если хотите.
Надеюсь, что это могло помочь, извините за длинный ответ.