【问题标题】:Deleting .inf and .pnf Files删除 .inf 和 .pnf 文件
【发布时间】:2012-07-24 04:48:41
【问题描述】:

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

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

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

【问题讨论】:

  • 为什么这被标记为“嵌入式”?嵌入标签的不当使用:stackoverflow.com/tags/embedded/info
  • @Clifford:我添加这个嵌入标签的意图是人们可能涉及或遇到这种情况。对不起,如果我错了。感谢 Clifford 修复它。

标签: device-driver wdk inf


【解决方案1】:

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

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

  2. SUOI_FORCEDELETE 传递给SetupUninstallOEMInf 不是一个好主意,因为您最终会在您的开发节点(在注册表中)中得到挥之不去的.INF 引用。

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

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

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

【讨论】:

  • 抱歉给您添麻烦了,因为我对 Windows Pgmming 很陌生。 Sry 4 知识不足。我不清楚这个stmt。 Ans:考虑一下,驱动N(old-non pnp)和(N+1-new-using DPinst)都安装了。 -installer) 我写的将只支持 N+1。现在,当用户卸载 N+1 时,驱动程序 N 将被回滚。我必须避免这种情况来支持我的实用程序,它不支持 N.Pl 建议。
  • 如果有人对这个实用程序感兴趣,我也许可以说服我的雇主开源它:-) 如果你真的不是在开玩笑,它会帮助许多其他穷人,比如我,确实..
  • 哦,所以您要卸载一个驱动程序并安装另一个驱动程序 - 不是新版本,而是完全不同的驱动程序。在这种情况下,是的,您想卸载旧的。如果旧驱动程序不是 PnP 驱动程序,它不会与注册表中的任何设备关联(这是 PnP 驱动程序的工作方式),因此卸载 INF 可能就足够了。检查SetupUninstallOEMInf的返回值是否成功。
  • 关于“此功能不会删除当前安装的驱动程序(例如与 devnode 关联)”:这与 PnP 驱动程序有关。当您安装 PnP 设备驱动程序时,您 a) 将其复制到系统(到 Windows\Inf、DrvStore 等),并且 b) 将其安装为设备驱动程序(如您在设备管理器中所见)
  • 这是我删除 inf 文件的代码流程.. 1) SetupDiGetClassDevs --> 为发送的 CLASS GUID 获取设备信息 2) SetupDiEnumDeviceInfo --> 枚举设备 3)SetupDiGetDeviceRegistryProperty -->得到硬件 4) 使用 strnicmp 与我的硬件 ID 进行比较。 5) SetupDiBuildDriverInfoList 6) SetupDiEnumDriverInfo 7) SetupDiGetDriverInfoDetail --> 得到了我的 inf 文件的路径。 8)使用 DeleteFile 我删除了我的 inf 和相应的 pnf 文件。这是正确的方法吗?请指教..
【解决方案2】:

正如另一个答案指出的那样,在 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

【讨论】:

  • 您能否检查一下您在 GitHub 上发布的用于 Driver Hunter 工具的代码是否是最新的?
  • @Mahesh - 不确定你的意思,但代码在发布时是最新的。自上次提交以来,我没有进行任何未发布的更改。有没有发现什么问题?
  • 对不起迈克。我正在查看 .cpp 文件,但没有找到任何 Setup API 调用。看起来所有实现都在 UIDialog.h 文件中。谢谢。
猜你喜欢
  • 2019-11-10
  • 2021-11-08
  • 1970-01-01
  • 1970-01-01
  • 2018-01-26
  • 2016-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多