卡住在 “setup is starting windows” 时的问题

用2003的setupldr.bin加载ram盘做XP的一些启动时发现,老是卡死在

“setup is starting windows” 这里,永远也不会恢复。

N天都无果,今天无意中发现,原来是必须是用windows 2003 sp1的setupldr.bin才行。sp2的就不行。

ramdisk.sy_ 倒是好像可以随意。

so, you must use win2k3sp1 ‘s sutupldr.bin to avoid hangs on “setup is starting windows”.

移动XP的新情况

我的WINXP移动版,也就是装在移动硬盘上的XP。在应用到我的新电脑(联想LENOVO G455A M320)时,发生了新的情况。

本来,移动的XP应该是,不论在哪里,插到新电脑上,一用USB启动,就自动进入到系统中,这样我不论在什么地方,都可以使用我原来的系统,最熟悉的系统,不用担心要同步文档配置啥的。而且这个绝对不是WINPE能比的,WINPE能在任何电脑上启动XP,但它只是用于维护和简单的使用。而移动版XP的功能是完整的,跟装在机箱内部硬盘的XP一样的功能。

移动的理想是美好的,现实是,在遇到全新的硬件时,它不一定能启动启来,可能发生BSOD 0x000007b错误。在G455A上就遇到了。

由于这个笔记本没有PCI Express Card接口,无法用我高价买的express 1394卡进行kernel debugging。它也没有串口,无法用串口kernel debuging. XP不支持USB kernel debugging, 就算换到vista或win7, 估计ehci的usb debug port也没有导出(有没有导出纯粹看运气,厂商一般不会故意导出)。总而言之,kernel debugging来诊断为什么从USB移动硬盘上启动不了,是没戏了。只能瞎子乱摸了。

说说最后的成果:
1.  HKLM\SYSTEM\MountedDevices下的值 \DosDevice\C: 必须删掉,换了硬件后,后面的二进制可能变了,不删掉此项,可能导致C盘不能挂载,从而发生蓝屏。把此功能加到移动XP的recovery module中。
2. 需要copy安装盘安装时生成的 HKLM\SYSTEM\ControlSet001\Enum\PCI 全目录。由于我在recovery module中copy的是winpe的。跟安装盘的setupldr.bin生成的PCI信息有些差别,导致不能启动。要彻底解决,必须基于安装盘而不是PE重写recovery mode。不过我没有时间搞这玩意儿了。而且接下来可能要研究移动版win7而不是XP了,所以…算了吧。

再说说过程:

由于只能瞎子乱撞的试验,最开始试了很多次都成功不了。后来还是想到,重头再来,在机器上的主硬盘上新装一个全新的XP,先不装驱动,为了省时间,反正能登录进去的XP就行了。然后改注册表重启,使得用winobj看arcnames的时候,可以看到插上电脑的USB移动硬盘的记录。看到后说明,这份COPY的XP已经可以从USB移动硬盘启动。

然后,有了一个成功的版本,也有了一个失败的版本,就让它们不断的逼近吧。这里又出了一个问题:方案上,可以用二分法快速逼近找出问题的关键,也可以用经验为主的方式进行重点排查,我选择了后者,尝试重启若干次,无果。 只好往第一种方法偏,最终发现了1和2这两个结论。少一个也不行。

我以前碰到的电脑,尝试了好多种硬件,都发现只需要COPY WINPE的PCI信息就可以修复成功启动了,但现在这电脑非得要安装时产生的。不知道是不是新硬件搞出的新脾气。

移动版XP以后也没有太大的研究价值了,希望移动版的WIN7会更容易配置。不过VISTA/WIN7的boot配置就够麻烦的了,还是boot.ini来得简洁直观。

我在一些论坛上说移动的操作系统时,总要被人用WIN  PE来拍砖。 其实移动OS是用来替换平时工作学习娱乐所用的OS的,跟WINPE主要用于维护是十分的不同。

你需要背着笔记本从家里到公司,或从宿舍到实验室吗,或者带着它从A地出差到B地吗?如果你在两处都有电脑,用移动的OS肯定好过背一台电脑。现代社会在目标地找或借一台电脑已经不难了,背个硬盘相比于背台笔记本,那肯定是爽了很多。

你需要同步在家里电脑和公司电脑上产生的不同的内容吗?如果用了移动的OS,那所有的文档设置和生产出来的文件都已经在移动硬盘上同步了,根本没有合并和版本选择的烦恼。

