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