无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 9799|回复: 16
打印 上一主题 下一主题

0PEv1.0.7菜单分析

[复制链接]
跳转到指定楼层
1#
发表于 2010-3-4 14:33:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
参考了stevenldj (不懂) 大大的文章http://bbs.wuyou.net/forum.php?mod=viewthread&tid=148300&highlight=0PE%2B%B5%C4%D7%A8%D3%C3%B2%CB%B5%A5%CE%C4%BC%FE

另外做了一个UE下的GRUB高亮,在附件里。

  1. # 启动ISO的路径
  2. #write (md)0x301+1 /ISO/XP_CON.ISO
  3. #指定串/ISO/XP_CON.ISO长为15个字符
  4. #write 0x60360 15
  5. #0x8280 启动设备变量,0x21为从PXE启动,0x80为从HD启动,0xC0为坐CD启动
  6. # 设置屏幕颜色
  7. color white/blue blue/yellow light-red/blue 10
  8. # 关闭 Debug
  9. debug off
  10. # 如果没有菜单传参则检测 PXE
  11. # pseudo 大侠发明的写法,指定一个不存在的配置文件“NoExist”
  12. # 让 PXE 启动时不去搜索 PXE 服务器上的其他配置文件,加快启动速度。
  13. checkrange 0x60300 read 0x60300 || pxe detect NotExist
  14. # 如果有传参则进入菜单 16
  15. checkrange 0x60300 read 0x60300 && default 16
  16. # 如果有传参则进入菜单 1
  17. checkrange 0x60300 read 0x60300 || default 1
  18. # 如果有传参则不等待
  19. checkrange 0x60300 read 0x60300 && timeout 0
  20. # 如果有传参则不等待 5 秒
  21. checkrange 0x60300 read 0x60300 || timeout 5
  22. # 存放选中的菜单项序号 | MenuNum
  23. checkrange 0x60300 read 0x60300 || write 0x60100 0
  24. # 存放出错标记 | ErrorFlag  0 错误  1 正确
  25. write 0x60000 0
  26. # 这个好象未使用
  27. write 0x60060 0
  28. # 存放 PXE 启动标记 | PXEBoot  1 从 PXE 启动
  29. write 0x60064 0
  30. # 这个好象未使用
  31. write 0x60068 0
  32. # 存放 CDROM 启动标记 | CDBoot  1 从 CDROM 启动
  33. write 0x6006C 0
  34. # 存放 Debug 状态 | DebugFlag  1 打开 Debug
  35. write 0x60110 0
  36. # 保存当前根分区号 | RootDriveID
  37. write 0x60130 0
  38. # 保存当前根驱动器 | RootDrive
  39. write 0x60134 0
  40. # 这个好象未使用
  41. write 0x602A0 0
  42. #  判断是否从 PXE 启动
  43. checkrange 0x21 read 0x8280 && write 0x60064 1
  44. # 菜单 0
  45. title               0PE v1.0.7 for Windows XP  by Pseudo 2010.02.10
  46. # 空菜单
  47. clear
  48. # 菜单 1
  49. title   [1] Windows PE
  50. # 设置菜单选择标记
  51. write 0x60100 1
  52. # 通过错误语句跳转到菜单 13
  53. fallback 13
  54. kernel
  55. # 菜单 2
  56. title   [2] Setup /WIN$.ISO\n   Install XP/2003 to SATA/RAID Hard Disk.
  57. # 设置菜单选择标记
  58. write 0x60100 2
  59. # 通过错误语句跳转到菜单 13
  60. fallback 13
  61. kernel
  62. # 菜单 3
  63. title   [3] Load ISO (/PE.ISO as default)
  64. # 设置菜单选择标记
  65. write 0x60100 3
  66. # 通过错误语句跳转到菜单 13
  67. fallback 13
  68. kernel
  69. # 菜单 4
  70. title   [4] User Menu With F6 Stage
  71. # 设置菜单选择标记
  72. write 0x60100 4
  73. # 通过错误语句跳转到菜单 13
  74. fallback 13
  75. kernel
  76. # 菜单 5
  77. title   [5] Tiny MS DOS 7.1
  78. # 设置菜单选择标记
  79. write 0x60100 5
  80. # 通过错误语句跳转到菜单 13
  81. fallback 13
  82. kernel
  83. # 菜单 6
  84. title   [6] Debug On
  85. # 清屏
  86. clear
  87. # 关闭 Debug
  88. debug off
  89. # 关闭错误检测
  90. errorcheck off
  91. # 通过错误语句返回,关闭错误检测后本语句失效?
  92. kernel
  93. # 打开错误检测
  94. errorcheck on
  95. # 如果 DebugFlag 为 0,则设置 DebugFlag 2
  96. read 0x60110 || write 0x60110 2
  97. # 如果 DebugFlag 为 1,则设置 DebugFlag 0
  98. checkrange 1 read 0x60110 && write 0x60110 0
  99. # 如果 DebugFlag 为非 0(比如为 2),则设置 DebugFlag 1
  100. read 0x60110 && write 0x60110 1
  101. # 根据 DebugFlag,设置 Debug 状态
  102. read 0x60110 || debug off
  103. # 根据 DebugFlag,设置提示信息
  104. read 0x60110 || pause Debug is now off...
  105. read 0x60110 && pause Debug is now on...
  106. # 根据 DebugFlag,设置 Debug 状态
  107. read 0x60110 && debug on
  108. # 菜单 7
  109. title   [7] USB2.0 Module\n   /0PE/SRS/PLPBT.BIN
  110. # 查找所有盘的 /0PE/SRS/PLPBT.BIN
  111. find --set-root /0PE/SRS/PLPBT.BIN
  112. # 内核模式加载 /0PE/SRS/PLPBT.BIN
  113. kernel /0PE/SRS/PLPBT.BIN
  114. # 提示 /0PE/SRS/PLPBT.BIN 加载完成并返回
  115. pause USB2.0 Module is ok! Press any key to continue... || clear
  116. # 菜单 8
  117. title   [8] KonBoot for 2K/XP/2K3/VISTA/2K8\n   For Bypass NT Admin Account
  118. # 查找所有盘的 /0PE/SRS/KONBOOT.GZ
  119. find --set-root /0PE/SRS/KONBOOT.GZ
  120. # 磁盘模式加载 /0PE/SRS/KONBOOT.GZ
  121. map --mem /0PE/SRS/KONBOOT.GZ (fd0)
  122. # 激活 map 的结果
  123. map --hook
  124. # 设置 root 为 KONBOOT.GZ 的装载位置
  125. rootnoverify (fd0)
  126. # 引导 KONBOOT.GZ
  127. chainloader (fd0)+1
  128. # 菜单 9
  129. title   [9] Load /DOS.IMG
  130. # 查找所有盘的 /DOS.IMG
  131. find --set-root /DOS.IMG
  132. # 磁盘模式加载 /DOS.IMG
  133. map --mem /DOS.IMG (fd0)
  134. # 激活 map 的结果
  135. map --hook
  136. # 设置 root 为 DOS.IMG 的装载位置
  137. rootnoverify (fd0)
  138. # 引导 DOS.IMG
  139. chainloader (fd0)+1
  140. # 菜单 10
  141. title   [A] Windows NT/2000/XP/2003
  142. # 查找所有盘的 /ntldr
  143. find --set-root --ignore-floppies --ignore-cd /ntldr
  144. # 将当前设备和 (hd0) 交换
  145. map () (hd0)
  146. map (hd0) ()
  147. # 激活 map 的结果
  148. map --rehook
  149. # 查找所有盘的 /ntldr
  150. find --set-root --ignore-floppies --ignore-cd /ntldr
  151. # 引导 ntldr
  152. chainloader /ntldr
  153. # 菜单 11
  154. title   [B] Swap (hd0) & (hd1)
  155. # 关闭错误检测
  156. errorcheck off
  157. # 通过错误语句返回,关闭错误检测后本语句失效?
  158. kernel
  159. # 打开错误检测
  160. errorcheck on
  161. # 将当 (hd0) 和 (hd1) 交换
  162. map (hd0) (hd1)
  163. map (hd1) (hd0)
  164. # 激活 map 的结果
  165. map --rehook
  166. # 提示交换成功
  167. pause Swapped.
  168. # 菜单 12
  169. title   [C] makeactive (hd0,0)
  170. # 关闭错误检测
  171. errorcheck off
  172. # 通过错误语句返回,关闭错误检测后本语句失效?
  173. kernel
  174. # 打开错误检测
  175. errorcheck on
  176. # 激活 (hd0,0) 分区
  177. makeactive (hd0,0)
  178. # 打开 Debug
  179. debug on
  180. # 打印 (hd0) 0 扇区
  181. cat --length=512 --hex (hd0)+1
  182. # 关闭 Debug
  183. debug off
  184. # 提示激活成功
  185. pause Actived.
  186. # 恢复 Debug 状态
  187. read 0x60110 && debug on
  188. # 菜单 13
  189. title
  190. # 如果错误跳到菜单 15
  191. fallback 15
  192. # 复位 ErrorFlag
  193. write 0x60000 1
  194. # 如果未找到 root 下面的 /0PE/BUFXP.GZ 则设置 ErrorFlag 为 0
  195. ls /0PE/BUFXP.GZ || write 0x60000 0
  196. # 如果是 PXE 启动,则设置 ErrorFlag 为 0
  197. read 0x60064 && write 0x60000 0
  198. # 如果 ErrorFlag 不为 0,则跳转到菜单 15
  199. read 0x60000 && kernel
  200. # 复位 ErrorFlag
  201. write 0x60000 1
  202. # 如果未找到所有盘的 /0PE/BUFXP.GZ 则设置 ErrorFlag 为 0
  203. find --set-root /0PE/BUFXP.GZ || write 0x60000 0
  204. # 如果 ErrorFlag 不为 0,则跳转到菜单 15
  205. read 0x60000 && kernel
  206. # 如果错误跳到菜单 14
  207. fallback 14
  208. # 复位 ErrorFlag
  209. write 0x60000 1
  210. # 如果未找到 root 下面的 /0PE/0PE.ISO 则设置 ErrorFlag 为 0
  211. ls /0PE/0PE.ISO || write 0x60000 0
  212. # 如果是 PXE 启动,则设置 ErrorFlag 为 0
  213. read 0x60064 && write 0x60000 0
  214. # 如果 ErrorFlag 不为 0,则跳转到菜单 14
  215. read 0x60000 && kernel
  216. # 复位 ErrorFlag
  217. write 0x60000 1
  218. # 如果未找到所有盘的 /0PE/0PE.ISO 则设置 ErrorFlag 为 0
  219. find --set-root /0PE/0PE.ISO || write 0x60000 0
  220. # 如果 ErrorFlag 不为 0,则跳转到菜单 14
  221. read 0x60000 && kernel
  222. # 如果是 PXE 启动,则设备 PXE 为当前盘
  223. read 0x60064 && rootnoverify (pd)
  224. # 设置标志:不自动解压 gzip 格式的文件
  225. write 0x82A4 1
  226. # 如果错误跳到菜单 15
  227. fallback 15
  228. # 如果 PXE 中存在 /0PE/BUFXP.GZ (判断文件大小是否为 0)则跳转到 菜单15
  229. cat --length=0 /0PE/BUFXP.GZ && kernel
  230. # 设置标志:自动解压 gzip 格式的文件
  231. write 0x82A4 0
  232. # 如果错误跳到菜单 14
  233. fallback 14
  234. # 如果 PXE 中存在 /0PE/BUFXP.GZ (判断文件大小是否为 0)则跳转到 菜单14
  235. cat --length=0 /0PE/0PE.ISO && kernel
  236. # 提示无法找到 /0PE/BUFXP.GZ 和 /0PE/0PE.ISO
  237. pause Error:/0PE/BUFXP.GZ and /0PE/0PE.ISO not found!
  238. # 菜单 14
  239. title
  240. # 提示当前加载 /0PE/0PE.ISO 的设备
  241. pause --wait=0 Device of 0PE.ISO:
  242. debug on
  243. root
  244. debug off
  245. # 恢复 Debug 状态
  246. read 0x60110 && debug on
  247. # 提示正在加载 /0PE/0PE.ISO
  248. pause --wait=0 Loading /0PE/0PE.ISO...
  249. # 磁盘模式加载 /0PE/0PE.ISO
  250. map --mem /0PE/0PE.ISO (0xff)
  251. # 激活 map 的结果
  252. map --hook
  253. # 设置 root 为 0PE.ISO 的装载位置
  254. rootnoverify (0xff)
  255. 跳转到 菜单15 继续处理
  256. fallback 15 && kernel
  257. # 菜单 15
  258. title
  259. # 设置标志:自动解压 gzip 格式的文件
  260. write 0x82A4 0
  261. # 保存当前根分区号,和当前根所在驱动器
  262. dd if=(md) of=(md) bs=1 count=8 skip=0x829c seek=0x60130
  263. # 无效语句
  264. pause --wait=0
  265. # 提示 root 位置,用于调试脚本
  266. pause --wait=0 Device of BUFXP.GZ:
  267. debug on
  268. # 提示当前盘,如果失败则提示
  269. root || pause --wait=2 root failed :(
  270. debug off
  271. # 恢复 Debug 状态
  272. read 0x60110 && debug on
  273. # 如果是 CDROM 启动则设置 CDBoot 为 1
  274. checkrange 0xC0 read 0x8280 && write 0x6006C 1
  275. # 如果是 CDROM 启动则停止 CDROM
  276. read 0x6006C && cdrom --stop
  277. # 提示正在加载 /0PE/BUFXP.GZ
  278. pause --wait=0 Loading /0PE/BUFXP.GZ...
  279. # 磁盘模式加载 /0PE/BUFXP.GZ
  280. map --mem ()/0PE/BUFXP.GZ (hd)
  281. # 激活 map 的结果
  282. map --hook
  283. # 向 /BAT/_ENV.BAT 中写入 set PEISO=/0PE/0PE.ISO\r\n
  284. write --offset=200 (hd-1,0)/BAT/_ENV.BAT set PEISO=/0PE/0PE.ISO\r\n
  285. # 继续从/BAT/MENUSRS.GZ 中的菜单启动
  286. pause --wait=0 && configfile (hd-1,0)/BAT/MENUSRS.LST
  287. # 菜单 16,处理菜单传参
  288. title
  289. # 按菜单传参跳到相应菜单
  290. checkrange 1 read 0x60100 && fallback 1
  291. checkrange 2 read 0x60100 && fallback 2
  292. checkrange 3 read 0x60100 && fallback 3
  293. checkrange 4 read 0x60100 && fallback 4
  294. checkrange 5 read 0x60100 && fallback 5
  295. checkrange 6 read 0x60100 && fallback 5
  296. checkrange 7 read 0x60100 && fallback 7
  297. checkrange 8 read 0x60100 && fallback 8
  298. checkrange 11 read 0x60100 && fallback 11
  299. checkrange 12 read 0x60100 && fallback 12
  300. fallback Force
复制代码

grub.uew.rar

1.5 KB, 下载次数: 446, 下载积分: 无忧币 -2

UE的GRUB高亮

2#
 楼主| 发表于 2010-3-4 14:35:50 | 只看该作者
另外继续支持0PE的更新,等待2010版增加2003。
回复

使用道具 举报

3#
发表于 2010-3-4 15:02:47 | 只看该作者
这是个好东西  支持下  虽然没研究过0PE的菜单
回复

使用道具 举报

4#
发表于 2010-3-4 15:16:48 | 只看该作者
膜拜中。。。。。。。
回复

使用道具 举报

5#
发表于 2010-3-4 16:09:45 | 只看该作者
顶,,无忧就应该多些这样的技术教程帖子,少一些无聊的水帖。
回复

使用道具 举报

6#
发表于 2010-3-5 13:38:07 | 只看该作者
另外做了一个UE下的GRUB高亮,在附件里。

这个可是个好东西,下载之,谢谢提供
回复

使用道具 举报

7#
发表于 2010-3-5 15:22:30 | 只看该作者
checkrange 0x60300 read 0x60300,什么情况下能成立?0x60300代表什么?
回复

使用道具 举报

8#
 楼主| 发表于 2010-3-5 15:25:51 | 只看该作者
原帖由 zhaohj 于 2010-3-5 15:22 发表
checkrange 0x60300 read 0x60300,什么情况下能成立?0x60300代表什么?

这个情况是在盒盘进行参数化菜单调用的时候,详细参考2Bpseudo的《程式菜单应用技术举例:参数化菜单功能调用》http://bbs.wuyou.net/forum.php?mod=viewthread&tid=160305&highlight=%2Bpseudo
回复

使用道具 举报

9#
发表于 2010-3-5 15:54:55 | 只看该作者
0x60300存放0PE的特定菜单项,就象用户选择一个菜单一样。
但启动0PE后
checkrange 0x60300 read 0x60300 || pxe detect NotExist 肯定成立
# 如果有传参则进入菜单 16
checkrange 0x60300 read 0x60300 && default 16 肯定不执行
# 如果有传参则进入菜单 1
checkrange 0x60300 read 0x60300 || default 1 肯定成立
# 如果有传参则不等待
checkrange 0x60300 read 0x60300 && timeout 0 肯定不执行
# 如果有传参则不等待 5 秒
checkrange 0x60300 read 0x60300 || timeout 5 肯定成立
# 存放选中的菜单项序号 | MenuNum
checkrange 0x60300 read 0x60300 || write 0x60100 0 肯定成立

我的意思是说,如果我手动选择菜单,0x60100存放菜单项序号,什么时候READ 0X60030的内存值是0X60030?
回复

使用道具 举报

10#
 楼主| 发表于 2010-3-11 13:27:27 | 只看该作者
原帖由 zhaohj 于 2010-3-5 15:54 发表
0x60300存放0PE的特定菜单项,就象用户选择一个菜单一样。
但启动0PE后
checkrange 0x60300 read 0x60300 || pxe detect NotExist 肯定成立
# 如果有传参则进入菜单 16
checkrange 0x60300 read 0x60300 && ...


你没看P大大的示例吗?

  1. title         [0]    0PE原版菜单

  2. configfile /0PE/MENU.0PE

  3. title         [1]    直接启动0PE

  4. #这行表示绕过0PE第一菜单界面,直接调用其
  5. 菜单项

  6. write 0x60300 0x60300

  7. #这行指定调用0PE第1菜单项

  8. write 0x60100 1

  9. configfile /0PE/MENU.0PE
复制代码
回复

使用道具 举报

11#
发表于 2010-3-16 13:52:56 | 只看该作者
真的很好,正在下载中。
回复

使用道具 举报

12#
发表于 2010-4-6 10:49:45 | 只看该作者
跟看天书差不多,太难理解了。
回复

使用道具 举报

13#
发表于 2010-4-9 18:21:44 | 只看该作者

回复 #1 kendling 的帖子

不看注释,菜单很难看懂呀
回复

使用道具 举报

14#
发表于 2010-4-9 21:50:13 | 只看该作者
好东东啊,正需要,下来学习了,谢谢楼主!!
回复

使用道具 举报

15#
发表于 2010-4-10 19:20:21 | 只看该作者
有点问题!~~~~~~~~
回复

使用道具 举报

16#
发表于 2010-4-12 23:21:20 | 只看该作者
再次拜读……....
回复

使用道具 举报

17#
发表于 2010-9-26 10:32:39 | 只看该作者
那个UE高亮是用在哪里的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-11-29 04:57

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表