USB 驱动自动卸载方法

作者: 2011/12/15 0:50:37

  最近在作一个项目,有驱,要求 USB 驱动自动安装、卸载。这里,就卸载部分提供一些

  线索,供大家赏析。 ;)

  虽然,MS 不再支持 Win98 了,但是,我们还是要考虑盗版的 Win98 用户们,所有从

  Win98 为代表的 Win9x 说起。

  [color=royalblue][u]Win9x 系统上的卸载 [/u][/color]

  1). 删除 .inf 和 .sys; (%Windir%\inf\, %Windir%\system32\drivers\)

   2). 删除注册表中的 HKLM\Enum\USB\Hardware_ID;(你的 inf 文件中应该有)

  [color=royalblue][u]WinNT 系统上的卸载 [/u][/color]

   相对来说, WinNT 系统上的删除要复杂些,特别是权限的原因:

  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;

   //获取现有的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])

特别推荐

玩家留言 跟帖评论
查看更多评论