找回密码
 注册
搜索
查看: 3800|回复: 0

[转载]光驱,软驱,USB的禁用和启用

[复制链接]
发表于 2005-3-16 11:27:43 | 显示全部楼层 |阅读模式
  (dlutyuanhongl发表于2005-3-15 23:14:04)2 ^* D) W: P" ~2 e" d
+ G  R  r0 q; U$ U2 N" p& K6 K- ?: i
这几天,由于工作的实际需要,需要对光驱,软驱,USB的启用和禁用实现控制。参考大家提供的对网卡禁用的代码,实现了光驱,软驱,USB的启用和禁用。主要实现代码如下:
0 Y+ g+ w+ I* w) F2 O) B// 必要的头文件和要链接的LIB文件$ S/ N; l6 x: Z  m; o: c+ h% C# T
#include <setupapi.h>3 \  @6 {2 R+ ~6 y
#include <shlwapi.h>
) b% i6 \2 s+ M  ^6 x3 u/ E1 E#pragma comment(lib, "setupapi.lib")
/ \# e& P* O9 u  n0 A9 }#pragma comment(lib, "shlwapi.lib")! C3 D$ H! P1 s( S
+ z! t: H; }1 a% o: a* R
// device information set(我把它译为设备信息集)
* a5 p1 O) o1 o. t( ]+ D, ?HDEVINFO hDevInfo = NULL;6 g7 U0 ^, m7 F/ P& K1 A

