- 1. 萬能手機usb數(shù)據(jù)線驅動 V1.0綠色免費版
- 2. usb轉rs232萬能驅動
- 3. LiLi USB(創(chuàng)建引導u盤,啟動u盤) V2.8.8 多語言免...
- 4. USB工具箱1.0綠色版
- 5. U盤防火墻USB Disk Security6.1.0.432綠色版
- 6. USB設備工具箱4.0綠色版_修復u盤
- 7. chipgenius芯片檢測工具(usb芯片檢測)4.0綠色版
- 8. 深度usb啟動盤制作軟件1109免費版
- 9. 星河USB裝系統(tǒng)工具(u盤啟動工具) v8.0 最新綠色免...
- 10. USB設別管理器 v4.6.3綠色免費版
USB 驅動自動卸載方法
最近在作一個項目,有驅,要求 USB 驅動自動安裝、卸載。這里,就卸載部分提供一些
線索,供大家賞析。 ;)
雖然,MS 不再支持 Win98 了,但是,我們還是要考慮盜版的 Win98 用戶們,所有從
Win98 為代表的 Win9x 說起。
[color=royalblue][u]Win9x 系統(tǒng)上的卸載 [/u][/color]
1). 刪除 .inf 和 .sys; (%Windir%\inf\, %Windir%\system32\drivers\)
2). 刪除注冊表中的 HKLM\Enum\USB\Hardware_ID;(你的 inf 文件中應該有)
[color=royalblue][u]WinNT 系統(tǒng)上的卸載 [/u][/color]
相對來說, WinNT 系統(tǒng)上的刪除要復雜些,特別是權限的原因:
1). 刪除 .inf 和 .sys; (%Windir%\inf\, %Windir%\system32\drivers\)
2). 刪除注冊表中的
[quote]
a). HKLM\SYSTEM\CurrentControlSet\Control\Class\{CLASS_ID}\000x
b). HKLM\SYSTEM\CurrentControlSet\Enum\USB\Hardware_ID
c). HKLM\SYSTEM\CurrentControlSet\Services\Your_Service
[/quote]
a). 需要枚舉 CLASS_ID 下的各個子鍵,并且獲取其中的 MatchingDeviceId 看是否為
我們的驅動的 Hardware_ID, 然后獲取 InfPath 的值,并去 %Windir%\Inf 下刪除之;
b). 需要一個權限的修改。代碼可以參見后面。
c). 是可選的,可以不刪除,也可以刪除。
[注意]: NT 上刪除子鍵,如果該鍵下還有子鍵則需要使用 SHDeleteKey:
[quote]
Deletes a subkey and all its descendants. The function will remove the key and
all of the key's values from the registry.
[/quote]
[color=royalblue][u]WinNT 修改注冊表子鍵的權限 [/u][/color]
[php]
#include "stdafx.h"
#include
#include
#include
#include
#pragma comment (lib,"Advapi32.lib")
void main(int argc, char* argv[])
{
//開始重新配置使用注冊表的權限------------------------------------------------
LPTSTR lpObjectName;
SE_OBJECT_TYPE ObjectType; //#include
PACL OldDACL,NewDACL;
PSECURITY_DESCRIPTOR SD;
EXPLICIT_ACCESS ea;
lpObjectName = "MACHINE\\SYSTEM\\CurrentControlSet\\Enum\\Usb\\Vid_0E0F&Pid_0001";
ObjectType =SE_REGISTRY_KEY;
//建立一個空的ACL;
if (SetEntriesInAcl(0, NULL, NULL, &OldDACL)!=ERROR_SUCCESS)
return;
if (SetEntriesInAcl(0, NULL, NULL, &NewDACL)!=ERROR_SUCCESS)
return;
//獲取現(xiàn)有的ACL列表到OldDACL
if(GetNamedSecurityInfo(lpObjectName, ObjectType,
DACL_SECURITY_INFORMATION,
NULL, NULL,
&OldDACL,
NULL, &SD) != ERROR_SUCCESS)
//Application->MessageBox("指定的鍵不存在!","提示",MB_OK);
printf("指定的鍵不存在!");
//設置用戶名"Everyone"對指定的鍵有所有操作權到結構ea
ZeroMemory(&ea, sizeof(EXPLICIT_ACCESS));
BuildExplicitAccessWithName(&ea,
"Everyone", // name of trustee
GENERIC_ALL, // type of access
SET_ACCESS, // access mode
SUB_CONTAINERS_AND_OBJECTS_INHERIT); //讓自健繼承他的權限; inheritance mode
//合并結構ea和OldDACL的權限列表到新的NewDACL
if(SetEntriesInAcl(1, &ea, NULL, &NewDACL) != ERROR_SUCCESS)
goto Cleanup;
//把新的ACL寫入到指定的鍵
SetNamedSecurityInfo(lpObjectName, ObjectType,
DACL_SECURITY_INFORMATION,
NULL, NULL,
NewDACL, NULL);
///////開始操作注冊表//////////////////////////////////////////////////////////
//...................................................
////////////////////////////////////////////////////////////////////////////
//恢復注冊表的權限;
BuildExplicitAccessWithName(&ea,
"Everyone", // name of trustee
GENERIC_READ, // type of access
SET_ACCESS, // access mode
NO_INHERITANCE); //讓自健繼承他的權限; inheritance mode
if(SetEntriesInAcl(1, &ea, NULL, &OldDACL) != ERROR_SUCCESS)
goto Cleanup;
//把舊的ACL寫入到指定的鍵
SetNamedSecurityInfo(lpObjectName, ObjectType,
DACL_SECURITY_INFORMATION,
NULL, NULL,
OldDACL,
NULL);
//釋放指針
Cleanup:
if(SD != NULL)
LocalFree((HLOCAL) SD);
if(NewDACL != NULL)
LocalFree((HLOCAL) NewDACL);
if(OldDACL != NULL)
LocalFree((HLOCAL) OldDACL);
}
[/php]
----------------------------------------------------------------------
Gandalf ([email]ganstein@gmail.com[/email])