vista开机启动项怎么设置_windows7/vista with slic loader

vista开机启动项怎么设置_windows7/vista with slic loader原文链接:http://advdbg.org/blogs/advdbg_system/articles/784.aspx在Vista之前,NTLDR是Windows操作系统的加载程序,它负责将CPU从实模式切换为保护模式,加载内核文件和启动类型的驱动程序,然后把执行权交给内核文件的入口函数,即KiSystemStartup。从要完成的任务角度来看,NTLDR内部又分为两个部分,一部分负

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用
原文链接:http://advdbg.org/blogs/advdbg_system/articles/784.aspx

在Vista之前,NTLDR是Windows操作系统的加载程序,它负责将CPU从实模式切换为保护模式,加载内核文件和启动类型的驱动程序,然后把执行权交给内核文件的入口函数,即KiSystemStartup。

从要完成的任务角度来看,NTLDR内部又分为两个部分,一部分负责接受执行权,做模式切换,硬件检查,即启动的准备工作,这部分通常称为boot;另一部分负责加载内核文件,并为内核的运行做必要的准备,通常称为OsLoader。

Vista将以上两个部分分成两个独立的程序文件,即BootMgr和WinLoad.exe。下图描述了BootMgr和WinLoad的相互关系和它们在启动过程中的作用。

vista开机启动项怎么设置_windows7/vista with slic loader

与调试NTLDR需要替换check版本的NTLDR不同,在BootMgr和WinLoad内部都已经内建了调试引擎,这与内核的做法是一致的。因此,如果要调试BootMgr和WinLoad只要启动它们内部的调试引擎,不需要替换这两个程序文件。

启用BOOTMGR调试的方法是在具有管理员权限的控制台窗口中执行如下命令:
bcdedit /set {bootmgr} bootdebug on
bcdedit /set {bootmgr} debugtype serial
bcdedit /set {bootmgr} debugport 1
bcdedit /set {bootmgr} baudrate 115200

其中后三行是设置调试器与调试引擎的连接方式,如果使用1394,那么应该设置为:

bcdedit /set {bootmgr} debugtype 1394
bcdedit /set {bootmgr} channel 22

做以上设置后,重新启动系统,BIOS阶段过后,屏幕会保持黑色,呈现无法继续启动的样子,事实上,这是BootMgr在等待与调试器建立连接。连接好电缆后,启动WinDBG调试器,二者就会建立连接,显示类似下面这样的信息:

Microsoft (R) Windows Debugger Version 6.9.0003.113 X86
Copyright (c) Microsoft Corporation. All rights reserved.

Opened \\.\com1
Waiting to reconnect…
BD: Boot Debugger Initialized
Connected to Windows Boot Debugger 6000 x86 compatible target, ptr64 FALSE
Kernel Debugger connection established.
Symbol search path is: SRV*d:\symbols*http://msdl.microsoft.com/download/symbols
Executable search path is: 
Windows Boot Debugger Kernel Version 6000 UP Free x86 compatible
Product: unknown <ffffffff>, suite: SmallBusiness Enterprise BackOffice CommunicationServer TerminalServer SmallBusinessRestricted EmbeddedNT DataCenter SingleUserTS Personal Blade EmbeddedRestricted SecurityAppliance StorageServer ComputeServer <8000>
Primary image base = 0x00400000 Loaded module list = 0x004ffff8
System Uptime: not available

其中0x00400000是BootMgr模块的基地址。BootMgr的主要代码都是32位的,只有一小部分16位代码,负责从固件那里接过控制权。另外,值得说明的是,BootMgr是工作在保护模式下的,但它没有启用分页机制,只是使用分页机制。观察CR0和CR3寄存器的取值,可以证明这一点:

kd> r cr0
cr0=00000011
kd> r cr3
cr3=00000000

建立连接后,WinDBG会让BootMgr继续运行,BootMgr通常会显示启动菜单。此时按下Ctrl+Break键,那么BootMgr就会中断到调试器中,此时可以执行各种内核调试命令,比如:

