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

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

[复制链接]
发表于 2005-3-16 11:27:43 | 显示全部楼层 |阅读模式
  (dlutyuanhongl发表于2005-3-15 23:14:04)
; P$ ], k* j. w/ l# _( t2 O4 X0 L
; N8 Y! s$ o" j* `7 ?4 P9 I: Q这几天,由于工作的实际需要,需要对光驱,软驱,USB的启用和禁用实现控制。参考大家提供的对网卡禁用的代码,实现了光驱,软驱,USB的启用和禁用。主要实现代码如下:
  P6 e! I- l: t& w// 必要的头文件和要链接的LIB文件
( O0 z# _5 y2 i+ b#include <setupapi.h>
% Y5 A: I2 h" i1 {* l: H. o#include <shlwapi.h>
7 T" Y. L1 V% ?! W$ ~#pragma comment(lib, "setupapi.lib"): Q6 z2 u' m: B
#pragma comment(lib, "shlwapi.lib")
1 w9 b- {" w: \
5 J( O" ]- A  U9 C" \' _// device information set(我把它译为设备信息集)1 R" [! Q; R# n) b3 H- M# g7 Y+ W3 r
HDEVINFO hDevInfo = NULL;4 `! \( X/ [: k! e. ^7 M
( m. ?9 c3 m3 W. x
// 出错信息
) R6 I, f- ~3 Zvoid FormatMSG(DWORD dwError, LPTSTR * lpszMsg)" u; v; A7 S8 x3 b8 I8 }6 h
{ ) B0 E+ g0 M  {4 S
   BOOL bOk = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM 1 [- S8 W6 m6 h5 X
       | FORMAT_MESSAGE_ALLOCATE_BUFFER,& h5 ?0 J: B8 v
       NULL,5 b" U  C! f3 f( |$ ]
       dwError,
. u: \4 K. p: k. ~: H( h        MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED),  @1 L5 {+ h( K  J
       (LPTSTR)lpszMsg,
3 W5 M. h) a& B0 I        0,- E3 T2 l  y, b: b
       NULL);
0 r% K( n( g: b+ l
2 k' L% Z8 m, \' [6 `if (!bOk)9 c! M6 Y) b3 u' w9 B
{
9 M! ~! T# I3 E! p1 x: Z; i2 m( \; _9 ?     HMODULE hDll = LoadLibraryEx(_T("netmsg.dll"),9 G" K9 U5 H5 P
                                 NULL,( v! y" d+ T" u0 H: E/ j& T
                                 DONT_RESOLVE_DLL_REFERENCES);
+ \7 t9 l8 J) f9 @% A7 P  if (NULL != hDll)
3 O- T" \4 d/ U9 y2 n2 `1 N4 x1 x  {# I+ [+ C. q5 E  F
  FormatMessage(FORMAT_MESSAGE_FROM_HMODULE |     X( h/ {8 _; z$ q
                FORMAT_MESSAGE_FROM_SYSTEM,
$ K8 d  h) ]' F4 f                 hDll,) n( T  n! f3 H6 n8 r5 D
                dwError," Q, h( G# ~1 Y( p4 u& G$ U
       MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED),
( t3 o6 m5 m# V* m& R7 l                 (LPTSTR)lpszMsg,
0 Z6 j  _# i5 o" M/ _                 0,( Z- J8 L( L: T& {" I9 o6 d, r
                NULL);
+ O8 u( A( {$ I# j7 Y. x! i      FreeLibrary(hDll);2 C9 R% M' C. p8 x* L
  }
% R+ `7 v6 i/ ]8 V2 d& K0 j- j}) b+ E' t2 b+ f" z
}
, w# n9 f! M" A/ d/ z! q
, Z8 m) w) ~* R0 o& YBOOL ChangeStatus(DWORD NewStatus,
; y! U: e8 [7 {: C3 y$ n+ W' L                  DWORD SelectedItem,  
. m& l/ L) Q2 `4 f6 _; T# i- |                  HDEVINFO  hDevInfo)5 o' L- n( s5 q- S" ]" \" y
{  C3 a3 J, r5 q# V; T7 K
LPTSTR lpszMsg = NULL;; @9 y- G  F* ?
HCURSOR hCursor = NULL;
5 r3 x' K) u/ U* X( qtry) D4 |6 z5 k0 ^7 Z' |( R/ l' j
{( E' p; o8 \, w( v& ~' X
  SP_PROPCHANGE_PARAMS PropChangeParams =
/ o1 N% X6 n& V, H# A% ^7 W, G' P                     {sizeof(SP_CLASSINSTALL_HEADER)};
4 G8 F& _% _1 c8 n% M  SP_DEVINFO_DATA DeviceInfoData = {sizeof(SP_DEVINFO_DATA)};    
* f9 |! R: `# `0 C( k) R8 ]) |0 d* l5 X( f6 |$ B
  hCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));9 r7 l/ @/ X7 o+ l  {9 _0 y6 b

* G1 B' P" G: I* _  // Get a handle to the Selected Item.; X3 c3 F( I) y* S
  if (!SetupDiEnumDeviceInfo(hDevInfo, SelectedItem, &DeviceInfoData))
& G& j+ D; B( }. W/ d  {7 ^# O; q* A/ ^% L3 ?/ r) O% Q
      FormatMSG(GetLastError(), &lpszMsg);
/ J- P2 d) L1 e! E2 m1 v1 p2 Y; q       throw lpszMsg;
" [# M: J0 B6 Q% H( g- x3 G% l( a  }& K! k) o6 A$ e; q  ?' [& L5 j

) [7 n8 G: z$ @0 T6 {$ ^$ E$ g  // Set the PropChangeParams structure.$ w* ^5 W4 P, }
  PropChangeParams.ClassInstallHeader.InstallFunction =   9 C( L3 A" p+ o! u: x/ t- S, K, `
                                    DIF_PROPERTYCHANGE;
/ `1 h3 l4 {# v0 Y  PropChangeParams.Scope = DICS_FLAG_GLOBAL;
$ g; A% ]! P* ~; J2 q1 e3 ~  PropChangeParams.StateChange = NewStatus;; D% N9 }+ f1 F, ^1 v
8 R% B) ]+ \( M
  if (!SetupDiSetClassInstallParams(hDevInfo,1 @* x8 d: u8 ~6 y  y4 p4 ]3 t  X7 {
           &DeviceInfoData,9 _" i& I4 v% a% U$ T
           (SP_CLASSINSTALL_HEADER *)&ropChangeParams,
; j4 Q0 o  O& n: M/ g; N$ `, ?            sizeof(PropChangeParams)))
0 P4 i% e) J* [+ u( {6 S  {) J( s% `: v) p" m7 V
  FormatMSG(GetLastError(), &lpszMsg);
0 G$ E9 [: p$ v% V* N& n   throw lpszMsg;9 _- F, w, N. L5 x) I( h# I
  }  {7 b! z7 J" r2 h1 ?
- K+ f. e$ e5 G! I# _7 ]
  // Call the ClassInstaller and perform the change.7 w0 F* h1 s+ I2 k
  if (!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE,1 E  F7 o6 y, k; y) h4 v/ H$ I
           hDevInfo,
  y+ b3 x- _7 H/ b' H, w) c" k            &DeviceInfoData))
/ q# f; B+ q1 X9 R9 C0 O. i" d  {2 n2 s5 t0 s3 u- ]) ?* O; j
  FormatMSG(GetLastError(), &lpszMsg);2 _' _4 N7 q; A' b  o
  throw lpszMsg;" U! a5 F4 L( x4 O
  }" C' Y( I" [; S5 T4 v+ H2 ~
+ c' w5 W8 u- f
  SetCursor(hCursor);  5 I7 x7 T6 b* h8 s* G$ \
  return TRUE;
7 b5 a( D; S- f0 `$ O. q$ R}
+ M6 s' y0 M( O4 R& e/ Ucatch (TCHAR * pszError)
! x! M7 ]( ?; P( S1 i# }{6 c% }3 c" D5 b: m; a! D9 I, f
  SetCursor(hCursor);
1 ]0 \8 X( ~1 r% y% z" T9 @0 y  ::MessageBox(NULL,! b' o; U6 i! V, J  X  `
              pszError,
$ @2 Q" [& ]/ C% }               _T("提示"),4 O/ N4 l) n  Q
              MB_OK);
3 B! p5 ?$ C3 ~* B; M8 W% g' ^  if (NULL != lpszMsg)# U3 b/ B6 p5 f% p6 c
  {$ A8 t! N6 D: I* \& z5 T% N: {
      LocalFree((HLOCAL)lpszMsg);  c/ J  J# X+ L( ]5 e% F
  } ; V3 [5 y7 U( k  h' Q& P
     return FALSE;
1 Q  R  i# t  E( l. o}     
1 N. k# k: q1 D  e2 t}: U  {9 t3 Q. F/ t

# |2 S8 o7 N" Z0 J// 这些设备的启用和禁用主要有此函数实现5 X8 W# ^9 T$ j4 g
// 参数说明,nStatus 可取3个值,-1 :啥也不做* o; X9 L, f, r. ~
// 0 禁用设备,1启用设备。
) f! L: y3 M  g. h! z# I// nIndex用于控制是对光驱,软驱还是对USB启用或禁用$ [  r( e8 L5 p: n4 D$ b' l
// 也是可取3个值,0 代表软驱,1 代表光驱
. m9 E3 b: h4 X6 n% p% B" V// 2 代表USB- _2 F- w% V" Q
// 譬如要对光驱实现禁用,可以这样调用此函数" u  _& s' F. P4 R
// ControlDisk(0, 1);
& `( {! I3 r6 d! G. ]6 S9 sBOOL ControlDisk(int nStatus, int nIndex)
* f+ S% z! B2 F* j( [{$ p  F1 ^% n: B0 t/ M5 W5 i1 Z
if (-1 == nStatus)/ ^* a0 X( @% u  t- \% n
{
! B7 c; C3 v7 I" l! M! T  return FALSE;
6 P4 J( x+ \& Z1 u5 a}
7 B; M, ?- g1 ~" f
/ A5 _' m" `' m7 sLPTSTR lpszMsg = NULL;
1 a0 E2 w: _8 a0 i& Q* p- rtry& N+ h/ V/ Z) @' ~
{! E0 x/ I" D- O1 D: L/ l+ W& |
  TCHAR * GUIDString = NULL;
6 ^6 M: z+ I% ^* D  GUID guid;/ {, j% s& ]3 h. o3 |, y4 R
  ZeroMemory(&guid, sizeof(GUID));; ~0 H1 F' z5 I7 @$ O7 t5 S% c
  switch(nIndex)
1 v% ]$ s( J& |  q1 U5 ?9 S& o) X  {3 a1 _0 h$ F5 I8 W; v3 I, j
  case 0:    // 0 代表软驱  _- Q! {4 [5 h! D2 V+ Q) ^$ ?% x
  GUIDString = _T("4D36E980-E325-11CE-BFC1-08002BE10318");3 Z* \* l5 ]: ?+ M
  UuidFromString((unsigned char *)GUIDString, &guid);
3 s% V- T1 V+ G# i9 }   break; * Y% B& y+ t/ q3 T3 Z' o0 A
  case 1:    // 1 代表光驱 8 b2 a6 K8 `; v- w8 m0 y
  GUIDString = _T("4D36E965-E325-11CE-BFC1-08002BE10318");
( r0 F1 i# U$ z. v, f* t0 f) l4 l   UuidFromString((unsigned char *)GUIDString, &guid);
) S6 `0 C5 I& I, i$ q   break;
5 x+ l! Z$ l, b0 i1 ]$ u3 l  case 2:    // 2 代表USB+ S7 \0 R' d0 _$ |
  GUIDString = _T("36FC9E60-C465-11CF-8056-444553540000");
$ @. u' z9 V2 S" }* U   UuidFromString((unsigned char *)GUIDString, &guid);& Y9 B9 n" H1 `* |
  break;& P" J* ?8 m6 j& I5 a
  }3 }2 G" n0 Y2 [6 G, \

7 y! z# R# z5 d  hDevInfo = SetupDiGetClassDevs(&guid,+ d9 `# A7 w  }% s4 j$ }
           NULL,  S9 F* s+ d2 B  V- K# ?
           NULL,
& m1 V9 X0 A, ^5 k7 ]            DIGCF_PRESENT);
- j8 a: R  `8 z  if (INVALID_HANDLE_VALUE == hDevInfo): e' m# u  d" E, n
  {- F' N$ {3 {/ _/ Z8 i7 K0 y4 w
  FormatMSG(GetLastError(), &lpszMsg);+ U; Z* `- f0 W& R0 v* e2 \: w
  throw lpszMsg;7 d5 d" v0 J9 u/ p9 B2 \8 N
  }" ]! V, e( O9 s4 U( F

8 a, w0 p6 \. V$ K/ |7 y  DWORD i;
1 A4 }0 E3 y/ a$ ^  SP_DEVINFO_DATA DeviceInfoData;
. f5 m! T" m9 s1 {  e% H7 r- i0 }  ZeroMemory(&DeviceInfoData, sizeof(SP_DEVINFO_DATA));. D' S' @% b# Z0 ~9 R5 `$ t
  DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);& Z, I* q) a5 B" f. V, H  ], u
