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

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

[复制链接]
发表于 2005-3-16 11:27:43 | 显示全部楼层 |阅读模式
  (dlutyuanhongl发表于2005-3-15 23:14:04)
( T3 F: a" K* j1 K/ a5 A
# v& N2 k4 L" J7 Y这几天,由于工作的实际需要,需要对光驱,软驱,USB的启用和禁用实现控制。参考大家提供的对网卡禁用的代码,实现了光驱,软驱,USB的启用和禁用。主要实现代码如下:
. F* ]) n4 L+ {% c% o: L8 F// 必要的头文件和要链接的LIB文件8 v9 Q9 ^" p( R' @
#include <setupapi.h>, _, r9 s% c2 S( I/ O% u
#include <shlwapi.h>' n& {' i" g( g. L+ K+ H
#pragma comment(lib, "setupapi.lib")% j# D- x/ ~0 L5 x! r' i+ l2 L
#pragma comment(lib, "shlwapi.lib"), K! b1 o! r! g/ M: F
- e  q  v3 m1 `: @
// device information set(我把它译为设备信息集); b; h# K+ O4 q1 q# J
HDEVINFO hDevInfo = NULL;4 V: Y6 I4 R! W6 p; R
% U, T0 O9 f4 {( W
// 出错信息
4 @# Y) p5 V- \2 E$ r" c0 \& wvoid FormatMSG(DWORD dwError, LPTSTR * lpszMsg)
! f! u( \/ r) V{
# i5 q! }# L  b5 F2 }9 l    BOOL bOk = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM
0 d9 E7 p: l, l4 ]' T        | FORMAT_MESSAGE_ALLOCATE_BUFFER,0 B6 H- u& `6 h) t
       NULL,0 Y; p' x, |6 f
       dwError,. l4 B2 f4 i2 H: u  ^# o
       MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED),8 i: e' |/ O- j- U2 C! s$ _
       (LPTSTR)lpszMsg,% w& ~+ Z  q7 o- D5 M
       0,: V; m5 L( \0 j" n
       NULL);
% u  d+ }, `) F2 {
- C* I2 R: T# U' L; z. f1 m- |8 gif (!bOk)
! w( ]- W. Q$ f! K- ~& E{
! Z& R# K5 Y# E     HMODULE hDll = LoadLibraryEx(_T("netmsg.dll"),, u) d6 F9 S8 Z7 i2 J2 y
                                 NULL,
" j; a! N- g( }, L: B1 V8 w, _                                  DONT_RESOLVE_DLL_REFERENCES);" L# ?- c1 l8 t  K1 [/ O3 x
  if (NULL != hDll)
- L2 a1 A- O; x& f, l& G$ \  {. J8 c! F: J/ C, @5 ^* [+ `0 R
  FormatMessage(FORMAT_MESSAGE_FROM_HMODULE |   . s1 [7 q: T, Q6 c7 A
                FORMAT_MESSAGE_FROM_SYSTEM,
5 h7 X) h5 r# Y                 hDll,+ B# {& \0 o/ x8 S" Y9 [
                dwError,2 O3 s7 i. p; W: Y; Q# k
       MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED),! V/ z* z. y2 ~5 ?, A: Q) [
                (LPTSTR)lpszMsg,) u& F* [8 g/ {+ p0 o2 g; x. K
                0,
9 }% L- {2 _, A' H7 g$ X9 ^                 NULL);# U+ ^6 p6 X; P% t& a# Y" h
     FreeLibrary(hDll);3 h) {0 h2 r1 }% d2 ~
  }
* B  i5 M' o5 ?7 d}
7 z9 r& a1 ~+ `& V" F}
# q* j  \0 |$ ?9 g
/ j6 t' G: l: VBOOL ChangeStatus(DWORD NewStatus,
8 m7 P0 e5 q2 T* j% S% j                  DWORD SelectedItem,   , C- s) ], u  b4 z
                 HDEVINFO  hDevInfo)
2 o) Q% F8 f. K; Q, s9 {/ n! ]* V{& k0 R) {4 q7 Z' X6 K, {
LPTSTR lpszMsg = NULL;
( Y5 G; q/ V! m8 _3 }) T' z# SHCURSOR hCursor = NULL;+ A$ A: o4 w& ?  K' ~+ \
try
- O6 ]( z0 h0 ]+ z. J1 d1 `2 x! q{
6 v  G) T- {4 |2 \$ C  SP_PROPCHANGE_PARAMS PropChangeParams = 8 P& r6 W8 o) P& w$ B8 Y, u
                    {sizeof(SP_CLASSINSTALL_HEADER)};
