|
|
显示桌面功能,老版本正常,新版本特定情况下不正常的问题,找到原因了。
感谢 @liangnijian 发现是BCD选项不同导致问题的,并提供了测试用的ISO镜像。
新版本对【显示桌面】功能添加了修复开关的配置选项,默认是自动模式,识别到PE环境,会进行修复,
正常系统启动不处理。
关于是不是PE的判断是,读取系统注册表,从启动参数判断是不是有 "MININT" 字样。
结果这里,使用默认字符串长度是MAX_PATH, 260字符,因为是Unicode实际520字节,
但是注册表读取函数传递的保存读取内容空间大小的参数,我忘了x2,所以它以为我只有260字节,那么读取的启动参数字符串只能接收 130 字符以内,超过130字符的话,读取不到,
判断不了 MININT 字样,所以没有正确判断是PE启动模式。
- WinXShell.exe -code Alert(App:Info('isWinPE'))
复制代码
返回结果为0,所以就不接管了,那么点击显示桌面,就会导致explorer.exe崩溃掉,这个是 explorer.exe 外壳本来就存在的问题。
如果正确识别了到PE环境,WinXShell.exe 对到 26H1 为止的版本都会修复正常。
BCD添加了安全分辨率的话,会有下面的启动参数:
graphicsresolution=1024x768
导致注册表中的启动选项信息为 146 字符,所以 WinXShell.exe 没有去修复显示桌面的问题。
同样的,也有个人做的启动BCD,关于boot.wim的路径,文件名多加几个字符导致无法正确判断。
明天上午会发布一个修复版本。
-----------------------------
代码说明(参考信息,看不懂可以忽略):
// #define MAX_PATH 260
BOOL isWinPE()
{
DWORD type = REG_DWORD;
TCHAR value[MAX_PATH] = { 0 };
DWORD size = MAX_PATH; <- ★ 260 / 2 => 130 字符数 (这里 size = MAX_PATH * sizeof(TCHAR) 翻倍大小即可修复)
SHGetValue(HKEY_LOCAL_MACHINE, TEXT("SYSTEM\\CurrentControlSet\\Control"),
TEXT("SystemStartOptions"), &type, &value, &size);
★ 根据启动BCD的选项 可能导致启动选项信息超过 130字符:
" GRAPHICSRESOLUTION=1024x768 MININT FVEBOOT=2666496 NOVGA REDIRECT RDIMAGEOFFSET=8192 RDIMAGELENGTH=3161088 RDPATH=MULTI(0)DISK(0)RDISK(1)PARTITION(1)\\SOURCES\\BOOT.WIM"
if (type == REG_SZ) {
if (StrStr((TCHAR*)value, TEXT("MININT")) != NULL) { ★ value为空(\0), 找不到 MININT
return TRUE;
}
}
return FALSE;
}
|
|