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

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

[复制链接]
发表于 2005-3-16 11:27:43 | 显示全部楼层 |阅读模式
  (dlutyuanhongl发表于2005-3-15 23:14:04)
. Y# D( p( c4 E3 g  G
" U' x! G: x3 i- [/ l* _这几天,由于工作的实际需要,需要对光驱,软驱,USB的启用和禁用实现控制。参考大家提供的对网卡禁用的代码,实现了光驱,软驱,USB的启用和禁用。主要实现代码如下:
1 _& }) N$ N# I; r( j// 必要的头文件和要链接的LIB文件; f6 L2 D9 l; m% B& \6 o
#include <setupapi.h>7 h" D; \: a/ x, W8 t$ n* U" l
#include <shlwapi.h>
* `4 a0 W* L6 H- Y#pragma comment(lib, "setupapi.lib")/ F4 C( L# E% L( k) }- }2 S
#pragma comment(lib, "shlwapi.lib")
( [; k* ~! W0 m4 N" e/ E2 z& r6 `/ ?4 m; ]$ S. c7 C9 I
// device information set(我把它译为设备信息集)1 c3 p. ^4 F' c# }& h5 t
HDEVINFO hDevInfo = NULL;- c2 g- U! K  K. r9 h

( |" E# o2 A' K// 出错信息4 u# L# ]7 ^! Y, S4 P. \6 Y
void FormatMSG(DWORD dwError, LPTSTR * lpszMsg)3 V. [# X( I( c0 F' s$ U
{
9 ~1 A4 M9 S6 W8 O: e    BOOL bOk = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM 5 ~" p5 c- x  l8 i7 b
       | FORMAT_MESSAGE_ALLOCATE_BUFFER,
& h# |  M; l& I1 W( [4 ]6 u        NULL,
3 c  {0 z& `" ^7 b        dwError,: x" f% O# S" @/ y& P3 `. c
       MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED)," v2 W$ h8 [. W% J" W, }
       (LPTSTR)lpszMsg,
; h0 Y4 I! a* G* ~3 X% |' X6 g        0,; f' f, B$ Z3 v6 l( x6 y( L: N! \* ?
       NULL);
6 v5 g: T3 B) Z- k
2 \  \  T4 a% t, Y, `: n% Rif (!bOk)$ H( g( W& t, x
{
5 Z1 M& `" Q0 k* D     HMODULE hDll = LoadLibraryEx(_T("netmsg.dll"),
3 C7 _  [; [# F7 x! G2 m                                  NULL,
; G  W$ r. `0 M  m' P; O, K9 b                                  DONT_RESOLVE_DLL_REFERENCES);
) V' _6 e6 W: @8 g! `8 e  if (NULL != hDll)8 C7 }' H' G" s2 |2 ?8 S  b5 W
  {# T& ]4 k6 T* ^, I
  FormatMessage(FORMAT_MESSAGE_FROM_HMODULE |   0 k8 Q0 o$ B  ]) a. F" l, j
                FORMAT_MESSAGE_FROM_SYSTEM,9 x$ [* }7 z# z2 U1 K8 d5 r% ~( }: k
                hDll,
, `: F1 a* k- z5 _5 _$ ^0 k" D                 dwError,
  D3 f5 P( z% x- _        MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED),
3 G* X# p# |9 H                 (LPTSTR)lpszMsg,
$ _; J) [* S! F: r                 0,. s8 @# z- ?- ?5 s
                NULL);- O. U0 H2 U  M( T. q
     FreeLibrary(hDll);$ ~& H, Y+ t% O, M" |1 ~6 {  [
  }
0 \  u6 X9 _, E+ G' I}. v6 Z0 X& X+ c4 q3 w! V; t# ^/ C
}
" d8 Z! ~$ g) k+ Y
, @9 Q7 }3 I. I( A) f, ]' A3 nBOOL ChangeStatus(DWORD NewStatus,
. e) Q' x  Z8 w' E: M                  DWORD SelectedItem,   / r9 V/ \0 c+ \4 D1 Y5 X& L( A7 Z
                 HDEVINFO  hDevInfo)& S% A  f: C# V7 d5 i' U6 Q3 E
{
; t& c4 g' [# y  _' ?+ oLPTSTR lpszMsg = NULL;
6 j0 d; a6 ^/ M3 M5 l) I# E/ B6 ~HCURSOR hCursor = NULL;- n5 V' h: X. b1 M5 s
try
; F) O7 ^# A! V+ V' T' \1 Q{6 u% p. @3 @. `# V* Q9 e
  SP_PROPCHANGE_PARAMS PropChangeParams = 0 k6 I1 w/ f! G. ~. y, R# a* G, e2 |
                    {sizeof(SP_CLASSINSTALL_HEADER)};" `* n" r. M  [$ y7 ]' F. e7 K6 d
  SP_DEVINFO_DATA DeviceInfoData = {sizeof(SP_DEVINFO_DATA)};    + F: @/ H5 l: D/ O7 F

$ w! G# T9 ?3 V' }# Z  hCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));+ d8 X/ _" N7 p6 I

3 P6 O, c' \6 C5 I" {! }3 O6 v! i  // Get a handle to the Selected Item.# M& a* j# j6 E8 _6 P% q
  if (!SetupDiEnumDeviceInfo(hDevInfo, SelectedItem, &DeviceInfoData))
4 k$ Q9 K$ v' ]; `) {% p0 k  {
( J- j* {/ z' T, H) J       FormatMSG(GetLastError(), &lpszMsg);
' S! C7 G5 t2 q. G' W       throw lpszMsg;0 k! q1 l$ b# |$ \! ^9 q% V
  }( A- T, M+ K% x' i6 ~- O
1 W+ _9 g2 H& B2 z- L4 @% }8 b
  // Set the PropChangeParams structure.
8 u* R  U0 ~8 P- o  PropChangeParams.ClassInstallHeader.InstallFunction =   % F1 V. h4 g; |" E: G$ _
                                    DIF_PROPERTYCHANGE;# u/ ]* i, [* Q# j/ R: B. c
  PropChangeParams.Scope = DICS_FLAG_GLOBAL;
9 S3 w* g8 P( \- i; S% j' u# T  PropChangeParams.StateChange = NewStatus;) y6 g7 r- E, S0 Q

9 \% R# R8 ?9 b  if (!SetupDiSetClassInstallParams(hDevInfo,
9 _9 Z6 u. Q) \- y( M            &DeviceInfoData,+ r8 E  m  `3 @6 U7 H' Y
           (SP_CLASSINSTALL_HEADER *)&ropChangeParams,
2 y, z; v" q0 }            sizeof(PropChangeParams)))
" N, E, |" [/ ?/ F3 a) h5 P  {7 i0 T! ]4 |  ]
  FormatMSG(GetLastError(), &lpszMsg);
1 @) x9 H4 U+ h   throw lpszMsg;
9 j4 ~( i) S7 _7 n8 H" z' v# Z  }
; x7 V  _8 V. R. G1 p3 j6 e. w; I7 b8 ~" B
  // Call the ClassInstaller and perform the change.
& ~/ m6 o2 G( j; `- z  if (!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE,
. g2 O: _  H/ m7 ]            hDevInfo,# X0 Y) L; x: V9 c
           &DeviceInfoData))* a7 \2 o/ P! A4 P" p* O5 z
  {
8 {3 D/ f9 w1 N/ D8 R9 u- s   FormatMSG(GetLastError(), &lpszMsg);
+ p% F- O2 x. z/ E- E   throw lpszMsg;
( \& ~' o: C, K# V- q; X  }
. P; t4 x( e! g5 b+ S  t1 J  m
3 X: {) |; d) }" K" `  SetCursor(hCursor);  
- j" N/ q& O; E  return TRUE;- z2 C# Q  c# j3 p& T& m( p
}5 X& G/ {: A7 @1 a" ?
catch (TCHAR * pszError)% o: D- j- T" T2 y
{
7 J# V) K' A* O0 K8 m  SetCursor(hCursor);
1 @; o7 L- [  T" p/ ^) _# U  ::MessageBox(NULL,
1 f, T' `1 z8 Z$ z& r& b               pszError,& P( s( W8 l6 Z' |: y5 b6 l
              _T("提示"),
* F8 W: p9 o8 e8 `) k& N               MB_OK);2 u# N; f' y: V: h, O% m# f% ]/ p$ s& u
  if (NULL != lpszMsg)* v# L" A, i3 K& d+ b
  {( K) q# j, x/ ]( @$ e
      LocalFree((HLOCAL)lpszMsg);! R# t8 j5 E. {+ H5 j* q0 c) X# ^
  }
2 Q7 b: y3 U0 x$ O) S9 r      return FALSE;2 Q- m7 B6 u# N6 a
}     
( I' K% F7 Y- ~9 N}
$ P( a5 \3 o) k+ K4 g  y* k
& V, k; ~3 }) x' T0 \5 U0 {1 d// 这些设备的启用和禁用主要有此函数实现7 ]$ e; ?- k6 j+ U  A5 _
// 参数说明,nStatus 可取3个值,-1 :啥也不做
  _0 R4 ^# V) i0 O" w& @// 0 禁用设备,1启用设备。
. M# a4 k- g6 ?* M; l/ ^// nIndex用于控制是对光驱,软驱还是对USB启用或禁用1 a, f( `) x# J- v- r
// 也是可取3个值,0 代表软驱,1 代表光驱
4 w2 K2 j. W: p2 i// 2 代表USB
* P4 S; H# c% z// 譬如要对光驱实现禁用,可以这样调用此函数
' X$ \* u6 y2 D- k' s% V// ControlDisk(0, 1);
  ]" q/ B  }& p' ABOOL ControlDisk(int nStatus, int nIndex)# N6 R$ H' `' e: `+ [% z% X
{+ t2 M! [  _5 c' W* V4 N! Y$ J
if (-1 == nStatus)% e+ F2 W7 l+ N' V4 X; Z
{3 A$ |4 W0 `3 U) J6 |' k9 `
  return FALSE;7 U: W! `1 C% t
}
) J4 b; q0 T& Z) O. R( N# h9 k8 a2 N8 _
LPTSTR lpszMsg = NULL;
4 y$ ^0 K3 ?! j! u& {; _3 u4 B. Itry7 P, f- y: W) [  K9 V
{
9 r. M- x  T0 j8 }/ r% ~, |  TCHAR * GUIDString = NULL;: ^1 \6 P' p1 v5 N( V0 m
  GUID guid;
  B& S. Y5 r" d& ]7 z! p% X0 H  ZeroMemory(&guid, sizeof(GUID));+ J+ `% W" K# G- m' H. a
  switch(nIndex): ]( [; l8 r5 K$ x6 V2 x0 D8 d
  {
2 F2 E4 J2 P; |/ W" T8 |6 S! S  case 0:    // 0 代表软驱
! Q5 S; O3 m7 C+ H$ T& d   GUIDString = _T("4D36E980-E325-11CE-BFC1-08002BE10318");
+ c1 C$ p  K* r+ j   UuidFromString((unsigned char *)GUIDString, &guid);7 Q( E, g0 O2 d7 \
  break; : I& A/ g2 P1 |% d# w( m
  case 1:    // 1 代表光驱 ; ?' B2 X0 ?9 L
  GUIDString = _T("4D36E965-E325-11CE-BFC1-08002BE10318");
+ y, M" S2 ?- E  B. M& L$ G6 o   UuidFromString((unsigned char *)GUIDString, &guid);2 K" Q  X; i6 I3 F9 }9 c5 L3 M* Q
  break;
% S/ |* i! o: S0 B+ o2 n( ~  case 2:    // 2 代表USB# _6 H0 w# G6 D5 w; C; x8 ^& Y
  GUIDString = _T("36FC9E60-C465-11CF-8056-444553540000");5 x5 K' J6 `, ]  Z9 i) I0 l3 r
  UuidFromString((unsigned char *)GUIDString, &guid);' C4 ?( B* ?8 ]9 Z( A7 Q# T4 ?
  break;! g; g4 s% Y  y) B# w6 P/ n% U% p; r
  }
( Z1 d2 C! Z% B1 h, W
/ H- b. x" U' H  hDevInfo = SetupDiGetClassDevs(&guid,) \. d9 H( B* p. K5 P! y
           NULL,, B6 m$ J2 n# }3 \. V
           NULL,
" B. I( `2 F7 T. X9 w1 m            DIGCF_PRESENT);$ c) N/ l+ `: }# \
  if (INVALID_HANDLE_VALUE == hDevInfo)& O0 E, P& }7 O/ j# I9 K0 ~0 R/ t
  {
4 h$ a( O0 P9 L! }* R8 S& N  h   FormatMSG(GetLastError(), &lpszMsg);
2 a4 A' N% u! y+ Y  Q0 Y( s   throw lpszMsg;
7 d- }: P" R+ G! n: I  }
: y! w7 S" b2 o" r( N- `) R( \2 O( b& u" R% f
  DWORD i;) ]" ?4 E4 u. I
  SP_DEVINFO_DATA DeviceInfoData;
  w& ]/ e: e/ P" g# L8 T0 l  ZeroMemory(&DeviceInfoData, sizeof(SP_DEVINFO_DATA));% I# u% z& l: ^& h0 P$ P1 b& o" N& c
  DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);) C6 J  j( K! w* S7 B- L
% s4 ]9 l5 Y# |/ M
  for (i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData); ++i)
) O/ M( V. a0 W8 u/ [; J  {" v0 j1 T1 ?" \& Y# w
  if (1 == nStatus)9 R7 c* u& U$ G. n4 l. m3 ?
  {" E! d& x0 q7 ^/ Q9 O& z
   StateChange(DICS_ENABLE, i, hDevInfo);
7 h) S* {7 Z+ U6 D1 r5 J& C% F   }
  [2 c0 G( |6 T4 i/ [   else if (0 == nStatus)7 _6 ]& R+ ^, l# E
  {) e/ s& J, n+ _3 v. a; e$ X
   StateChange(DICS_DISABLE, i, hDevInfo);' }4 E# A' b" b6 o
  }  
: i3 k- b( c: A  L5 L0 x  }" F! N' S% \0 @: m8 v4 f. e+ w$ @
: M% B' r5 N' G2 Y, I
  // 释放 device information set3 O* F% i1 y5 i' e/ s
  return SetupDiDestroyDeviceInfoList(hDevInfo);) D, E/ e- U; b( ^8 s
}
+ s  z" p' W# E" B/ B- X0 w$ Dcatch (TCHAR * pszError)
- O# |8 r. Q3 n/ X- D  B. _{8 e" \% ^' {  N0 w
  ::MessageBox(NULL,
6 s' m0 y7 |- q8 B" O! ~! w: V2 L            pszError,
6 X- D" V# K4 {3 o           _T("提示"),
* J( p/ d8 F5 l6 D      MB_OK);
. A( K( p! b+ n$ {" Q8 ^  if (NULL != lpszMsg)$ R  [- v# {, d/ q3 P6 M; ~
  {- E) ^4 B2 _$ U+ T
  LocalFree((HLOCAL)lpszMsg);# G% G: r3 q+ ^& F2 n3 j
  }
' _( j% r+ k% p1 |+ d8 k! j  return FALSE;1 [5 G7 A  G1 Q4 \
}
5 L! `( L, Q! O8 Areturn FALSE;0 v/ V( g6 x' Y: c/ b9 b' Q
}
" k6 e, {. S  t2 ^! m' h$ j5 [, u
  {/ F+ l+ f# p( n8 D; C3 _' D    经测试这样对光驱,软驱和USB实现禁用没有问题,但是当禁用过之后如果要对USB实现启用必须两次调用ControlDisk(1, 2);这个函数才可,其余的两个启用没什么问题。还有要说的就是我不是用的枚举所有的设备,然后再过滤(网上的那个禁用网卡的就是这种方法)。+ Y" F; Y+ u, K2 X, |
   据我观察,在注册表的此项下下:
/ X3 i! ~' v* \" ~    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\- w3 G+ y! U" a1 ?' V5 W( _
   有很多GUID,每个GUID代表一个设备,譬如这个是USB的
& D/ R% S# D1 D    {36FC9E60-C465-11CF-8056-444553540000}; M; o0 Y) U! p' P0 `9 i7 v+ ~
   这个是CDROM的0 ]7 }  ~0 I6 }6 n% b
   {4D36E965-E325-11CE-BFC1-08002BE10318}等等了。
5 ~6 M1 Z3 z+ y) }这些值你即使把它改为别的GUID,我使用原来的GUID仍然可以实现我的功能。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-9-30 13:04 , Processed in 0.034868 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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