LINUX是很容易做成移动的OS的,微软则则不知是有意还是无意制造了一些烦恼,让你的WIN不能在移动硬盘上启动任何一台电脑,只是提供了一个用于维护的WINPE。还好XP和WIN7都是可以做成移动系统的。前者我已经成功了,后者,在网上能找到有些人的成功记录,估计应该不会太难实现。待到有空时,再搞个500G的移动硬盘,试试移动WIN7了。

折腾了一下,加强U盘的启动能力

今天新买的群联芯片的 8G U盘启动方面遇到一点问题。过程中觉得很奇怪,当然事实上是不奇怪的,只是目前bios和千差万别导致如此了。

首先是发现我的笔记本与公司电脑不一样,调好一边另一边启不动。后来发现grub4dos的启动能力强点。
就用它了,搞定一个 case。

然而又发现,在公司同样的dell 740版电脑,A机器进BIOS发现启动可选USB-HDD,而USB-ZIP旁边标示着not present.
B机器进BIOS,情况就反过来了,USB-ZIP可用,而USB-HDD则标为not present。
这两台机器,只有BIOS的版本不一样,其它硬件都一样。因为其中一台是刷过BIOS的。

这两种不同的情况导致了严重的后果。USB-ZIP的那台机器无法启动。显示
Remove disks or other media.
Press any key to restart
经查,这句话位于活动活区的第一扇区。把它改为其它值后发现,提示信息跟着变化。

这说明,bios直接启动了第一扇区的代码,未经过mbr.(mbr上装着grub4dos)

接下来就简单了,修改一下这个第一扇区的代码。还是老办法,0×40处的0×00一定要改为0×80,这是非软盘启动的基础。这个字节表示启动的介质类型。不是软盘就得填0×80。还有就是0xe6的四个字节跳转指令全部nop掉。强制用LBA方式(扩展int 13)读盘。这样不同BIOS的CHS参数不一样的问题 可以被绕过。此外0×170处的NTLDR改为GRLDR,强制启动grub4dos.

修改完成后,这个盘就可以在两台机器上都启动了。

真正的U盘启动安装XP系统,不需要PE

U盘启动安装XP,方法也有不少了。大约有以下几种:

1. 启动到dos,加载smartdrv, 用winnt安装。缺点:很慢。安装时无法给硬盘重新分区,不能格式化C盘。

2. 启动到WINPE,在WINPE里分区,格式化。可加载虚拟光驱,安装时选择高级,拷贝所有文件到硬盘。方法比较麻烦。

3. 某老外发明的,还做了一个大bat,把winxp先安装一半到U盘上,同用U盘装到系统上。兼容性差,不能从A电脑装一半再应用到B电脑。放弃。

4. 量产为USBCDROM, 受硬件条件限制,有的U盘量产的CDROM不能在某些主板上启动。不好。

我这里提出一种全新的方案,使得从U盘装XP就像U盘装vista一样,或者说像是从CDROM里装XP一样。首先,在WINXP/2003下用分区工具(如hpusbfw.exe)给U盘分区并格式化好(这样格式化的分区可直接启动ntldr)。然后,把光盘上的文件全拷到U盘根目录(其实只要拷I386目录和根目录下的win51开头的文件就行了)

很多人不会设置U盘启动ntldr,在这里说一下过程:
1. 用hpusbfw.exe格式化U盘。选fat32就行了。格完取下再插上。
2. 再次用winxp自己的工具格式化成fat32。
3. 放一个ntldr文件和boot.ini文件。boot.ini中至少有两个项目,timeout设为30秒,从U盘启动,看看有没有出现boot.ini中的选单,如果有,则成功。如果没有,那就用winhex把分区第一扇区的0×40偏移处的00改为80,然后再试。如果还是不能成功,那估计碰上死硬电脑了,请看这一篇:
http://www.swigger.net/archives/56.html

 

最后,下载这个文件: usb_inst_xp1.rar            解压密码:cygwin

把文件解开把U盘根目录。(注,解开后,ntldr/boot.ini/ntdetect.com在U盘根目录,i386下增加winnt.sif和instxp文件)

好了,现在从U盘启动,会出现启动菜单,第一次选install xp,就跟光盘安装一样了,安装时可以格式化硬盘和分区,跟光盘安装全一样。 安装过程后来要求重启时,都选 run xp ondisk1。最后安装成功后还是从这个菜单项进入windows。显示全部文件包括受系统保护的文件,去除c:\boot.ini的只读属性,把C:\boot.ini里的:

multi(0)disk(0)rdisk(1)partition(1)

 改为:

multi(0)disk(0)rdisk(0)partition(1)

即把一个1改成0.

现在可以拔除U盘,从BIOS设置硬盘启动了。xp安装完毕。就跟从光盘装一样。

