2

我使用 .inf 文件手动安装我的驱动程序。直到现在,我从inf文件夹中删除了oem.inf和.pnf文件进行卸载。每当我安装新驱动程序时,我都会删除/卸载旧的 inf 和 pnf 文件。

在我的旧卸载中(通过删除 .inf 和 .pnf 文件),我没有修改或删除任何注册表设置。

在这种情况下,我是否要更改或删除注册表中的任何设置(例如:devnode)?

4

2 回答 2

5

您应该使用SetupUninstallOEMInf函数来卸载 .INF(以及随后的 .PNF)文件。这将处理细节。pnputil(在 Vista 和更高版本上)应该从命令行执行相同的操作。但是,此功能不会删除当前安装的驱动程序(例如与 devnode 相关联的驱动程序)。

  1. 为什么要先卸载旧驱动程序?用户可能已经为至少一个 devnode 安装了您的驱动程序。为什么不使用 Microsoft 认可的解决方案,例如DpInst?它将完成更新驱动程序所需的工作。

  2. 传递SUOI_FORCEDELETEtoSetupUninstallOEMInf不是一个好主意,因为您最终会在您的 devnodes(在注册表中)中得到挥之不去的 .INF 引用。

  3. 在工作中,我编写了一个名为 DriverUninstaller 的实用程序,它删除了 devnode,然后删除了 INF。我只将此实用程序用于卸载。升级应由 DpInst 处理。流程大致是:

    1. 使用 SetupAPI 枚举它们(例如,如果您的设备类是唯一的,则按设备类)
    2. 对于每个 devnode,调用SetupDiCallClassInstaller(DIF_REMOVE, ...)
    3. 致电SetupDiBuildDriverInfoList查找我设备的所有 .INF 文件
    4. 对于每个 INF,调用SetupUninstallOEMInf

如果有人对这个实用程序感兴趣,我也许可以说服我的雇主开源它:-)

于 2012-08-07T20:10:17.490 回答
0

正如另一个答案指出的那样,在 Windows 上删除驱动程序的 API 是SetupUninstallOEMInf方法,但我想我会在此处添加一些重要说明:

  • INF 路径参数只能是文件名(不能包含完整路径!)
  • 此 API 需要管理员权限(这不足为奇)
  • 在 64 位系统上,该方法仅在 64 位进程的上下文中执行时才有效(即 WOW64 不起作用)

SetupDiGetDriverInfoDetail API 可用于查询有关要为特定设备删除的相关 INF 文件的信息SetupDiEnumDriverInfo/SetupDiBuildDriverInfoList API 可用于枚举特定设备的所有驱动程序。

  // given infFilePath - full path to inf as returned by a query using SetupDiGetDriverInfoDetail
  TCHAR* infFileName = GetFileNamePart(infFilePath);
  if(SetupUninstallOEMInf(pInf, SUOI_FORCEDELETE, NULL))
  {
       // success
  }else
  {
DWORD errCode = GetLastError();
if(errCode == 0x02)
{
            //  means that the driver INF file was not found
            //  most likely it was already uninstalled 
}else if(errCode == 0x05)
      {
            //  must run as administrator
      }else
{
           // some other error code.. handle appropriately
}
  }

我已经开源了我为执行 USB 和媒体/图像设备的驱动程序卸载而编写的工具的代码。此处的详细信息:http: //mdinescu.com/software-development/30-driver-hunter-programatically-uninstall-drivers-in-windows

于 2014-08-06T23:43:48.360 回答