.NET - Diving into System Programming - Part 2[转贴]
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);
??????? }
??????? }
??? }
}
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);
??????? }
??????? }
??? }
}