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

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

[复制链接]
发表于 2005-3-16 11:27:43 | 显示全部楼层 |阅读模式
  (dlutyuanhongl发表于2005-3-15 23:14:04)
4 S0 t* T  n7 I! _& Z+ f7 A# Y1 }
) i) ?9 G3 t6 ^  |' ?2 l1 N这几天,由于工作的实际需要,需要对光驱,软驱,USB的启用和禁用实现控制。参考大家提供的对网卡禁用的代码,实现了光驱,软驱,USB的启用和禁用。主要实现代码如下:
# u, Z2 g( ~# k6 q3 H// 必要的头文件和要链接的LIB文件
* ?4 b* `" a* d#include <setupapi.h>
4 h" p, Y/ e! l2 N/ n+ }#include <shlwapi.h>
7 H% A. f3 n- Q' T4 E#pragma comment(lib, "setupapi.lib")% V2 P& v- J& j$ u
#pragma comment(lib, "shlwapi.lib")( a) X& U8 Z. F$ P# t# g0 A

* D3 x" q) P) {3 T. z; R/ X/ v// device information set(我把它译为设备信息集)# C! |1 Y% ?6 X1 ~  e9 R
HDEVINFO hDevInfo = NULL;
) m* ~  U6 H4 {- b/ F
" x6 ]! t0 Q6 s// 出错信息
6 x7 t8 D! p* }* K6 ]+ Kvoid FormatMSG(DWORD dwError, LPTSTR * lpszMsg)
3 v$ h  Q9 P, P) z2 c{ ) s# J$ V( l# Q1 \. c, L2 z8 {
   BOOL bOk = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM 3 K& V1 |% g) d/ x  N
       | FORMAT_MESSAGE_ALLOCATE_BUFFER,
, [! o3 z! ]  F+ h        NULL,
7 I6 S1 G+ h' \        dwError,
3 j* F' y1 W$ j6 B        MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED),* L4 y. W7 U  K
       (LPTSTR)lpszMsg,
7 y+ P/ h0 p& Y4 E4 O# J* z. a# W  E        0," R4 z! O3 E, B6 s/ D$ y. B
       NULL);! e* b$ \7 K1 \; c  B$ F* m
# u' M+ F' g/ L; W0 I' K. n
if (!bOk)
! o5 U5 }  `" h{' Z) ]1 i1 K) A. {0 f2 D/ S
    HMODULE hDll = LoadLibraryEx(_T("netmsg.dll"),, k& m! i  M: h9 B
                                 NULL,! Q% U3 u# h+ i
                                 DONT_RESOLVE_DLL_REFERENCES);