kd> lm
start    end        module name
00400000 00514000   bootmgr    (pdb symbols)          d:\symbols\bootmgr.pdb\819F5A93195D47E3857ED729B0D341191\bootmgr.pdb
微软的符号服务器提供了BootMgr的公开符号文件,因此只要设置好符号服务器的路径,那么WinDBG就可以自动下载合适的符号文件。

kd> x bootmgr!*
0042b3fd bootmgr!TpmApiAuthSessCreateOSAP = <no type information>
0044c4da bootmgr!CmpGetIndexElementSize = <no type information>
00452d54 bootmgr!RcConsoleBaudRates = <no type information>
0042f56f bootmgr!OsxmlBrowser::~OsxmlBrowser = <no type information>
00431b10 bootmgr!XslStylesheet::getContents = <no type information>

…….

当然也可以使用栈回溯命令来观察函数调用情况:

kd> kv
ChildEBP RetAddr  Args to Child              
00061e34 00430c7e 001b6380 00000001 00061e90 bootmgr!DbgBreakPoint 
00061e44 0043024f 00061e8c 001b63b8 00061e88 bootmgr!BlXmlConsole::getInput+0xe  
00061e90 004024c1 00000002 004021f3 00000000 bootmgr!OsxmlBrowser::browse+0xe0  
00061e98 004021f3 00000000 00000000 00061f8f bootmgr!BmDisplayGetBootMenuStatus+0x13 (FPO: [0,0,1])  
00061f10 004017a4 00104f9c 001f4280 00000002 bootmgr!BmDisplayBootMenu+0x174  
00061f6c 00401261 00104f9c 00061f9c 00000002 bootmgr!BmpGetSelectedBootEntry+0xf8 
00061ff0 000209ea 000249a8 7d8b697c 74ff8514 bootmgr!BmMain+0x261  
WARNING: Frame IP not in any known module. Following frames may be wrong.
00000000 f000ff53 f000e2c3 f000ff53 f000ff53 0x209ea
00000000 00000000 f000e2c3 f000ff53 f000ff53 0xf000ff53

通过以上栈回溯可以看到,BmMain是BootMgr的32位代码入口函数;BmDisplayBootMenu是负责显示和管理启动菜单的主要函数。BmMain下方的几个栈帧应该是16位代码执行时留下的痕迹。

对BmpGetSelectedBootEntry函数的返回地址00401261设置个断点后,按F5让目标系统继续执行,此时目标系统的菜单可以活动了,选择引导Vista的一项后,刚才设置的断点立刻命中,单步跟踪可以看到BootMgr加载WinLoad的过程,其中的主要函数有:

bootmgr!BmpLaunchBootEntry

bootmgr!ImgArchPcatStartBootApplication

在BootMgr将执行权交给WinLoad之前,它会调用BlBdStop与调试器断开连接。

如果想继续调试WinLoad,那么应该先启用WinLoad中的调试引擎,其命令是:
bcdedit /set {GUID} bootdebug on

WinLoad启动后,如果它的调试引擎已经启用,那么调试引擎也会与调试器建立连接,并显示与前面类似的建立链接信息。以下是WinLoad中的几个重要函数:

winload!MmArchInitialize

winload!ArchBuildKernelGdt

winload!OslArchpKernelSetupPhase0

winload!OslArchTransferToKernel

其中最后一个负责将执行权转交给内核。移交执行权之前,WinLoad也会调用BlBdStop函数来切断调试会话。如果要继续调试内核,那么应该先启用内核调试,然后在内核阶段再与其建立连接。

如果系统是从休眠中恢复,那么BootMgr会加载WinResume,WinResume中也集成了一个调试引擎,因此也可以对其进行跟踪和调试,例如,下面的栈回溯显示了WinResume程序初始化的过程:

kd> kPL

ChildEBP RetAddr 

00120ad8 0059da7f winresume!RtlpBreakWithStatusInstruction

00120cf0 0059d97d winresume!vDbgPrintExWithPrefixInternal+0x100

00120d00 0059641a winresume!DbgPrint+0x11

