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

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

[复制链接]
发表于 2005-3-16 11:27:43 | 显示全部楼层 |阅读模式
  (dlutyuanhongl发表于2005-3-15 23:14:04)
- h% G3 M% ]1 y+ T- A
* B( n) E9 a' _8 ^+ q. |2 F: P! V这几天,由于工作的实际需要,需要对光驱,软驱,USB的启用和禁用实现控制。参考大家提供的对网卡禁用的代码,实现了光驱,软驱,USB的启用和禁用。主要实现代码如下:8 y/ D2 C+ F4 U- Q! }  A1 ]
// 必要的头文件和要链接的LIB文件
9 r0 y4 L8 i! `0 Y#include <setupapi.h>
8 p# f: W1 L! H: K5 e#include <shlwapi.h>7 ~! n8 G% ~  o' e  a% k
#pragma comment(lib, "setupapi.lib")
/ b& _2 d, g% `. W7 f#pragma comment(lib, "shlwapi.lib")& S: e* l1 x4 X; N8 F

" f( B% W% o: M# ~* |// device information set(我把它译为设备信息集)
# ^; H; |1 z6 I: u. o4 I8 l$ IHDEVINFO hDevInfo = NULL;+ s, L1 l2 L8 @8 ]. O6 Z
& k4 ?2 N6 p( u
// 出错信息
) q, D2 ^( M. _) I' H) J' Kvoid FormatMSG(DWORD dwError, LPTSTR * lpszMsg), ]/ F: ~3 C0 ]
{
6 e: g5 A: _" Z% e, c9 D. n    BOOL bOk = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM 1 G. r* [+ }& N( K! ^
       | FORMAT_MESSAGE_ALLOCATE_BUFFER,+ K& h$ L4 ]$ m0 y7 K9 O
       NULL,. r( Q3 h8 v1 ~9 A0 o
       dwError,9 N+ s: \% k2 }/ U- T
       MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED),
0 Z! ?% A3 c( R5 ?8 T        (LPTSTR)lpszMsg,% z# O+ h, t" L9 S& ]1 x9 K/ a8 H
       0,5 o' ?) f/ ?1 |. R6 [/ w5 I
       NULL);
