绕过“发现新硬件向导”/将 Windows 设置为自动安装驱动程序

绕过“发现新硬件向导”/将 Windows 设置为自动安装驱动程序

我的主板用了快十年了,终于坏了,所以我买了一个二手系统。我把旧硬盘和声卡装到新系统中,并连接了旧键盘和鼠标(其余组件——CPU、RAM、主板、显卡——都来自新系统)。

我事先就知道让 Windows 启动并安装新硬件的驱动程序会很困难(尤其是因为基础组件都是新的),但我完全无法尝试安装显卡等设备的驱动程序,因为键盘和鼠标无法工作(它们可以在 BIOS 屏幕、DOS 模式、Windows 7、XP 的启动菜单等中工作,但不能在 Windows XP 本身中工作。

每当我尝试启动 XP(在正常或安全模式下)时,都会弹出一堆提示检测到所有新硬件的气球,以及发现新硬件向导对于处理器(显然它必须安装最低级组件的驱动程序)。不幸的是,我无法单击下一步,因为键盘和鼠标还不能工作,因为主板驱动程序(用于 PS/2 或 USB 端口)尚未安装。我甚至尝试了串行鼠标,但无济于事——同样,它在 DOS、7 等系统中可以工作,但在 XP 中不行,因为它没有安装串行端口驱动程序。

我尝试在 Windows 7 下安装 SOFTWARE 和 SYSTEM 配置单元,以便手动将“未签名驱动程序警告”设置为忽略(使用我找到的两个驱动程序签名策略设置)。这没有用;我仍然得到向导。

它们甚至不是花哨的、专有的、第三方的或未签名的驱动程序。它们是 Windows 自带的驱动程序 — CPU、RAM、IDE 控制器等驱动程序往往都是如此。键盘和鼠标驱动程序是通用的(但就像我说的,这些驱动程序无关紧要,因为它们所连接的端口的驱动程序尚未安装)。

显然,在过去几年的某个时间点,设置发生了变化,使得 Windows 在检测到新硬件时总是会提示我。(它还配置为在异常关机时显示关机事件跟踪器,所以我不得不关闭它,这样我才能看到桌面。)

哦,我尝试删除所有 PNF 文件以便重新生成它们,但这也无济于事。

有人知道我该如何重置 Windows,至少尝试自动安装新硬件的驱动程序,然后再提示我是否安装失败?相反,有人知道如何关闭自动驱动程序安装(并使用向导提示)吗?

多谢。


只是为了清楚因为它很可能会出现在答案中,否则,我不是在谈论下面的对话,而是在谈论下面的对话。

替代文本

替代文本


哦,为了在发生以下情况之前阻止任何建议,使用设备管理器来禁用、卸载、修复等任何设备是不可能的,因为如果键盘和鼠标(或任何其他输入设备)没有安装/工作,那么我究竟如何执行像使用设备管理器这样的操作?

答案1

周五,我终于在新旧系统上成功运行了 Windows XP!太棒了!(只花了 5 个半月的时间。)

我会说明修复此问题所需的具体步骤,以防其他人遇到类似问题,但不幸的是,由于越来越沮丧和不耐烦,我最终采取了一种有点焦土的做法,一次执行多个步骤。不过,我确实保留了我使用的工作文件,并找出了我所做的更改,所以我将列出几件可以尝试的事情,这些事情会有所帮助,或者至少应该有所帮助。

(显然,这是为高级用户准备的高级内容;但即使是高级用户也可能把这搞得一团糟,因此需要进行初始备份步骤。)


问题概述如下:将包含现有 Windows 安装的硬盘放入新系统,Windows 不会自动安装硬件驱动程序,并提示用户安装未签名的驱动程序,即使这些驱动程序是经过签名的。应该需要签名。此外,由于 Windows 尚未安装键盘或鼠标(或其他输入设备)的驱动程序,因此用户无法接受对话框。


以下是最新版本:

  1. 备份注册表配置单元。
  2. 禁用所有可以禁用的程序、驱动程序和服务。
  3. 设置一些东西(比如任务栏),以便您可以看到所有内容(不要隐藏任何信息)。
  4. 让 .BAT 文件自动运行,以便轻松进行更改和执行在线(操作系统内)任务。
  5. 使用宏/脚本应用程序来自动执行按键和按钮单击,因为您自己无法完成这些操作。
  6. 确保所有系统文件都存在。
  7. 手动删除有问题和不再存在的硬件。

    • 启动(纯)DOS 或其他操作系统,并将注册表配置单元备份到另一个位置。这%systemroot%\System32\CONFIG\*包括%userprofile%\NTUSER.DAT

    • 确保 BOOT.INI 和SystemBootDevice[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet00*\Control] 中的驱动器/分区设置正确,因为您的系统驱动器现在可能位于与以前不同的驱动器/分区上(在我的情况下,(r)disk 曾经是 0,但由于新的驱动器现在为 1)。

    • 安装适当的注册表配置单元并禁用所有无关的自动运行程序,特别是那些弹出窗口和遮挡视线的东西,因为您将无法最小化它们或单击前面的其他窗口/对话框(您必须简化解决此类问题的方法)。您不必删除自动运行条目,而是可以禁用它们,这样当您运行 Windows 并想要再次自动运行它们时,它们仍然存在(尤其是对于具有一堆命令行参数的条目):

      • 对于Run键,您只需在命令开头添加一个#字符或其他内容即可。这样,Windows 将无法运行它,因为它不是有效文件并将忽略它。

      • 安装 SYSTEM 配置单元并将start任何无关的驱动程序和服务(尤其是不再存在的硬件)的参数设置为禁用(dword:4)。

      • 禁用页面碎片整理等,在BootExecute...\Control\Session Manager 中,通过#在命令开头添加一个(尽管不要管它autocheck,因为如果您最终需要通过重置按钮重新启动,您将需要检查/修复驱动器)。

      • 不要删除Startup文件夹中的任何快捷方式,只需将它们移动到其他位置即可。  

    • 通过安装 SOFTWARE 和 NTUSER 注册表配置单元并设置\Software\Microsoft\Driver Signing并将其设置\Software\Microsoft\Non-Driver Signing为 BIN:00,将 Windows 设置为安装驱动程序而不管驱动程序签名如何。

    • 您将希望看到任务栏和通知区域,因此请打开最顶层并通过挂载 NTUSER 并编辑设置第 9 个字节来关闭自动隐藏,\Software\Microsoft\Windows\CurrentVersion\Explorer\StuckRects2以便位 0 关闭而位 1 打开(0x7A 将显示最大信息量)。此外,禁用任何其他任务栏整合/操作程序,例如 PCMag 的托盘管理器(也许你在他们开始出售公用设施之前就得到了它)。
    • 安装 SOFTWARE 配置单元并添加自动运行条目以在启动时运行 .BAT 文件(毫无理由,我将我的文件命名为C:\t\j.BAT)。现在,您可以轻松地让 Windows 执行操作而无需任何直接输入。当然,它需要重新启动到另一个操作系统、修改批处理文件并再次启动 Windows 才能进行更改,但这比在 Windows 中无法执行任何操作要好。;-)(您可以注释掉某些内容,而不仅仅是删除它们。)在批处理文件末尾添加命令以重新启动 Windows,例如shutdown -t 10 -r。不要忘记这一点,否则您最终将不得不按下重置按钮!

    • 在批处理文件(例如j.bat)中,执行某些操作,例如导入任何 .REG 文件(您可以在其他操作系统中离线编辑这些文件,就像使用批处理文件一样)。让批处理文件运行设备管理器并最大化窗口(使用以下工具尼科姆)以便查看硬件的当前状态。(尝试使用命令行工具,如问答将分辨率设置为视频驱动程序(此时可能是通用 VGA 适配器)可以达到的最大分辨率,例如 1024x768。您还可以重新注册 .DLL 文件来修复一些问题,尤其是与 Windows 更新相关的问题。

    • 你不希望批处理文件快速而疯狂地运行,因此你需要一个命令行工具,它可以暂停给定的秒数,以便暂停脚本执行——不,这个pause命令不好,因为它需要按下一个键才能继续。(我用了一个我几年前写的程序,但互联网上有很多,或者只是使用一个常见黑客

    • 获取宏记录器/脚本应用程序,例如热键大师微机控制宏制造商自动热键自动!等,并将其配置为执行您需要的任何键盘或鼠标操作(这样,您可以在 Windows 中“做”事情,而实际上没有任何可用的输入设备)。您需要将其配置为按标题和/或类和/或控件检测某些窗口或对话框,并相应地执行某些鼠标单击或按键。例如,您可以让它自动检测驱动程序确认对话框并触发单击或按钮NextContinue(确保将宏应用程序设置为在启动时运行而不是在 .BAT 文件中运行,以确保它们在 Windows 检测到硬件并开始提示驱动程序时运行;或者,使用命令让它们在批处理文件的开头运行,start以避免批处理文件被阻止,因为它们不会退出。)
    • 确保所有必需的系统文件都已就绪。运行(通过批处理文件)sfc /scannow。确保驱动器中有 Windows 光盘 — 假设 Windows 已安装 CD/DVD 驱动程序。您还可以尝试在离线时手动复制任何丢失的文件。例如,我从上次 XP 备份中复制了所有文件,指定不是覆盖现有的文件。这样,所有丢失的文件都已恢复(特别是在以下目录中:

      • 计算机目录:\Windows
      • 目录:\Windows\INF
      • C:\Windows\驱动程序缓存
      • C:\Windows\ServicePack文件
      • 目录:\Windows\System32
      • 目录:\Windows\System32\dllcache
      • C:\Windows\System32\驱动程序

      • (不久之后,它终于开始再次工作了,我也碰巧恢复了以下与硬件安装无关的目录。巧合吗?我不知道。)

      • C:\Windows\Assembly
      • 目录:\Windows\Microsoft.NET
      • 目录:\Windows\WinSxS
      • C:\Windows\帮助
      • 目录:\Windows\System32\WBEM

      • (您可能实际上想要删除或重命名 C:\Windows\System32\CatRoot*)

    • 删除 C:\Windows\INF 中的所有 .PNF 文件。Windows 将在下次需要安装驱动程序时(此时每次启动时仍是如此)从现有的 .INF 文件重建它们。这类似于在页面无法正确显示时清除浏览器缓存,以确保您获取并使用最新的文件副本。

    • 作为最后的手段,得到并使用 Microsoft 工具DEVCON删除某些设备,以便 Windows 可以尝试从头开始安装硬件。但是,首先,您需要运行命令(通过批处理文件)DEVCON findall * > C:\t\devcon.log来转储所有硬件及其相应 ID 的列表。这样,您就可以编译一份合适的自定义列表,列出要删除的硬件。需要删除的设备包括以下内容:

      • “*ACPI*”
      • “USB\ROOT_HUB*”
      • “SERENUM\MOUSE*”
      • VEN_8086
      • “HID*”
      • “*TUNMP*”
      • “PCI_VEN_1102*”
      • “PCI_VEN_1033*”
      • “PCI_VEN_1011*”
      • “PCI_VEN_1186*”
      • “PCI_VEN_11AB*”
      • “PCI_VEN_1274*”
      • “PCI\VEN_5333*”

      • (这些是主要的、与主板相关的设备,例如处理器、端口、总线、输入设备、网卡、硬盘和光驱。)


正如你所见,它(毫不奇怪)是一个巨大的如果你将系统驱动器插入新系统(即主板),并希望避免重新安装,那么让 Windows 再次运行将非常困难。没有输入方法会非常困难,但不是不可能。这需要大量的时间、精力、耐心、工具、对细节的关注和谨慎,但它可能的,并且回报(推迟完全重新安装,从而失去谁知道随着时间的推移所做的数千个定制)是值得的。

幸运的是,我终于设法让它工作了,因为我还没有准备好重新安装。现在我不仅可以再次使用 Outlook Express(并下载和清除我帐户中堆积的大约 5,000 封电子邮件),还可以在安装的旧版 VS2003 中再次进行一些编程。(并不是说我不习惯 Windows 7;事实上,有一段时间,我回到 XP 时感觉很奇怪,但我又有宾至如归的感觉,就像搬进宿舍住了一年,然后又搬回了家里的卧室。)

答案2

我将从这里分享我的答案,脚本在 MSFN 网站上正确显示:http://www.msfn.org/board/topic/49514-disable-found-new-hardware-wizard/?do=findComment&comment=1132792

我制作了一个 AutoIt3 脚本https://www.autoitscript.com/site/autoit/downloads/所有新硬件向导窗口将继续接受未签名的驱动程序,取消 WinXP CD 提示并跳过多个选项(连接到互联网等),以便检测和安装鼠标和键盘。编译后的自动脚本 EXE 应复制到“开始”(在“开始菜单”内)文件夹以自动执行。脚本字符串必须适应本地 Windows 语言。可能还有一些 Alt-LETTER 组合。我的示例在西班牙语 WinXP 中有效。希望它能帮助其他人,在鼠标和键盘正常工作后,必须删除脚本(或将其移动到其他文件夹):

$asistente= "Asistente para hardware nuevo encontrado" ;"Found New Hardware Wizard"
$instalacion= "Instalación de hardware"
$archivos= "Archivos necesarios"
$cambio= "Cambio de configuración del sistema"

while 1
sleep(200)

if WinExists( $cambio) then
   WinActivate( $cambio)
   sleep(200)
   Send("!n")        ; (press Alt-n)
endif

if WinExists( $instalacion) then
   WinActivate( $instalacion)
   sleep(200)
   $text=WinGetText( $instalacion)
   if StringInStr( $text, "El software que está instalando para este hardware") then ;"The software..."
     Send("!c")
    endIf
;  MsgBox($MB_OK, "Autoit Status", $text & stringinstr( $text, "está"), 2 )  ;  sleep(2000)
endif

if WinExists($archivos) then
   WinActivate($archivos)
   sleep(200)
   $text=WinGetText( $archivos)
   if StringInStr( $text, "Se necesita el archivo") then
       ControlClick( "Archivos necesarios", "", "[ID:2]" )
    endIf
endif

if WinExists( $asistente) then
   WinActivate( $asistente)
   sleep( 200)
   $text=WinGetText( $asistente)

   if StringInStr( $text, "Desea que Windows se conecte a Windows Update") then ;"Can Windows connect to Windows Update to search for software?"
;     ControlCommand( $asistente, "", "[ID:8104]", "Check", "")
     sleep(150)
;     ControlClick( $asistente, "", "[ID:12324]")
     Send("!n")
     sleep(100)
     Send("!t")
     sleep(250)
   endif

   $text=WinGetText( $asistente)
   if StringInStr( $text, "Este asistente le ayudará a instalar software para:") then ;"This wizard"
     sleep(150)
     Send("!t")
     sleep(250)
   endif

   $text=WinGetText( $asistente)
   if StringInStr( $text, "No se puede instalar este hardware") then ;"Cannot Install this Hardware"
     ControlCommand( $asistente, "", "[ID:1030]", "UnCheck", "")
     sleep(200)
     ;ControlClick( $asistente, "", "[ID:12325]")
      Send("{ENTER}")
     sleep(200)
   endif

   $text=WinGetText( $asistente)
   if StringInStr( $text, "desea que haga el asistente?") then ;"What do you want the wizard to do?"
   ControlCommand( $asistente, "", "[ID:1049]", "Check", "")
   sleep(200)
   ControlClick( $asistente, "", "[ID:12324]")
   sleep(200)
   endif

   $text=WinGetText( $asistente)
   if StringInStr( $text, "Se recomienda que se conecte a Internet para que el asistente") then
   ControlCommand( $asistente, "", "[ID:1065]", "Check", "")
   sleep(200)
   ControlClick( $asistente, "", "[ID:12324]")
   sleep(200)
   endif

   $text=WinGetText( $asistente)
   if StringInStr( $text, "Finalizar para cerrar") then ;"Click Finish to close the wizard."
   ControlClick( $asistente, "", "[ID:12325]")
   sleep(250)
   endif
endif

wend 

答案3

仅当系统驱动程序路径中没有匹配的驱动程序时,才会弹出该向导。根据技术网,您必须离线修改 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\DevicePath 以添加包含驱动程序 infs 的文件夹,以便在弹出向导之前自动搜索它们。

如果这不起作用,则重新安装所有集成的驱动程序可能会更简单。

答案4

好吧,我遇到了同样的问题,并在一个多小时内解决了它。我使用了带有 sp3 cd 的 XPpro,然后在现有程序之上重写了 windows xp。现在我所有的旧程序都运行正常。

相关内容