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 ");

??????????? 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);

??????? }


??????? }

??? }

}