猫博

猫也博客-c++ kernel ddk ifs
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

如何在Win2000/xp下禁止某些硬件?比如说网卡,CD-ROM..

Posted on 2004-03-12 16:24  catlog  阅读(4212)  评论(3编辑  收藏  举报

在NT的基础上,MS在NT4.0后的操作系统里都提供了很多以SetupDiXXXXX开头的函数,

就是大家经常所说的 SetupAPI.现在举一些简单的例子来说明这些情况:

1,首先我们要访问系统的硬件库,用API SetupDiGetClassDevs,在DDK的文档中,函数的原型如下:

HDEVINFO SetupDiGetClassDevs( IN LPGUID ClassGuid,OPTIONAL IN PCTSTR Enumerator,OPTIONAL IN HWND hwndParent,OPTIONAL IN DWORD Flags );

成功后我们可以得到一个HANDLE,指向DECINFO。Enumerator我们可以指定特定的设备类型,如“USB”,"PCI"等

2,然后利用HDEVINFO hDev 遍历所有的硬件,API原型如下:

WINSETUPAPI BOOL WINAPI SetupDiEnumDeviceInfo( INHDEVINFO DeviceInfoSet,IN DWORD MemberIndex, OUTPSP_DEVINFO_DATA DeviceInfoData );

在遍历过程中,我们可以用SetupDiGetDeviceRegistryProperty 得到硬件的属性值,如名称,GUID等,可以参考

/ Device registry property codes
// (Codes marked as read-only (R) may only be used for
// SetupDiGetDeviceRegistryProperty)
//
// These values should cover the same set of registry properties
// as defined by the CM_DRP codes in cfgmgr32.h.
//
#define SPDRP_DEVICEDESC (0x00000000) // DeviceDesc (R/W)
#define SPDRP_HARDWAREID (0x00000001) // HardwareID (R/W)
#define SPDRP_COMPATIBLEIDS (0x00000002) // CompatibleIDs (R/W)
#define SPDRP_NTDEVICEPATHS (0x00000003) // Unsupported, DO NOT USE
#define SPDRP_SERVICE (0x00000004) // Service (R/W)
#define SPDRP_CONFIGURATION (0x00000005) // Configuration (R)
#define SPDRP_CONFIGURATIONVECTOR (0x00000006) // ConfigurationVector (R)
#define SPDRP_CLASS (0x00000007) // Class (R--tied to ClassGUID)
#define SPDRP_CLASSGUID (0x00000008) // ClassGUID (R/W)
#define SPDRP_DRIVER (0x00000009) // Driver (R/W)
#define SPDRP_CONFIGFLAGS (0x0000000A) // ConfigFlags (R/W)
#define SPDRP_MFG (0x0000000B) // Mfg (R/W)
#define SPDRP_FRIENDLYNAME (0x0000000C) // FriendlyName (R/W)
#define SPDRP_LOCATION_INFORMATION (0x0000000D) // LocationInformation (R/W)
#define SPDRP_PHYSICAL_DEVICE_OBJECT_NAME (0x0000000E) // PhysicalDeviceObjectName (R)
#define SPDRP_CAPABILITIES (0x0000000F) // Capabilities (R)
#define SPDRP_UI_NUMBER (0x00000010) // UiNumber (R)
#define SPDRP_UPPERFILTERS (0x00000011) // UpperFilters (R/W)
#define SPDRP_LOWERFILTERS (0x00000012) // LowerFilters (R/W)
#define SPDRP_MAXIMUM_PROPERTY (0x00000013) // Upper bound on ordinals
也可以在过虑特定的设备如 SPDRP_DEVTYPE = NET。CDROM等。

3。现在我们可以禁止或启用特定的设备了。相关API

SetupDiSetClassInstallParams

SetupDiCallClassInstaller

至此,我们已经做到我们想要的,

程序在VC6,SP5,WinDDK2462 ,Win2000下调试通过。