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

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

[复制链接]
发表于 2005-3-16 11:27:43 | 显示全部楼层 |阅读模式
  (dlutyuanhongl发表于2005-3-15 23:14:04)
4 C% e* m% d3 [3 ^, L% j0 v. x: v/ L4 I- `
这几天,由于工作的实际需要,需要对光驱,软驱,USB的启用和禁用实现控制。参考大家提供的对网卡禁用的代码,实现了光驱,软驱,USB的启用和禁用。主要实现代码如下:
8 w* g9 P0 U3 t+ f% x$ `// 必要的头文件和要链接的LIB文件$ P" P& Q; ?. e
#include <setupapi.h>
" x: q2 r9 G9 m" t: f9 M#include <shlwapi.h>
) m4 a! I& e' g2 x#pragma comment(lib, "setupapi.lib")( x/ O( Q* t$ O
#pragma comment(lib, "shlwapi.lib")0 n' ^( w" h% V" a& M5 b% |
4 M  F/ {5 m6 Y, }$ V1 C. N8 a1 U
// device information set(我把它译为设备信息集)% ?+ |: V! f4 h7 [
HDEVINFO hDevInfo = NULL;
' S1 I  L; |8 c9 o, Z
+ F1 U, o3 O# B% {7 k6 I// 出错信息
, U4 P% h; H, hvoid FormatMSG(DWORD dwError, LPTSTR * lpszMsg). x5 o  J8 Q" E9 ^
{
3 c& ^$ G8 X5 U% B' Y  B7 X  X- ^    BOOL bOk = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM
. ?  h+ J) I/ ]# ]- X        | FORMAT_MESSAGE_ALLOCATE_BUFFER,
' `" m9 v* i8 x7 y) D9 ]1 V8 K        NULL,5 ~4 N+ S/ }) S8 Y
       dwError,& d" G3 P0 p' W* r+ }
       MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED),
! v3 P# @3 b/ }( U        (LPTSTR)lpszMsg,, O0 v1 w7 X( r- x7 b; v7 P
       0,
: N0 k: S7 o' W7 _" o  D' P        NULL);
1 x. i8 l7 \- t, d" u7 U3 r2 Y
if (!bOk), Z3 Z- u7 m4 Y8 o3 T6 C4 q4 ]' `( i
{
  d$ w& N# G3 q8 }$ f" K* O     HMODULE hDll = LoadLibraryEx(_T("netmsg.dll"),1 x! ]. C1 [' [+ ?2 G) |
                                 NULL,' k; J6 |2 f- L- l, \4 b
                                 DONT_RESOLVE_DLL_REFERENCES);
