删除.inf和.pnf文件

时间:2012-07-24 04:48:41

标签: device-driver wdk inf

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

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

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

2 个答案:

答案 0 :(得分:4)

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

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

  2. SUOI_FORCEDELETE传递给SetupUninstallOEMInf不是一个好主意,因为您最终会在您的devnodes(在注册表中)中使用延迟的.INF引用。

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

    1. 使用SetupAPI枚举它们(例如,如果您的设备类是唯一的,则通过设备类)
    2. 对于每个devnode,请致电SetupDiCallClassInstaller(DIF_REMOVE, ...)
    3. 致电SetupDiBuildDriverInfoList查找我设备的所有.INF文件
    4. 对于每个INF,请致电SetupUninstallOEMInf
  4. 如果对此实用程序感兴趣,我可能会说服我的雇主开源: - )

答案 1 :(得分: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