. m3 g7 v; h2 T8 l# }  if (NULL != hDll)
- H) R( z  _9 u8 c# R0 m  {
5 }$ n+ G4 m/ R/ X  t% `* ]/ \   FormatMessage(FORMAT_MESSAGE_FROM_HMODULE |  
0 H1 y7 e& ?2 w- M* ~/ R                 FORMAT_MESSAGE_FROM_SYSTEM,1 S0 }) w1 C" D# c8 y, q+ T- c+ @
                hDll,
( D& k: p4 h% {                 dwError,
5 ^- J- h$ R. v2 t        MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED),2 k, l4 |- V1 q
                (LPTSTR)lpszMsg,
( Q& e: V) q' Z- r                 0,! s0 C9 j2 k! j  ]% T! K
                NULL);
" v( j* z) n0 R- L3 C      FreeLibrary(hDll);' M  m, M$ G5 e8 m
  }( s5 W$ O8 Y& u" P+ b: \# y* E: `
}: d# g9 o- h2 h% {) z5 B
}0 {" q/ _1 i8 z

! h, [0 O6 A0 C4 \) l  j; yBOOL ChangeStatus(DWORD NewStatus,
" l1 s9 Q" L' K                  DWORD SelectedItem,  
( v8 i8 |8 h, V# x7 ~' o6 H& D2 J                  HDEVINFO  hDevInfo)
/ h5 u' `9 B5 V5 F2 H{4 E+ O* c2 o9 L5 D. |0 e6 x9 X
LPTSTR lpszMsg = NULL;
7 \3 g5 o5 l. n8 e( j6 \  IHCURSOR hCursor = NULL;
) G$ [3 y3 @6 vtry" r1 Y2 f1 O3 I* S. _! ]8 A
{
0 c3 b; V$ ?) q2 Z% B  O2 O  SP_PROPCHANGE_PARAMS PropChangeParams =
/ q3 b4 S: L: Y/ p& m' A  b( r                     {sizeof(SP_CLASSINSTALL_HEADER)};
$ a/ f0 F* P/ ~. B: M. s  SP_DEVINFO_DATA DeviceInfoData = {sizeof(SP_DEVINFO_DATA)};    
6 S+ S* ?" H& l% x7 G4 n$ i7 q8 X: h6 x
  hCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));7 D( C1 d1 q$ u7 W1 f+ R& c
( U" y9 p0 c/ [, u
  // Get a handle to the Selected Item.- Q! b; f0 y; ^$ h0 g) R) J
  if (!SetupDiEnumDeviceInfo(hDevInfo, SelectedItem, &DeviceInfoData))# b7 t% `6 ]6 |+ u" e- ^, c$ D3 j
  {
+ e6 q: d0 @' y       FormatMSG(GetLastError(), &lpszMsg);5 @3 _9 a; v# E% W; B/ {; e& v! q
      throw lpszMsg;
0 g( I- ~2 O9 H  }
& L; o# }( {' q' Y7 n2 Q
. C8 I6 R5 E" _7 _  T1 }/ \* d  // Set the PropChangeParams structure.$ ~" w; R1 @% A8 @1 ^# S
  PropChangeParams.ClassInstallHeader.InstallFunction =  
6 N9 b# w4 B9 B/ K4 T                                     DIF_PROPERTYCHANGE;" Z7 b0 z9 A1 n( K& f) Z: a
  PropChangeParams.Scope = DICS_FLAG_GLOBAL;
+ s! ]. O# A& [- D8 k  PropChangeParams.StateChange = NewStatus;+ w9 c+ U& \  g8 @

! }5 S. W1 C! X  if (!SetupDiSetClassInstallParams(hDevInfo,
3 L% s& M2 d7 o  i* s  X            &DeviceInfoData,+ D, s8 ^5 k7 M2 k" E& ]" J' H
           (SP_CLASSINSTALL_HEADER *)&ropChangeParams,& q9 ?7 @4 p+ I0 Y# \  T% p
           sizeof(PropChangeParams)))  E5 v. _4 s3 d! S: Y$ s$ b
  {. V6 f7 I: Y/ y2 P" ^! T: G- E
  FormatMSG(GetLastError(), &lpszMsg);6 ?8 Y2 J2 z  q! Q5 {2 o! _
  throw lpszMsg;) L3 v; F1 _/ e! _
  }1 P4 }$ x3 o- R/ L+ w" ^  r
  G9 t  Y$ |, c9 v2 E: b- ^
  // Call the ClassInstaller and perform the change.
  ?/ @7 ^4 _/ R5 r  if (!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE,* |5 f, ~5 z5 d1 h0 t5 X- j
           hDevInfo,
4 F, u/ ?! w) p  Q) [. {            &DeviceInfoData))
, {+ c+ G- }0 X8 Z  P4 h  {+ C( p! l  H- m' l7 k  j
  FormatMSG(GetLastError(), &lpszMsg);1 d5 \; s8 q  {
  throw lpszMsg;$ [& V- `% ?( `
  }
; o& r. l% d( p* o1 U( V; G7 l" r9 b; o7 J+ d" s8 {' F
  SetCursor(hCursor);  7 k9 T& ?" S! t' z" ~& L
  return TRUE;
# c* [7 k4 T! K5 U- y# U' t}
& t. s5 d1 b6 |4 i. Ncatch (TCHAR * pszError)
7 ^6 _  ~0 g% O6 u* `0 {{# ?# ^% t# T. L
  SetCursor(hCursor);% R  N% Y9 C  w, E1 p( D
  ::MessageBox(NULL,) Q8 }! j8 Z9 B# Z6 B0 o
              pszError,
$ v. h3 b' Q$ N9 w               _T("提示"),
% X) j( |# D7 d" b1 O               MB_OK);: X; V! Y  ?! z1 U! R- t: Z3 v
  if (NULL != lpszMsg)5 Z# g' h1 w# P" O8 t4 i
  {
% A1 B, C& N1 c& O       LocalFree((HLOCAL)lpszMsg);
. N: _, I" M4 \! u+ j  }
) d% X* C9 k% f/ A, d7 S& M6 i7 X: d      return FALSE;8 }1 {: ]  N9 C  Z* g. M
}     
4 B+ H5 ~$ G7 r  a& c2 `3 g* r}3 J& h$ S9 m& F" k( m
/ l- @# t6 {2 o* F. p& H
// 这些设备的启用和禁用主要有此函数实现9 F, j7 D) m7 }
// 参数说明,nStatus 可取3个值,-1 :啥也不做$ N0 R! b4 p( X8 Z% @
// 0 禁用设备,1启用设备。; F% D! C' `3 F* E. ]3 U: F
// nIndex用于控制是对光驱,软驱还是对USB启用或禁用7 Y2 L" s; j) x! e- _
// 也是可取3个值,0 代表软驱,1 代表光驱
( R/ U# G- b# i3 ~3 X5 b+ \# K4 u4 J// 2 代表USB% Q0 o) ~, F7 `% L
// 譬如要对光驱实现禁用,可以这样调用此函数. V6 B/ _8 f! x5 Q8 r
// ControlDisk(0, 1);
; H( _/ Z; t* e: k# B' O+ s5 p' XBOOL ControlDisk(int nStatus, int nIndex)2 d7 z8 c+ U, e
{9 j# F2 K' [4 u% c% D) C
if (-1 == nStatus)/ z$ j- x! ]8 R# U; R4 U$ E
{4 \1 ~; g3 e" {% U$ z7 V- c* u% R! O
  return FALSE;; D7 S  ?* S0 \) p9 k
} 5 l( m* r6 O) E4 \! l2 d0 d
; \: D, |/ _# {$ Y6 y+ e4 G/ Q
LPTSTR lpszMsg = NULL;* i! D( {8 X* [
try
0 Y( ~8 B6 q/ f( U) a{
8 O* K/ h8 H  J7 y& ]' K+ W+ p  TCHAR * GUIDString = NULL;
; Z' s" N. a' b5 R  GUID guid;5 r; I) ]1 `. k
  ZeroMemory(&guid, sizeof(GUID));
3 [: A! K$ y. x0 P4 ~1 x  p! d  switch(nIndex), D4 W1 ^# Z2 B: z
  {
5 I" O5 L) g! H  case 0:    // 0 代表软驱
/ E# `" T6 _8 b9 J6 s( L. {   GUIDString = _T("4D36E980-E325-11CE-BFC1-08002BE10318");4 t6 K, Q4 X1 H# m( K
  UuidFromString((unsigned char *)GUIDString, &guid);  T8 J1 \* m( u6 ]! E/ k  n; ^+ x
  break;
+ D6 `% F# F( X& R  case 1:    // 1 代表光驱
2 H$ m; o7 g* v7 E4 f# u, ]8 `   GUIDString = _T("4D36E965-E325-11CE-BFC1-08002BE10318");
9 K- j6 J& O! g+ O9 [0 D   UuidFromString((unsigned char *)GUIDString, &guid);+ c6 G. A& ~1 @# T9 n- M
  break;  D  N, v* V6 U" _" S
  case 2:    // 2 代表USB
$ G3 Y( z3 q3 f6 @. {; y1 l   GUIDString = _T("36FC9E60-C465-11CF-8056-444553540000");
3 }2 V  H9 R0 i# E   UuidFromString((unsigned char *)GUIDString, &guid);
* |; I4 M* u7 I- B   break;/ H4 d3 |! \. A: F7 W) a$ E7 u& ~4 R2 q% P
  }& ]: _7 @1 B  C% `2 |' J
' g/ l6 p# B# J, v* M
  hDevInfo = SetupDiGetClassDevs(&guid,
  [; y, r- H1 Q) g$ L            NULL,4 k- Q: L3 ]/ F* o, r6 F
           NULL,
; ]3 B; L  O# G            DIGCF_PRESENT);
2 v( l2 J, @6 ?  J  if (INVALID_HANDLE_VALUE == hDevInfo), e4 k9 N3 s4 g  U2 q0 E0 A- v
  {9 i5 [# P+ i9 }9 E5 \
  FormatMSG(GetLastError(), &lpszMsg);
' a2 G! h3 [) _7 z3 k, Z9 l   throw lpszMsg;% T1 [% \8 W5 f( L% f$ b
  }) _/ x' L5 E. K6 t
. w% ?4 V: P# \( M. f1 t
  DWORD i;& x/ b$ @: q) L0 v9 f% f
  SP_DEVINFO_DATA DeviceInfoData;
8 S, I4 J5 Q5 v8 G' x; I  ZeroMemory(&DeviceInfoData, sizeof(SP_DEVINFO_DATA));5 {+ w. e! Z* L3 J, Z$ A2 d/ S0 ~1 V
  DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
) Z; T/ D4 J5 J! |
; M+ `6 a$ a8 F3 [" \  for (i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData); ++i); ?( b; q1 h4 {: T5 \/ k$ U. j
  {
6 {1 _" A& l: E: Z! ~9 X   if (1 == nStatus)% B5 {# s0 ]) F4 [& m0 A
  {. i3 Q: l- Q6 H. s) g& A
   StateChange(DICS_ENABLE, i, hDevInfo);
. h) z& m: p+ ?' K9 D/ e   }. B6 H9 b& z6 g$ O7 J1 X
  else if (0 == nStatus)
4 R1 U" {8 u- ~+ a3 y2 c) Y   {' a- M8 l2 S; a; }9 F
   StateChange(DICS_DISABLE, i, hDevInfo);. q" i: E2 M. c  C# Y
  }   % F' l+ x! v" T/ k- N
  }7 B& g+ a( V+ ^5 k: b( U4 C
  V) ?: @3 z& p6 E  u/ x0 O; T/ ]
  // 释放 device information set, S3 S4 x5 @5 B
  return SetupDiDestroyDeviceInfoList(hDevInfo);
9 @1 v5 c6 u: w+ |. P3 Y}  [& `  a8 `; K. F
catch (TCHAR * pszError)1 [# d! l( o# c' z+ [' e8 q$ j
{7 s, Z( x& p& _3 u+ n$ I- Y
  ::MessageBox(NULL,
; I1 Q: p# j4 a5 j8 B! a            pszError,
- s2 p! W* _6 i! r/ X8 r" x           _T("提示"),
$ Y4 D: s0 F& P. Q( L      MB_OK);
/ n8 z+ ~! W' j  v  if (NULL != lpszMsg)- q: l, z0 M5 o+ l9 y9 Y0 T- K! n" ]
  {' ~, T; L2 w; H- e9 C
  LocalFree((HLOCAL)lpszMsg);
" {7 u) w& M1 R4 Q8 W0 r0 l  }
' ^& @; T% ^) W1 q2 D  return FALSE;& J0 M2 d; J) {% d3 B
}
. Q# ?# n/ x; B# E' {0 R! ^return FALSE;  @- ^# v- G/ @- s
}
" r% m7 I, n+ v) B" L' c/ b9 n4 E( R6 f, V( ~
   经测试这样对光驱,软驱和USB实现禁用没有问题,但是当禁用过之后如果要对USB实现启用必须两次调用ControlDisk(1, 2);这个函数才可,其余的两个启用没什么问题。还有要说的就是我不是用的枚举所有的设备,然后再过滤(网上的那个禁用网卡的就是这种方法)。
1 ]: C. O" _" i3 r    据我观察,在注册表的此项下下:0 U4 d$ h6 s; I( O$ C1 j
   HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\
4 ?. x9 [; y6 ^$ F    有很多GUID,每个GUID代表一个设备,譬如这个是USB的
& E( f' c. \. d" A- w5 ^    {36FC9E60-C465-11CF-8056-444553540000}0 t( C5 y4 ], l4 d& e
   这个是CDROM的
5 c5 ?6 z( i! T    {4D36E965-E325-11CE-BFC1-08002BE10318}等等了。
* |3 p2 p1 n' a1 s( O这些值你即使把它改为别的GUID,我使用原来的GUID仍然可以实现我的功能。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-8-14 01:05 , Processed in 0.024069 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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