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

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

[复制链接]
发表于 2005-3-16 11:27:43 | 显示全部楼层 |阅读模式
  (dlutyuanhongl发表于2005-3-15 23:14:04), K. Q6 n$ Z! E' n( {
8 W8 y$ }, ~' N! X* Z) ]
这几天,由于工作的实际需要,需要对光驱,软驱,USB的启用和禁用实现控制。参考大家提供的对网卡禁用的代码,实现了光驱,软驱,USB的启用和禁用。主要实现代码如下:
0 o7 H6 b8 H; x8 u3 K4 I- V% P$ ^// 必要的头文件和要链接的LIB文件
$ ^' Z6 |; z  z#include <setupapi.h>
/ p$ r7 F* R4 G& I6 F% n' d' V+ P#include <shlwapi.h>
: @+ S& c  e) Z! a1 l#pragma comment(lib, "setupapi.lib")% y& g: x7 }* y% a4 d
#pragma comment(lib, "shlwapi.lib")3 M4 Z) x4 O! E0 }9 ]

& _, |/ B0 X; b: e; j2 I$ s// device information set(我把它译为设备信息集)! N. d$ d7 b. L! E( o
HDEVINFO hDevInfo = NULL;
$ T6 W, w+ H+ E3 G7 I+ y  b5 x0 P: j: }+ K: i0 o4 H: |3 [: D, f4 {
// 出错信息
, I! a3 A2 S9 r8 kvoid FormatMSG(DWORD dwError, LPTSTR * lpszMsg): l# x( u: `9 ^! L# v$ f
{ 5 {+ j; ^7 |$ X* j; |5 D/ K
   BOOL bOk = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM
, z! x# w! m$ ~! B+ L( q4 C8 Y        | FORMAT_MESSAGE_ALLOCATE_BUFFER,& y. j& {# u* A) z
       NULL,3 S/ q# n% l: \
       dwError,/ |) {7 H5 G; \
       MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED),1 Z8 P! D/ A. ^1 `
       (LPTSTR)lpszMsg,1 F! `& ]2 @8 x0 ]; C
       0,
+ g. h  \# A1 [# l  P        NULL);
& v! P. j% J0 f' u7 @6 ~0 Z2 o6 @6 n) w0 g' J
9 \+ w7 K8 _  k2 {% Y  \if (!bOk)( A; A" m) K# ^7 [  @: d
{3 n: {' @/ Y6 K$ ^( R% r; k
    HMODULE hDll = LoadLibraryEx(_T("netmsg.dll"),
3 ^) w+ G+ T! ]% p/ C                                  NULL,  T% e+ E- S2 A4 X/ g
                                 DONT_RESOLVE_DLL_REFERENCES);! ]2 n! [3 {2 _
  if (NULL != hDll)! j$ A! n* u7 B8 Z- m+ b
  {
3 ~8 |2 f6 l" q9 C# ~8 w   FormatMessage(FORMAT_MESSAGE_FROM_HMODULE |  
9 ]' i. ]$ m; L                 FORMAT_MESSAGE_FROM_SYSTEM,) o" [3 V  i+ p/ e! y2 U+ B
                hDll,
' I  N( t- y3 m4 b0 j                 dwError,/ F$ t) e7 M: Z; G% j2 ]
       MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED),, G, y6 \9 }7 A  v% V
                (LPTSTR)lpszMsg,
2 _9 o& v) G2 N0 u) s- b                 0,- q& U& y1 U( z% y; W, r( v$ d: ~  u7 o
                NULL);8 N/ a6 ?, q# @% f: E
     FreeLibrary(hDll);; f$ C: Z2 {! ]: B# C) l
  }
