using System;
using System.Text;
using System.Runtime.InteropServices;
namespace DevInfo
{
??? class DeviceInfo
??? {
??????? public const int DIGCF_PRESENT??? = (0x00000002);
??????? public const int MAX_DEV_LEN = 1000;
??????? public const int SPDRP_FRIENDLYNAME = (0x0000000C);?
????????? // FriendlyName (R/W)
??????? public const int SPDRP_DEVICEDESC = (0x00000000);???
????????? // DeviceDesc (R/W)
??????? [StructLayout(LayoutKind.Sequential)]
??????????? public class SP_DEVINFO_DATA
??????????????? {
???????????????? public int cbSize;
???????????????? public Guid? ClassGuid;
???????????????? public int DevInst;??? // DEVINST handle
???????????????? public ulong Reserved;
??????????????? };
??????? [DllImport("setupapi.dll")]//
??????? public static extern Boolean
????????? SetupDiClassGuidsFromNameA(string ClassN, ref Guid guids,
??????????? UInt32 ClassNameSize, ref UInt32 ReqSize);
??????? [DllImport("setupapi.dll")]
??????? public static extern IntPtr??????????????? //result HDEVINFO
????????? SetupDiGetClassDevsA(ref Guid ClassGuid, UInt32 Enumerator,
??????????? IntPtr???? hwndParent,? UInt32 Flags);
??????? [DllImport("setupapi.dll")]
??????? public static extern Boolean
????????? SetupDiEnumDeviceInfo(IntPtr DeviceInfoSet, UInt32 MemberIndex,
??????????? SP_DEVINFO_DATA???? DeviceInfoData);
??????? [DllImport("setupapi.dll")]
??????? public static extern Boolean
????????? SetupDiDestroyDeviceInfoList(IntPtr DeviceInfoSet);
??????? [DllImport("setupapi.dll")]
??????? public static extern Boolean
????????? SetupDiGetDeviceRegistryPropertyA(IntPtr DeviceInfoSet,
????????? SP_DEVINFO_DATA???? DeviceInfoData, UInt32 Property,
????????? UInt32?? PropertyRegDataType, StringBuilder? PropertyBuffer,
????????? UInt32 PropertyBufferSize, IntPtr RequiredSize);
??????? public static int EnumerateDevices(UInt32 DeviceIndex,
??????????????? string ClassName,
??????????????? StringBuilder DeviceName)
??????? {
???????? UInt32 RequiredSize = 0;
???????? Guid guid=Guid.Empty;
???????? Guid[] guids=new Guid[1];
???????? IntPtr NewDeviceInfoSet;
???????? SP_DEVINFO_DATA DeviceInfoData= new SP_DEVINFO_DATA();
???????? bool res=SetupDiClassGuidsFromNameA(ClassName,
??????????????????? ref guids[0],RequiredSize,
??????????????????? ref RequiredSize);
???????? if(RequiredSize==0)
?????????????? {
??????????????? //incorrect class name:
??????????????? DeviceName=new StringBuilder("");
??????????????? return -2;
?????????????? }
???????? if(!res)
????????? {
?????????? guids=new Guid[RequiredSize];
?????????? res=SetupDiClassGuidsFromNameA(ClassName,ref guids[0],RequiredSize,
??????????????? ref RequiredSize);
?????????? if(!res || RequiredSize==0)
?????????????? {
?????????? //incorrect class name:
??????????????? DeviceName=new StringBuilder("");
??????????????? return -2;
?????????????? }
????????? }
???????? //get device info set for our device class
???????? NewDeviceInfoSet=SetupDiGetClassDevsA(ref guids[0],0,IntPtr.Zero,
???????????????????? DIGCF_PRESENT);
???????? if( NewDeviceInfoSet.ToInt32() == -1 )
???????? if(!res)
?????????????? {
????????? //device information is unavailable:
??????????????? DeviceName=new StringBuilder("");
??????????????? return -3;
?????????????? }
??????????? DeviceInfoData.cbSize = 28;
??????????? //is devices exist for class
??????????? DeviceInfoData.DevInst=0;
??????????? DeviceInfoData.ClassGuid=System.Guid.Empty;
??????????? DeviceInfoData.Reserved=0;
??????????? res=SetupDiEnumDeviceInfo(NewDeviceInfoSet,
?????????????????? DeviceIndex,DeviceInfoData);
??????????? if(!res) {
???????? //no such device:
??????????????? SetupDiDestroyDeviceInfoList(NewDeviceInfoSet);
??????????????? DeviceName=new StringBuilder("");
??????????????? return -1;
??????????? }
??????? DeviceName.Capacity=MAX_DEV_LEN;
??????? if(!SetupDiGetDeviceRegistryPropertyA(NewDeviceInfoSet,
????????? DeviceInfoData,
??????? SPDRP_FRIENDLYNAME,0,DeviceName,MAX_DEV_LEN,IntPtr.Zero) )
??????? {
???????? res = SetupDiGetDeviceRegistryPropertyA(NewDeviceInfoSet,
????????? DeviceInfoData,SPDRP_DEVICEDESC,0,DeviceName,MAX_DEV_LEN,
??????????? IntPtr.Zero);
???????? if(!res){
???????? //incorrect device name:
??????????????? SetupDiDestroyDeviceInfoList(NewDeviceInfoSet);
??????????????? DeviceName=new StringBuilder("");
??????????????? return -4;
??????????? }
??????? }
???????? return 0;
??????? }
??????? [STAThread]
??????? static void Main(string[] args)
??????? {
???????? StringBuilder devices=new StringBuilder("");
???????? UInt32 Index=0;
???????? int result=0;
???????? if(args.Length != 1)
????????? {
??????????? Console.WriteLine("command line format:");
??????????? Console.WriteLine("DevInfo <classname>"</classname>);
??????????? return;
????????? }
???????? while(true)
????????? {
??????????? result=EnumerateDevices(Index, args[0], devices);
??????????? Index++;
??????????? if(result == -2)
??????????????????? {
???????????????????? Console.WriteLine("Incorrect name of Class = {0}",
?????????????????????? args[0]);
???????????????????? break;
??????????????????? }
??????????? if(result == -1)break;
??????????? if(result == 0)Console.WriteLine("Device{0} is {1}",
????????????? Index, devices);
??????? }
??????? }
??? }
}
分享到:
相关推荐
国外大牛、微软MVP所著的Asp.Net方面的WebApi书籍
前端开源库-diving-squirrel潜水松鼠,简单网络应用的框架。它使用了Express服务器和Jade模板系统。
Module-7-Diving-Deeper-Into-React-Component
HAN-OOPD-Diving-For-Treasure:OOPD的学校项目-潜水宝藏(续集)
火车订票系统java源码作业 1 - 跳伞预订系统 截止日期:第 5 周,星期一,上午 9 点(10 月 ...练习如何应用系统的面向对象设计过程 获得实现具有多个交互类的面向对象程序的经验 ...在本作业中,您将设计并实现一个原型...
as well as desktop and web application programming, including designing, developing, and supporting the use of applications for SIM Card Operating System Porting, personalization, PC/SC communication...
抽象wal接口 Diving into the Laravel Framework 一书的示例。 阅读书中的解释。
SharePoint 2010 * Windows PowerShell = Disaster Recovery2 (Audience: IT Admins) ...... 38 SharePoint 2010’s New Granular Content Restore Capability (Audience: IT Admins) ........ 49 SharePoint 2010’...
You have a great idea for...Diving into Objective-C More Data Comparison Creating User Interfaces Storing Information Protocols and Delegates Memory, Addresses, and Pointers Debugging Programs with Xcode
Diving Deep Into Kubernetes Networking,对k8s网络深入介绍,掌握k8s网络原理
You’ll start with Scala's core types and syntax before diving into higher-order functions and immutable data structures. Author Jason Swartz demonstrates why Scala’s concise and expressive syntax ...
深入了解指令 看演示 官方文档: 一种主要在指令中使用控制器的有趣方法: 更多关于 bindToController: 用于构建此演示文稿的技术: 作为展示框架 用于代码高亮 用于在开发时编译 sass 并捆绑类似 livereload 的...
Best Programming iOS 11 book Diving Deep into Views, View Controllers,
Get to know about event-driven architectures by diving into message queues such as Kafka, Rabbitmq, and AWS SQS. Understand key modern database technologies such as MongoDB, and Amazon’s DynamoDB ...
Java developers in particular may be able to get away with diving right into the more advanced chapters of the book. Regardless of which category of user you fall into, rest assured that there is ...
Java 9 Programming By Example by Peter Verhas English | 26 Apr. 2017 | ASIN: B01KOG6SWI | 504 Pages | AZW3 | 4.1 MB Key Features We bridge the gap between “learning” and “doing” by providing ...
You’ll start with a quick overview of the framework and then explore the core components by diving into complete examples, engaging illustrations, and crisp, straightforward explanations. You’ll ...
Diving deep into Cycles you will learn Cycle’s node-based material system, how to set-up a 3D scene for rendering, how to create a natural and man-made materials as well as the correct organization ...
We then cover more simple examples to build your foundation before diving to some complex data structure problems that will solidify your Java 9 skills. With a special focus on modularity and HTTP 2.0...