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

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

[复制链接]
发表于 2005-3-16 11:27:43 | 显示全部楼层 |阅读模式
  (dlutyuanhongl发表于2005-3-15 23:14:04)
8 i& ~4 ]# a5 G2 P8 f! X5 q
! q( ]5 U) N/ P% x) c' P这几天,由于工作的实际需要,需要对光驱,软驱,USB的启用和禁用实现控制。参考大家提供的对网卡禁用的代码,实现了光驱,软驱,USB的启用和禁用。主要实现代码如下:. ]6 S* u- I3 [& r8 m1 P
// 必要的头文件和要链接的LIB文件+ {7 s# ~4 M3 J9 }% M0 A
#include <setupapi.h>2 [- w+ ~$ }8 T% L/ J7 s
#include <shlwapi.h>
8 G& @. W( u/ M) X8 M7 P* R6 s/ R#pragma comment(lib, "setupapi.lib")
+ P& c& S' H6 q% q# J+ b' n( h9 z+ V#pragma comment(lib, "shlwapi.lib")
5 n" z; E/ L. w2 T, @7 K' L0 p: l$ \' ^( A2 b7 E
// device information set(我把它译为设备信息集)
: ~( X8 l# `  c* F# Q" @2 OHDEVINFO hDevInfo = NULL;) @- O: [- f  S' c* T# V

% g* h! m3 K* D5 e2 o. G6 ?0 S5 G// 出错信息
% j# G( R' c" f& ]4 }+ Gvoid FormatMSG(DWORD dwError, LPTSTR * lpszMsg)# p1 V5 h5 z& Q
{ $ t3 v) `4 K! T+ @
   BOOL bOk = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM
0 O3 J  b! v, {: }        | FORMAT_MESSAGE_ALLOCATE_BUFFER,
( [1 z, a% x2 ~! C        NULL,& s' ^7 Q1 z! G2 S& W
       dwError,
9 a) J) M! z% z  z6 J& E- {' ^        MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED),* r. [( Y$ H  Q# ]9 J6 O
       (LPTSTR)lpszMsg,+ X8 R1 {# T7 {. ~/ D& G; o" P0 P( s9 D
       0,. M3 n+ w' r5 t# y' o" H
       NULL);
1 Q: [# @6 `/ d. i" `& @% T
* c$ d) c0 |3 y) _3 }0 |9 b0 o  Qif (!bOk)
0 O3 L( S( R& n- m{
+ O% r2 U' `. b- P/ c$ W     HMODULE hDll = LoadLibraryEx(_T("netmsg.dll")," C! d9 Z. l  W% A% |& m/ z( Q% N
                                 NULL,
8 X- ^) i! A- h  ]; Q6 A' _2 T& Q                                  DONT_RESOLVE_DLL_REFERENCES);* N, U, R  I0 h$ B  d" a7 F! v
  if (NULL != hDll)- _. j# ?) g- u0 l
  {
" Z9 o( _" X* N2 l   FormatMessage(FORMAT_MESSAGE_FROM_HMODULE |   1 W' h% G) V' J; t& w
                FORMAT_MESSAGE_FROM_SYSTEM,+ s7 I7 {1 Q( K6 M
                hDll,
" u; r3 G4 ]2 y2 o8 Q                 dwError,  w% e) V: \. g+ p/ T% g
       MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED),
, T5 o& R" z: {( x                 (LPTSTR)lpszMsg,9 e0 ]9 F! d7 b
                0,
% y9 v, S- @( o3 f  q: }) k                 NULL);
) u( W" ]1 n: u3 c2 k      FreeLibrary(hDll);) Y% D2 u, H# i6 H& b- K
  }7 U# o) d3 v" J/ \, T" [
}
2 v2 t) c* N1 f2 f2 M, W6 g}
" ^9 A0 h+ r. p8 t8 Y; G. ~5 e9 d. T, C  I8 Y: q
BOOL ChangeStatus(DWORD NewStatus, ; u) e1 t4 f6 w
                 DWORD SelectedItem,   7 m. f: d1 [& Z% R9 z# E0 O
                 HDEVINFO  hDevInfo)
