我使用 .inf 文件手动安装我的驱动程序。直到现在,我从inf文件夹中删除了oem.inf和.pnf文件进行卸载。每当我安装新驱动程序时,我都会删除/卸载旧的 inf 和 pnf 文件。
在我的旧卸载中(通过删除 .inf 和 .pnf 文件),我没有修改或删除任何注册表设置。
在这种情况下,我是否要更改或删除注册表中的任何设置(例如:devnode)?
我使用 .inf 文件手动安装我的驱动程序。直到现在,我从inf文件夹中删除了oem.inf和.pnf文件进行卸载。每当我安装新驱动程序时,我都会删除/卸载旧的 inf 和 pnf 文件。
在我的旧卸载中(通过删除 .inf 和 .pnf 文件),我没有修改或删除任何注册表设置。
在这种情况下,我是否要更改或删除注册表中的任何设置(例如:devnode)?
您应该使用SetupUninstallOEMInf函数来卸载 .INF(以及随后的 .PNF)文件。这将处理细节。pnputil
(在 Vista 和更高版本上)应该从命令行执行相同的操作。但是,此功能不会删除当前安装的驱动程序(例如与 devnode 相关联的驱动程序)。
为什么要先卸载旧驱动程序?用户可能已经为至少一个 devnode 安装了您的驱动程序。为什么不使用 Microsoft 认可的解决方案,例如DpInst
?它将完成更新驱动程序所需的工作。
传递SUOI_FORCEDELETE
toSetupUninstallOEMInf
不是一个好主意,因为您最终会在您的 devnodes(在注册表中)中得到挥之不去的 .INF 引用。
在工作中,我编写了一个名为 DriverUninstaller 的实用程序,它删除了 devnode,然后删除了 INF。我只将此实用程序用于卸载。升级应由 DpInst 处理。流程大致是:
SetupDiCallClassInstaller(DIF_REMOVE, ...)
SetupDiBuildDriverInfoList
查找我设备的所有 .INF 文件SetupUninstallOEMInf
如果有人对这个实用程序感兴趣,我也许可以说服我的雇主开源它:-)
正如另一个答案指出的那样,在 Windows 上删除驱动程序的 API 是SetupUninstallOEMInf方法,但我想我会在此处添加一些重要说明:
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