$ G8 o! F2 X# |' w' K" n1 B// 出错信息8 y% @% y! }, `4 f$ Z" Z, e7 U
void FormatMSG(DWORD dwError, LPTSTR * lpszMsg). i' c: L% D+ @2 w
{
8 p0 r, K. L- O5 f# s9 n    BOOL bOk = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM 1 z+ S! N2 m  \% g& Z
       | FORMAT_MESSAGE_ALLOCATE_BUFFER,( e( W' r7 l2 ?# U/ s; [
       NULL,
( R# ?0 }2 u# b* _( ~; s1 ?        dwError,
: o2 K% I/ G# @, y        MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED),
6 w1 F2 j9 d2 |# Z' S3 Q        (LPTSTR)lpszMsg,
- m+ z8 j/ i2 Q7 e        0,
5 `0 K% b  q7 v% ^8 ~( T! b        NULL);" }- k- `6 \# `+ f+ v& f, f
6 v7 D! y: C: t) b5 P
if (!bOk)
& r* {" c/ s: r$ p! D{( u& f+ p  S. W- B, N" X  A9 u
    HMODULE hDll = LoadLibraryEx(_T("netmsg.dll"),
: J2 h7 x# g/ i) Q8 ^! v" s* n1 }                                  NULL,
" ~# ?( U: C6 H* ^- i                                  DONT_RESOLVE_DLL_REFERENCES);
  T9 `0 j* t  u1 w( W) ]: m% ^  if (NULL != hDll)( `1 l/ i2 W$ s; s+ [; l. O
  {: }* {" T( g, \( V
  FormatMessage(FORMAT_MESSAGE_FROM_HMODULE |     E+ L8 v, k* C
                FORMAT_MESSAGE_FROM_SYSTEM,% b# t, T  O2 N8 U7 B
                hDll,
- J( d0 e. J1 e" J                 dwError,
- @) ]* ?( p* u/ \        MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED),/ M* o+ R, i3 N% `
                (LPTSTR)lpszMsg,
; c, c5 T9 t3 Y8 \, L                 0,. C2 y- N( }; w7 [
                NULL);
* _9 L' z5 j( c& U* K      FreeLibrary(hDll);- _; o' f/ J& X/ ~
  }
3 _) B/ K9 \8 `) y" }! T! h}
7 x  h$ D" W$ U6 k) S* }}1 x4 G9 m# X# _& `+ `
! m- V6 k. n; c$ v, L
BOOL ChangeStatus(DWORD NewStatus,
, v9 I# ^, z2 Z- I, B5 J                  DWORD SelectedItem,  
( e$ J9 f: L- k/ N% ?" P2 \' j                  HDEVINFO  hDevInfo)
4 ~& h0 W; B8 D5 Y{9 g: O) J$ `2 N; H0 Y
LPTSTR lpszMsg = NULL;( X5 S1 n$ T! T! o9 c
HCURSOR hCursor = NULL;
& N- M3 b9 U" v8 utry
7 o6 S( C' `$ U7 z{- O% W! M. @, Q! }
  SP_PROPCHANGE_PARAMS PropChangeParams =   b- m( ]6 G: e- U: T
                    {sizeof(SP_CLASSINSTALL_HEADER)};; W  Q# H% m# p! v* T8 T
  SP_DEVINFO_DATA DeviceInfoData = {sizeof(SP_DEVINFO_DATA)};    ' A, ]$ e$ q. P" i  d% v
9 I# ^5 I# m8 ]* C; i
  hCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));% ]8 l1 T# p7 @
5 d1 z0 Z* }3 d1 Y4 b# h. s
  // Get a handle to the Selected Item.
3 l; I! l2 @2 H9 Q5 M  if (!SetupDiEnumDeviceInfo(hDevInfo, SelectedItem, &DeviceInfoData))# l' S% S' d2 @: F
  {2 c3 h4 {& P/ \9 |
      FormatMSG(GetLastError(), &lpszMsg);
2 r! }" N- g2 q. k# X9 M6 n       throw lpszMsg;+ R& J) d- f8 {# L, a+ T
  }
' k6 b( ~- v- g' p; P* A: L+ \! x2 j) S* `( f/ r/ h! F
  // Set the PropChangeParams structure.$ D1 r- Y  a3 j0 k5 E: E1 g7 I
  PropChangeParams.ClassInstallHeader.InstallFunction =  
* S2 S  X+ J* r. z3 n                                     DIF_PROPERTYCHANGE;
6 _/ N; ?) V  w! v  r% X* q5 }  PropChangeParams.Scope = DICS_FLAG_GLOBAL;
5 k, k4 n, u5 v& T6 _! }  PropChangeParams.StateChange = NewStatus;
% P" b+ Q3 n# a# C4 k7 c
3 J0 T; o; Y/ Y4 a# A( B. r$ g. q  if (!SetupDiSetClassInstallParams(hDevInfo,, @% T8 Q& q, Q" V
           &DeviceInfoData,5 X, a5 o) d  i: `( c7 P6 j
           (SP_CLASSINSTALL_HEADER *)&ropChangeParams,
) Q5 O- v2 ]. F7 X# X            sizeof(PropChangeParams)))3 B1 z$ \/ ]$ A+ [- v: m
  {0 \) d6 o" y8 {
  FormatMSG(GetLastError(), &lpszMsg);  P: y4 ]1 j! c* _1 K
  throw lpszMsg;
7 d& \' u* ~8 E/ c: ~1 c) i. Q) u  }
! ^# G% `9 j$ Y# T) n/ B4 D; {  T( S% ~1 J* K
  // Call the ClassInstaller and perform the change.
7 G  B$ z3 Y& ]) ]  if (!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE,4 ~3 P3 e4 ~( P& {
           hDevInfo,
0 I9 r7 m) O  j+ q( R# q1 b            &DeviceInfoData))$ f$ W  F) ^; ~/ x! y
  {! a9 p- z9 P: f0 r
  FormatMSG(GetLastError(), &lpszMsg);
1 L% s' W. }. u8 l  l6 C6 Z8 a   throw lpszMsg;
- k+ ?  _! \. t$ ^1 f$ R1 S* i  }
( {& ?  }, m4 t6 x5 @9 l" e: i
4 ?1 |2 K- I! N9 t  SetCursor(hCursor);  " T8 ?5 w2 h: p
  return TRUE;4 q1 y% t. z) i" O' Y% B
}
7 m. g# b1 @" Z$ d4 e; T0 icatch (TCHAR * pszError)5 G, W  @5 k) j0 E1 F  y
{1 x" g) f7 }* i$ c: M% A- U& P
  SetCursor(hCursor);" C5 C2 W% D4 G7 O( Q
  ::MessageBox(NULL,0 M' G) o4 H5 \7 D7 V
              pszError,' i: I9 p( J* [7 P8 m: Q( f
              _T("提示"),  T! Q7 R5 o2 }& T
              MB_OK);
, v8 u' `2 X% b( `9 s& @, j  if (NULL != lpszMsg)5 v- z6 O( X" t# F
  {4 _) b- @2 I1 ]) G
      LocalFree((HLOCAL)lpszMsg);' i6 s  e) D0 [
  }