/ ^! n' a% w8 q$ @3 ?! A{
* }6 a8 B+ z$ O) f3 JLPTSTR lpszMsg = NULL;- }  V7 e- a$ n3 m$ O6 L
HCURSOR hCursor = NULL;
  H) L$ C. F' \2 v1 otry9 Y( _9 m3 H2 j
{- u! o3 z' C3 g; F
  SP_PROPCHANGE_PARAMS PropChangeParams = 0 U6 Y' s! G" P4 A+ V7 T
                    {sizeof(SP_CLASSINSTALL_HEADER)};
& f% _$ ^( M6 R, v7 k; `' b  SP_DEVINFO_DATA DeviceInfoData = {sizeof(SP_DEVINFO_DATA)};    ! W2 t# ]" x, K( ~) x2 k

  \; N. c: V, k) p% y  h  hCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));, k& e/ x: s: B& Z" J2 |: q

. f) Y) A; u2 {5 T; p6 N  // Get a handle to the Selected Item.8 G, p2 H% @- a
  if (!SetupDiEnumDeviceInfo(hDevInfo, SelectedItem, &DeviceInfoData))
4 I  x. K5 T4 t. Q  {
8 Q) K, n3 i: `2 q: c0 l       FormatMSG(GetLastError(), &lpszMsg);6 q. _1 D5 h2 e+ k) t- J' g, O; y
      throw lpszMsg;
& a/ W, v3 ^+ N* {7 b  v" q' a* E- d  }
. B% ^/ G4 b: `% x' y  D* ?1 W9 B$ {1 P1 L! l1 B8 o
  // Set the PropChangeParams structure.
- r$ m4 R  A2 O. J( v* X  PropChangeParams.ClassInstallHeader.InstallFunction =   2 ]! Y7 r* A# z! R+ _5 F' B
                                    DIF_PROPERTYCHANGE;
6 R% G6 z" }' e- ]  N. u  PropChangeParams.Scope = DICS_FLAG_GLOBAL;
% D1 Y8 S$ \; q1 V  O0 U  PropChangeParams.StateChange = NewStatus;; ?5 }" _- }- S% W2 j
" S% y2 g: n% S: O3 O
  if (!SetupDiSetClassInstallParams(hDevInfo,
. J5 l% z! B: y+ o; D            &DeviceInfoData,* M  D# j# P2 P" J5 x8 L" m
           (SP_CLASSINSTALL_HEADER *)&ropChangeParams,
" v0 l2 [) S* F" p" t            sizeof(PropChangeParams)))3 D) X5 G1 |/ s& u8 W: z
  {
  e, C7 }) R) d+ M5 y5 v- @   FormatMSG(GetLastError(), &lpszMsg);# Z1 F$ I8 N2 I( L% M' ]
  throw lpszMsg;
3 I5 I: g% ?8 O4 S9 Z  }
2 `8 D6 e" O8 {/ p% Y$ x' r5 b& R
9 A' a( G: T, Q4 ~  // Call the ClassInstaller and perform the change.' i: e2 f# e: S5 F5 ~/ {2 K
  if (!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE,
- d* M# Z& _) a+ Z/ n# M  r* F            hDevInfo,6 F/ L' a% {0 \0 n  m4 T' z* {8 {
           &DeviceInfoData))- c$ m! O! L0 Q- d' p' }9 S, @5 z
  {& Z& F6 R1 B( f7 a  L* l5 |
  FormatMSG(GetLastError(), &lpszMsg);2 q, A9 E, c# e7 w5 Q& @
  throw lpszMsg;5 O4 C' m2 D, p0 V+ {2 @
  }& n+ \: m: d9 C4 z: V: i4 ^

" C0 \1 [+ x8 a& \  SetCursor(hCursor);  
9 Q1 p) y* e8 E$ l  return TRUE;. z% v; o) o+ `0 R" q
}+ P. H6 v& q/ C' l, ?5 G
catch (TCHAR * pszError)
$ a' ^6 G( n2 O# ?5 ~( v; B{0 w  ?$ f. w) z4 D  e' O
  SetCursor(hCursor);
% A$ @& A9 M( Z1 l: f; |  ::MessageBox(NULL,' P0 q, x) Y# k. Q$ @9 ]: [
              pszError,; r. ^  N; f+ k1 g5 Y$ l
              _T("提示"),2 f& a* h7 W2 w" _0 p
              MB_OK);
9 `! w+ c' _9 e) W3 J4 t( C" g  if (NULL != lpszMsg)9 O) C1 K1 [# r. A1 A
  {" F6 ?. a4 y! H) L$ d
      LocalFree((HLOCAL)lpszMsg);
# H7 ~( I3 a- r, L$ S  I  } " ?5 C3 T6 ]- t& f- A6 t
     return FALSE;
, A% f0 }' s: N1 n2 w7 @5 m; Y}     ' v" a0 d) R0 G5 U* u
}. h& ?+ l2 q" G/ m( c& O1 T- S! |
* s6 {! c0 `4 {3 y: U" R
// 这些设备的启用和禁用主要有此函数实现; ?* k3 M5 e* c9 C% ~' B/ V
// 参数说明,nStatus 可取3个值,-1 :啥也不做/ c% i' v- E5 O% [$ [
// 0 禁用设备,1启用设备。8 ]6 }, }: e4 \4 e
// nIndex用于控制是对光驱,软驱还是对USB启用或禁用5 y% M8 b1 `2 @5 P0 i  o9 Y
// 也是可取3个值,0 代表软驱,1 代表光驱4 M" S  v+ H* I5 A
// 2 代表USB
0 ~" b# d3 S( o1 I% E  v% _// 譬如要对光驱实现禁用,可以这样调用此函数
: j0 v: B3 j* U$ U; }// ControlDisk(0, 1);
0 d9 K/ X, t9 w# q+ ^BOOL ControlDisk(int nStatus, int nIndex)
1 J2 c; t, o9 l4 {" u$ [, @{
8 x+ f. M+ ^% s( Y8 G4 n& aif (-1 == nStatus)  l& L6 P$ {: f; A7 L, V4 X
{2 W- v9 c$ f. v9 a& t8 R
  return FALSE;% k2 ?9 [% w. ?4 R
}
3 `1 x! K# C/ X" H5 b6 R6 E/ e3 h  T8 d
LPTSTR lpszMsg = NULL;. U8 f" l3 X  y5 N- ?5 Y
try
9 _1 z$ Y( P7 S  K, F3 X7 J{2 G/ H, A$ D" P6 \& I( o' b
  TCHAR * GUIDString = NULL;
- Q3 z( F! H( Q' O: ^: [. Z1 S  GUID guid;5 ^. v+ u7 K0 j
  ZeroMemory(&guid, sizeof(GUID));' A, I) `0 i5 W, q$ w% d4 A8 q# g- M
  switch(nIndex)  U8 ]0 |6 s8 V! w9 ]
  {" k+ N$ L# n2 U5 H1 j
  case 0:    // 0 代表软驱7 O- k. }; p+ N, N9 S# _) m; `
  GUIDString = _T("4D36E980-E325-11CE-BFC1-08002BE10318");# ?# l; y8 U6 |) m4 ]" j
  UuidFromString((unsigned char *)GUIDString, &guid);7 w  [: x1 t: B1 W
  break;
( `* L8 ], N4 U- p  case 1:    // 1 代表光驱 8 c1 }7 ^5 N& T' y6 j
  GUIDString = _T("4D36E965-E325-11CE-BFC1-08002BE10318");8 Q  Y& d4 B& d0 Z5 j# A
  UuidFromString((unsigned char *)GUIDString, &guid);% H3 O4 O- J' H
  break;6 M9 b  i9 V0 _0 _
  case 2:    // 2 代表USB
2 f" o9 k6 w) X. k' G   GUIDString = _T("36FC9E60-C465-11CF-8056-444553540000");
3 w2 P3 N5 {! K! ~  Q   UuidFromString((unsigned char *)GUIDString, &guid);
- }- L0 C- ?% W   break;2 T, z5 z* G( q2 m( Z/ E8 `
  }9 |/ g" ?4 `5 _7 {8 P4 w, a6 D

9 D: h, S  P* ^* m$ B0 j  hDevInfo = SetupDiGetClassDevs(&guid,
! L% h. M) S6 \            NULL,
+ t5 U7 b( w2 D) a5 X            NULL,0 r6 c& i: t! a& K9 K. l
           DIGCF_PRESENT);% ^0 T5 C/ y( j6 \. ^+ G$ V
  if (INVALID_HANDLE_VALUE == hDevInfo)# `5 P7 j$ v9 k
  {
/ Q& j/ x5 Z- F2 E& j9 |7 a0 N   FormatMSG(GetLastError(), &lpszMsg);
6 P% t/ c' q  \; i. E6 f   throw lpszMsg;& e0 I8 C5 R; Q0 _$ A" y$ A
  }
9 y9 j' Y! i+ i
! W: i+ f3 z% f% W: }7 B4 I: q  DWORD i;/ Q& F4 b. C1 l
  SP_DEVINFO_DATA DeviceInfoData;
4 D3 V+ H& g) G. d3 S: y6 b& i  ZeroMemory(&DeviceInfoData, sizeof(SP_DEVINFO_DATA));
; _& L  m0 p" Z  R5 [  DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
- _: r$ Z. ~/ [  V' S$ H0 C. d$ [) b- L
  for (i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData); ++i)
3 O: `4 I7 g( p6 ]  {
+ [/ T2 a* q* _; `" D   if (1 == nStatus)
, s# E; K0 U9 _1 I) |   {
4 F( D* F1 `2 c9 T/ A  @  K/ h    StateChange(DICS_ENABLE, i, hDevInfo);3 d* C+ X7 y" q! N
  }% I. k& a4 i6 f7 H1 x
  else if (0 == nStatus)
& l0 X  L: I# @2 X. i4 Y6 R& @3 o9 R   {
. j' `* ], s( X    StateChange(DICS_DISABLE, i, hDevInfo);
2 D; T- G, p# O5 m( d   }  
* z. x) u) _/ M! b" @: y5 g  }
4 y6 Z: q9 ^3 K! Z# N0 z
& z4 J: c( O! Y% p  // 释放 device information set
) L. {1 Z, |# Q/ @6 q  return SetupDiDestroyDeviceInfoList(hDevInfo);. J( g* t2 s: N7 l3 o
}+ v- k" S, a" [& Y6 B% P
catch (TCHAR * pszError): ^0 Y2 m: L& [& ]# U: ?' i
{$ A. N$ E: w  a* _
  ::MessageBox(NULL,
5 |2 }; {2 \% F+ N( \9 Y0 x            pszError,6 v2 @, v0 Y; R5 M3 u
          _T("提示"),8 f$ \( O' h+ ], h
     MB_OK);. a+ X% c6 i, j: f& p
  if (NULL != lpszMsg)
9 b* G3 e* a) }  {4 c" M4 {( ?6 ^" N7 f
  LocalFree((HLOCAL)lpszMsg);
# s3 j; t2 L& V' @  } 5 o) ]& ?; ]  L7 O
  return FALSE;5 e+ u' H$ E8 j' g
}
" r2 O+ d  ^2 L' ]return FALSE;- L" ~7 |7 D1 S: ?$ B, J" p
}
2 c1 d5 _1 X' q3 l! i* p( O, D
* |1 `, J7 q8 z/ X) q    经测试这样对光驱,软驱和USB实现禁用没有问题,但是当禁用过之后如果要对USB实现启用必须两次调用ControlDisk(1, 2);这个函数才可,其余的两个启用没什么问题。还有要说的就是我不是用的枚举所有的设备,然后再过滤(网上的那个禁用网卡的就是这种方法)。
+ M' A' s! ]) e9 l; b/ G3 M    据我观察,在注册表的此项下下:
5 O" u: U" t# j- a& g    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\
) M; F# @- x# z4 J  V5 |    有很多GUID,每个GUID代表一个设备,譬如这个是USB的
9 p( x+ Y- B) U$ t* }- i, k    {36FC9E60-C465-11CF-8056-444553540000}
+ L2 g. W: |# V) E4 C5 J5 W( N" z    这个是CDROM的* ?7 x) t' v; E
   {4D36E965-E325-11CE-BFC1-08002BE10318}等等了。9 G$ K% s0 C1 R. |5 d& V* Q
这些值你即使把它改为别的GUID,我使用原来的GUID仍然可以实现我的功能。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-8-9 06:48 , Processed in 0.034279 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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