找回密码
 注册
查看: 4237|回复: 0

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

[复制链接]
发表于 2005-3-16 11:27:43 | 显示全部楼层 |阅读模式
  (dlutyuanhongl发表于2005-3-15 23:14:04)/ t# Y% t" ~2 Y- }# A

/ y  J: M, |% v# S2 _+ m这几天,由于工作的实际需要,需要对光驱,软驱,USB的启用和禁用实现控制。参考大家提供的对网卡禁用的代码,实现了光驱,软驱,USB的启用和禁用。主要实现代码如下:. n' |8 M- S& i! \, e: e- V' x
// 必要的头文件和要链接的LIB文件
; d7 C) h- c, t. F; c7 u#include <setupapi.h>, m1 W, {2 P* L7 _, d5 \
#include <shlwapi.h>+ r2 r& G/ w0 j+ r  G, b
#pragma comment(lib, "setupapi.lib")& y4 O2 k9 X6 ^4 q
#pragma comment(lib, "shlwapi.lib")8 I) {; b# y' ]8 J5 {1 M1 r4 V3 d' _
' B- q) U6 q/ e& m7 C) C" Z4 K3 v9 D
// device information set(我把它译为设备信息集)
7 T& z1 R3 Z% W; V& f2 SHDEVINFO hDevInfo = NULL;
5 P, S; K- S8 J2 |: b4 V% h9 ]; m, Y. x! B' w) `" R
// 出错信息, O3 a, j0 l. t4 ^# B: o9 B+ f
void FormatMSG(DWORD dwError, LPTSTR * lpszMsg)
1 \+ ?5 B- E+ {7 l: t3 N8 L{ / e, Q( h  b& j6 Z+ M: q7 z) }
   BOOL bOk = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM , j# f; N8 s, E& q% |
       | FORMAT_MESSAGE_ALLOCATE_BUFFER,* H% T6 m' Q7 t
       NULL,
3 k  E4 ~% F% z1 W- f6 D1 G        dwError,
  R4 ^- ]6 C  w) F% c        MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED),
" ~2 C. [( U2 v! q# T& `3 L. u) H        (LPTSTR)lpszMsg,; H2 c$ v8 `/ |3 B
       0,/ w1 }3 @: x1 @, x3 G# M
       NULL);2 ~) s  P, }1 v5 P9 k! H

9 k, T9 }; m- K; Z, @- Sif (!bOk)7 Z5 K. l6 v2 T
{" _" i0 W( R- N% }# J, u
    HMODULE hDll = LoadLibraryEx(_T("netmsg.dll"),
) m: s7 j- F; Z8 r9 ?                                  NULL,
. e0 A/ a; l2 p5 ?; y                                  DONT_RESOLVE_DLL_REFERENCES);2 |# q3 t, _$ ~# ?4 X+ z; _! E
  if (NULL != hDll)