尝试把windows xp装到移动硬盘上,一些情况

首先这个windows xp绝对不是win pe,PE就不用说了,放到U盘或移动硬盘上很容易。

试了把原版XP装到移动硬盘上,快成功了,以下是一些有意思的问题或情况:

1. 有的驱动会出问题,比如我最初在x200上实现装到移动硬盘,后来移到T43再移到台机。   移到台机发现一个有意思的蓝屏,查了一下是intelppm.sys引起的。而这个.sys是 intel cpu的驱动程序。它里面调用了rdmsr读寄存器,换成amd cpu它这一读就异常了intel 又没处理这个异常,就蓝屏了。其实它完全可以在driverentry里调用cpuid判断
   一下是不是自己的CPU,不是就return fail,这样就不会有问题了。这个驱动算是写得不好的。这个问题的解决方案就是把intelppm设为手动运行。(SYSTEM_START改为DEMAND_START)。还好CPU的驱动不重要,不装都没事。
2. 写得好点的驱动会判断设备存不存在或对不对,这就带来另一个问题,降低了win的启动速度。它很可能向设备发送一条命令,然后等待响应,可能要等到超时才发现没有设备。在移动硬盘上启动xp,启动画面可能要转9圈。比专为一套硬件安装的要慢一点。此外,在多台机器启动后安装了多个驱动,为了各处启动本身驱动要装得多,也导致变慢。不过还好,不是很慢。影响不大。

3. 2导致的另一个结果是,很多驱动启动失败(ms的驱动跟win32 services一样是以服务形式安装在注册表)。这样启动完后进入windows一看事件查看器,一堆的红叉叉。

4. 蓝屏是个很好的东西,内核发现什么不对就调用bugcheck蓝屏。这样我就可以根据它来查找和解决原因。这样蓝屏了无数次后终于实现了可在三台机器都启动。最难查的问题就是没有错误提示的东西。比如我在台机上启动后发现xp的主题出不来,窗口发白。手动在桌面右键那里修改一下就出主题了。这个问题就查不了,没有地方报错,估计只能每次这样手动调了。

5. windows好像还挺聪明的,我的移动硬盘的第一分区只剩下2G左右空间,它启动后很智能的把pagefile放到机器自带硬盘的主分区去了(即平时的C盘)。

 

winpe进程启动顺序

想用WINPE来做点事情,深山红叶里有个很好的迷你PE盘。只有一点点文件,才几十M。

用windbg调了一下进程启动顺序,发现如下:

首先内核创建第一个用户进程 smss.exe

后来smss.exe创建 csrss.exe

再后 csrss.exe创建winlogon.exe

winlogon创建services.exe, lsass.exe , pelogon.exe等。

如下图:

smss -> csrss.exe

-> winlogon.exe -> services.exe -setup
                -> X:\WXPE\system32\lsass.exe -setup
                -> PELOGON.EXE PECMD.EXE LOAD %SystemRoot%\SYSTEM32\PECMD.INI => pecmd.exe => showdrive.exe

因为smss和csrss是native应用程序,而winlogon开始是win32子系统程序,因此,如果想要做点事的话,还是替换winlogon.exe比较好。这样编程方便。

U盘启动小结

现在的U盘都比较大了,所以ZIP模式和HDD模式已经不太重要了,可以忽略了。

本文只说  USB-CD模式和USB-HDD模式。

USB-CD 模式是比较不错的一个方式,可惜对硬件有一定要求。现在我们去买U盘的时候,能买到一些U盘带有一些特殊的功能,比如杀毒功能。这种U盘插入电脑后,会多出两个盘符,一个是光盘,里面放的是实现这些特殊功能的软件,还有一个就是移动盘符,也就是给用户使用的U盘存储了。

那么,这个光盘是怎么出来的呢?实际上,每个U盘都可以这样造出光盘来,用量产工具就可以了,量产工具可以在这里找到:

http://bbs.mydigit.cn/read.php?tid=20620

不过,这样生产出来的光盘,不一定能用来启动。这跟BIOS有关系,一个U盘上同时有光盘和移动存储时,可能有两种情况。情况A:光盘在前面,移动存储在后面。情况B:移动存储在前,光盘在后。

如果碰到情况B,问题不太好办。有的主板只认第一个东西。比如IBM笔记本,我的T43和刚买的X200,BIOS都不支持这种状况。碰到情况A就比较好了。遗憾的是,这个A和B不是自己能选的,量产工具并不支持调整,所以,只能买不同芯片的U盘来达到这一目的。目前我用过的,只有iCreate的芯片的量产工具是支持情况A的。有了这样的U盘后,量产一下,只要主板支持USB-CD,就什么ISO都能拿来启动了。

