在编译的时候改变一下基址或把它编译成 .com 文件格式再用 TC 调试肯定没问题。
但是楼主说是要:“但是,现在我需要把引导程序跟WINDOWS结合。”,这种做法和他的要求不符。
只有“虚拟机级别”的调试才能满足需要,“OS级别的调试”太晚,而“编译器级别的调试”仅仅是程序本身除错。
除了OS级的调试入口在我上面的回帖以外,Win 还支持 Ntldr 的调试和跟踪。后者显然比前者跟早,方法是 调试版的 ntldr / osloader 以及他们的符号。
我现在的 osloader 符号不完全正确,下初始化断点之后,windbg 可以识别模块名,而不能识别函数名。但是,对我来说这不是致命的,没有符号并不等于不能工作。 ; )
*** WARNING: Unable to verify timestamp for osloader.exe*** ERROR: Module load completed but symbols could not be loaded for osloader.exeosloader+0x1b438:0041b438 cc int 3
这就是这个 Loader 的断点,位于 osloader+0x1b438 。如果符号正确的话,应该显示为: osloader!DbgBreakPoint。
请参见下面的描述:When the debugger breaks in, you will see a message that the symbol checksum cannot be verified. Ignore this message! If you want to verify that your symbols are correct, do a stack trace and make sure the first line of the stack trace says osloader!DbgBreakPoint.
反汇编信息:kd> u 0041b438 l30osloader+0x1b438:0041b438 cc int 30041b439 c20400 ret 40041b43c 55 push ebp0041b43d 8bec mov ebp,esp0041b43f 33c0 xor eax,eax0041b441 8a4508 mov al,byte ptr [ebp+8]0041b444 25ff000000 and eax,0FFh0041b449 6685c0 test ax,ax0041b44c 742c je osloader+0x1b47a (0041b47a)0041b44e 663d0100 cmp ax,10041b452 7426 je osloader+0x1b47a (0041b47a)0041b454 a8f0 test al,0F0h0041b456 7407 je osloader+0x1b45f (0041b45f)0041b458 b85f0200c0 mov eax,0C000025Fh0041b45d eb20 jmp osloader+0x1b47f (0041b47f)0041b45f ff751c push dword ptr [ebp+1Ch]0041b462 0fb7c0 movzx eax,ax0041b465 ff7518 push dword ptr [ebp+18h]0041b468 ff7514 push dword ptr [ebp+14h]0041b46b ff7510 push dword ptr [ebp+10h]0041b46e ff750c push dword ptr [ebp+0Ch]0041b471 ff14853c384300 call dword ptr osloader+0x3383c (0043383c)[eax*4]0041b478 eb05 jmp osloader+0x1b47f (0041b47f)0041b47a b80d0000c0 mov eax,0C000000Dh0041b47f 5d pop ebp0041b480 c21800 ret 18h0041b483 55 push ebp0041b484 8bec mov ebp,esp0041b486 33c0 xor eax,eax0041b488 8a4508 mov al,byte ptr [ebp+8]0041b48b 25ff000000 and eax,0FFh0041b490 6685c0 test ax,ax0041b493 7429 je osloader+0x1b4be (0041b4be)0041b495 663d0100 cmp ax,10041b499 7423 je osloader+0x1b4be (0041b4be)0041b49b a8f0 test al,0F0h0041b49d 7407 je osloader+0x1b4a6 (0041b4a6)0041b49f b85f0200c0 mov eax,0C000025Fh0041b4a4 eb1d jmp osloader+0x1b4c3 (0041b4c3)0041b4a6 ff7518 push dword ptr [ebp+18h]0041b4a9 0fb7c0 movzx eax,ax0041b4ac ff7514 push dword ptr [ebp+14h]0041b4af ff7510 push dword ptr [ebp+10h]0041b4b2 ff750c push dword ptr [ebp+0Ch]0041b4b5 ff14857c384300 call dword ptr osloader+0x3387c (0043387c)[eax*4]0041b4bc eb05 jmp osloader+0x1b4c3 (0041b4c3)0041b4be b80d0000c0 mov eax,0C000000Dh0041b4c3 5d pop ebp
最后,楼主要干的事情,我原来干过的,截些图给你看看 (我用的 freeldr + Ntoskrnl):NTOSKRNL.EXE not found 的原因是我用的 软盘镜像 来模拟启动区和磁盘本身,NTOSKRNL.EXE 的大小超过 1.44MB,所以得用更大的磁盘镜像才能继续,那样的话我可能还需要重写引导扇区的代码,现在我的引导扇区代码只支持 FAT-12 文件格式,懒得改了,过几天再说~ ^_^