7 w+ ?& @( ?' z; W  r; x% c4 r
  for (i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData); ++i)
; T6 p( C: F( a% g) T% E& |4 C3 Q+ [2 S  {
/ ^3 R# b6 y6 x7 S   if (1 == nStatus)
. T& }) e% U2 R: }$ T7 c0 l   {
- y8 o, ?, m+ ~    StateChange(DICS_ENABLE, i, hDevInfo);
8 y' [/ p$ \1 f3 r  s   }3 h3 G* q* S+ K
  else if (0 == nStatus)
: A& [) E& o* [6 M3 a: z, h) J# u   {4 }' q5 C& H" P
   StateChange(DICS_DISABLE, i, hDevInfo);8 n' t1 z: J+ Q+ r) J; {
  }  
: D0 I1 e- w2 y0 B3 H  }
$ C( l$ W2 p9 y+ }: L/ Q* w: i( k0 X; R" E. }6 u, D) o' O
  // 释放 device information set9 S* P+ P+ ^3 q( w' {7 T* b4 N
  return SetupDiDestroyDeviceInfoList(hDevInfo);- u- P9 u4 @. a  g( z: G6 g
}7 r$ I* v1 w) F& o! e
catch (TCHAR * pszError)! b4 V; N7 K+ i$ m
{2 a8 E3 U/ o( J: V% ^
  ::MessageBox(NULL,/ n# R# y( q" k' F4 ?
           pszError,
0 F' J4 c" F, _$ g, w           _T("提示"),
0 k% ]3 m& M; X* E. j+ \/ L% M* z      MB_OK);7 J4 [  w! g7 r5 s3 [' [) C
  if (NULL != lpszMsg)
+ f6 e- Z/ m2 _3 N: s$ U/ z  {/ ~$ y5 z7 }- J0 s, Q3 Z0 B/ X
  LocalFree((HLOCAL)lpszMsg);9 q9 a! {6 z9 X- N( t- G6 b' g; `
  } : M  u% G; R* ?( A: ^5 u& H
  return FALSE;) b6 Z0 E6 I2 u9 P6 k9 `# u9 R$ t* Z& _
}
  R5 c1 E* i, R5 L# \0 O* Areturn FALSE;+ n# l: t+ E. C( g6 I! [
}
" B) R. Q. g% I, n% r) Y4 {0 _0 z4 j0 V5 i4 X
   经测试这样对光驱,软驱和USB实现禁用没有问题,但是当禁用过之后如果要对USB实现启用必须两次调用ControlDisk(1, 2);这个函数才可,其余的两个启用没什么问题。还有要说的就是我不是用的枚举所有的设备,然后再过滤(网上的那个禁用网卡的就是这种方法)。
' i; @9 c) J- X' s- W- E& {    据我观察,在注册表的此项下下:+ n  d/ F- `' b) e2 i
   HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\
6 {/ [+ X, ~! j1 s    有很多GUID,每个GUID代表一个设备,譬如这个是USB的
2 @+ T, H. q0 w/ g' m( v    {36FC9E60-C465-11CF-8056-444553540000}9 ^& f7 R' U$ M% r* ~% ?* Y, o
   这个是CDROM的% G' @* H2 X( a) J/ G' d/ f
   {4D36E965-E325-11CE-BFC1-08002BE10318}等等了。
9 E6 Y3 G7 {# c1 _1 a1 m这些值你即使把它改为别的GUID,我使用原来的GUID仍然可以实现我的功能。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-14 16:22 , Processed in 0.018474 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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