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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • msfconsole爆破ftp_check point防火墙

    msfconsole爆破ftp_check point防火墙Msfconsole爆破ssh一:什么是sshSsh为linux系统下的远程登录命令。好比windows下的远程桌面。登录ssh后可以对服务器进行相关的操作!二:端口扫描目标发现1:用namp或者netcat扫描网络,发现我的路由器是开启了ssh服务2:用netcap扫描三:msfconsole激活成功教程密码1:msfconsole运行…

    2022年9月4日
    6
  • 阿里消息队列rocketmq_阿里云mqtt

    阿里消息队列rocketmq_阿里云mqtt最近需求需要实现收款语音的播报,如果不考虑费用问题,使用推送与百度AL开发平台的语音合成功能就可也实现收款语音的播报功能,但是考虑到费用问题,同时还考虑到ios与Android可以同步使用的问题(ps:ios如果使用推送需要把应用上架到苹果商店,需要有证书,而且还需要通过审核才能进行推送。但是目前ios的签名一般都不上架,而是进行企业签,使用第三方的分发进行软件的更新,所以一般都不考虑上架)。由此…

    2025年5月31日
    0
  • 查看mysql端口_如何查看db2数据库的端口

    查看mysql端口_如何查看db2数据库的端口mysql端口号(怎么查看mysql的端口号)2020-05-0721:54:58共10个回答如何查看mysql的端口号1使用命令showglobalvariableslike’port’;查看端口号2修改端口,编辑/etc/my.cnf文件,早期版本有可能是my.conf文件名,增加端口参数,并且设定端口,注意该端口未被使用,保存退出.总结:注意修改的端口不要被占用,而且要有规划,不要轻意的总…

    2022年10月3日
    0
  • 树莓派容易坏吗_树莓派的使用

    树莓派容易坏吗_树莓派的使用清华下载地址下载地址下载地址xshell下载地址③树莓派插入TF卡后,等连接上手机就可查看IP地址2.远程登录①打开后选择新建②软件更新源③系统更新源④开始更新4.图形化显示界面为方便大家更直观的感受,可以下载一个图形化的显示桌面,这里推荐VNC(windows也自带了该功能,因为太卡了故不推荐,想用的可以试试:远程桌面连接)⭐有条件的可以直接连上显示屏使用①VNC的网盘连接,大家直接下载就行②打开树莓派的VNCServer(默认关闭)A.在

    2022年10月9日
    1
  • puycharm激活码_通用破解码

    puycharm激活码_通用破解码,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月16日
    42
  • c#线程的使用_线程定义

    c#线程的使用_线程定义Unity3d之截图方法分类: Unity3D2013-11-2817:13 1014人阅读 评论(2) 收藏 举报AnYuanLzhunityunity3d截屏下面是我总结的、在u3d中的,三种截屏方法:1、使用Application类下的CaptureScreenshot方法。[csharp] viewplaincopyvoid CaptureScreen()   {      App

    2022年10月16日
    0

发表回复

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

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