2012-01-12 122 views
0

我正在开发一个应用程序,其中涉及安装一些项目特定的硬件设备。在安装应用程序时,我使用difxAPI将驱动程序inf文件压入Driverstore。但在使用difx进行unintallation之后,在HKLM \ SYSTEM \ CurrentControlSet \ Enum \ USB下的Windows注册表中仍有一些引用。这些引用的存在往往是一个问题,因为设备被枚举并显示在设备管理器的COM端口部分中。这是我使用的卸载驱动程序:完全删除Windows XP中的驱动程序文件

DriverPackageUninstall(infName, DRIVER_PACKAGE_DELETE_FILES, ptrInstallerInfo, out fNeedReboot); 

我再次想到编程清除这些注册表项为我明白我应该设置访问权限访问特定的密钥。这是我做的:

RegistryAccessRule regAccess = new RegistryAccessRule("Everyone", RegistryRights.FullControl, AccessControlType.Allow); 
    RegistrySecurity regSecurity = new RegistrySecurity(); 
    regSecurity.AddAccessRule(regAccess);       
    Registry.LocalMachine.OpenSubKey(@"SYSTEM\CurrentControlSet\Enum\USB\", true).SetAccessControl(regSecurity); 

但是这段代码抛出一个异常,因为它不允许我以编程方式设置访问控制。在Windows XP机器手动我能够从注册表编辑器设置此权限。有没有一种有效的方式在XP中,我可以完全删除驱动程序文件?

回答

1

这很奇怪。 DifxAPI应该从驱动程序存储库中删除a)驱动程序包,b)此驱动程序的已安装实例。您确定那些旧的设备实例(在HKLM\SYSTEM\CurrentControlSet\Enum\USB中)正在使用您正在删除的驱动程序,或者是旧版本的.INF文件或其他?

但基本上,微软不希望你使用Enum和更改ACL。他们宁愿让您通过SetupAPI枚举和删除设备(如Windows DDK中的devcon示例所示)。

我最近写了一些代码来做到这一点:我的所有设备共享相同的自定义设备类,以便它们易于枚举,然后根据devcon的代码盲目删除它们。