- S- |3 f" e% n$ x* O" T2 S1 s      return FALSE;
( ]% d  S: J& v' T# G}     
2 E" \9 b4 ^" f: t+ S# v4 b}
' b0 l1 h6 L  X2 C# o4 ]1 C7 D& P
, g+ k1 Z, [# `' W  h# f0 N// 这些设备的启用和禁用主要有此函数实现* S/ N4 t, m% U, \
// 参数说明,nStatus 可取3个值,-1 :啥也不做
2 N8 P6 v/ U: D2 K// 0 禁用设备,1启用设备。
+ {. S2 N! Y8 G" K5 `" _; @// nIndex用于控制是对光驱,软驱还是对USB启用或禁用7 }  a% |3 [' w: {
// 也是可取3个值,0 代表软驱,1 代表光驱
" ~4 D' i7 x  b" V, y4 L// 2 代表USB, \' X" ]- g7 C
// 譬如要对光驱实现禁用,可以这样调用此函数0 M7 O3 M! i4 ?! M' B3 X1 D
// ControlDisk(0, 1);2 e; I, U5 }) ^& H8 G% u- l
BOOL ControlDisk(int nStatus, int nIndex)/ g: n6 {) a% I! \+ Z" B
{
( d. z0 ^" h# Sif (-1 == nStatus)
' Y! W+ n6 G+ l. g8 |  ?* ]{
" i0 J6 ?9 I* X( R& P  return FALSE;$ L& q5 ]' O0 M2 a9 U2 [
} ! W7 @9 Q+ ]- e0 S$ W2 @

0 f$ e1 T. n  U5 v, p: R3 |LPTSTR lpszMsg = NULL;
8 h, ?! ?4 }# l# E, ^try
# _9 Z# K9 v7 c{5 Q" ]& R" R8 h8 X! t
  TCHAR * GUIDString = NULL;% W( z5 _& }! ?" d
  GUID guid;0 l, z  v) N2 F$ \: f
  ZeroMemory(&guid, sizeof(GUID));
& R) {5 j; C, |4 e5 m! w# H4 L; ~  switch(nIndex)
0 Z6 l, a3 M! x9 E8 j0 U+ W  {3 c$ [4 o( D( Q( t6 D7 }
  case 0:    // 0 代表软驱
  r* P; \: G' S/ l  n' ]# {   GUIDString = _T("4D36E980-E325-11CE-BFC1-08002BE10318");. ^5 i) Y5 @3 C0 {9 A+ d
  UuidFromString((unsigned char *)GUIDString, &guid);
: Q) Z  a, Z/ N' v# {- G   break; " ?# Z$ W7 _5 S! G0 O* k) L8 i' b
  case 1:    // 1 代表光驱 : u: A5 _7 u! d. |
  GUIDString = _T("4D36E965-E325-11CE-BFC1-08002BE10318");/ ^' u- G* G, j0 B! @" Z% c
  UuidFromString((unsigned char *)GUIDString, &guid);) N2 \3 ]9 P$ }5 c# a6 S
  break;" K; r6 n# R$ d6 E
  case 2:    // 2 代表USB