+ E, u3 q# T9 C. y, Y6 @0 N1 O2 a  c/ N- [  {
# }- ~$ d; N" l  o: I) B6 U& y   FormatMessage(FORMAT_MESSAGE_FROM_HMODULE |  
) z' s6 Y0 F$ T" l4 o" Z9 m6 G                 FORMAT_MESSAGE_FROM_SYSTEM,7 _4 P( Z* T$ B; s8 j( D
                hDll,) D5 `7 G2 e8 s; T1 ?! n
                dwError,
- ^8 M& v1 ]8 c- l  c        MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED),$ T; K! Q/ A& P1 f6 ~+ c  x: a
                (LPTSTR)lpszMsg,
8 k& N! g# {0 h% v2 n2 a+ y' d! |                 0,  {2 \  s. O+ E$ |  t
                NULL);
, t) v4 m  A; ?      FreeLibrary(hDll);$ s; }0 ?; @9 |$ V, [  t
  }
) {! Y% |: D  E) ]+ i. f! j6 d}
! J$ N  C! _; \9 w}8 X! Q$ i9 k$ S- @$ @$ ?1 S8 q( V

+ h% B9 D, d( ^BOOL ChangeStatus(DWORD NewStatus, 1 P4 E+ w/ m9 ]! \5 [5 o* z
                 DWORD SelectedItem,   0 B9 }' j* C' a9 P) J3 l
                 HDEVINFO  hDevInfo)
8 Z* U' S; @  F4 {, f& P, X{( K7 v6 T, ], p4 Q. v
LPTSTR lpszMsg = NULL;$ g  X) U! U' y
HCURSOR hCursor = NULL;6 @- U  J- U8 U
try( J; I" d" i! l/ I
{; b1 {, X( R  i/ P4 ?1 ?
  SP_PROPCHANGE_PARAMS PropChangeParams =
: m6 h4 V7 Q! l) Z                     {sizeof(SP_CLASSINSTALL_HEADER)};( Y' A  J3 a  U5 {) |1 \/ B
  SP_DEVINFO_DATA DeviceInfoData = {sizeof(SP_DEVINFO_DATA)};    4 W; Z0 G7 Y. u

; p  o1 |5 x' B& `- ]9 I  hCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));9 @* O1 s2 K! ^) Q3 y! ?& R( Q

6 o' S+ Y+ R7 g4 D" I! E, `  // Get a handle to the Selected Item.# R( G4 B9 v8 c( I+ D
  if (!SetupDiEnumDeviceInfo(hDevInfo, SelectedItem, &DeviceInfoData))& g  I& X1 l7 I, n0 w
  {* a+ F* V( {6 P; K) i: J, w
      FormatMSG(GetLastError(), &lpszMsg);
: j! W" _4 a7 `- z& l       throw lpszMsg;* {% g$ M% G/ U
  }
' V7 i1 n+ ?5 H+ [9 [$ `! J/ V
% J' g! ?& P+ E  // Set the PropChangeParams structure.2 l& g( F, B' E7 `
  PropChangeParams.ClassInstallHeader.InstallFunction =   - r7 S5 K9 o( M4 ~( w' T  y
                                    DIF_PROPERTYCHANGE;
8 ?  b0 U3 {6 G% n/ N  PropChangeParams.Scope = DICS_FLAG_GLOBAL;6 r7 c! m0 K( f" b
  PropChangeParams.StateChange = NewStatus;5 e1 w4 a* N6 u, z6 g

6 J6 t3 u; P1 m6 t% K0 ~  if (!SetupDiSetClassInstallParams(hDevInfo,4 V9 y/ P5 c* F- D
           &DeviceInfoData,
: f& a* S! h5 ]  H: E) R7 r) ?            (SP_CLASSINSTALL_HEADER *)&ropChangeParams,; j* ^4 B  o  S% @% L
           sizeof(PropChangeParams)))
7 [% |, H; X- w5 Z3 `: M  {# p, Q( S2 S; W
  FormatMSG(GetLastError(), &lpszMsg);
3 u* }$ n; [! X5 C% J. r   throw lpszMsg;
* j* N6 V1 T- z  }
% y7 c! k3 T9 X; V  p4 S* t7 b! n( H6 V# [5 g
  // Call the ClassInstaller and perform the change.
! w1 R7 Q5 b( G: q. I' {" r; `0 j  if (!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE,
8 v; k: a/ z% Q7 j% d            hDevInfo,
# n' r4 k# S# p9 j9 |            &DeviceInfoData))
2 ~1 D/ d% m* a' ]5 ]" _  {* N2 N: Z$ k3 a) o, Y
  FormatMSG(GetLastError(), &lpszMsg);. G* q' q; q8 @+ L/ H
  throw lpszMsg;. i% m% Q$ ~  `1 [
  }. A* ?0 X. n. [; }5 t7 o$ u

& V* j& ?3 D' u; r  SetCursor(hCursor);  
1 d# D% Y( ?) S) ?  return TRUE;
, S+ w; H/ H9 o3 X' W# h' Q/ k* G9 f" b}
; g  }, W% v  p2 i6 G7 [catch (TCHAR * pszError)
) [3 T) F1 O/ i{& t: R9 t4 P$ N
  SetCursor(hCursor);
9 U% {, g8 n& x5 o  ::MessageBox(NULL,# Z( J+ r. u4 ~: f' e+ `4 h
              pszError," w) M7 ]. |; T$ i* d# g. b# f3 F! D
              _T("提示"),
2 c* H/ n' S! U9 ^2 D2 s               MB_OK);
- l( D: Q) w) m% t0 y( {. t9 p  if (NULL != lpszMsg)2 p! d  D( R) B! {( ~
  {
/ n- A" m- l! P4 V7 F) `       LocalFree((HLOCAL)lpszMsg);" ]8 t4 y1 n. Y1 ^) u+ V0 z
  }
" N/ w: W' w3 Z. c% |* w      return FALSE;
& _( ?( H; l/ L0 x& j}     1 L1 ]9 ]1 t& u6 w- N
}. J3 R$ d' O3 Q8 j
; D0 u1 ]. l5 V& T3 l- Y2 ?0 x
// 这些设备的启用和禁用主要有此函数实现
% Q7 V* u! @% D// 参数说明,nStatus 可取3个值,-1 :啥也不做
1 p/ j* T+ Z# s' z) v% `// 0 禁用设备,1启用设备。# F) }+ ?0 D: `! w% y
// nIndex用于控制是对光驱,软驱还是对USB启用或禁用
! ?5 u% u/ S" G; ]0 q3 x// 也是可取3个值,0 代表软驱,1 代表光驱# q6 G; v1 [) v1 V1 ^
// 2 代表USB- G! c& e7 |" [
// 譬如要对光驱实现禁用,可以这样调用此函数
. S/ j& M% p8 R" k3 s// ControlDisk(0, 1);
9 K- D& N5 c% C: c7 B9 Y; KBOOL ControlDisk(int nStatus, int nIndex)
: M, ^1 A: c# O{: P$ ]( t, F7 T% t) E8 @1 z: W6 s
if (-1 == nStatus)
; T5 ~  v, _0 x; L) ~! C& M{
3 i' J6 H$ N* _- R0 z* P  return FALSE;
2 R% C, s4 n# L) x) `}
% S8 z, B' d. A: z; ~
; @; L9 |- }, N3 T5 i( z3 w; m1 |LPTSTR lpszMsg = NULL;) ]! T: ~7 a- _- h- X% Q/ _
try
0 ~/ M6 j% P2 g7 ^{7 {. J7 R' j* y
  TCHAR * GUIDString = NULL;; Y* k+ G! y2 u6 x8 O
  GUID guid;) C- o; }# `, G/ N
  ZeroMemory(&guid, sizeof(GUID));5 o/ o/ {4 f9 h6 w
  switch(nIndex)
3 J# W* V: y4 |7 ~( E' I) b  {3 R: w$ a% k( ?3 }3 ~
  case 0:    // 0 代表软驱
' @. ]0 x! a" I4 e/ ^  q& E   GUIDString = _T("4D36E980-E325-11CE-BFC1-08002BE10318");
2 d7 ~+ h9 l0 |5 W6 E/ l   UuidFromString((unsigned char *)GUIDString, &guid);
- S5 J6 g; j8 v. p" w   break;
  n" Z0 a+ k  @6 v, S  case 1:    // 1 代表光驱 & k3 ^9 S5 O& p5 \
  GUIDString = _T("4D36E965-E325-11CE-BFC1-08002BE10318");) z3 e2 A2 Z2 c" w* s; v/ h' v
  UuidFromString((unsigned char *)GUIDString, &guid);: {  O4 O, g3 t$ w2 m6 ?
  break;; I/ v9 y% o2 i; |$ b, [8 V
  case 2:    // 2 代表USB/ T, [9 Z4 p( @
  GUIDString = _T("36FC9E60-C465-11CF-8056-444553540000");
! L* u$ j8 N+ n   UuidFromString((unsigned char *)GUIDString, &guid);
1 p5 o/ j  P1 ]   break;1 t9 e& V+ F8 l! {# K$ x
  }
- u) ~, N1 b4 d8 r6 _, V
2 T5 M# z0 K7 u. }" [  hDevInfo = SetupDiGetClassDevs(&guid,: s# d/ s" l: [, U3 d+ W
           NULL,
! w+ Z+ ?5 l, E8 I2 B' B            NULL,
/ Y  X6 g$ e2 |/ a) `5 k% z# w            DIGCF_PRESENT);
9 ]' J: E& ]# g  if (INVALID_HANDLE_VALUE == hDevInfo)
$ ~4 ~! K) c1 k8 f! v: f1 u  {
! ~3 T/ U4 q6 l' P   FormatMSG(GetLastError(), &lpszMsg);  K6 B: P+ ?, }, i* Y0 A
  throw lpszMsg;
& x& l, f6 C: c  }& p0 B% `* ^' k% J" ]" w) E, w
0 w6 ^8 _2 ~; M
  DWORD i;
) ~6 y# {: }; e  w. L( o0 w  SP_DEVINFO_DATA DeviceInfoData;2 j5 o7 ?; g# Y
  ZeroMemory(&DeviceInfoData, sizeof(SP_DEVINFO_DATA));