5 f  g( P7 Y* ]8 l0 t7 C1 c- b: y8 ]}
0 l- }9 a8 `7 m" Z: v1 F- i! y}
8 L) E  Z5 U9 [# c/ e8 [
5 v: B1 V+ Q! `BOOL ChangeStatus(DWORD NewStatus, - k4 f% K" {- ?
                 DWORD SelectedItem,  
+ a* M. p/ W! x4 [% k                  HDEVINFO  hDevInfo)
7 ?/ h0 b8 i9 E{
* S* f5 S$ T  n  T  p" x* kLPTSTR lpszMsg = NULL;
7 Z+ J6 k4 a$ V% lHCURSOR hCursor = NULL;
% l8 Q0 y8 j9 e6 @  r! atry
4 P4 R0 m5 c& y# n{$ y. u0 w, d6 j
  SP_PROPCHANGE_PARAMS PropChangeParams =
: I1 e2 f/ K" l7 y                     {sizeof(SP_CLASSINSTALL_HEADER)};" P$ _0 S* N/ a4 }8 I- C# T9 {
  SP_DEVINFO_DATA DeviceInfoData = {sizeof(SP_DEVINFO_DATA)};    ) y3 m- `# f! P5 z6 \' L  t
4 O8 U; @/ U& d
  hCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));
: W* [1 w! u  q% J; }+ B
* n  R" z7 ]' r$ Y3 j. A  // Get a handle to the Selected Item.3 |( A5 u: |/ k4 ?8 g/ ]
  if (!SetupDiEnumDeviceInfo(hDevInfo, SelectedItem, &DeviceInfoData))
- i" N' U+ l+ y! b  {0 Y. M6 F/ N4 a  v
      FormatMSG(GetLastError(), &lpszMsg);
2 B8 [# Y7 g" L; Z7 S       throw lpszMsg;; C* r0 s8 u. n, |4 b" Y
  }
- r- D+ m/ ?7 g" m, z/ [% M( f; P1 B
  // Set the PropChangeParams structure.
4 [6 q' C7 Q& G  PropChangeParams.ClassInstallHeader.InstallFunction =   / X1 s$ I4 o' S& R- `) b
                                    DIF_PROPERTYCHANGE;
5 \2 v- f8 s2 T% [  PropChangeParams.Scope = DICS_FLAG_GLOBAL;
0 B5 j- B3 N- o4 I. w6 n  PropChangeParams.StateChange = NewStatus;
4 g" T/ ]# E  @! D, }/ v% P  u
2 O+ T& z& g7 y' [- d( E  if (!SetupDiSetClassInstallParams(hDevInfo,
- H5 Y$ e  ?$ i            &DeviceInfoData,
; q5 l. x$ ^# z0 M- g/ `9 s( P+ E& c% w0 w            (SP_CLASSINSTALL_HEADER *)&ropChangeParams,
) P; A, d- R$ J+ {# G. j5 [            sizeof(PropChangeParams)))
4 _  M, O9 @9 Z# J: B! m# i6 V  {1 ]" d# n3 o5 _8 a+ w; P% s& [3 \
  FormatMSG(GetLastError(), &lpszMsg);% Y! S$ ^! T1 O6 v' a
  throw lpszMsg;
. Z/ E3 H$ b" N- E- ]; a+ r  }% P) K* d1 O0 t8 e# V
3 t5 q, }+ ~7 |" X( S( ?$ ?
  // Call the ClassInstaller and perform the change.9 V% i  Z- K# y
  if (!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE,
; _: Q/ ?- E$ Z8 _8 U/ d            hDevInfo,
, s% a3 b% H- J            &DeviceInfoData))
( L- \/ c5 m* ]3 s  {
$ l! s- ]' O8 n# ]9 c1 }. q5 a+ q   FormatMSG(GetLastError(), &lpszMsg);5 v3 Z: U2 e2 N2 L
  throw lpszMsg;7 T* a$ U% U$ a- S+ v
  }+ T8 I3 y, O8 X5 J, Y" i, F
