灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:2484回复:0

USB 驱动自动卸载方法

楼主#
更多 发布于: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)

喜欢0 评分0
游客

返回顶部