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

来源:互联网 发布:梦里花落知多少小说网 编辑:程序博客网 时间:2024/04/28 03:01

using System;
using System.Runtime.InteropServices;
using System.Text;


namespace DevClasses
{
///


/// Summary description for Class.
///

class DeviceClasses
{
? ///
? /// The main entry point for the application.
? ///

? public const int MAX_NAME_PORTS=7;
? public const int RegDisposition_OpenExisting=(0x00000001);
??? // open key only if exists
? public const int CM_REGISTRY_HARDWARE=(0x00000000);

? public const int CR_SUCCESS = (0x00000000);
? public const int CR_NO_SUCH_VALUE = (0x00000025);
? public const int CR_INVALID_DATA = (0x0000001F);
? public const int DIGCF_PRESENT = (0x00000002);
? public const int DIOCR_INSTALLER = (0x00000001);
// MaximumAllowed access type to Reg.
? public const int MAXIMUM_ALLOWED = (0x02000000);
[StructLayout(LayoutKind.Sequential)]

public class SP_DEVINFO_DATA
{
public int cbSize;
public Guid ClassGuid;
public int DevInst; // DEVINST handle
public ulong Reserved;
};


? [DllImport("cfgmgr32.dll")]
? public static extern UInt32
? CM_Open_DevNode_Key(IntPtr dnDevNode, UInt32 samDesired,
???????? UInt32 ulHardwareProfile,
???????? UInt32 Disposition,IntPtr phkDevice, UInt32 ulFlags);

? [DllImport("cfgmgr32.dll")]
? public static extern UInt32
? CM_Enumerate_Classes(UInt32 ClassIndex,ref Guid ClassGuid, UInt32 Params);

? [DllImport("setupapi.dll")]//
? public static extern Boolean
?? SetupDiClassNameFromGuidA(ref Guid ClassGuid,
??????????? StringBuilder ClassName, //char * ?
?? UInt32 ClassNameSize, ref UInt32 RequiredSize);

? [DllImport("setupapi.dll")]
? public static extern IntPtr
?? SetupDiGetClassDevsA(ref Guid ClassGuid, UInt32 Enumerator,
?? IntPtr? hwndParent, UInt32 Flags);

? [DllImport("setupapi.dll")]
? public static extern Boolean
?? SetupDiEnumDeviceInfo(IntPtr DeviceInfoSet, UInt32 MemberIndex,
?? ref SP_DEVINFO_DATA? DeviceInfoData);

? [DllImport("setupapi.dll")]
? public static extern Boolean
?? SetupDiDestroyDeviceInfoList(IntPtr DeviceInfoSet);

? [DllImport("setupapi.dll")]
? public static extern IntPtr
?? SetupDiGetClassDevsA(ref Guid ClassGuid, UInt32 samDesired,
?? UInt32 Flags, ref string hwndParent, IntPtr Reserved);

? [DllImport("setupapi.dll")]
? public static extern IntPtr
? SetupDiOpenClassRegKeyExA(
? ref Guid ClassGuid, UInt32 samDesired, int Flags, IntPtr MachineName,
? UInt32 Reserved);

? [DllImport("advapi32.dll")]
? public static extern UInt32
? RegQueryValueA(IntPtr KeyClass,UInt32 SubKey,
???????? StringBuilder ClassDescription,ref UInt32 sizeB);


? [DllImport("user32.dll")]
? public static extern Boolean
? CharToOem(String lpszSrc, StringBuilder lpszDst);

? public static int EnumerateClasses(UInt32 ClassIndex,
?? ref StringBuilder ClassName, StringBuilder ClassDescription,
??????? ref bool DevicePresent)
? {
?? Guid ClassGuid=Guid.Empty;
?? IntPtr NewDeviceInfoSet;
?? SP_DEVINFO_DATA DeviceInfoData;
?? UInt32 result;
?? StringBuilder name=new StringBuilder("");
?? bool resNam=false;
?? UInt32 RequiredSize=0;

?? IntPtr ptr;

?? result = CM_Enumerate_Classes(ClassIndex, ref ClassGuid,0);


??? ClassName=new StringBuilder("");
??? DevicePresent=false;
?? //incorrect device class:
?? if(result == CR_INVALID_DATA)
?? {
??? return -2;
?? }
? //device class is absent
?? if(result == CR_NO_SUCH_VALUE)
?? {
??? return -1;
?? }
? //bad param. - fatal error
?? if(result != CR_SUCCESS)
?? {
??? return -3;
?? }


?? name.Capacity=0;
?? resNam=SetupDiClassNameFromGuidA(ref ClassGuid,name,RequiredSize,
???????? ref RequiredSize);
?? if(RequiredSize > 0)
??? {
??? name.Capacity=(int)RequiredSize;
??? resNam=SetupDiClassNameFromGuidA(ref ClassGuid,name,
?????????? RequiredSize,ref RequiredSize);
??? }

?? NewDeviceInfoSet=SetupDiGetClassDevsA(
??? ref ClassGuid,
??? 0,
??? IntPtr.Zero,
??? DIGCF_PRESENT);

?? if(NewDeviceInfoSet.ToInt32() == -1)
??? {? DevicePresent=false;
????? ClassName=name;
????? return 0;}

?? IntPtr KeyClass=SetupDiOpenClassRegKeyExA(
??? ref ClassGuid, MAXIMUM_ALLOWED, DIOCR_INSTALLER,IntPtr.Zero,0);
?? if(KeyClass.ToInt32() == -1)
??? {? DevicePresent=false;
????? ClassName=name;
????? return 0;}


?? UInt32 sizeB=1000;
?? String abcd="";
?? StringBuilder CD=new StringBuilder("");
?? ClassDescription.Capacity=1000;
?
?? UInt32 res=RegQueryValueA(KeyClass,0,ClassDescription,ref sizeB);


?? if(res != 0)ClassDescription=new StringBuilder("");
?? SetupDiDestroyDeviceInfoList(NewDeviceInfoSet);
??? ClassName=name;
??? DevicePresent=true;

?? return 0;

? }

? [STAThread]
? static void Main(string[] args)
? {
?? StringBuilder classes=new StringBuilder("");
?? StringBuilder classesDescr=new StringBuilder("");

?? StringBuilder classesDescrOEM=new StringBuilder("");
?? classesDescrOEM.Capacity=1000;
?? Boolean DevExist=false;
?? UInt32 i=0;
?? while(true)
?? {
?? int res=EnumerateClasses(i,ref classes,classesDescr,ref DevExist);
?? if(res == -1)break;
?? ++i;
?? if(res < -1 || !DevExist)continue;
?? Console.WriteLine("ClassName={0}, Description={1}",classes,classesDescr);
?? }
?? return;
? }
}
}

原创粉丝点击