4 e+ D% k* o& S. ^  SP_DEVINFO_DATA DeviceInfoData = {sizeof(SP_DEVINFO_DATA)};    
2 B" T# N  N/ P' A6 Z+ a8 J! p) J& ~$ O, {
  hCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));2 n/ n& G8 m5 P7 }& z7 M6 r

/ p* X9 G1 q% k) {2 U  // Get a handle to the Selected Item.
1 O$ V0 t8 A$ M) [  if (!SetupDiEnumDeviceInfo(hDevInfo, SelectedItem, &DeviceInfoData))
' ]$ T, f' k; Q- s. n  {
0 d7 N9 I) X7 r% y8 }  Z! w       FormatMSG(GetLastError(), &lpszMsg);1 Y! p8 w* ~2 A0 T
      throw lpszMsg;6 |+ {" O5 T3 k. p8 A! L/ H$ ^/ j
  }, `& t* b: L5 V2 h% C6 T3 C: u
6 L4 |6 x% A) ]5 n6 q7 V
  // Set the PropChangeParams structure.
+ x1 P3 \/ C6 |0 o! ~  PropChangeParams.ClassInstallHeader.InstallFunction =  
: i3 _2 W- n$ r/ w% E9 m/ o                                     DIF_PROPERTYCHANGE;
% G% c" H; W) b9 A1 L9 K  PropChangeParams.Scope = DICS_FLAG_GLOBAL;
+ R% |' S9 ?- W0 `  PropChangeParams.StateChange = NewStatus;% F* [& u4 o  ?6 o3 _9 l7 w
1 |& Z9 Z: C, B  u9 p
  if (!SetupDiSetClassInstallParams(hDevInfo,
9 n6 Y  d+ b; \/ u  X            &DeviceInfoData,$ X" M3 r8 P% j. a3 a1 C
           (SP_CLASSINSTALL_HEADER *)&ropChangeParams,
$ R: F3 p7 U4 k9 ?6 f' P: S7 _            sizeof(PropChangeParams)))' p- O% z6 s; Q1 z3 \* H! ?
  {; p9 w8 K4 S9 M# i
  FormatMSG(GetLastError(), &lpszMsg);
9 w; p. L, D9 D5 r' x! w, N   throw lpszMsg;
5 \- o) |7 l# _' I8 Y) c) ]( q$ V. z  }
7 E3 D- d" E7 t' k# ~7 [1 g" ?. `: c0 V5 h
  // Call the ClassInstaller and perform the change.
( F: F1 g6 ]* k! b& ^% n% ^  if (!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE,4 o, a7 P% X& V3 U2 \
           hDevInfo,# p. i& a1 G6 _. ?- R: |
           &DeviceInfoData))
' e1 A, u. q7 @  {
  K) c" m; Q6 A9 I   FormatMSG(GetLastError(), &lpszMsg);* Y8 D( n. ]( t, v
  throw lpszMsg;* O; l( m# k& x. N' h: l: W
  }$ T9 v8 @6 R8 p9 `

  C  M& L& A5 ]1 j2 A' [  SetCursor(hCursor);  
7 Y6 i/ ^+ @0 w3 R3 ~  return TRUE;  E+ l. N' g% ^; \2 R8 z
}
: W7 P! V8 [6 |. i6 r$ b" acatch (TCHAR * pszError)
' o" h: N4 u. P! _- J9 i{
) Y' K, X! b# M+ q. j7 n  SetCursor(hCursor);* H& T; N) N7 K
  ::MessageBox(NULL,
* h' J* g% q# l6 }/ y               pszError,
6 R/ b( L7 t2 B0 Z+ E               _T("提示"),
4 m! C2 Q1 k* U5 h( Y, p               MB_OK);
$ ^- e5 F. _# t  if (NULL != lpszMsg)9 z7 ~% O! Y1 C& \' L) L) J# c
  {
: `# |( ?1 i$ k8 c! P, F       LocalFree((HLOCAL)lpszMsg);
- w8 ?3 k8 m9 V, }4 h  S' ]  }
8 s, p8 N$ ^3 c. W) {      return FALSE;9 z7 W  y  k1 O* W& w
}     
& s5 k+ Y( a" \  d: j' h}& G. Z/ D  X1 v# f* ^8 |# y

" |9 G- {/ X3 ^// 这些设备的启用和禁用主要有此函数实现
( @* s: W! U. t5 ]// 参数说明,nStatus 可取3个值,-1 :啥也不做" S' w9 Q* o3 h: }" q
// 0 禁用设备,1启用设备。
3 E1 K5 y8 z2 Q6 s$ G' `. g// nIndex用于控制是对光驱,软驱还是对USB启用或禁用
& ^% z9 K% p$ ?3 c// 也是可取3个值,0 代表软驱,1 代表光驱
6 d% g: I; J9 o7 d3 v// 2 代表USB
8 Z! Q/ w; x! z  [8 R, W4 Q" l// 譬如要对光驱实现禁用,可以这样调用此函数7 j  ^" |' F! o4 u' |% X
// ControlDisk(0, 1);# M( \. z# ^( b4 ^8 \
BOOL ControlDisk(int nStatus, int nIndex)* h7 A3 n9 E1 @4 v3 ]* I" Y) B2 f
{  ~6 ]" `/ V* @& i5 _, N) D& j$ ]
if (-1 == nStatus)
$ [' T! q0 @% h* @( s; v{
. B( a  y) Y9 x6 V- l. }) l5 Z4 a  return FALSE;
+ U' ]8 o/ `- h  f' O}
4 w1 J1 V1 w9 i# F( N$ Z5 @7 {
! U9 [  w$ f; L! x& Y% W& k9 _LPTSTR lpszMsg = NULL;$ R3 G9 p, A3 e- Q% [- |
try
/ _) S6 X& O7 J2 N: N{; {# o1 [9 H. B1 [
  TCHAR * GUIDString = NULL;
2 v, |6 ]5 R) e7 X! t8 ~4 f2 x  GUID guid;- _4 @1 M, b% Z
  ZeroMemory(&guid, sizeof(GUID));% L& U* j& \+ A. L$ s
  switch(nIndex)
! @5 k* l7 C/ m" A* J: j  {; |* k) G5 w  i
  case 0:    // 0 代表软驱# a# ?9 D4 q; p7 _
  GUIDString = _T("4D36E980-E325-11CE-BFC1-08002BE10318");5 n  b+ {  o6 z! G& c
  UuidFromString((unsigned char *)GUIDString, &guid);
% x3 j$ }/ R# Z" k   break; 7 Y9 N" S# H$ w$ G6 H5 U* I
  case 1:    // 1 代表光驱
1 u6 Z; S) u1 F9 h, z" x1 n   GUIDString = _T("4D36E965-E325-11CE-BFC1-08002BE10318");
. e$ I* |' ^; }" V$ C- g) X   UuidFromString((unsigned char *)GUIDString, &guid);
8 f: ]( `* O7 V+ O! U   break;
, m" T! v" H5 N, e: T% m  case 2:    // 2 代表USB% t6 o# i) u9 @# N. J" e5 [
  GUIDString = _T("36FC9E60-C465-11CF-8056-444553540000");
$ L7 S7 ?' Y7 }' W4 C3 g   UuidFromString((unsigned char *)GUIDString, &guid);
- L1 |' D) P, C! A   break;
# S2 h8 {; {- ]- ~& k  j, O  }
7 \$ P, U, L0 g& D2 n6 y  @, J- ?$ o+ g9 R2 U
  hDevInfo = SetupDiGetClassDevs(&guid,5 O8 Z0 @/ J5 M- o4 W, L8 G7 L
           NULL,2 {# R, w1 P1 s4 J) O
           NULL,+ H- U- {6 E, Y) U1 U" [! D
           DIGCF_PRESENT);
+ ]- e" P$ ]/ c$ N/ `7 r& ~  if (INVALID_HANDLE_VALUE == hDevInfo)
, `/ t% L# x$ M8 i" G  {
& v7 X6 a8 V' m4 ~( u2 _# [- ^( Y   FormatMSG(GetLastError(), &lpszMsg);
9 c* x: m3 _7 Z; J( G   throw lpszMsg;
' M* J4 P0 o2 b  }5 r# [$ ~; C* l( X% a

) |, ~- a* y, s9 N- G" }4 a  DWORD i;; d; l7 q2 P3 U: c' H/ S# _. c
  SP_DEVINFO_DATA DeviceInfoData;
' z3 e2 |( X+ E' w5 u. l1 I$ L8 l  ZeroMemory(&DeviceInfoData, sizeof(SP_DEVINFO_DATA));
2 a. E% M/ ]8 z/ U9 Y  Q* w  DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
5 d9 o0 p% N$ w0 I
# ]1 Q$ b& e( ~$ T2 R  for (i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData); ++i)
% L) x/ r) e' r1 ]# {  {- X- u- c* r% f
  if (1 == nStatus)
7 [. ], x: P/ j# K* _" U: v   {) f8 o3 x; _1 J7 [: h' |- u( C
   StateChange(DICS_ENABLE, i, hDevInfo);
% r. K% m% Q. `5 I- d' c) X   }
1 Y% C1 D. d% T- K6 i  S. \* R# W# n   else if (0 == nStatus)
2 R2 Z( P/ L0 }: y: M! _   {1 O' z: v% w" m. V' ?& h  e0 C
   StateChange(DICS_DISABLE, i, hDevInfo);
0 o" ?) \# F; S   }  
& }% l% I/ V+ N, X3 ~8 Q- a  }
; e3 Z0 a+ @' Z
1 p/ X  q9 u" @1 p, u+ c& K0 `  // 释放 device information set$ ]7 K7 i4 L; r! k/ {' T+ u8 Z
  return SetupDiDestroyDeviceInfoList(hDevInfo);
! E( @' ]; U/ i4 W  r+ b}
3 q) l1 A  D& u5 N0 b; L: R  D: K0 J' ncatch (TCHAR * pszError)9 a8 R6 T* V) z
{
( D9 |! \/ N  I3 p( y  ::MessageBox(NULL,, v0 E" }; x* R1 ]5 t7 Q. j, ]
           pszError,9 L1 V" ?# o3 ^4 n0 Y7 C  m4 \
          _T("提示"),2 y- n$ u( t! d2 i. q" l
     MB_OK);
) z+ x' {& _' R- D; Y: s  if (NULL != lpszMsg)0 o8 X/ x6 C# Y" i4 E; W9 j# a6 x
  {
8 n( H! a- ?; }3 w# o  Q, i   LocalFree((HLOCAL)lpszMsg);* Q  |/ h2 W9 m) K; d
  } 2 w. A: F8 k7 @* X, S
  return FALSE;
: g0 a3 P: m- f% m; ^3 [/ ]}  B9 |6 m, Z( F# N. k/ g- o& m
return FALSE;7 e2 K& j: b8 S
}) w* p# _  }) Q0 _9 E, N, b6 u

5 X5 r: G1 y) r8 x# K  G    经测试这样对光驱,软驱和USB实现禁用没有问题,但是当禁用过之后如果要对USB实现启用必须两次调用ControlDisk(1, 2);这个函数才可,其余的两个启用没什么问题。还有要说的就是我不是用的枚举所有的设备,然后再过滤(网上的那个禁用网卡的就是这种方法)。9 Z9 [- R- \: r4 t
   据我观察,在注册表的此项下下:
, T4 k7 t3 h( k/ d8 {2 j    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\$ T6 N& H$ ]3 R8 J5 e9 r* k1 Q* m
   有很多GUID,每个GUID代表一个设备,譬如这个是USB的  v) K* A: g% ~# _
   {36FC9E60-C465-11CF-8056-444553540000}
( P6 V0 N' j  w+ ?/ q2 u    这个是CDROM的/ P" m9 ?( r; C3 ?/ O
   {4D36E965-E325-11CE-BFC1-08002BE10318}等等了。7 z8 v' ?* [0 D3 h6 X4 m
这些值你即使把它改为别的GUID,我使用原来的GUID仍然可以实现我的功能。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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