- [2 q& a/ k$ H: j
  SetCursor(hCursor);  6 d' Z3 v/ s! a( c, T, B
  return TRUE;
$ r% G' r: o7 s5 ]( {+ \, w}
& e. G2 S: _) G& A0 S8 V: Dcatch (TCHAR * pszError)
! I4 L# B& i! _( d0 b7 h& x  K8 E4 h{+ H, Y! ~3 K  _, [+ r4 a
  SetCursor(hCursor);9 t$ @$ N8 a; v4 _9 l
  ::MessageBox(NULL,
& ^0 F- a# L2 g, N7 z               pszError,9 \: N# p8 a5 d* G2 _6 h+ f" _
              _T("提示"),& F- k3 k. H5 A0 y3 ?1 R; |+ `
              MB_OK);
( @+ ^1 s( S( Y  P. h9 }5 i1 l2 Y  if (NULL != lpszMsg)
% c2 a: _! |5 R( }, g  {
; B' c  `+ W% H! D4 \8 E( ~, g       LocalFree((HLOCAL)lpszMsg);- D/ p( A  N2 ?  ~# Y0 g, m! L
  } 4 l# `% D( j) _# g6 D8 ~
     return FALSE;. V' [9 r) D& v/ @0 J' M8 A
}     # x: X" r' o  ?
}  Q) k: i- Q9 M
  `- r- v7 T9 u3 P8 D
// 这些设备的启用和禁用主要有此函数实现
* _- {2 T) U. F! T8 V6 t' N// 参数说明,nStatus 可取3个值,-1 :啥也不做0 y% h1 s9 U. q: o  V  r+ T0 ?
// 0 禁用设备,1启用设备。7 H. X, t: m# n) z. ]$ k
// nIndex用于控制是对光驱,软驱还是对USB启用或禁用0 e. B9 u- ~4 F" V
// 也是可取3个值,0 代表软驱,1 代表光驱
3 f% Y( L" [# L6 d" s4 ]// 2 代表USB6 \8 ?- H' _% [
// 譬如要对光驱实现禁用,可以这样调用此函数5 ]* k" X0 Y  h7 w. M
// ControlDisk(0, 1);
  m) D2 \  q( N' `5 p: ?* L* yBOOL ControlDisk(int nStatus, int nIndex)
2 @% d; c* `8 ^. b{
7 q# V" _5 r; @6 l4 y: v) f9 Jif (-1 == nStatus)$ N* Z" j9 M3 ^& ]5 ^% w+ C  }0 P
{, h) z" B& _  E0 ^+ H
  return FALSE;( d. H4 @1 y/ z& u8 s
} $ k( ~* i( z7 Y7 E9 G8 M6 I

9 U0 |. v' d$ ILPTSTR lpszMsg = NULL;+ p4 c$ B$ l% l3 t! i4 v3 H
try  H) U# R! S/ i9 ?
{
' C& s. b. M+ ]1 A( U  TCHAR * GUIDString = NULL;
# f+ u( d% A0 [& A8 R  GUID guid;! C& e: `  w, Z) z/ r) I1 l' S9 L8 r, o
  ZeroMemory(&guid, sizeof(GUID));
+ d* t0 b9 t1 O% W  N+ u  switch(nIndex)
: `# x5 ^" K1 `7 X1 {: e! m  {1 U9 C& H! G3 ]1 h8 A
  case 0:    // 0 代表软驱3 _$ L, c) _( G/ s2 z
  GUIDString = _T("4D36E980-E325-11CE-BFC1-08002BE10318");
5 i/ X& _, g# F  K   UuidFromString((unsigned char *)GUIDString, &guid);- M& i) O- m7 M$ S5 Y
  break;
* x3 k  u9 B, O% T# H  case 1:    // 1 代表光驱 2 Z* G! ~* z* @
  GUIDString = _T("4D36E965-E325-11CE-BFC1-08002BE10318");
5 s- v! r  O. W2 Q" N# [1 }   UuidFromString((unsigned char *)GUIDString, &guid);
$ e( P# a7 N) u% @8 Q% A6 ^5 B3 k   break;3 z) D5 r& O) ~7 `8 G2 d( R6 i6 z
  case 2:    // 2 代表USB
6 M! k7 Z: ?. R% u, y) ]8 R   GUIDString = _T("36FC9E60-C465-11CF-8056-444553540000");
# r* q7 }8 ^# X# k; h4 H   UuidFromString((unsigned char *)GUIDString, &guid);
/ p9 e4 k# V: c+ d! k- |! P1 k   break;2 q* {" m: a6 @4 K. i2 d; `
  }
