管理员
|
楼主#
更多
发布于:2011-12-18 19:49
 | |  |  | 最近在作一个项目,有驱,要求 USB 驱动自动安装、卸载。这里,就卸载部分提供一些 线索,供大家赏析。 ;) 虽然,MS 不再支持 Win98 了,但是,我们还是要考虑盗版的 Win98 用户们,所有从 Win98 为代表的 Win9x 说起。 Win9x 系统上的卸载 1). 删除 .inf 和 .sys; (%Windir%inf, %Windir%system32drivers) 2). 删除注册表中的 HKLMEnumUSBHardware_ID;(你的 inf 文件中应该有) WinNT 系统上的卸载 相对来说, WinNT 系统上的删除要复杂些,特别是权限的原因: 1). 删除 .inf 和 .sys; (%Windir%inf, %Windir%system32drivers) 2). 删除注册表中的 a). HKLMSYSTEMCurrentControlSetControlClass{CLASS_ID}00x b). HKLMSYSTEMCurrentControlSetEnumUSBHardware_ID c). HKLMSYSTEMCurrentControlSetServicesYour_Service a). 需要枚举 CLASS_ID 下的各个子键,并且获取其中的 MatchingDeviceId 看是否为 我们的驱动的 Hardware_ID, 然后获取 InfPath 的值,并去 %Windir%Inf 下删除之; b). 需要一个权限的修改。代码可以参见后面。 c). 是可选的,可以不删除,也可以删除。 [注意]: NT 上删除子键,如果该键下还有子键则需要使用 SHDeleteKey: Deletes a subkey and all its descendants. The function will remove the key and all of the key's values from the registry. WinNT 修改注册表子键的权限 [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; //获取现有的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 (ganstein@gmail.com)
| |  | |  |
|