kongxx's blog

有困难要上,没有困难创造困难也要上!
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

.NET - Diving into System Programming - Part 2[转贴]

Posted on 2004-06-11 15:13  kongxx  阅读(919)  评论(0编辑  收藏  举报
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>");
            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);
        }

        }
    }
}