1 F% ~1 q+ R4 k* C& @) ?* X  if (NULL != hDll)0 M' J  H6 p$ x3 ~
  {- H3 r7 E( O3 E. i0 T+ ~1 N/ w
  FormatMessage(FORMAT_MESSAGE_FROM_HMODULE |  
3 Y+ x( H5 S  m3 c8 y: G9 C9 U                 FORMAT_MESSAGE_FROM_SYSTEM,
3 w( \9 n1 l; A                 hDll,
% c9 c2 t9 L8 R2 k  ?; @) l: W                 dwError,
4 D5 l4 O; K0 e* z3 `2 X, A9 ]        MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED),4 @2 d. m# d; y" }, }
                (LPTSTR)lpszMsg,0 i( d* M4 [* A0 N  A8 i
                0,
3 F6 O8 }4 F* ?) o5 r% j  y                 NULL);$ }3 |$ ]# A6 Q, h3 ]
     FreeLibrary(hDll);; ?& V* ~& K4 |/ Z1 k8 D7 C1 w
  }- {3 G- o; a" {$ v
}, r  E9 c, f1 g& M
}
, }) T9 H" t# d& S& V: @: U3 g
' R* A' w  {5 x7 aBOOL ChangeStatus(DWORD NewStatus, / N" A& M+ N% v  x% h& ]
                 DWORD SelectedItem,   ; m% ]6 a5 ]& U8 }! k: x% C
                 HDEVINFO  hDevInfo)8 |+ n8 ?5 L* ^' V) U0 x9 I
{+ H0 e/ a4 S6 }/ t
LPTSTR lpszMsg = NULL;" L) Q7 \0 r5 m# V- W& ?2 _% C9 ^
HCURSOR hCursor = NULL;" f; y% [* z* y; K% B9 L# t
try
# ^8 s* \. ~9 n9 }: h{9 r* n2 l3 e9 o
  SP_PROPCHANGE_PARAMS PropChangeParams = % Z/ ~2 k" D( a# z' w# |
                    {sizeof(SP_CLASSINSTALL_HEADER)};
2 ^% M% q3 t0 v3 W. |- m( o+ K/ _- Y  S  SP_DEVINFO_DATA DeviceInfoData = {sizeof(SP_DEVINFO_DATA)};    # s) ?& g% |! `3 x: i0 Q
: U6 P7 H6 [8 `" F8 s# h! I
  hCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));( N7 i' e' ~8 t" r2 s3 \2 G
* U8 d7 `1 ^) @2 z. S
  // Get a handle to the Selected Item.% l# u4 T, R" L  C& Z* r! _
  if (!SetupDiEnumDeviceInfo(hDevInfo, SelectedItem, &DeviceInfoData))8 K1 D$ ?# z% }5 I) x
  {( ~! {9 Y! a7 d7 X
      FormatMSG(GetLastError(), &lpszMsg);  m* P' D- ?# P* `
      throw lpszMsg;; s( P: p6 ]/ H0 ?* d! m
  }4 p5 g! Q* j2 l) f- u1 n
; v$ f) }3 ]. o+ W; F; G
  // Set the PropChangeParams structure.
' f, o& j5 s2 ?/ }4 v( c3 w6 @  PropChangeParams.ClassInstallHeader.InstallFunction =  
* r% F; o0 T3 q$ M" |5 Q                                     DIF_PROPERTYCHANGE;
  I3 y) M( `" G; U) s: K6 u! n6 b  PropChangeParams.Scope = DICS_FLAG_GLOBAL;) i2 g9 A9 H: w3 O- Y. T1 G
  PropChangeParams.StateChange = NewStatus;
0 ~4 [2 y; n  y  I1 M4 n! \( ?# z; B3 |2 `6 U1 v5 z
  if (!SetupDiSetClassInstallParams(hDevInfo,
& H8 H! S5 K+ ?' V5 _) U            &DeviceInfoData,
1 |2 R; L5 k1 D, ~/ Y& o            (SP_CLASSINSTALL_HEADER *)&ropChangeParams,
  x) e  r. U1 }( r            sizeof(PropChangeParams)))
4 w, |5 \4 G" M* f1 i6 s/ y, c  {4 l- `8 v' O& d  G) B
  FormatMSG(GetLastError(), &lpszMsg);
/ _8 v$ Y2 k" g2 S7 `: u; w   throw lpszMsg;
' H% @1 U/ }" w( ?6 w+ F7 {  S  }
, C! G3 q0 K8 t. b4 A9 X# }3 j% x% m. w4 z: a
  // Call the ClassInstaller and perform the change.7 P9 r4 s! v- _' j: b! w  t
  if (!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE,
+ J* c1 T7 n6 {& l7 V, o            hDevInfo,
. s( ~7 z: J& C            &DeviceInfoData))9 a! ~$ m1 L* h) E1 u! ~
  {
- T1 Q" Y9 b4 o& d3 T+ \- \   FormatMSG(GetLastError(), &lpszMsg);
( X$ F- B; n' ?: v# a   throw lpszMsg;
5 s3 h: A8 n+ J9 p  }
' v3 v) X# R9 n1 h3 s6 {- M$ b
' w& l& @. t( v) \+ n* J  SetCursor(hCursor);  
* b" ?( i2 w1 x/ ?9 W. o  return TRUE;- J' W: X+ t1 h0 b& g) D/ p. L
}
8 M- y, `% v4 ccatch (TCHAR * pszError)  D* j( e' Z! J& K8 C  L/ r# F
{
9 G7 m0 _' t. e, g6 @7 L$ Y# ^  SetCursor(hCursor);4 a6 F* Z! T# X8 Y( m, _1 [* O8 G; M* k
  ::MessageBox(NULL,1 s; \5 R& H6 J' q# c$ r
              pszError,
* D& s+ n5 r' h( n+ X4 A) R' h               _T("提示"),
3 ]; X/ [' A# O; \% m               MB_OK);
+ }8 T3 J7 `/ X% K  if (NULL != lpszMsg)$ G5 @: \4 r- b. Q
  {5 n) C. R5 @! E5 T
      LocalFree((HLOCAL)lpszMsg);
( n! d& A/ l1 E  M  }
6 B& l# ]+ m4 V      return FALSE;4 P' V5 t. ~% l( @9 T; N3 l
}     
, `5 j- G$ l1 J/ A}$ |4 O% Z5 {1 p! J) j6 b' u& w" k8 A
9 v1 S& i2 f9 V6 W  h" M" C
// 这些设备的启用和禁用主要有此函数实现
* a6 X4 S8 o# E2 j' d// 参数说明,nStatus 可取3个值,-1 :啥也不做' y! ?: B% a2 a
// 0 禁用设备,1启用设备。
& V- E9 ?4 z7 X4 Q' Y. m, x- A// nIndex用于控制是对光驱,软驱还是对USB启用或禁用# u) i' }& }) R' v$ C7 Z* Y
// 也是可取3个值,0 代表软驱,1 代表光驱
5 j0 l" i: ~1 G; H// 2 代表USB
: G: L# I1 I0 {4 c% V// 譬如要对光驱实现禁用,可以这样调用此函数
3 M  H! F0 S  W4 n/ f/ D// ControlDisk(0, 1);
6 _! E* i" s8 T" ~! JBOOL ControlDisk(int nStatus, int nIndex)
8 j- t3 E0 E9 \7 k" q6 P( }4 W{' e- \4 }' V' _* w6 q" D7 G
if (-1 == nStatus). d0 N) I- j; o1 }: }
{/ c) u3 U1 S: |! ~3 _
  return FALSE;% e" m0 P, w. l, n9 D
}
5 M! m, i: ?# ?5 z4 O# \9 I1 k/ y  x3 Q, \) H
LPTSTR lpszMsg = NULL;' u7 Z# p) i7 c) U
try$ K" `- l2 J# C. J" A( h: l
{
, F; V1 k( f" ]  TCHAR * GUIDString = NULL;! k: o" ^( w* l7 U
  GUID guid;
7 g7 {: p% E2 Q8 @; H) h0 c  ZeroMemory(&guid, sizeof(GUID));* j3 C/ e3 o: X% h5 n  W7 m
  switch(nIndex)
2 q3 z2 e- n4 t" X  {$ m- ^/ I7 q* P/ V; ~. f/ B
  case 0:    // 0 代表软驱# y* ~3 N  x' H$ a, c( j
  GUIDString = _T("4D36E980-E325-11CE-BFC1-08002BE10318");
, E& l  z! n. f( T+ H/ f; h1 o3 k   UuidFromString((unsigned char *)GUIDString, &guid);
0 ]- S% F+ x: J; v   break;
: N" t3 H# g* V  case 1:    // 1 代表光驱 8 C! H, m, g) U% `# i1 W0 z$ ~! [
  GUIDString = _T("4D36E965-E325-11CE-BFC1-08002BE10318");3 R- k  d" f% R+ @; A0 `$ ^0 G
  UuidFromString((unsigned char *)GUIDString, &guid);
3 H, c4 u6 ]4 K- g   break;3 F$ A! ^% B; `6 l) W# J
  case 2:    // 2 代表USB
: D* O9 V9 A5 M/ ~7 T% o   GUIDString = _T("36FC9E60-C465-11CF-8056-444553540000");
, g9 [+ m: m7 [4 e7 {9 n" @2 Q   UuidFromString((unsigned char *)GUIDString, &guid);% A' g8 S2 i5 K( i+ R
  break;' m8 ^* x3 f& y* \& J1 V
  }) e# H6 \% |8 Y4 b! U

0 a" ~- u) u  }& X6 S, F; Y  hDevInfo = SetupDiGetClassDevs(&guid,2 V. I, R0 v. b5 E
           NULL,6 D/ p" v* u" E8 W7 [* j
           NULL,
: w9 T6 U- [/ }4 h: y            DIGCF_PRESENT);$ C% g0 s7 q$ F' L7 m8 C6 e
  if (INVALID_HANDLE_VALUE == hDevInfo)
8 t% U/ f! z% x3 D9 x  {3 |# \1 y( B' k6 D* ~% j
  FormatMSG(GetLastError(), &lpszMsg);  W- P0 I" _5 k$ B
  throw lpszMsg;, g/ x) f) z/ L, u4 z
  }
% ?# g' v4 f& v% Y" \  c
) P# h7 z1 ]! \# h  DWORD i;
* Y; l4 q( |. k( i6 p" {  SP_DEVINFO_DATA DeviceInfoData;
  v" B9 w/ ]# v  b$ m  ZeroMemory(&DeviceInfoData, sizeof(SP_DEVINFO_DATA));" m) X4 l2 o8 T* P. Q
  DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
+ @( B* [5 M4 [% a; q3 i3 p6 @/ ~1 N* q, {; K& s5 G1 t
  for (i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData); ++i)
9 c( v. V  t/ S& I. J  G  {
7 ]% E/ S5 d2 \+ M3 c   if (1 == nStatus)
/ c, b2 r) Z  T1 ^2 ^: {   {
/ ]* F( Y. C0 A0 _2 ]2 z# \& P    StateChange(DICS_ENABLE, i, hDevInfo);
9 }. |7 L1 ]1 m$ Y   }
; |' L2 `$ U- B+ d0 j   else if (0 == nStatus)
% P" {+ M/ R4 b$ i, ?   {) v% x9 z8 y6 o; o4 [
   StateChange(DICS_DISABLE, i, hDevInfo);
  ]- v  \9 y2 r* S; x) K   }   6 q; l, _1 {, f0 h
  }