00120d28 00587550 winresume!BlStatusPrint+0x60

00120d6c 00585524 winresume!ConsoleFirmwareOpen+0x64

00120d88 0058373d winresume!ConsoleOpen+0x58

00120da8 00583242 winresume!BlpDeviceOpen+0x13c

00120dc4 0058bd5b winresume!BlDeviceOpen+0x16

00120ed8 0058bcc7 winresume!DsppRegisterConsole+0x56

00120f6c 0058b999 winresume!DsppInitialize+0xfd

00120f78 005950a2 winresume!BlpDisplayInitialize+0x26

00120f94 0057c0c6 winresume!InitializeLibrary+0x176

00120fe8 004444fa winresume!HbMain+0xc6

WARNING: Frame IP not in any known module. Following frames may be wrong.

00000000 f000eef3 0x4444fa

00000000 00000000 0xf000eef3

 

概而言之,在一个安装好的Vista系统中,已经内建了四个调试引擎,分别位于BootMgr、WinLoad、WinResume和NTOSKRNL.exe中,可以将这几个调试引擎同时启用,也可以根据需要启用其中的某一个。前三个调试引擎是根据位于内核中的内核调试引擎(KD)克隆出来的,它们使用与KD兼容的协议,对调试器(WinDBG)来说,它并不区分对方是真正的KD还是KD的克隆。因此在BootMgr中断调试会话时,WinDBG提示的信息和内核退出时的信息一样的。

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/183325.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • [栈] 表达式求值 – C语言(多位数求值,2位数以上)

    [栈] 表达式求值 – C语言(多位数求值,2位数以上)【理论】https://blog.csdn.net/summer_dew/article/details/82048387【代码说明】支持:2位以上的数字,四则运算和幂运算使用的栈,是自己实现,封装在2SqStack.h文件中的,可自己实现,也可以参照:https://blog.csdn.net/summer_dew/article/details/82051767【结果】测试:…

    2022年6月22日
    32
  • 图片批量重命名方法(超详细 无需辅助软件 本地运行)

    图片批量重命名方法(超详细 无需辅助软件 本地运行)图片批量重命名,完整步骤,后续补充内容包括读取所有图片名称输出到excel等……

    2025年9月15日
    7
  • sdn网络设备主要负责_sdn 解决方案

    sdn网络设备主要负责_sdn 解决方案ONOS问世后引起广泛关注,关于ONOS与ODL的纷争不绝于耳。为了应对日益增长的带宽需求,服务提供商希望网络可以更加敏捷高效,且能从创新型服务和新型业务模式中分一杯羹得到更好的发展,至此SDN的呼声越来越高。而SDN中控制器占重要部分,是兵家必争之地,陆陆续续已经出现了很多SDN控制器,如OpenDaylight、OpenContrail、Ryu、Floodlight、NOX、SPOX等等,其中

    2022年9月6日
    6
  • java 文本关键字查找功能原理和代码

    java 文本关键字查找功能原理和代码java 文本关键字查找功能原理和代码

    2022年4月23日
    39
  • 安卓安装包签名_笔记签名验证

    安卓安装包签名_笔记签名验证我们知道,一款Android要发布的话,必须经过签名,Android目前支持的签名方式包括三种:v1方案:基于JAR签名。 v2方案:APK签名方案v2(在Android7.0中引入)。 v3方案:APK签名方案v3(在Android9中引入)。为了最大限度地提高兼容性,请按照v1、v2、v3的先后顺序采用所有方案对应用进行签名。与只通过v1方案签名…

    2025年7月10日
    2
  • countdowntimer_TIMESTAMPDIFF

    countdowntimer_TIMESTAMPDIFF需求:加载某一个界面,在页面中待5秒后再关闭效果图如下:设置了一个点击事件,当文字显示为Skipactivity时,点击跳转界面。代码及介绍如下图:核心功能代码如下Android自带的CountDownTimer这个工具类,也是通过Handler和子线程来实现的。//倒计时工具类CountDownTimer//CountDownTimer的构造方法有两个参数…

    2022年9月18日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号