4 @' z: z  `% Z8 b  C( I- J  s  DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
  s. U- _: m) a+ f$ `- W; z& |
1 E& d  D8 L) g7 T/ ^  for (i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData); ++i)
7 b5 i8 p7 ~2 S) p$ A/ Z: }  {
2 L3 T  A' U0 g& E   if (1 == nStatus)
. r/ w5 O, p) B9 y* ~' i7 [   {
; A* y6 ^/ i- o0 R# r& p% i8 o: U    StateChange(DICS_ENABLE, i, hDevInfo);) Q( k# o1 K( I$ C9 H: ~; r6 p" n
  }
  e, H: Q/ w5 l" j/ t- L8 J   else if (0 == nStatus)
% H* ^, L3 l: A- x   {
7 ^2 z! v3 }+ b% B- E1 N- E( t; g    StateChange(DICS_DISABLE, i, hDevInfo);
8 d4 e; z8 \% b* ~   }  
" a& F. L$ k# X  }
  G2 w. O# L/ U2 Y8 [) M  w" Q5 w- k
  // 释放 device information set
/ N8 J8 T- c, u) s. b# T/ c% X  return SetupDiDestroyDeviceInfoList(hDevInfo);) ^! P4 Y, _: _
}. q* g# ~$ ^+ u- z! E# b
catch (TCHAR * pszError)5 o; J. h+ c: F1 U
{0 Z$ U' z  o, s# N
  ::MessageBox(NULL,
; j+ o, f; P/ I1 v/ t& P5 E            pszError,# F- F: W$ s) A+ a# ~! Q9 a
          _T("提示"),
$ |, t, m' w7 v8 z9 g" t  k      MB_OK);
# g; B8 K% l- v- Q  if (NULL != lpszMsg)" L2 y& V6 R! v7 c0 Y  a& o  x- u* E
  {
: C+ M% m' E' A5 L0 H0 a   LocalFree((HLOCAL)lpszMsg);
0 P0 I: o1 ^; T% R  } # D8 e- I6 ]0 T- J/ T; r
  return FALSE;
8 r; l4 k7 q; q; i/ ^) Q}
) ?% \2 _$ p" T' u: Yreturn FALSE;
  O6 r9 U0 y( l}& c: Q0 O/ `: ^* h9 P0 h" _

" V4 Q( g' m# |. V    经测试这样对光驱,软驱和USB实现禁用没有问题,但是当禁用过之后如果要对USB实现启用必须两次调用ControlDisk(1, 2);这个函数才可,其余的两个启用没什么问题。还有要说的就是我不是用的枚举所有的设备,然后再过滤(网上的那个禁用网卡的就是这种方法)。3 D. k  M7 ~# w
   据我观察,在注册表的此项下下:
3 `" ?; \  K$ k    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\
' N3 D% j1 d  _& \/ C3 V    有很多GUID,每个GUID代表一个设备,譬如这个是USB的
$ i9 x& E7 Z3 T- ?) E8 G% h    {36FC9E60-C465-11CF-8056-444553540000}; \/ |( w0 }. W6 N( P1 @
   这个是CDROM的
! A  X1 J1 X# w2 I0 l- D& a: U    {4D36E965-E325-11CE-BFC1-08002BE10318}等等了。
. Y# Y( }4 p- v这些值你即使把它改为别的GUID,我使用原来的GUID仍然可以实现我的功能。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-10-1 22:01 , Processed in 0.018324 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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