+ _, [+ a9 b( u0 F& E' @  ]+ c3 b  o/ ?. ]
  // 释放 device information set2 r% [- j4 h- ?) f
  return SetupDiDestroyDeviceInfoList(hDevInfo);  I8 C* r9 m1 s& M/ Q! o7 k. g
}
0 y5 `: t$ ^7 [+ c5 lcatch (TCHAR * pszError)7 k7 J6 E) n3 q3 c* \' N; E! o9 K
{5 U" g+ N$ {7 }6 r/ p4 v
  ::MessageBox(NULL,
/ H0 U9 e; M; I8 O            pszError,
8 i& H" n3 V: p5 |           _T("提示"),
& C, I: u$ D  t; \7 ]      MB_OK);0 \- q! N$ d' K( A5 k
  if (NULL != lpszMsg)# S2 Q9 g# t$ s) A. j
  {
2 ~2 X7 k( E2 A( H   LocalFree((HLOCAL)lpszMsg);
! Z+ g5 [: `6 m+ Z8 p  }   R& M9 l* Z* A- u. U( G
  return FALSE;% E% N7 M0 ?/ I5 G) z3 H! Z  Y  n
}! }1 Z# q$ o6 y" w2 q9 h
return FALSE;
) @7 [# B7 |5 s' c7 X. n9 m}) V$ K, {2 b! Z6 N) j5 m) ?. w2 e7 S

* {( L; o# U( D' s: I    经测试这样对光驱,软驱和USB实现禁用没有问题,但是当禁用过之后如果要对USB实现启用必须两次调用ControlDisk(1, 2);这个函数才可,其余的两个启用没什么问题。还有要说的就是我不是用的枚举所有的设备,然后再过滤(网上的那个禁用网卡的就是这种方法)。
8 M, D$ f$ w! v6 O    据我观察,在注册表的此项下下:  X' Y% I( S/ P9 u  @" Q
   HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\
$ d: M/ ?! m  }5 Y0 W/ c5 i    有很多GUID,每个GUID代表一个设备,譬如这个是USB的
; D+ X- b* v8 s& `& }/ Q    {36FC9E60-C465-11CF-8056-444553540000}3 r& t1 B5 U8 k. Y3 K
   这个是CDROM的2 s9 k' q# u! J* l* f/ }
   {4D36E965-E325-11CE-BFC1-08002BE10318}等等了。9 p1 Z7 \: [/ N5 n; A7 U8 @% j( T
这些值你即使把它改为别的GUID,我使用原来的GUID仍然可以实现我的功能。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-5 09:23 , Processed in 0.014654 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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