$ u3 o9 Q8 r; L0 ?$ H; T9 c; E; j) |" I; O$ f
if (!bOk)
$ I/ I% n+ |( T/ W( Z4 H: b" m{
0 ~, F6 z7 p! L; ~! G     HMODULE hDll = LoadLibraryEx(_T("netmsg.dll"),
- \4 D1 V5 W% O( I' C$ p                                  NULL,, k8 ~2 F. V1 j  O1 S# o
                                 DONT_RESOLVE_DLL_REFERENCES);
( i/ y9 x0 |6 N1 g# C  if (NULL != hDll)
& E5 e6 P- b6 H1 j6 t  {
( p5 L3 F5 |1 |2 A4 I" a   FormatMessage(FORMAT_MESSAGE_FROM_HMODULE |  
/ u; c: N' E% ?$ x                 FORMAT_MESSAGE_FROM_SYSTEM,2 x: x& h0 g9 r0 R. w3 P- q  L+ A# }# U1 c
                hDll,, o- V* }6 Y6 A2 H$ A  [  Y* D
                dwError,3 b' c+ U5 D9 ?, L
       MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED)," E" J" C' k" j4 j! e6 M* A; Y# z
                (LPTSTR)lpszMsg,
' V6 \7 x8 A- ]                 0,) a6 c, K( B1 F. N( I
                NULL);$ y* P5 |% {; x# f! `3 j" Z
     FreeLibrary(hDll);: |, y, a7 M' ?% a5 r
  }3 v$ N2 m4 x2 L& I, u) Y. T
}
* p7 T5 [8 u4 C& ~/ `( o- E4 q6 i}
* m7 f0 @' p3 Z$ {" C9 e8 R
% z, u/ T5 m' \# l2 r% f$ ?% GBOOL ChangeStatus(DWORD NewStatus, 2 O5 ?1 W; h9 D  w3 h3 U
                 DWORD SelectedItem,   ) B  z# K3 K1 q4 _+ D
                 HDEVINFO  hDevInfo)& e8 v- N( J0 O5 ?
{
8 v" R7 E- f% E  ^LPTSTR lpszMsg = NULL;+ m* |9 z# E' n& b8 B0 l
HCURSOR hCursor = NULL;7 v; s1 q1 c9 R/ _  K
try
4 p3 G* W7 Q& m6 d7 u# l{9 H. f6 D* S; C
  SP_PROPCHANGE_PARAMS PropChangeParams = ! @* b/ i. \4 i8 m- U
                    {sizeof(SP_CLASSINSTALL_HEADER)};
8 z* J) Y% [% H8 q: X, u+ S" v  SP_DEVINFO_DATA DeviceInfoData = {sizeof(SP_DEVINFO_DATA)};    
" b+ r0 J; Q+ r& e+ B8 f2 h6 W0 ?8 E5 J
  hCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));. x6 w+ M! o1 G' u2 K
+ W" Y, ]0 P* u  y
  // Get a handle to the Selected Item.( W# [7 z* }( N0 }& F0 B
  if (!SetupDiEnumDeviceInfo(hDevInfo, SelectedItem, &DeviceInfoData))9 |) J2 F# F- o$ E8 Q( @. P
  {
. u# e# |! X9 S; E9 ^4 N' s1 y* B       FormatMSG(GetLastError(), &lpszMsg);8 H" J: N! r+ Z; I$ y' Y3 S; H9 N8 p
      throw lpszMsg;
; s5 b# a8 d4 x0 \1 x  }
$ a4 k. ]- o9 p8 m8 M
! E& Q; E% G. E! z, ^, ]3 e  // Set the PropChangeParams structure.
+ [1 s5 e% ~. f  PropChangeParams.ClassInstallHeader.InstallFunction =   - j' h2 q% l+ f& b: L$ V. `$ j
                                    DIF_PROPERTYCHANGE;3 n: i1 m  ^! c. R* i% _; M# w$ \
  PropChangeParams.Scope = DICS_FLAG_GLOBAL;
- d: Y+ m0 Y5 F1 j5 t  PropChangeParams.StateChange = NewStatus;( |1 V& o; m7 X% F9 f7 F
% m+ Q3 }4 q+ \+ z9 E  }- f+ j8 W+ R
  if (!SetupDiSetClassInstallParams(hDevInfo,
7 i2 M5 |8 j* G; s1 S. K" W            &DeviceInfoData,) w- p9 X2 N$ ^1 T7 }4 \
           (SP_CLASSINSTALL_HEADER *)&ropChangeParams,
7 {6 o! {9 m6 X- B* P            sizeof(PropChangeParams)))4 ?' `& m1 ]" c( E$ W( ]+ j0 q" |4 E
  {8 C( R/ {3 s0 ~) f9 n, L4 ?
  FormatMSG(GetLastError(), &lpszMsg);
1 S3 o2 G- V- R$ \; J   throw lpszMsg;
; k( o7 w0 _# N8 o- ^% L  }0 ]$ q9 V. b! D0 U% X% D
2 E! M6 r' r2 S) E9 A3 t
  // Call the ClassInstaller and perform the change.: k2 O# I  Y3 v9 D- G- j* l
  if (!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE,/ I' t, G3 ?  L7 R* e( P
           hDevInfo,* u- _8 K) v9 `/ S; W
           &DeviceInfoData))0 |9 D  J- I3 ?
  {& I% B/ j) P) l
  FormatMSG(GetLastError(), &lpszMsg);0 I0 h5 A& s5 F; l1 K
  throw lpszMsg;5 e/ T5 G$ q: a* h* \9 t
  }3 R9 H) g6 ^0 E3 U

2 S( O' D2 P' r4 V9 i  SetCursor(hCursor);  
1 a8 f& }: H/ q  return TRUE;
5 s( J9 q0 ]& F& U+ p}
% F  ?5 U# X# ^6 X" [catch (TCHAR * pszError)
" A$ L6 a$ q* A/ p7 I" z# v{( _0 w" T. y; [) `0 U- ^
  SetCursor(hCursor);
5 G) g- t9 J) m1 `. P* r' @  ::MessageBox(NULL,
, Y* w% w6 o  q2 ?/ A               pszError,
5 Y6 P' S+ }  A. ?2 h               _T("提示"),& D- L6 O2 o+ P! p1 ~
              MB_OK);7 x0 B8 q3 s! C9 e
  if (NULL != lpszMsg)
  y5 e9 b) e  A  {
2 k+ d8 i3 r2 `, N# F& o( `       LocalFree((HLOCAL)lpszMsg);
. @* ~  ^+ a* e/ q5 g  }
5 W5 Q4 `7 O- F3 D! T; m& ^; x      return FALSE;
$ D) D; e% r/ g}     
, b! `  d1 ]3 U- T- e( T, a}
# A; [3 W4 P1 W: [" M. {8 f: f
9 L; t) n' h3 T0 Q3 r( T// 这些设备的启用和禁用主要有此函数实现
4 F; I$ C% C' c; v' U8 G// 参数说明,nStatus 可取3个值,-1 :啥也不做" A0 P3 P- I7 z6 v
// 0 禁用设备,1启用设备。
5 h! e) `# M  E1 L4 M6 Y! N, t' K+ C// nIndex用于控制是对光驱,软驱还是对USB启用或禁用' n6 L' ?0 j4 t1 P) e4 D. W
// 也是可取3个值,0 代表软驱,1 代表光驱
# i3 |" e1 |+ v1 D; M3 S2 {// 2 代表USB+ X! ~: U1 g8 n2 f
// 譬如要对光驱实现禁用,可以这样调用此函数
' u! o, v1 d' u9 o// ControlDisk(0, 1);
8 E+ X# S- Q/ ?BOOL ControlDisk(int nStatus, int nIndex)% p: k! b, _2 {# }  K# G
{' \0 h5 V2 W4 L; d5 z% q
if (-1 == nStatus)
9 w+ {/ C: u, I2 O( w0 o% ]{
: L" D0 @* d. S4 |: I& i+ i7 U) y  return FALSE;# A) v7 W+ c( G( H* r% @- |, E3 Z
} - I9 a( |, k7 T

; t4 ]- M2 J4 X: \8 MLPTSTR lpszMsg = NULL;- n) U5 m; i) V$ U
try+ D0 q' K# t3 G4 |+ b
{
- c* `1 I0 ^9 z0 y5 B" n) _  TCHAR * GUIDString = NULL;9 m# h7 K) T- _
  GUID guid;' x* x( P& s+ d5 L
  ZeroMemory(&guid, sizeof(GUID));
& J/ e) [9 d/ K& i  switch(nIndex)
; Y7 U& g+ A( B; p" b  w1 w% c* a  {
( j  Z! {4 h% X$ V0 b+ p3 a  case 0:    // 0 代表软驱
5 o2 N# I' H: i3 f1 w  z# ]+ h   GUIDString = _T("4D36E980-E325-11CE-BFC1-08002BE10318");
# r% \' m& N* O/ v7 B   UuidFromString((unsigned char *)GUIDString, &guid);* j& }( t8 t5 f* m8 X( G. N3 [
  break; * P8 V3 n8 L2 _$ j, Z* b: o" ^
  case 1:    // 1 代表光驱
+ }; w. h# T! M) ?   GUIDString = _T("4D36E965-E325-11CE-BFC1-08002BE10318");
. Z1 z5 S- u) p9 a! T* n7 m- v! |   UuidFromString((unsigned char *)GUIDString, &guid);
( ^) e2 p7 Q# q( D/ q* p8 b: F   break;
3 ?  q- l  ^6 X# `: c9 j( U# S# Y  case 2:    // 2 代表USB
) \5 {* R6 S8 q& R( q; @   GUIDString = _T("36FC9E60-C465-11CF-8056-444553540000");
% {8 x9 S8 K. y; R  H   UuidFromString((unsigned char *)GUIDString, &guid);0 V. P, ]1 P4 T/ r1 ?- C6 s2 Z# R: g+ V
  break;
. F/ ^9 s0 @& _5 ~; z  }/ m( `/ ?" Y% X! Y- z
: c" w. q' y! ]
  hDevInfo = SetupDiGetClassDevs(&guid,
; D8 D1 i: |* H            NULL,
  f0 ?4 J4 |- z/ E8 ]+ v  e% g, h            NULL,+ H# Y2 z+ @, G6 z1 M# B
           DIGCF_PRESENT);
7 e) W8 z$ x" Y, p0 y) l  if (INVALID_HANDLE_VALUE == hDevInfo)
% G6 ~+ z7 a- F+ K2 s  {( K- y) `' O4 b5 {  t. q
  FormatMSG(GetLastError(), &lpszMsg);& o" S6 L. ]& L7 x
  throw lpszMsg;
. O, S: k( K% X2 a( F6 `  }" z, c- `3 m! q* g

/ W4 t+ e3 d3 G  |$ D( N* a  DWORD i;+ W8 o& M( |  b  J
  SP_DEVINFO_DATA DeviceInfoData;, I. z# `$ C* H* o. S. L! M
  ZeroMemory(&DeviceInfoData, sizeof(SP_DEVINFO_DATA));
" x' x, [4 U0 N+ V( ]" @' m3 H: \  DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
; m  s) J- O$ R& o3 K/ O3 P- F" b/ L' X4 r
  for (i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData); ++i)& c# O: w4 k0 q0 R  {' E
  {
; ^6 }) I! v8 J$ W* t: {   if (1 == nStatus)
5 a5 k! }/ `) v; B% F# V   {/ q' d+ ~7 V: J4 j; A" ^
   StateChange(DICS_ENABLE, i, hDevInfo);
3 U% @* i0 l! ?* F/ @7 @7 ?   }
; ^4 Y1 q% h* ]1 O% z# }. I( u- ^   else if (0 == nStatus). N4 n. s. B& [- h! Y6 V. k0 Z, z
  {
0 C2 Y: \& [3 {# i+ M    StateChange(DICS_DISABLE, i, hDevInfo);( L1 i& t5 x8 y& }! p
  }   + I: m" ^) B5 H3 n: g
  }
  g' Y6 `7 z' P' C! j1 {+ U4 C5 S3 B% \+ q' E! I
  // 释放 device information set: u: O+ J4 ?4 f5 Y5 @2 |
  return SetupDiDestroyDeviceInfoList(hDevInfo);
0 V( f: O$ H* i( N}2 q* b/ o. O2 W6 G
catch (TCHAR * pszError)
/ D" L' W5 h3 c2 z) E{4 v2 O/ l8 O# q* k
  ::MessageBox(NULL,1 v" t/ g2 n9 x& U; \3 Z
           pszError,$ ]' N# c* `) ^6 c1 k
          _T("提示"),
6 p" b6 J5 @) @) I* z3 s      MB_OK);
6 u+ d& E' d8 k5 r( w5 [2 x8 n+ ?  if (NULL != lpszMsg)9 C( A6 r$ g( @& A
  {8 J0 c9 K1 K- b$ R) m
  LocalFree((HLOCAL)lpszMsg);
3 W7 q4 C, G( M% O7 U3 r6 o* Q$ O  } & ~" ?# P# ^3 N+ |4 o8 O7 W3 ~& B3 n
  return FALSE;
, L1 M' I8 m( A" P' S% S3 U}
) z: r1 r% b+ I, {- freturn FALSE;
+ I! d5 E" G: s8 x3 C8 W}. v1 l# U( r7 p# B! ^* R

0 A% g! f1 H/ O    经测试这样对光驱,软驱和USB实现禁用没有问题,但是当禁用过之后如果要对USB实现启用必须两次调用ControlDisk(1, 2);这个函数才可,其余的两个启用没什么问题。还有要说的就是我不是用的枚举所有的设备,然后再过滤(网上的那个禁用网卡的就是这种方法)。4 i8 k* V8 v8 C  k' @
   据我观察,在注册表的此项下下:
4 i0 D: A* `3 d. u- ~    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\
, m. b, O# [3 ^9 T: F" o    有很多GUID,每个GUID代表一个设备,譬如这个是USB的& {7 B3 |6 T8 H
   {36FC9E60-C465-11CF-8056-444553540000}7 z: i4 U9 U# t- ]3 j( t9 c
   这个是CDROM的
# s5 y4 |4 h: x  X    {4D36E965-E325-11CE-BFC1-08002BE10318}等等了。
( v# G/ N- f% ]" M这些值你即使把它改为别的GUID,我使用原来的GUID仍然可以实现我的功能。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-5-2 10:21 , Processed in 0.019709 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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