# [# w9 E2 a7 C! D3 k   GUIDString = _T("36FC9E60-C465-11CF-8056-444553540000");
5 k5 R' ~* _* F4 U  k( O   UuidFromString((unsigned char *)GUIDString, &guid);
9 G( J! Y% ^0 q1 Y& F5 q- m3 g8 a   break;
, k. y# n* h; U5 }& s2 U9 m# p+ O  }
& x6 {3 N& j" t4 }% z) T' v2 H- f; T) q) T- D  G- X
  hDevInfo = SetupDiGetClassDevs(&guid,: l$ w3 ~0 D3 k' f. ~
           NULL,
2 j  P" V; v( ]/ P# b* s- |            NULL,
2 j" T! `- m4 N            DIGCF_PRESENT);% l+ O1 I7 A" t* x4 L* a" }
  if (INVALID_HANDLE_VALUE == hDevInfo)( U. _! ~5 B7 \* ^6 G4 [# \% y4 E
  {) [" ~, h7 t* m0 K# b, R+ L3 o
  FormatMSG(GetLastError(), &lpszMsg);
8 B+ K7 f/ O8 g  {) x6 C% q: i* r  ]' O   throw lpszMsg;
6 t: Q( ?2 Q" M' Z6 N  }: ?4 S2 g1 b$ j- D9 @

) q5 u* |! }% ?! d/ N" i" i% U  DWORD i;& _) d: T* V5 f. k* ^1 w% z
  SP_DEVINFO_DATA DeviceInfoData;
$ F- k. W( B  t& x& Z4 p# O: i  ZeroMemory(&DeviceInfoData, sizeof(SP_DEVINFO_DATA));
5 W* z8 b" C- ^0 r5 Z* r  DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);& ?! \# y# @2 m" c: d
% H+ {( v1 T! Y! c: Z' m6 Y
  for (i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData); ++i)# Y+ ]) q9 V) N: m* t3 T9 Q
  {
3 p- W+ F1 S' S   if (1 == nStatus)
+ h- q# Q& x$ R  b   {) o2 y" _  P( f$ H+ C8 w4 {
   StateChange(DICS_ENABLE, i, hDevInfo);
& v7 q0 M2 C! Z  f1 i1 D- n   }
, N' H3 n- K0 J   else if (0 == nStatus)
& V- A& @8 ]* G" z+ s& i) [7 {   {
, |& S! `6 |8 Q  b2 e    StateChange(DICS_DISABLE, i, hDevInfo);8 n& i' X" M/ B- j' N  b
  }  
8 z% e5 a, |" n7 B/ W, e  }, m. x% A/ m. {3 [
5 T& d+ \0 }- k# A/ t9 S
  // 释放 device information set
' H7 G: w9 d& Y; s3 d) z( f4 _+ Z! a  return SetupDiDestroyDeviceInfoList(hDevInfo);
7 {- z) i7 R+ C- ^, s  S+ e}
/ I8 b- n9 I- q. Bcatch (TCHAR * pszError)
8 i1 o( u; z# ^; w{
0 Z# f# N& y2 b4 P$ b2 @4 O2 x4 S  ::MessageBox(NULL,
9 X, G, ~0 k: Z+ Q7 n3 ?            pszError,% u$ E( I9 V: v1 e
          _T("提示"),( o  R0 E" }* v3 r9 A  p/ s0 h# i, s
     MB_OK);
+ I0 ~/ v7 N& R3 X  if (NULL != lpszMsg)
" l+ D3 ?! l: L3 d' s* d  {
2 R5 n0 D, S# M# j3 `, i3 C   LocalFree((HLOCAL)lpszMsg);
2 ]9 m8 J" W# i6 f9 h; Q  } 9 a% i* _  `, X1 E# f/ F# S
  return FALSE;) R9 r' t3 T6 w
}
* B+ U& ^! j' z' h9 M) Jreturn FALSE;# b2 ]! E1 b  F3 Q- t; `
}
# I. \  E8 e0 W( M) u8 w3 g# ?9 j, V* c
   经测试这样对光驱,软驱和USB实现禁用没有问题,但是当禁用过之后如果要对USB实现启用必须两次调用ControlDisk(1, 2);这个函数才可,其余的两个启用没什么问题。还有要说的就是我不是用的枚举所有的设备,然后再过滤(网上的那个禁用网卡的就是这种方法)。; N0 B& {& n! g
   据我观察,在注册表的此项下下:0 H9 y( @: c% S$ m$ o1 @
   HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\% I) g; n8 R2 y6 |
   有很多GUID,每个GUID代表一个设备,譬如这个是USB的
! H3 Z" w7 l& r! |/ C    {36FC9E60-C465-11CF-8056-444553540000}- A, x7 T3 m% t2 M0 a
   这个是CDROM的
( `! O% }* B. f    {4D36E965-E325-11CE-BFC1-08002BE10318}等等了。% z: m. r4 j- a8 @7 q6 `
这些值你即使把它改为别的GUID,我使用原来的GUID仍然可以实现我的功能。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|宁德市腾云网络科技有限公司 ( 闽ICP备2022007940号-5|闽公网安备 35092202000206号 )

GMT+8, 2025-6-20 01:48 , Processed in 0.035207 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表