2 F# K% y  j6 v3 g5 u' h/ M0 J! j2 k/ m4 _! e5 i9 w, }' X* r: h
  hDevInfo = SetupDiGetClassDevs(&guid,
% I$ f" M# e' n0 U, G            NULL,
8 P3 H1 y( Z4 S; c2 c            NULL,
2 k; O5 W0 L) M            DIGCF_PRESENT);, v) T. Z# S" P$ V+ \3 R: A5 W5 k
  if (INVALID_HANDLE_VALUE == hDevInfo), C9 u" @/ G' g, o2 u9 _( z9 L% }  F
  {: `( U3 U8 Y' M4 v) Y
  FormatMSG(GetLastError(), &lpszMsg);$ N; L) Y2 Q8 B& [5 F
  throw lpszMsg;
$ i! T9 z: T  j. R: I  }7 Z' r$ U' _: e

  J& L3 E* t, `: U4 _9 O  DWORD i;5 z6 }* Y. o+ e# w7 Q  {+ r' C
  SP_DEVINFO_DATA DeviceInfoData;
' ~5 l% Z8 g# L$ X) d+ s" l. Y  ZeroMemory(&DeviceInfoData, sizeof(SP_DEVINFO_DATA));
6 f( M8 U" ~, Z  DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
/ Q* |4 s: `; C! b+ d
3 I1 }) v3 N+ J- p+ o6 P: \  for (i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData); ++i)) ^- Q' m# V0 c. F4 C6 P
  {
) K/ e- r- e! f   if (1 == nStatus)
+ Q8 i6 f/ r, \0 j( p   {4 x' z3 r5 b& x  s" q
   StateChange(DICS_ENABLE, i, hDevInfo);: o8 o) A2 H& i2 S1 d$ g& I
  }
* U# X6 E6 w% T2 e* D" e5 J3 e. ~! o   else if (0 == nStatus)8 e& q, X! p* G9 ?
  {2 d: J9 [1 V' A9 y
   StateChange(DICS_DISABLE, i, hDevInfo);
7 F0 V: t/ M. P/ ^; ^   }  
+ m( J: s2 `) y3 C$ `; U2 k. q  }1 E) O2 u3 S' p, e
$ f& I% L5 k4 W# S
  // 释放 device information set
7 J' a3 A/ Q! K  return SetupDiDestroyDeviceInfoList(hDevInfo);" _' d. v( s: z& R) ~. K' Q! h
}3 w7 Z- Q( f* ~3 W5 S% |, c
catch (TCHAR * pszError)8 ~* }, i- k$ i9 I
{
& r9 |8 C$ Y. [  ::MessageBox(NULL,
) c- p) ]4 Y* n( R8 K            pszError,8 _9 ~8 A% r" k! b  U3 y0 }
          _T("提示"),7 I1 Z- A( c: ~" ]4 k
     MB_OK);# B: \- ]  E# N/ O( |1 I+ h9 S
  if (NULL != lpszMsg)
' p$ y9 S! m! h$ w+ P# s  m  {
, s2 S$ a/ e1 Y0 l- b+ }3 q4 _   LocalFree((HLOCAL)lpszMsg);8 \/ z" t7 e8 u: V; n  D
  } - J* Y" G( y) }3 S
  return FALSE;. l) ^! o( P( U8 i2 M: `8 f
}
1 X1 d5 Q& X' {, \return FALSE;
8 s% W' M4 N; G* A0 i}5 b0 @# q6 V8 m/ g. |/ h
; `3 G. V& @& w( j) V6 y! d0 h
   经测试这样对光驱,软驱和USB实现禁用没有问题,但是当禁用过之后如果要对USB实现启用必须两次调用ControlDisk(1, 2);这个函数才可,其余的两个启用没什么问题。还有要说的就是我不是用的枚举所有的设备,然后再过滤(网上的那个禁用网卡的就是这种方法)。
/ A9 ?* L' U9 Y, N0 s6 @& f    据我观察,在注册表的此项下下:, |5 n# a) j( ^/ X5 S' D, v
   HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\  d- R3 d. U( j, H: _: j& B
   有很多GUID,每个GUID代表一个设备,譬如这个是USB的  B  d1 Y; R& E$ R8 b
   {36FC9E60-C465-11CF-8056-444553540000}
9 `* R5 ^" j. ^. k' C; A4 ]) v' \4 Z    这个是CDROM的
# z8 j1 b) O& Q' G' b/ O$ v% J0 ~    {4D36E965-E325-11CE-BFC1-08002BE10318}等等了。& n* X0 s6 }3 f5 O* g
这些值你即使把它改为别的GUID,我使用原来的GUID仍然可以实现我的功能。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-18 06:50 , Processed in 0.019568 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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