在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下调试通过。