Блин, не могу отверждать на 100%, но что-то мне подсказывает что реальный размер первичного загрузчика не должен превышать 440 байт, а остальные из 512 - это какая-то там информация о файловой системе вроде бы. Я боюсь сбить с толку, но что-то такое крутится в голове. Так вот если логично порассуждать, NTLDR как раз и говорит тебе что у него возникли какие-то непонятки с файловой системой. UPD. Вот цитата с педивикии: UPD2. Это все опять на тему того, что виндовый MBR может ожидать эти 72 байта по другому адресу.
MS-DOS 5.1 файл-системa. herfleisch, для интереса, посмотри на первые 512 байтов с HDD. не просто так научился, и Вин и Линукс пользоваться одной партицией swap файла. изврат, но учит правильному подходу к загрузке MBR. да, и методу научил парень с PCFormat журнала. .UK ему в рот палец не клади - сначала постебётся и поглумится, и толково решит задачу, сцукан ))
это все ***ня чуваки,потому что вот что у меня вышло:watch (извините за такое видио конечно) и у меня теперь несколько догадок почему не пашет. я тупо охуевший как оно заработало,я его наказал бля)))
Поздравляю . То есть у тебя получилась такая же ситуация, которую я в личке описывал: в виртуалке не пашет, а на железе все заработало?
ну оно на флопе запахало,а как на ж\д себя поведет еще не понятно. в этом пришлось указывать параметры boot сектора, такие как: кол-во байтов на сектор,кол-во секторов на кластер,кол-во секторов на трэк, OEM идентификатор и прочую ересь.а так по идее надо лишь запомнить младший байт dx где при старте указывается с какого устройства мы загрузились и pop-ить его в прерывании int 13. на своем компе так впадло это все вытворять) а да еще что забыл сказать: при добавлении или убирании кода который запускается в скопированном в участке памяти,меняется сегмент:смещение по которому прыжок происходит,и увидеть эту хрень сразу тяжеловато,по этому для 100% точности что мы попадаем в копию нашего кода в памяти -лучше всего смотреть в дебагер.хотя можно делать просто вычитание с 7c00h до нашего адреса куда копируемся а потом джампать.
DooD лично я записывал на 1 сектор флехи отформатированной в FAT не трогая таблицу секций и на виртуалке VMware ставил загрузку с флешки - в итоге он обрабатывал бут из флехи - там уже и игрался - для отладки использовал вывод символа через прерывания BIOS - мол если все нормально прошло и код сработал до нужного места вылезет символ.
Кстати, тока сейчас в голову пришло, винда реально может не грузится, ведь MBR это не BOOT. Вдруг какой-то код винды считывает повторно MBR и пытается там найти таблицу разделов?
похоже что все же надо дизасмить код венды. там есть такая штука как BPB ее похоже требует сама файловая система для загруза.
и так дело вроде тронулось с мертвой точки.как я и сказал все дело в заполнении BPB. теперь хотя бы резидентный код запускается:я вижу свое сообщение,жму клавишу и ...все-выскакивают какие то иероглифы.. сравнивая первые 54h байтов с вендовым загрузчиком увидел лишь несколько не совпадений в байтах..дальше в ступоре почему не работает.
короче я еще не плюнул на это все. значит так,я отладил код ровно до считывания сектора в борще,все выводится,но по нажатию клавиши просто мигает сообщение,вижу два варианта:либо не читается сектор,либо код самозатирается(хотя этого вроде нету). сейчас ломаю моск что бы запилить на борщ венду,как запилю буду дебажить в нем уже с сектором,там и разберемся что да как.
итак вот что показал отладчик получается что по адресу старта все равно висит мой же код,какого черта не пойму.у кого какие идеи еще есть?читаю как видите CHS может попробовать LBA? хотя по идее что то ,что это должно работать. не большие поправки: там я затирал dx и не знал номер диска соответственно я прыгал сам на себя.-исправил путем записи номера диска в переменную,однако посмотрев содержание dl после стартапа увидел почему то 0x00... upd теперь вижу 0x80, но теперь когда отдаю управление на 0x7c00 вижу что там вообще пусто! upd upd/^ ес !! получилось,теперь я читаю сектор и прыгаю на него,но тут снова проблема)
в общем то результат следующий, один диск как бы подразделяется на 2 ,как я понял логический и физический. winhex показал что 0-й сектор это 63 сектор на логическом(то есть они совпадают).я меняю 0-й на логическом на свой mbr, тут все читается и управление отдается,но вот выбивается такая вздрочь:NTLDR: Couldn't open drive multi(0)disk(0)rdisk(0)partition(1) ... короче кажется он раздел не может найти...давайте люди подскажите бо я уже совсем не соображаю)
ну вот же был пример Code: ;регистр dl cодержит номер загрузочного диска! use16 ;======== Копируем самого себя по адресу 0000:0600h =================== mov ax, 7C0h mov ds, ax xor si, si mov ax, 60h mov es, ax xor di, di mov cx, 0FFh ;в cx лежит число повторений функции копирования слов ;[DS:SI] => [ES:DI]; SI += 2; DI += 2; rep movsw ;Передаем управление на новое расположение кода jmp 0000:0618h ;======== Приветствуем пользователя =================================== mov ax, hello_msg_1 call print mov ax, hello_msg_2 call print ;======== Проверяем таблицу разделов =================================== mov si, [part_adr] mov bh, 80h mov cl, -1 partitions_chek: cmp cl, 3 ;если уже было проверено 4 записи, выходим из цикла и переходим к обработке записей je partition_select add si, 10h inc cl mov bl, [es:si] cmp bl, bh jne partitions_chek ;запись не является загрузочной call partitions_process ;запись загрузочная! ;[es:si] содержит адрес записи в таблице разделов ;cl - номер раздела jmp partitions_chek ;======== Подпрограмма вывода инофрмации об активном разделе ============================= partitions_process: mov ax, boot_part_msg call print mov di, part_num add [ds:di], cl mov ax, part_num call print sub [ds:di], cl mov di, boot_flags mov ch, 0 add di, cx mov byte[ds:di], 1 ret; ;======================================================================= partition_select: ;Обрабатываем пользовательский ввод mov ax, select_part_msg call print choise: mov di, boot_flags mov si, [part_adr] mov ah, 0 int 16h p0: cmp al, 48 jne p1 add si, 10h jmp disk p1: cmp al, 49 jne p2 add si, 20h jmp disk p2: cmp al, 50 jne p3 add si, 30h jmp disk p3: add si, 40h cmp al, 51 je disk wrong_choise: mov ax, wrong_input_msg call print jmp choise disk: mov ah, 0 sub al, 48 ; сначала проверка, выбрал ли пользователь действительно загрузочный раздел add di, ax cmp byte [ds:di], 0 je wrong_choise ; по [es:si] содержится запись таблицы разделов ; о выбранном загрузочном диске mov ah, 41h ; проверка поддержки диском расширенного режима (> 8 GB) ; dl содержит номер диска mov bx, 55AAh int 13h jc ext_not_present_error shr cx, 1 jnb ext_not_present_error cmp bx, 0AA55h je read_boot_sect ext_not_present_error: mov ax, ext_not_pres_msg call print int 18h read_boot_sect: mov ah, 42h mov di, DAP_structure add di, 8 add si, 8 mov ebx, [ds:si] mov [ds:di], ebx mov si, DAP_structure int 13h jc ext_not_present_error jmp 0000:7C00h ;======== Подпрограмма вывода сообщений ================================ print: push si push bx mov bx, ax xor si, si mov ah, 0Eh p: mov al, [bx + si] cmp al, 0Ah int 10h je end_print inc si jmp p end_print: pop bx pop si ret ;======================================================================= hello_msg_1 db '************************', 0Dh, 0Ah hello_msg_2 db '* LOADER *', 0Dh, 0Ah boot_part_msg db 'Find bootable partitions:', 0Dh, 0Ah select_part_msg db 'Select part to boot from (press 0 ... 3)', 0Dh, 0Ah wrong_input_msg db 'Wrong choise. Try again', 0Dh, 0Ah ext_not_pres_msg db 'a disk read error occured', 0Dh, 0Ah part_num db '0', 0Dh, 0Ah part_adr dw 1AEh boot_flags db 4 dup (0) DAP_structure db 10h, 0, 1, 0, 0, 7Ch, 0, 0, 8 dup (0) и можно посмотреть что у тебя получилось?
не заработает это.попзже все оформлю и можно будет. даю подсказку пока,суть кроется в разделении диска на физич.\логич.
апаю последний раз,если интересно читаем что получилось http://bydood.blogspot.com/2013/02/2013.html + отладка