blue
驱动大牛
驱动大牛
  • 注册日期2001-04-25
  • 最后登录2010-10-15
  • 粉丝0
  • 关注0
  • 积分55分
  • 威望12点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
阅读:2242回复:7

小知识>通过使用 SetupDi 调用函数枚举硬件设备

楼主#
更多 发布于:2002-08-21 13:15
这篇文章是由微软网站发表的,所以还是比较切实可用的也比较权威的。也可能有许多人早已精通了,那您就跳过此帖。
这篇文章中的信息适用于:
Microsoft Windows 2000 Driver Development Kit (DDK)
Microsoft Windows NT 4.0 Driver Development Kit (DDK)

概要
要得到 Windows 2000 中安装的硬件设备列表,应用程序可以调用 SetupDi 类 API 函数。
更多信息
以下代码段演示如何显示已经安装的所有硬件设备的列表:
#include <stdio.h>
#include <windows.h>
#include <setupapi.h>
#include <devguid.h>
#include <regstr.h>

int main( int argc, char *argv[ ], char *envp[ ] )
{
HDEVINFO hDevInfo;
SP_DEVINFO_DATA DeviceInfoData;
DWORD i;

// Create a HDEVINFO with all present devices.
hDevInfo = SetupDiGetClassDevs(NULL,
0, // Enumerator
0,
DIGCF_PRESENT | DIGCF_ALLCLASSES );

if (hDevInfo == INVALID_HANDLE_VALUE)
{
// Insert error handling here.
return 1;
}

// Enumerate through all devices in Set.

DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
for (i=0;SetupDiEnumDeviceInfo(hDevInfo,i,
&DeviceInfoData);i++)
{
DWORD DataT;
LPTSTR buffer = NULL;
DWORD buffersize = 0;

//
// Call function with null to begin with,
// then use the returned buffer size
// to Alloc the buffer. Keep calling until
// success or an unknown failure.
//
while (!SetupDiGetDeviceRegistryProperty(
hDevInfo,
&DeviceInfoData,
SPDRP_DEVICEDESC,
&DataT,
(PBYTE)buffer,
buffersize,
&buffersize))
{
if (GetLastError() ==
ERROR_INSUFFICIENT_BUFFER)
{
// Change the buffer size.
if (buffer) LocalFree(buffer);
buffer = LocalAlloc(LPTR,buffersize);
}
else
{
// Insert error handling here.
break;
}
}

printf(\"Result:[%s]\\n\",buffer);

if (buffer) LocalFree(buffer);
}


if ( GetLastError()!=NO_ERROR &&
GetLastError()!=ERROR_NO_MORE_ITEMS )
{
// Insert error handling here.
return 1;
}

// Cleanup
SetupDiDestroyDeviceInfoList(hDevInfo);

return 0;
}
以下代码段演示如何检索系统上的所有显示适配器组:
hDevInfo = SetupDiGetClassDevs(
(LPGUID) &GUID_DEVCLASS_DISPLAY,
0,
0,
DIGCF_PRESENT);
以下代码段演示如何检索外围组件互连 (PCI) 总线上的所有设备组:
hDevInfo = SetupDiGetClassDevs(NULL,
REGSTR_KEY_PCIENUM, // Enumerator
0,
DIGCF_PRESENT | DIGCF_ALLCLASSES );
要求设备实例句柄(如 API 函数的 Config Manager 组)的 Windows API 函数可以使用 SetupDiEnumDeviceInfo 函数返回的 SP_DEVINFO_DATA 结构中的 DevInst 值。
参考
SetupDi API 调用函数归档在 Windows 2000 Device Development Kit (DDK) 中。

最新喜欢:

beaverorbeaver... cc_mcycc_mcy
caosuricheng
驱动中牛
驱动中牛
  • 注册日期2002-04-16
  • 最后登录2004-09-04
  • 粉丝0
  • 关注0
  • 积分-10分
  • 威望-1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-08-21 13:31
看过了
但是感谢斑竹一片好心 :)
我是草肃日成 有人认识我吗?
yuri69
驱动小牛
驱动小牛
  • 注册日期2002-07-12
  • 最后登录2005-12-31
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-08-21 15:16
有98下的用法吗? 斑竹? 怎样在 98下不用重新启动就能安装驱动程序?
我不会停止对你的思念,就像呼吸一样,我不去特意的想,但是,只能屏息,而不可能停止
kxgchina
驱动小牛
驱动小牛
  • 注册日期2002-04-01
  • 最后登录2005-05-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-08-21 22:44
首先感谢版主!
当然还希望以后多来些此类的资料
dotdraw
驱动牛犊
驱动牛犊
  • 注册日期2002-08-09
  • 最后登录2008-03-30
  • 粉丝0
  • 关注0
  • 积分114分
  • 威望12点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-08-21 22:59
太好了!
danielxu22
驱动中牛
驱动中牛
  • 注册日期2002-11-22
  • 最后登录2014-03-24
  • 粉丝0
  • 关注1
  • 积分2分
  • 威望18点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-12-11 10:53
敬礼!
今天我发现我家的金鱼淹死了,:(
cc_mcy
驱动牛犊
驱动牛犊
  • 注册日期2002-05-08
  • 最后登录2005-06-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-12-11 21:05
感谢斑竹,要是多些这样的文章或消息就更好了.

salute!
三人行,必有我师! [email]cc_mcy@163.com[/email]
flyingzhang
驱动牛犊
驱动牛犊
  • 注册日期2003-10-11
  • 最后登录2004-06-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-10-15 15:58
请教板主:小弟的一个程序,在Win2k下正常,但在Win98下和WinXP下调用SetupDiEnumDeviceInfo的返回错误都是ERROR_NO_MORE_ITEMS呢?Win98下可能是操作系统不支持该操作,但在XP下完全不应该啊?
我的程序段如下:
BOOL FindExistingDevice(IN LPTSTR HardwareId)
{
HDEVINFO DeviceInfoSet;
SP_DEVINFO_DATA DeviceInfoData;
DWORD i,err;
BOOL Found;

//
// Create a Device Information Set with all present devices.
//

DeviceInfoSet = SetupDiGetClassDevs(NULL, // All Classes
0,
0,
DIGCF_ALLCLASSES | DIGCF_PRESENT ); // All devices present on system

if (DeviceInfoSet == INVALID_HANDLE_VALUE)
{
DisplayError(_T(\"GetClassDevs(All Present Devices)\"),GetLastError()) ;
return FALSE;
}

_tprintf(_T(\"\\n\\nSearch for Device ID: [%s]\\n\\n\"),HardwareId);

//
// Enumerate through all Devices.
//

Found = FALSE;
i = err = 0;

DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);


while ( !Found && SetupDiEnumDeviceInfo(DeviceInfoSet, i++, &DeviceInfoData))
{
        // Do operations with each entry
} // endof while (!Found ...........

if (GetLastError() != NO_ERROR)
{
DisplayError(_T(\"EnumDeviceInfo\"),GetLastError());
}

//
// Cleanup.
//

err = GetLastError();
SetupDiDestroyDeviceInfoList(DeviceInfoSet);
SetLastError(err);

return err == NO_ERROR;
}
 :
游客

返回顶部