小结一下步骤:

  1. 确定U盘的量产工具
  2. 量产放入一个支持启动的ISO。
  3. 改BIOS从USB-CD启动,实验。如果主板支持情况B,则什么U盘都能启动。
  4. 如果主板不支持情况B,就只能去找个别的芯片的U盘了,比如找个iCreate芯片的。然后重新从2试。

另一模式是USB-HDD模式。对于U盘,如果量产时设置成移动型,那么windows在格式化时,不会生成分区表,不会有MBR,这样主板是不认识也不能启动的。可以在linux下fdisk,可以生成MBR和分区表。当然,不用linux的话,下载一个HPUSBFW.exe格式化一下,也有MBR和分区表了。不过用hpusbfw格式化后,最好再用XP自己格一下,这样生成的分区就肯定支持启动微软自家的NTLDR了。启动了NTLDR其它都好办了。不过整完后,还需要用winhex改一下,把分区改为活动的,可以用winhex打开整个设备,改一下0x1be处,把00改为80。还需要改一下分区,用winhex打开格式化后的分区,把0×40处从00改为80。这样后,把C盘的NTLDR,NTDETECT.com,boot.ini放过去,就可以实验一下支持启动的感觉了。

小结一下步骤:

  1. 用HPUSBFW.exe格式化U盘为FAT32格式。假设完成后有M盘。
  2. 用XP自己格一下M盘,确保启动代码更适合微软的NTLDR。
  3. 用Winhex的打开磁盘功能,打开物理设备(physical media)下的U盘,改0x1be处,从00改为80。
  4. 用winhex的打开磁盘功能,打开逻辑驱动器M盘,把0×40处从00改为80。(注:如果不是FAT/FAT32这样做就损坏数据了)
  5. 此U盘已经能以USB-HDD形式启动,可以放入C盘下的ntldr,ntdetect.com,boot.ini去试验。试验时确保boot.ini具有多项,且等待时间较长,这样就能看到选择启动的画面,从而确定此U盘已经确实能支持启动。

将深山红叶放到U盘上的办法

这个网上有很多人说,有的人整出了非常复杂的办法,我也是很久之前研究的了,还是写下来,否则下次还要到处找。

方法超级简单,对于深山红叶,最终版似乎就是 V30正式版,也就是所谓的“嫦娥一号记念版”。

这个版本打开后目录结构如下:

I:.
│  WINNT.XPE
│  WINPE.IS_
│  深山红叶系统工具箱.EXE
│ 
├─BOOT
│  │  CDMENU.BIN
│  │  CDMENU.EZB
│  │  DOS98.IMG
│  │  GRLDR
│  │  ISOGRUB.BIN
│  │  LOADER.BIN
│  │  MEMTEST.BIN
│  │  MENU.BM1
│  │  MENU.BMP
│  │  SETDOS.CMD
│  │  STAGE2
│  │  WINDIAG
│  │  WINPE.INI
│  │  WINS.BIN
│  │  XLYBIG.IMG
│  │ 
│  └─GRUB
│          CDBOOT.BS
│          FAT_STAGE1_5
│          HD_MENU.LST
│          MEMDISK.GZ
│          MENU.LST
│          NTFS_STAGE1_5
│          STAGE1
│          STAGE2
│         
├─PROGRAMS (文件太多,此处省略)
│             
└─WXPE
        NTDETECT.COM
        SETUPLDR.BIN

先确保U盘可以启动NTLDR,

然后把所有文件copy到U盘上,把WXPE下的两个文件移到U盘根目录,将Setupldr.bin改名为NTLDR

BOOT目录下只留WINPE.ini,其它全删。

这样就完成了把深山红叶最终版的U盘化。汗,是不是太简单了,但在不知道方法去试的时候,还是很麻烦的。

最后的目录结构如下:

Z:.
│  NTLDR
│  WINPE.IS_
│  深山红叶系统工具箱.EXE
│  NTDETECT.COM
│  WINNT.XPE
│ 
├─PROGRAMS  (文件太多,此处省略)
│             
└─BOOT
        WINPE.INI

说明:BOOT下本来有很多文件,可以完成很多的功能,用了这种办法来启动后,这些功能都做不到了(比如启动到DOS,微软内存检测等)。试过了用ezboot的那些东西在非光盘上是用不了的。所以这些文件就都删了。

当然这些功能要加回来,还是很简单的,在这个方法上添加就行了。可以用grub4dos来启动,添加这些功能。