2012-01-12 119 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的代碼盲目刪除它們。