|
|
(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仍然可以实现我的功能。 |
|